@ds-mo/ui 13.11.1 → 13.13.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.
Files changed (167) hide show
  1. package/dist/.package-ready.json +1 -1
  2. package/dist/agent-patterns.json +1 -1
  3. package/dist/agent.json +307 -10
  4. package/dist/angular/ds-button-filled.d.ts +1 -1
  5. package/dist/angular/ds-button-filled.js +3 -3
  6. package/dist/angular/ds-button-unfilled.d.ts +1 -1
  7. package/dist/angular/ds-button-unfilled.js +3 -3
  8. package/dist/angular/ds-mobile-header.d.ts +1 -1
  9. package/dist/angular/ds-mobile-header.js +3 -3
  10. package/dist/angular/ds-tab-group.d.ts +1 -1
  11. package/dist/angular/ds-tab-group.js +3 -3
  12. package/dist/angular/ds-table.d.ts +31 -0
  13. package/dist/angular/ds-table.js +57 -0
  14. package/dist/angular/ds-tag.d.ts +1 -1
  15. package/dist/angular/ds-tag.js +3 -3
  16. package/dist/angular/index.d.ts +1 -1
  17. package/dist/angular/index.js +1 -0
  18. package/dist/angular/proxies.d.ts +1 -0
  19. package/dist/angular/proxies.js +1 -0
  20. package/dist/components/ds-agent-response.js +1 -1
  21. package/dist/components/ds-banner.js +1 -1
  22. package/dist/components/ds-bar-nav.js +1 -1
  23. package/dist/components/ds-bar-title.js +1 -1
  24. package/dist/components/ds-bar-workflow.js +1 -1
  25. package/dist/components/ds-bar-workflow.js.map +1 -1
  26. package/dist/components/ds-button-filled.js +1 -1
  27. package/dist/components/ds-button-unfilled.js +1 -1
  28. package/dist/components/ds-card-chart.js +1 -1
  29. package/dist/components/ds-card-overview.js +1 -1
  30. package/dist/components/ds-card-overview.js.map +1 -1
  31. package/dist/components/ds-card-setting.js +1 -1
  32. package/dist/components/ds-chart-legend.js +1 -1
  33. package/dist/components/ds-chart-legend.js.map +1 -1
  34. package/dist/components/ds-checkbox.js +1 -1
  35. package/dist/components/ds-chip.js +1 -1
  36. package/dist/components/ds-chip.js.map +1 -1
  37. package/dist/components/ds-code-block.js +1 -1
  38. package/dist/components/ds-conversation-list-item.js +1 -1
  39. package/dist/components/ds-conversation-list-item.js.map +1 -1
  40. package/dist/components/ds-input.js +1 -1
  41. package/dist/components/ds-input.js.map +1 -1
  42. package/dist/components/ds-markdown.js +1 -1
  43. package/dist/components/ds-menu.js +1 -1
  44. package/dist/components/ds-message-actions.js +1 -1
  45. package/dist/components/ds-message-composer.js +1 -1
  46. package/dist/components/ds-message-scroller.js +1 -1
  47. package/dist/components/ds-mobile-bar-nav.js +1 -1
  48. package/dist/components/ds-mobile-header.js +1 -1
  49. package/dist/components/ds-mobile-section-switcher.js +1 -1
  50. package/dist/components/ds-mobile-sheet-nav.js +1 -1
  51. package/dist/components/ds-modal.js +1 -1
  52. package/dist/components/ds-panel-nav.js +1 -1
  53. package/dist/components/ds-panel-sub-nav.js +1 -1
  54. package/dist/components/ds-panel-sub-nav.js.map +1 -1
  55. package/dist/components/ds-panel-tool-header.js +1 -1
  56. package/dist/components/ds-panel-tool-search.js +1 -1
  57. package/dist/components/ds-panel-tools.js +1 -1
  58. package/dist/components/ds-radio.js +1 -1
  59. package/dist/components/ds-radio.js.map +1 -1
  60. package/dist/components/ds-scroll-overlay.js +1 -1
  61. package/dist/components/ds-scroll-overlay.js.map +1 -1
  62. package/dist/components/ds-select.js +1 -1
  63. package/dist/components/ds-select.js.map +1 -1
  64. package/dist/components/ds-shell-app.js +1 -1
  65. package/dist/components/ds-shell-app.js.map +1 -1
  66. package/dist/components/ds-shell-tools.js +1 -1
  67. package/dist/components/ds-skeleton.js +1 -1
  68. package/dist/components/ds-slider.js +1 -1
  69. package/dist/components/ds-switch.js +1 -1
  70. package/dist/components/ds-tab-group.js +1 -1
  71. package/dist/components/ds-table.d.ts +11 -0
  72. package/dist/components/ds-table.js +2 -0
  73. package/dist/components/ds-table.js.map +1 -0
  74. package/dist/components/ds-tag.js +1 -1
  75. package/dist/components/ds-tag.js.map +1 -1
  76. package/dist/components/ds-toast.js +1 -1
  77. package/dist/components/ds-typing-indicator.js +1 -1
  78. package/dist/components/index.d.ts +30 -0
  79. package/dist/components/p-B1JB0Zn-.js +2 -0
  80. package/dist/components/{p-DgglLVCj.js.map → p-B1JB0Zn-.js.map} +1 -1
  81. package/dist/components/p-B2t8alvH.js +2 -0
  82. package/dist/components/{p-DK4PGrHm.js.map → p-B2t8alvH.js.map} +1 -1
  83. package/dist/components/p-BAGTb6cZ.js +2 -0
  84. package/dist/components/p-BAGTb6cZ.js.map +1 -0
  85. package/dist/components/p-BEEYhbIb.js +2 -0
  86. package/dist/components/p-BEEYhbIb.js.map +1 -0
  87. package/dist/components/{p-BRajO-Za.js → p-BFMV9TJO.js} +2 -2
  88. package/dist/components/p-BNHPCCw8.js +2 -0
  89. package/dist/components/{p-DCN04sgt.js.map → p-BNHPCCw8.js.map} +1 -1
  90. package/dist/components/{p-DJGdoPMG.js → p-BUZLhvs1.js} +2 -2
  91. package/dist/components/p-BgaF83uh.js +2 -0
  92. package/dist/components/{p-C5gZHZHU.js.map → p-BgaF83uh.js.map} +1 -1
  93. package/dist/components/p-Br0fwWUG.js +2 -0
  94. package/dist/components/{p-BHb3Ws8e.js.map → p-Br0fwWUG.js.map} +1 -1
  95. package/dist/components/{p-DcmqsAMP.js → p-BydCwx7x.js} +2 -2
  96. package/dist/components/p-C3Z01Glr.js +2 -0
  97. package/dist/components/p-C3Z01Glr.js.map +1 -0
  98. package/dist/components/{p-Dg9qiMDa.js → p-C9StMCWg.js} +2 -2
  99. package/dist/components/{p-BX57q1Lo.js → p-CSlTJWFG.js} +2 -2
  100. package/dist/components/{p-BQ7Nzx9A.js → p-Ch5yT3UA.js} +2 -2
  101. package/dist/components/p-Cw1bbiCG.js +2 -0
  102. package/dist/components/p-Cw1bbiCG.js.map +1 -0
  103. package/dist/components/p-CzV4gIxd.js +2 -0
  104. package/dist/components/p-CzV4gIxd.js.map +1 -0
  105. package/dist/components/p-D-F8eyXy.js +2 -0
  106. package/dist/components/p-D-F8eyXy.js.map +1 -0
  107. package/dist/components/p-DGvzGGcu.js +2 -0
  108. package/dist/components/{p-CIlO_j3q.js.map → p-DGvzGGcu.js.map} +1 -1
  109. package/dist/components/{p-DkhE3BsH.js → p-bLCbOPYa.js} +2 -2
  110. package/dist/components/p-cPh32CFB.js +2 -0
  111. package/dist/components/{p-BnGJrBPG.js.map → p-cPh32CFB.js.map} +1 -1
  112. package/dist/docs/components.json +1590 -59
  113. package/dist/lib/components/ButtonFilled/ButtonFilled.d.ts +2 -0
  114. package/dist/lib/components/MobileHeader/mobile-header-types.d.ts +3 -2
  115. package/dist/mcp-data/registry/button-filled.json +20 -1
  116. package/dist/mcp-data/registry/button-unfilled.json +20 -1
  117. package/dist/mcp-data/registry/mobile-header.json +48 -10
  118. package/dist/mcp-data/registry/mobile-sheet-nav.json +2 -2
  119. package/dist/mcp-data/registry/registry.json +309 -9
  120. package/dist/mcp-data/registry/shell-app.json +4 -2
  121. package/dist/mcp-data/registry/shell-tools.json +4 -4
  122. package/dist/mcp-data/registry/tab-group.json +22 -2
  123. package/dist/mcp-data/registry/table.json +777 -0
  124. package/dist/mcp-data/registry/tag.json +22 -3
  125. package/dist/react/components.d.ts +1 -0
  126. package/dist/react/components.js +1 -0
  127. package/dist/react/ds-table.d.ts +17 -0
  128. package/dist/react/ds-table.js +19 -0
  129. package/dist/styles/table.css +874 -0
  130. package/dist/types/components/ButtonFilled/ButtonFilled.d.ts +2 -0
  131. package/dist/types/components/ButtonUnfilled/ButtonUnfilled.d.ts +2 -0
  132. package/dist/types/components/MobileHeader/MobileHeader.d.ts +8 -3
  133. package/dist/types/components/MobileHeader/index.d.ts +1 -1
  134. package/dist/types/components/MobileHeader/mobile-header-types.d.ts +3 -2
  135. package/dist/types/components/ShellApp/ShellApp.d.ts +8 -0
  136. package/dist/types/components/TabGroup/TabGroup.d.ts +3 -0
  137. package/dist/types/components/Table/Table.d.ts +126 -0
  138. package/dist/types/components/Table/index.d.ts +2 -0
  139. package/dist/types/components/Table/table-model.d.ts +29 -0
  140. package/dist/types/components/Table/table-types.d.ts +189 -0
  141. package/dist/types/components/Tag/Tag.d.ts +2 -0
  142. package/dist/types/components.d.ts +417 -6
  143. package/package.json +3 -2
  144. package/dist/components/p-BHb3Ws8e.js +0 -2
  145. package/dist/components/p-BnGJrBPG.js +0 -2
  146. package/dist/components/p-C5gZHZHU.js +0 -2
  147. package/dist/components/p-CIlO_j3q.js +0 -2
  148. package/dist/components/p-CVmtbj-6.js +0 -2
  149. package/dist/components/p-CVmtbj-6.js.map +0 -1
  150. package/dist/components/p-DAbaMtEX.js +0 -2
  151. package/dist/components/p-DAbaMtEX.js.map +0 -1
  152. package/dist/components/p-DCN04sgt.js +0 -2
  153. package/dist/components/p-DK4PGrHm.js +0 -2
  154. package/dist/components/p-DW9p068S.js +0 -2
  155. package/dist/components/p-DW9p068S.js.map +0 -1
  156. package/dist/components/p-DgglLVCj.js +0 -2
  157. package/dist/components/p-Xftomzsv.js +0 -2
  158. package/dist/components/p-Xftomzsv.js.map +0 -1
  159. package/dist/components/p-c1pY-Mqq.js +0 -2
  160. package/dist/components/p-c1pY-Mqq.js.map +0 -1
  161. /package/dist/components/{p-BRajO-Za.js.map → p-BFMV9TJO.js.map} +0 -0
  162. /package/dist/components/{p-DJGdoPMG.js.map → p-BUZLhvs1.js.map} +0 -0
  163. /package/dist/components/{p-DcmqsAMP.js.map → p-BydCwx7x.js.map} +0 -0
  164. /package/dist/components/{p-Dg9qiMDa.js.map → p-C9StMCWg.js.map} +0 -0
  165. /package/dist/components/{p-BX57q1Lo.js.map → p-CSlTJWFG.js.map} +0 -0
  166. /package/dist/components/{p-BQ7Nzx9A.js.map → p-Ch5yT3UA.js.map} +0 -0
  167. /package/dist/components/{p-DkhE3BsH.js.map → p-bLCbOPYa.js.map} +0 -0
