@carbon/ibm-products-web-components 0.48.0 → 0.49.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (142) hide show
  1. package/custom-elements.json +55 -17
  2. package/es/components/page-header/_story-assets/overflowHandler.d.ts.map +1 -1
  3. package/es/components/page-header/_story-assets/overflowHandler.js +1 -1
  4. package/es/components/page-header/_story-assets/overflowHandler.js.map +1 -1
  5. package/es/components/page-header/context.d.ts +3 -0
  6. package/es/components/page-header/context.d.ts.map +1 -1
  7. package/es/components/page-header/context.js +4 -1
  8. package/es/components/page-header/context.js.map +1 -1
  9. package/es/components/page-header/page-header-actions-set/page-header-actions-set.d.ts +4 -0
  10. package/es/components/page-header/page-header-actions-set/page-header-actions-set.d.ts.map +1 -1
  11. package/es/components/page-header/page-header-actions-set/page-header-actions-set.js +22 -13
  12. package/es/components/page-header/page-header-actions-set/page-header-actions-set.js.map +1 -1
  13. package/es/components/page-header/page-header-breadcrumb.d.ts +1 -1
  14. package/es/components/page-header/page-header-breadcrumb.d.ts.map +1 -1
  15. package/es/components/page-header/page-header-breadcrumb.js +4 -2
  16. package/es/components/page-header/page-header-breadcrumb.js.map +1 -1
  17. package/es/components/page-header/page-header-breadcrumbs-set/page-header-breadcrumbs-set.d.ts +11 -2
  18. package/es/components/page-header/page-header-breadcrumbs-set/page-header-breadcrumbs-set.d.ts.map +1 -1
  19. package/es/components/page-header/page-header-breadcrumbs-set/page-header-breadcrumbs-set.js +37 -21
  20. package/es/components/page-header/page-header-breadcrumbs-set/page-header-breadcrumbs-set.js.map +1 -1
  21. package/es/components/page-header/page-header-content-text.d.ts +8 -0
  22. package/es/components/page-header/page-header-content-text.d.ts.map +1 -1
  23. package/es/components/page-header/page-header-content-text.js +21 -5
  24. package/es/components/page-header/page-header-content-text.js.map +1 -1
  25. package/es/components/page-header/page-header-content.d.ts +13 -0
  26. package/es/components/page-header/page-header-content.d.ts.map +1 -1
  27. package/es/components/page-header/page-header-content.js +37 -14
  28. package/es/components/page-header/page-header-content.js.map +1 -1
  29. package/es/components/page-header/page-header-hero-image.d.ts +3 -0
  30. package/es/components/page-header/page-header-hero-image.d.ts.map +1 -1
  31. package/es/components/page-header/page-header-hero-image.js +3 -0
  32. package/es/components/page-header/page-header-hero-image.js.map +1 -1
  33. package/es/components/page-header/page-header-scroller.d.ts +1 -0
  34. package/es/components/page-header/page-header-scroller.d.ts.map +1 -1
  35. package/es/components/page-header/page-header-scroller.js +7 -3
  36. package/es/components/page-header/page-header-scroller.js.map +1 -1
  37. package/es/components/page-header/page-header-tabs.d.ts +1 -0
  38. package/es/components/page-header/page-header-tabs.d.ts.map +1 -1
  39. package/es/components/page-header/page-header-tabs.js +24 -10
  40. package/es/components/page-header/page-header-tabs.js.map +1 -1
  41. package/es/components/page-header/page-header-tags-set/page-header-tags-set.d.ts +2 -1
  42. package/es/components/page-header/page-header-tags-set/page-header-tags-set.d.ts.map +1 -1
  43. package/es/components/page-header/page-header-tags-set/page-header-tags-set.js +38 -17
  44. package/es/components/page-header/page-header-tags-set/page-header-tags-set.js.map +1 -1
  45. package/es/components/page-header/page-header-tags-set/page-header-tags-set.scss.js +1 -1
  46. package/es/components/page-header/page-header-tags-set/page-header-tags-set.scss.js.map +1 -1
  47. package/es/components/page-header/page-header-tags-set/utils.d.ts +0 -8
  48. package/es/components/page-header/page-header-tags-set/utils.d.ts.map +1 -1
  49. package/es/components/page-header/page-header-tags-set/utils.js +0 -34
  50. package/es/components/page-header/page-header-title-breadcrumb.d.ts.map +1 -1
  51. package/es/components/page-header/page-header-title-breadcrumb.js +8 -5
  52. package/es/components/page-header/page-header-title-breadcrumb.js.map +1 -1
  53. package/es/components/page-header/page-header.d.ts +15 -0
  54. package/es/components/page-header/page-header.d.ts.map +1 -1
  55. package/es/components/page-header/page-header.js +80 -34
  56. package/es/components/page-header/page-header.js.map +1 -1
  57. package/es/components/page-header/page-header.scss.js +1 -1
  58. package/es/components/page-header/page-header.scss.js.map +1 -1
  59. package/es/components/tearsheet/tearsheet.scss.js +1 -1
  60. package/es/components/tearsheet-preview/tearsheet-header-content.scss.js +1 -1
  61. package/es/components/tearsheet-preview/tearsheet-header-content.scss.js.map +1 -1
  62. package/es/components/tearsheet-preview/tearsheet-header.scss.js +1 -1
  63. package/es/components/tearsheet-preview/tearsheet-header.scss.js.map +1 -1
  64. package/es/components/tearsheet-preview/tearsheet-navigation-bar.scss.js +1 -1
  65. package/es/components/tearsheet-preview/tearsheet.scss.js +1 -1
  66. package/es/components/tearsheet-preview/tearsheet.scss.js.map +1 -1
  67. package/es/ibm-products-web-components/package.js +1 -1
  68. package/es-custom/components/page-header/_story-assets/overflowHandler.js +1 -1
  69. package/es-custom/components/page-header/_story-assets/overflowHandler.js.map +1 -1
  70. package/es-custom/components/page-header/context.js +4 -1
  71. package/es-custom/components/page-header/context.js.map +1 -1
  72. package/es-custom/components/page-header/page-header-actions-set/page-header-actions-set.js +22 -13
  73. package/es-custom/components/page-header/page-header-actions-set/page-header-actions-set.js.map +1 -1
  74. package/es-custom/components/page-header/page-header-breadcrumb.js +4 -2
  75. package/es-custom/components/page-header/page-header-breadcrumb.js.map +1 -1
  76. package/es-custom/components/page-header/page-header-breadcrumbs-set/page-header-breadcrumbs-set.js +37 -21
  77. package/es-custom/components/page-header/page-header-breadcrumbs-set/page-header-breadcrumbs-set.js.map +1 -1
  78. package/es-custom/components/page-header/page-header-content-text.js +21 -5
  79. package/es-custom/components/page-header/page-header-content-text.js.map +1 -1
  80. package/es-custom/components/page-header/page-header-content.js +37 -14
  81. package/es-custom/components/page-header/page-header-content.js.map +1 -1
  82. package/es-custom/components/page-header/page-header-hero-image.js +3 -0
  83. package/es-custom/components/page-header/page-header-hero-image.js.map +1 -1
  84. package/es-custom/components/page-header/page-header-scroller.js +7 -3
  85. package/es-custom/components/page-header/page-header-scroller.js.map +1 -1
  86. package/es-custom/components/page-header/page-header-tabs.js +24 -10
  87. package/es-custom/components/page-header/page-header-tabs.js.map +1 -1
  88. package/es-custom/components/page-header/page-header-tags-set/page-header-tags-set.js +38 -17
  89. package/es-custom/components/page-header/page-header-tags-set/page-header-tags-set.js.map +1 -1
  90. package/es-custom/components/page-header/page-header-tags-set/page-header-tags-set.scss.js +1 -1
  91. package/es-custom/components/page-header/page-header-tags-set/page-header-tags-set.scss.js.map +1 -1
  92. package/es-custom/components/page-header/page-header-tags-set/utils.js +0 -34
  93. package/es-custom/components/page-header/page-header-title-breadcrumb.js +8 -5
  94. package/es-custom/components/page-header/page-header-title-breadcrumb.js.map +1 -1
  95. package/es-custom/components/page-header/page-header.js +80 -34
  96. package/es-custom/components/page-header/page-header.js.map +1 -1
  97. package/es-custom/components/page-header/page-header.scss.js +1 -1
  98. package/es-custom/components/page-header/page-header.scss.js.map +1 -1
  99. package/es-custom/components/tearsheet/tearsheet.scss.js +1 -1
  100. package/es-custom/components/tearsheet-preview/tearsheet-header-content.scss.js +1 -1
  101. package/es-custom/components/tearsheet-preview/tearsheet-header-content.scss.js.map +1 -1
  102. package/es-custom/components/tearsheet-preview/tearsheet-header.scss.js +1 -1
  103. package/es-custom/components/tearsheet-preview/tearsheet-header.scss.js.map +1 -1
  104. package/es-custom/components/tearsheet-preview/tearsheet-navigation-bar.scss.js +1 -1
  105. package/es-custom/components/tearsheet-preview/tearsheet.scss.js +1 -1
  106. package/es-custom/components/tearsheet-preview/tearsheet.scss.js.map +1 -1
  107. package/es-custom/ibm-products-web-components/package.js +1 -1
  108. package/lib/components/page-header/_story-assets/overflowHandler.d.ts.map +1 -1
  109. package/lib/components/page-header/context.d.ts +3 -0
  110. package/lib/components/page-header/context.d.ts.map +1 -1
  111. package/lib/components/page-header/page-header-actions-set/page-header-actions-set.d.ts +4 -0
  112. package/lib/components/page-header/page-header-actions-set/page-header-actions-set.d.ts.map +1 -1
  113. package/lib/components/page-header/page-header-breadcrumb.d.ts +1 -1
  114. package/lib/components/page-header/page-header-breadcrumb.d.ts.map +1 -1
  115. package/lib/components/page-header/page-header-breadcrumbs-set/page-header-breadcrumbs-set.d.ts +11 -2
  116. package/lib/components/page-header/page-header-breadcrumbs-set/page-header-breadcrumbs-set.d.ts.map +1 -1
  117. package/lib/components/page-header/page-header-content-text.d.ts +8 -0
  118. package/lib/components/page-header/page-header-content-text.d.ts.map +1 -1
  119. package/lib/components/page-header/page-header-content.d.ts +13 -0
  120. package/lib/components/page-header/page-header-content.d.ts.map +1 -1
  121. package/lib/components/page-header/page-header-hero-image.d.ts +3 -0
  122. package/lib/components/page-header/page-header-hero-image.d.ts.map +1 -1
  123. package/lib/components/page-header/page-header-scroller.d.ts +1 -0
  124. package/lib/components/page-header/page-header-scroller.d.ts.map +1 -1
  125. package/lib/components/page-header/page-header-tabs.d.ts +1 -0
  126. package/lib/components/page-header/page-header-tabs.d.ts.map +1 -1
  127. package/lib/components/page-header/page-header-tags-set/page-header-tags-set.d.ts +2 -1
  128. package/lib/components/page-header/page-header-tags-set/page-header-tags-set.d.ts.map +1 -1
  129. package/lib/components/page-header/page-header-tags-set/utils.d.ts +0 -8
  130. package/lib/components/page-header/page-header-tags-set/utils.d.ts.map +1 -1
  131. package/lib/components/page-header/page-header-title-breadcrumb.d.ts.map +1 -1
  132. package/lib/components/page-header/page-header.d.ts +15 -0
  133. package/lib/components/page-header/page-header.d.ts.map +1 -1
  134. package/package.json +4 -4
  135. package/scss/components/page-header/page-header-tags-set/page-header-tags-set.scss +16 -4
  136. package/scss/components/page-header/page-header.scss +31 -17
  137. package/scss/components/tearsheet-preview/tearsheet-header-content.scss +32 -6
  138. package/scss/components/tearsheet-preview/tearsheet-header.scss +4 -0
  139. package/scss/components/tearsheet-preview/tearsheet.scss +20 -1
  140. package/telemetry.yml +4 -1
  141. package/es/components/page-header/page-header-tags-set/utils.js.map +0 -1
  142. package/es-custom/components/page-header/page-header-tags-set/utils.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"page-header-tags-set.scss.js","names":[],"sources":["../../../../src/components/page-header/page-header-tags-set/page-header-tags-set.scss?lit"],"sourcesContent":["/*\n* Copyright IBM Corp. 2025, 2026\n*\n* This source code is licensed under the Apache-2.0 license found in the\n* LICENSE file in the root directory of this source tree.\n*/\n\n/* stylelint-disable */\n\n$css--plex: true !default;\n\n/* Other Carbon settings. */\n@use 'sass:map';\n@use '@carbon/styles';\n@use '@carbon/styles/scss/themes';\n@use '@carbon/styles/scss/type';\n@use '@carbon/styles/scss/breakpoint' as *;\n@use '@carbon/styles/scss/spacing' as *;\n\n$prefix: 'c4p';\n$carbon-prefix: 'cds-custom';\n\n$block-class: #{$prefix}--page-header-tags-set;\n\n:host {\n inline-size: 100%;\n .#{$block-class} {\n display: flex;\n // Spacing between tags.\n gap: $spacing-03;\n box-sizing: border-box;\n justify-content: flex-end;\n inline-size: 100%;\n white-space: nowrap;\n\n &__popover-container {\n padding: $spacing-05;\n\n .#{$block-class}__popover-tag {\n @include type.type-style('label-02');\n\n margin: 0;\n }\n\n cds-custom-dismissible-tag {\n margin: $spacing-01 0;\n }\n }\n\n &__view-all {\n --#{$carbon-prefix}-link-text-color: var(\n --#{$carbon-prefix}-link-inverse\n );\n --#{$carbon-prefix}-link-hover-text-color: var(\n --#{$carbon-prefix}-link-inverse-hover\n );\n --#{$carbon-prefix}-link-visited-text-color: var(\n --#{$carbon-prefix}-link-inverse-visited\n );\n --#{$carbon-prefix}-link-focus-text-color: var(\n --#{$carbon-prefix}-focus-inverse\n );\n margin-top: $spacing-03;\n display: block;\n }\n\n &__modal-tags-search {\n margin-block-start: $spacing-05;\n }\n\n &__modal-tags-container {\n cds-custom-dismissible-tag {\n margin: $spacing-02 $spacing-03 $spacing-02 0;\n }\n }\n }\n\n // Suppress custom elements until styles are loaded\n #{$carbon-prefix}-tag:not(:defined),\n #{$carbon-prefix}-dismissible-tag:not(:defined),\n #{$carbon-prefix}-operational-tag:not(:defined) {\n display: none;\n }\n\n cds-custom-modal-header {\n padding-inline: $spacing-05;\n }\n\n cds-custom-modal-body {\n @extend .#{$carbon-prefix}--modal-scroll-content;\n\n cds-custom-tag {\n margin-inline-start: 0;\n }\n }\n}\n"],"mappings":""}
