@ds-mo/ui 15.12.0 → 15.12.1

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 (50) hide show
  1. package/dist/.package-ready.json +1 -1
  2. package/dist/agent-patterns.json +1 -1
  3. package/dist/agent.json +8 -3
  4. package/dist/angular/ds-skeleton.d.ts +1 -1
  5. package/dist/angular/ds-skeleton.js +3 -3
  6. package/dist/components/ds-agent-questionnaire.js +1 -1
  7. package/dist/components/ds-agent-response.js +1 -1
  8. package/dist/components/ds-card-action-center.js +1 -1
  9. package/dist/components/ds-card-chart.js +1 -1
  10. package/dist/components/ds-card-navigation.js +1 -1
  11. package/dist/components/ds-card-overview.js +1 -1
  12. package/dist/components/ds-card-setting.js +1 -1
  13. package/dist/components/ds-card-settings-scope.js +1 -1
  14. package/dist/components/ds-card-settings-scope.js.map +1 -1
  15. package/dist/components/ds-data-saved-views.js +1 -1
  16. package/dist/components/ds-field.js +1 -1
  17. package/dist/components/ds-inline-banner-settings.js +1 -1
  18. package/dist/components/ds-pagination.js +1 -1
  19. package/dist/components/ds-radio.js +1 -1
  20. package/dist/components/ds-score.js +1 -1
  21. package/dist/components/ds-setting-row-radio.js +1 -1
  22. package/dist/components/ds-setting-row-toggle.js +1 -1
  23. package/dist/components/ds-skeleton.js +1 -1
  24. package/dist/components/ds-table.js +1 -1
  25. package/dist/components/{p-BnE9MeXS.js → p-3Xp9hXbL.js} +2 -2
  26. package/dist/components/{p-DmyU1fd-.js → p-BhbniDw4.js} +2 -2
  27. package/dist/components/{p-BpssHpam.js → p-CGtq7TnC.js} +2 -2
  28. package/dist/components/p-D538svhW.js +2 -0
  29. package/dist/components/p-D538svhW.js.map +1 -0
  30. package/dist/components/p-DcvPY30Q.js +2 -0
  31. package/dist/components/p-DcvPY30Q.js.map +1 -0
  32. package/dist/components/{p-XKt6j1UN.js → p-P2-eHQJU.js} +2 -2
  33. package/dist/docs/components.json +30 -1
  34. package/dist/lint/index.js +1 -1
  35. package/dist/mcp-data/registry/card-settings-scope.json +3 -3
  36. package/dist/mcp-data/registry/field.json +1 -1
  37. package/dist/mcp-data/registry/registry.json +7 -2
  38. package/dist/mcp-data/registry/skeleton.json +22 -3
  39. package/dist/types/components/Skeleton/Skeleton.d.ts +11 -0
  40. package/dist/types/components.d.ts +11 -0
  41. package/dist/vue/ds-skeleton.js +1 -0
  42. package/package.json +1 -1
  43. package/dist/components/p-BoFK9lmP.js +0 -2
  44. package/dist/components/p-BoFK9lmP.js.map +0 -1
  45. package/dist/components/p-zsWHUNJ9.js +0 -2
  46. package/dist/components/p-zsWHUNJ9.js.map +0 -1
  47. /package/dist/components/{p-BnE9MeXS.js.map → p-3Xp9hXbL.js.map} +0 -0
  48. /package/dist/components/{p-DmyU1fd-.js.map → p-BhbniDw4.js.map} +0 -0
  49. /package/dist/components/{p-BpssHpam.js.map → p-CGtq7TnC.js.map} +0 -0
  50. /package/dist/components/{p-XKt6j1UN.js.map → p-P2-eHQJU.js.map} +0 -0
@@ -32,7 +32,7 @@
32
32
  "The shared text-action recipe supplies brand foreground, hover underline, and keyboard focus indication."
33
33
  ],
