@sankhyatronics/sankhya-cms 0.1.18 → 0.3.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 (216) hide show
  1. package/custom-elements.json +11634 -3153
  2. package/dist/attention-panel/index.js +2 -2
  3. package/dist/bar-chart/index.js +2 -2
  4. package/dist/bento-grid/index.d.ts +33 -1
  5. package/dist/bento-grid/index.js +4 -3
  6. package/dist/booking/index.d.ts +309 -0
  7. package/dist/booking/index.js +20 -0
  8. package/dist/booking/index.js.map +1 -0
  9. package/dist/card/index.d.ts +3 -4
  10. package/dist/card/index.js +2 -2
  11. package/dist/carousel/index.d.ts +20 -6
  12. package/dist/carousel/index.js +3 -3
  13. package/dist/chip/index.js +2 -2
  14. package/dist/{chunk-JQY2G4QK.js → chunk-2GTR37PU.js} +2 -2
  15. package/dist/chunk-2GTR37PU.js.map +1 -0
  16. package/dist/{chunk-FLY7TNRT.js → chunk-2HMOX253.js} +128 -25
  17. package/dist/chunk-2HMOX253.js.map +1 -0
  18. package/dist/{chunk-DH53HZPB.js → chunk-37KFBKPD.js} +32 -4
  19. package/dist/chunk-37KFBKPD.js.map +1 -0
  20. package/dist/{chunk-ALI26WOB.js → chunk-4XPKKYVZ.js} +54 -15
  21. package/dist/chunk-4XPKKYVZ.js.map +1 -0
  22. package/dist/chunk-535QAZ6A.js +236 -0
  23. package/dist/chunk-535QAZ6A.js.map +1 -0
  24. package/dist/{chunk-AKJQ345O.js → chunk-5AWGZQWU.js} +2 -2
  25. package/dist/chunk-6OZKZG5J.js +300 -0
  26. package/dist/chunk-6OZKZG5J.js.map +1 -0
  27. package/dist/chunk-AYNT7G3J.js +805 -0
  28. package/dist/chunk-AYNT7G3J.js.map +1 -0
  29. package/dist/chunk-BEWX3E6P.js +32 -0
  30. package/dist/chunk-BEWX3E6P.js.map +1 -0
  31. package/dist/chunk-CZUGPKXV.js +275 -0
  32. package/dist/chunk-CZUGPKXV.js.map +1 -0
  33. package/dist/{chunk-LEXZKGQX.js → chunk-DJFWZOZM.js} +107 -11
  34. package/dist/chunk-DJFWZOZM.js.map +1 -0
  35. package/dist/chunk-DPANTC3O.js +1714 -0
  36. package/dist/chunk-DPANTC3O.js.map +1 -0
  37. package/dist/chunk-EKZFFY45.js +426 -0
  38. package/dist/chunk-EKZFFY45.js.map +1 -0
  39. package/dist/chunk-ER7MCPDV.js +7 -0
  40. package/dist/chunk-ER7MCPDV.js.map +1 -0
  41. package/dist/chunk-EW2RK5Y6.js +383 -0
  42. package/dist/chunk-EW2RK5Y6.js.map +1 -0
  43. package/dist/{chunk-BLQV2YMO.js → chunk-EZOKT7NJ.js} +2 -2
  44. package/dist/chunk-FF2LWEF3.js +386 -0
  45. package/dist/chunk-FF2LWEF3.js.map +1 -0
  46. package/dist/chunk-FOUK3NHR.js +7 -0
  47. package/dist/chunk-FOUK3NHR.js.map +1 -0
  48. package/dist/chunk-GB4NGCZI.js +181 -0
  49. package/dist/chunk-GB4NGCZI.js.map +1 -0
  50. package/dist/{chunk-7NLZND6Q.js → chunk-GOFSMD6W.js} +35 -11
  51. package/dist/chunk-GOFSMD6W.js.map +1 -0
  52. package/dist/{chunk-6D6ROU7X.js → chunk-IGMVF3KK.js} +2 -2
  53. package/dist/{chunk-INMSEYT6.js → chunk-IVPVYVWG.js} +2 -2
  54. package/dist/chunk-JURCF4OD.js +381 -0
  55. package/dist/chunk-JURCF4OD.js.map +1 -0
  56. package/dist/{chunk-FZ36KL73.js → chunk-KZ7PMFWS.js} +11 -1
  57. package/dist/chunk-KZ7PMFWS.js.map +1 -0
  58. package/dist/{chunk-EMCQBT3S.js → chunk-LO6TZBGD.js} +129 -35
  59. package/dist/chunk-LO6TZBGD.js.map +1 -0
  60. package/dist/chunk-MFRGAT6D.js +860 -0
  61. package/dist/chunk-MFRGAT6D.js.map +1 -0
  62. package/dist/chunk-MIBVQXRU.js +1098 -0
  63. package/dist/chunk-MIBVQXRU.js.map +1 -0
  64. package/dist/{chunk-35TX3AOA.js → chunk-NABSRUXG.js} +2 -2
  65. package/dist/{chunk-R5G6KFTJ.js → chunk-NXKDZWS7.js} +44 -6
  66. package/dist/chunk-NXKDZWS7.js.map +1 -0
  67. package/dist/{chunk-KMU6ABQF.js → chunk-NXUS2CH7.js} +14 -1
  68. package/dist/chunk-NXUS2CH7.js.map +1 -0
  69. package/dist/{chunk-GJO3RGOB.js → chunk-OCPGOLVF.js} +56 -11
  70. package/dist/chunk-OCPGOLVF.js.map +1 -0
  71. package/dist/chunk-OEOE6IFY.js +628 -0
  72. package/dist/chunk-OEOE6IFY.js.map +1 -0
  73. package/dist/{chunk-SMLR736E.js → chunk-PV6OCXXN.js} +2 -2
  74. package/dist/chunk-PV6OCXXN.js.map +1 -0
  75. package/dist/chunk-Q66CJO3P.js +534 -0
  76. package/dist/chunk-Q66CJO3P.js.map +1 -0
  77. package/dist/{chunk-MG2VTZA4.js → chunk-QS3ANOWN.js} +2 -2
  78. package/dist/{chunk-ZN4LIKVG.js → chunk-QSJ543V2.js} +2 -2
  79. package/dist/chunk-QSJ543V2.js.map +1 -0
  80. package/dist/{chunk-FML6AG2V.js → chunk-RANC3OI6.js} +2 -2
  81. package/dist/chunk-T4BIN37Q.js +32 -0
  82. package/dist/chunk-T4BIN37Q.js.map +1 -0
  83. package/dist/{chunk-YVTFQHVY.js → chunk-TEAZZPDQ.js} +2 -2
  84. package/dist/chunk-TJK55CJ2.js +49 -0
  85. package/dist/chunk-TJK55CJ2.js.map +1 -0
  86. package/dist/chunk-UKIVLF7S.js +32 -0
  87. package/dist/chunk-UKIVLF7S.js.map +1 -0
  88. package/dist/chunk-V4R7PYP5.js +905 -0
  89. package/dist/chunk-V4R7PYP5.js.map +1 -0
  90. package/dist/{chunk-AG2COC64.js → chunk-VVYQ2DDS.js} +2 -2
  91. package/dist/chunk-WAMOAAMN.js +16 -0
  92. package/dist/chunk-WAMOAAMN.js.map +1 -0
  93. package/dist/chunk-WAYHHL4J.js +1234 -0
  94. package/dist/chunk-WAYHHL4J.js.map +1 -0
  95. package/dist/{chunk-YQ42EBK5.js → chunk-WH6HE6SY.js} +10 -4
  96. package/dist/chunk-WH6HE6SY.js.map +1 -0
  97. package/dist/chunk-XP6DI3VY.js +180 -0
  98. package/dist/chunk-XP6DI3VY.js.map +1 -0
  99. package/dist/{chunk-5EBWMPJS.js → chunk-XS6LNTSH.js} +76 -14
  100. package/dist/chunk-XS6LNTSH.js.map +1 -0
  101. package/dist/{chunk-WT4OATGP.js → chunk-ZKFCDVB4.js} +16 -7
  102. package/dist/chunk-ZKFCDVB4.js.map +1 -0
  103. package/dist/cms-theme.css +29 -0
  104. package/dist/contact-form/index.d.ts +220 -0
  105. package/dist/contact-form/index.js +16 -0
  106. package/dist/contact-form/index.js.map +1 -0
  107. package/dist/content-block/index.d.ts +39 -4
  108. package/dist/content-block/index.js +8 -4
  109. package/dist/cookie-consent/index.d.ts +60 -12
  110. package/dist/cookie-consent/index.js +3 -2
  111. package/dist/date-tile/index.js +2 -2
  112. package/dist/dropdown/index.d.ts +29 -11
  113. package/dist/dropdown/index.js +4 -2
  114. package/dist/feature-split/index.d.ts +6 -1
  115. package/dist/feature-split/index.js +5 -4
  116. package/dist/features-section/index.d.ts +53 -9
  117. package/dist/features-section/index.js +6 -5
  118. package/dist/flow/index.d.ts +35 -0
  119. package/dist/flow/index.js +9 -0
  120. package/dist/flow/index.js.map +1 -0
  121. package/dist/footer/index.d.ts +13 -0
  122. package/dist/footer/index.js +2 -2
  123. package/dist/header/index.d.ts +135 -16
  124. package/dist/header/index.js +3 -2
  125. package/dist/hero/index.d.ts +92 -8
  126. package/dist/hero/index.js +6 -3
  127. package/dist/icon-button/index.d.ts +7 -7
  128. package/dist/icon-button/index.js +2 -2
  129. package/dist/index.d.ts +12 -3
  130. package/dist/index.js +121 -47
  131. package/dist/items-accordion/index.d.ts +9 -0
  132. package/dist/items-accordion/index.js +4 -3
  133. package/dist/kpi-card/index.js +2 -2
  134. package/dist/markdown/index.d.ts +19 -2
  135. package/dist/markdown/index.js +3 -2
  136. package/dist/mega-menu/index.d.ts +95 -7
  137. package/dist/mega-menu/index.js +7 -2
  138. package/dist/menu-grid/index.d.ts +2 -3
  139. package/dist/menu-grid/index.js +2 -2
  140. package/dist/menu-grid-item/index.d.ts +6 -8
  141. package/dist/menu-grid-item/index.js +2 -2
  142. package/dist/menu-item/index.d.ts +11 -7
  143. package/dist/menu-item/index.js +3 -2
  144. package/dist/plan-cards/index.d.ts +69 -0
  145. package/dist/plan-cards/index.js +13 -0
  146. package/dist/plan-cards/index.js.map +1 -0
  147. package/dist/product-nav/index.d.ts +127 -0
  148. package/dist/product-nav/index.js +11 -0
  149. package/dist/product-nav/index.js.map +1 -0
  150. package/dist/promo-banner/index.d.ts +42 -4
  151. package/dist/promo-banner/index.js +6 -3
  152. package/dist/quote-dialog/index.d.ts +174 -0
  153. package/dist/quote-dialog/index.js +22 -0
  154. package/dist/quote-dialog/index.js.map +1 -0
  155. package/dist/schema/index.d.ts +11 -0
  156. package/dist/schema/index.js +9 -0
  157. package/dist/schema/index.js.map +1 -1
  158. package/dist/screenshot-tour/index.d.ts +54 -0
  159. package/dist/screenshot-tour/index.js +9 -0
  160. package/dist/screenshot-tour/index.js.map +1 -0
  161. package/dist/section/index.d.ts +3 -0
  162. package/dist/section/index.js +3 -3
  163. package/dist/segmented-control/index.js +2 -2
  164. package/dist/select/index.js +2 -2
  165. package/dist/shared/styles.d.ts +7 -1
  166. package/dist/shared/styles.js +3 -1
  167. package/dist/stats/index.js +2 -2
  168. package/dist/steps/index.d.ts +45 -0
  169. package/dist/steps/index.js +11 -0
  170. package/dist/steps/index.js.map +1 -0
  171. package/dist/tag-strip/index.d.ts +33 -0
  172. package/dist/tag-strip/index.js +9 -0
  173. package/dist/tag-strip/index.js.map +1 -0
  174. package/dist/testimonials/index.d.ts +9 -1
  175. package/dist/testimonials/index.js +3 -3
  176. package/dist/tooltip/index.js +2 -2
  177. package/package.json +38 -2
  178. package/dist/chunk-5EBWMPJS.js.map +0 -1
  179. package/dist/chunk-76AVBQUA.js +0 -252
  180. package/dist/chunk-76AVBQUA.js.map +0 -1
  181. package/dist/chunk-7NLZND6Q.js.map +0 -1
  182. package/dist/chunk-ALI26WOB.js.map +0 -1
  183. package/dist/chunk-BMHMNXIA.js +0 -158
  184. package/dist/chunk-BMHMNXIA.js.map +0 -1
  185. package/dist/chunk-DH53HZPB.js.map +0 -1
  186. package/dist/chunk-EMCQBT3S.js.map +0 -1
  187. package/dist/chunk-FLY7TNRT.js.map +0 -1
  188. package/dist/chunk-FZ36KL73.js.map +0 -1
  189. package/dist/chunk-GJO3RGOB.js.map +0 -1
  190. package/dist/chunk-J6EO4R73.js +0 -633
  191. package/dist/chunk-J6EO4R73.js.map +0 -1
  192. package/dist/chunk-JKBWZLG4.js +0 -348
  193. package/dist/chunk-JKBWZLG4.js.map +0 -1
  194. package/dist/chunk-JQY2G4QK.js.map +0 -1
  195. package/dist/chunk-KMU6ABQF.js.map +0 -1
  196. package/dist/chunk-LEXZKGQX.js.map +0 -1
  197. package/dist/chunk-MSSH3HFK.js +0 -205
  198. package/dist/chunk-MSSH3HFK.js.map +0 -1
  199. package/dist/chunk-R5G6KFTJ.js.map +0 -1
  200. package/dist/chunk-SMLR736E.js.map +0 -1
  201. package/dist/chunk-VWS53WY4.js +0 -157
  202. package/dist/chunk-VWS53WY4.js.map +0 -1
  203. package/dist/chunk-WT4OATGP.js.map +0 -1
  204. package/dist/chunk-XWB4CKDU.js +0 -708
  205. package/dist/chunk-XWB4CKDU.js.map +0 -1
  206. package/dist/chunk-YQ42EBK5.js.map +0 -1
  207. package/dist/chunk-ZN4LIKVG.js.map +0 -1
  208. /package/dist/{chunk-AKJQ345O.js.map → chunk-5AWGZQWU.js.map} +0 -0
  209. /package/dist/{chunk-BLQV2YMO.js.map → chunk-EZOKT7NJ.js.map} +0 -0
  210. /package/dist/{chunk-6D6ROU7X.js.map → chunk-IGMVF3KK.js.map} +0 -0
  211. /package/dist/{chunk-INMSEYT6.js.map → chunk-IVPVYVWG.js.map} +0 -0
  212. /package/dist/{chunk-35TX3AOA.js.map → chunk-NABSRUXG.js.map} +0 -0
  213. /package/dist/{chunk-MG2VTZA4.js.map → chunk-QS3ANOWN.js.map} +0 -0
  214. /package/dist/{chunk-FML6AG2V.js.map → chunk-RANC3OI6.js.map} +0 -0
  215. /package/dist/{chunk-YVTFQHVY.js.map → chunk-TEAZZPDQ.js.map} +0 -0
  216. /package/dist/{chunk-AG2COC64.js.map → chunk-VVYQ2DDS.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/product-nav/ProductNav.ts"],"sourcesContent":["import { LitElement, css, html, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\n\nimport { controlBaseStyles, fontFamilyStyles } from '../shared/styles';\nimport { externalLinkAttrs, externalLinkExtras } from '../shared/external-link';\n\nexport interface ProductNavLink {\n label: string;\n /** An in-page anchor, e.g. `#features`. A link to another site (e.g. the docs) opens in a new tab, with the ↗ icon. */\n href: string;\n}\n\n/**\n * A product sub-navigation bar for a product page, shown under the site header: a lockup (the product\n * icon, a prefix and a name, with a tagline under it), in-page section links, an optional site-menu\n * button and an optional external button.\n *\n * The lockup is one link (icon, wordmark, rule and tagline) to `brand-href`.\n *\n * The link whose section is in view gets `aria-current=\"true\"`, found with an IntersectionObserver\n * on the sections the `#anchor` links point at. On phones the links move to their own row and scroll\n * sideways inside the bar. `sticky` pins the bar to the top of the viewport; set\n * `--st-product-nav-top` to the height of a fixed site header above it.\n *\n * `embedded` drops the bar's own background, rule, shadow and sticky positioning, so it fills the\n * row of a host, e.g. the `slot=\"context\"` of `st-header` (its context mode). Desktop: lockup, links\n * centred, site-menu button and action pill at the right, vertically centred. Phones: lockup (wordmark\n * 18px, icon 32px, then 28px under 480px; tagline 9px under 480px and still shown), then a\n * sideways-scrolling links row, then a compact action pill.\n *\n * `site-menu-label` adds a 44px hamburger button before the action pill. Clicking it dispatches\n * `product-nav-site-menu`, which the host `st-header` answers by opening its site menu. While that menu\n * is open the host sets `site-menu-open`, which is reflected to the button's `aria-expanded`.\n *\n * `scroll-spy` marks the link for the section currently in view with `aria-current=\"location\"` and\n * an active style (accent colour and a 2px underline). The section is the one whose top is nearest\n * the top of the viewport at or above a 64px line; none is marked while the page is above the first\n * section.\n *\n * @fires product-nav-site-menu - The site-menu button was clicked. Detail: `{ trigger }`, the button itself, so the host can return focus to it. Bubbles, composed.\n * @attr icon - Product icon image URL, shown in the brand link before the wordmark (40px; 32px, then 28px under 480px, when `embedded`).\n * @attr icon-dark - Dark-theme icon image URL, shown on `:root.dark` in place of `icon`. Needs `icon`.\n * @attr label - Accessible name of the `<nav>` (e.g. `T-pilot`). Default: the brand prefix and name (e.g. `T-pilot`).\n * @attr brand-href - Target of the brand link (icon and wordmark). Default `#top`.\n * @attr site-menu-label - Accessible name of the site-menu button (a hamburger before the action pill). Empty (default): no button.\n * @attr site-menu-open - Reflected. True while the host header's site menu is open, which sets the button's `aria-expanded`. Set by the host header, never from outside.\n * @attr embedded - Fills the host row: no sticky positioning, background, rule or shadow of its own.\n * @attr scroll-spy - Marks the link for the section in view (`aria-current=\"location\"`).\n * @cssprop --st-product-nav-top - The `top` offset of a sticky bar (default `0px`).\n * @cssprop --st-product-nav-z - The `z-index` of a sticky bar (default `90`, under st-header's 100 so its open mega panel paints above).\n * @cssprop --st-product-nav-border - Colour of the bottom rule (default `--st-cms-primary-100`).\n * @csspart nav - The `<nav>` landmark.\n * @csspart lockup - The wrapper of the brand link.\n * @csspart brand - The brand link (icon, wordmark, rule and tagline).\n * @csspart icon - The product icon image (one, or two when `icon-dark` is set).\n * @csspart links - The list of section links.\n * @csspart link - One section link.\n * @csspart site-menu - The site-menu button.\n * @csspart action - The external button.\n */\n@customElement('st-product-nav')\nexport class ProductNav extends LitElement {\n static styles = css`\n ${controlBaseStyles}\n /* fontFamilyStyles is a bare declaration: it must sit inside a rule, or it swallows the next one. */\n :host {\n ${fontFamilyStyles}\n }\n\n /* The bar is exactly 64px tall on desktop (the bottom rule is an inset shadow, so it adds no height). */\n :host {\n display: block;\n box-sizing: border-box;\n background: var(--st-color-surface);\n box-shadow: inset 0 -1px 0 var(--st-product-nav-border, var(--st-cms-primary-100));\n }\n\n /* Below st-header (z-index 100) and its open mega panel, which both sit in the header's stacking context. */\n :host([sticky]:not([embedded])) {\n position: sticky;\n top: var(--st-product-nav-top, 0px);\n z-index: var(--st-product-nav-z, 90);\n }\n\n .bar {\n display: flex;\n align-items: center;\n gap: var(--st-space-24);\n box-sizing: border-box;\n max-width: var(--st-cms-container-max);\n height: 64px;\n margin: 0 auto;\n padding: 0 var(--st-space-24);\n }\n\n .brand {\n display: inline-flex;\n flex: none;\n align-items: center;\n gap: var(--pn-brand-gap, 12px);\n min-height: 44px;\n color: inherit;\n text-decoration: none;\n }\n\n /* The product icon before the lockup. A fixed square that never shrinks; the default image-rendering keeps an SVG crisp. */\n .icon {\n flex: none;\n width: var(--pn-icon-size, 40px);\n height: var(--pn-icon-size, 40px);\n object-fit: contain;\n }\n\n /* Light and dark icon per the site's theme: the dark one shows on :root.dark (see --st-theme-*-display). */\n .theme-light {\n display: var(--st-theme-light-display, inline-block);\n }\n\n .theme-dark {\n display: var(--st-theme-dark-display, none);\n }\n\n /* The lockup wrapper around the brand link. The icon size and the gap after the icon are variables,\n which the embedded phone layout overrides. */\n .lockup {\n display: inline-flex;\n align-items: center;\n --pn-icon-size: 40px;\n --pn-brand-gap: 12px;\n }\n\n /* The text column: the wordmark, the rule and the tagline. */\n .brand-text {\n display: flex;\n flex-direction: column;\n min-width: 0;\n }\n\n .wordmark {\n display: inline-block;\n font-size: 24px;\n font-weight: var(--st-font-weight-bold);\n line-height: 1;\n letter-spacing: -0.01em;\n }\n\n .prefix {\n color: var(--st-cms-accent-text, var(--st-cms-brand-navy));\n }\n\n .name {\n color: var(--st-cms-brand-azure);\n }\n\n /* The 3px azure bar under the wordmark, as wide as the lockup's tagline. */\n .rule {\n display: block;\n height: 3px;\n margin: 4px 0;\n border-radius: 2px;\n background: var(--st-cms-brand-azure);\n }\n\n .tagline {\n font-size: 10px;\n font-weight: var(--st-font-weight-semibold);\n letter-spacing: 0.04em;\n line-height: 1;\n color: var(--st-cms-accent-text, var(--st-cms-brand-navy));\n }\n\n .brand:focus-visible,\n .links a:focus-visible,\n .action:focus-visible,\n .site-menu:focus-visible {\n outline: var(--st-focus-ring);\n outline-offset: 2px;\n }\n\n .links {\n display: flex;\n flex: 1 1 auto;\n align-items: center;\n gap: var(--st-space-4);\n min-width: 0;\n margin: 0;\n padding: 0;\n list-style: none;\n overflow-x: auto;\n scrollbar-width: thin;\n }\n\n .links a {\n /* Positioned, so the visually hidden \"(opens in new tab)\" of an external link stays inside the link\n instead of widening the page past the sideways-scrolling row. */\n position: relative;\n display: inline-flex;\n align-items: center;\n box-sizing: border-box;\n min-height: 44px;\n padding: 10px 12px;\n border-radius: var(--st-radius-xs);\n color: var(--st-cms-text-strong, var(--st-cms-navy));\n font-size: 15px;\n font-weight: 500;\n line-height: 1.2;\n text-decoration: none;\n white-space: nowrap;\n transition: background-color 0.2s ease;\n }\n\n .links a:hover {\n background: var(--st-cms-primary-100);\n }\n\n /* The section in view: brand-navy text with an azure underline. */\n .links a[aria-current='true'] {\n color: var(--st-cms-accent-text, var(--st-cms-brand-navy));\n font-weight: var(--st-font-weight-semibold);\n box-shadow: inset 0 -3px 0 var(--st-cms-brand-azure);\n }\n\n /* The section the scroll spy marks: accent text with a 2px underline. */\n .links a[aria-current='location'] {\n color: var(--st-cms-accent-text, var(--st-cms-brand-navy));\n font-weight: var(--st-font-weight-semibold);\n box-shadow: inset 0 -2px 0 var(--st-cms-brand-azure);\n }\n\n /* embedded: the row of a host header, not a bar of its own. The host stretches to the free width\n of the header's row; the inner row has no container width, margin or padding of its own, so it\n lines up with the header's padding. */\n /* A flex box, so the inner row is vertically centred in the header's row (a percentage height on\n the row alone does not resolve here). */\n :host([embedded]) {\n display: flex;\n align-items: center;\n flex: 1 1 auto;\n min-width: 0;\n height: 100%;\n background: transparent;\n box-shadow: none;\n }\n\n /* The <nav> (and the row inside it) fill the flex host, so the links take the free space and the\n pill sits at the end. */\n :host([embedded]) nav {\n display: flex;\n flex: 1 1 auto;\n min-width: 0;\n }\n\n :host([embedded]) .bar {\n box-sizing: border-box;\n flex: 1 1 auto;\n min-width: 0;\n align-items: center;\n gap: 24px;\n width: 100%;\n max-width: none;\n height: auto;\n margin: 0;\n padding: 0;\n }\n\n /* Links take the space between the lockup and the pill; they scroll inside it if they do not fit. */\n :host([embedded]) .links {\n flex: 1 1 auto;\n justify-content: center;\n min-width: 0;\n }\n\n :host([embedded]) .links > li {\n flex: none;\n }\n\n :host([embedded]) .links a {\n min-height: 44px;\n }\n\n :host([embedded]) .action {\n flex: none;\n margin-left: 0;\n }\n\n /* The short label of the action pill, shown on phones when the action-short-label attribute is set. */\n .action-short {\n display: none;\n }\n\n .action {\n display: inline-flex;\n flex: none;\n align-items: center;\n gap: var(--st-space-8);\n box-sizing: border-box;\n min-height: 44px;\n margin-left: auto;\n padding: 0 var(--st-space-20);\n border-radius: var(--st-radius-full);\n background: var(--st-cms-brand-navy);\n color: var(--st-cms-on-dark);\n font-size: 15px;\n font-weight: var(--st-font-weight-semibold);\n text-decoration: none;\n white-space: nowrap;\n }\n\n .action svg {\n flex: none;\n width: 16px;\n height: 16px;\n }\n\n /* The site-menu button: a 44px round, outlined hamburger before the action pill. Shown at every width. */\n .site-menu {\n display: inline-flex;\n flex: none;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n width: 44px;\n height: 44px;\n margin: 0;\n padding: 0;\n border: 1px solid var(--st-color-border);\n border-radius: 9999px;\n background: transparent;\n color: var(--st-cms-text-strong, currentColor);\n cursor: pointer;\n }\n\n .site-menu:hover {\n background: var(--st-color-hover);\n }\n\n .site-menu svg {\n flex: none;\n width: 20px;\n height: 20px;\n }\n\n @media (max-width: 768px) {\n .bar {\n flex-wrap: wrap;\n height: auto;\n gap: var(--st-space-12) var(--st-space-16);\n padding-top: var(--st-space-8);\n padding-bottom: var(--st-space-8);\n }\n\n .links {\n order: 3;\n flex: 1 0 100%;\n width: 100%;\n /* One row that scrolls sideways inside the bar; the page itself never scrolls sideways. */\n flex-wrap: nowrap;\n }\n\n /* embedded on a phone: lockup | sideways links | compact pill, all in one 64px row. */\n :host([embedded]) .bar {\n flex-wrap: nowrap;\n gap: var(--st-space-12) var(--st-space-12);\n padding: 0;\n }\n\n :host([embedded]) .wordmark {\n font-size: 18px;\n }\n\n :host([embedded]) .brand {\n min-height: 36px;\n }\n\n :host([embedded]) .lockup {\n --pn-icon-size: 32px;\n --pn-brand-gap: 8px;\n }\n\n :host([embedded]) .links {\n order: 0;\n flex: 1 1 0;\n width: auto;\n min-width: 0;\n justify-content: flex-start;\n scrollbar-width: none;\n -webkit-mask-image: linear-gradient(to right, #000 calc(100% - 24px), transparent);\n mask-image: linear-gradient(to right, #000 calc(100% - 24px), transparent);\n }\n\n :host([embedded]) .links::-webkit-scrollbar {\n display: none;\n }\n\n :host([embedded]) .action {\n min-height: 36px;\n margin-left: 0;\n padding: 0 var(--st-space-12);\n font-size: 13px;\n }\n }\n\n @media (max-width: 480px) {\n :host([embedded]) .lockup {\n --pn-icon-size: 28px;\n }\n\n /* The tagline stays on phones: it is the way home. One size smaller. */\n :host([embedded]) .tagline {\n font-size: 9px;\n }\n\n /* Only swap labels when a short one is given; otherwise the full label stays. */\n :host([embedded]) .action.has-short .action-full {\n display: none;\n }\n\n :host([embedded]) .action.has-short .action-short {\n display: inline;\n }\n }\n\n @media (prefers-reduced-motion: reduce) {\n .links a {\n transition: none;\n }\n }\n `;\n\n /** Brand prefix, e.g. `T-`. Shown in the brand navy. */\n @property({ type: String, attribute: 'brand-prefix' })\n brandPrefix = '';\n\n /** Product name, e.g. `pilot`. Shown in the brand azure with an underline. */\n @property({ type: String, attribute: 'brand-name' })\n brandName = '';\n\n /** Small line under the name, e.g. `by Sankhyatronics`. Plain text inside the brand link. */\n @property({ type: String, attribute: 'brand-tagline' })\n brandTagline = '';\n\n /** Target of the brand link (the icon, wordmark, rule and tagline). */\n @property({ type: String, attribute: 'brand-href' })\n brandHref = '#top';\n\n /** Product icon image URL, shown inside the brand link before the wordmark (40px; 32px and 28px on phones when `embedded`). Omitted when empty. */\n @property({ type: String })\n icon = '';\n\n /** Dark-theme variant of `icon`, shown on the site's dark theme (`:root.dark`) in place of it. Needs `icon`; without it `icon` shows on every theme. */\n @property({ type: String, attribute: 'icon-dark' })\n iconDark = '';\n\n /** In-page section links. */\n @property({ attribute: false })\n links: ProductNavLink[] = [];\n\n /** Label of the external button at the end of the bar. Shown only together with `href`. */\n @property({ type: String, attribute: 'action-label' })\n actionLabel = '';\n\n /** Shorter button label for phones in `embedded` mode (e.g. `Open ↗`), so the links row keeps its room. Optional; the full `action-label` is used otherwise. */\n @property({ type: String, attribute: 'action-short-label' })\n actionShortLabel = '';\n\n /** Target of the external button. It opens in the same tab. */\n @property({ type: String })\n href = '';\n\n /** Accessible name of the site-menu button, e.g. `Sankhyatronics menu`. Empty (default): no button. Clicking it dispatches `product-nav-site-menu`. */\n @property({ type: String, attribute: 'site-menu-label' })\n siteMenuLabel = '';\n\n /** True while the host header's site menu is open. Set by the header, never from outside: it drives the button's `aria-expanded`. */\n @property({ type: Boolean, reflect: true, attribute: 'site-menu-open' })\n siteMenuOpen = false;\n\n /** Pins the bar to the top of the viewport (`position: sticky`). Ignored when `embedded`. */\n @property({ type: Boolean, reflect: true })\n sticky = false;\n\n /** Accessible name of the `<nav>` landmark, e.g. `T-pilot`. Falls back to the brand prefix and name. */\n @property({ type: String })\n label = '';\n\n /** Fills the row of a host header (see the class docs): no bar background, rule, shadow or sticky positioning. */\n @property({ type: Boolean, reflect: true })\n embedded = false;\n\n /** Marks the link for the section in view with `aria-current=\"location\"` and an active style. */\n @property({ type: Boolean, attribute: 'scroll-spy' })\n scrollSpy = false;\n\n /** The id of the section in view, from the IntersectionObserver. */\n @state() private activeId = '';\n\n private observer?: IntersectionObserver;\n\n /** The sections the scroll spy measures (set while `scrollSpy` is on). */\n private spyTargets: HTMLElement[] = [];\n\n private spyFrame = 0;\n\n /** Distance from the top of the viewport that counts as \"passed\", matching the 64px header row. */\n private static readonly SPY_OFFSET = 64;\n\n /** Extra pixels past the offset line, so a section an anchor jump lands just under it (sub-pixel) still counts. */\n private static readonly SPY_TOLERANCE = 8;\n\n connectedCallback(): void {\n super.connectedCallback();\n this.observe();\n }\n\n disconnectedCallback(): void {\n this.observer?.disconnect();\n this.observer = undefined;\n this.stopSpyScroll();\n super.disconnectedCallback();\n }\n\n protected updated(changed: Map<string, unknown>): void {\n if (changed.has('links') || changed.has('scrollSpy')) this.observe();\n if (changed.has('activeId') && this.activeId) this.revealActiveLink();\n }\n\n /** When the links row scrolls sideways (phones), keeps the current section's link in view. Only the\n * row scrolls, never the page. */\n private revealActiveLink(): void {\n const row = this.renderRoot.querySelector<HTMLElement>('.links');\n const link = row?.querySelector<HTMLElement>('a[aria-current]');\n if (!row || !link || row.scrollWidth <= row.clientWidth) return;\n const rowBox = row.getBoundingClientRect();\n const linkBox = link.getBoundingClientRect();\n const margin = 24;\n let delta = 0;\n if (linkBox.left < rowBox.left + margin) delta = linkBox.left - rowBox.left - margin;\n else if (linkBox.right > rowBox.right - margin) delta = linkBox.right - rowBox.right + margin;\n if (delta) {\n const smooth = !window.matchMedia?.('(prefers-reduced-motion: reduce)').matches;\n row.scrollBy({ left: delta, behavior: smooth ? 'smooth' : 'auto' });\n }\n }\n\n /**\n * Scroll spy: the section in view is the LAST one, in document order, whose top is at or above\n * `SPY_OFFSET + SPY_TOLERANCE`. None above that line (above the first section) leaves no active id.\n * At the bottom of the page the last section is active, even if its top never reaches the line.\n */\n private updateScrollSpy(): void {\n const targets = this.spyTargets;\n const atBottom = window.innerHeight + window.scrollY >= document.documentElement.scrollHeight - 2;\n const line = ProductNav.SPY_OFFSET + ProductNav.SPY_TOLERANCE;\n let id = '';\n if (atBottom && targets.length) {\n id = targets[targets.length - 1].id;\n } else {\n for (const target of targets) {\n if (target.getBoundingClientRect().top <= line) id = target.id;\n }\n }\n if (id !== this.activeId) this.activeId = id;\n }\n\n /** Scroll spy re-checks on every scroll frame: an IntersectionObserver alone misses a long section passing the line. */\n private onSpyScroll = (): void => {\n if (this.spyFrame) return;\n this.spyFrame = requestAnimationFrame(() => {\n this.spyFrame = 0;\n this.updateScrollSpy();\n });\n };\n\n private stopSpyScroll(): void {\n window.removeEventListener('scroll', this.onSpyScroll);\n if (this.spyFrame) cancelAnimationFrame(this.spyFrame);\n this.spyFrame = 0;\n this.spyTargets = [];\n }\n\n /** Watches the sections the `#anchor` links point at, so the link for the one in view is current. */\n private observe(): void {\n this.observer?.disconnect();\n this.observer = undefined;\n this.stopSpyScroll();\n if (typeof IntersectionObserver === 'undefined' || typeof document === 'undefined') return;\n const targets = this.links\n .filter(link => link.href.startsWith('#') && link.href.length > 1)\n .map(link => document.getElementById(link.href.slice(1)))\n .filter((node): node is HTMLElement => node !== null);\n if (!targets.length) return;\n if (this.scrollSpy) {\n // Document order, so the scroll spy can take the last section above the line.\n this.spyTargets = [...targets].sort((a, b) =>\n a.compareDocumentPosition(b) & Node.DOCUMENT_POSITION_FOLLOWING ? -1 : 1\n );\n this.observer = new IntersectionObserver(() => this.updateScrollSpy(), {\n rootMargin: `-${ProductNav.SPY_OFFSET}px 0px 0px 0px`,\n threshold: 0,\n });\n targets.forEach(target => this.observer?.observe(target));\n window.addEventListener('scroll', this.onSpyScroll, { passive: true });\n this.updateScrollSpy();\n return;\n }\n this.observer = new IntersectionObserver(\n entries => {\n for (const entry of entries) {\n if (entry.isIntersecting) this.activeId = entry.target.id;\n else if (this.activeId === entry.target.id) this.activeId = '';\n }\n },\n { rootMargin: '-40% 0px -55% 0px' }\n );\n targets.forEach(target => this.observer?.observe(target));\n }\n\n /** The product icon: the light image, plus the dark one (theme-switched) when `iconDark` is set. Alt is empty: the link text names the product. */\n private renderIcon() {\n if (!this.icon) return nothing;\n const light = html`<img part=\"icon\" class=\"icon${this.iconDark ? ' theme-light' : ''}\" src=${this.icon} alt=\"\" width=\"40\" height=\"40\" />`;\n if (!this.iconDark) return light;\n return html`${light}<img part=\"icon\" class=\"icon theme-dark\" src=${this.iconDark} alt=\"\" width=\"40\" height=\"40\" />`;\n }\n\n /** The site-menu button, before the action pill. Only with `site-menu-label`. */\n private renderSiteMenu() {\n if (!this.siteMenuLabel) return nothing;\n return html`<button\n part=\"site-menu\"\n type=\"button\"\n class=\"site-menu\"\n aria-label=${this.siteMenuLabel}\n aria-haspopup=\"dialog\"\n aria-expanded=${this.siteMenuOpen}\n @click=${(event: Event) => this.onSiteMenuClick(event)}\n >\n <svg viewBox=\"0 0 20 20\" aria-hidden=\"true\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"><path d=\"M3 5h14M3 10h14M3 15h14\"></path></svg>\n </button>`;\n }\n\n /** Dispatches `product-nav-site-menu`, with the button as the detail's `trigger`, for the host header to open its site menu. */\n private onSiteMenuClick(event: Event): void {\n const trigger = event.currentTarget as HTMLElement;\n this.dispatchEvent(\n new CustomEvent<{ trigger: HTMLElement }>('product-nav-site-menu', { detail: { trigger }, bubbles: true, composed: true })\n );\n }\n\n render() {\n // Content renderers may keep `label` as the node's own name, so the brand is the fallback name.\n const label = this.label || `${this.brandPrefix}${this.brandName}`;\n return html`\n <nav part=\"nav\" aria-label=${label}>\n <div class=\"bar\">\n <div class=\"lockup\" part=\"lockup\">\n <a class=\"brand\" part=\"brand\" href=${this.brandHref || '#top'}>\n ${this.renderIcon()}\n <span class=\"brand-text\">\n <span class=\"wordmark\"><span class=\"prefix\">${this.brandPrefix}</span><span class=\"name\">${this.brandName}</span></span>\n <span class=\"rule\" aria-hidden=\"true\"></span>\n ${this.brandTagline ? html`<span class=\"tagline\">${this.brandTagline}</span>` : nothing}\n </span>\n </a>\n </div>\n ${this.links.length\n ? html`<ul class=\"links\" part=\"links\">\n ${this.links.map(\n link => html`<li>\n <a\n part=\"link\"\n href=${link.href}\n target=${externalLinkAttrs(link.href).target}\n rel=${externalLinkAttrs(link.href).rel}\n aria-current=${this.activeId && link.href === `#${this.activeId}` ? (this.scrollSpy ? 'location' : 'true') : nothing}\n >${link.label}${externalLinkExtras(link.href)}</a>\n </li>`\n )}\n </ul>`\n : nothing}\n ${this.renderSiteMenu()}\n ${this.actionLabel && this.href\n ? html`<a class=\"action ${this.actionShortLabel ? 'has-short' : ''}\" part=\"action\" href=${this.href} aria-label=${this.actionLabel}><span class=\"action-full\">${this.actionLabel}</span>${this.actionShortLabel ? html`<span class=\"action-short\">${this.actionShortLabel}</span>` : nothing}<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M7 17L17 7\"></path><path d=\"M9 7h8v8\"></path></svg></a>`\n : nothing}\n </div>\n </nav>\n `;\n }\n}\n"],"mappings":"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AAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AALX,WA2ba,aAAa;AAAA;AA3b1B,WA8ba,gBAAgB;AA5ExC;AAAA,EADC,SAAS,EAAE,MAAM,QAAQ,WAAW,eAAe,CAAC;AAAA,GAjX1C,WAkXX;AAIA;AAAA,EADC,SAAS,EAAE,MAAM,QAAQ,WAAW,aAAa,CAAC;AAAA,GArXxC,WAsXX;AAIA;AAAA,EADC,SAAS,EAAE,MAAM,QAAQ,WAAW,gBAAgB,CAAC;AAAA,GAzX3C,WA0XX;AAIA;AAAA,EADC,SAAS,EAAE,MAAM,QAAQ,WAAW,aAAa,CAAC;AAAA,GA7XxC,WA8XX;AAIA;AAAA,EADC,SAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GAjYf,WAkYX;AAIA;AAAA,EADC,SAAS,EAAE,MAAM,QAAQ,WAAW,YAAY,CAAC;AAAA,GArYvC,WAsYX;AAIA;AAAA,EADC,SAAS,EAAE,WAAW,MAAM,CAAC;AAAA,GAzYnB,WA0YX;AAIA;AAAA,EADC,SAAS,EAAE,MAAM,QAAQ,WAAW,eAAe,CAAC;AAAA,GA7Y1C,WA8YX;AAIA;AAAA,EADC,SAAS,EAAE,MAAM,QAAQ,WAAW,qBAAqB,CAAC;AAAA,GAjZhD,WAkZX;AAIA;AAAA,EADC,SAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GArZf,WAsZX;AAIA;AAAA,EADC,SAAS,EAAE,MAAM,QAAQ,WAAW,kBAAkB,CAAC;AAAA,GAzZ7C,WA0ZX;AAIA;AAAA,EADC,SAAS,EAAE,MAAM,SAAS,SAAS,MAAM,WAAW,iBAAiB,CAAC;AAAA,GA7Z5D,WA8ZX;AAIA;AAAA,EADC,SAAS,EAAE,MAAM,SAAS,SAAS,KAAK,CAAC;AAAA,GAja/B,WAkaX;AAIA;AAAA,EADC,SAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GAraf,WAsaX;AAIA;AAAA,EADC,SAAS,EAAE,MAAM,SAAS,SAAS,KAAK,CAAC;AAAA,GAza/B,WA0aX;AAIA;AAAA,EADC,SAAS,EAAE,MAAM,SAAS,WAAW,aAAa,CAAC;AAAA,GA7azC,WA8aX;AAGiB;AAAA,EAAhB,MAAM;AAAA,GAjbI,WAibM;AAjbN,aAAN;AAAA,EADN,cAAc,gBAAgB;AAAA,GAClB;","names":[]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  controlBaseStyles
3
- } from "./chunk-KMU6ABQF.js";
3
+ } from "./chunk-NXUS2CH7.js";
4
4
  import {
5
5
  __decorateClass
6
6
  } from "./chunk-EUXUH3YW.js";
@@ -87,4 +87,4 @@ MenuGrid = __decorateClass([
87
87
  export {
88
88
  MenuGrid
89
89
  };
90
- //# sourceMappingURL=chunk-SMLR736E.js.map
90
+ //# sourceMappingURL=chunk-PV6OCXXN.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/menu-grid/MenuGrid.ts"],"sourcesContent":["import { LitElement, css, html } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n\nimport { controlBaseStyles } from '../shared/styles';\n\n/**\n * A responsive grid of `st-menu-grid-item`s — the \"rich\" nav-menu layout (icon + title +\n * description per entry, arranged in columns), typically slotted into `st-dropdown`'s default\n * slot. Markup is `.menu-grid-container` > `.menu-grid.columns-N`; breakpoints: at 768px, 2–4\n * columns become 2; at 480px, everything becomes 1 (a 1-column grid stays 1).\n */\n@customElement('st-menu-grid')\nexport class MenuGrid extends LitElement {\n static styles = css`\n ${controlBaseStyles}\n\n :host {\n display: block;\n }\n\n .menu-grid-container {\n width: 100%;\n }\n\n .menu-grid {\n display: grid;\n gap: 12px;\n }\n\n .menu-grid.columns-1 {\n grid-template-columns: repeat(1, 1fr);\n }\n\n .menu-grid.columns-2 {\n grid-template-columns: repeat(2, 1fr);\n }\n\n .menu-grid.columns-3 {\n grid-template-columns: repeat(3, 1fr);\n }\n\n .menu-grid.columns-4 {\n grid-template-columns: repeat(4, 1fr);\n }\n\n @media (max-width: 768px) {\n .menu-grid.columns-2,\n .menu-grid.columns-3,\n .menu-grid.columns-4 {\n grid-template-columns: repeat(2, 1fr);\n }\n }\n\n @media (max-width: 480px) {\n .menu-grid.columns-1,\n .menu-grid.columns-2,\n .menu-grid.columns-3,\n .menu-grid.columns-4 {\n grid-template-columns: 1fr;\n }\n }\n `;\n\n /** Number of columns at full width (1–4, same as the source component's `columns-N` classes). */\n @property({ type: Number })\n columns = 3;\n\n /** Extra class(es) appended to the inner grid element — the source component's `gridClassName`.\n * Its outer `className` is the host element itself here: set a `class` attribute on `st-menu-grid`. */\n @property({ type: String, attribute: 'grid-class-name' })\n gridClassName = '';\n\n render() {\n const columns = Math.min(4, Math.max(1, Math.round(this.columns) || 1));\n return html`\n <div class=\"menu-grid-container\" part=\"container\">\n <div part=\"grid\" class=\"menu-grid columns-${columns} ${this.gridClassName}\">\n <slot></slot>\n </div>\n </div>\n `;\n }\n}\n"],"mappings":";;;;;;;;AAAA,SAAS,YAAY,KAAK,YAAY;AACtC,SAAS,eAAe,gBAAgB;AAWjC,IAAM,WAAN,cAAuB,WAAW;AAAA,EAAlC;AAAA;AAqDL,mBAAU;AAKV,yBAAgB;AAAA;AAAA,EAEhB,SAAS;AACP,UAAM,UAAU,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,OAAO,KAAK,CAAC,CAAC;AACtE,WAAO;AAAA;AAAA,oDAEyC,OAAO,IAAI,KAAK,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA,EAK/E;AACF;AAtEa,SACJ,SAAS;AAAA,MACZ,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAmDrB;AAAA,EADC,SAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GApDf,SAqDX;AAKA;AAAA,EADC,SAAS,EAAE,MAAM,QAAQ,WAAW,kBAAkB,CAAC;AAAA,GAzD7C,SA0DX;AA1DW,WAAN;AAAA,EADN,cAAc,cAAc;AAAA,GAChB;","names":[]}
@@ -0,0 +1,534 @@
1
+ import {
2
+ renderMarkdown
3
+ } from "./chunk-TJK55CJ2.js";
4
+ import {
5
+ cardTitleStyles,
6
+ ctaLinkStyles,
7
+ iconTileStyles,
8
+ invertedSectionTextStyles,
9
+ reducedMotionStyles,
10
+ sectionHeaderStyles,
11
+ sectionSubtitleStyles,
12
+ sectionTitleStyles
13
+ } from "./chunk-KZ7PMFWS.js";
14
+ import {
15
+ controlBaseStyles,
16
+ fontFamilyStyles
17
+ } from "./chunk-NXUS2CH7.js";
18
+ import {
19
+ __decorateClass
20
+ } from "./chunk-EUXUH3YW.js";
21
+
22
+ // src/bento-grid/BentoGrid.ts
23
+ import { LitElement, css, html, nothing } from "lit";
24
+ import { customElement, property } from "lit/decorators.js";
25
+ import { unsafeHTML } from "lit/directives/unsafe-html.js";
26
+ import "iconify-icon";
27
+ var BentoGrid = class extends LitElement {
28
+ constructor() {
29
+ super(...arguments);
30
+ this.inverted = false;
31
+ this.title = "";
32
+ this.subtitle = "";
33
+ this.items = [];
34
+ }
35
+ renderCard(item) {
36
+ const variant = item.variant ?? "default";
37
+ const colSpan = item.colSpan ?? 1;
38
+ const hasChips = !!item.chips?.length;
39
+ const styled = hasChips || !!item.layout;
40
+ const classes = [
41
+ "card",
42
+ `col-${colSpan}`,
43
+ `row-${item.rowSpan ?? 1}`,
44
+ item.imageSrc ? "has-image" : "",
45
+ variant === "default" ? "" : variant,
46
+ styled ? "v2" : "",
47
+ item.layout === "row" ? "row" : ""
48
+ ].filter(Boolean).join(" ");
49
+ const beside = hasChips && colSpan === 4;
50
+ const iconInText = beside || item.layout === "row";
51
+ const icon = item.icon ? html`<div class="icon" part="icon"><iconify-icon icon=${item.icon}></iconify-icon></div>` : nothing;
52
+ const text = html`<div class="text" part="text">
53
+ ${iconInText ? icon : nothing}
54
+ <h3 class="card-title" part="card-title">${item.title}</h3>
55
+ ${item.description ? html`<div class="card-description" part="card-description">${unsafeHTML(renderMarkdown(item.description))}</div>` : nothing}
56
+ </div>`;
57
+ const chips = hasChips ? html`<ul class="chips" part="chips">
58
+ ${item.chips?.map(
59
+ (chip) => html`<li class="chip ${chip.tone ?? "plain"}" part="chip">${chip.label}</li>`
60
+ )}
61
+ </ul>` : nothing;
62
+ const body = html`
63
+ ${item.imageSrc ? html`<div class="image-wrapper" part="image-wrapper">
64
+ <img class="image" part="image" src=${item.imageSrc} alt=${item.imageAlt ?? item.title} />
65
+ </div>` : nothing}
66
+ <div class="content" part="content">
67
+ ${iconInText ? nothing : icon}
68
+ ${beside ? html`<div class="split">${text}${chips}</div>` : html`${text}${chips}`}
69
+ ${item.href && item.actionLabel ? html`<a class="action" part="action" href=${item.href} aria-label=${item.actionAriaLabel || nothing}>${item.actionLabel}</a>` : nothing}
70
+ </div>
71
+ `;
72
+ return item.href && !item.actionLabel ? html`<a part="card" class=${classes} href=${item.href}>${body}</a>` : html`<div part="card" class=${classes}>${body}</div>`;
73
+ }
74
+ render() {
75
+ return html`
76
+ <div class="container" part="container">
77
+ ${this.title || this.subtitle ? html`<div class="header" part="header">
78
+ ${this.title ? html`<h2 class="title" part="title">${this.title}</h2>` : nothing}
79
+ ${this.subtitle ? html`<p class="subtitle" part="subtitle">${this.subtitle}</p>` : nothing}
80
+ </div>` : nothing}
81
+ <div class="grid" part="grid">${this.items.map((item) => this.renderCard(item))}</div>
82
+ </div>
83
+ `;
84
+ }
85
+ };
86
+ BentoGrid.styles = css`
87
+ ${controlBaseStyles}
88
+
89
+ :host {
90
+ display: block;
91
+ /* !important: a page-level reset (e.g. Tailwind Preflight) otherwise zeroes a shadow host's
92
+ padding; override with --st-bento-grid-padding instead. */
93
+ padding: var(--st-bento-grid-padding, var(--st-cms-section-padding) var(--st-space-24)) !important;
94
+ background: var(--st-color-page);
95
+ ${fontFamilyStyles}
96
+ }
97
+
98
+ :host([inverted]) {
99
+ background: var(--st-color-text-strong);
100
+ }
101
+
102
+ .container {
103
+ max-width: var(--st-cms-container-max);
104
+ margin: 0 auto;
105
+ }
106
+
107
+ .header {
108
+ ${sectionHeaderStyles}
109
+ }
110
+
111
+ .title {
112
+ ${sectionTitleStyles}
113
+ }
114
+
115
+ .subtitle {
116
+ ${sectionSubtitleStyles}
117
+ margin-bottom: 0;
118
+ }
119
+
120
+ ${invertedSectionTextStyles}
121
+
122
+ .grid {
123
+ display: grid;
124
+ grid-template-columns: repeat(4, 1fr);
125
+ grid-auto-rows: minmax(240px, auto);
126
+ gap: var(--st-space-24);
127
+ }
128
+
129
+ .card {
130
+ position: relative;
131
+ display: flex;
132
+ flex-direction: column;
133
+ overflow: hidden;
134
+ border: 1px solid var(--st-bento-card-border, var(--st-color-border));
135
+ border-radius: var(--st-space-24);
136
+ background: var(--st-color-surface);
137
+ color: inherit;
138
+ text-decoration: none;
139
+ transition:
140
+ transform 0.3s ease,
141
+ box-shadow 0.3s ease;
142
+ }
143
+
144
+ :host([inverted]) .card {
145
+ background: var(--st-color-text-strong);
146
+ border-color: var(--st-color-text);
147
+ }
148
+
149
+ .card:hover {
150
+ transform: translateY(-4px);
151
+ box-shadow: 0 12px 24px -10px var(--st-shadow-color-lg);
152
+ z-index: 1;
153
+ }
154
+
155
+ .image-wrapper {
156
+ position: absolute;
157
+ inset: 0;
158
+ }
159
+
160
+ .image-wrapper::after {
161
+ content: '';
162
+ position: absolute;
163
+ inset: 0;
164
+ background: linear-gradient(to bottom, transparent 0%, var(--st-shadow-color-xl) 100%);
165
+ }
166
+
167
+ .image {
168
+ width: 100%;
169
+ height: 100%;
170
+ object-fit: cover;
171
+ transition: transform 0.5s ease;
172
+ }
173
+
174
+ .card:hover .image {
175
+ transform: scale(1.05);
176
+ }
177
+
178
+ .content {
179
+ position: relative;
180
+ z-index: 1;
181
+ margin-top: auto;
182
+ padding: var(--st-space-24);
183
+ display: flex;
184
+ flex-direction: column;
185
+ gap: var(--st-space-16);
186
+ }
187
+
188
+ .icon {
189
+ ${iconTileStyles}
190
+ width: var(--st-size-40);
191
+ height: var(--st-size-40);
192
+ font-size: 24px;
193
+ background: var(--st-bento-icon-bg, var(--st-color-subtle));
194
+ color: var(--st-bento-icon-color, var(--st-color-text-muted));
195
+ }
196
+
197
+ .text {
198
+ padding: var(--st-space-16);
199
+ border-radius: var(--st-radius-md);
200
+ }
201
+
202
+ .card-title {
203
+ ${cardTitleStyles}
204
+ font-size: var(--st-text-lg);
205
+ }
206
+
207
+ .card-description {
208
+ margin: 0;
209
+ font-size: var(--st-text-md);
210
+ color: var(--st-color-text-muted);
211
+ }
212
+
213
+ :host([inverted]) .card-title {
214
+ color: var(--st-color-on-solid);
215
+ }
216
+
217
+ :host([inverted]) .card-description {
218
+ color: var(--st-color-border);
219
+ }
220
+
221
+ .card.has-image .card-title,
222
+ .card.has-image .card-description {
223
+ color: var(--st-color-on-solid);
224
+ }
225
+
226
+ .card.has-image .icon {
227
+ background: var(--st-shadow-color-lg);
228
+ color: var(--st-color-on-solid);
229
+ backdrop-filter: blur(4px);
230
+ }
231
+
232
+ /* variant: prefixed with :host so it outranks the :host([inverted]) card rules above. */
233
+ :host .card.primary {
234
+ background: var(--st-color-accent);
235
+ border-color: var(--st-color-accent);
236
+ color: var(--st-color-on-solid);
237
+ }
238
+
239
+ :host .card.dark {
240
+ background: var(--st-cms-navy);
241
+ border-color: var(--st-cms-navy);
242
+ color: var(--st-cms-on-dark);
243
+ }
244
+
245
+ :host .card.primary .card-title {
246
+ color: var(--st-color-on-solid);
247
+ }
248
+
249
+ :host .card.dark .card-title {
250
+ color: var(--st-cms-on-dark);
251
+ }
252
+
253
+ :host .card.primary .card-description {
254
+ color: color-mix(in oklch, var(--st-color-on-solid) 85%, transparent);
255
+ }
256
+
257
+ :host .card.dark .card-description {
258
+ color: color-mix(in oklch, var(--st-cms-on-dark) 80%, transparent);
259
+ }
260
+
261
+ :host .card.primary .icon {
262
+ background: color-mix(in oklch, var(--st-color-on-solid) 18%, transparent);
263
+ color: var(--st-color-on-solid);
264
+ }
265
+
266
+ :host .card.dark .icon {
267
+ background: color-mix(in oklch, var(--st-cms-on-dark) 12%, transparent);
268
+ color: var(--st-cms-on-dark);
269
+ }
270
+
271
+ .card-description > :first-child {
272
+ margin-top: 0;
273
+ }
274
+
275
+ .card-description > :last-child {
276
+ margin-bottom: 0;
277
+ }
278
+
279
+ .card-description p {
280
+ margin: 0 0 var(--st-space-8);
281
+ }
282
+
283
+ .card-description a {
284
+ position: relative;
285
+ color: inherit;
286
+ text-decoration: underline;
287
+ text-underline-offset: 3px;
288
+ }
289
+
290
+ /* Touch target: the link keeps its text size; a 44px hit area (WCAG 2.5.5) sits over it. */
291
+ .card-description a::after {
292
+ content: '';
293
+ position: absolute;
294
+ top: 50%;
295
+ left: 50%;
296
+ width: max(100%, 44px);
297
+ height: 44px;
298
+ transform: translate(-50%, -50%);
299
+ }
300
+
301
+ .action {
302
+ ${ctaLinkStyles}
303
+ align-self: flex-start;
304
+ min-height: 44px;
305
+ margin-top: var(--st-space-8);
306
+ background: var(--st-button-primary-bg);
307
+ color: var(--st-button-primary-color);
308
+ font-weight: var(--st-button-font-weight);
309
+ position: relative;
310
+ z-index: 1;
311
+ }
312
+
313
+ .action:hover {
314
+ transform: scale(1.03);
315
+ }
316
+
317
+ .action:focus-visible {
318
+ outline: var(--st-focus-ring);
319
+ outline-offset: 2px;
320
+ }
321
+
322
+ .card.primary .action {
323
+ background: var(--st-cms-on-dark);
324
+ color: var(--st-color-accent);
325
+ }
326
+
327
+ .card.dark .action {
328
+ background: var(--st-cms-highlight);
329
+ color: var(--st-cms-navy);
330
+ }
331
+
332
+ /* Design-system look, only on cards that use chips or layout (.v2). */
333
+ .card.v2 .content {
334
+ padding: var(--st-space-32);
335
+ }
336
+
337
+ .card.v2 .icon {
338
+ width: 40px;
339
+ height: 40px;
340
+ border-radius: 10px;
341
+ background: var(--st-cms-primary-100);
342
+ color: var(--st-cms-accent-text, var(--st-cms-brand-navy));
343
+ }
344
+
345
+ :host .card.v2.primary .icon,
346
+ :host .card.v2.dark .icon {
347
+ background: var(--st-cms-highlight);
348
+ color: var(--st-cms-navy);
349
+ }
350
+
351
+ :host .card.v2.primary .icon {
352
+ background: var(--st-cms-highlight);
353
+ }
354
+
355
+ .card.row .content {
356
+ flex-direction: row;
357
+ flex-wrap: wrap;
358
+ align-items: center;
359
+ justify-content: space-between;
360
+ }
361
+
362
+ .card.row .text {
363
+ flex: 1 1 360px;
364
+ padding: 0;
365
+ }
366
+
367
+ .card.row .action {
368
+ margin-top: 0;
369
+ align-self: center;
370
+ }
371
+
372
+ .split {
373
+ width: 100%;
374
+ }
375
+
376
+ .card.v2 .text {
377
+ display: flex;
378
+ flex-direction: column;
379
+ gap: var(--st-space-12);
380
+ }
381
+
382
+ .card.v2 .card-title {
383
+ margin: 0;
384
+ font-size: 20px;
385
+ font-weight: var(--st-font-weight-semibold);
386
+ }
387
+
388
+ .card.v2 .card-description {
389
+ font-size: 14px;
390
+ line-height: 1.5;
391
+ color: var(--st-bento-description-color, var(--st-cms-text, var(--st-cms-navy-2, #03346b)));
392
+ }
393
+
394
+ .card.v2 .chip {
395
+ padding: 12px 6px;
396
+ border-radius: 8px;
397
+ font-size: 13px;
398
+ }
399
+
400
+ /* The suite card: navy fill, light description, cyan icon tile (set above), white pill. */
401
+ :host .card.v2.primary {
402
+ background: var(--st-cms-brand-navy, #2144aa);
403
+ border-color: var(--st-cms-brand-navy, #2144aa);
404
+ }
405
+
406
+ :host .card.v2.primary .card-description {
407
+ color: var(--st-cms-primary-100, #e4ebff);
408
+ }
409
+
410
+ :host .card.v2.primary.row .action {
411
+ min-height: 44px;
412
+ display: inline-flex;
413
+ align-items: center;
414
+ justify-content: center;
415
+ padding: 0 20px;
416
+ font-size: 15px;
417
+ border-radius: var(--st-radius-full);
418
+ background: var(--st-cms-on-dark);
419
+ color: var(--st-cms-navy);
420
+ }
421
+
422
+ .split {
423
+ display: grid;
424
+ grid-template-columns: minmax(0, 1fr) minmax(0, 340px);
425
+ gap: var(--st-space-24);
426
+ align-items: center;
427
+ }
428
+
429
+ .split .text {
430
+ padding: 0;
431
+ }
432
+
433
+ .chips {
434
+ display: grid;
435
+ grid-template-columns: repeat(3, minmax(0, 1fr));
436
+ gap: var(--st-space-8);
437
+ margin: 0;
438
+ padding: 0;
439
+ list-style: none;
440
+ }
441
+
442
+ .chip {
443
+ display: flex;
444
+ align-items: center;
445
+ justify-content: center;
446
+ min-width: 0;
447
+ padding: var(--st-space-8) var(--st-space-12);
448
+ border-radius: var(--st-radius-sm);
449
+ background: var(--st-bento-chip-plain-bg, var(--st-cms-surface-soft));
450
+ color: var(--st-bento-chip-text, var(--st-cms-text-strong, var(--st-cms-navy)));
451
+ font-size: var(--st-text-sm);
452
+ font-weight: var(--st-font-weight-semibold);
453
+ line-height: 1.3;
454
+ text-align: center;
455
+ }
456
+
457
+ .chip.solid {
458
+ background: var(--st-cms-brand-navy);
459
+ color: var(--st-cms-on-dark);
460
+ }
461
+
462
+ .chip.soft {
463
+ background: var(--st-bento-chip-soft-bg, var(--st-cms-primary-100));
464
+ color: var(--st-bento-chip-text, var(--st-cms-text-strong, var(--st-cms-navy)));
465
+ }
466
+
467
+ :host .card.dark .chip.plain {
468
+ background: var(--st-cms-navy-2);
469
+ color: var(--st-cms-on-dark);
470
+ }
471
+
472
+ @media (max-width: 1024px) {
473
+ .split {
474
+ grid-template-columns: minmax(0, 1fr);
475
+ }
476
+ }
477
+
478
+ @media (max-width: 640px) {
479
+ .chips {
480
+ grid-template-columns: repeat(2, minmax(0, 1fr));
481
+ }
482
+ }
483
+
484
+ .col-1 { grid-column: span 1; }
485
+ .col-2 { grid-column: span 2; }
486
+ .col-3 { grid-column: span 3; }
487
+ .col-4 { grid-column: span 4; }
488
+ .row-1 { grid-row: span 1; }
489
+ .row-2 { grid-row: span 2; }
490
+
491
+ @media (max-width: 1024px) {
492
+ .grid {
493
+ grid-template-columns: repeat(2, 1fr);
494
+ }
495
+ .col-3,
496
+ .col-4 {
497
+ grid-column: span 2;
498
+ }
499
+ }
500
+
501
+ @media (max-width: 640px) {
502
+ .grid {
503
+ grid-template-columns: 1fr;
504
+ }
505
+ .col-1,
506
+ .col-2,
507
+ .col-3,
508
+ .col-4 {
509
+ grid-column: span 1;
510
+ }
511
+ }
512
+
513
+ ${reducedMotionStyles}
514
+ `;
515
+ __decorateClass([
516
+ property({ type: Boolean, reflect: true })
517
+ ], BentoGrid.prototype, "inverted", 2);
518
+ __decorateClass([
519
+ property({ type: String })
520
+ ], BentoGrid.prototype, "title", 2);
521
+ __decorateClass([
522
+ property({ type: String })
523
+ ], BentoGrid.prototype, "subtitle", 2);
524
+ __decorateClass([
525
+ property({ attribute: false })
526
+ ], BentoGrid.prototype, "items", 2);
527
+ BentoGrid = __decorateClass([
528
+ customElement("st-bento-grid")
529
+ ], BentoGrid);
530
+
531
+ export {
532
+ BentoGrid
533
+ };
534
+ //# sourceMappingURL=chunk-Q66CJO3P.js.map