1
+ {"version":3,"file":"page-header-tags-set.scss.js","names":[],"sources":["../../../../src/components/page-header/page-header-tags-set/page-header-tags-set.scss?lit"],"sourcesContent":["/*\n* Copyright IBM Corp. 2025, 2026\n*\n* This source code is licensed under the Apache-2.0 license found in the\n* LICENSE file in the root directory of this source tree.\n*/\n\n/* stylelint-disable */\n\n$css--plex: true !default;\n\n/* Other Carbon settings. */\n@use 'sass:map';\n@use '@carbon/styles';\n@use '@carbon/styles/scss/themes';\n@use '@carbon/styles/scss/type';\n@use '@carbon/styles/scss/breakpoint' as *;\n@use '@carbon/styles/scss/spacing' as *;\n\n$prefix: 'c4p';\n$carbon-prefix: 'cds-custom';\n\n$block-class: #{$prefix}--page-header-tags-set;\n\n:host {\n inline-size: 100%;\n\n // Visually-hidden live region for announcing overflow count changes to\n // assistive technology — must remain in the accessibility tree.\n .#{$block-class}__hidden-count-announcement {\n position: absolute;\n overflow: hidden;\n inline-size: 1px;\n block-size: 1px;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n }\n\n .#{$block-class} {\n display: flex;\n // Spacing between tags.\n gap: $spacing-03;\n box-sizing: border-box;\n justify-content: flex-end;\n inline-size: 100%;\n white-space: nowrap;\n\n &__popover-container {\n display: flex;\n flex-direction: column;\n gap: $spacing-02;\n padding: $spacing-05;\n\n .#{$block-class}__popover-tag {\n @include type.type-style('label-02');\n\n margin: 0;\n }\n }\n\n &__view-all {\n --#{$carbon-prefix}-link-text-color: var(\n --#{$carbon-prefix}-link-inverse\n );\n --#{$carbon-prefix}-link-hover-text-color: var(\n --#{$carbon-prefix}-link-inverse-hover\n );\n --#{$carbon-prefix}-link-visited-text-color: var(\n --#{$carbon-prefix}-link-inverse-visited\n );\n --#{$carbon-prefix}-link-focus-text-color: var(\n --#{$carbon-prefix}-focus-inverse\n );\n margin-top: $spacing-03;\n display: block;\n }\n\n &__modal-tags-search {\n margin-block-start: $spacing-05;\n }\n\n &__modal-tags-container {\n cds-custom-dismissible-tag {\n margin: $spacing-02 $spacing-03 $spacing-02 0;\n }\n }\n }\n\n // Suppress custom elements until styles are loaded\n #{$carbon-prefix}-tag:not(:defined),\n #{$carbon-prefix}-dismissible-tag:not(:defined),\n #{$carbon-prefix}-operational-tag:not(:defined) {\n display: none;\n }\n\n cds-custom-modal-header {\n padding-inline: $spacing-05;\n }\n\n cds-custom-modal-body {\n @extend .#{$carbon-prefix}--modal-scroll-content;\n\n cds-custom-tag {\n margin-inline-start: 0;\n }\n }\n}\n"],"mappings":""}
@@ -5,37 +5,3 @@
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
7
 
