@ds-mo/ui 15.1.1 → 15.2.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 +2 -2
- package/dist/agent.json +286 -4
- package/dist/angular/ds-map-cluster-marker.d.ts +18 -0
- package/dist/angular/ds-map-cluster-marker.js +43 -0
- package/dist/angular/ds-map-entity-marker.d.ts +18 -0
- package/dist/angular/ds-map-entity-marker.js +43 -0
- package/dist/angular/index.d.ts +1 -1
- package/dist/angular/index.js +2 -0
- package/dist/angular/proxies.d.ts +2 -0
- package/dist/angular/proxies.js +2 -0
- package/dist/components/ds-agent-activity.js +1 -1
- package/dist/components/ds-agent-questionnaire.js +1 -1
- package/dist/components/ds-agent-response.js +1 -1
- package/dist/components/ds-agent-source-list.js +1 -1
- package/dist/components/ds-agent-tool-call.js +1 -1
- package/dist/components/ds-attachment-list.js +1 -1
- package/dist/components/ds-badge.js +1 -1
- package/dist/components/ds-banner.js +1 -1
- package/dist/components/ds-bar-action.js +1 -1
- package/dist/components/ds-bar-nav.js +1 -1
- package/dist/components/ds-bar-page-title.js +1 -1
- package/dist/components/ds-bar-title.js +1 -1
- package/dist/components/ds-bar-workflow.js +1 -1
- package/dist/components/ds-breadcrumb.js +1 -1
- package/dist/components/ds-button-filled.js +1 -1
- package/dist/components/ds-button-inverted.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-action-center.js +1 -1
- package/dist/components/ds-card-chart.js +1 -1
- package/dist/components/ds-card-navigation.js +1 -1
- package/dist/components/ds-card-overview.js +1 -1
- package/dist/components/ds-card-setting.js +1 -1
- package/dist/components/ds-card-settings-scope.js +1 -1
- package/dist/components/ds-chart-legend.js +1 -1
- package/dist/components/ds-chart.js +1 -1
- package/dist/components/ds-checkbox.js +1 -1
- package/dist/components/ds-chip.js +1 -1
- package/dist/components/ds-code-block.js +1 -1
- package/dist/components/ds-conversation-list-item.js +1 -1
- package/dist/components/ds-conversation-list-section.js +1 -1
- package/dist/components/ds-conversation-list.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-saved-views.js.map +1 -1
- package/dist/components/ds-data-search.js +1 -1
- package/dist/components/ds-data-sort.js +1 -1
- package/dist/components/ds-data-toolbar.js +1 -1
- package/dist/components/ds-empty-state.js +1 -1
- package/dist/components/ds-field.js +1 -1
- package/dist/components/ds-filter-menu.js +1 -1
- package/dist/components/ds-input-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-map-cluster-marker.d.ts +11 -0
- package/dist/components/ds-map-cluster-marker.js +2 -0
- package/dist/components/ds-map-cluster-marker.js.map +1 -0
- package/dist/components/ds-map-entity-marker.d.ts +11 -0
- package/dist/components/ds-map-entity-marker.js +2 -0
- package/dist/components/ds-map-entity-marker.js.map +1 -0
- package/dist/components/ds-markdown.js +1 -1
- package/dist/components/ds-menu.js +1 -1
- package/dist/components/ds-message-actions.js +1 -1
- package/dist/components/ds-message-bubble.js +1 -1
- package/dist/components/ds-message-composer.js +1 -1
- package/dist/components/ds-message-scroller.js +1 -1
- package/dist/components/ds-message.js +1 -1
- package/dist/components/ds-mobile-bar-nav.js +1 -1
- package/dist/components/ds-mobile-header.js +1 -1
- package/dist/components/ds-mobile-section-switcher.js +1 -1
- package/dist/components/ds-mobile-sheet-nav.js +1 -1
- package/dist/components/ds-modal.js +1 -1
- package/dist/components/ds-pagination.js +1 -1
- package/dist/components/ds-panel-nav.js +1 -1
- package/dist/components/ds-panel-sub-nav.js +1 -1
- package/dist/components/ds-panel-tool-header.js +1 -1
- package/dist/components/ds-panel-tool-search.js +1 -1
- package/dist/components/ds-panel-tools.js +1 -1
- package/dist/components/ds-paper-texture.js +1 -1
- package/dist/components/ds-radio.js +1 -1
- package/dist/components/ds-score.js +1 -1
- package/dist/components/ds-scroll-overlay.js +1 -1
- package/dist/components/ds-scroll-overlay.js.map +1 -1
- package/dist/components/ds-select.js +1 -1
- package/dist/components/ds-shell-app.js +1 -1
- package/dist/components/ds-shell-page.js +1 -1
- package/dist/components/ds-shell-tools.js +1 -1
- package/dist/components/ds-skeleton.js +1 -1
- package/dist/components/ds-slider.js +1 -1
- package/dist/components/ds-swatch-picker.js +1 -1
- package/dist/components/ds-switch.js +1 -1
- package/dist/components/ds-tab-group.js +1 -1
- package/dist/components/ds-table.js +1 -1
- package/dist/components/ds-tag.js +1 -1
- package/dist/components/ds-text.js +1 -1
- package/dist/components/ds-textarea.js +1 -1
- package/dist/components/ds-time-picker.js +1 -1
- package/dist/components/ds-toast.js +1 -1
- package/dist/components/ds-tooltip-chart.js +1 -1
- package/dist/components/ds-tooltip.js +1 -1
- package/dist/components/ds-typing-indicator.js +1 -1
- package/dist/components/{p-CD4DZPy_.js → p-5SVmAjXY.js} +2 -2
- package/dist/components/{p-B_jdoM7e.js → p-B3CZvMXs.js} +2 -2
- package/dist/components/{p-Bn8I7iw6.js → p-B6qQaYkB.js} +2 -2
- package/dist/components/p-BCnzbfma.js +2 -0
- package/dist/components/{p-0qY_HDId.js.map → p-BCnzbfma.js.map} +1 -1
- package/dist/components/{p-D922f6Tb.js → p-BJJh-Bf7.js} +2 -2
- package/dist/components/{p-5URekSny.js → p-BLSSaVWm.js} +2 -2
- package/dist/components/{p-BciTtTwx.js → p-BLuqpHvp.js} +2 -2
- package/dist/components/{p-BciTtTwx.js.map → p-BLuqpHvp.js.map} +1 -1
- package/dist/components/{p-BeNa6tw5.js → p-BOhefRMt.js} +2 -2
- package/dist/components/{p-BKZdqJQB.js → p-BR5OC2PX.js} +2 -2
- package/dist/components/{p-CUcUHwI3.js → p-BX506yEW.js} +2 -2
- package/dist/components/{p-C6xVxqOn.js → p-BZ_e69zx.js} +2 -2
- package/dist/components/{p-DEW7r0U9.js → p-BfF4RZdp.js} +2 -2
- package/dist/components/{p-etifxiDc.js → p-Br5e83Fr.js} +2 -2
- package/dist/components/{p-8yBdCXCn.js → p-BtnTQp4K.js} +2 -2
- package/dist/components/{p-Di5FH7eh.js → p-Bv9rSkp0.js} +2 -2
- package/dist/components/{p-CiH4GG6r.js → p-BzYW1IqO.js} +2 -2
- package/dist/components/{p-DpoTwJAR.js → p-C0JkLR83.js} +2 -2
- package/dist/components/{p-CiJ1WR11.js → p-C1gaWjOm.js} +2 -2
- package/dist/components/{p-D0y7Sja6.js → p-C6Aavz9h.js} +2 -2
- package/dist/components/{p-DVOjjuXc.js → p-C6zycbhC.js} +2 -2
- package/dist/components/{p-BhJXmuRA.js → p-CNZ6-kWd.js} +2 -2
- package/dist/components/{p-DVINzOoK.js → p-CR-Jjdcn.js} +2 -2
- package/dist/components/{p-Dfs98tpL.js → p-CRk0TjQv.js} +2 -2
- package/dist/components/{p-DHICPS4n.js → p-CTGgXIXM.js} +2 -2
- package/dist/components/{p-Dw9sE6Iw.js → p-CZ7hxDy_.js} +2 -2
- package/dist/components/{p-CYzFfFcH.js → p-C_Ma6Xa-.js} +2 -2
- package/dist/components/{p-ZhP2tVmM.js → p-Cn6AfzeF.js} +2 -2
- package/dist/components/{p-Dn9QHL4O.js → p-Cu8o2rOz.js} +2 -2
- package/dist/components/{p-FIBCluwV.js → p-CuWPWC3t.js} +2 -2
- package/dist/components/{p-DOAybCp0.js → p-D5HxZrMA.js} +2 -2
- package/dist/components/{p-Dzndkdx5.js → p-D7K1ZHML.js} +2 -2
- package/dist/components/{p-CzIpquvw.js → p-DFO5lV_A.js} +2 -2
- package/dist/components/{p-CdGXzRP8.js → p-Dlp1HqgS.js} +2 -2
- package/dist/components/{p-0FYD2bev.js → p-Dqfc6Nvd.js} +2 -2
- package/dist/components/{p-CNxvnQ6A.js → p-DsLXlxt3.js} +2 -2
- package/dist/components/{p-ljbw3UMZ.js → p-ER5M085B.js} +2 -2
- package/dist/components/{p-xdmJCPCg.js → p-QWukusRL.js} +2 -2
- package/dist/components/{p-E5W27Fu_.js → p-UY63jmrO.js} +2 -2
- package/dist/components/{p-D1vQGJzc.js → p-YrnU2fM7.js} +2 -2
- package/dist/components/{p-Do2FJd1y.js → p-ZYWnJaye.js} +2 -2
- package/dist/components/{p-DwbcNDJF.js → p-ZwRLjD5M.js} +2 -2
- package/dist/components/p-lamoJZE4.js +2 -0
- package/dist/components/{p-BgQMEHRa.js.map → p-lamoJZE4.js.map} +1 -1
- package/dist/components/{p-CdgOLWX9.js → p-mV4vSjSK.js} +2 -2
- package/dist/components/{p-Cqc2U1ZQ.js → p-mux14tWZ.js} +2 -2
- package/dist/components/{p-C-3YqeTb.js → p-mxZoWfnS.js} +2 -2
- package/dist/components/{p-CmexIVnE.js → p-p0FVyEFa.js} +2 -2
- package/dist/components/{p-Bpd6YCo4.js → p-uADksYMl.js} +2 -2
- package/dist/components/{p-Bm7rqs3C.js → p-xhn1cZgU.js} +2 -2
- package/dist/components/{p-Bm7rqs3C.js.map → p-xhn1cZgU.js.map} +1 -1
- package/dist/docs/components.json +488 -1
- package/dist/lint/index.js +1 -1
- package/dist/mcp-data/registry/bar-title.json +2 -2
- package/dist/mcp-data/registry/map-cluster-marker.json +263 -0
- package/dist/mcp-data/registry/map-entity-marker.json +321 -0
- package/dist/mcp-data/registry/registry.json +291 -3
- package/dist/mcp-data/registry/shell-app.json +1 -1
- package/dist/mcp-data/registry/shell-page.json +3 -3
- package/dist/react/components.d.ts +2 -0
- package/dist/react/components.js +2 -0
- package/dist/react/ds-map-cluster-marker.d.ts +12 -0
- package/dist/react/ds-map-cluster-marker.js +12 -0
- package/dist/react/ds-map-entity-marker.d.ts +12 -0
- package/dist/react/ds-map-entity-marker.js +12 -0
- package/dist/types/components/MapClusterMarker/MapClusterMarker.d.ts +19 -0
- package/dist/types/components/MapEntityMarker/MapEntityMarker.d.ts +26 -0
- package/dist/types/components.d.ts +195 -0
- package/dist/vue/components.d.ts +2 -0
- package/dist/vue/components.js +2 -0
- package/dist/vue/ds-map-cluster-marker.d.ts +3 -0
- package/dist/vue/ds-map-cluster-marker.js +14 -0
- package/dist/vue/ds-map-entity-marker.d.ts +3 -0
- package/dist/vue/ds-map-entity-marker.js +17 -0
- package/package.json +1 -1
- package/dist/components/p-0qY_HDId.js +0 -2
- package/dist/components/p-BgQMEHRa.js +0 -2
- /package/dist/components/{p-CD4DZPy_.js.map → p-5SVmAjXY.js.map} +0 -0
- /package/dist/components/{p-B_jdoM7e.js.map → p-B3CZvMXs.js.map} +0 -0
- /package/dist/components/{p-Bn8I7iw6.js.map → p-B6qQaYkB.js.map} +0 -0
- /package/dist/components/{p-D922f6Tb.js.map → p-BJJh-Bf7.js.map} +0 -0
- /package/dist/components/{p-5URekSny.js.map → p-BLSSaVWm.js.map} +0 -0
- /package/dist/components/{p-BeNa6tw5.js.map → p-BOhefRMt.js.map} +0 -0
- /package/dist/components/{p-BKZdqJQB.js.map → p-BR5OC2PX.js.map} +0 -0
- /package/dist/components/{p-CUcUHwI3.js.map → p-BX506yEW.js.map} +0 -0
- /package/dist/components/{p-C6xVxqOn.js.map → p-BZ_e69zx.js.map} +0 -0
- /package/dist/components/{p-DEW7r0U9.js.map → p-BfF4RZdp.js.map} +0 -0
- /package/dist/components/{p-etifxiDc.js.map → p-Br5e83Fr.js.map} +0 -0
- /package/dist/components/{p-8yBdCXCn.js.map → p-BtnTQp4K.js.map} +0 -0
- /package/dist/components/{p-Di5FH7eh.js.map → p-Bv9rSkp0.js.map} +0 -0
- /package/dist/components/{p-CiH4GG6r.js.map → p-BzYW1IqO.js.map} +0 -0
- /package/dist/components/{p-DpoTwJAR.js.map → p-C0JkLR83.js.map} +0 -0
- /package/dist/components/{p-CiJ1WR11.js.map → p-C1gaWjOm.js.map} +0 -0
- /package/dist/components/{p-D0y7Sja6.js.map → p-C6Aavz9h.js.map} +0 -0
- /package/dist/components/{p-DVOjjuXc.js.map → p-C6zycbhC.js.map} +0 -0
- /package/dist/components/{p-BhJXmuRA.js.map → p-CNZ6-kWd.js.map} +0 -0
- /package/dist/components/{p-DVINzOoK.js.map → p-CR-Jjdcn.js.map} +0 -0
- /package/dist/components/{p-Dfs98tpL.js.map → p-CRk0TjQv.js.map} +0 -0
- /package/dist/components/{p-DHICPS4n.js.map → p-CTGgXIXM.js.map} +0 -0
- /package/dist/components/{p-Dw9sE6Iw.js.map → p-CZ7hxDy_.js.map} +0 -0
- /package/dist/components/{p-CYzFfFcH.js.map → p-C_Ma6Xa-.js.map} +0 -0
- /package/dist/components/{p-ZhP2tVmM.js.map → p-Cn6AfzeF.js.map} +0 -0
- /package/dist/components/{p-Dn9QHL4O.js.map → p-Cu8o2rOz.js.map} +0 -0
- /package/dist/components/{p-FIBCluwV.js.map → p-CuWPWC3t.js.map} +0 -0
- /package/dist/components/{p-DOAybCp0.js.map → p-D5HxZrMA.js.map} +0 -0
- /package/dist/components/{p-Dzndkdx5.js.map → p-D7K1ZHML.js.map} +0 -0
- /package/dist/components/{p-CzIpquvw.js.map → p-DFO5lV_A.js.map} +0 -0
- /package/dist/components/{p-CdGXzRP8.js.map → p-Dlp1HqgS.js.map} +0 -0
- /package/dist/components/{p-0FYD2bev.js.map → p-Dqfc6Nvd.js.map} +0 -0
- /package/dist/components/{p-CNxvnQ6A.js.map → p-DsLXlxt3.js.map} +0 -0
- /package/dist/components/{p-ljbw3UMZ.js.map → p-ER5M085B.js.map} +0 -0
- /package/dist/components/{p-xdmJCPCg.js.map → p-QWukusRL.js.map} +0 -0
- /package/dist/components/{p-E5W27Fu_.js.map → p-UY63jmrO.js.map} +0 -0
- /package/dist/components/{p-D1vQGJzc.js.map → p-YrnU2fM7.js.map} +0 -0
- /package/dist/components/{p-Do2FJd1y.js.map → p-ZYWnJaye.js.map} +0 -0
- /package/dist/components/{p-DwbcNDJF.js.map → p-ZwRLjD5M.js.map} +0 -0
- /package/dist/components/{p-CdgOLWX9.js.map → p-mV4vSjSK.js.map} +0 -0
- /package/dist/components/{p-Cqc2U1ZQ.js.map → p-mux14tWZ.js.map} +0 -0
- /package/dist/components/{p-C-3YqeTb.js.map → p-mxZoWfnS.js.map} +0 -0
- /package/dist/components/{p-CmexIVnE.js.map → p-p0FVyEFa.js.map} +0 -0
- /package/dist/components/{p-Bpd6YCo4.js.map → p-uADksYMl.js.map} +0 -0
|
@@ -77,7 +77,7 @@
|
|
|
77
77
|
"Dividers in sections or actions create separate Menu groups without becoming selectable rows.",
|
|
78
78
|
"The overflow trigger uses its bordered treatment whenever any visible action sits beside it; overflow-only presentations keep the trigger borderless.",
|
|
79
79
|
"Ordered actions preserve authored order, but only the first eligible filled button, unfilled button, icon button, labeled menu button, or split button renders beside the title. Remaining commands use the shared overflow, whose rows are text-only. Menu choices and overflowed split commands become separate rows and share the same flat action event.",
|
|
80
|
-
"expanded renders the larger heading, optional description, inset divider, and a full-width caption breadcrumb row above the title. The breadcrumb begins after
|
|
80
|
+
"expanded renders the larger heading, optional description, inset divider, and a full-width caption breadcrumb row above the title. The breadcrumb begins after 16px top padding; the following title and right-side actions share one top alignment. Compact renders 48px chrome with the existing icon Back action; constrained uses compact chrome and moves an auto-collapse primary action into overflow.",
|
|
81
81
|
"The one visible ordered action collapses by default in constrained presentation. Use never for an exceptional action whose hierarchy must remain visible; explicit overflow actions never leave the shared menu.",
|
|
82
82
|
"showDivider=false removes the bottom divider when the surrounding page composition supplies the boundary; showCompactDivider can independently restore or remove that boundary in compact and constrained variants.",
|
|
83
83
|
"placement=shell-bar remains compact slotted chrome for advanced ShellApp composition. Managed panel-mode ShellApp uses BarPageTitle instead. It omits description and breadcrumb presentation and preserves applicable Back, section, primary, and overflow controls.",
|
|
@@ -588,7 +588,7 @@
|
|
|
588
588
|
"files": [
|
|
589
589
|
{
|
|
590
590
|
"path": "src/wc/components/BarTitle/BarTitle.css",
|
|
591
|
-
"content": "@import '../../utils/radius.css';\n@import '../../utils/control-density.css';\n@import '../../utils/chrome-header.css';\n@import '../../utils/focus-ring.css';\n@import '../../utils/interaction-fill.css';\n\n:host {\n display: block;\n min-width: 0;\n box-sizing: border-box;\n background: var(--_shell-page-header-background, var(--color-background-primary));\n}\n\n:host([placement='shell-bar']) {\n --_shell-page-header-background: var(--color-background-secondary);\n}\n\n:host-context(ds-shell-app:not([gradient-preset='none']))[placement='shell-bar'],\n:host-context(ds-shell-app:not([gradient-preset='none']))[placement='shell-bar'] .bar-title,\n:host-context(ds-shell-app.shell-app--paper-texture)[placement='shell-bar'],\n:host-context(ds-shell-app.shell-app--paper-texture)[placement='shell-bar'] .bar-title {\n background: transparent;\n}\n\n:host([data-shell-page-syncing]) {\n visibility: hidden;\n}\n\n.bar-title {\n position: relative;\n min-width: 0;\n box-sizing: border-box;\n background: var(--_shell-page-header-background, var(--color-background-primary));\n}\n\n.bar-title::after {\n content: '';\n position: absolute;\n inset: auto var(--ds-bar-title-divider-inset, var(--dimension-space-
|
|
591
|
+
"content": "@import '../../utils/radius.css';\n@import '../../utils/control-density.css';\n@import '../../utils/chrome-header.css';\n@import '../../utils/focus-ring.css';\n@import '../../utils/interaction-fill.css';\n\n:host {\n display: block;\n min-width: 0;\n box-sizing: border-box;\n background: var(--_shell-page-header-background, var(--color-background-primary));\n}\n\n:host([placement='shell-bar']) {\n --_shell-page-header-background: var(--color-background-secondary);\n}\n\n:host-context(ds-shell-app:not([gradient-preset='none']))[placement='shell-bar'],\n:host-context(ds-shell-app:not([gradient-preset='none']))[placement='shell-bar'] .bar-title,\n:host-context(ds-shell-app.shell-app--paper-texture)[placement='shell-bar'],\n:host-context(ds-shell-app.shell-app--paper-texture)[placement='shell-bar'] .bar-title {\n background: transparent;\n}\n\n:host([data-shell-page-syncing]) {\n visibility: hidden;\n}\n\n.bar-title {\n position: relative;\n min-width: 0;\n box-sizing: border-box;\n background: var(--_shell-page-header-background, var(--color-background-primary));\n}\n\n.bar-title::after {\n content: '';\n position: absolute;\n inset: auto var(--ds-bar-title-divider-inset, var(--dimension-space-200)) 0;\n height: var(--dimension-stroke-width-012);\n background: var(--color-border-tertiary);\n pointer-events: none;\n}\n\n.bar-title--divider-hidden::after {\n display: none;\n}\n\n.bar-title__inner {\n position: relative;\n display: flex;\n flex-direction: column;\n align-items: stretch;\n gap: var(--dimension-space-100);\n padding: var(--dimension-space-200);\n box-sizing: border-box;\n}\n\n.bar-title__row {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: var(--dimension-space-100);\n min-height: var(--dimension-size-400);\n min-width: 0;\n}\n\n:host(.bar-title-host--expanded) .bar-title__row {\n gap: var(--dimension-space-400);\n}\n\n.bar-title__leading {\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n gap: var(--dimension-space-100);\n min-width: 0;\n}\n\n.bar-title__title-row {\n display: flex;\n align-items: center;\n gap: var(--dimension-space-100);\n min-width: 0;\n min-height: var(--dimension-size-400);\n}\n\n.bar-title__identity {\n display: flex;\n flex: 0 1 auto;\n align-items: center;\n gap: var(--dimension-space-050);\n min-width: 0;\n}\n\n.bar-title__back,\n.bar-title__section-chevron {\n flex: 0 0 auto;\n}\n\n.bar-title__breadcrumb {\n display: block;\n width: 100%;\n min-width: 0;\n}\n\n.bar-title__heading {\n display: block;\n width: auto;\n min-width: 0;\n user-select: none;\n}\n\n.bar-title__divider {\n width: var(--dimension-stroke-width-012);\n height: var(--dimension-size-250);\n margin-inline-start: var(--dimension-space-100);\n flex: 0 0 var(--dimension-stroke-width-012);\n background: var(--color-border-tertiary);\n}\n\n.bar-title__section-selector {\n display: flex;\n flex: 0 1 auto;\n min-width: 0;\n max-width: var(--dimension-panel-width-sm);\n}\n\n.bar-title__section-trigger {\n --ds-control-radius: var(--dimension-radius-half);\n\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--ds-control-gap);\n height: var(--ds-control-height);\n min-width: 0;\n max-width: 100%;\n padding-inline: var(--ds-control-padding-inline);\n border: none;\n border-radius: var(--ds-control-radius);\n box-sizing: border-box;\n background: transparent;\n color: var(--color-foreground-secondary);\n cursor: default;\n font-family: inherit;\n user-select: none;\n}\n\n.bar-title__section-label {\n min-width: 0;\n padding-inline: var(--ds-control-label-inset);\n}\n\n.bar-title__actions {\n display: flex;\n align-items: center;\n gap: var(--dimension-space-100);\n flex: 0 0 auto;\n}\n\n.bar-title__description {\n display: block;\n min-width: 0;\n max-width: 100%;\n}\n\n:host(.bar-title-host--compact) .bar-title {\n height: var(--dimension-size-600);\n}\n\n:host(.bar-title-host--compact) .bar-title::after {\n inset-inline: 0;\n}\n\n:host(.bar-title-host--compact) .bar-title__inner {\n flex: 1 1 auto;\n height: 100%;\n min-width: 0;\n padding: 0;\n gap: 0;\n}\n\n:host(.bar-title-host--compact) .bar-title__row {\n height: 100%;\n align-items: center;\n}\n\n:host(.bar-title-host--compact) .bar-title__identity {\n height: var(--dimension-size-400);\n}\n\n:host(.bar-title-host--compact) .bar-title__divider {\n margin-inline-start: 0;\n}\n\n:host(.bar-title-host--compact) .bar-title__heading {\n display: inline-flex;\n flex: 1 1 auto;\n align-items: center;\n height: var(--dimension-size-400);\n padding-inline: calc(var(--ds-control-padding-inline) + var(--ds-control-label-inset));\n box-sizing: border-box;\n}\n",
|
|
592
592
|
"type": "registry:ui"
|
|
593
593
|
},
|
|
594
594
|
{
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://ui.shadcn.com/schema/registry-item.json",
|
|
3
|
+
"name": "map-cluster-marker",
|
|
4
|
+
"title": "MapClusterMarker",
|
|
5
|
+
"description": "Engine-independent map cluster button with compact count formatting and a hover or focus caption.",
|
|
6
|
+
"type": "registry:ui",
|
|
7
|
+
"meta": {
|
|
8
|
+
"library": "@ds-mo/ui",
|
|
9
|
+
"distribution": "npm",
|
|
10
|
+
"storybook": "https://zainadeel.github.io/compomo/?path=/story/map-cluster-marker",
|
|
11
|
+
"source": "src/wc/components/MapClusterMarker/MapClusterMarker.tsx",
|
|
12
|
+
"intentStatus": "complete",
|
|
13
|
+
"intent": {
|
|
14
|
+
"audience": "general",
|
|
15
|
+
"status": "experimental",
|
|
16
|
+
"summary": "Engine-independent map cluster button with compact count formatting and a hover or focus caption.",
|
|
17
|
+
"useWhen": [
|
|
18
|
+
"An application map needs one interactive marker to represent several nearby entities.",
|
|
19
|
+
"The map engine can mount a custom element and retain ownership of clustering, coordinates, anchoring, and camera behavior."
|
|
20
|
+
],
|
|
21
|
+
"avoidWhen": [
|
|
22
|
+
"The marker represents one vehicle, asset, person, or travel group; use MapEntityMarker.",
|
|
23
|
+
"The count is a notification attached to another control; use Badge.",
|
|
24
|
+
"The component would be asked to calculate clusters or own geographic and selected-entity business state."
|
|
25
|
+
],
|
|
26
|
+
"alternatives": [
|
|
27
|
+
{
|
|
28
|
+
"when": "One map entity needs operating state, heading, and stale treatment.",
|
|
29
|
+
"component": "component:ds-map-entity-marker",
|
|
30
|
+
"reason": "MapEntityMarker owns single-entity marker semantics and geometry."
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
"when": "A count supplements another non-map control.",
|
|
34
|
+
"component": "component:ds-badge",
|
|
35
|
+
"reason": "Badge owns compact notification and counter indicators."
|
|
36
|
+
}
|
|
37
|
+
],
|
|
38
|
+
"commonlyComposedWith": [
|
|
39
|
+
"component:ds-map-entity-marker",
|
|
40
|
+
"component:ds-text"
|
|
41
|
+
],
|
|
42
|
+
"accessibility": [
|
|
43
|
+
"The component renders a native button and label is its accessible action name. Prefer a label that includes the full count and outcome, such as ‘Zoom to 24 vehicles’.",
|
|
44
|
+
"Caption is a supplemental visual identifier and is hidden from assistive technology to avoid duplicating label.",
|
|
45
|
+
"Keyboard focus reveals the same caption as hover and uses the shared visible focus ring.",
|
|
46
|
+
"The compact displayed count does not replace the full count in label."
|
|
47
|
+
],
|
|
48
|
+
"states": [
|
|
49
|
+
"count is rounded to a non-negative whole number and compacts with a k suffix at one thousand and above.",
|
|
50
|
+
"dimmed is visual de-emphasis only. The map owner decides when selection context should dim cluster peers and keeps every cluster operable. A dimmed cluster returns to full opacity while hovered or keyboard-focused so its revealed caption remains legible.",
|
|
51
|
+
"Activation emits dsClick without calculating a cluster expansion or changing camera state internally."
|
|
52
|
+
],
|
|
53
|
+
"responsiveBehavior": [
|
|
54
|
+
"Marker height and minimum width stay fixed across breakpoints so map-engine anchors remain stable; width grows only for the compact count.",
|
|
55
|
+
"The map owner controls collision handling, overlays, and viewport-aware caption placement."
|
|
56
|
+
],
|
|
57
|
+
"frameworkCaveats": {
|
|
58
|
+
"customElements": [
|
|
59
|
+
"A map engine that accepts an Element for a custom marker or div icon can mount ds-map-cluster-marker directly.",
|
|
60
|
+
"Listen for dsClick and keep cluster membership, expansion zoom, z-index, coordinates, and camera movement in application state."
|
|
61
|
+
],
|
|
62
|
+
"react": [
|
|
63
|
+
"Pass count as a number and handle dsClick through the generated event binding."
|
|
64
|
+
],
|
|
65
|
+
"angular": [
|
|
66
|
+
"Bind count as a number and keep map-engine marker lifecycle in the owning map adapter."
|
|
67
|
+
]
|
|
68
|
+
},
|
|
69
|
+
"references": [
|
|
70
|
+
{
|
|
71
|
+
"label": "Storybook examples",
|
|
72
|
+
"path": "src/wc/components/MapClusterMarker/MapClusterMarker.stories.ts"
|
|
73
|
+
}
|
|
74
|
+
],
|
|
75
|
+
"styling": {
|
|
76
|
+
"rationale": "The component owns stable map anchoring geometry and semantic cluster recipes; the map engine owns host placement and stacking.",
|
|
77
|
+
"protected": [
|
|
78
|
+
{
|
|
79
|
+
"properties": [
|
|
80
|
+
"height",
|
|
81
|
+
"min-width",
|
|
82
|
+
"padding",
|
|
83
|
+
"border-radius",
|
|
84
|
+
"background",
|
|
85
|
+
"color",
|
|
86
|
+
"opacity"
|
|
87
|
+
],
|
|
88
|
+
"reason": "Cluster geometry, count legibility, interaction treatment, and de-emphasis are one accessible visual recipe.",
|
|
89
|
+
"props": [
|
|
90
|
+
"count",
|
|
91
|
+
"dimmed"
|
|
92
|
+
]
|
|
93
|
+
}
|
|
94
|
+
],
|
|
95
|
+
"customProperties": []
|
|
96
|
+
}
|
|
97
|
+
},
|
|
98
|
+
"api": {
|
|
99
|
+
"props": {
|
|
100
|
+
"caption": {
|
|
101
|
+
"type": "string",
|
|
102
|
+
"resolvedType": "string",
|
|
103
|
+
"attribute": "caption",
|
|
104
|
+
"default": "''",
|
|
105
|
+
"required": false,
|
|
106
|
+
"mutable": false,
|
|
107
|
+
"description": "Short visible cluster identifier revealed on hover or keyboard focus."
|
|
108
|
+
},
|
|
109
|
+
"count": {
|
|
110
|
+
"type": "number",
|
|
111
|
+
"resolvedType": "number",
|
|
112
|
+
"attribute": "count",
|
|
113
|
+
"default": "0",
|
|
114
|
+
"required": false,
|
|
115
|
+
"mutable": false,
|
|
116
|
+
"description": "Number of represented entities, compacted at one thousand and above."
|
|
117
|
+
},
|
|
118
|
+
"dimmed": {
|
|
119
|
+
"type": "boolean",
|
|
120
|
+
"resolvedType": "boolean",
|
|
121
|
+
"attribute": "dimmed",
|
|
122
|
+
"default": "false",
|
|
123
|
+
"required": false,
|
|
124
|
+
"mutable": false,
|
|
125
|
+
"description": "De-emphasizes this cluster when an owner-managed selection is active elsewhere."
|
|
126
|
+
},
|
|
127
|
+
"label": {
|
|
128
|
+
"type": "string",
|
|
129
|
+
"resolvedType": "string",
|
|
130
|
+
"attribute": "label",
|
|
131
|
+
"required": true,
|
|
132
|
+
"mutable": false,
|
|
133
|
+
"description": "Accessible action label. Describe the cluster and what activation does."
|
|
134
|
+
}
|
|
135
|
+
},
|
|
136
|
+
"events": [
|
|
137
|
+
{
|
|
138
|
+
"name": "dsClick",
|
|
139
|
+
"detail": "MouseEvent",
|
|
140
|
+
"bubbles": true,
|
|
141
|
+
"cancelable": true,
|
|
142
|
+
"composed": true,
|
|
143
|
+
"description": "Fired when the cluster's native button is activated."
|
|
144
|
+
}
|
|
145
|
+
],
|
|
146
|
+
"methods": [
|
|
147
|
+
{
|
|
148
|
+
"name": "setFocus",
|
|
149
|
+
"signature": "setFocus() => Promise<void>",
|
|
150
|
+
"description": "Moves keyboard focus to the cluster button."
|
|
151
|
+
}
|
|
152
|
+
],
|
|
153
|
+
"slots": []
|
|
154
|
+
},
|
|
155
|
+
"props": {
|
|
156
|
+
"caption": {
|
|
157
|
+
"type": "string",
|
|
158
|
+
"resolvedType": "string",
|
|
159
|
+
"attribute": "caption",
|
|
160
|
+
"default": "''",
|
|
161
|
+
"required": false,
|
|
162
|
+
"mutable": false,
|
|
163
|
+
"description": "Short visible cluster identifier revealed on hover or keyboard focus."
|
|
164
|
+
},
|
|
165
|
+
"count": {
|
|
166
|
+
"type": "number",
|
|
167
|
+
"resolvedType": "number",
|
|
168
|
+
"attribute": "count",
|
|
169
|
+
"default": "0",
|
|
170
|
+
"required": false,
|
|
171
|
+
"mutable": false,
|
|
172
|
+
"description": "Number of represented entities, compacted at one thousand and above."
|
|
173
|
+
},
|
|
174
|
+
"dimmed": {
|
|
175
|
+
"type": "boolean",
|
|
176
|
+
"resolvedType": "boolean",
|
|
177
|
+
"attribute": "dimmed",
|
|
178
|
+
"default": "false",
|
|
179
|
+
"required": false,
|
|
180
|
+
"mutable": false,
|
|
181
|
+
"description": "De-emphasizes this cluster when an owner-managed selection is active elsewhere."
|
|
182
|
+
},
|
|
183
|
+
"label": {
|
|
184
|
+
"type": "string",
|
|
185
|
+
"resolvedType": "string",
|
|
186
|
+
"attribute": "label",
|
|
187
|
+
"required": true,
|
|
188
|
+
"mutable": false,
|
|
189
|
+
"description": "Accessible action label. Describe the cluster and what activation does."
|
|
190
|
+
}
|
|
191
|
+
},
|
|
192
|
+
"events": [
|
|
193
|
+
{
|
|
194
|
+
"name": "dsClick",
|
|
195
|
+
"detail": "MouseEvent",
|
|
196
|
+
"bubbles": true,
|
|
197
|
+
"cancelable": true,
|
|
198
|
+
"composed": true,
|
|
199
|
+
"description": "Fired when the cluster's native button is activated."
|
|
200
|
+
}
|
|
201
|
+
],
|
|
202
|
+
"methods": [
|
|
203
|
+
{
|
|
204
|
+
"name": "setFocus",
|
|
205
|
+
"signature": "setFocus() => Promise<void>",
|
|
206
|
+
"description": "Moves keyboard focus to the cluster button."
|
|
207
|
+
}
|
|
208
|
+
],
|
|
209
|
+
"slots": [],
|
|
210
|
+
"exports": {
|
|
211
|
+
"customElement": "ds-map-cluster-marker",
|
|
212
|
+
"react": "DsMapClusterMarker",
|
|
213
|
+
"vue": "DsMapClusterMarker",
|
|
214
|
+
"angular": "DsMapClusterMarker"
|
|
215
|
+
},
|
|
216
|
+
"consumption": {
|
|
217
|
+
"install": "npm install @ds-mo/ui @ds-mo/tokens @ds-mo/icons",
|
|
218
|
+
"cssSetup": "import '@ds-mo/tokens';\nimport '@ds-mo/tokens/reset';\nimport '@ds-mo/tokens/globals';",
|
|
219
|
+
"customElements": {
|
|
220
|
+
"import": "import '@ds-mo/ui/dist/components/ds-map-cluster-marker.js';",
|
|
221
|
+
"example": "<ds-map-cluster-marker></ds-map-cluster-marker>"
|
|
222
|
+
},
|
|
223
|
+
"react": {
|
|
224
|
+
"import": "import { DsMapClusterMarker } from '@ds-mo/ui/react';",
|
|
225
|
+
"example": "<DsMapClusterMarker />"
|
|
226
|
+
},
|
|
227
|
+
"vue": {
|
|
228
|
+
"import": "import { DsMapClusterMarker } from '@ds-mo/ui/vue';",
|
|
229
|
+
"example": "<DsMapClusterMarker />"
|
|
230
|
+
},
|
|
231
|
+
"angular": {
|
|
232
|
+
"import": "import { DsMapClusterMarker } from '@ds-mo/ui/angular/ds-map-cluster-marker';",
|
|
233
|
+
"example": "<ds-map-cluster-marker></ds-map-cluster-marker>"
|
|
234
|
+
},
|
|
235
|
+
"peerDependencies": {
|
|
236
|
+
"required": [
|
|
237
|
+
"@ds-mo/tokens ^6.5.1",
|
|
238
|
+
"@ds-mo/icons ^8.1.0"
|
|
239
|
+
],
|
|
240
|
+
"frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
},
|
|
244
|
+
"dependencies": [
|
|
245
|
+
"@ds-mo/ui",
|
|
246
|
+
"@ds-mo/tokens"
|
|
247
|
+
],
|
|
248
|
+
"registryDependencies": [
|
|
249
|
+
"text"
|
|
250
|
+
],
|
|
251
|
+
"files": [
|
|
252
|
+
{
|
|
253
|
+
"path": "src/wc/components/MapClusterMarker/MapClusterMarker.css",
|
|
254
|
+
"content": "@import '../../utils/focus-ring.css';\n@import '../../utils/map-marker.css';\n\n:host {\n --_map-marker-background: var(--color-entity-cluster-marker-background);\n --_map-marker-foreground: var(--color-entity-cluster-marker-foreground);\n --_map-marker-interaction-hover: var(--color-entity-cluster-marker-interaction-hover);\n --_map-marker-interaction-pressed: var(--color-entity-cluster-marker-interaction-pressed);\n}\n\n.map-marker__button {\n width: max-content;\n padding-inline: 0;\n border-radius: var(--dimension-radius-half);\n}\n\n.map-marker__button,\n.map-marker__caption {\n -webkit-backdrop-filter: blur(var(--effect-blur-md));\n backdrop-filter: blur(var(--effect-blur-md));\n}\n\n.map-cluster-marker__button--padded {\n padding-inline: var(--dimension-space-100);\n}\n\n.map-cluster-marker__count {\n position: relative;\n z-index: 2;\n display: inline-flex;\n white-space: nowrap;\n}\n",
|
|
255
|
+
"type": "registry:ui"
|
|
256
|
+
},
|
|
257
|
+
{
|
|
258
|
+
"path": "src/wc/components/MapClusterMarker/MapClusterMarker.tsx",
|
|
259
|
+
"content": "import { Component, Event, EventEmitter, h, Host, Method, Prop } from '@stencil/core';\n\nconst formatCount = (count: number): string => {\n const normalizedCount = Math.max(0, Math.round(Number.isFinite(count) ? count : 0));\n if (normalizedCount < 1000) return String(normalizedCount);\n const compactCount = Math.round(normalizedCount / 100) / 10;\n return `${Number.isInteger(compactCount) ? compactCount.toFixed(0) : compactCount.toFixed(1)}k`;\n};\n\n@Component({\n tag: 'ds-map-cluster-marker',\n styleUrl: 'MapClusterMarker.css',\n scoped: true,\n})\nexport class MapClusterMarker {\n /** Accessible action label. Describe the cluster and what activation does. */\n @Prop() label!: string;\n\n /** Short visible cluster identifier revealed on hover or keyboard focus. */\n @Prop() caption: string = '';\n\n /** Number of represented entities, compacted at one thousand and above. */\n @Prop() count: number = 0;\n\n /** De-emphasizes this cluster when an owner-managed selection is active elsewhere. */\n @Prop({ reflect: true }) dimmed: boolean = false;\n\n /** Fired when the cluster's native button is activated. */\n @Event() dsClick!: EventEmitter<MouseEvent>;\n\n private buttonEl?: HTMLButtonElement;\n\n /** Moves keyboard focus to the cluster button. */\n @Method()\n async setFocus(): Promise<void> {\n this.buttonEl?.focus();\n }\n\n private handleClick = (event: MouseEvent) => {\n this.dsClick.emit(event);\n };\n\n render() {\n const caption = this.caption.trim();\n const countLabel = formatCount(this.count);\n\n return (\n <Host class={{ 'map-cluster-marker': true, 'map-marker--dimmed': this.dimmed }}>\n <button\n ref={element => (this.buttonEl = element)}\n type=\"button\"\n class={{\n 'map-marker__button': true,\n 'map-cluster-marker__button--padded': countLabel.length > 1,\n 'ds-focus-ring': true,\n }}\n aria-label={this.label}\n onClick={this.handleClick}\n >\n <ds-text\n class=\"map-cluster-marker__count\"\n as=\"span\"\n variant=\"text-body-medium\"\n color=\"inherit\"\n emphasis\n >\n {countLabel}\n </ds-text>\n </button>\n {caption && (\n <ds-text\n class=\"map-marker__caption\"\n as=\"span\"\n variant=\"text-caption\"\n color=\"inherit\"\n aria-hidden=\"true\"\n >\n {caption}\n </ds-text>\n )}\n </Host>\n );\n }\n}\n",
|
|
260
|
+
"type": "registry:ui"
|
|
261
|
+
}
|
|
262
|
+
]
|
|
263
|
+
}
|
|
@@ -0,0 +1,321 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://ui.shadcn.com/schema/registry-item.json",
|
|
3
|
+
"name": "map-entity-marker",
|
|
4
|
+
"title": "MapEntityMarker",
|
|
5
|
+
"description": "Engine-independent map marker button for a vehicle, asset, person, or travel group with operating-state color, heading, stale treatment, and a hover or focus caption.",
|
|
6
|
+
"type": "registry:ui",
|
|
7
|
+
"meta": {
|
|
8
|
+
"library": "@ds-mo/ui",
|
|
9
|
+
"distribution": "npm",
|
|
10
|
+
"storybook": "https://zainadeel.github.io/compomo/?path=/story/map-entity-marker",
|
|
11
|
+
"source": "src/wc/components/MapEntityMarker/MapEntityMarker.tsx",
|
|
12
|
+
"intentStatus": "complete",
|
|
13
|
+
"intent": {
|
|
14
|
+
"audience": "general",
|
|
15
|
+
"status": "experimental",
|
|
16
|
+
"summary": "Engine-independent map marker button for a vehicle, asset, person, or travel group with operating-state color, heading, stale treatment, and a hover or focus caption.",
|
|
17
|
+
"useWhen": [
|
|
18
|
+
"An application map needs a consistent interactive marker for one entity.",
|
|
19
|
+
"The map engine can mount a custom element and retain ownership of coordinates, anchoring, and camera behavior."
|
|
20
|
+
],
|
|
21
|
+
"avoidWhen": [
|
|
22
|
+
"Several nearby entities must be represented as one count; use MapClusterMarker.",
|
|
23
|
+
"The content is a legend item or non-interactive status swatch.",
|
|
24
|
+
"The component would be asked to own geographic coordinates, clustering, map-engine adapters, or selected-entity business state."
|
|
25
|
+
],
|
|
26
|
+
"alternatives": [
|
|
27
|
+
{
|
|
28
|
+
"when": "Several nearby entities are represented by a compact count.",
|
|
29
|
+
"component": "component:ds-map-cluster-marker",
|
|
30
|
+
"reason": "MapClusterMarker owns cluster count formatting and cluster interaction geometry."
|
|
31
|
+
}
|
|
32
|
+
],
|
|
33
|
+
"commonlyComposedWith": [
|
|
34
|
+
"component:ds-map-cluster-marker",
|
|
35
|
+
"component:ds-icon"
|
|
36
|
+
],
|
|
37
|
+
"accessibility": [
|
|
38
|
+
"The component renders a native button and label is its accessible action name. Prefer an action-oriented label such as ‘Open vehicle 412’.",
|
|
39
|
+
"Caption is a supplemental visual identifier and is hidden from assistive technology to avoid duplicating label.",
|
|
40
|
+
"Keyboard focus reveals the same caption as hover and uses the shared visible focus ring.",
|
|
41
|
+
"State and stale meaning must be present in nearby map legend or application detail content; do not rely on marker color alone.",
|
|
42
|
+
"The stale outline remains differentiated by a dashed border in forced-colors mode."
|
|
43
|
+
],
|
|
44
|
+
"states": [
|
|
45
|
+
"state selects the semantic operating-state color. Use stale as a standalone state only when no last-known operating state is available.",
|
|
46
|
+
"stale adds a dashed outline while preserving state, matching last-known map data.",
|
|
47
|
+
"immobilized always renders the upright MapKey glyph instead of the entity icon so the state is identifiable without interpreting heading.",
|
|
48
|
+
"heading rotates only MapEntityTravelGroup and MapEntityVehicle glyphs and is normalized to a clockwise value from 0 through 359 degrees. Immobilized, asset, person, and other glyphs remain upright.",
|
|
49
|
+
"dimmed is visual de-emphasis only. The map owner decides when selection context should dim peer markers and keeps every marker operable. A dimmed marker returns to full opacity while hovered or keyboard-focused so its revealed caption remains legible.",
|
|
50
|
+
"Activation emits dsClick without changing application selection internally."
|
|
51
|
+
],
|
|
52
|
+
"responsiveBehavior": [
|
|
53
|
+
"Marker geometry stays fixed across breakpoints so map-engine anchors remain stable.",
|
|
54
|
+
"The map owner controls collision handling, overlays, and viewport-aware caption placement."
|
|
55
|
+
],
|
|
56
|
+
"frameworkCaveats": {
|
|
57
|
+
"customElements": [
|
|
58
|
+
"A map engine that accepts an Element for a custom marker or div icon can mount ds-map-entity-marker directly.",
|
|
59
|
+
"Listen for dsClick and keep selected entity, z-index, coordinates, and camera movement in application state."
|
|
60
|
+
],
|
|
61
|
+
"react": [
|
|
62
|
+
"Pass numeric heading as a property and handle dsClick through the generated event binding."
|
|
63
|
+
],
|
|
64
|
+
"angular": [
|
|
65
|
+
"Bind heading as a number and keep map-engine marker lifecycle in the owning map adapter."
|
|
66
|
+
]
|
|
67
|
+
},
|
|
68
|
+
"references": [
|
|
69
|
+
{
|
|
70
|
+
"label": "Storybook examples",
|
|
71
|
+
"path": "src/wc/components/MapEntityMarker/MapEntityMarker.stories.ts"
|
|
72
|
+
}
|
|
73
|
+
],
|
|
74
|
+
"styling": {
|
|
75
|
+
"rationale": "The component owns stable map anchoring geometry and semantic marker recipes; the map engine owns host placement and stacking.",
|
|
76
|
+
"protected": [
|
|
77
|
+
{
|
|
78
|
+
"properties": [
|
|
79
|
+
"width",
|
|
80
|
+
"height",
|
|
81
|
+
"min-width",
|
|
82
|
+
"padding",
|
|
83
|
+
"border",
|
|
84
|
+
"border-radius",
|
|
85
|
+
"background",
|
|
86
|
+
"color",
|
|
87
|
+
"opacity"
|
|
88
|
+
],
|
|
89
|
+
"reason": "Marker geometry, operating-state colors, stale distinction, and de-emphasis are one accessible visual recipe.",
|
|
90
|
+
"props": [
|
|
91
|
+
"state",
|
|
92
|
+
"stale",
|
|
93
|
+
"dimmed"
|
|
94
|
+
]
|
|
95
|
+
}
|
|
96
|
+
],
|
|
97
|
+
"customProperties": []
|
|
98
|
+
}
|
|
99
|
+
},
|
|
100
|
+
"api": {
|
|
101
|
+
"props": {
|
|
102
|
+
"caption": {
|
|
103
|
+
"type": "string",
|
|
104
|
+
"resolvedType": "string",
|
|
105
|
+
"attribute": "caption",
|
|
106
|
+
"default": "''",
|
|
107
|
+
"required": false,
|
|
108
|
+
"mutable": false,
|
|
109
|
+
"description": "Short visible identifier revealed on hover or keyboard focus."
|
|
110
|
+
},
|
|
111
|
+
"dimmed": {
|
|
112
|
+
"type": "boolean",
|
|
113
|
+
"resolvedType": "boolean",
|
|
114
|
+
"attribute": "dimmed",
|
|
115
|
+
"default": "false",
|
|
116
|
+
"required": false,
|
|
117
|
+
"mutable": false,
|
|
118
|
+
"description": "De-emphasizes this marker when an owner-managed selection is active elsewhere."
|
|
119
|
+
},
|
|
120
|
+
"heading": {
|
|
121
|
+
"type": "number",
|
|
122
|
+
"resolvedType": "number",
|
|
123
|
+
"attribute": "heading",
|
|
124
|
+
"default": "0",
|
|
125
|
+
"required": false,
|
|
126
|
+
"mutable": false,
|
|
127
|
+
"description": "Clockwise map heading for travel-group and vehicle icons. Values are normalized to 0–359."
|
|
128
|
+
},
|
|
129
|
+
"icon": {
|
|
130
|
+
"type": "string",
|
|
131
|
+
"resolvedType": "string",
|
|
132
|
+
"attribute": "icon",
|
|
133
|
+
"default": "'MapEntityTravelGroup'",
|
|
134
|
+
"required": false,
|
|
135
|
+
"mutable": false,
|
|
136
|
+
"description": "Canonical IcoMo icon name for the represented map entity. Immobilized state uses MapKey."
|
|
137
|
+
},
|
|
138
|
+
"label": {
|
|
139
|
+
"type": "string",
|
|
140
|
+
"resolvedType": "string",
|
|
141
|
+
"attribute": "label",
|
|
142
|
+
"required": true,
|
|
143
|
+
"mutable": false,
|
|
144
|
+
"description": "Accessible action label. Describe what activating the marker opens."
|
|
145
|
+
},
|
|
146
|
+
"stale": {
|
|
147
|
+
"type": "boolean",
|
|
148
|
+
"resolvedType": "boolean",
|
|
149
|
+
"attribute": "stale",
|
|
150
|
+
"default": "false",
|
|
151
|
+
"required": false,
|
|
152
|
+
"mutable": false,
|
|
153
|
+
"description": "Adds the stale-data outline while preserving the last known operating state."
|
|
154
|
+
},
|
|
155
|
+
"state": {
|
|
156
|
+
"type": "MapEntityMarkerState",
|
|
157
|
+
"resolvedType": "\"idling\" | \"immobilized\" | \"in-motion\" | \"stale\" | \"stationary\"",
|
|
158
|
+
"attribute": "state",
|
|
159
|
+
"default": "'in-motion'",
|
|
160
|
+
"required": false,
|
|
161
|
+
"mutable": false,
|
|
162
|
+
"description": "Semantic operating state that selects the marker background."
|
|
163
|
+
}
|
|
164
|
+
},
|
|
165
|
+
"events": [
|
|
166
|
+
{
|
|
167
|
+
"name": "dsClick",
|
|
168
|
+
"detail": "MouseEvent",
|
|
169
|
+
"bubbles": true,
|
|
170
|
+
"cancelable": true,
|
|
171
|
+
"composed": true,
|
|
172
|
+
"description": "Fired when the marker's native button is activated."
|
|
173
|
+
}
|
|
174
|
+
],
|
|
175
|
+
"methods": [
|
|
176
|
+
{
|
|
177
|
+
"name": "setFocus",
|
|
178
|
+
"signature": "setFocus() => Promise<void>",
|
|
179
|
+
"description": "Moves keyboard focus to the marker button."
|
|
180
|
+
}
|
|
181
|
+
],
|
|
182
|
+
"slots": []
|
|
183
|
+
},
|
|
184
|
+
"props": {
|
|
185
|
+
"caption": {
|
|
186
|
+
"type": "string",
|
|
187
|
+
"resolvedType": "string",
|
|
188
|
+
"attribute": "caption",
|
|
189
|
+
"default": "''",
|
|
190
|
+
"required": false,
|
|
191
|
+
"mutable": false,
|
|
192
|
+
"description": "Short visible identifier revealed on hover or keyboard focus."
|
|
193
|
+
},
|
|
194
|
+
"dimmed": {
|
|
195
|
+
"type": "boolean",
|
|
196
|
+
"resolvedType": "boolean",
|
|
197
|
+
"attribute": "dimmed",
|
|
198
|
+
"default": "false",
|
|
199
|
+
"required": false,
|
|
200
|
+
"mutable": false,
|
|
201
|
+
"description": "De-emphasizes this marker when an owner-managed selection is active elsewhere."
|
|
202
|
+
},
|
|
203
|
+
"heading": {
|
|
204
|
+
"type": "number",
|
|
205
|
+
"resolvedType": "number",
|
|
206
|
+
"attribute": "heading",
|
|
207
|
+
"default": "0",
|
|
208
|
+
"required": false,
|
|
209
|
+
"mutable": false,
|
|
210
|
+
"description": "Clockwise map heading for travel-group and vehicle icons. Values are normalized to 0–359."
|
|
211
|
+
},
|
|
212
|
+
"icon": {
|
|
213
|
+
"type": "string",
|
|
214
|
+
"resolvedType": "string",
|
|
215
|
+
"attribute": "icon",
|
|
216
|
+
"default": "'MapEntityTravelGroup'",
|
|
217
|
+
"required": false,
|
|
218
|
+
"mutable": false,
|
|
219
|
+
"description": "Canonical IcoMo icon name for the represented map entity. Immobilized state uses MapKey."
|
|
220
|
+
},
|
|
221
|
+
"label": {
|
|
222
|
+
"type": "string",
|
|
223
|
+
"resolvedType": "string",
|
|
224
|
+
"attribute": "label",
|
|
225
|
+
"required": true,
|
|
226
|
+
"mutable": false,
|
|
227
|
+
"description": "Accessible action label. Describe what activating the marker opens."
|
|
228
|
+
},
|
|
229
|
+
"stale": {
|
|
230
|
+
"type": "boolean",
|
|
231
|
+
"resolvedType": "boolean",
|
|
232
|
+
"attribute": "stale",
|
|
233
|
+
"default": "false",
|
|
234
|
+
"required": false,
|
|
235
|
+
"mutable": false,
|
|
236
|
+
"description": "Adds the stale-data outline while preserving the last known operating state."
|
|
237
|
+
},
|
|
238
|
+
"state": {
|
|
239
|
+
"type": "MapEntityMarkerState",
|
|
240
|
+
"resolvedType": "\"idling\" | \"immobilized\" | \"in-motion\" | \"stale\" | \"stationary\"",
|
|
241
|
+
"attribute": "state",
|
|
242
|
+
"default": "'in-motion'",
|
|
243
|
+
"required": false,
|
|
244
|
+
"mutable": false,
|
|
245
|
+
"description": "Semantic operating state that selects the marker background."
|
|
246
|
+
}
|
|
247
|
+
},
|
|
248
|
+
"events": [
|
|
249
|
+
{
|
|
250
|
+
"name": "dsClick",
|
|
251
|
+
"detail": "MouseEvent",
|
|
252
|
+
"bubbles": true,
|
|
253
|
+
"cancelable": true,
|
|
254
|
+
"composed": true,
|
|
255
|
+
"description": "Fired when the marker's native button is activated."
|
|
256
|
+
}
|
|
257
|
+
],
|
|
258
|
+
"methods": [
|
|
259
|
+
{
|
|
260
|
+
"name": "setFocus",
|
|
261
|
+
"signature": "setFocus() => Promise<void>",
|
|
262
|
+
"description": "Moves keyboard focus to the marker button."
|
|
263
|
+
}
|
|
264
|
+
],
|
|
265
|
+
"slots": [],
|
|
266
|
+
"exports": {
|
|
267
|
+
"customElement": "ds-map-entity-marker",
|
|
268
|
+
"react": "DsMapEntityMarker",
|
|
269
|
+
"vue": "DsMapEntityMarker",
|
|
270
|
+
"angular": "DsMapEntityMarker"
|
|
271
|
+
},
|
|
272
|
+
"consumption": {
|
|
273
|
+
"install": "npm install @ds-mo/ui @ds-mo/tokens @ds-mo/icons",
|
|
274
|
+
"cssSetup": "import '@ds-mo/tokens';\nimport '@ds-mo/tokens/reset';\nimport '@ds-mo/tokens/globals';",
|
|
275
|
+
"customElements": {
|
|
276
|
+
"import": "import '@ds-mo/ui/dist/components/ds-map-entity-marker.js';",
|
|
277
|
+
"example": "<ds-map-entity-marker></ds-map-entity-marker>"
|
|
278
|
+
},
|
|
279
|
+
"react": {
|
|
280
|
+
"import": "import { DsMapEntityMarker } from '@ds-mo/ui/react';",
|
|
281
|
+
"example": "<DsMapEntityMarker />"
|
|
282
|
+
},
|
|
283
|
+
"vue": {
|
|
284
|
+
"import": "import { DsMapEntityMarker } from '@ds-mo/ui/vue';",
|
|
285
|
+
"example": "<DsMapEntityMarker />"
|
|
286
|
+
},
|
|
287
|
+
"angular": {
|
|
288
|
+
"import": "import { DsMapEntityMarker } from '@ds-mo/ui/angular/ds-map-entity-marker';",
|
|
289
|
+
"example": "<ds-map-entity-marker></ds-map-entity-marker>"
|
|
290
|
+
},
|
|
291
|
+
"peerDependencies": {
|
|
292
|
+
"required": [
|
|
293
|
+
"@ds-mo/tokens ^6.5.1",
|
|
294
|
+
"@ds-mo/icons ^8.1.0"
|
|
295
|
+
],
|
|
296
|
+
"frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
},
|
|
300
|
+
"dependencies": [
|
|
301
|
+
"@ds-mo/ui",
|
|
302
|
+
"@ds-mo/tokens",
|
|
303
|
+
"@ds-mo/icons"
|
|
304
|
+
],
|
|
305
|
+
"registryDependencies": [
|
|
306
|
+
"icon",
|
|
307
|
+
"text"
|
|
308
|
+
],
|
|
309
|
+
"files": [
|
|
310
|
+
{
|
|
311
|
+
"path": "src/wc/components/MapEntityMarker/MapEntityMarker.css",
|
|
312
|
+
"content": "@import '../../utils/focus-ring.css';\n@import '../../utils/map-marker.css';\n\n:host([state='in-motion']) {\n --_map-marker-background: var(--color-entity-marker-background-in-motion);\n}\n\n:host([state='idling']) {\n --_map-marker-background: var(--color-entity-marker-background-idling);\n}\n\n:host([state='stationary']) {\n --_map-marker-background: var(--color-entity-marker-background-stationary);\n}\n\n:host([state='immobilized']) {\n --_map-marker-background: var(--color-entity-marker-background-immobilized);\n}\n\n:host([state='stale']) {\n --_map-marker-background: var(--color-entity-marker-background-stale);\n}\n\n.map-marker__button {\n width: var(--dimension-size-300);\n border-radius: var(--dimension-radius-half);\n}\n\n:host(.map-entity-marker--stale) .map-marker__button::after {\n display: none;\n}\n\n.map-entity-marker__stale-outline {\n position: absolute;\n z-index: 3;\n inset: 0;\n width: 100%;\n height: 100%;\n overflow: visible;\n pointer-events: none;\n transform: rotate(-90deg);\n fill: none;\n stroke: currentcolor;\n stroke-width: 1;\n stroke-linecap: butt;\n}\n\n.map-entity-marker__glyph {\n position: relative;\n z-index: 2;\n display: inline-flex;\n transform: rotate(var(--ds-map-entity-marker-heading));\n}\n\n@media (forced-colors: active) {\n :host(.map-entity-marker--stale) .map-marker__button::after {\n display: block;\n outline-style: dashed;\n }\n\n .map-entity-marker__stale-outline {\n display: none;\n }\n}\n",
|
|
313
|
+
"type": "registry:ui"
|
|
314
|
+
},
|
|
315
|
+
{
|
|
316
|
+
"path": "src/wc/components/MapEntityMarker/MapEntityMarker.tsx",
|
|
317
|
+
"content": "import { Component, Event, EventEmitter, h, Host, Method, Prop } from '@stencil/core';\n\nexport type MapEntityMarkerState = 'in-motion' | 'idling' | 'stationary' | 'immobilized' | 'stale';\n\nconst normalizeHeading = (heading: number): number => {\n if (!Number.isFinite(heading)) return 0;\n return ((heading % 360) + 360) % 360;\n};\n\nconst HEADING_ICONS = new Set(['MapEntityTravelGroup', 'MapEntityVehicle']);\n\nconst STALE_OUTLINE_CENTER = 8;\nconst STALE_OUTLINE_RADIUS = 6.5;\nconst STALE_OUTLINE_SEGMENT_ANGLE = 45;\nconst STALE_OUTLINE_HALF_GAP_ANGLE = 6;\n\nconst staleOutlinePoint = (angle: number): [number, number] => {\n const radians = (angle * Math.PI) / 180;\n return [\n STALE_OUTLINE_CENTER + STALE_OUTLINE_RADIUS * Math.cos(radians),\n STALE_OUTLINE_CENTER + STALE_OUTLINE_RADIUS * Math.sin(radians),\n ];\n};\n\nconst STALE_OUTLINE_PATH = Array.from({ length: 8 }, (_, index) => {\n const segmentStart = index * STALE_OUTLINE_SEGMENT_ANGLE + STALE_OUTLINE_HALF_GAP_ANGLE;\n const segmentEnd = (index + 1) * STALE_OUTLINE_SEGMENT_ANGLE - STALE_OUTLINE_HALF_GAP_ANGLE;\n const [startX, startY] = staleOutlinePoint(segmentStart);\n const [endX, endY] = staleOutlinePoint(segmentEnd);\n return `M ${startX.toFixed(3)} ${startY.toFixed(3)} A ${STALE_OUTLINE_RADIUS} ${STALE_OUTLINE_RADIUS} 0 0 1 ${endX.toFixed(3)} ${endY.toFixed(3)}`;\n}).join(' ');\n\n@Component({\n tag: 'ds-map-entity-marker',\n styleUrl: 'MapEntityMarker.css',\n scoped: true,\n})\nexport class MapEntityMarker {\n /** Accessible action label. Describe what activating the marker opens. */\n @Prop() label!: string;\n\n /** Short visible identifier revealed on hover or keyboard focus. */\n @Prop() caption: string = '';\n\n /** Canonical IcoMo icon name for the represented map entity. Immobilized state uses MapKey. */\n @Prop() icon: string = 'MapEntityTravelGroup';\n\n /** Semantic operating state that selects the marker background. */\n @Prop({ reflect: true }) state: MapEntityMarkerState = 'in-motion';\n\n /** Adds the stale-data outline while preserving the last known operating state. */\n @Prop({ reflect: true }) stale: boolean = false;\n\n /** Clockwise map heading for travel-group and vehicle icons. Values are normalized to 0–359. */\n @Prop() heading: number = 0;\n\n /** De-emphasizes this marker when an owner-managed selection is active elsewhere. */\n @Prop({ reflect: true }) dimmed: boolean = false;\n\n /** Fired when the marker's native button is activated. */\n @Event() dsClick!: EventEmitter<MouseEvent>;\n\n private buttonEl?: HTMLButtonElement;\n\n /** Moves keyboard focus to the marker button. */\n @Method()\n async setFocus(): Promise<void> {\n this.buttonEl?.focus();\n }\n\n private handleClick = (event: MouseEvent) => {\n this.dsClick.emit(event);\n };\n\n render() {\n const caption = this.caption.trim();\n const markerIsStale = this.stale || this.state === 'stale';\n const markerIcon = this.state === 'immobilized' ? 'MapKey' : this.icon;\n const heading = HEADING_ICONS.has(markerIcon) ? normalizeHeading(this.heading) : 0;\n\n return (\n <Host\n class={{\n 'map-entity-marker': true,\n 'map-marker--dimmed': this.dimmed,\n 'map-entity-marker--stale': markerIsStale,\n }}\n >\n <button\n ref={element => (this.buttonEl = element)}\n type=\"button\"\n class=\"map-marker__button ds-focus-ring\"\n aria-label={this.label}\n onClick={this.handleClick}\n >\n <span\n class=\"map-entity-marker__glyph\"\n style={{ '--ds-map-entity-marker-heading': `${heading}deg` }}\n aria-hidden=\"true\"\n >\n <ds-icon name={markerIcon} size=\"sm\" color=\"inherit\"></ds-icon>\n </span>\n {markerIsStale && (\n // eslint-disable-next-line compomo/prefer-ds-icon -- The stale ring is a component-owned geometric primitive with eight exact equal arcs.\n <svg class=\"map-entity-marker__stale-outline\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d={STALE_OUTLINE_PATH}></path>\n </svg>\n )}\n </button>\n {caption && (\n <ds-text\n class=\"map-marker__caption\"\n as=\"span\"\n variant=\"text-caption\"\n color=\"inherit\"\n aria-hidden=\"true\"\n >\n {caption}\n </ds-text>\n )}\n </Host>\n );\n }\n}\n",
|
|
318
|
+
"type": "registry:ui"
|
|
319
|
+
}
|
|
320
|
+
]
|
|
321
|
+
}
|