@@ -1523,6 +1523,7 @@
1523
1523
  ],
1524
1524
  "states": [
1525
1525
  "Every size applies one complete control-density recipe across frame height, inline padding, icon zone, text-container inset, gap, and radius.",
1526
+ "Set isInset only when the button is nested inside a same-size control; it reduces the outer geometry while preserving the size's icon, label inset, gap, radius, and typography.",
1526
1527
  "Use only one filled action per local decision area; render all secondary actions with ButtonUnfilled.",
1527
1528
  "Choose brand or neutral for general commands. Reserve positive, negative, warning, and caution for matching action consequences, and AI, guide, or walkthrough for actions that enter those feature experiences.",
1528
1529
  "Contrast serves both surface adaptation and hierarchy, but never permits a second filled action in the same decision area.",
@@ -1602,6 +1603,10 @@
1602
1603
  "type": "boolean",
1603
1604
  "required": false
1604
1605
  },
1606
+ "isInset": {
1607
+ "type": "boolean",
1608
+ "required": false
1609
+ },
1605
1610
  "isLoading": {
1606
1611
  "type": "boolean",
1607
1612
  "required": false
@@ -1725,6 +1730,7 @@
1725
1730
  ],
1726
1731
  "states": [
1727
1732
  "Every size applies one complete control-density recipe across frame height, inline padding, icon zone, text-container inset, gap, and radius.",
1733
+ "Set isInset only when the button is nested inside a same-size control; it reduces the outer geometry while preserving the size's icon, label inset, gap, radius, and typography.",
1728
1734
  "A true pressed toggle and owner-controlled isActive emphasis share the selected visual treatment, but only pressed supplies toggle semantics and dsChange.",
1729
1735
  "General content UI keeps the selected interaction fill and border for pressed or active emphasis.",
1730
1736
  "Shell, navigation, and tool-rail composites use isActive with foreground-only emphasis and no selected fill or border.",
@@ -1814,6 +1820,10 @@
1814
1820
  "type": "boolean",
1815
1821
  "required": false
1816
1822
  },