8
- import { TAG_SIZE, TAG_TYPE } from "@carbon/web-components/es/components/tag/defs";
9
- //#region src/components/page-header/page-header-tags-set/utils.ts
10
- /**
11
- * @license
12
- *
13
- * Copyright IBM Corp. 2025, 2026
14
- *
15
- * This source code is licensed under the Apache-2.0 license found in the
16
- * LICENSE file in the root directory of this source tree.
17
- */
18
- const tagTypes = Object.values(TAG_TYPE);
19
- const words = "Interface Components Architecture Microservices Tokens Authentication Authorization Encryption Dashboard Metrics Logging Tracing Scalability Latency Containers Virtualization Deployment Infrastructure Cloud Cluster Replica Storage Bandwidth Throughput Streaming Sockets Requests Responses Payload Endpoint GraphQL REST Webhooks JSON Serialization Deserialization Algorithms Inference Model Training Embeddings Prompts Outputs Transformer Neural Optimization Gradient Epoch Dataset Labels Prediction Pipeline Automation Hooks State Context Reducer Props Render Refactor Commit Branch Merge Versioning Build Compile Transpile Minify Bundle Dependency Modules Imports Exports Testing Coverage Snapshot Regression Lint Formatter Error Exception Debug Logs Watcher Server Client Browser Viewport Media Query Responsive Breakpoints Grid CSS Tailwind JavaScript TypeScript Framework Library Routing Navigation SPA SSR Hydration DOM Event Handler Listener Throttle Debounce Asynchronous Callback Promise Await Fetch Resource CORS Header Cookie Session Cache Index Query Database Schema Migration ORM Relation Join Table Record Document NoSQL SQL Function Parameter Return Expression Condition Loop Iteration Variable Constant Scope Closure Arrow Object Array Boolean String Integer Float Null Undefined NaN Prototype Instance Class Constructor Inheritance Encapsulation Abstraction Polymorphism Tokenization CI CD Monitoring Alert Incident SLA SLO Uptime Availability Redundancy Failover Load Balancer Firewall Gateway Certificate TLS HTTPS Domain DNS Proxy Timeout Queue Service Registry Discovery Containerization Kubernetes Docker".split(/\s+/);
20
- function generateTags({ count, size = TAG_SIZE.MEDIUM, dismissible = false }) {
21
- return Array.from({ length: count }, (_, index) => {
22
- const type = tagTypes[index % tagTypes.length];
23
- const text = words[index % words.length];
24
- const tag = {
25
- type,
26
- text,
27
- size
28
- };
29
- if (dismissible) tag.onClose = () => console.log(`Closed tag: ${text}`);
30
- return tag;
31
- });
32
- }
33
- const tagsData = generateTags({
34
- count: 100,
35
- size: TAG_SIZE.SMALL,
36
- dismissible: true
37
- });
38
- //#endregion
39
- export { generateTags, tagsData };
40
-
41
- //# sourceMappingURL=utils.js.map
@@ -29,17 +29,17 @@ import CDSBreadcrumbItem from "@carbon/web-components/es/components/breadcrumb/b
29
29
  let CDSPageHeaderTitleBreadcrumb = class CDSPageHeaderTitleBreadcrumb extends CDSBreadcrumbItem {
30
30
  constructor() {
31
31
  super();
32
- this.setAttribute("aria-hidden", "true");
32
+ this.setAttribute("inert", "");
33
33
  new ContextConsumer(this, {
34
34
  context: pageHeaderContext,
35
35
  subscribe: true,
36
36
  callback: (state) => {
37
37
  if (state.titleClipped) {
38
38
  this.classList.add(`c4p--page-header-title-breadcrumb-show__fallback`);
39
- this.setAttribute("aria-hidden", "false");
39
+ this.removeAttribute("inert");
40
40
  } else {
41
41
  this.classList.remove(`c4p--page-header-title-breadcrumb-show__fallback`);
42
- this.setAttribute("aria-hidden", "true");
42
+ this.setAttribute("inert", "");
43
43
  }
44
44
  if (state.withContent) {
45
45
  this.classList.add(`c4p--page-header-title-breadcrumb-show__with-content`);
@@ -47,14 +47,17 @@ let CDSPageHeaderTitleBreadcrumb = class CDSPageHeaderTitleBreadcrumb extends CD
47
47
  } else {
48
48
  this.classList.remove(`c4p--page-header-title-breadcrumb-show__with-content`);
49
49
  this.classList.add(`c4p--page-header-title-breadcrumb-show__by-default`);
50
- this.setAttribute("aria-hidden", "false");
50
+ this.removeAttribute("inert");
51
51
  }
52
52
  }
53
53
  });
54
54
  }
55
55
  render() {
56
56
  return html`
57
- <cds-custom-breadcrumb-item class="${"c4p"}--page-header-title-breadcrumb">
57
+ <cds-custom-breadcrumb-item
58
+ class="${"c4p"}--page-header-title-breadcrumb"
59
+ role="presentation"
60
+ >
58
61
  <slot></slot>
59
62
  </cds-custom-breadcrumb-item>
60
63
  `;
@@ -1 +1 @@
1
- {"version":3,"file":"page-header-title-breadcrumb.js","names":["styles","customElement"],"sources":["../../../src/components/page-header/page-header-title-breadcrumb.ts"],"sourcesContent":["/**\n * @license\n *\n * Copyright IBM Corp. 2025, 2025\n *\n * This source code is licensed under the Apache-2.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport { html } from 'lit';\nimport { consume, ContextConsumer } from '@lit/context';\nimport { carbonElement as customElement } from '@carbon/web-components/es/globals/decorators/carbon-element.js';\nimport CDSBreadcrumbItem from '@carbon/web-components/es/components/breadcrumb/breadcrumb-item';\nimport { prefix } from '../../globals/settings';\nimport styles from './page-header.scss?lit';\nimport { pageHeaderContext } from './context';\nimport { pageHeaderContextType } from './page-header';\n\n/**\n * Page header Title Breadcrumb\n * @element c4p-page-header-title-breadcrumb\n */\n@customElement(`${prefix}-page-header-title-breadcrumb`)\nclass CDSPageHeaderTitleBreadcrumb extends CDSBreadcrumbItem {\n @consume({ context: pageHeaderContext, subscribe: true })\n context;\n\n constructor() {\n super();\n // Set initial aria-hidden since the element starts with opacity: 0\n this.setAttribute('aria-hidden', 'true');\n new ContextConsumer(this, {\n context: pageHeaderContext,\n subscribe: true,\n callback: (state) => {\n const isVisible = (state as pageHeaderContextType).titleClipped;\n\n if (isVisible) {\n this.classList.add(\n `${prefix}--page-header-title-breadcrumb-show__fallback`\n );\n this.setAttribute('aria-hidden', 'false');\n } else {\n this.classList.remove(\n `${prefix}--page-header-title-breadcrumb-show__fallback`\n );\n this.setAttribute('aria-hidden', 'true');\n }\n if ((state as pageHeaderContextType).withContent) {\n this.classList.add(\n `${prefix}--page-header-title-breadcrumb-show__with-content`\n );\n this.classList.remove(\n `${prefix}--page-header-title-breadcrumb-show__by-default`\n );\n } else {\n this.classList.remove(\n `${prefix}--page-header-title-breadcrumb-show__with-content`\n );\n this.classList.add(\n `${prefix}--page-header-title-breadcrumb-show__by-default`\n );\n // When showing by default, it should be visible to screen readers\n this.setAttribute('aria-hidden', 'false');\n }\n },\n });\n }\n render() {\n return html`\n <cds-custom-breadcrumb-item class=\"${prefix}--page-header-title-breadcrumb\">\n <slot></slot>\n </cds-custom-breadcrumb-item>\n `;\n }\n\n static styles = styles;\n}\n\nexport default CDSPageHeaderTitleBreadcrumb;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsBA,IAAA,+BAAA,MACM,qCAAqC,kBAAkB;CAI3D,cAAc;AACZ,SAAO;AAEP,OAAK,aAAa,eAAe,OAAO;AACxC,MAAI,gBAAgB,MAAM;GACxB,SAAS;GACT,WAAW;GACX,WAAW,UAAU;AAGnB,QAFmB,MAAgC,cAEpC;AACb,UAAK,UAAU,IACb,mDACD;AACD,UAAK,aAAa,eAAe,QAAQ;WACpC;AACL,UAAK,UAAU,OACb,mDACD;AACD,UAAK,aAAa,eAAe,OAAO;;AAE1C,QAAK,MAAgC,aAAa;AAChD,UAAK,UAAU,IACb,uDACD;AACD,UAAK,UAAU,OACb,qDACD;WACI;AACL,UAAK,UAAU,OACb,uDACD;AACD,UAAK,UAAU,IACb,qDACD;AAED,UAAK,aAAa,eAAe,QAAQ;;;GAG9C,CAAC;;CAEJ,SAAS;AACP,SAAO,IAAI;0CAC4B;;;;;;gBAMzBA;;;YApDf,QAAQ;CAAE,SAAS;CAAmB,WAAW;CAAM,CAAC,CAAA,EAAA,6BAAA,WAAA,WAAA,KAAA,EAAA;2CAF1DC,cAAc,mCAAyC,CAAA,EAAA,6BAAA;AAyDxD,IAAA,uCAAe"}
1
+ {"version":3,"file":"page-header-title-breadcrumb.js","names":["styles","customElement"],"sources":["../../../src/components/page-header/page-header-title-breadcrumb.ts"],"sourcesContent":["/**\n * @license\n *\n * Copyright IBM Corp. 2025, 2025\n *\n * This source code is licensed under the Apache-2.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport { html } from 'lit';\nimport { consume, ContextConsumer } from '@lit/context';\nimport { carbonElement as customElement } from '@carbon/web-components/es/globals/decorators/carbon-element.js';\nimport CDSBreadcrumbItem from '@carbon/web-components/es/components/breadcrumb/breadcrumb-item';\nimport { prefix } from '../../globals/settings';\nimport styles from './page-header.scss?lit';\nimport { pageHeaderContext } from './context';\nimport { pageHeaderContextType } from './page-header';\n\n/**\n * Page header Title Breadcrumb\n * @element c4p-page-header-title-breadcrumb\n */\n@customElement(`${prefix}-page-header-title-breadcrumb`)\nclass CDSPageHeaderTitleBreadcrumb extends CDSBreadcrumbItem {\n @consume({ context: pageHeaderContext, subscribe: true })\n context;\n\n constructor() {\n super();\n // Use inert (not aria-hidden) to hide the element from both focus and\n // the accessibility tree when it is visually hidden (opacity: 0).\n // aria-hidden was removed: it causes a violation when focusable\n // descendants exist inside shadow DOM (inert alone is sufficient).\n this.setAttribute('inert', '');\n new ContextConsumer(this, {\n context: pageHeaderContext,\n subscribe: true,\n callback: (state) => {\n const isVisible = (state as pageHeaderContextType).titleClipped;\n\n if (isVisible) {\n this.classList.add(\n `${prefix}--page-header-title-breadcrumb-show__fallback`\n );\n this.removeAttribute('inert');\n } else {\n this.classList.remove(\n `${prefix}--page-header-title-breadcrumb-show__fallback`\n );\n this.setAttribute('inert', '');\n }\n if ((state as pageHeaderContextType).withContent) {\n this.classList.add(\n `${prefix}--page-header-title-breadcrumb-show__with-content`\n );\n this.classList.remove(\n `${prefix}--page-header-title-breadcrumb-show__by-default`\n );\n } else {\n this.classList.remove(\n `${prefix}--page-header-title-breadcrumb-show__with-content`\n );\n this.classList.add(\n `${prefix}--page-header-title-breadcrumb-show__by-default`\n );\n // When showing by default it is always visible — remove inert\n this.removeAttribute('inert');\n }\n },\n });\n }\n render() {\n return html`\n <cds-custom-breadcrumb-item\n class=\"${prefix}--page-header-title-breadcrumb\"\n role=\"presentation\"\n >\n <slot></slot>\n </cds-custom-breadcrumb-item>\n `;\n }\n\n static styles = styles;\n}\n\nexport default CDSPageHeaderTitleBreadcrumb;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsBA,IAAA,+BAAA,MACM,qCAAqC,kBAAkB;CAI3D,cAAc;AACZ,SAAO;AAKP,OAAK,aAAa,SAAS,GAAG;AAC9B,MAAI,gBAAgB,MAAM;GACxB,SAAS;GACT,WAAW;GACX,WAAW,UAAU;AAGnB,QAFmB,MAAgC,cAEpC;AACb,UAAK,UAAU,IACb,mDACD;AACD,UAAK,gBAAgB,QAAQ;WACxB;AACL,UAAK,UAAU,OACb,mDACD;AACD,UAAK,aAAa,SAAS,GAAG;;AAEhC,QAAK,MAAgC,aAAa;AAChD,UAAK,UAAU,IACb,uDACD;AACD,UAAK,UAAU,OACb,qDACD;WACI;AACL,UAAK,UAAU,OACb,uDACD;AACD,UAAK,UAAU,IACb,qDACD;AAED,UAAK,gBAAgB,QAAQ;;;GAGlC,CAAC;;CAEJ,SAAS;AACP,SAAO,IAAI;;uBAES;;;;;;;;gBAQNA;;;YA1Df,QAAQ;CAAE,SAAS;CAAmB,WAAW;CAAM,CAAC,CAAA,EAAA,6BAAA,WAAA,WAAA,KAAA,EAAA;2CAF1DC,cAAc,mCAAyC,CAAA,EAAA,6BAAA;AA+DxD,IAAA,uCAAe"}
@@ -12,7 +12,7 @@ import { pageHeaderContext } from "./context.js";
12
12
  import { getHeaderOffset } from "./utils.js";
13
13
  import page_header_content_default from "./page-header-content.js";
14
14
  import { LitElement, html } from "lit";
15
- import { state } from "lit/decorators.js";
15
+ import { property, state } from "lit/decorators.js";
16
16
  import { carbonElement } from "@carbon/web-components/es/globals/decorators/carbon-element.js";
17
17
  import { provide } from "@lit/context";
18
18
  //#region src/components/page-header/page-header.ts
@@ -31,15 +31,32 @@ import { provide } from "@lit/context";
31
31
  let CDSPageHeader = class CDSPageHeader extends LitElement {
32
32
  constructor(..._args) {
33
33
  super(..._args);
34
- this.context = {};
34
+ this.fullWidthGrid = false;
35
+ this.narrowGrid = false;
36
+ this.context = {
37
+ fullWidthGrid: this.fullWidthGrid,
38
+ narrowGrid: this.narrowGrid
39
+ };
35
40
  }
36
41
  updated(changedProperties) {
37
42
  super.updated(changedProperties);
38
43
  if (changedProperties.has("context")) if (this.context.disableStickyTabBar) this.classList.add(`c4p--page-header--disable-sticky-tab-bar`);
39
44
  else this.classList.remove(`c4p--page-header--disable-sticky-tab-bar`);
45
+ if (changedProperties.has("fullWidthGrid") || changedProperties.has("narrowGrid")) this.context = {
46
+ ...this.context,
47
+ fullWidthGrid: this.fullWidthGrid,
48
+ narrowGrid: this.narrowGrid
49
+ };
40
50
  }
41
51
  connectedCallback() {
42
52
  super.connectedCallback();
53
+ this.addEventListener(`c4p-page-header-content-actions-registered`, (e) => {
54
+ const { actionsEl } = e.detail;
55
+ if (!actionsEl) return;
56
+ this.actionsObserver?.disconnect();
57
+ this.actionsObserver = this._createActionsObserver();
58
+ this.actionsObserver.observe(actionsEl);
59
+ });
43
60
  const contentElement = this.querySelector(`c4p-page-header-content`);
44
61
  this.resizeObserver = new ResizeObserver((entries) => {
45
62
  const contentEl = entries[0].target.querySelector(`c4p-page-header-content`);
@@ -59,62 +76,81 @@ let CDSPageHeader = class CDSPageHeader extends LitElement {
59
76
  this.resizeObserver.observe(this);
60
77
  const predefinedContentPadding = 24;
61
78
  const totalHeaderOffset = getHeaderOffset(this);
62
- const contentObserver = new IntersectionObserver((entries) => {
79
+ this.contentObserver = new IntersectionObserver((entries) => {
63
80
  entries.forEach((entry) => {
64
- if (!entry.isIntersecting) this.context = {
65
- ...this.context,
66
- fullyCollapsed: true
67
- };
68
- else this.context = {
69
- ...this.context,
70
- fullyCollapsed: false
71
- };
81
+ const fullyCollapsed = !entry.isIntersecting;
82
+ if (this.context.fullyCollapsed !== fullyCollapsed) {
83
+ this.context = {
84
+ ...this.context,
85
+ fullyCollapsed
86
+ };
87
+ this.dispatchEvent(new CustomEvent(`c4p-page-header-fully-collapsed`, {
88
+ bubbles: true,
89
+ composed: true,
90
+ detail: { fullyCollapsed }
91
+ }));
92
+ }
72
93
  });
73
94
  }, {
74
95
  root: null,
75
96
  rootMargin: `${(predefinedContentPadding + totalHeaderOffset + 40) * -1}px 0px 0px 0px`,
76
97
  threshold: .1
77
98
  });
78
- const titleObserver = new IntersectionObserver((entries) => {
99
+ this.titleObserver = new IntersectionObserver((entries) => {
79
100
  entries.forEach((entry) => {
80
- if (!entry.isIntersecting) this.context = {
81
- ...this.context,
82
- titleClipped: true
83
- };
84
- else this.context = {
85
- ...this.context,
86
- titleClipped: false
87
- };
101
+ const titleClipped = !entry.isIntersecting;
102
+ if (this.context.titleClipped !== titleClipped) {
103
+ this.context = {
104
+ ...this.context,
105
+ titleClipped
106
+ };
107
+ this.dispatchEvent(new CustomEvent(`c4p-page-header-title-clipped`, {
108
+ bubbles: true,
109
+ composed: true,
110
+ detail: { titleClipped }
111
+ }));
112
+ }
88
113
  });
89
114
  }, {
90
115
  root: null,
91
116
  rootMargin: `${(predefinedContentPadding + totalHeaderOffset + 40) * -1}px 0px 0px 0px`,
92
117
  threshold: .95
93
118
  });
94
- const actionsObserver = new IntersectionObserver((entries) => {
119
+ this.actionsObserver = this._createActionsObserver();
120
+ if (contentElement) {
121
+ this.contentObserver.observe(contentElement);
122
+ this.titleObserver.observe(contentElement);
123
+ this.actionsObserver.observe(contentElement);
124
+ }
125
+ }
126
+ _createActionsObserver() {
127
+ const totalHeaderOffset = getHeaderOffset(this);
128
+ return new IntersectionObserver((entries) => {
95
129
  entries.forEach((entry) => {
96
- if (!entry.isIntersecting) this.context = {
97
- ...this.context,
98
- contentActionsClipped: true
99
- };
100
- else this.context = {
101
- ...this.context,
102
- contentActionsClipped: false
103
- };
130
+ const contentActionsClipped = !entry.isIntersecting;
131
+ if (this.context.contentActionsClipped !== contentActionsClipped) {
132
+ this.context = {
133
+ ...this.context,
134
+ contentActionsClipped
135
+ };
136
+ this.dispatchEvent(new CustomEvent(`c4p-page-header-content-actions-clipped`, {
137
+ bubbles: true,
138
+ composed: true,
139
+ detail: { contentActionsClipped }
140
+ }));
141
+ }
104
142
  });
105
143
  }, {
106
144
  root: null,
107
145
  rootMargin: `${(totalHeaderOffset + 48 + 18) * -1}px 0px 0px 0px`,
108
146
  threshold: .95
109
147
  });
110
- if (contentElement) {
111
- contentObserver.observe(contentElement);
112
- titleObserver.observe(contentElement);
113
- actionsObserver.observe(contentElement);
114
- }
115
148
  }
116
149
  disconnectedCallback() {
117
150
  this.resizeObserver?.disconnect();
151
+ this.contentObserver?.disconnect();
152
+ this.titleObserver?.disconnect();
153
+ this.actionsObserver?.disconnect();
118
154
  super.disconnectedCallback();
119
155
  }
120
156
  render() {
@@ -124,6 +160,16 @@ let CDSPageHeader = class CDSPageHeader extends LitElement {
124
160
  this.styles = page_header_default$1;
125
161
  }
126
162
  };
163
+ __decorate([property({
164
+ attribute: "full-width-grid",
165
+ type: Boolean,
166
+ reflect: true
167
+ })], CDSPageHeader.prototype, "fullWidthGrid", void 0);
168
+ __decorate([property({
169
+ attribute: "narrow-grid",
170
+ type: Boolean,
171
+ reflect: true
172
+ })], CDSPageHeader.prototype, "narrowGrid", void 0);
127
173
  __decorate([state(), provide({ context: pageHeaderContext })], CDSPageHeader.prototype, "context", void 0);
128
174
  CDSPageHeader = __decorate([carbonElement(`c4p-page-header`)], CDSPageHeader);
129
175
  var page_header_default = CDSPageHeader;
@@ -1 +1 @@
1
- {"version":3,"file":"page-header.js","names":["CDSPageHeaderContent","styles","customElement"],"sources":["../../../src/components/page-header/page-header.ts"],"sourcesContent":["/**\n * @license\n *\n * Copyright IBM Corp. 2025, 2025\n *\n * This source code is licensed under the Apache-2.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport { LitElement, html } from 'lit';\nimport { state } from 'lit/decorators.js';\nimport { provide } from '@lit/context';\nimport { prefix } from '../../globals/settings';\nimport styles from './page-header.scss?lit';\nimport { carbonElement as customElement } from '@carbon/web-components/es/globals/decorators/carbon-element.js';\nimport { pageHeaderContext } from './context';\nimport { getHeaderOffset } from './utils';\nimport CDSPageHeaderContent from './page-header-content';\n\nexport interface pageHeaderContextType {\n breadcrumbOffset?: number;\n headerOffset?: number;\n fullyCollapsed?: boolean;\n titleClipped?: boolean;\n contentActionsClipped?: boolean;\n root?: CDSPageHeader | null;\n withContent?: boolean;\n disableStickyTabBar?: boolean;\n}\n\n/**\n * Page header.\n * @element c4p-page-header\n */\n@customElement(`${prefix}-page-header`)\nclass CDSPageHeader extends LitElement {\n @state()\n @provide({ context: pageHeaderContext })\n context: pageHeaderContextType = {};\n\n private resizeObserver: ResizeObserver | undefined;\n\n updated(changedProperties: Map<string, any>) {\n super.updated(changedProperties);\n if (changedProperties.has('context')) {\n // Update host class based on disableStickyTabBar\n if (this.context.disableStickyTabBar) {\n this.classList.add(`${prefix}--page-header--disable-sticky-tab-bar`);\n } else {\n this.classList.remove(`${prefix}--page-header--disable-sticky-tab-bar`);\n }\n }\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n const contentElement = this.querySelector(`${prefix}-page-header-content`);\n\n this.resizeObserver = new ResizeObserver((entries) => {\n const pageHeaderElement = entries[0];\n const contentEl = pageHeaderElement.target.querySelector(\n `${prefix}-page-header-content`\n );\n const contentHeight =\n contentEl instanceof CDSPageHeaderContent ? contentEl.scrollHeight : 0;\n const padding =\n contentEl instanceof CDSPageHeaderContent\n ? parseFloat(getComputedStyle(contentEl)?.paddingBlockStart) +\n parseFloat(getComputedStyle(contentEl)?.paddingBlockEnd)\n : 0;\n const totalContentHeight = contentHeight + padding;\n const headerOffset = getHeaderOffset(this);\n const contentPadding = contentEl instanceof CDSPageHeaderContent ? 48 : 0;\n\n this.style.setProperty(\n `--${prefix}-page-header-header-top`,\n `${(Math.round(totalContentHeight - contentPadding) - headerOffset) * -1}px`\n );\n this.style.setProperty(\n `--${prefix}-page-header-breadcrumb-top`,\n `${headerOffset}px`\n );\n this.context = {\n ...this.context,\n breadcrumbOffset: headerOffset,\n headerOffset: (Math.round(totalContentHeight) - headerOffset) * -1,\n root: this,\n withContent: !!contentEl,\n };\n });\n this.resizeObserver.observe(this);\n\n const predefinedContentPadding = 24;\n const totalHeaderOffset = getHeaderOffset(this);\n const contentObserver = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n if (!entry.isIntersecting) {\n this.context = {\n ...this.context,\n fullyCollapsed: true,\n };\n } else {\n this.context = {\n ...this.context,\n fullyCollapsed: false,\n };\n }\n });\n },\n {\n root: null,\n rootMargin: `${(predefinedContentPadding + totalHeaderOffset + 40) * -1}px 0px 0px 0px`,\n threshold: 0.1,\n }\n );\n\n const titleObserver = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n if (!entry.isIntersecting) {\n this.context = {\n ...this.context,\n titleClipped: true,\n };\n } else {\n this.context = {\n ...this.context,\n titleClipped: false,\n };\n }\n });\n },\n {\n root: null,\n rootMargin: `${(predefinedContentPadding + totalHeaderOffset + 40) * -1}px 0px 0px 0px`,\n threshold: 0.95,\n }\n );\n\n const actionsObserver = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n if (!entry.isIntersecting) {\n this.context = {\n ...this.context,\n contentActionsClipped: true,\n };\n } else {\n this.context = {\n ...this.context,\n contentActionsClipped: false,\n };\n }\n });\n },\n {\n root: null,\n // 48 -> breadcrumb bar\n // 18 -> content padding\n rootMargin: `${(totalHeaderOffset + 48 + 18) * -1}px 0px 0px 0px`,\n threshold: 0.95,\n }\n );\n if (contentElement) {\n contentObserver.observe(contentElement);\n titleObserver.observe(contentElement);\n actionsObserver.observe(contentElement);\n }\n }\n\n disconnectedCallback() {\n this.resizeObserver?.disconnect(); // Clean up\n super.disconnectedCallback();\n }\n\n render() {\n return html`<slot></slot>`;\n }\n\n static styles = styles;\n}\n\nexport default CDSPageHeader;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkCA,IAAA,gBAAA,MACM,sBAAsB,WAAW;;;iBAGJ,EAAE;;CAInC,QAAQ,mBAAqC;AAC3C,QAAM,QAAQ,kBAAkB;AAChC,MAAI,kBAAkB,IAAI,UAAU,CAElC,KAAI,KAAK,QAAQ,oBACf,MAAK,UAAU,IAAI,2CAAiD;MAEpE,MAAK,UAAU,OAAO,2CAAiD;;CAK7E,oBAA0B;AACxB,QAAM,mBAAmB;EACzB,MAAM,iBAAiB,KAAK,cAAc,0BAAgC;AAE1E,OAAK,iBAAiB,IAAI,gBAAgB,YAAY;GAEpD,MAAM,YADoB,QAAQ,GACE,OAAO,cACzC,0BACD;GAQD,MAAM,sBANJ,qBAAqBA,8BAAuB,UAAU,eAAe,MAErE,qBAAqBA,8BACjB,WAAW,iBAAiB,UAAU,EAAE,kBAAkB,GAC1D,WAAW,iBAAiB,UAAU,EAAE,gBAAgB,GACxD;GAEN,MAAM,eAAe,gBAAgB,KAAK;GAC1C,MAAM,iBAAiB,qBAAqBA,8BAAuB,KAAK;AAExE,QAAK,MAAM,YACT,gCACA,IAAI,KAAK,MAAM,qBAAqB,eAAe,GAAG,gBAAgB,GAAG,IAC1E;AACD,QAAK,MAAM,YACT,oCACA,GAAG,aAAa,IACjB;AACD,QAAK,UAAU;IACb,GAAG,KAAK;IACR,kBAAkB;IAClB,eAAe,KAAK,MAAM,mBAAmB,GAAG,gBAAgB;IAChE,MAAM;IACN,aAAa,CAAC,CAAC;IAChB;IACD;AACF,OAAK,eAAe,QAAQ,KAAK;EAEjC,MAAM,2BAA2B;EACjC,MAAM,oBAAoB,gBAAgB,KAAK;EAC/C,MAAM,kBAAkB,IAAI,sBACzB,YAAY;AACX,WAAQ,SAAS,UAAU;AACzB,QAAI,CAAC,MAAM,eACT,MAAK,UAAU;KACb,GAAG,KAAK;KACR,gBAAgB;KACjB;QAED,MAAK,UAAU;KACb,GAAG,KAAK;KACR,gBAAgB;KACjB;KAEH;KAEJ;GACE,MAAM;GACN,YAAY,IAAI,2BAA2B,oBAAoB,MAAM,GAAG;GACxE,WAAW;GACZ,CACF;EAED,MAAM,gBAAgB,IAAI,sBACvB,YAAY;AACX,WAAQ,SAAS,UAAU;AACzB,QAAI,CAAC,MAAM,eACT,MAAK,UAAU;KACb,GAAG,KAAK;KACR,cAAc;KACf;QAED,MAAK,UAAU;KACb,GAAG,KAAK;KACR,cAAc;KACf;KAEH;KAEJ;GACE,MAAM;GACN,YAAY,IAAI,2BAA2B,oBAAoB,MAAM,GAAG;GACxE,WAAW;GACZ,CACF;EAED,MAAM,kBAAkB,IAAI,sBACzB,YAAY;AACX,WAAQ,SAAS,UAAU;AACzB,QAAI,CAAC,MAAM,eACT,MAAK,UAAU;KACb,GAAG,KAAK;KACR,uBAAuB;KACxB;QAED,MAAK,UAAU;KACb,GAAG,KAAK;KACR,uBAAuB;KACxB;KAEH;KAEJ;GACE,MAAM;GAGN,YAAY,IAAI,oBAAoB,KAAK,MAAM,GAAG;GAClD,WAAW;GACZ,CACF;AACD,MAAI,gBAAgB;AAClB,mBAAgB,QAAQ,eAAe;AACvC,iBAAc,QAAQ,eAAe;AACrC,mBAAgB,QAAQ,eAAe;;;CAI3C,uBAAuB;AACrB,OAAK,gBAAgB,YAAY;AACjC,QAAM,sBAAsB;;CAG9B,SAAS;AACP,SAAO,IAAI;;;gBAGGC;;;YAhJf,OAAO,EACP,QAAQ,EAAE,SAAS,mBAAmB,CAAC,CAAA,EAAA,cAAA,WAAA,WAAA,KAAA,EAAA;4BAHzCC,cAAc,kBAAwB,CAAA,EAAA,cAAA;AAqJvC,IAAA,sBAAe"}
1
+ {"version":3,"file":"page-header.js","names":["CDSPageHeaderContent","styles","customElement"],"sources":["../../../src/components/page-header/page-header.ts"],"sourcesContent":["/**\n * @license\n *\n * Copyright IBM Corp. 2025, 2025\n *\n * This source code is licensed under the Apache-2.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport { LitElement, html } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { provide } from '@lit/context';\nimport { prefix } from '../../globals/settings';\nimport styles from './page-header.scss?lit';\nimport { carbonElement as customElement } from '@carbon/web-components/es/globals/decorators/carbon-element.js';\nimport { pageHeaderContext } from './context';\nimport { getHeaderOffset } from './utils';\nimport CDSPageHeaderContent from './page-header-content';\n\nexport interface pageHeaderContextType {\n breadcrumbOffset?: number;\n headerOffset?: number;\n fullyCollapsed?: boolean;\n titleClipped?: boolean;\n contentActionsClipped?: boolean;\n root?: CDSPageHeader | null;\n withContent?: boolean;\n disableStickyTabBar?: boolean;\n fullWidthGrid?: boolean;\n narrowGrid?: boolean;\n}\n\n/**\n * Page header.\n * @element c4p-page-header\n */\n@customElement(`${prefix}-page-header`)\nclass CDSPageHeader extends LitElement {\n /**\n * Set to `true` to use a full-width Carbon CSS grid (no max-width cap).\n */\n @property({ attribute: 'full-width-grid', type: Boolean, reflect: true })\n fullWidthGrid = false;\n\n /**\n * Set to `true` to use the Carbon narrow grid mode (content aligns to\n * the gutter edge).\n */\n @property({ attribute: 'narrow-grid', type: Boolean, reflect: true })\n narrowGrid = false;\n\n @state()\n @provide({ context: pageHeaderContext })\n context: pageHeaderContextType = {\n fullWidthGrid: this.fullWidthGrid,\n narrowGrid: this.narrowGrid,\n };\n\n private resizeObserver: ResizeObserver | undefined;\n private contentObserver: IntersectionObserver | undefined;\n private titleObserver: IntersectionObserver | undefined;\n private actionsObserver: IntersectionObserver | undefined;\n\n updated(changedProperties: Map<string, any>) {\n super.updated(changedProperties);\n if (changedProperties.has('context')) {\n // Update host class based on disableStickyTabBar\n if (this.context.disableStickyTabBar) {\n this.classList.add(`${prefix}--page-header--disable-sticky-tab-bar`);\n } else {\n this.classList.remove(`${prefix}--page-header--disable-sticky-tab-bar`);\n }\n }\n if (\n changedProperties.has('fullWidthGrid') ||\n changedProperties.has('narrowGrid')\n ) {\n this.context = {\n ...this.context,\n fullWidthGrid: this.fullWidthGrid,\n narrowGrid: this.narrowGrid,\n };\n }\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n // Listen for the page-actions container registration from page-header-content\n this.addEventListener(\n `${prefix}-page-header-content-actions-registered`,\n (e: Event) => {\n const { actionsEl } = (e as CustomEvent).detail as {\n actionsEl: HTMLElement;\n };\n if (!actionsEl) {\n return;\n }\n // Re-wire the actionsObserver to the specific page-actions element\n this.actionsObserver?.disconnect();\n this.actionsObserver = this._createActionsObserver();\n this.actionsObserver.observe(actionsEl);\n }\n );\n\n const contentElement = this.querySelector(`${prefix}-page-header-content`);\n\n this.resizeObserver = new ResizeObserver((entries) => {\n const pageHeaderElement = entries[0];\n const contentEl = pageHeaderElement.target.querySelector(\n `${prefix}-page-header-content`\n );\n const contentHeight =\n contentEl instanceof CDSPageHeaderContent ? contentEl.scrollHeight : 0;\n const padding =\n contentEl instanceof CDSPageHeaderContent\n ? parseFloat(getComputedStyle(contentEl)?.paddingBlockStart) +\n parseFloat(getComputedStyle(contentEl)?.paddingBlockEnd)\n : 0;\n const totalContentHeight = contentHeight + padding;\n const headerOffset = getHeaderOffset(this);\n const contentPadding = contentEl instanceof CDSPageHeaderContent ? 48 : 0;\n\n this.style.setProperty(\n `--${prefix}-page-header-header-top`,\n `${(Math.round(totalContentHeight - contentPadding) - headerOffset) * -1}px`\n );\n this.style.setProperty(\n `--${prefix}-page-header-breadcrumb-top`,\n `${headerOffset}px`\n );\n this.context = {\n ...this.context,\n breadcrumbOffset: headerOffset,\n headerOffset: (Math.round(totalContentHeight) - headerOffset) * -1,\n root: this,\n withContent: !!contentEl,\n };\n });\n this.resizeObserver.observe(this);\n\n const predefinedContentPadding = 24;\n const totalHeaderOffset = getHeaderOffset(this);\n this.contentObserver = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n const fullyCollapsed = !entry.isIntersecting;\n if (this.context.fullyCollapsed !== fullyCollapsed) {\n this.context = { ...this.context, fullyCollapsed };\n this.dispatchEvent(\n new CustomEvent(`${prefix}-page-header-fully-collapsed`, {\n bubbles: true,\n composed: true,\n detail: { fullyCollapsed },\n })\n );\n }\n });\n },\n {\n root: null,\n rootMargin: `${(predefinedContentPadding + totalHeaderOffset + 40) * -1}px 0px 0px 0px`,\n threshold: 0.1,\n }\n );\n\n this.titleObserver = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n const titleClipped = !entry.isIntersecting;\n if (this.context.titleClipped !== titleClipped) {\n this.context = { ...this.context, titleClipped };\n this.dispatchEvent(\n new CustomEvent(`${prefix}-page-header-title-clipped`, {\n bubbles: true,\n composed: true,\n detail: { titleClipped },\n })\n );\n }\n });\n },\n {\n root: null,\n rootMargin: `${(predefinedContentPadding + totalHeaderOffset + 40) * -1}px 0px 0px 0px`,\n threshold: 0.95,\n }\n );\n\n this.actionsObserver = this._createActionsObserver();\n if (contentElement) {\n this.contentObserver.observe(contentElement);\n this.titleObserver.observe(contentElement);\n // actionsObserver starts on contentElement; once page-header-content fires\n // its registration event, it is rewired to the specific page-actions element.\n this.actionsObserver.observe(contentElement);\n }\n }\n\n private _createActionsObserver(): IntersectionObserver {\n const totalHeaderOffset = getHeaderOffset(this);\n return new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n const contentActionsClipped = !entry.isIntersecting;\n if (this.context.contentActionsClipped !== contentActionsClipped) {\n this.context = { ...this.context, contentActionsClipped };\n this.dispatchEvent(\n new CustomEvent(`${prefix}-page-header-content-actions-clipped`, {\n bubbles: true,\n composed: true,\n detail: { contentActionsClipped },\n })\n );\n }\n });\n },\n {\n root: null,\n // 48 -> breadcrumb bar height\n // 18 -> content padding\n rootMargin: `${(totalHeaderOffset + 48 + 18) * -1}px 0px 0px 0px`,\n threshold: 0.95,\n }\n );\n }\n\n disconnectedCallback() {\n this.resizeObserver?.disconnect();\n this.contentObserver?.disconnect();\n this.titleObserver?.disconnect();\n this.actionsObserver?.disconnect();\n super.disconnectedCallback();\n }\n\n render() {\n return html`<slot></slot>`;\n }\n\n static styles = styles;\n}\n\nexport default CDSPageHeader;\n"],"mappings":"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"}