34
34
  "states": [
35
- "Loading retains the card surface, sentence wrapping, and control footprints while replacing each fragment with an inert skeleton.",
35
+ "Loading retains the card surface, sentence wrapping, and control footprints while replacing each fragment with an inert text skeleton. Text actions mask only their labels, preserving the surrounding button's hit area.",
36
36
  "The application owns the selected area, profile, available choices, permissions, and empty-state copy. Existing complete area-trigger labels remain compatible. Applications that separate the localizable settings noun from the control supply the area-only trigger label and noun together.",
37
37
  "The card reports popup requests without changing selection or expanded state.",
38
38
  "The surface follows the active theme rather than imposing always-dark colors."
@@ -363,12 +363,12 @@
363
363
  "files": [
364
364
  {
365
365
  "path": "src/wc/components/CardSettingsScope/CardSettingsScope.css",
366
- "content": "@import '../../utils/text-decoration.css';\n@import '../../utils/focus-ring.css';\n@import '../../utils/radius.css';\n@import '../../styles/control-elevation.css';\n\n:host {\n display: block;\n min-width: 0;\n width: var(--dimension-card-width-md);\n max-width: 100%;\n}\n\n.card-settings-scope {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 0 var(--dimension-space-050);\n box-sizing: border-box;\n min-height: var(--dimension-size-600);\n padding: var(--dimension-space-100) var(--dimension-space-200);\n border-radius: var(--ds-radius-card);\n background: var(--color-background-primary);\n color: var(--color-foreground-primary);\n}\n\n.card-settings-scope__action {\n display: inline-flex;\n align-items: center;\n min-height: var(--dimension-size-400);\n max-width: 100%;\n margin: 0;\n padding: 0;\n border: 0;\n border-radius: var(--dimension-radius-025);\n background: transparent;\n cursor: pointer;\n}\n\n.card-settings-scope > ds-skeleton {\n min-width: 0;\n max-width: 100%;\n}\n\n.card-settings-scope__action ds-text {\n overflow-wrap: anywhere;\n text-align: start;\n}\n\n@media (forced-colors: active) {\n .card-settings-scope {\n outline: var(--dimension-stroke-width-012) solid var(--ds-forced-color-content);\n outline-offset: calc(-1 * var(--dimension-stroke-width-012));\n }\n}\n",
366
+ "content": "@import '../../utils/text-decoration.css';\n@import '../../utils/focus-ring.css';\n@import '../../utils/radius.css';\n@import '../../styles/control-elevation.css';\n\n:host {\n display: block;\n min-width: 0;\n width: var(--dimension-card-width-md);\n max-width: 100%;\n}\n\n.card-settings-scope {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 0 var(--dimension-space-050);\n box-sizing: border-box;\n min-height: var(--dimension-size-600);\n padding: var(--dimension-space-100) var(--dimension-space-200);\n border-radius: var(--ds-radius-card);\n background: var(--color-background-primary);\n color: var(--color-foreground-primary);\n}\n\n.card-settings-scope__action {\n display: inline-flex;\n align-items: center;\n min-height: var(--dimension-size-400);\n min-width: 0;\n max-width: 100%;\n margin: 0;\n padding: 0;\n border: 0;\n border-radius: var(--dimension-radius-025);\n background: transparent;\n cursor: pointer;\n}\n\n.card-settings-scope ds-skeleton {\n min-width: 0;\n max-width: 100%;\n}\n\n.card-settings-scope__action ds-text {\n overflow-wrap: anywhere;\n text-align: start;\n}\n\n@media (forced-colors: active) {\n .card-settings-scope {\n outline: var(--dimension-stroke-width-012) solid var(--ds-forced-color-content);\n outline-offset: calc(-1 * var(--dimension-stroke-width-012));\n }\n}\n",
367
367
  "type": "registry:ui"
368
368
  },
369
369
  {
370
370
  "path": "src/wc/components/CardSettingsScope/CardSettingsScope.tsx",
371
- "content": "import { Component, Event, EventEmitter, h, Host, Prop } from '@stencil/core';\n\nexport interface SettingsScopeRequest {\n scope: 'area' | 'profile';\n anchor: HTMLButtonElement;\n originalEvent: MouseEvent;\n}\n\n@Component({\n tag: 'ds-card-settings-scope',\n styleUrl: 'CardSettingsScope.css',\n scoped: true,\n})\nexport class CardSettingsScope {\n /** Current product area or complete combined-view label in the sentence trigger. */\n @Prop() areaLabel: string = 'All settings';\n /** Current organization or settings profile. */\n @Prop() profileLabel: string = 'Organization';\n /** Sentence prefix, supplied separately for localization. */\n @Prop() managingLabel: string = 'Managing';\n /** Optional sentence noun after an area-only trigger label, supplied separately for localization. */\n @Prop() settingsLabel: string = '';\n /** Sentence connector, supplied separately for localization. */\n @Prop() forLabel: string = 'for';\n /** Accessible name for this context region. */\n @Prop() scopeLabel: string = 'Settings scope';\n /** ID of the application-owned product-area menu. */\n @Prop() areaControls: string | undefined;\n /** ID of the application-owned profiles popup. */\n @Prop() profileControls: string | undefined;\n /** Whether the product-area menu is open. */\n @Prop() areaExpanded: boolean = false;\n /** Whether the profiles popup is open. */\n @Prop() profileExpanded: boolean = false;\n /** Empty informational profile popups use dialog semantics instead of a menu. */\n @Prop() profilePopup: 'menu' | 'dialog' = 'menu';\n /** Replace sentence fragments and controls with skeletons inside the same card. */\n @Prop() isLoading: boolean = false;\n\n /** Requests a popup; the owner supplies choices, open state, and selection. */\n @Event() dsScopeRequest!: EventEmitter<SettingsScopeRequest>;\n\n private request(scope: SettingsScopeRequest['scope'], event: MouseEvent) {\n if (this.isLoading) return;\n this.dsScopeRequest.emit({\n scope,\n anchor: event.currentTarget as HTMLButtonElement,\n originalEvent: event,\n });\n }\n\n render() {\n return (\n <Host aria-busy={this.isLoading ? 'true' : undefined}>\n <div\n class=\"card-settings-scope ds-control-elevation ds-control-elevation--sm\"\n role=\"region\"\n aria-label={this.scopeLabel}\n >\n <ds-skeleton preserveLayout={true} isLoading={this.isLoading}>\n <ds-text as=\"span\" variant=\"text-body-medium\" color=\"primary\">\n {this.managingLabel}\n </ds-text>\n </ds-skeleton>\n <ds-skeleton preserveLayout={true} isLoading={this.isLoading}>\n <button\n type=\"button\"\n class=\"card-settings-scope__action ds-text-action ds-focus-ring\"\n aria-haspopup=\"menu\"\n aria-controls={this.areaControls}\n aria-expanded={String(this.areaExpanded)}\n onClick={event => this.request('area', event)}\n >\n <ds-text as=\"span\" variant=\"text-body-medium\" color=\"inherit\">\n {this.areaLabel}\n </ds-text>\n </button>\n </ds-skeleton>\n {this.settingsLabel.trim() ? (\n <ds-skeleton preserveLayout={true} isLoading={this.isLoading}>\n <ds-text as=\"span\" variant=\"text-body-medium\" color=\"primary\">\n {this.settingsLabel}\n </ds-text>\n </ds-skeleton>\n ) : null}\n <ds-skeleton preserveLayout={true} isLoading={this.isLoading}>\n <ds-text as=\"span\" variant=\"text-body-medium\" color=\"primary\">\n {this.forLabel}\n </ds-text>\n </ds-skeleton>\n <ds-skeleton preserveLayout={true} isLoading={this.isLoading}>\n <button\n type=\"button\"\n class=\"card-settings-scope__action ds-text-action ds-focus-ring\"\n aria-haspopup={this.profilePopup}\n aria-controls={this.profileControls}\n aria-expanded={String(this.profileExpanded)}\n onClick={event => this.request('profile', event)}\n >\n <ds-text as=\"span\" variant=\"text-body-medium\" color=\"inherit\">\n {this.profileLabel}\n </ds-text>\n </button>\n </ds-skeleton>\n </div>\n </Host>\n );\n }\n}\n",
371
+ "content": "import { Component, Event, EventEmitter, h, Host, Prop } from '@stencil/core';\n\nexport interface SettingsScopeRequest {\n scope: 'area' | 'profile';\n anchor: HTMLButtonElement;\n originalEvent: MouseEvent;\n}\n\n@Component({\n tag: 'ds-card-settings-scope',\n styleUrl: 'CardSettingsScope.css',\n scoped: true,\n})\nexport class CardSettingsScope {\n /** Current product area or complete combined-view label in the sentence trigger. */\n @Prop() areaLabel: string = 'All settings';\n /** Current organization or settings profile. */\n @Prop() profileLabel: string = 'Organization';\n /** Sentence prefix, supplied separately for localization. */\n @Prop() managingLabel: string = 'Managing';\n /** Optional sentence noun after an area-only trigger label, supplied separately for localization. */\n @Prop() settingsLabel: string = '';\n /** Sentence connector, supplied separately for localization. */\n @Prop() forLabel: string = 'for';\n /** Accessible name for this context region. */\n @Prop() scopeLabel: string = 'Settings scope';\n /** ID of the application-owned product-area menu. */\n @Prop() areaControls: string | undefined;\n /** ID of the application-owned profiles popup. */\n @Prop() profileControls: string | undefined;\n /** Whether the product-area menu is open. */\n @Prop() areaExpanded: boolean = false;\n /** Whether the profiles popup is open. */\n @Prop() profileExpanded: boolean = false;\n /** Empty informational profile popups use dialog semantics instead of a menu. */\n @Prop() profilePopup: 'menu' | 'dialog' = 'menu';\n /** Replace sentence fragments and controls with skeletons inside the same card. */\n @Prop() isLoading: boolean = false;\n\n /** Requests a popup; the owner supplies choices, open state, and selection. */\n @Event() dsScopeRequest!: EventEmitter<SettingsScopeRequest>;\n\n private request(scope: SettingsScopeRequest['scope'], event: MouseEvent) {\n if (this.isLoading) return;\n this.dsScopeRequest.emit({\n scope,\n anchor: event.currentTarget as HTMLButtonElement,\n originalEvent: event,\n });\n }\n\n render() {\n return (\n <Host aria-busy={this.isLoading ? 'true' : undefined} inert={this.isLoading}>\n <div\n class=\"card-settings-scope ds-control-elevation ds-control-elevation--sm\"\n role=\"region\"\n aria-label={this.scopeLabel}\n aria-hidden={this.isLoading ? 'true' : undefined}\n >\n <ds-skeleton preserveLayout={true} isLoading={this.isLoading}>\n <ds-text as=\"span\" variant=\"text-body-medium\" color=\"primary\">\n {this.managingLabel}\n </ds-text>\n </ds-skeleton>\n <button\n type=\"button\"\n class=\"card-settings-scope__action ds-text-action ds-focus-ring\"\n aria-haspopup=\"menu\"\n aria-controls={this.areaControls}\n aria-expanded={String(this.areaExpanded)}\n onClick={event => this.request('area', event)}\n >\n <ds-skeleton preserveLayout={true} isLoading={this.isLoading}>\n <ds-text as=\"span\" variant=\"text-body-medium\" color=\"inherit\">\n {this.areaLabel}\n </ds-text>\n </ds-skeleton>\n </button>\n {this.settingsLabel.trim() ? (\n <ds-skeleton preserveLayout={true} isLoading={this.isLoading}>\n <ds-text as=\"span\" variant=\"text-body-medium\" color=\"primary\">\n {this.settingsLabel}\n </ds-text>\n </ds-skeleton>\n ) : null}\n <ds-skeleton preserveLayout={true} isLoading={this.isLoading}>\n <ds-text as=\"span\" variant=\"text-body-medium\" color=\"primary\">\n {this.forLabel}\n </ds-text>\n </ds-skeleton>\n <button\n type=\"button\"\n class=\"card-settings-scope__action ds-text-action ds-focus-ring\"\n aria-haspopup={this.profilePopup}\n aria-controls={this.profileControls}\n aria-expanded={String(this.profileExpanded)}\n onClick={event => this.request('profile', event)}\n >\n <ds-skeleton preserveLayout={true} isLoading={this.isLoading}>\n <ds-text as=\"span\" variant=\"text-body-medium\" color=\"inherit\">\n {this.profileLabel}\n </ds-text>\n </ds-skeleton>\n </button>\n </div>\n </Host>\n );\n }\n}\n",
372
372
  "type": "registry:ui"
373
373
  }
374
374
  ]
@@ -255,7 +255,7 @@
255
255
  "files": [
256
256
  {
257
257
  "path": "src/wc/components/Field/Field.css",
258
- "content": "@import '../../utils/text-field-support.css';\n@import '../../utils/control-density.css';\n@import '../../utils/field-stack.css';\n\n:host {\n display: block;\n}\n\n.field__control {\n position: relative;\n display: flex;\n min-width: 0;\n}\n\n.field__control > * {\n width: 100%;\n}\n\n.field__label,\n.field__description,\n.field__error,\n.text-field-count {\n position: relative;\n}\n\n.field__copy-source--loading,\n:host(.field--loading) .field__control > :not(slot):not(.field__control-skeleton) {\n visibility: hidden;\n}\n\n.field__copy-skeleton {\n position: absolute;\n inset-inline-start: 0;\n inset-block-start: 0;\n max-inline-size: 100%;\n}\n\n.field__label .field__copy-skeleton {\n inline-size: min(100%, calc(var(--dimension-size-800) * 2));\n}\n\n.field__control-skeleton {\n position: absolute;\n inset: 0;\n inline-size: 100%;\n block-size: 100%;\n}\n",
258
+ "content": "@import '../../utils/text-field-support.css';\n@import '../../utils/control-density.css';\n@import '../../utils/field-stack.css';\n\n:host {\n display: block;\n}\n\n.field__control {\n position: relative;\n display: flex;\n min-width: 0;\n}\n\n.field__control > * {\n width: 100%;\n}\n\n.field__label,\n.field__description,\n.field__error,\n.text-field-count {\n position: relative;\n}\n\n.field__copy-source--loading,\n:host(.field--loading) .field__control ::slotted(:not(.field__control-skeleton)) {\n visibility: hidden;\n}\n\n.field__copy-skeleton {\n position: absolute;\n inset-inline-start: 0;\n inset-block-start: 0;\n max-inline-size: 100%;\n}\n\n.field__label .field__copy-skeleton {\n inline-size: min(100%, calc(var(--dimension-size-800) * 2));\n}\n\n.field__control-skeleton {\n position: absolute;\n inset: 0;\n inline-size: 100%;\n block-size: 100%;\n}\n",
259
259
  "type": "registry:ui"
260
260
  },
261
261
  {
@@ -4179,7 +4179,7 @@
4179
4179
  "The shared text-action recipe supplies brand foreground, hover underline, and keyboard focus indication."
4180
4180
  ],
4181
4181
  "states": [
4182
- "Loading retains the card surface, sentence wrapping, and control footprints while replacing each fragment with an inert skeleton.",
4182
+ "Loading retains the card surface, sentence wrapping, and control footprints while replacing each fragment with an inert text skeleton. Text actions mask only their labels, preserving the surrounding button's hit area.",
4183
4183
  "The application owns the selected area, profile, available choices, permissions, and empty-state copy. Existing complete area-trigger labels remain compatible. Applications that separate the localizable settings noun from the control supply the area-only trigger label and noun together.",
4184
4184
  "The card reports popup requests without changing selection or expanded state.",
4185
4185
  "The surface follows the active theme rather than imposing always-dark colors."
@@ -14926,7 +14926,8 @@
14926
14926
  ],
14927
14927
  "responsiveBehavior": [
14928
14928
  "The owning layout changes placeholder count, width, visibility, and arrangement to match its real responsive content.",
14929
- "Skeleton does not infer breakpoints or rearrange sibling atoms."
14929
+ "Set collapseLabel on a control skeleton when its real control opts into compact table-caption behavior. It follows the same table or standalone data-toolbar measurement, replacing icon-and-label anatomy with a centered icon while preserving the enclosing control footprint.",
14930
+ "Other skeletons do not infer breakpoints or rearrange sibling atoms. Icon canvases retain their square geometry in flex layouts."
14930
14931
  ],
14931
14932
  "frameworkCaveats": {
14932
14933
  "customElements": [
@@ -14997,6 +14998,10 @@
14997
14998
  "type": "SkeletonBackground | undefined",
14998
14999
  "required": false
14999
15000
  },
15001
+ "collapseLabel": {
15002
+ "type": "boolean",
15003
+ "required": false
15004
+ },
15000
15005
  "controlAppearance": {
15001
15006
  "type": "SkeletonControlAppearance",
15002
15007
  "required": false
@@ -65,7 +65,8 @@
65
65
  ],
66
66
  "responsiveBehavior": [
67
67
  "The owning layout changes placeholder count, width, visibility, and arrangement to match its real responsive content.",
68
- "Skeleton does not infer breakpoints or rearrange sibling atoms."
68
+ "Set collapseLabel on a control skeleton when its real control opts into compact table-caption behavior. It follows the same table or standalone data-toolbar measurement, replacing icon-and-label anatomy with a centered icon while preserving the enclosing control footprint.",
69
+ "Other skeletons do not infer breakpoints or rearrange sibling atoms. Icon canvases retain their square geometry in flex layouts."
69
70
  ],
70
71
  "frameworkCaveats": {
71
72
  "customElements": [
@@ -141,6 +142,15 @@
141
142
  "mutable": false,
142
143
  "description": "Actual parent surface context. Omit on primary and secondary surfaces."
143
144
  },
145
+ "collapseLabel": {
146
+ "type": "boolean",
147
+ "resolvedType": "boolean",
148
+ "attribute": "collapse-label",
149
+ "default": "false",
150
+ "required": false,
151
+ "mutable": false,
152
+ "description": "Follow the owning table or data toolbar's compact icon-only control presentation."
153
+ },
144
154
  "controlAppearance": {
145
155
  "type": "SkeletonControlAppearance",
146
156
  "resolvedType": "\"borderless\" | \"filled\" | \"outlined\"",
@@ -257,6 +267,15 @@
257
267
  "mutable": false,
258
268
  "description": "Actual parent surface context. Omit on primary and secondary surfaces."
259
269
  },
270
+ "collapseLabel": {
271
+ "type": "boolean",
272
+ "resolvedType": "boolean",
273
+ "attribute": "collapse-label",
274
+ "default": "false",
275
+ "required": false,
276
+ "mutable": false,
277
+ "description": "Follow the owning table or data toolbar's compact icon-only control presentation."
278
+ },
260
279
  "controlAppearance": {
261
280
  "type": "SkeletonControlAppearance",
262
281
  "resolvedType": "\"borderless\" | \"filled\" | \"outlined\"",
@@ -407,12 +426,12 @@
407
426
  "files": [
408
427
  {
409
428
  "path": "src/wc/components/Skeleton/Skeleton.css",
410
- "content": "@import '../../utils/radius.css';\n@import '../../utils/control-density.css';\n@import '../../utils/control-parts.css';\n@import '../../utils/shimmer.css';\n\n:host {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n min-width: 0;\n vertical-align: middle;\n --ds-skeleton-base: var(--color-foreground-quaternary);\n --ds-shimmer: var(--color-shimmer-shimmer);\n --ds-skeleton-border: var(--color-border-secondary);\n}\n\n.skeleton__shape {\n --ds-shimmer-surface-base: var(--ds-skeleton-base);\n\n display: block;\n width: 100%;\n height: 100%;\n flex: 0 0 auto;\n background-color: var(--ds-skeleton-base);\n border-radius: var(--dimension-radius-025);\n}\n\n/* ── Background context ────────────────────────────────────────────────── */\n\n:host(.skeleton--background-medium) {\n --ds-skeleton-border: var(--color-border-on-medium-background-secondary);\n --ds-skeleton-base: var(--color-foreground-on-medium-background-quaternary);\n --ds-shimmer: var(--color-shimmer-shimmer-on-medium-background);\n}\n\n:host(.skeleton--background-bold) {\n --ds-skeleton-border: var(--color-border-on-bold-background-secondary);\n --ds-skeleton-base: var(--color-foreground-on-bold-background-quaternary);\n --ds-shimmer: var(--color-shimmer-shimmer-on-bold-background);\n}\n\n:host(.skeleton--background-strong) {\n --ds-skeleton-border: var(--color-border-on-strong-background-secondary);\n --ds-skeleton-base: var(--color-foreground-on-strong-background-quaternary);\n --ds-shimmer: var(--color-shimmer-shimmer-on-strong-background);\n}\n\n:host(.skeleton--background-translucent) {\n --ds-skeleton-border: var(--color-translucent-border-secondary);\n --ds-skeleton-base: var(--color-translucent-foreground-quaternary);\n --ds-shimmer: var(--color-translucent-shimmer);\n}\n\n:host(.skeleton--background-inverted) {\n --ds-skeleton-border: var(--color-inverted-border-secondary);\n --ds-skeleton-base: var(--color-inverted-foreground-quaternary);\n --ds-shimmer: var(--color-inverted-shimmer);\n}\n\n:host(.skeleton--background-media) {\n --ds-skeleton-border: var(--color-media-border-secondary);\n --ds-skeleton-base: var(--color-media-foreground-quaternary);\n --ds-shimmer: var(--color-media-shimmer);\n}\n\n:host(.skeleton--background-always-dark) {\n --ds-skeleton-border: var(--color-always-dark-border-secondary);\n --ds-skeleton-base: var(--color-always-dark-foreground-quaternary);\n --ds-shimmer: var(--color-always-dark-shimmer);\n}\n\n:host(.skeleton--background-navigation) {\n --ds-skeleton-base: var(--color-navigation-foreground-quaternary);\n --ds-shimmer: var(--color-navigation-shimmer);\n}\n\n/* ── Text ──────────────────────────────────────────────────────────────── */\n\n:host(.skeleton--text) {\n width: 100%;\n height: var(--ds-skeleton-canvas-size);\n padding-block: 0;\n}\n\n:host(.skeleton--text) .skeleton__shape {\n height: 75%;\n}\n\n:host(.skeleton--text-text-display-medium) {\n --ds-skeleton-canvas-size: var(--typography-lineheight-3xl);\n}\n:host(.skeleton--text-text-display-small) {\n --ds-skeleton-canvas-size: var(--typography-lineheight-2xl);\n}\n:host(.skeleton--text-text-title-large) {\n --ds-skeleton-canvas-size: var(--typography-lineheight-xl);\n}\n:host(.skeleton--text-text-title-medium),\n:host(.skeleton--text-text-body-large) {\n --ds-skeleton-canvas-size: var(--typography-lineheight-lg);\n}\n:host(.skeleton--text-text-title-small),\n:host(.skeleton--text-text-body-medium) {\n --ds-skeleton-canvas-size: var(--typography-lineheight-md);\n}\n:host(.skeleton--text-text-body-small) {\n --ds-skeleton-canvas-size: var(--typography-lineheight-sm);\n}\n:host(.skeleton--text-text-caption) {\n --ds-skeleton-canvas-size: var(--typography-lineheight-xs);\n}\n\n/* ── Icon ──────────────────────────────────────────────────────────────── */\n\n:host(.skeleton--icon) {\n width: var(--ds-skeleton-canvas-size);\n height: var(--ds-skeleton-canvas-size);\n padding: 0;\n}\n\n:host(.skeleton--icon) .skeleton__shape {\n width: 75%;\n height: 75%;\n}\n\n:host(.skeleton--icon.skeleton--rounded) .skeleton__shape {\n border-radius: var(--dimension-radius-half);\n}\n\n:host(.skeleton--icon-xs) {\n --ds-skeleton-canvas-size: var(--dimension-iconography-xs);\n}\n:host(.skeleton--icon-sm) {\n --ds-skeleton-canvas-size: var(--dimension-iconography-sm);\n}\n:host(.skeleton--icon-md) {\n --ds-skeleton-canvas-size: var(--dimension-iconography-md);\n}\n:host(.skeleton--icon-lg) {\n --ds-skeleton-canvas-size: var(--dimension-iconography-lg);\n}\n:host(.skeleton--icon-xl) {\n --ds-skeleton-canvas-size: var(--dimension-iconography-xl);\n}\n:host(.skeleton--icon-2xl) {\n --ds-skeleton-canvas-size: var(--dimension-iconography-2xl);\n}\n:host(.skeleton--icon-3xl) {\n --ds-skeleton-canvas-size: var(--dimension-iconography-3xl);\n}\n\n/* ── Control ───────────────────────────────────────────────────────────── */\n\n:host(.skeleton--control) {\n width: 100%;\n height: var(--ds-control-height);\n}\n\n:host(.skeleton--control) .skeleton__shape {\n border-radius: var(--ds-control-radius, var(--dimension-radius-025));\n}\n\n:host(.skeleton--control.skeleton--rounded) .skeleton__shape {\n border-radius: var(--dimension-radius-half);\n}\n\n.skeleton__control {\n width: 100%;\n height: 100%;\n min-width: 0;\n}\n\n.skeleton__control--icon {\n justify-content: center;\n padding: 0;\n}\n\n.skeleton__control-label {\n display: flex;\n flex: 1 1 auto;\n align-items: center;\n overflow: hidden;\n}\n\n:host(.skeleton--control-outlined) .skeleton__control {\n box-shadow: inset 0 0 0 var(--dimension-stroke-width-012) var(--ds-skeleton-border);\n}\n\n:host(.skeleton--rounded) .skeleton__control {\n border-radius: var(--dimension-radius-half);\n}\n\n@media (forced-colors: active) {\n .skeleton__shape {\n background-color: var(--ds-forced-color-disabled);\n }\n :host(.skeleton--control-outlined) .skeleton__control {\n outline: var(--dimension-stroke-width-012) solid var(--ds-forced-color-disabled);\n outline-offset: calc(-1 * var(--dimension-stroke-width-012));\n }\n}\n\n/* Projected content supplies its intrinsic size, wrapping and responsive metrics. */\n:host(.skeleton--preserve-layout) {\n display: grid;\n width: auto;\n height: auto;\n align-items: stretch;\n justify-content: stretch;\n padding: 0;\n}\n\n:host(.skeleton--preserve-layout) .skeleton__source,\n:host(.skeleton--preserve-layout) .skeleton__control,\n:host(.skeleton--preserve-layout) .skeleton__shape {\n grid-area: 1 / 1;\n min-width: 0;\n}\n\n.skeleton__source {\n display: grid;\n visibility: hidden;\n}\n\n:host(.skeleton--preserve-layout) .skeleton__shape {\n height: 100%;\n width: 100%;\n}\n\n:host(.skeleton--preserve-layout.skeleton--text) .skeleton__shape {\n /* Alpha mask only: each retained line uses the atomic text skeleton's inset. */\n mask-image: repeating-linear-gradient(\n to bottom,\n transparent 0,\n transparent calc(var(--ds-skeleton-canvas-size) * 0.125),\n currentColor calc(var(--ds-skeleton-canvas-size) * 0.125),\n currentColor calc(var(--ds-skeleton-canvas-size) * 0.875),\n transparent calc(var(--ds-skeleton-canvas-size) * 0.875),\n transparent var(--ds-skeleton-canvas-size)\n );\n}\n\n:host(.skeleton--content-ready) .skeleton__source {\n visibility: inherit;\n}\n",
429
+ "content": "@import '../../utils/radius.css';\n@import '../../utils/control-density.css';\n@import '../../utils/control-parts.css';\n@import '../../utils/shimmer.css';\n\n:host {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n min-width: 0;\n vertical-align: middle;\n --ds-skeleton-base: var(--color-foreground-quaternary);\n --ds-shimmer: var(--color-shimmer-shimmer);\n --ds-skeleton-border: var(--color-border-secondary);\n}\n\n.skeleton__shape {\n --ds-shimmer-surface-base: var(--ds-skeleton-base);\n\n display: block;\n width: 100%;\n height: 100%;\n flex: 0 0 auto;\n background-color: var(--ds-skeleton-base);\n border-radius: var(--dimension-radius-025);\n}\n\n/* ── Background context ────────────────────────────────────────────────── */\n\n:host(.skeleton--background-medium) {\n --ds-skeleton-border: var(--color-border-on-medium-background-secondary);\n --ds-skeleton-base: var(--color-foreground-on-medium-background-quaternary);\n --ds-shimmer: var(--color-shimmer-shimmer-on-medium-background);\n}\n\n:host(.skeleton--background-bold) {\n --ds-skeleton-border: var(--color-border-on-bold-background-secondary);\n --ds-skeleton-base: var(--color-foreground-on-bold-background-quaternary);\n --ds-shimmer: var(--color-shimmer-shimmer-on-bold-background);\n}\n\n:host(.skeleton--background-strong) {\n --ds-skeleton-border: var(--color-border-on-strong-background-secondary);\n --ds-skeleton-base: var(--color-foreground-on-strong-background-quaternary);\n --ds-shimmer: var(--color-shimmer-shimmer-on-strong-background);\n}\n\n:host(.skeleton--background-translucent) {\n --ds-skeleton-border: var(--color-translucent-border-secondary);\n --ds-skeleton-base: var(--color-translucent-foreground-quaternary);\n --ds-shimmer: var(--color-translucent-shimmer);\n}\n\n:host(.skeleton--background-inverted) {\n --ds-skeleton-border: var(--color-inverted-border-secondary);\n --ds-skeleton-base: var(--color-inverted-foreground-quaternary);\n --ds-shimmer: var(--color-inverted-shimmer);\n}\n\n:host(.skeleton--background-media) {\n --ds-skeleton-border: var(--color-media-border-secondary);\n --ds-skeleton-base: var(--color-media-foreground-quaternary);\n --ds-shimmer: var(--color-media-shimmer);\n}\n\n:host(.skeleton--background-always-dark) {\n --ds-skeleton-border: var(--color-always-dark-border-secondary);\n --ds-skeleton-base: var(--color-always-dark-foreground-quaternary);\n --ds-shimmer: var(--color-always-dark-shimmer);\n}\n\n:host(.skeleton--background-navigation) {\n --ds-skeleton-base: var(--color-navigation-foreground-quaternary);\n --ds-shimmer: var(--color-navigation-shimmer);\n}\n\n/* ── Text ──────────────────────────────────────────────────────────────── */\n\n:host(.skeleton--text) {\n width: 100%;\n height: var(--ds-skeleton-canvas-size);\n padding-block: 0;\n}\n\n:host(.skeleton--text) .skeleton__shape {\n height: 75%;\n}\n\n:host(.skeleton--text-text-display-medium) {\n --ds-skeleton-canvas-size: var(--typography-lineheight-3xl);\n}\n:host(.skeleton--text-text-display-small) {\n --ds-skeleton-canvas-size: var(--typography-lineheight-2xl);\n}\n:host(.skeleton--text-text-title-large) {\n --ds-skeleton-canvas-size: var(--typography-lineheight-xl);\n}\n:host(.skeleton--text-text-title-medium),\n:host(.skeleton--text-text-body-large) {\n --ds-skeleton-canvas-size: var(--typography-lineheight-lg);\n}\n:host(.skeleton--text-text-title-small),\n:host(.skeleton--text-text-body-medium) {\n --ds-skeleton-canvas-size: var(--typography-lineheight-md);\n}\n:host(.skeleton--text-text-body-small) {\n --ds-skeleton-canvas-size: var(--typography-lineheight-sm);\n}\n:host(.skeleton--text-text-caption) {\n --ds-skeleton-canvas-size: var(--typography-lineheight-xs);\n}\n\n/* ── Icon ──────────────────────────────────────────────────────────────── */\n\n:host(.skeleton--icon) {\n flex-shrink: 0;\n width: var(--ds-skeleton-canvas-size);\n height: var(--ds-skeleton-canvas-size);\n padding: 0;\n}\n\n:host(.skeleton--icon) .skeleton__shape {\n width: 75%;\n height: 75%;\n}\n\n:host(.skeleton--icon.skeleton--rounded) .skeleton__shape {\n border-radius: var(--dimension-radius-half);\n}\n\n:host(.skeleton--icon-xs) {\n --ds-skeleton-canvas-size: var(--dimension-iconography-xs);\n}\n:host(.skeleton--icon-sm) {\n --ds-skeleton-canvas-size: var(--dimension-iconography-sm);\n}\n:host(.skeleton--icon-md) {\n --ds-skeleton-canvas-size: var(--dimension-iconography-md);\n}\n:host(.skeleton--icon-lg) {\n --ds-skeleton-canvas-size: var(--dimension-iconography-lg);\n}\n:host(.skeleton--icon-xl) {\n --ds-skeleton-canvas-size: var(--dimension-iconography-xl);\n}\n:host(.skeleton--icon-2xl) {\n --ds-skeleton-canvas-size: var(--dimension-iconography-2xl);\n}\n:host(.skeleton--icon-3xl) {\n --ds-skeleton-canvas-size: var(--dimension-iconography-3xl);\n}\n\n/* ── Control ───────────────────────────────────────────────────────────── */\n\n:host(.skeleton--control) {\n width: 100%;\n height: var(--ds-control-height);\n}\n\n:host(.skeleton--control) .skeleton__shape {\n border-radius: var(--ds-control-radius, var(--dimension-radius-025));\n}\n\n:host(.skeleton--control.skeleton--rounded) .skeleton__shape {\n border-radius: var(--dimension-radius-half);\n}\n\n.skeleton__control {\n width: 100%;\n height: 100%;\n min-width: 0;\n}\n\n.skeleton__control--icon {\n justify-content: center;\n padding: 0;\n}\n\n.skeleton__control-label {\n display: flex;\n flex: 1 1 auto;\n align-items: center;\n overflow: hidden;\n}\n\n:host(.skeleton--control-outlined) .skeleton__control {\n box-shadow: inset 0 0 0 var(--dimension-stroke-width-012) var(--ds-skeleton-border);\n}\n\n:host(.skeleton--rounded) .skeleton__control {\n border-radius: var(--dimension-radius-half);\n}\n\n@media (forced-colors: active) {\n .skeleton__shape {\n background-color: var(--ds-forced-color-disabled);\n }\n :host(.skeleton--control-outlined) .skeleton__control {\n outline: var(--dimension-stroke-width-012) solid var(--ds-forced-color-disabled);\n outline-offset: calc(-1 * var(--dimension-stroke-width-012));\n }\n}\n\n/* Projected content supplies its intrinsic size, wrapping and responsive metrics. */\n:host(.skeleton--preserve-layout) {\n display: grid;\n width: auto;\n height: auto;\n align-items: stretch;\n justify-content: stretch;\n padding: 0;\n}\n\n:host(.skeleton--preserve-layout) .skeleton__source,\n:host(.skeleton--preserve-layout) .skeleton__control,\n:host(.skeleton--preserve-layout) .skeleton__shape {\n grid-area: 1 / 1;\n min-width: 0;\n}\n\n.skeleton__source {\n display: grid;\n visibility: hidden;\n}\n\n:host(.skeleton--preserve-layout) .skeleton__shape {\n height: 100%;\n width: 100%;\n}\n\n:host(.skeleton--preserve-layout.skeleton--text) .skeleton__shape {\n /* Geometry only: inherited text alpha must not dim the skeleton's own token. */\n mask-image: repeating-linear-gradient(\n to bottom,\n transparent 0,\n transparent calc(var(--ds-skeleton-canvas-size) * 0.125),\n rgb(from currentColor r g b / 1) calc(var(--ds-skeleton-canvas-size) * 0.125),\n rgb(from currentColor r g b / 1) calc(var(--ds-skeleton-canvas-size) * 0.875),\n transparent calc(var(--ds-skeleton-canvas-size) * 0.875),\n transparent var(--ds-skeleton-canvas-size)\n );\n}\n\n:host(.skeleton--content-ready) .skeleton__source {\n visibility: inherit;\n}\n",
411
430
  "type": "registry:ui"
412
431
  },
413
432
  {
414
433
  "path": "src/wc/components/Skeleton/Skeleton.tsx",
415
- "content": "import { Component, Prop, h, Host } from '@stencil/core';\nimport type { IconSize } from '../Icon/Icon';\nimport type { TextVariant } from '../Text/text-types';\nimport { CONTROL_TEXT_VARIANT, type ControlSize } from '../../utils/control-text';\n\nexport type SkeletonVariant = 'text' | 'icon' | 'control';\nexport type SkeletonControlAppearance = 'filled' | 'outlined' | 'borderless';\nexport type SkeletonControlContent =\n | 'label'\n | 'icon'\n | 'icon-label'\n | 'label-icon'\n | 'icon-label-icon';\nexport type SkeletonBackground =\n | 'faint'\n | 'medium'\n | 'bold'\n | 'strong'\n | 'translucent'\n | 'inverted'\n | 'media'\n | 'navigation'\n | 'always-dark';\n\n/** @slot - Real text or a control whose footprint is retained with preserveLayout. */\n@Component({\n tag: 'ds-skeleton',\n styleUrl: 'Skeleton.css',\n shadow: true,\n})\nexport class Skeleton {\n @Prop() variant: SkeletonVariant = 'text';\n /** Text metric recipe whose line-height defines the text canvas. */\n @Prop() textVariant: TextVariant = 'text-body-medium';\n /** Iconography token whose square canvas defines the icon canvas. */\n @Prop() iconSize: IconSize = 'md';\n /** Shared control-density size whose height defines the control canvas. */\n @Prop() controlSize: ControlSize = 'md';\n /** Filled controls replace the entire shape; other appearances retain the frame and mask its contents. */\n @Prop() controlAppearance: SkeletonControlAppearance = 'filled';\n /** Content anatomy for outlined and borderless control placeholders. */\n @Prop() controlContent: SkeletonControlContent = 'label';\n /** Width of text and control skeleton canvases. Numbers resolve to px. Ignored for icons. */\n @Prop() width: string | number | undefined;\n /** Round icon skeletons into circles and control skeletons into pills. Ignored for text. */\n @Prop() rounded: boolean = false;\n /** Whether to show the shimmer animation. */\n @Prop() shimmer: boolean = true;\n /** Derive geometry from a projected control or text instead of estimating its footprint. */\n @Prop() preserveLayout: boolean = false;\n /** With preserveLayout, reveal the same projected content when loading completes. */\n @Prop() isLoading: boolean = true;\n /** Actual parent surface context. Omit on primary and secondary surfaces. */\n @Prop() background: SkeletonBackground | undefined;\n\n private get widthCss() {\n const v = this.width;\n if (v == null) return undefined;\n return typeof v === 'number' ? `${v}px` : v;\n }\n\n private renderControl() {\n const iconOnly = this.controlContent === 'icon';\n const icon = () => (\n <ds-skeleton\n variant=\"icon\"\n iconSize={this.controlSize}\n background={this.background}\n shimmer={this.shimmer}\n />\n );\n return (\n <span\n class={{\n skeleton__control: true,\n 'ds-control-frame': true,\n 'skeleton__control--icon': iconOnly,\n }}\n >\n {(iconOnly || this.controlContent.startsWith('icon-')) && icon()}\n {!iconOnly && (\n <span class=\"skeleton__control-label ds-control-label-box\">\n <ds-skeleton\n textVariant={CONTROL_TEXT_VARIANT[this.controlSize]}\n background={this.background}\n shimmer={this.shimmer}\n />\n </span>\n )}\n {!iconOnly && this.controlContent.endsWith('-icon') && icon()}\n </span>\n );\n }\n\n render() {\n return (\n <Host\n aria-hidden={this.isLoading ? 'true' : undefined}\n class={{\n skeleton: true,\n [`skeleton--${this.variant}`]: true,\n [`skeleton--text-${this.textVariant}`]: this.variant === 'text',\n [`skeleton--icon-${this.iconSize}`]: this.variant === 'icon',\n [`ds-control--${this.controlSize}`]: this.variant === 'control',\n [`skeleton--control-${this.controlAppearance}`]: this.variant === 'control',\n [`skeleton--background-${this.background}`]: !!this.background,\n 'skeleton--rounded': this.variant !== 'text' && this.rounded,\n 'skeleton--preserve-layout': this.preserveLayout,\n 'skeleton--content-ready': this.preserveLayout && !this.isLoading,\n }}\n style={this.variant === 'icon' ? undefined : { width: this.widthCss }}\n >\n {this.preserveLayout && (\n <span class=\"skeleton__source\" inert={this.isLoading}>\n <slot />\n </span>\n )}\n {this.isLoading &&\n (this.variant === 'control' && this.controlAppearance !== 'filled' ? (\n this.renderControl()\n ) : (\n <span\n class={{\n skeleton__shape: true,\n 'ds-shimmer-surface': this.shimmer,\n }}\n />\n ))}\n </Host>\n );\n }\n}\n",
434
+ "content": "import { Component, Element, Prop, State, Watch, h, Host } from '@stencil/core';\nimport type { IconSize } from '../Icon/Icon';\nimport type { TextVariant } from '../Text/text-types';\nimport { CONTROL_TEXT_VARIANT, type ControlSize } from '../../utils/control-text';\nimport { observeTableCaptionCompact } from '../../utils/table-caption-compact';\n\nexport type SkeletonVariant = 'text' | 'icon' | 'control';\nexport type SkeletonControlAppearance = 'filled' | 'outlined' | 'borderless';\nexport type SkeletonControlContent =\n | 'label'\n | 'icon'\n | 'icon-label'\n | 'label-icon'\n | 'icon-label-icon';\nexport type SkeletonBackground =\n | 'faint'\n | 'medium'\n | 'bold'\n | 'strong'\n | 'translucent'\n | 'inverted'\n | 'media'\n | 'navigation'\n | 'always-dark';\n\n/** @slot - Real text or a control whose footprint is retained with preserveLayout. */\n@Component({\n tag: 'ds-skeleton',\n styleUrl: 'Skeleton.css',\n shadow: true,\n})\nexport class Skeleton {\n @Element() el!: HTMLElement;\n @Prop() variant: SkeletonVariant = 'text';\n /** Text metric recipe whose line-height defines the text canvas. */\n @Prop() textVariant: TextVariant = 'text-body-medium';\n /** Iconography token whose square canvas defines the icon canvas. */\n @Prop() iconSize: IconSize = 'md';\n /** Shared control-density size whose height defines the control canvas. */\n @Prop() controlSize: ControlSize = 'md';\n /** Filled controls replace the entire shape; other appearances retain the frame and mask its contents. */\n @Prop() controlAppearance: SkeletonControlAppearance = 'filled';\n /** Content anatomy for outlined and borderless control placeholders. */\n @Prop() controlContent: SkeletonControlContent = 'label';\n /** Follow the owning table or data toolbar's compact icon-only control presentation. */\n @Prop() collapseLabel: boolean = false;\n /** Width of text and control skeleton canvases. Numbers resolve to px. Ignored for icons. */\n @Prop() width: string | number | undefined;\n /** Round icon skeletons into circles and control skeletons into pills. Ignored for text. */\n @Prop() rounded: boolean = false;\n /** Whether to show the shimmer animation. */\n @Prop() shimmer: boolean = true;\n /** Derive geometry from a projected control or text instead of estimating its footprint. */\n @Prop() preserveLayout: boolean = false;\n /** With preserveLayout, reveal the same projected content when loading completes. */\n @Prop() isLoading: boolean = true;\n /** Actual parent surface context. Omit on primary and secondary surfaces. */\n @Prop() background: SkeletonBackground | undefined;\n\n @State() private captionCompact = false;\n private captionCompactDisconnect: (() => void) | undefined;\n private hasLoaded = false;\n\n componentDidLoad(): void {\n this.hasLoaded = true;\n this.syncCaptionCompactObserver();\n }\n\n connectedCallback(): void {\n if (this.hasLoaded) this.syncCaptionCompactObserver();\n }\n\n disconnectedCallback(): void {\n this.disconnectCaptionCompactObserver();\n }\n\n private disconnectCaptionCompactObserver(): void {\n this.captionCompactDisconnect?.();\n this.captionCompactDisconnect = undefined;\n }\n\n @Watch('collapseLabel')\n syncCaptionCompactObserver(): void {\n this.disconnectCaptionCompactObserver();\n if (!this.collapseLabel) {\n this.captionCompact = false;\n return;\n }\n this.captionCompactDisconnect = observeTableCaptionCompact(this.el, compact => {\n this.captionCompact = compact;\n });\n }\n\n private get widthCss() {\n const v = this.width;\n if (v == null) return undefined;\n return typeof v === 'number' ? `${v}px` : v;\n }\n\n private renderControl() {\n const iconOnly =\n this.controlContent === 'icon' ||\n (this.collapseLabel && this.captionCompact && this.controlContent.includes('icon'));\n const icon = () => (\n <ds-skeleton\n variant=\"icon\"\n iconSize={this.controlSize}\n background={this.background}\n shimmer={this.shimmer}\n />\n );\n return (\n <span\n class={{\n skeleton__control: true,\n 'ds-control-frame': true,\n 'skeleton__control--icon': iconOnly,\n }}\n >\n {(iconOnly || this.controlContent.startsWith('icon-')) && icon()}\n {!iconOnly && (\n <span class=\"skeleton__control-label ds-control-label-box\">\n <ds-skeleton\n textVariant={CONTROL_TEXT_VARIANT[this.controlSize]}\n background={this.background}\n shimmer={this.shimmer}\n />\n </span>\n )}\n {!iconOnly && this.controlContent.endsWith('-icon') && icon()}\n </span>\n );\n }\n\n render() {\n return (\n <Host\n aria-hidden={this.isLoading ? 'true' : undefined}\n class={{\n skeleton: true,\n [`skeleton--${this.variant}`]: true,\n [`skeleton--text-${this.textVariant}`]: this.variant === 'text',\n [`skeleton--icon-${this.iconSize}`]: this.variant === 'icon',\n [`ds-control--${this.controlSize}`]: this.variant === 'control',\n [`skeleton--control-${this.controlAppearance}`]: this.variant === 'control',\n [`skeleton--background-${this.background}`]: !!this.background,\n 'skeleton--rounded': this.variant !== 'text' && this.rounded,\n 'skeleton--preserve-layout': this.preserveLayout,\n 'skeleton--content-ready': this.preserveLayout && !this.isLoading,\n }}\n style={this.variant === 'icon' ? undefined : { width: this.widthCss }}\n >\n {this.preserveLayout && (\n <span class=\"skeleton__source\" inert={this.isLoading}>\n <slot />\n </span>\n )}\n {this.isLoading &&\n (this.variant === 'control' && this.controlAppearance !== 'filled' ? (\n this.renderControl()\n ) : (\n <span\n class={{\n skeleton__shape: true,\n 'ds-shimmer-surface': this.shimmer,\n }}\n />\n ))}\n </Host>\n );\n }\n}\n",
416
435
  "type": "registry:ui"
417
436
  }
418
437
  ]
@@ -7,6 +7,7 @@ export type SkeletonControlContent = 'label' | 'icon' | 'icon-label' | 'label-ic
7
7
  export type SkeletonBackground = 'faint' | 'medium' | 'bold' | 'strong' | 'translucent' | 'inverted' | 'media' | 'navigation' | 'always-dark';
8
8
  /** @slot - Real text or a control whose footprint is retained with preserveLayout. */
9
9
  export declare class Skeleton {
10
+ el: HTMLElement;
10
11
  variant: SkeletonVariant;
11
12
  /** Text metric recipe whose line-height defines the text canvas. */
12
13
  textVariant: TextVariant;
@@ -18,6 +19,8 @@ export declare class Skeleton {
18
19
  controlAppearance: SkeletonControlAppearance;
19
20
  /** Content anatomy for outlined and borderless control placeholders. */
20
21
  controlContent: SkeletonControlContent;
22
+ /** Follow the owning table or data toolbar's compact icon-only control presentation. */
23
+ collapseLabel: boolean;
21
24
  /** Width of text and control skeleton canvases. Numbers resolve to px. Ignored for icons. */
22
25
  width: string | number | undefined;
23
26
  /** Round icon skeletons into circles and control skeletons into pills. Ignored for text. */
@@ -30,6 +33,14 @@ export declare class Skeleton {
30
33
  isLoading: boolean;
31
34
  /** Actual parent surface context. Omit on primary and secondary surfaces. */
32
35
  background: SkeletonBackground | undefined;
36
+ private captionCompact;
37
+ private captionCompactDisconnect;
38
+ private hasLoaded;
39
+ componentDidLoad(): void;
40
+ connectedCallback(): void;
41
+ disconnectedCallback(): void;
42
+ private disconnectCaptionCompactObserver;
43
+ syncCaptionCompactObserver(): void;
33
44
  private get widthCss();
34
45
  private renderControl;
35
46
  render(): any;
@@ -4242,6 +4242,11 @@ export namespace Components {
4242
4242
  * Actual parent surface context. Omit on primary and secondary surfaces.
4243
4243
  */
4244
4244
  "background": SkeletonBackground | undefined;
4245
+ /**
4246
+ * Follow the owning table or data toolbar's compact icon-only control presentation.
4247
+ * @default false
4248
+ */
4249
+ "collapseLabel": boolean;
4245
4250
  /**
4246
4251
  * Filled controls replace the entire shape; other appearances retain the frame and mask its contents.
4247
4252
  * @default 'filled'
@@ -11688,6 +11693,11 @@ declare namespace LocalJSX {
11688
11693
  * Actual parent surface context. Omit on primary and secondary surfaces.
11689
11694
  */
11690
11695
  "background"?: SkeletonBackground | undefined;
11696
+ /**
11697
+ * Follow the owning table or data toolbar's compact icon-only control presentation.
11698
+ * @default false
11699
+ */
11700
+ "collapseLabel"?: boolean;
11691
11701
  /**
11692
11702
  * Filled controls replace the entire shape; other appearances retain the frame and mask its contents.
11693
11703
  * @default 'filled'
@@ -13673,6 +13683,7 @@ declare namespace LocalJSX {
13673
13683
  "controlSize": ControlSize;
13674
13684
  "controlAppearance": SkeletonControlAppearance;
13675
13685
  "controlContent": SkeletonControlContent;
13686
+ "collapseLabel": boolean;
13676
13687
  "width": string;
13677
13688
  "rounded": boolean;
13678
13689
  "shimmer": boolean;
@@ -10,6 +10,7 @@ export const DsSkeleton = /*@__PURE__*/ defineContainer('ds-skeleton', defineDsS
10
10
  'controlSize',
11
11
  'controlAppearance',
12
12
  'controlContent',
13
+ 'collapseLabel',
13
14
  'width',
14
15
  'rounded',
15
16
  'shimmer',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ds-mo/ui",
3
- "version": "15.12.0",
3
+ "version": "15.12.1",
4
4
  "description": "CompoMo — composable web components styled with TokoMo design tokens",
5
5
  "keywords": [
6
6
  "web-components",
@@ -1,2 +0,0 @@
1
- import{p as e,H as s,h as o,a as n,t as r}from"./index.js";import{C as t}from"./p-CuwopElg.js";const i=()=>`:host,:where(.ds-table),:where(.tooltip-popup),:where(.ds-radius){--ds-radius-control:var(--dimension-radius-025);--ds-radius-card:var(--dimension-radius-050);--ds-radius-modal:var(--dimension-radius-050);--ds-radius-menu:var(--dimension-radius-075);--ds-radius-tooltip-control:var(--dimension-radius-025);--ds-radius-tooltip-menu:var(--dimension-radius-075);--ds-radius-table:var(--dimension-radius-050)}.ds-control--lg,:host(.ds-control--lg),:host(.ds-control--md),.ds-control--md,:host(.ds-control--sm),.ds-control--sm,:host(.ds-control--xs),.ds-control--xs{--ds-control-radius:var(--ds-radius-control)}:host(.ds-control--lg),.ds-control--lg{--ds-control-height:var(--dimension-size-500);--ds-control-icon:var(--dimension-iconography-lg);--ds-control-padding-inline:var(--dimension-space-100);--ds-control-label-inset:var(--dimension-space-050);--ds-control-gap:var(--dimension-space-050)}:host(.ds-control--md),.ds-control--md{--ds-control-height:var(--dimension-size-400);--ds-control-icon:var(--dimension-iconography-md);--ds-control-padding-inline:var(--dimension-space-075);--ds-control-label-inset:var(--dimension-space-025);--ds-control-gap:var(--dimension-space-050)}:host(.ds-control--sm),.ds-control--sm{--ds-control-height:var(--dimension-size-300);--ds-control-icon:var(--dimension-iconography-sm);--ds-control-padding-inline:var(--dimension-space-050);--ds-control-label-inset:var(--dimension-space-025);--ds-control-gap:var(--dimension-space-025)}:host(.ds-control--xs),.ds-control--xs{--ds-control-height:var(--dimension-size-200);--ds-control-icon:var(--dimension-iconography-xs);--ds-control-padding-inline:var(--dimension-space-025);--ds-control-label-inset:var(--dimension-space-025);--ds-control-gap:0}.ds-control-frame{display:inline-flex;align-items:center;box-sizing:border-box;height:var(--ds-control-height, var(--dimension-size-400));padding-inline:var(--ds-control-padding-inline, var(--dimension-space-075));gap:var(--ds-control-gap, var(--dimension-space-050));border-radius:var(--ds-control-radius, var(--dimension-radius-025))}.ds-control-section-heading{display:flex;align-items:center;box-sizing:border-box;height:var(--ds-control-height, var(--dimension-size-400));padding-inline:calc( var(--ds-control-padding-inline, var(--dimension-space-075)) + var(--ds-control-label-inset, var(--dimension-space-025)) )}.ds-control-icon-box{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;width:var(--ds-control-icon, var(--dimension-iconography-md));height:var(--ds-control-icon, var(--dimension-iconography-md))}.ds-control-label-box{min-width:0;padding-inline:var(--ds-control-label-inset, var(--dimension-space-025))}.ds-control-label-dot{position:relative;padding-inline-end:calc( var(--ds-control-label-inset, var(--dimension-space-025)) + var(--ds-control-gap, var(--dimension-space-050)) )}.ds-control-label-dot__badge{position:absolute;inset-block-start:0;inset-inline-end:0;pointer-events:none}@media (forced-colors: active){:root,:host,.ds-forced-colors-scope{--ds-forced-color-surface:Canvas;--ds-forced-color-content:CanvasText;--ds-forced-color-control-boundary:ButtonText;--ds-forced-color-selected:Highlight;--ds-forced-color-on-selected:HighlightText;--ds-forced-color-disabled:GrayText}}@keyframes ds-shimmer-text-motion{0%{background-position:100% 0}76.923%{background-position:0 0}100%{background-position:0 0}}@keyframes ds-shimmer-surface-motion{0%{background-position:100% 0}76.923%{background-position:0 0}100%{background-position:0 0}}.ds-shimmer-text{--ds-shimmer-base:currentColor;--ds-shimmer-duration:var(--effect-animation-duration-long-2);--ds-shimmer-repeat-delay:var(--effect-animation-delay-short-3);--ds-shimmer-cycle-duration:calc(var(--ds-shimmer-duration) + var(--ds-shimmer-repeat-delay));--ds-shimmer-easing:var(--effect-animation-easing-linear);--ds-shimmer-spread:var(--dimension-size-500);--ds-shimmer-travel:calc( var(--dimension-size-800) + var(--dimension-size-500) + var(--dimension-size-200) );background-color:var(--ds-shimmer-base);background-image:linear-gradient( 330deg, transparent calc(50% - var(--ds-shimmer-spread)), var(--ds-shimmer, var(--color-shimmer-shimmer)) 50%, transparent calc(50% + var(--ds-shimmer-spread)) );background-repeat:no-repeat;background-position:100% 0;background-size:calc(200% + var(--ds-shimmer-spread) * 2 + var(--ds-shimmer-travel) * 2) 100%;background-clip:text;-webkit-background-clip:text;-webkit-text-fill-color:transparent;animation:ds-shimmer-text-motion var(--ds-shimmer-cycle-duration) var(--ds-shimmer-easing) infinite}.ds-shimmer-surface{--ds-shimmer-surface-base:var(--color-foreground-quaternary);--ds-shimmer-duration:var(--effect-animation-duration-long-2);--ds-shimmer-repeat-delay:var(--effect-animation-delay-short-3);--ds-shimmer-cycle-duration:calc(var(--ds-shimmer-duration) + var(--ds-shimmer-repeat-delay));--ds-shimmer-easing:var(--effect-animation-easing-linear);--ds-shimmer-spread:var(--dimension-size-500);--ds-shimmer-travel:calc( var(--dimension-size-800) + var(--dimension-size-500) + var(--dimension-size-200) );position:relative;overflow:hidden;background-color:var(--ds-shimmer-surface-base)}.ds-shimmer-surface::after{content:'';position:absolute;inset:0;pointer-events:none;background:linear-gradient( 330deg, transparent calc(50% - var(--ds-shimmer-spread)), var(--ds-shimmer, var(--color-shimmer-shimmer)) 50%, transparent calc(50% + var(--ds-shimmer-spread)) );background-repeat:no-repeat;background-position:100% 0;background-size:calc(200% + var(--ds-shimmer-spread) * 2 + var(--ds-shimmer-travel) * 2) 100%;animation:ds-shimmer-surface-motion var(--ds-shimmer-cycle-duration) var(--ds-shimmer-easing) infinite}@media (prefers-reduced-motion: reduce){.ds-shimmer-text{animation:none;background-image:none;-webkit-text-fill-color:currentColor}.ds-shimmer-surface::after{display:none;animation:none}}@media (forced-colors: active){.ds-shimmer-text{animation:none;background-image:none;-webkit-text-fill-color:currentColor}.ds-shimmer-surface{background-color:var(--ds-forced-color-disabled)}.ds-shimmer-surface::after{display:none;animation:none}}:host{display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;min-width:0;vertical-align:middle;--ds-skeleton-base:var(--color-foreground-quaternary);--ds-shimmer:var(--color-shimmer-shimmer);--ds-skeleton-border:var(--color-border-secondary)}.skeleton__shape{--ds-shimmer-surface-base:var(--ds-skeleton-base);display:block;width:100%;height:100%;flex:0 0 auto;background-color:var(--ds-skeleton-base);border-radius:var(--dimension-radius-025)}:host(.skeleton--background-medium){--ds-skeleton-border:var(--color-border-on-medium-background-secondary);--ds-skeleton-base:var(--color-foreground-on-medium-background-quaternary);--ds-shimmer:var(--color-shimmer-shimmer-on-medium-background)}:host(.skeleton--background-bold){--ds-skeleton-border:var(--color-border-on-bold-background-secondary);--ds-skeleton-base:var(--color-foreground-on-bold-background-quaternary);--ds-shimmer:var(--color-shimmer-shimmer-on-bold-background)}:host(.skeleton--background-strong){--ds-skeleton-border:var(--color-border-on-strong-background-secondary);--ds-skeleton-base:var(--color-foreground-on-strong-background-quaternary);--ds-shimmer:var(--color-shimmer-shimmer-on-strong-background)}:host(.skeleton--background-translucent){--ds-skeleton-border:var(--color-translucent-border-secondary);--ds-skeleton-base:var(--color-translucent-foreground-quaternary);--ds-shimmer:var(--color-translucent-shimmer)}:host(.skeleton--background-inverted){--ds-skeleton-border:var(--color-inverted-border-secondary);--ds-skeleton-base:var(--color-inverted-foreground-quaternary);--ds-shimmer:var(--color-inverted-shimmer)}:host(.skeleton--background-media){--ds-skeleton-border:var(--color-media-border-secondary);--ds-skeleton-base:var(--color-media-foreground-quaternary);--ds-shimmer:var(--color-media-shimmer)}:host(.skeleton--background-always-dark){--ds-skeleton-border:var(--color-always-dark-border-secondary);--ds-skeleton-base:var(--color-always-dark-foreground-quaternary);--ds-shimmer:var(--color-always-dark-shimmer)}:host(.skeleton--background-navigation){--ds-skeleton-base:var(--color-navigation-foreground-quaternary);--ds-shimmer:var(--color-navigation-shimmer)}:host(.skeleton--text){width:100%;height:var(--ds-skeleton-canvas-size);padding-block:0}:host(.skeleton--text) .skeleton__shape{height:75%}:host(.skeleton--text-text-display-medium){--ds-skeleton-canvas-size:var(--typography-lineheight-3xl)}:host(.skeleton--text-text-display-small){--ds-skeleton-canvas-size:var(--typography-lineheight-2xl)}:host(.skeleton--text-text-title-large){--ds-skeleton-canvas-size:var(--typography-lineheight-xl)}:host(.skeleton--text-text-title-medium),:host(.skeleton--text-text-body-large){--ds-skeleton-canvas-size:var(--typography-lineheight-lg)}:host(.skeleton--text-text-title-small),:host(.skeleton--text-text-body-medium){--ds-skeleton-canvas-size:var(--typography-lineheight-md)}:host(.skeleton--text-text-body-small){--ds-skeleton-canvas-size:var(--typography-lineheight-sm)}:host(.skeleton--text-text-caption){--ds-skeleton-canvas-size:var(--typography-lineheight-xs)}:host(.skeleton--icon){width:var(--ds-skeleton-canvas-size);height:var(--ds-skeleton-canvas-size);padding:0}:host(.skeleton--icon) .skeleton__shape{width:75%;height:75%}:host(.skeleton--icon.skeleton--rounded) .skeleton__shape{border-radius:var(--dimension-radius-half)}:host(.skeleton--icon-xs){--ds-skeleton-canvas-size:var(--dimension-iconography-xs)}:host(.skeleton--icon-sm){--ds-skeleton-canvas-size:var(--dimension-iconography-sm)}:host(.skeleton--icon-md){--ds-skeleton-canvas-size:var(--dimension-iconography-md)}:host(.skeleton--icon-lg){--ds-skeleton-canvas-size:var(--dimension-iconography-lg)}:host(.skeleton--icon-xl){--ds-skeleton-canvas-size:var(--dimension-iconography-xl)}:host(.skeleton--icon-2xl){--ds-skeleton-canvas-size:var(--dimension-iconography-2xl)}:host(.skeleton--icon-3xl){--ds-skeleton-canvas-size:var(--dimension-iconography-3xl)}:host(.skeleton--control){width:100%;height:var(--ds-control-height)}:host(.skeleton--control) .skeleton__shape{border-radius:var(--ds-control-radius, var(--dimension-radius-025))}:host(.skeleton--control.skeleton--rounded) .skeleton__shape{border-radius:var(--dimension-radius-half)}.skeleton__control{width:100%;height:100%;min-width:0}.skeleton__control--icon{justify-content:center;padding:0}.skeleton__control-label{display:flex;flex:1 1 auto;align-items:center;overflow:hidden}:host(.skeleton--control-outlined) .skeleton__control{box-shadow:inset 0 0 0 var(--dimension-stroke-width-012) var(--ds-skeleton-border)}:host(.skeleton--rounded) .skeleton__control{border-radius:var(--dimension-radius-half)}@media (forced-colors: active){.skeleton__shape{background-color:var(--ds-forced-color-disabled)}:host(.skeleton--control-outlined) .skeleton__control{outline:var(--dimension-stroke-width-012) solid var(--ds-forced-color-disabled);outline-offset:calc(-1 * var(--dimension-stroke-width-012))}}:host(.skeleton--preserve-layout){display:grid;width:auto;height:auto;align-items:stretch;justify-content:stretch;padding:0}:host(.skeleton--preserve-layout) .skeleton__source,:host(.skeleton--preserve-layout) .skeleton__control,:host(.skeleton--preserve-layout) .skeleton__shape{grid-area:1 / 1;min-width:0}.skeleton__source{display:grid;visibility:hidden}:host(.skeleton--preserve-layout) .skeleton__shape{height:100%;width:100%}:host(.skeleton--preserve-layout.skeleton--text) .skeleton__shape{mask-image:repeating-linear-gradient( to bottom, transparent 0, transparent calc(var(--ds-skeleton-canvas-size) * 0.125), currentColor calc(var(--ds-skeleton-canvas-size) * 0.125), currentColor calc(var(--ds-skeleton-canvas-size) * 0.875), transparent calc(var(--ds-skeleton-canvas-size) * 0.875), transparent var(--ds-skeleton-canvas-size) )}:host(.skeleton--content-ready) .skeleton__source{visibility:inherit}`;const a=e(class e extends s{constructor(e){super();if(e!==false){this.__registerHost()}this.__attachShadow();this.variant="text";this.textVariant="text-body-medium";this.iconSize="md";this.controlSize="md";this.controlAppearance="filled";this.controlContent="label";this.rounded=false;this.shimmer=true;this.preserveLayout=false;this.isLoading=true}get widthCss(){const e=this.width;if(e==null)return undefined;return typeof e==="number"?`${e}px`:e}renderControl(){const e=this.controlContent==="icon";const s=()=>o("ds-skeleton",{variant:"icon",iconSize:this.controlSize,background:this.background,shimmer:this.shimmer});return o("span",{class:{skeleton__control:true,"ds-control-frame":true,"skeleton__control--icon":e}},(e||this.controlContent.startsWith("icon-"))&&s(),!e&&o("span",{class:"skeleton__control-label ds-control-label-box"},o("ds-skeleton",{textVariant:t[this.controlSize],background:this.background,shimmer:this.shimmer})),!e&&this.controlContent.endsWith("-icon")&&s())}render(){return o(n,{key:"8ed53946b3ecdfc8c323813f982ceac53a448e69","aria-hidden":this.isLoading?"true":undefined,class:{skeleton:true,[`skeleton--${this.variant}`]:true,[`skeleton--text-${this.textVariant}`]:this.variant==="text",[`skeleton--icon-${this.iconSize}`]:this.variant==="icon",[`ds-control--${this.controlSize}`]:this.variant==="control",[`skeleton--control-${this.controlAppearance}`]:this.variant==="control",[`skeleton--background-${this.background}`]:!!this.background,"skeleton--rounded":this.variant!=="text"&&this.rounded,"skeleton--preserve-layout":this.preserveLayout,"skeleton--content-ready":this.preserveLayout&&!this.isLoading},style:this.variant==="icon"?undefined:{width:this.widthCss}},this.preserveLayout&&o("span",{key:"c9ee5633891973d1ccab69743c736d5d797961a9",class:"skeleton__source",inert:this.isLoading},o("slot",{key:"f154cb92e186c013835894b86cc19dc77b49fe97"})),this.isLoading&&(this.variant==="control"&&this.controlAppearance!=="filled"?this.renderControl():o("span",{class:{skeleton__shape:true,"ds-shimmer-surface":this.shimmer}})))}static get style(){return i()}},[257,"ds-skeleton",{variant:[1],textVariant:[1,"text-variant"],iconSize:[1,"icon-size"],controlSize:[1,"control-size"],controlAppearance:[1,"control-appearance"],controlContent:[1,"control-content"],width:[8],rounded:[4],shimmer:[4],preserveLayout:[4,"preserve-layout"],isLoading:[4,"is-loading"],background:[1]}]);function d(){if(typeof customElements==="undefined"){return}const e=["ds-skeleton","ds-skeleton"];e.forEach((e=>{switch(e){case"ds-skeleton":if(!customElements.get(r(e))){customElements.define(r(e),a)}break;case"ds-skeleton":if(!customElements.get(r(e))){d()}break}}))}d();export{a as S,d};
2
- //# sourceMappingURL=p-BoFK9lmP.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["skeletonCss","Skeleton","__stencil_proxyCustomElement","HTMLElement","constructor","registerHost","this","variant","textVariant","iconSize","controlSize","controlAppearance","controlContent","rounded","shimmer","preserveLayout","isLoading","widthCss","v","width","undefined","renderControl","iconOnly","icon","h","background","class","skeleton__control","startsWith","CONTROL_TEXT_VARIANT","endsWith","render","Host","key","skeleton","style","inert","skeleton__shape"],"sources":["src/wc/components/Skeleton/Skeleton.css?tag=ds-skeleton&encapsulation=shadow","src/wc/components/Skeleton/Skeleton.tsx"],"sourcesContent":["@import '../../utils/radius.css';\n@import '../../utils/control-density.css';\n@import '../../utils/control-parts.css';\n@import '../../utils/shimmer.css';\n\n:host {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n min-width: 0;\n vertical-align: middle;\n --ds-skeleton-base: var(--color-foreground-quaternary);\n --ds-shimmer: var(--color-shimmer-shimmer);\n --ds-skeleton-border: var(--color-border-secondary);\n}\n\n.skeleton__shape {\n --ds-shimmer-surface-base: var(--ds-skeleton-base);\n\n display: block;\n width: 100%;\n height: 100%;\n flex: 0 0 auto;\n background-color: var(--ds-skeleton-base);\n border-radius: var(--dimension-radius-025);\n}\n\n/* ── Background context ────────────────────────────────────────────────── */\n\n:host(.skeleton--background-medium) {\n --ds-skeleton-border: var(--color-border-on-medium-background-secondary);\n --ds-skeleton-base: var(--color-foreground-on-medium-background-quaternary);\n --ds-shimmer: var(--color-shimmer-shimmer-on-medium-background);\n}\n\n:host(.skeleton--background-bold) {\n --ds-skeleton-border: var(--color-border-on-bold-background-secondary);\n --ds-skeleton-base: var(--color-foreground-on-bold-background-quaternary);\n --ds-shimmer: var(--color-shimmer-shimmer-on-bold-background);\n}\n\n:host(.skeleton--background-strong) {\n --ds-skeleton-border: var(--color-border-on-strong-background-secondary);\n --ds-skeleton-base: var(--color-foreground-on-strong-background-quaternary);\n --ds-shimmer: var(--color-shimmer-shimmer-on-strong-background);\n}\n\n:host(.skeleton--background-translucent) {\n --ds-skeleton-border: var(--color-translucent-border-secondary);\n --ds-skeleton-base: var(--color-translucent-foreground-quaternary);\n --ds-shimmer: var(--color-translucent-shimmer);\n}\n\n:host(.skeleton--background-inverted) {\n --ds-skeleton-border: var(--color-inverted-border-secondary);\n --ds-skeleton-base: var(--color-inverted-foreground-quaternary);\n --ds-shimmer: var(--color-inverted-shimmer);\n}\n\n:host(.skeleton--background-media) {\n --ds-skeleton-border: var(--color-media-border-secondary);\n --ds-skeleton-base: var(--color-media-foreground-quaternary);\n --ds-shimmer: var(--color-media-shimmer);\n}\n\n:host(.skeleton--background-always-dark) {\n --ds-skeleton-border: var(--color-always-dark-border-secondary);\n --ds-skeleton-base: var(--color-always-dark-foreground-quaternary);\n --ds-shimmer: var(--color-always-dark-shimmer);\n}\n\n:host(.skeleton--background-navigation) {\n --ds-skeleton-base: var(--color-navigation-foreground-quaternary);\n --ds-shimmer: var(--color-navigation-shimmer);\n}\n\n/* ── Text ──────────────────────────────────────────────────────────────── */\n\n:host(.skeleton--text) {\n width: 100%;\n height: var(--ds-skeleton-canvas-size);\n padding-block: 0;\n}\n\n:host(.skeleton--text) .skeleton__shape {\n height: 75%;\n}\n\n:host(.skeleton--text-text-display-medium) {\n --ds-skeleton-canvas-size: var(--typography-lineheight-3xl);\n}\n:host(.skeleton--text-text-display-small) {\n --ds-skeleton-canvas-size: var(--typography-lineheight-2xl);\n}\n:host(.skeleton--text-text-title-large) {\n --ds-skeleton-canvas-size: var(--typography-lineheight-xl);\n}\n:host(.skeleton--text-text-title-medium),\n:host(.skeleton--text-text-body-large) {\n --ds-skeleton-canvas-size: var(--typography-lineheight-lg);\n}\n:host(.skeleton--text-text-title-small),\n:host(.skeleton--text-text-body-medium) {\n --ds-skeleton-canvas-size: var(--typography-lineheight-md);\n}\n:host(.skeleton--text-text-body-small) {\n --ds-skeleton-canvas-size: var(--typography-lineheight-sm);\n}\n:host(.skeleton--text-text-caption) {\n --ds-skeleton-canvas-size: var(--typography-lineheight-xs);\n}\n\n/* ── Icon ──────────────────────────────────────────────────────────────── */\n\n:host(.skeleton--icon) {\n width: var(--ds-skeleton-canvas-size);\n height: var(--ds-skeleton-canvas-size);\n padding: 0;\n}\n\n:host(.skeleton--icon) .skeleton__shape {\n width: 75%;\n height: 75%;\n}\n\n:host(.skeleton--icon.skeleton--rounded) .skeleton__shape {\n border-radius: var(--dimension-radius-half);\n}\n\n:host(.skeleton--icon-xs) {\n --ds-skeleton-canvas-size: var(--dimension-iconography-xs);\n}\n:host(.skeleton--icon-sm) {\n --ds-skeleton-canvas-size: var(--dimension-iconography-sm);\n}\n:host(.skeleton--icon-md) {\n --ds-skeleton-canvas-size: var(--dimension-iconography-md);\n}\n:host(.skeleton--icon-lg) {\n --ds-skeleton-canvas-size: var(--dimension-iconography-lg);\n}\n:host(.skeleton--icon-xl) {\n --ds-skeleton-canvas-size: var(--dimension-iconography-xl);\n}\n:host(.skeleton--icon-2xl) {\n --ds-skeleton-canvas-size: var(--dimension-iconography-2xl);\n}\n:host(.skeleton--icon-3xl) {\n --ds-skeleton-canvas-size: var(--dimension-iconography-3xl);\n}\n\n/* ── Control ───────────────────────────────────────────────────────────── */\n\n:host(.skeleton--control) {\n width: 100%;\n height: var(--ds-control-height);\n}\n\n:host(.skeleton--control) .skeleton__shape {\n border-radius: var(--ds-control-radius, var(--dimension-radius-025));\n}\n\n:host(.skeleton--control.skeleton--rounded) .skeleton__shape {\n border-radius: var(--dimension-radius-half);\n}\n\n.skeleton__control {\n width: 100%;\n height: 100%;\n min-width: 0;\n}\n\n.skeleton__control--icon {\n justify-content: center;\n padding: 0;\n}\n\n.skeleton__control-label {\n display: flex;\n flex: 1 1 auto;\n align-items: center;\n overflow: hidden;\n}\n\n:host(.skeleton--control-outlined) .skeleton__control {\n box-shadow: inset 0 0 0 var(--dimension-stroke-width-012) var(--ds-skeleton-border);\n}\n\n:host(.skeleton--rounded) .skeleton__control {\n border-radius: var(--dimension-radius-half);\n}\n\n@media (forced-colors: active) {\n .skeleton__shape {\n background-color: var(--ds-forced-color-disabled);\n }\n :host(.skeleton--control-outlined) .skeleton__control {\n outline: var(--dimension-stroke-width-012) solid var(--ds-forced-color-disabled);\n outline-offset: calc(-1 * var(--dimension-stroke-width-012));\n }\n}\n\n/* Projected content supplies its intrinsic size, wrapping and responsive metrics. */\n:host(.skeleton--preserve-layout) {\n display: grid;\n width: auto;\n height: auto;\n align-items: stretch;\n justify-content: stretch;\n padding: 0;\n}\n\n:host(.skeleton--preserve-layout) .skeleton__source,\n:host(.skeleton--preserve-layout) .skeleton__control,\n:host(.skeleton--preserve-layout) .skeleton__shape {\n grid-area: 1 / 1;\n min-width: 0;\n}\n\n.skeleton__source {\n display: grid;\n visibility: hidden;\n}\n\n:host(.skeleton--preserve-layout) .skeleton__shape {\n height: 100%;\n width: 100%;\n}\n\n:host(.skeleton--preserve-layout.skeleton--text) .skeleton__shape {\n /* Alpha mask only: each retained line uses the atomic text skeleton's inset. */\n mask-image: repeating-linear-gradient(\n to bottom,\n transparent 0,\n transparent calc(var(--ds-skeleton-canvas-size) * 0.125),\n currentColor calc(var(--ds-skeleton-canvas-size) * 0.125),\n currentColor calc(var(--ds-skeleton-canvas-size) * 0.875),\n transparent calc(var(--ds-skeleton-canvas-size) * 0.875),\n transparent var(--ds-skeleton-canvas-size)\n );\n}\n\n:host(.skeleton--content-ready) .skeleton__source {\n visibility: inherit;\n}\n","import { Component, Prop, h, Host } from '@stencil/core';\nimport type { IconSize } from '../Icon/Icon';\nimport type { TextVariant } from '../Text/text-types';\nimport { CONTROL_TEXT_VARIANT, type ControlSize } from '../../utils/control-text';\n\nexport type SkeletonVariant = 'text' | 'icon' | 'control';\nexport type SkeletonControlAppearance = 'filled' | 'outlined' | 'borderless';\nexport type SkeletonControlContent =\n | 'label'\n | 'icon'\n | 'icon-label'\n | 'label-icon'\n | 'icon-label-icon';\nexport type SkeletonBackground =\n | 'faint'\n | 'medium'\n | 'bold'\n | 'strong'\n | 'translucent'\n | 'inverted'\n | 'media'\n | 'navigation'\n | 'always-dark';\n\n/** @slot - Real text or a control whose footprint is retained with preserveLayout. */\n@Component({\n tag: 'ds-skeleton',\n styleUrl: 'Skeleton.css',\n shadow: true,\n})\nexport class Skeleton {\n @Prop() variant: SkeletonVariant = 'text';\n /** Text metric recipe whose line-height defines the text canvas. */\n @Prop() textVariant: TextVariant = 'text-body-medium';\n /** Iconography token whose square canvas defines the icon canvas. */\n @Prop() iconSize: IconSize = 'md';\n /** Shared control-density size whose height defines the control canvas. */\n @Prop() controlSize: ControlSize = 'md';\n /** Filled controls replace the entire shape; other appearances retain the frame and mask its contents. */\n @Prop() controlAppearance: SkeletonControlAppearance = 'filled';\n /** Content anatomy for outlined and borderless control placeholders. */\n @Prop() controlContent: SkeletonControlContent = 'label';\n /** Width of text and control skeleton canvases. Numbers resolve to px. Ignored for icons. */\n @Prop() width: string | number | undefined;\n /** Round icon skeletons into circles and control skeletons into pills. Ignored for text. */\n @Prop() rounded: boolean = false;\n /** Whether to show the shimmer animation. */\n @Prop() shimmer: boolean = true;\n /** Derive geometry from a projected control or text instead of estimating its footprint. */\n @Prop() preserveLayout: boolean = false;\n /** With preserveLayout, reveal the same projected content when loading completes. */\n @Prop() isLoading: boolean = true;\n /** Actual parent surface context. Omit on primary and secondary surfaces. */\n @Prop() background: SkeletonBackground | undefined;\n\n private get widthCss() {\n const v = this.width;\n if (v == null) return undefined;\n return typeof v === 'number' ? `${v}px` : v;\n }\n\n private renderControl() {\n const iconOnly = this.controlContent === 'icon';\n const icon = () => (\n <ds-skeleton\n variant=\"icon\"\n iconSize={this.controlSize}\n background={this.background}\n shimmer={this.shimmer}\n />\n );\n return (\n <span\n class={{\n skeleton__control: true,\n 'ds-control-frame': true,\n 'skeleton__control--icon': iconOnly,\n }}\n >\n {(iconOnly || this.controlContent.startsWith('icon-')) && icon()}\n {!iconOnly && (\n <span class=\"skeleton__control-label ds-control-label-box\">\n <ds-skeleton\n textVariant={CONTROL_TEXT_VARIANT[this.controlSize]}\n background={this.background}\n shimmer={this.shimmer}\n />\n </span>\n )}\n {!iconOnly && this.controlContent.endsWith('-icon') && icon()}\n </span>\n );\n }\n\n render() {\n return (\n <Host\n aria-hidden={this.isLoading ? 'true' : undefined}\n class={{\n skeleton: true,\n [`skeleton--${this.variant}`]: true,\n [`skeleton--text-${this.textVariant}`]: this.variant === 'text',\n [`skeleton--icon-${this.iconSize}`]: this.variant === 'icon',\n [`ds-control--${this.controlSize}`]: this.variant === 'control',\n [`skeleton--control-${this.controlAppearance}`]: this.variant === 'control',\n [`skeleton--background-${this.background}`]: !!this.background,\n 'skeleton--rounded': this.variant !== 'text' && this.rounded,\n 'skeleton--preserve-layout': this.preserveLayout,\n 'skeleton--content-ready': this.preserveLayout && !this.isLoading,\n }}\n style={this.variant === 'icon' ? undefined : { width: this.widthCss }}\n >\n {this.preserveLayout && (\n <span class=\"skeleton__source\" inert={this.isLoading}>\n <slot />\n </span>\n )}\n {this.isLoading &&\n (this.variant === 'control' && this.controlAppearance !== 'filled' ? (\n this.renderControl()\n ) : (\n <span\n class={{\n skeleton__shape: true,\n 'ds-shimmer-surface': this.shimmer,\n }}\n />\n ))}\n </Host>\n );\n }\n}\n"],"mappings":"+FAAA,MAAMA,EAAc,IAAM,+zX,MC8BbC,EAAQC,EAAA,MAAAD,UAAAE,EALrB,WAAAC,CAAAC,G,kEAMUC,KAAAC,QAA2B,OAE3BD,KAAAE,YAA2B,mBAE3BF,KAAAG,SAAqB,KAErBH,KAAAI,YAA2B,KAE3BJ,KAAAK,kBAA+C,SAE/CL,KAAAM,eAAyC,QAIzCN,KAAAO,QAAmB,MAEnBP,KAAAQ,QAAmB,KAEnBR,KAAAS,eAA0B,MAE1BT,KAAAU,UAAqB,IAgF9B,CA5EC,YAAYC,GACV,MAAMC,EAAIZ,KAAKa,MACf,GAAID,GAAK,KAAM,OAAOE,UACtB,cAAcF,IAAM,SAAW,GAAGA,MAAQA,C,CAGpC,aAAAG,GACN,MAAMC,EAAWhB,KAAKM,iBAAmB,OACzC,MAAMW,EAAO,IACXC,EAAA,eACEjB,QAAQ,OACRE,SAAUH,KAAKI,YACfe,WAAYnB,KAAKmB,WACjBX,QAASR,KAAKQ,UAGlB,OACEU,EAAA,QACEE,MAAO,CACLC,kBAAmB,KACnB,mBAAoB,KACpB,0BAA2BL,KAG3BA,GAAYhB,KAAKM,eAAegB,WAAW,WAAaL,KACxDD,GACAE,EAAA,QAAME,MAAM,gDACVF,EAAA,eACEhB,YAAaqB,EAAqBvB,KAAKI,aACvCe,WAAYnB,KAAKmB,WACjBX,QAASR,KAAKQ,YAIlBQ,GAAYhB,KAAKM,eAAekB,SAAS,UAAYP,I,CAK7D,MAAAQ,GACE,OACEP,EAACQ,EAAI,CAAAC,IAAA,yDACU3B,KAAKU,UAAY,OAASI,UACvCM,MAAO,CACLQ,SAAU,KACV,CAAC,aAAa5B,KAAKC,WAAY,KAC/B,CAAC,kBAAkBD,KAAKE,eAAgBF,KAAKC,UAAY,OACzD,CAAC,kBAAkBD,KAAKG,YAAaH,KAAKC,UAAY,OACtD,CAAC,eAAeD,KAAKI,eAAgBJ,KAAKC,UAAY,UACtD,CAAC,qBAAqBD,KAAKK,qBAAsBL,KAAKC,UAAY,UAClE,CAAC,wBAAwBD,KAAKmB,gBAAiBnB,KAAKmB,WACpD,oBAAqBnB,KAAKC,UAAY,QAAUD,KAAKO,QACrD,4BAA6BP,KAAKS,eAClC,0BAA2BT,KAAKS,iBAAmBT,KAAKU,WAE1DmB,MAAO7B,KAAKC,UAAY,OAASa,UAAY,CAAED,MAAOb,KAAKW,WAE1DX,KAAKS,gBACJS,EAAA,QAAAS,IAAA,2CAAMP,MAAM,mBAAmBU,MAAO9B,KAAKU,WACzCQ,EAAA,QAAAS,IAAA,8CAGH3B,KAAKU,YACHV,KAAKC,UAAY,WAAaD,KAAKK,oBAAsB,SACxDL,KAAKe,gBAELG,EAAA,QACEE,MAAO,CACLW,gBAAiB,KACjB,qBAAsB/B,KAAKQ,Y","ignoreList":[]}
@@ -1,2 +0,0 @@
1
- import{p as e,H as s,h as i,a as t,t as d}from"./index.js";import{d as n}from"./p-BoFK9lmP.js";import{d as o}from"./p-DMPn_dt7.js";const l=()=>`.text-field-support.sc-ds-field{display:flex;align-items:baseline;gap:var(--dimension-space-100);width:100%}.text-field-support.sc-ds-field>.sc-ds-field:first-child:not(.text-field-count){flex:1;min-width:0}.text-field-count.sc-ds-field{flex:none;white-space:nowrap}.ds-control--lg.sc-ds-field,.ds-control--lg.sc-ds-field-h,.ds-control--md.sc-ds-field-h,.ds-control--md.sc-ds-field,.ds-control--sm.sc-ds-field-h,.ds-control--sm.sc-ds-field,.ds-control--xs.sc-ds-field-h,.ds-control--xs.sc-ds-field{--ds-control-radius:var(--ds-radius-control)}.ds-control--lg.sc-ds-field-h,.ds-control--lg.sc-ds-field{--ds-control-height:var(--dimension-size-500);--ds-control-icon:var(--dimension-iconography-lg);--ds-control-padding-inline:var(--dimension-space-100);--ds-control-label-inset:var(--dimension-space-050);--ds-control-gap:var(--dimension-space-050)}.ds-control--md.sc-ds-field-h,.ds-control--md.sc-ds-field{--ds-control-height:var(--dimension-size-400);--ds-control-icon:var(--dimension-iconography-md);--ds-control-padding-inline:var(--dimension-space-075);--ds-control-label-inset:var(--dimension-space-025);--ds-control-gap:var(--dimension-space-050)}.ds-control--sm.sc-ds-field-h,.ds-control--sm.sc-ds-field{--ds-control-height:var(--dimension-size-300);--ds-control-icon:var(--dimension-iconography-sm);--ds-control-padding-inline:var(--dimension-space-050);--ds-control-label-inset:var(--dimension-space-025);--ds-control-gap:var(--dimension-space-025)}.ds-control--xs.sc-ds-field-h,.ds-control--xs.sc-ds-field{--ds-control-height:var(--dimension-size-200);--ds-control-icon:var(--dimension-iconography-xs);--ds-control-padding-inline:var(--dimension-space-025);--ds-control-label-inset:var(--dimension-space-025);--ds-control-gap:0}.ds-field-stack.sc-ds-field-h,.ds-field-stack.sc-ds-field{display:flex;flex-direction:column;gap:var(--dimension-space-050)}.ds-field-stack.ds-field-stack--supporting-inset.sc-ds-field-h .error-text.sc-ds-field,.ds-field-stack.ds-field-stack--supporting-inset.sc-ds-field .error-text.sc-ds-field,.ds-field-stack.ds-field-stack--supporting-inset.sc-ds-field .field__description.sc-ds-field,.ds-field-stack.ds-field-stack--supporting-inset.sc-ds-field .field__error.sc-ds-field{padding-inline:calc( var(--ds-control-padding-inline, var(--dimension-space-075)) + var(--ds-control-label-inset, var(--dimension-space-025)) )}.sc-ds-field-h{display:block}.field__control.sc-ds-field{position:relative;display:flex;min-width:0}.field__control.sc-ds-field>*.sc-ds-field{width:100%}.field__label.sc-ds-field,.field__description.sc-ds-field,.field__error.sc-ds-field,.text-field-count.sc-ds-field{position:relative}.field__copy-source--loading.sc-ds-field,.field--loading.sc-ds-field-h .field__control.sc-ds-field>.sc-ds-field:not(slot):not(.field__control-skeleton){visibility:hidden}.field__copy-skeleton.sc-ds-field{position:absolute;inset-inline-start:0;inset-block-start:0;max-inline-size:100%}.field__label.sc-ds-field .field__copy-skeleton.sc-ds-field{inline-size:min(100%, calc(var(--dimension-size-800) * 2))}.field__control-skeleton.sc-ds-field{position:absolute;inset:0;inline-size:100%;block-size:100%}`;let r=0;const a=e=>e?.split(/\s+/).filter(Boolean)??[];const c=(...e)=>[...new Set(e.flat())];const h=["lg","md","sm","xs"];const f=e=>h.includes(e.size)?e.size:"md";const u=e(class e extends s{constructor(e){super();if(e!==false){this.__registerHost()}this.error=false;this.isLoading=false;this.constraintMessage="";this.focused=false;this.filled=false;this.dirty=false;this.touched=false;this.controlDisabled=false;this.controlRequired=false;this.controlBorderless=false;this.controlSize="md";this.slotRevision=0;this.generatedId=`ds-field-${++r}`;this.initialValue="";this.authoredAria=new WeakMap;this.didLoad=false;this.syncControl=()=>{const e=this.findControl();if(!e)return;if(e!==this.control){this.control=e;this.initialValue=this.readValue(e);this.authoredAria.set(e,{labelledby:a(e.getAttribute("aria-labelledby")),describedby:a(e.getAttribute("aria-describedby"))});this.observeControlAttributes(e)}this.constraintMessage=e.getAttribute("data-constraint-message")??"";this.characterCount=e.getAttribute("data-character-count")??undefined;this.characterLimit=e.getAttribute("data-character-limit")??undefined;const s=e.tagName.startsWith("DS-");if(s&&"inputId"in e)e.inputId=this.controlId;else this.updateControlAttribute(e,"id",this.controlId);const i=this.authoredAria.get(e)??{labelledby:[],describedby:[]};const t=c(i.labelledby,this.hasLabel?[this.labelId]:[]).join(" ");const d=c(i.describedby,this.renderedDescription?[this.descriptionId]:[],this.renderedError?[this.errorId]:[],this.characterCount!==undefined?[`${this.controlId}-count`]:[]).join(" ");this.updateControlAttribute(e,"aria-labelledby",t||undefined);this.updateControlAttribute(e,"aria-describedby",d||undefined);this.updateControlAttribute(e,"aria-invalid",this.error?"true":undefined);if(s&&"error"in e&&e.error!==this.error)e.error=this.error;const n=this.readValue(e);this.filled=n.length>0;this.dirty=n!==this.initialValue;this.controlDisabled=Boolean(e.disabled||e.isInactive||e.hasAttribute("disabled"));this.controlRequired=Boolean(e.required||e.hasAttribute("required"));this.controlBorderless=e.hasBorder===false;this.controlSize=f(e)};this.handleLabelClick=e=>{if(this.isLoading)return;if(!this.control?.tagName.startsWith("DS-"))return;e.preventDefault();this.control.setFocus?.()};this.handleFocusIn=()=>{this.focused=true};this.handleFocusOut=e=>{if(e.relatedTarget instanceof Node&&this.el.contains(e.relatedTarget))return;this.focused=false;this.touched=true};this.handleValueChange=()=>{this.syncControl()}}connectedCallback(){if(this.didLoad)this.observeLateControls()}disconnectedCallback(){this.childObserver?.disconnect();this.childObserver=undefined;this.controlAttrObserver?.disconnect();this.controlAttrObserver=undefined}componentDidLoad(){this.syncControl();this.didLoad=true;this.observeLateControls();requestAnimationFrame((()=>this.syncControl()))}componentDidRender(){this.syncControl()}onFieldContractChange(){this.syncControl()}get hasLabel(){return Boolean(this.label?.trim())}get controlId(){return this.fieldId||this.generatedId}get labelId(){return`${this.controlId}-label`}get descriptionId(){return`${this.controlId}-description`}get errorId(){return`${this.controlId}-error`}get renderedDescription(){return Boolean(this.description)&&!this.renderedError}get renderedError(){return Boolean(this.visibleError)}get visibleError(){return this.error&&this.errorMessage?this.errorMessage:this.constraintMessage}readValue(e){if(e.tokenized)return[...e.tokens??[],String(e.value??"")].filter(Boolean).join("");const s=e.value;return Array.isArray(s)?s.join(""):String(s??"")}updateControlAttribute(e,s,i){if(i===undefined){if(e.hasAttribute(s))e.removeAttribute(s);return}if(e.getAttribute(s)!==i)e.setAttribute(s,i)}findControl(){return this.controlContainer?.querySelector(":scope > :not(slot):not(.field__control-skeleton)")??undefined}observeLateControls(){if(this.childObserver||typeof MutationObserver==="undefined")return;this.childObserver=new MutationObserver((e=>{const s=e.some((e=>Array.from(e.addedNodes).some((e=>e.nodeType===1))));if(s)this.slotRevision++}));this.childObserver.observe(this.el,{childList:true})}observeControlAttributes(e){this.controlAttrObserver?.disconnect();this.controlAttrObserver=new MutationObserver((()=>this.syncControl()));this.controlAttrObserver.observe(e,{attributes:true,attributeFilter:["has-border","size","class","data-constraint-message","data-character-count","data-character-limit"]})}renderCopy(e){return[i("span",{class:{"field__copy-source":true,"field__copy-source--loading":this.isLoading}},e),this.isLoading&&i("ds-skeleton",{class:"field__copy-skeleton",textVariant:"text-body-small"})]}render(){return i(t,{key:"93777071557276f0eed9bb39abeac2df12374d94",class:{"field--loading":this.isLoading},"aria-busy":this.isLoading?"true":undefined,inert:this.isLoading,"data-focused":this.focused?"":undefined,"data-filled":this.filled?"":undefined,"data-dirty":this.dirty?"":undefined,"data-touched":this.touched?"":undefined,"data-invalid":this.error||this.constraintMessage?"":undefined,"data-disabled":this.controlDisabled?"":undefined,"data-required":this.controlRequired?"":undefined,onFocusin:this.handleFocusIn,onFocusout:this.handleFocusOut,onInput:this.handleValueChange,onChange:this.handleValueChange,onDsChange:this.handleValueChange,onDsTokensChange:this.handleValueChange},i("div",{key:"82e21b25966cde6663969e8e98fb5af7c540e0a3",class:{field:true,"ds-field-stack":true,"ds-field-stack--supporting-inset":this.controlBorderless,[`ds-control--${this.controlSize}`]:true}},this.hasLabel?i("ds-text",{class:"field__label",as:"label",variant:"text-body-small",color:"primary",emphasis:true,for:this.controlId,textId:this.labelId,onClick:this.handleLabelClick},this.renderCopy(this.label)):null,i("div",{key:"244581631329a6b0c3684c9f4fd4027cb4fc2b33",class:"field__control",ref:e=>this.controlContainer=e},i("slot",{key:"72abf51e29979a4624a1c1ca34ff3c5f0e829278",onSlotchange:this.syncControl}),this.isLoading&&i("ds-skeleton",{key:"16f7a5b39d37b5fd62762815eb5beb8e600aa067",class:"field__control-skeleton",variant:"control",controlAppearance:this.controlBorderless?"borderless":"outlined",controlContent:this.control?.localName==="ds-select"?"label-icon":"label",controlSize:this.controlSize})),(this.renderedDescription||this.renderedError||this.characterCount!==undefined)&&i("div",{key:"e2c1139db62d80a8a99b0fd2ed81f43b51fd7c4e",class:"text-field-support"},this.renderedDescription&&i("ds-text",{key:"dbf32aae5bd0f8873339aaa2df6b2ea008d39d88",class:"field__description",as:"div",variant:"text-body-small",color:"secondary",textId:this.descriptionId},this.renderCopy(this.description)),this.renderedError&&i("ds-text",{key:"3ed77701cd93fc6e5736e143eb2db0168f30e428",class:"field__error",as:"div",variant:"text-body-small",color:"negative",textId:this.errorId,role:"alert"},this.renderCopy(this.visibleError)),this.characterCount!==undefined&&i("ds-text",{key:"91d7a4865f2065cd67cff4d301d8183127e84a36",class:"text-field-count",as:"span",variant:"text-body-small",color:this.error||this.constraintMessage?"negative":"secondary",textId:`${this.controlId}-count`},this.renderCopy(`${this.characterCount}/${this.characterLimit}`)))))}get el(){return this}static get watchers(){return{fieldId:[{onFieldContractChange:0}],label:[{onFieldContractChange:0}],description:[{onFieldContractChange:0}],error:[{onFieldContractChange:0}],errorMessage:[{onFieldContractChange:0}]}}static get style(){return l()}},[262,"ds-field",{label:[1],fieldId:[1,"field-id"],description:[1],error:[4],errorMessage:[1,"error-message"],isLoading:[4,"is-loading"],constraintMessage:[32],characterCount:[32],characterLimit:[32],focused:[32],filled:[32],dirty:[32],touched:[32],controlDisabled:[32],controlRequired:[32],controlBorderless:[32],controlSize:[32],slotRevision:[32]},undefined,{fieldId:[{onFieldContractChange:0}],label:[{onFieldContractChange:0}],description:[{onFieldContractChange:0}],error:[{onFieldContractChange:0}],errorMessage:[{onFieldContractChange:0}]}]);function p(){if(typeof customElements==="undefined"){return}const e=["ds-field","ds-skeleton","ds-text"];e.forEach((e=>{switch(e){case"ds-field":if(!customElements.get(d(e))){customElements.define(d(e),u)}break;case"ds-skeleton":if(!customElements.get(d(e))){n()}break;case"ds-text":if(!customElements.get(d(e))){o()}break}}))}p();export{u as F,p as d};
2
- //# sourceMappingURL=p-zsWHUNJ9.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["fieldCss","fieldCounter","tokens","value","split","filter","Boolean","uniqueTokens","groups","Set","flat","CONTROL_SIZES","readControlSize","control","includes","size","Field","__stencil_proxyCustomElement","HTMLElement","constructor","registerHost","this","error","isLoading","constraintMessage","focused","filled","dirty","touched","controlDisabled","controlRequired","controlBorderless","controlSize","slotRevision","generatedId","initialValue","authoredAria","WeakMap","didLoad","syncControl","findControl","readValue","set","labelledby","getAttribute","describedby","observeControlAttributes","characterCount","undefined","characterLimit","isDsControl","tagName","startsWith","inputId","controlId","updateControlAttribute","authored","get","hasLabel","labelId","join","renderedDescription","descriptionId","renderedError","errorId","length","disabled","isInactive","hasAttribute","required","hasBorder","handleLabelClick","event","preventDefault","setFocus","handleFocusIn","handleFocusOut","relatedTarget","Node","el","contains","handleValueChange","connectedCallback","observeLateControls","disconnectedCallback","childObserver","disconnect","controlAttrObserver","componentDidLoad","requestAnimationFrame","componentDidRender","onFieldContractChange","label","trim","fieldId","description","visibleError","errorMessage","tokenized","String","Array","isArray","name","removeAttribute","setAttribute","controlContainer","querySelector","MutationObserver","records","addedControl","some","record","from","addedNodes","node","nodeType","observe","childList","attributes","attributeFilter","renderCopy","h","class","textVariant","render","Host","key","inert","onFocusin","onFocusout","onInput","onChange","onDsChange","onDsTokensChange","field","as","variant","color","emphasis","for","textId","onClick","ref","onSlotchange","controlAppearance","controlContent","localName","role"],"sources":["src/wc/components/Field/Field.css?tag=ds-field&encapsulation=scoped","src/wc/components/Field/Field.tsx"],"sourcesContent":["@import '../../utils/text-field-support.css';\n@import '../../utils/control-density.css';\n@import '../../utils/field-stack.css';\n\n:host {\n display: block;\n}\n\n.field__control {\n position: relative;\n display: flex;\n min-width: 0;\n}\n\n.field__control > * {\n width: 100%;\n}\n\n.field__label,\n.field__description,\n.field__error,\n.text-field-count {\n position: relative;\n}\n\n.field__copy-source--loading,\n:host(.field--loading) .field__control > :not(slot):not(.field__control-skeleton) {\n visibility: hidden;\n}\n\n.field__copy-skeleton {\n position: absolute;\n inset-inline-start: 0;\n inset-block-start: 0;\n max-inline-size: 100%;\n}\n\n.field__label .field__copy-skeleton {\n inline-size: min(100%, calc(var(--dimension-size-800) * 2));\n}\n\n.field__control-skeleton {\n position: absolute;\n inset: 0;\n inline-size: 100%;\n block-size: 100%;\n}\n","import { Component, Element, Prop, State, Watch, h, Host } from '@stencil/core';\n\ninterface FieldControl extends HTMLElement {\n value?: string | string[];\n tokens?: string[];\n tokenized?: boolean;\n inputId?: string;\n error?: boolean;\n disabled?: boolean;\n isInactive?: boolean;\n required?: boolean;\n hasBorder?: boolean;\n size?: string;\n setFocus?: () => Promise<void> | void;\n}\n\ninterface AuthoredAria {\n labelledby: string[];\n describedby: string[];\n}\n\nlet fieldCounter = 0;\n\nconst tokens = (value: string | null | undefined): string[] =>\n value?.split(/\\s+/).filter(Boolean) ?? [];\n\nconst uniqueTokens = (...groups: string[][]): string[] => [...new Set(groups.flat())];\n\nconst CONTROL_SIZES = ['lg', 'md', 'sm', 'xs'] as const;\ntype FieldControlSize = (typeof CONTROL_SIZES)[number];\n\nconst readControlSize = (control: FieldControl): FieldControlSize =>\n CONTROL_SIZES.includes(control.size as FieldControlSize)\n ? (control.size as FieldControlSize)\n : 'md';\n\n@Component({\n tag: 'ds-field',\n styleUrl: 'Field.css',\n scoped: true,\n})\nexport class Field {\n @Element() el!: HTMLElement;\n\n /** Visible label for the slotted control. Omit when a nearby heading already names the field. */\n @Prop() label?: string;\n /** Explicit ID for the slotted control; generated when omitted. */\n @Prop() fieldId: string | undefined;\n /** Optional guidance associated with the slotted control while no visible error is shown. */\n @Prop() description: string | undefined;\n /** Invalid visual and accessible state forwarded to supported ds controls. */\n @Prop() error: boolean = false;\n /** Visible error associated with the slotted control while error is true. */\n @Prop() errorMessage: string | undefined;\n /** Masks field copy and its mounted control while preserving layout and form state. */\n @Prop() isLoading: boolean = false;\n\n @State() private constraintMessage = '';\n @State() private characterCount: string | undefined;\n @State() private characterLimit: string | undefined;\n @State() private focused = false;\n @State() private filled = false;\n @State() private dirty = false;\n @State() private touched = false;\n @State() private controlDisabled = false;\n @State() private controlRequired = false;\n @State() private controlBorderless = false;\n @State() private controlSize: 'lg' | 'md' | 'sm' | 'xs' = 'md';\n /** Bumped to let Stencil relocate a control added after the initial render. */\n @State() private slotRevision = 0;\n\n private readonly generatedId = `ds-field-${++fieldCounter}`;\n private controlContainer?: HTMLDivElement;\n private control?: FieldControl;\n private initialValue = '';\n private authoredAria = new WeakMap<FieldControl, AuthoredAria>();\n private childObserver?: MutationObserver;\n private controlAttrObserver?: MutationObserver;\n private didLoad = false;\n\n connectedCallback() {\n if (this.didLoad) this.observeLateControls();\n }\n\n disconnectedCallback() {\n this.childObserver?.disconnect();\n this.childObserver = undefined;\n this.controlAttrObserver?.disconnect();\n this.controlAttrObserver = undefined;\n }\n\n componentDidLoad() {\n this.syncControl();\n this.didLoad = true;\n this.observeLateControls();\n requestAnimationFrame(() => this.syncControl());\n }\n\n componentDidRender() {\n this.syncControl();\n }\n\n @Watch('fieldId')\n @Watch('label')\n @Watch('description')\n @Watch('error')\n @Watch('errorMessage')\n onFieldContractChange() {\n this.syncControl();\n }\n\n private get hasLabel(): boolean {\n return Boolean(this.label?.trim());\n }\n\n private get controlId(): string {\n return this.fieldId || this.generatedId;\n }\n\n private get labelId(): string {\n return `${this.controlId}-label`;\n }\n\n private get descriptionId(): string {\n return `${this.controlId}-description`;\n }\n\n private get errorId(): string {\n return `${this.controlId}-error`;\n }\n\n private get renderedDescription(): boolean {\n return Boolean(this.description) && !this.renderedError;\n }\n\n private get renderedError(): boolean {\n return Boolean(this.visibleError);\n }\n\n private get visibleError(): string {\n return this.error && this.errorMessage ? this.errorMessage : this.constraintMessage;\n }\n\n private readValue(control: FieldControl): string {\n if (control.tokenized)\n return [...(control.tokens ?? []), String(control.value ?? '')]\n .filter(Boolean)\n .join('\\u001f');\n const value = control.value;\n return Array.isArray(value) ? value.join('\\u001f') : String(value ?? '');\n }\n\n private updateControlAttribute(control: FieldControl, name: string, value: string | undefined) {\n if (value === undefined) {\n if (control.hasAttribute(name)) control.removeAttribute(name);\n return;\n }\n if (control.getAttribute(name) !== value) control.setAttribute(name, value);\n }\n\n private findControl(): FieldControl | undefined {\n return (\n this.controlContainer?.querySelector<FieldControl>(\n ':scope > :not(slot):not(.field__control-skeleton)'\n ) ?? undefined\n );\n }\n\n private observeLateControls() {\n if (this.childObserver || typeof MutationObserver === 'undefined') return;\n this.childObserver = new MutationObserver(records => {\n const addedControl = records.some(record =>\n Array.from(record.addedNodes).some(node => node.nodeType === 1)\n );\n if (addedControl) this.slotRevision++;\n });\n this.childObserver.observe(this.el, { childList: true });\n }\n\n private syncControl = () => {\n const control = this.findControl();\n if (!control) return;\n\n if (control !== this.control) {\n this.control = control;\n this.initialValue = this.readValue(control);\n this.authoredAria.set(control, {\n labelledby: tokens(control.getAttribute('aria-labelledby')),\n describedby: tokens(control.getAttribute('aria-describedby')),\n });\n this.observeControlAttributes(control);\n }\n\n this.constraintMessage = control.getAttribute('data-constraint-message') ?? '';\n this.characterCount = control.getAttribute('data-character-count') ?? undefined;\n this.characterLimit = control.getAttribute('data-character-limit') ?? undefined;\n\n const isDsControl = control.tagName.startsWith('DS-');\n if (isDsControl && 'inputId' in control) control.inputId = this.controlId;\n else this.updateControlAttribute(control, 'id', this.controlId);\n\n const authored = this.authoredAria.get(control) ?? { labelledby: [], describedby: [] };\n const labelledby = uniqueTokens(authored.labelledby, this.hasLabel ? [this.labelId] : []).join(\n ' '\n );\n const describedby = uniqueTokens(\n authored.describedby,\n this.renderedDescription ? [this.descriptionId] : [],\n this.renderedError ? [this.errorId] : [],\n this.characterCount !== undefined ? [`${this.controlId}-count`] : []\n ).join(' ');\n\n this.updateControlAttribute(control, 'aria-labelledby', labelledby || undefined);\n this.updateControlAttribute(control, 'aria-describedby', describedby || undefined);\n this.updateControlAttribute(control, 'aria-invalid', this.error ? 'true' : undefined);\n\n if (isDsControl && 'error' in control && control.error !== this.error)\n control.error = this.error;\n\n const value = this.readValue(control);\n this.filled = value.length > 0;\n this.dirty = value !== this.initialValue;\n this.controlDisabled = Boolean(\n control.disabled || control.isInactive || control.hasAttribute('disabled')\n );\n this.controlRequired = Boolean(control.required || control.hasAttribute('required'));\n this.controlBorderless = control.hasBorder === false;\n this.controlSize = readControlSize(control);\n };\n\n private observeControlAttributes(control: FieldControl) {\n this.controlAttrObserver?.disconnect();\n this.controlAttrObserver = new MutationObserver(() => this.syncControl());\n this.controlAttrObserver.observe(control, {\n attributes: true,\n attributeFilter: [\n 'has-border',\n 'size',\n 'class',\n 'data-constraint-message',\n 'data-character-count',\n 'data-character-limit',\n ],\n });\n }\n\n private handleLabelClick = (event: MouseEvent) => {\n if (this.isLoading) return;\n if (!this.control?.tagName.startsWith('DS-')) return;\n event.preventDefault();\n this.control.setFocus?.();\n };\n\n private handleFocusIn = () => {\n this.focused = true;\n };\n\n private handleFocusOut = (event: FocusEvent) => {\n if (event.relatedTarget instanceof Node && this.el.contains(event.relatedTarget)) return;\n this.focused = false;\n this.touched = true;\n };\n\n private handleValueChange = () => {\n this.syncControl();\n };\n\n private renderCopy(value: string | undefined) {\n return [\n <span class={{ 'field__copy-source': true, 'field__copy-source--loading': this.isLoading }}>\n {value}\n </span>,\n this.isLoading && <ds-skeleton class=\"field__copy-skeleton\" textVariant=\"text-body-small\" />,\n ];\n }\n\n render() {\n return (\n <Host\n class={{ 'field--loading': this.isLoading }}\n aria-busy={this.isLoading ? 'true' : undefined}\n inert={this.isLoading}\n data-focused={this.focused ? '' : undefined}\n data-filled={this.filled ? '' : undefined}\n data-dirty={this.dirty ? '' : undefined}\n data-touched={this.touched ? '' : undefined}\n data-invalid={this.error || this.constraintMessage ? '' : undefined}\n data-disabled={this.controlDisabled ? '' : undefined}\n data-required={this.controlRequired ? '' : undefined}\n onFocusin={this.handleFocusIn}\n onFocusout={this.handleFocusOut}\n onInput={this.handleValueChange}\n onChange={this.handleValueChange}\n onDsChange={this.handleValueChange}\n onDsTokensChange={this.handleValueChange}\n >\n <div\n class={{\n field: true,\n 'ds-field-stack': true,\n 'ds-field-stack--supporting-inset': this.controlBorderless,\n [`ds-control--${this.controlSize}`]: true,\n }}\n >\n {this.hasLabel ? (\n <ds-text\n class=\"field__label\"\n as=\"label\"\n variant=\"text-body-small\"\n color=\"primary\"\n emphasis\n for={this.controlId}\n textId={this.labelId}\n onClick={this.handleLabelClick}\n >\n {this.renderCopy(this.label)}\n </ds-text>\n ) : null}\n <div class=\"field__control\" ref={el => (this.controlContainer = el)}>\n <slot onSlotchange={this.syncControl} />\n {this.isLoading && (\n <ds-skeleton\n class=\"field__control-skeleton\"\n variant=\"control\"\n controlAppearance={this.controlBorderless ? 'borderless' : 'outlined'}\n controlContent={this.control?.localName === 'ds-select' ? 'label-icon' : 'label'}\n controlSize={this.controlSize}\n />\n )}\n </div>\n {(this.renderedDescription ||\n this.renderedError ||\n this.characterCount !== undefined) && (\n <div class=\"text-field-support\">\n {this.renderedDescription && (\n <ds-text\n class=\"field__description\"\n as=\"div\"\n variant=\"text-body-small\"\n color=\"secondary\"\n textId={this.descriptionId}\n >\n {this.renderCopy(this.description)}\n </ds-text>\n )}\n {this.renderedError && (\n <ds-text\n class=\"field__error\"\n as=\"div\"\n variant=\"text-body-small\"\n color=\"negative\"\n textId={this.errorId}\n role=\"alert\"\n >\n {this.renderCopy(this.visibleError)}\n </ds-text>\n )}\n {this.characterCount !== undefined && (\n <ds-text\n class=\"text-field-count\"\n as=\"span\"\n variant=\"text-body-small\"\n color={this.error || this.constraintMessage ? 'negative' : 'secondary'}\n textId={`${this.controlId}-count`}\n >\n {this.renderCopy(`${this.characterCount}/${this.characterLimit}`)}\n </ds-text>\n )}\n </div>\n )}\n </div>\n </Host>\n );\n }\n}\n"],"mappings":"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","ignoreList":[]}