1823
+ "isInset": {
1824
+ "type": "boolean",
1825
+ "required": false
1826
+ },
1817
1827
  "isLoading": {
1818
1828
  "type": "boolean",
1819
1829
  "required": false
@@ -4887,6 +4897,7 @@
4887
4897
  ],
4888
4898
  "commonlyComposedWith": [
4889
4899
  "component:ds-mobile-section-switcher",
4900
+ "component:ds-tab-group",
4890
4901
  "component:ds-shell-page",
4891
4902
  "component:ds-shell-tools"
4892
4903
  ],
@@ -4895,19 +4906,19 @@
4895
4906
  ],
4896
4907
  "accessibility": [
4897
4908
  "Static screens render a real h1 or h2 according to headingLevel.",
4898
- "Section-switching screens expose an equivalent semantic heading alongside the accessible popup trigger.",
4909
+ "Section-switching screens expose an equivalent semantic heading alongside the accessible popup trigger or named segmented TabGroup.",
4899
4910
  "Subsections use a separately named navigation landmark and never replace the semantic page identity.",
4900
4911
  "Leading and trailing slotted icon actions retain their own accessible names and tooltips."
4901
4912
  ],
4902
4913
  "states": [
4903
4914
  "Without multiple sections the center renders heading.",
4904
- "With multiple sections the center renders the controlled MobileSectionSwitcher.",
4915
+ "With multiple sections the center renders the controlled MobileSectionSwitcher by default or an explicitly requested segmented TabGroup.",
4905
4916
  "Optional subsections render in a second row and emit dsSubsectionChange without changing the primary section.",
4906
4917
  "Sections represent peer destinations at the current navigation level; subsections represent local views beneath the selected page or detail identity.",
4907
4918
  "Brand tone changes surface and foreground without changing geometry or interaction ownership."
4908
4919
  ],
4909
4920
  "responsiveBehavior": [
4910
- "The primary 48px lane is dedicated to the below-768px presentation; optional subsections add one subordinate 48px lane.",
4921
+ "The primary 56px lane matches the Mobile Sheet Nav header and Mobile Bar Nav; optional subsections add one subordinate 48px lane.",
4911
4922
  "Equal flexible side lanes keep the center mathematically aligned when actions are asymmetric."
4912
4923
  ],
4913
4924
  "references": [
@@ -4927,13 +4938,21 @@
4927
4938
  "required": false
4928
4939
  },
4929
4940
  "sections": {
4930
- "type": "TabItem[]",
4941
+ "type": "TabGroupItem[]",
4931
4942
  "required": false
4932
4943
  },
4933
4944
  "sectionsAriaLabel": {
4934
4945
  "type": "string",
4935
4946
  "required": false
4936
4947
  },
4948
+ "sectionsPresentation": {
4949
+ "type": "MobileHeaderSectionsPresentation",
4950
+ "required": false
4951
+ },
4952
+ "sectionsSize": {
4953
+ "type": "TabGroupSize",
4954
+ "required": false
4955
+ },
4937
4956
  "subsections": {
4938
4957
  "type": "TabItem[]",
4939
4958
  "required": false
@@ -4978,6 +4997,7 @@
4978
4997
  ],
4979
4998
  "registryDependencies": [
4980
4999
  "mobile-section-switcher",
5000
+ "tab-group",
4981
5001
  "text"
4982
5002
  ]
4983
5003
  },
@@ -5106,7 +5126,7 @@
5106
5126
  ],
5107
5127
  "responsiveBehavior": [
5108
5128
  "The pane fills the mobile content stage while the bottom bar remains available.",
5109
- "The sheet header and scrollable navigation body each use the shared 8px chrome inset; large destination controls retain their independent 40px density.",
5129
+ "The sheet header and scrollable navigation body each use the shared 8px chrome inset; the context TabGroup and primary controls share a 40px height and 24px icon scale.",
5110
5130
  "Dashboard and Settings preserve their supplied visual groups with an 8px gap between destinations inside a section and a 32px gap between sections."
5111
5131
  ],
5112
5132
  "references": [
@@ -6769,6 +6789,8 @@
6769
6789
  "On desktop, PanelNav defaults expanded, permits user collapse or expansion, and respects the locally persisted desktop preference.",
6770
6790
  "On tablet, ShellApp keeps PanelNav permanently collapsed and prevents user expansion without overwriting the desktop preference.",
6771
6791
  "On mobile, ShellApp hides and inerts desktop chrome, uses a solid primary stage, and composes MobileHeader, MobileSheetNav, ShellTools, and the persistent MobileBarNav around the same application-owned content.",
6792
+ "Opening MobileSheetNav temporarily overlays the active routed page or global tool; closing it without selecting an area restores that same destination and its nested state.",
6793
+ "When a suspended mobile document returns to the foreground, ShellApp refreshes the complete stage paint layer without remounting routed content or tool owners.",
6772
6794
  "When the application enables viewport-fit=cover, ShellApp reserves the shared top safe-area inset once for the complete mobile stage; nested routed, sheet, and tool headers must not add a second top inset.",
6773
6795
  "A slotted Banner remains below the top safe-area inset and above routed, navigation, fullscreen-tool, and mobile global-surface presentations.",
6774
6796
  "Mobile global surfaces conceal and inert the routed workspace without unmounting it, preserving nested routes and scroll state.",
@@ -7105,7 +7127,7 @@
7105
7127
  "component:ds-shell-app",
7106
7128
  "component:ds-panel-tool-header",
7107
7129
  "component:ds-mobile-header",
7108
- "component:ds-mobile-section-switcher",
7130
+ "component:ds-tab-group",
7109
7131
  "component:ds-mobile-bar-nav"
7110
7132
  ],
7111
7133
  "patterns": [
@@ -7114,7 +7136,7 @@
7114
7136
  "accessibility": [
7115
7137
  "Only the active mobile tool view participates in focus or the accessibility tree.",
7116
7138
  "Header Back and application-owned header actions preserve the PanelTools event contract.",
7117
- "Inbox uses the MobileSectionSwitcher popup trigger for Stacks and Activity and never relies on a gesture-only interaction; Messages remains a direct mobile destination."
7139
+ "Mobile Inbox uses a named label-only TabGroup for Stacks and Activity; Messages remains a direct mobile destination."
7118
7140
  ],
7119
7141
  "states": [
7120
7142
  "The application owns open and activeTool and replaces headers when tool depth changes.",
@@ -7124,7 +7146,7 @@
7124
7146
  ],
7125
7147
  "responsiveBehavior": [
7126
7148
  "Desktop and tablet compose PanelTools-compatible rail and drawer chrome.",
7127
- "Mobile renders one centered MobileHeader for every tool; Stacks and Activity use Inbox section titles, while Messages remains a direct tool destination."
7149
+ "Mobile renders one centered MobileHeader for every tool; Stacks and Activity use the large segmented Inbox control, while Messages remains a direct tool destination."
7128
7150
  ],
7129
7151
  "frameworkCaveats": {
7130
7152
  "customElements": [
@@ -7940,6 +7962,7 @@
7940
7962
  "The parent owns the canonical selected value and adjacent view visibility, and should update both from dsChange.",
7941
7963
  "A missing, empty, inactive, or unknown selected value is invalid when enabled tabs exist; the component does not choose a fallback selection.",
7942
7964
  "Selection is singular and follows keyboard focus.",
7965
+ "Small, medium, and large use the shared 24px, 32px, and 40px control-density recipes for the outer track. Each segment uses the same-size inset recipe at 20px, 28px, and 36px while preserving that density's typography, icon, gap, and label metrics.",
7943
7966
  "Use one consistent content variant across every selectable tab in a group.",
7944
7967
  "Omitted background is for primary and secondary surfaces; pass the faint context explicitly on faint surfaces.",
7945
7968
  "Only the omitted default context emphasizes visible selected label text and keeps the filled track; explicit faint follows the other surface contexts with a transparent track, stable text weight, surface border, and neutral active fill.",
@@ -7947,6 +7970,7 @@
7947
7970
  ],
7948
7971
  "responsiveBehavior": [
7949
7972
  "The component remains a single horizontal row and does not become vertical or wrap.",
7973
+ "Use the large size when a mobile composition aligns the group with 40px shell controls; size does not change automatically at a breakpoint.",
7950
7974
  "The consuming layout owns narrow-width placement and overflow, or replaces the row with a more suitable navigation pattern."
7951
7975
  ],
7952
7976
  "frameworkCaveats": {
@@ -7981,6 +8005,10 @@
7981
8005
  "type": "TabBackground | undefined",
7982
8006
  "required": false
7983
8007
  },
8008
+ "size": {
8009
+ "type": "TabGroupSize",
8010
+ "required": false
8011
+ },
7984
8012
  "tabs": {
7985
8013
  "type": "TabGroupItem[]",
7986
8014
  "required": false
@@ -8014,6 +8042,273 @@
8014
8042
  "text"
8015
8043
  ]
8016
8044
  },
8045
+ {
8046
+ "name": "table",
8047
+ "title": "Table",
8048
+ "description": "Semantic, controlled data table with durable visual primitives for cell geometry, column geometry, grouping, sorting, multi-selection, sticky overflow, and incremental loading.",
8049
+ "type": "registry:ui",
8050
+ "meta": {
8051
+ "library": "@ds-mo/ui",
8052
+ "distribution": "npm",
8053
+ "storybook": "https://zainadeel.github.io/compomo/?path=/story/table",
8054
+ "source": "src/wc/components/Table/Table.tsx",
8055
+ "intentStatus": "complete",
8056
+ "intent": {
8057
+ "audience": "general",
8058
+ "status": "experimental",
8059
+ "summary": "Semantic, controlled data table with durable visual primitives for cell geometry, column geometry, grouping, sorting, multi-selection, sticky overflow, and incremental loading.",
8060
+ "useWhen": [
8061
+ "A structured dataset needs native row and column relationships, optional one-level grouping, or comparable values across records.",
8062
+ "An application needs controlled sorting, loaded-row selection, or lazy loading while retaining ownership of the data query and transformations.",
8063
+ "A product table needs a token-backed recipe whose individual header, group, row, cell, selection, state, and load-more layers remain easy to restyle."
8064
+ ],
8065
+ "avoidWhen": [
8066
+ "Content is primarily editorial prose; use semantic product-owned markup with the prose recipe instead.",
8067
+ "A small label/value set reads more clearly as a list, description list, or card.",
8068
+ "The interface requires tree-grid behavior, nested grouping, inline cell editing, row reordering, multiple pinned columns per edge, or virtualization; those are outside this first contract.",
8069
+ "The application expects the component to fetch, paginate, sort, group, or mutate records internally."
8070
+ ],
8071
+ "commonlyComposedWith": [
8072
+ "component:ds-empty-state",
8073
+ "component:ds-skeleton",
8074
+ "component:ds-loader",
8075
+ "component:ds-button-unfilled",
8076
+ "component:ds-tag",
8077
+ "component:ds-icon"
8078
+ ],
8079
+ "accessibility": [
8080
+ "The rendered structure uses a native table, caption, column headers, row groups, and data cells; keep the caption non-empty even when it is visually hidden.",
8081
+ "Sorting controls remain buttons inside column headers. Member-row sort uses aria-sort, while independent group order is described by the grouped header control.",
8082
+ "Selection controls expose checkbox semantics and explicit row names; select-all affects selectable loaded rows only and preserves selected identities outside the loaded window.",
8083
+ "Interactive rows are focusable as native rows, activate with Enter or Space, and do not steal activation from their nested selection or action controls.",
8084
+ "Scrollable table regions become keyboard focusable and named only when overflow exists.",
8085
+ "Incremental loading, newly appended row counts, failures, and end-of-results transitions are announced through a polite status region without replacing visible state."
8086
+ ],
8087
+ "states": [
8088
+ "Columns, rows, groups, grouping, sorting, selected row IDs, and lazy-loading state are controlled inputs. Events communicate intent and never mutate those inputs.",
8089
+ "Grouping supports one level. The application supplies ordered groups and ordered member rows; group order and member-row sort are independent controls.",
8090
+ "An active member sort toggles only between ascending and descending; activating a different sortable label moves sorting to that key. Applications may still clear the controlled sort state explicitly. The grouped column toggles ascending and descending group order without clearing member sort.",
8091
+ "Compound headers can expose multiple related labels with independent sort keys. Each label owns only its content-width interaction target while the active direction remains in the column's alignment-aware sort lane.",
8092
+ "Initial loading uses row-shaped skeletons. Empty and initial error states remain inside the table. Incremental loading retains existing rows and supports automatic sentinel, manual load-more, retry, and terminal states.",
8093
+ "Lazy loading replaces pagination. The application owns requests, cancellation, cursors, deduplication, appended records, and query identity; loadIdentity resets the component request guard.",
8094
+ "Rows opt into complete-row activation with interactive and emit dsRowActivate without owning navigation. Selection paints through the shared selected ::before layer; interactive hover and press paint through the shared ::after layer.",
8095
+ "Row selection owns the single sticky start lane. One explicitly sized application column can own the sticky end lane, or the start lane when selection is absent. Each sticky boundary owns one fixed divider and a row-clipped directional shadow that paints into the adjacent scrolling columns only while more inline content remains beyond that edge.",
8096
+ "Cells accept scalar content, standard primary-and-secondary or dual-primary text primitives, declarative Tag, icon-only, 16:9 Image, or ButtonUnfilled Action content, or explicit Empty and Blank absence values. Single-track text, selection, tag-only, icon-only, Action, Empty, and Blank cells resolve a 40px base contract while multi-track cells grow downward. Action cells primarily use an icon-only Ellipses treatment, render a 24px small ButtonUnfilled inside 8px padding, default to unbordered, and emit row, column, and action identities through dsCellAction. Image cells render a 52px-high bordered preview inside 6px outer padding, establishing a 64px row, and fall back to an accessible placeholder when no source is supplied. Empty means the data applies but has no value and renders an em dash with localized assistive text; Blank means the data is not applicable and renders no content. Nullish values remain backward-compatible Empty values. Stable type and variant hooks keep every cell family independently styleable.",
8097
+ "The public @ds-mo/ui/table.css export is the authoritative zero-specificity visual recipe. Override its --ds-table-* properties or target its stable element classes for product-specific styling."
8098
+ ],
8099
+ "responsiveBehavior": [
8100
+ "The table keeps native semantics at narrow widths and scrolls horizontally instead of transforming into cards.",
8101
+ "stickyHeader follows the active vertical scroll owner: a maxHeight table keeps its native header inside the bounded table scrollport, while a document-flow table retains a semantic native header and renders a sticky control header whose columns follow the body's native inline scroll timeline. Consumers set --ds-table-sticky-header-offset when page chrome occupies the scrollport edge.",
8102
+ "Without maxHeight the table grows the document and automatic lazy loading observes the browser viewport. Horizontal scrolling chains vertical wheel and trackpad movement to the page instead of trapping it.",
8103
+ "Explicit column sizes establish the horizontal overflow width; unsized columns share remaining space.",
8104
+ "Prefer the named xs through xl column sizes, which resolve through TokoMo's table-column width tokens; numeric pixel sizes remain an escape hatch for exceptional application-owned widths.",
8105
+ "Column headers use one 32px geometry. Body rows use a 40px single-track minimum; cell-specific outer padding and track geometry align text, selection, Tag, icon, Action, Empty, Blank, and Image primitives while additional tracks grow downward.",
8106
+ "Long content truncates by default and can opt into wrapping at the column or cell level."
8107
+ ],
8108
+ "frameworkCaveats": {
8109
+ "customElements": [
8110
+ "Assign columns, rows, groups, grouping, sort, and selectedRowIds through JavaScript properties rather than HTML attribute strings.",
8111
+ "Replace controlled property values in response to dsSortChange, dsGroupingChange, dsSelectionChange, and dsLoadMore; route dsRowActivate in the application owner."
8112
+ ],
8113
+ "react": [
8114
+ "Pass new array and state-object references when the controlled data or query state changes.",
8115
+ "Apply emitted sort, grouping, selection, action, or loading detail to application state and perform data transformations in the owning layer."
8116
+ ],
8117
+ "angular": [
8118
+ "Bind complex table inputs as properties and update the controlled values from the corresponding output events.",
8119
+ "Keep server cursor, query lifecycle, and cell-action handling in the owning service or container."
8120
+ ]
8121
+ },
8122
+ "references": [
8123
+ {
8124
+ "label": "Storybook review matrix",
8125
+ "path": "src/wc/components/Table/Table.stories.ts"
8126
+ },
8127
+ {
8128
+ "label": "Public visual recipe",
8129
+ "path": "src/wc/styles/table.css"
8130
+ }
8131
+ ]
8132
+ },
8133
+ "props": {
8134
+ "caption": {
8135
+ "type": "string",
8136
+ "required": true
8137
+ },
8138
+ "captionVisibility": {
8139
+ "type": "TableCaptionVisibility",
8140
+ "required": false
8141
+ },
8142
+ "columns": {
8143
+ "type": "TableColumn[]",
8144
+ "required": false
8145
+ },
8146
+ "emptyBody": {
8147
+ "type": "string",
8148
+ "required": false
8149
+ },
8150
+ "emptyCellLabel": {
8151
+ "type": "string",
8152
+ "required": false
8153
+ },
8154
+ "emptyHeading": {
8155
+ "type": "string",
8156
+ "required": false
8157
+ },
8158
+ "endOfResultsLabel": {
8159
+ "type": "string",
8160
+ "required": false
8161
+ },
8162
+ "error": {
8163
+ "type": "boolean",
8164
+ "required": false
8165
+ },
8166
+ "errorBody": {
8167
+ "type": "string",
8168
+ "required": false
8169
+ },
8170
+ "errorHeading": {
8171
+ "type": "string",
8172
+ "required": false
8173
+ },
8174
+ "grouping": {
8175
+ "type": "TableGroupingState | null",
8176
+ "required": false
8177
+ },
8178
+ "groups": {
8179
+ "type": "TableGroup[]",
8180
+ "required": false
8181
+ },
8182
+ "hasMore": {
8183
+ "type": "boolean",
8184
+ "required": false
8185
+ },
8186
+ "lazyLoading": {
8187
+ "type": "boolean",
8188
+ "required": false
8189
+ },
8190
+ "loadIdentity": {
8191
+ "type": "string | number",
8192
+ "required": false
8193
+ },
8194
+ "loadMoreError": {
8195
+ "type": "string | undefined",
8196
+ "required": false
8197
+ },
8198
+ "loadMoreLabel": {
8199
+ "type": "string",
8200
+ "required": false
8201
+ },
8202
+ "loadMoreMode": {
8203
+ "type": "TableLoadMoreMode",
8204
+ "required": false
8205
+ },
8206
+ "loadMoreThreshold": {
8207
+ "type": "number",
8208
+ "required": false
8209
+ },
8210
+ "loading": {
8211
+ "type": "boolean",
8212
+ "required": false
8213
+ },
8214
+ "loadingMore": {
8215
+ "type": "boolean",
8216
+ "required": false
8217
+ },
8218
+ "loadingMoreLabel": {
8219
+ "type": "string",
8220
+ "required": false
8221
+ },
8222
+ "maxHeight": {
8223
+ "type": "string | number | undefined",
8224
+ "required": false
8225
+ },
8226
+ "retryLabel": {
8227
+ "type": "string",
8228
+ "required": false
8229
+ },
8230
+ "rows": {
8231
+ "type": "TableRow[]",
8232
+ "required": false
8233
+ },
8234
+ "rowsLoadedLabel": {
8235
+ "type": "string",
8236
+ "required": false
8237
+ },
8238
+ "scrollLabel": {
8239
+ "type": "string | undefined",
8240
+ "required": false
8241
+ },
8242
+ "selectedRowIds": {
8243
+ "type": "string[]",
8244
+ "required": false
8245
+ },
8246
+ "selectionMode": {
8247
+ "type": "TableSelectionMode",
8248
+ "required": false
8249
+ },
8250
+ "skeletonRows": {
8251
+ "type": "number",
8252
+ "required": false
8253
+ },
8254
+ "sort": {
8255
+ "type": "TableSortState | null",
8256
+ "required": false
8257
+ },
8258
+ "stickyHeader": {
8259
+ "type": "boolean",
8260
+ "required": false
8261
+ }
8262
+ },
8263
+ "events": [
8264
+ {
8265
+ "name": "dsCellAction",
8266
+ "detail": "TableCellActionDetail"
8267
+ },
8268
+ {
8269
+ "name": "dsGroupingChange",
8270
+ "detail": "TableGroupingChangeDetail"
8271
+ },
8272
+ {
8273
+ "name": "dsLoadMore",
8274
+ "detail": "TableLoadMoreDetail"
8275
+ },
8276
+ {
8277
+ "name": "dsRowActivate",
8278
+ "detail": "TableRowActivateDetail"
8279
+ },
8280
+ {
8281
+ "name": "dsSelectionChange",
8282
+ "detail": "TableSelectionChangeDetail"
8283
+ },
8284
+ {
8285
+ "name": "dsSortChange",
8286
+ "detail": "TableSortChangeDetail"
8287
+ }
8288
+ ],
8289
+ "slots": [],
8290
+ "exports": {
8291
+ "customElement": "ds-table",
8292
+ "react": "DsTable",
8293
+ "angular": "DsTable"
8294
+ }
8295
+ },
8296
+ "dependencies": [
8297
+ "@ds-mo/ui",
8298
+ "@ds-mo/tokens",
8299
+ "@ds-mo/icons"
8300
+ ],
8301
+ "registryDependencies": [
8302
+ "button-unfilled",
8303
+ "checkbox",
8304
+ "empty-state",
8305
+ "icon",
8306
+ "loader",
8307
+ "skeleton",
8308
+ "tag",
8309
+ "text"
8310
+ ]
8311
+ },
8017
8312
  {
8018
8313
  "name": "tag",
8019
8314
  "title": "Tag",
@@ -8078,12 +8373,13 @@
8078
8373
  "Warning signals higher urgency or risk than caution, which asks for attention before a possible issue.",
8079
8374
  "Contrast changes visual prominence without changing semantic intent or parent surface context.",
8080
8375
  "Rounded is an optional visual style with no semantic difference.",
8376
+ "isInset opts into reduced outer geometry only when Tag is nested inside a control of the same density; semantic styling, typography, icons, gaps, radius, and interaction remain unchanged.",
8081
8377
  "Labels stay on one line and truncate only when the owner supplies a maximum width.",
8082
8378
  "Omitted interactive renders static metadata with no focus, event, or suffix. Interactive adds the fixed ChevronUpDown suffix and emits dsClick without toggling expanded internally.",
8083
8379
  "isInactive disables only the interactive button and applies the shared inactive treatment."
8084
8380
  ],
8085
8381
  "responsiveBehavior": [
8086
- "The owner selects md, sm, or xs density to match its local layout and owns collection wrapping, overflow, and condensation.",
8382
+ "The owner selects md, sm, or xs density to match its local layout and owns collection wrapping, overflow, and condensation. Use isInset only for same-density control nesting.",
8087
8383
  "Tag does not change size or behavior automatically at breakpoints."
8088
8384
  ],
8089
8385
  "frameworkCaveats": {
@@ -8133,6 +8429,10 @@
8133
8429
  "type": "boolean",
8134
8430
  "required": false
8135
8431
  },
8432
+ "isInset": {
8433
+ "type": "boolean",
8434
+ "required": false
8435
+ },
8136
8436
  "label": {
8137
8437
  "type": "string",
8138
8438
  "required": true