@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.
- package/custom-elements.json +11634 -3153
- package/dist/attention-panel/index.js +2 -2
- package/dist/bar-chart/index.js +2 -2
- package/dist/bento-grid/index.d.ts +33 -1
- package/dist/bento-grid/index.js +4 -3
- package/dist/booking/index.d.ts +309 -0
- package/dist/booking/index.js +20 -0
- package/dist/booking/index.js.map +1 -0
- package/dist/card/index.d.ts +3 -4
- package/dist/card/index.js +2 -2
- package/dist/carousel/index.d.ts +20 -6
- package/dist/carousel/index.js +3 -3
- package/dist/chip/index.js +2 -2
- package/dist/{chunk-JQY2G4QK.js → chunk-2GTR37PU.js} +2 -2
- package/dist/chunk-2GTR37PU.js.map +1 -0
- package/dist/{chunk-FLY7TNRT.js → chunk-2HMOX253.js} +128 -25
- package/dist/chunk-2HMOX253.js.map +1 -0
- package/dist/{chunk-DH53HZPB.js → chunk-37KFBKPD.js} +32 -4
- package/dist/chunk-37KFBKPD.js.map +1 -0
- package/dist/{chunk-ALI26WOB.js → chunk-4XPKKYVZ.js} +54 -15
- package/dist/chunk-4XPKKYVZ.js.map +1 -0
- package/dist/chunk-535QAZ6A.js +236 -0
- package/dist/chunk-535QAZ6A.js.map +1 -0
- package/dist/{chunk-AKJQ345O.js → chunk-5AWGZQWU.js} +2 -2
- package/dist/chunk-6OZKZG5J.js +300 -0
- package/dist/chunk-6OZKZG5J.js.map +1 -0
- package/dist/chunk-AYNT7G3J.js +805 -0
- package/dist/chunk-AYNT7G3J.js.map +1 -0
- package/dist/chunk-BEWX3E6P.js +32 -0
- package/dist/chunk-BEWX3E6P.js.map +1 -0
- package/dist/chunk-CZUGPKXV.js +275 -0
- package/dist/chunk-CZUGPKXV.js.map +1 -0
- package/dist/{chunk-LEXZKGQX.js → chunk-DJFWZOZM.js} +107 -11
- package/dist/chunk-DJFWZOZM.js.map +1 -0
- package/dist/chunk-DPANTC3O.js +1714 -0
- package/dist/chunk-DPANTC3O.js.map +1 -0
- package/dist/chunk-EKZFFY45.js +426 -0
- package/dist/chunk-EKZFFY45.js.map +1 -0
- package/dist/chunk-ER7MCPDV.js +7 -0
- package/dist/chunk-ER7MCPDV.js.map +1 -0
- package/dist/chunk-EW2RK5Y6.js +383 -0
- package/dist/chunk-EW2RK5Y6.js.map +1 -0
- package/dist/{chunk-BLQV2YMO.js → chunk-EZOKT7NJ.js} +2 -2
- package/dist/chunk-FF2LWEF3.js +386 -0
- package/dist/chunk-FF2LWEF3.js.map +1 -0
- package/dist/chunk-FOUK3NHR.js +7 -0
- package/dist/chunk-FOUK3NHR.js.map +1 -0
- package/dist/chunk-GB4NGCZI.js +181 -0
- package/dist/chunk-GB4NGCZI.js.map +1 -0
- package/dist/{chunk-7NLZND6Q.js → chunk-GOFSMD6W.js} +35 -11
- package/dist/chunk-GOFSMD6W.js.map +1 -0
- package/dist/{chunk-6D6ROU7X.js → chunk-IGMVF3KK.js} +2 -2
- package/dist/{chunk-INMSEYT6.js → chunk-IVPVYVWG.js} +2 -2
- package/dist/chunk-JURCF4OD.js +381 -0
- package/dist/chunk-JURCF4OD.js.map +1 -0
- package/dist/{chunk-FZ36KL73.js → chunk-KZ7PMFWS.js} +11 -1
- package/dist/chunk-KZ7PMFWS.js.map +1 -0
- package/dist/{chunk-EMCQBT3S.js → chunk-LO6TZBGD.js} +129 -35
- package/dist/chunk-LO6TZBGD.js.map +1 -0
- package/dist/chunk-MFRGAT6D.js +860 -0
- package/dist/chunk-MFRGAT6D.js.map +1 -0
- package/dist/chunk-MIBVQXRU.js +1098 -0
- package/dist/chunk-MIBVQXRU.js.map +1 -0
- package/dist/{chunk-35TX3AOA.js → chunk-NABSRUXG.js} +2 -2
- package/dist/{chunk-R5G6KFTJ.js → chunk-NXKDZWS7.js} +44 -6
- package/dist/chunk-NXKDZWS7.js.map +1 -0
- package/dist/{chunk-KMU6ABQF.js → chunk-NXUS2CH7.js} +14 -1
- package/dist/chunk-NXUS2CH7.js.map +1 -0
- package/dist/{chunk-GJO3RGOB.js → chunk-OCPGOLVF.js} +56 -11
- package/dist/chunk-OCPGOLVF.js.map +1 -0
- package/dist/chunk-OEOE6IFY.js +628 -0
- package/dist/chunk-OEOE6IFY.js.map +1 -0
- package/dist/{chunk-SMLR736E.js → chunk-PV6OCXXN.js} +2 -2
- package/dist/chunk-PV6OCXXN.js.map +1 -0
- package/dist/chunk-Q66CJO3P.js +534 -0
- package/dist/chunk-Q66CJO3P.js.map +1 -0
- package/dist/{chunk-MG2VTZA4.js → chunk-QS3ANOWN.js} +2 -2
- package/dist/{chunk-ZN4LIKVG.js → chunk-QSJ543V2.js} +2 -2
- package/dist/chunk-QSJ543V2.js.map +1 -0
- package/dist/{chunk-FML6AG2V.js → chunk-RANC3OI6.js} +2 -2
- package/dist/chunk-T4BIN37Q.js +32 -0
- package/dist/chunk-T4BIN37Q.js.map +1 -0
- package/dist/{chunk-YVTFQHVY.js → chunk-TEAZZPDQ.js} +2 -2
- package/dist/chunk-TJK55CJ2.js +49 -0
- package/dist/chunk-TJK55CJ2.js.map +1 -0
- package/dist/chunk-UKIVLF7S.js +32 -0
- package/dist/chunk-UKIVLF7S.js.map +1 -0
- package/dist/chunk-V4R7PYP5.js +905 -0
- package/dist/chunk-V4R7PYP5.js.map +1 -0
- package/dist/{chunk-AG2COC64.js → chunk-VVYQ2DDS.js} +2 -2
- package/dist/chunk-WAMOAAMN.js +16 -0
- package/dist/chunk-WAMOAAMN.js.map +1 -0
- package/dist/chunk-WAYHHL4J.js +1234 -0
- package/dist/chunk-WAYHHL4J.js.map +1 -0
- package/dist/{chunk-YQ42EBK5.js → chunk-WH6HE6SY.js} +10 -4
- package/dist/chunk-WH6HE6SY.js.map +1 -0
- package/dist/chunk-XP6DI3VY.js +180 -0
- package/dist/chunk-XP6DI3VY.js.map +1 -0
- package/dist/{chunk-5EBWMPJS.js → chunk-XS6LNTSH.js} +76 -14
- package/dist/chunk-XS6LNTSH.js.map +1 -0
- package/dist/{chunk-WT4OATGP.js → chunk-ZKFCDVB4.js} +16 -7
- package/dist/chunk-ZKFCDVB4.js.map +1 -0
- package/dist/cms-theme.css +29 -0
- package/dist/contact-form/index.d.ts +220 -0
- package/dist/contact-form/index.js +16 -0
- package/dist/contact-form/index.js.map +1 -0
- package/dist/content-block/index.d.ts +39 -4
- package/dist/content-block/index.js +8 -4
- package/dist/cookie-consent/index.d.ts +60 -12
- package/dist/cookie-consent/index.js +3 -2
- package/dist/date-tile/index.js +2 -2
- package/dist/dropdown/index.d.ts +29 -11
- package/dist/dropdown/index.js +4 -2
- package/dist/feature-split/index.d.ts +6 -1
- package/dist/feature-split/index.js +5 -4
- package/dist/features-section/index.d.ts +53 -9
- package/dist/features-section/index.js +6 -5
- package/dist/flow/index.d.ts +35 -0
- package/dist/flow/index.js +9 -0
- package/dist/flow/index.js.map +1 -0
- package/dist/footer/index.d.ts +13 -0
- package/dist/footer/index.js +2 -2
- package/dist/header/index.d.ts +135 -16
- package/dist/header/index.js +3 -2
- package/dist/hero/index.d.ts +92 -8
- package/dist/hero/index.js +6 -3
- package/dist/icon-button/index.d.ts +7 -7
- package/dist/icon-button/index.js +2 -2
- package/dist/index.d.ts +12 -3
- package/dist/index.js +121 -47
- package/dist/items-accordion/index.d.ts +9 -0
- package/dist/items-accordion/index.js +4 -3
- package/dist/kpi-card/index.js +2 -2
- package/dist/markdown/index.d.ts +19 -2
- package/dist/markdown/index.js +3 -2
- package/dist/mega-menu/index.d.ts +95 -7
- package/dist/mega-menu/index.js +7 -2
- package/dist/menu-grid/index.d.ts +2 -3
- package/dist/menu-grid/index.js +2 -2
- package/dist/menu-grid-item/index.d.ts +6 -8
- package/dist/menu-grid-item/index.js +2 -2
- package/dist/menu-item/index.d.ts +11 -7
- package/dist/menu-item/index.js +3 -2
- package/dist/plan-cards/index.d.ts +69 -0
- package/dist/plan-cards/index.js +13 -0
- package/dist/plan-cards/index.js.map +1 -0
- package/dist/product-nav/index.d.ts +127 -0
- package/dist/product-nav/index.js +11 -0
- package/dist/product-nav/index.js.map +1 -0
- package/dist/promo-banner/index.d.ts +42 -4
- package/dist/promo-banner/index.js +6 -3
- package/dist/quote-dialog/index.d.ts +174 -0
- package/dist/quote-dialog/index.js +22 -0
- package/dist/quote-dialog/index.js.map +1 -0
- package/dist/schema/index.d.ts +11 -0
- package/dist/schema/index.js +9 -0
- package/dist/schema/index.js.map +1 -1
- package/dist/screenshot-tour/index.d.ts +54 -0
- package/dist/screenshot-tour/index.js +9 -0
- package/dist/screenshot-tour/index.js.map +1 -0
- package/dist/section/index.d.ts +3 -0
- package/dist/section/index.js +3 -3
- package/dist/segmented-control/index.js +2 -2
- package/dist/select/index.js +2 -2
- package/dist/shared/styles.d.ts +7 -1
- package/dist/shared/styles.js +3 -1
- package/dist/stats/index.js +2 -2
- package/dist/steps/index.d.ts +45 -0
- package/dist/steps/index.js +11 -0
- package/dist/steps/index.js.map +1 -0
- package/dist/tag-strip/index.d.ts +33 -0
- package/dist/tag-strip/index.js +9 -0
- package/dist/tag-strip/index.js.map +1 -0
- package/dist/testimonials/index.d.ts +9 -1
- package/dist/testimonials/index.js +3 -3
- package/dist/tooltip/index.js +2 -2
- package/package.json +38 -2
- package/dist/chunk-5EBWMPJS.js.map +0 -1
- package/dist/chunk-76AVBQUA.js +0 -252
- package/dist/chunk-76AVBQUA.js.map +0 -1
- package/dist/chunk-7NLZND6Q.js.map +0 -1
- package/dist/chunk-ALI26WOB.js.map +0 -1
- package/dist/chunk-BMHMNXIA.js +0 -158
- package/dist/chunk-BMHMNXIA.js.map +0 -1
- package/dist/chunk-DH53HZPB.js.map +0 -1
- package/dist/chunk-EMCQBT3S.js.map +0 -1
- package/dist/chunk-FLY7TNRT.js.map +0 -1
- package/dist/chunk-FZ36KL73.js.map +0 -1
- package/dist/chunk-GJO3RGOB.js.map +0 -1
- package/dist/chunk-J6EO4R73.js +0 -633
- package/dist/chunk-J6EO4R73.js.map +0 -1
- package/dist/chunk-JKBWZLG4.js +0 -348
- package/dist/chunk-JKBWZLG4.js.map +0 -1
- package/dist/chunk-JQY2G4QK.js.map +0 -1
- package/dist/chunk-KMU6ABQF.js.map +0 -1
- package/dist/chunk-LEXZKGQX.js.map +0 -1
- package/dist/chunk-MSSH3HFK.js +0 -205
- package/dist/chunk-MSSH3HFK.js.map +0 -1
- package/dist/chunk-R5G6KFTJ.js.map +0 -1
- package/dist/chunk-SMLR736E.js.map +0 -1
- package/dist/chunk-VWS53WY4.js +0 -157
- package/dist/chunk-VWS53WY4.js.map +0 -1
- package/dist/chunk-WT4OATGP.js.map +0 -1
- package/dist/chunk-XWB4CKDU.js +0 -708
- package/dist/chunk-XWB4CKDU.js.map +0 -1
- package/dist/chunk-YQ42EBK5.js.map +0 -1
- package/dist/chunk-ZN4LIKVG.js.map +0 -1
- /package/dist/{chunk-AKJQ345O.js.map → chunk-5AWGZQWU.js.map} +0 -0
- /package/dist/{chunk-BLQV2YMO.js.map → chunk-EZOKT7NJ.js.map} +0 -0
- /package/dist/{chunk-6D6ROU7X.js.map → chunk-IGMVF3KK.js.map} +0 -0
- /package/dist/{chunk-INMSEYT6.js.map → chunk-IVPVYVWG.js.map} +0 -0
- /package/dist/{chunk-35TX3AOA.js.map → chunk-NABSRUXG.js.map} +0 -0
- /package/dist/{chunk-MG2VTZA4.js.map → chunk-QS3ANOWN.js.map} +0 -0
- /package/dist/{chunk-FML6AG2V.js.map → chunk-RANC3OI6.js.map} +0 -0
- /package/dist/{chunk-YVTFQHVY.js.map → chunk-TEAZZPDQ.js.map} +0 -0
- /package/dist/{chunk-AG2COC64.js.map → chunk-VVYQ2DDS.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/bento-grid/BentoGrid.ts"],"sourcesContent":["import { LitElement, css, html, nothing } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js';\nimport 'iconify-icon';\n\nimport { controlBaseStyles, fontFamilyStyles } from '../shared/styles';\nimport { renderMarkdown } from '../shared/markdown';\nimport {\n cardTitleStyles,\n ctaLinkStyles,\n iconTileStyles,\n reducedMotionStyles,\n sectionHeaderStyles,\n sectionSubtitleStyles,\n sectionTitleStyles, invertedSectionTextStyles } from '../shared/section-styles';\n\nexport interface BentoGridItem {\n title: string;\n /** Markdown. */\n description?: string;\n /** Iconify icon name, e.g. `mdi:home`. */\n icon?: string;\n imageSrc?: string;\n imageAlt?: string;\n colSpan?: 1 | 2 | 3 | 4;\n rowSpan?: 1 | 2;\n /** Without `actionLabel`, turns the whole card into a link. */\n href?: string;\n /** `default` (surface), `primary` (brand fill, white text) or `dark` (navy fill, light text). */\n variant?: 'default' | 'primary' | 'dark';\n /** With `href`, renders a button-style link inside the card instead of linking the whole card. */\n actionLabel?: string;\n /** Accessible name of the action when its visible label repeats across cards (e.g. \"See how: Controlled Outsourcing\"). */\n actionAriaLabel?: string;\n /**\n * Small rounded labels. On a full-width card (`colSpan: 4`) they sit in a 3-column grid to the\n * right of the text; otherwise below it.\n */\n chips?: BentoGridChip[];\n /** `stack` (default) puts the action under the text; `row` puts the text left and the action right. */\n layout?: 'stack' | 'row';\n}\n\nexport interface BentoGridChip {\n label: string;\n /** `solid` navy with white text, `soft` light blue, `plain` the surface tint. Default `plain`. */\n tone?: 'solid' | 'soft' | 'plain';\n}\n\n/**\n * A responsive 4-column bento grid of icon/image cards. Items are set via the `items` property.\n * Descriptions are Markdown. A card links as a whole when it has `href` alone; with `actionLabel`\n * the link becomes a button inside the card.\n *\n * A card that uses `chips` or `layout` takes the design-system look: a 32px padding, a 40px icon\n * tile on a light blue (cyan on `primary` and `dark` cards), and on a `primary` card the action is a\n * white navy-text pill. Cards without those options keep the original look.\n *\n * @cssprop --st-bento-grid-padding - Overrides the block's padding.\n * @cssprop --st-bento-card-border - Overrides the colour of the cards' hairline border (default `--st-color-border`).\n * @cssprop --st-bento-description-color - Colour of a design-system card's description (default `--st-cms-text`).\n * @cssprop --st-bento-chip-soft-bg - Background of `soft` chips (default `--st-cms-primary-100`).\n * @cssprop --st-bento-chip-plain-bg - Background of `plain` chips (default `--st-cms-surface-soft`).\n * @cssprop --st-bento-chip-text - Text colour of non-solid chips (default `--st-cms-text-strong`).\n * @csspart chips - The list of chips.\n * @csspart chip - One chip.\n */\n@customElement('st-bento-grid')\nexport class BentoGrid extends LitElement {\n static styles = css`\n ${controlBaseStyles}\n\n :host {\n display: block;\n /* !important: a page-level reset (e.g. Tailwind Preflight) otherwise zeroes a shadow host's\n padding; override with --st-bento-grid-padding instead. */\n padding: var(--st-bento-grid-padding, var(--st-cms-section-padding) var(--st-space-24)) !important;\n background: var(--st-color-page);\n ${fontFamilyStyles}\n }\n\n :host([inverted]) {\n background: var(--st-color-text-strong);\n }\n\n .container {\n max-width: var(--st-cms-container-max);\n margin: 0 auto;\n }\n\n .header {\n ${sectionHeaderStyles}\n }\n\n .title {\n ${sectionTitleStyles}\n }\n\n .subtitle {\n ${sectionSubtitleStyles}\n margin-bottom: 0;\n }\n\n ${invertedSectionTextStyles}\n\n .grid {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n grid-auto-rows: minmax(240px, auto);\n gap: var(--st-space-24);\n }\n\n .card {\n position: relative;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n border: 1px solid var(--st-bento-card-border, var(--st-color-border));\n border-radius: var(--st-space-24);\n background: var(--st-color-surface);\n color: inherit;\n text-decoration: none;\n transition:\n transform 0.3s ease,\n box-shadow 0.3s ease;\n }\n\n :host([inverted]) .card {\n background: var(--st-color-text-strong);\n border-color: var(--st-color-text);\n }\n\n .card:hover {\n transform: translateY(-4px);\n box-shadow: 0 12px 24px -10px var(--st-shadow-color-lg);\n z-index: 1;\n }\n\n .image-wrapper {\n position: absolute;\n inset: 0;\n }\n\n .image-wrapper::after {\n content: '';\n position: absolute;\n inset: 0;\n background: linear-gradient(to bottom, transparent 0%, var(--st-shadow-color-xl) 100%);\n }\n\n .image {\n width: 100%;\n height: 100%;\n object-fit: cover;\n transition: transform 0.5s ease;\n }\n\n .card:hover .image {\n transform: scale(1.05);\n }\n\n .content {\n position: relative;\n z-index: 1;\n margin-top: auto;\n padding: var(--st-space-24);\n display: flex;\n flex-direction: column;\n gap: var(--st-space-16);\n }\n\n .icon {\n ${iconTileStyles}\n width: var(--st-size-40);\n height: var(--st-size-40);\n font-size: 24px;\n background: var(--st-bento-icon-bg, var(--st-color-subtle));\n color: var(--st-bento-icon-color, var(--st-color-text-muted));\n }\n\n .text {\n padding: var(--st-space-16);\n border-radius: var(--st-radius-md);\n }\n\n .card-title {\n ${cardTitleStyles}\n font-size: var(--st-text-lg);\n }\n\n .card-description {\n margin: 0;\n font-size: var(--st-text-md);\n color: var(--st-color-text-muted);\n }\n\n :host([inverted]) .card-title {\n color: var(--st-color-on-solid);\n }\n\n :host([inverted]) .card-description {\n color: var(--st-color-border);\n }\n\n .card.has-image .card-title,\n .card.has-image .card-description {\n color: var(--st-color-on-solid);\n }\n\n .card.has-image .icon {\n background: var(--st-shadow-color-lg);\n color: var(--st-color-on-solid);\n backdrop-filter: blur(4px);\n }\n\n /* variant: prefixed with :host so it outranks the :host([inverted]) card rules above. */\n :host .card.primary {\n background: var(--st-color-accent);\n border-color: var(--st-color-accent);\n color: var(--st-color-on-solid);\n }\n\n :host .card.dark {\n background: var(--st-cms-navy);\n border-color: var(--st-cms-navy);\n color: var(--st-cms-on-dark);\n }\n\n :host .card.primary .card-title {\n color: var(--st-color-on-solid);\n }\n\n :host .card.dark .card-title {\n color: var(--st-cms-on-dark);\n }\n\n :host .card.primary .card-description {\n color: color-mix(in oklch, var(--st-color-on-solid) 85%, transparent);\n }\n\n :host .card.dark .card-description {\n color: color-mix(in oklch, var(--st-cms-on-dark) 80%, transparent);\n }\n\n :host .card.primary .icon {\n background: color-mix(in oklch, var(--st-color-on-solid) 18%, transparent);\n color: var(--st-color-on-solid);\n }\n\n :host .card.dark .icon {\n background: color-mix(in oklch, var(--st-cms-on-dark) 12%, transparent);\n color: var(--st-cms-on-dark);\n }\n\n .card-description > :first-child {\n margin-top: 0;\n }\n\n .card-description > :last-child {\n margin-bottom: 0;\n }\n\n .card-description p {\n margin: 0 0 var(--st-space-8);\n }\n\n .card-description a {\n position: relative;\n color: inherit;\n text-decoration: underline;\n text-underline-offset: 3px;\n }\n\n /* Touch target: the link keeps its text size; a 44px hit area (WCAG 2.5.5) sits over it. */\n .card-description a::after {\n content: '';\n position: absolute;\n top: 50%;\n left: 50%;\n width: max(100%, 44px);\n height: 44px;\n transform: translate(-50%, -50%);\n }\n\n .action {\n ${ctaLinkStyles}\n align-self: flex-start;\n min-height: 44px;\n margin-top: var(--st-space-8);\n background: var(--st-button-primary-bg);\n color: var(--st-button-primary-color);\n font-weight: var(--st-button-font-weight);\n position: relative;\n z-index: 1;\n }\n\n .action:hover {\n transform: scale(1.03);\n }\n\n .action:focus-visible {\n outline: var(--st-focus-ring);\n outline-offset: 2px;\n }\n\n .card.primary .action {\n background: var(--st-cms-on-dark);\n color: var(--st-color-accent);\n }\n\n .card.dark .action {\n background: var(--st-cms-highlight);\n color: var(--st-cms-navy);\n }\n\n /* Design-system look, only on cards that use chips or layout (.v2). */\n .card.v2 .content {\n padding: var(--st-space-32);\n }\n\n .card.v2 .icon {\n width: 40px;\n height: 40px;\n border-radius: 10px;\n background: var(--st-cms-primary-100);\n color: var(--st-cms-accent-text, var(--st-cms-brand-navy));\n }\n\n :host .card.v2.primary .icon,\n :host .card.v2.dark .icon {\n background: var(--st-cms-highlight);\n color: var(--st-cms-navy);\n }\n\n :host .card.v2.primary .icon {\n background: var(--st-cms-highlight);\n }\n\n .card.row .content {\n flex-direction: row;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n }\n\n .card.row .text {\n flex: 1 1 360px;\n padding: 0;\n }\n\n .card.row .action {\n margin-top: 0;\n align-self: center;\n }\n\n .split {\n width: 100%;\n }\n\n .card.v2 .text {\n display: flex;\n flex-direction: column;\n gap: var(--st-space-12);\n }\n\n .card.v2 .card-title {\n margin: 0;\n font-size: 20px;\n font-weight: var(--st-font-weight-semibold);\n }\n\n .card.v2 .card-description {\n font-size: 14px;\n line-height: 1.5;\n color: var(--st-bento-description-color, var(--st-cms-text, var(--st-cms-navy-2, #03346b)));\n }\n\n .card.v2 .chip {\n padding: 12px 6px;\n border-radius: 8px;\n font-size: 13px;\n }\n\n /* The suite card: navy fill, light description, cyan icon tile (set above), white pill. */\n :host .card.v2.primary {\n background: var(--st-cms-brand-navy, #2144aa);\n border-color: var(--st-cms-brand-navy, #2144aa);\n }\n\n :host .card.v2.primary .card-description {\n color: var(--st-cms-primary-100, #e4ebff);\n }\n\n :host .card.v2.primary.row .action {\n min-height: 44px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0 20px;\n font-size: 15px;\n border-radius: var(--st-radius-full);\n background: var(--st-cms-on-dark);\n color: var(--st-cms-navy);\n }\n\n .split {\n display: grid;\n grid-template-columns: minmax(0, 1fr) minmax(0, 340px);\n gap: var(--st-space-24);\n align-items: center;\n }\n\n .split .text {\n padding: 0;\n }\n\n .chips {\n display: grid;\n grid-template-columns: repeat(3, minmax(0, 1fr));\n gap: var(--st-space-8);\n margin: 0;\n padding: 0;\n list-style: none;\n }\n\n .chip {\n display: flex;\n align-items: center;\n justify-content: center;\n min-width: 0;\n padding: var(--st-space-8) var(--st-space-12);\n border-radius: var(--st-radius-sm);\n background: var(--st-bento-chip-plain-bg, var(--st-cms-surface-soft));\n color: var(--st-bento-chip-text, var(--st-cms-text-strong, var(--st-cms-navy)));\n font-size: var(--st-text-sm);\n font-weight: var(--st-font-weight-semibold);\n line-height: 1.3;\n text-align: center;\n }\n\n .chip.solid {\n background: var(--st-cms-brand-navy);\n color: var(--st-cms-on-dark);\n }\n\n .chip.soft {\n background: var(--st-bento-chip-soft-bg, var(--st-cms-primary-100));\n color: var(--st-bento-chip-text, var(--st-cms-text-strong, var(--st-cms-navy)));\n }\n\n :host .card.dark .chip.plain {\n background: var(--st-cms-navy-2);\n color: var(--st-cms-on-dark);\n }\n\n @media (max-width: 1024px) {\n .split {\n grid-template-columns: minmax(0, 1fr);\n }\n }\n\n @media (max-width: 640px) {\n .chips {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n }\n }\n\n .col-1 { grid-column: span 1; }\n .col-2 { grid-column: span 2; }\n .col-3 { grid-column: span 3; }\n .col-4 { grid-column: span 4; }\n .row-1 { grid-row: span 1; }\n .row-2 { grid-row: span 2; }\n\n @media (max-width: 1024px) {\n .grid {\n grid-template-columns: repeat(2, 1fr);\n }\n .col-3,\n .col-4 {\n grid-column: span 2;\n }\n }\n\n @media (max-width: 640px) {\n .grid {\n grid-template-columns: 1fr;\n }\n .col-1,\n .col-2,\n .col-3,\n .col-4 {\n grid-column: span 1;\n }\n }\n\n ${reducedMotionStyles}\n `;\n\n @property({ type: Boolean, reflect: true })\n inverted = false;\n\n @property({ type: String })\n title = '';\n\n @property({ type: String })\n subtitle = '';\n\n @property({ attribute: false })\n items: BentoGridItem[] = [];\n\n private renderCard(item: BentoGridItem) {\n const variant = item.variant ?? 'default';\n const colSpan = item.colSpan ?? 1;\n const hasChips = !!item.chips?.length;\n const styled = hasChips || !!item.layout;\n const classes = [\n 'card',\n `col-${colSpan}`,\n `row-${item.rowSpan ?? 1}`,\n item.imageSrc ? 'has-image' : '',\n variant === 'default' ? '' : variant,\n styled ? 'v2' : '',\n item.layout === 'row' ? 'row' : ''\n ]\n .filter(Boolean)\n .join(' ');\n // A full-width card with chips puts them beside the text; elsewhere they follow the text.\n const beside = hasChips && colSpan === 4;\n // Row and beside layouts put the icon inside the text column, above the title; other cards keep it on top.\n const iconInText = beside || item.layout === 'row';\n const icon = item.icon\n ? html`<div class=\"icon\" part=\"icon\"><iconify-icon icon=${item.icon}></iconify-icon></div>`\n : nothing;\n const text = html`<div class=\"text\" part=\"text\">\n ${iconInText ? icon : nothing}\n <h3 class=\"card-title\" part=\"card-title\">${item.title}</h3>\n ${item.description\n ? html`<div class=\"card-description\" part=\"card-description\">${unsafeHTML(renderMarkdown(item.description))}</div>`\n : nothing}\n </div>`;\n const chips = hasChips\n ? html`<ul class=\"chips\" part=\"chips\">\n ${item.chips?.map(\n chip => html`<li class=\"chip ${chip.tone ?? 'plain'}\" part=\"chip\">${chip.label}</li>`\n )}\n </ul>`\n : nothing;\n const body = html`\n ${item.imageSrc\n ? html`<div class=\"image-wrapper\" part=\"image-wrapper\">\n <img class=\"image\" part=\"image\" src=${item.imageSrc} alt=${item.imageAlt ?? item.title} />\n </div>`\n : nothing}\n <div class=\"content\" part=\"content\">\n ${iconInText ? nothing : icon}\n ${beside\n ? html`<div class=\"split\">${text}${chips}</div>`\n : html`${text}${chips}`}\n ${item.href && item.actionLabel\n ? html`<a class=\"action\" part=\"action\" href=${item.href} aria-label=${item.actionAriaLabel || nothing}>${item.actionLabel}</a>`\n : nothing}\n </div>\n `;\n return item.href && !item.actionLabel\n ? html`<a part=\"card\" class=${classes} href=${item.href}>${body}</a>`\n : html`<div part=\"card\" class=${classes}>${body}</div>`;\n }\n\n render() {\n return html`\n <div class=\"container\" part=\"container\">\n ${this.title || this.subtitle\n ? html`<div class=\"header\" part=\"header\">\n ${this.title ? html`<h2 class=\"title\" part=\"title\">${this.title}</h2>` : nothing}\n ${this.subtitle ? html`<p class=\"subtitle\" part=\"subtitle\">${this.subtitle}</p>` : nothing}\n </div>`\n : nothing}\n <div class=\"grid\" part=\"grid\">${this.items.map((item) => this.renderCard(item))}</div>\n </div>\n `;\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
fontFamilyStyles
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-NXUS2CH7.js";
|
|
4
4
|
import {
|
|
5
5
|
__decorateClass
|
|
6
6
|
} from "./chunk-EUXUH3YW.js";
|
|
@@ -119,4 +119,4 @@ SegmentedControl = __decorateClass([
|
|
|
119
119
|
export {
|
|
120
120
|
SegmentedControl
|
|
121
121
|
};
|
|
122
|
-
//# sourceMappingURL=chunk-
|
|
122
|
+
//# sourceMappingURL=chunk-QS3ANOWN.js.map
|
|
@@ -2,7 +2,7 @@ import {
|
|
|
2
2
|
cardShellStyles,
|
|
3
3
|
controlBaseStyles,
|
|
4
4
|
fontFamilyStyles
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-NXUS2CH7.js";
|
|
6
6
|
import {
|
|
7
7
|
__decorateClass
|
|
8
8
|
} from "./chunk-EUXUH3YW.js";
|
|
@@ -115,4 +115,4 @@ Card = __decorateClass([
|
|
|
115
115
|
export {
|
|
116
116
|
Card
|
|
117
117
|
};
|
|
118
|
-
//# sourceMappingURL=chunk-
|
|
118
|
+
//# sourceMappingURL=chunk-QSJ543V2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/card/Card.ts"],"sourcesContent":["import { LitElement, css, html } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n\nimport { controlBaseStyles, cardShellStyles, fontFamilyStyles } from '../shared/styles';\n\n/**\n * A surfaced container — content goes in the default slot. Attributes: `variant`, `padding`,\n * `elevation`, `hoverable`, `inverted`; a click handler is just a native `click` listener on the\n * element. `padding` takes `none | small | medium | large`; `elevation` takes `none | sm | md | lg`.\n */\n@customElement('st-card')\nexport class Card extends LitElement {\n static styles = css`\n ${controlBaseStyles}\n\n :host {\n display: block;\n ${fontFamilyStyles}\n ${cardShellStyles}\n border-radius: var(--st-radius-lg);\n overflow: hidden;\n position: relative;\n transition:\n transform 0.3s ease,\n box-shadow 0.3s ease,\n border-color 0.3s ease;\n }\n\n :host([variant='bordered']) {\n border-color: var(--st-color-border-strong);\n }\n\n :host([elevation='sm']) {\n box-shadow: 0 1px 2px var(--st-shadow-color-sm);\n }\n\n :host([elevation='md']) {\n box-shadow: 0 4px 6px -1px var(--st-shadow-color-md);\n }\n\n :host([elevation='lg']) {\n box-shadow: 0 10px 15px -3px var(--st-shadow-color-lg);\n }\n\n :host([hoverable]:hover) {\n transform: translateY(-4px);\n box-shadow: 0 20px 25px -5px var(--st-shadow-color-xl);\n border-color: var(--st-color-border-strong);\n }\n\n :host([inverted]) {\n background: var(--st-color-text-strong);\n color: var(--st-color-on-solid);\n border-color: var(--st-color-text-strong);\n }\n\n .body {\n padding: var(--st-space-24);\n }\n\n :host([padding='none']) .body {\n padding: 0;\n }\n\n :host([padding='small']) .body {\n padding: var(--st-space-16);\n }\n\n :host([padding='large']) .body {\n padding: var(--st-space-32);\n }\n\n @media (prefers-reduced-motion: reduce) {\n :host {\n transition: none;\n }\n\n :host([hoverable]:hover) {\n transform: none;\n }\n }\n `;\n\n @property({ type: String, reflect: true })\n variant: 'default' | 'bordered' = 'default';\n\n @property({ type: String, reflect: true })\n padding: 'none' | 'small' | 'medium' | 'large' = 'medium';\n\n @property({ type: String, reflect: true })\n elevation: 'none' | 'sm' | 'md' | 'lg' = 'sm';\n\n @property({ type: Boolean, reflect: true })\n hoverable = false;\n\n @property({ type: Boolean, reflect: true })\n inverted = false;\n\n render() {\n return html`<div class=\"body\" part=\"body\"><slot></slot></div>`;\n }\n}\n"],"mappings":";;;;;;;;;;AAAA,SAAS,YAAY,KAAK,YAAY;AACtC,SAAS,eAAe,gBAAgB;AAUjC,IAAM,OAAN,cAAmB,WAAW;AAAA,EAA9B;AAAA;AAyEL,mBAAkC;AAGlC,mBAAiD;AAGjD,qBAAyC;AAGzC,qBAAY;AAGZ,oBAAW;AAAA;AAAA,EAEX,SAAS;AACP,WAAO;AAAA,EACT;AACF;AA1Fa,KACJ,SAAS;AAAA,MACZ,iBAAiB;AAAA;AAAA;AAAA;AAAA,QAIf,gBAAgB;AAAA,QAChB,eAAe;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;AAkErB;AAAA,EADC,SAAS,EAAE,MAAM,QAAQ,SAAS,KAAK,CAAC;AAAA,GAxE9B,KAyEX;AAGA;AAAA,EADC,SAAS,EAAE,MAAM,QAAQ,SAAS,KAAK,CAAC;AAAA,GA3E9B,KA4EX;AAGA;AAAA,EADC,SAAS,EAAE,MAAM,QAAQ,SAAS,KAAK,CAAC;AAAA,GA9E9B,KA+EX;AAGA;AAAA,EADC,SAAS,EAAE,MAAM,SAAS,SAAS,KAAK,CAAC;AAAA,GAjF/B,KAkFX;AAGA;AAAA,EADC,SAAS,EAAE,MAAM,SAAS,SAAS,KAAK,CAAC;AAAA,GApF/B,KAqFX;AArFW,OAAN;AAAA,EADN,cAAc,SAAS;AAAA,GACX;","names":[]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
fontFamilyStyles
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-NXUS2CH7.js";
|
|
4
4
|
import {
|
|
5
5
|
__decorateClass
|
|
6
6
|
} from "./chunk-EUXUH3YW.js";
|
|
@@ -104,4 +104,4 @@ Tooltip = __decorateClass([
|
|
|
104
104
|
export {
|
|
105
105
|
Tooltip
|
|
106
106
|
};
|
|
107
|
-
//# sourceMappingURL=chunk-
|
|
107
|
+
//# sourceMappingURL=chunk-RANC3OI6.js.map
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import {
|
|
2
|
+
arrowUpRightIcon
|
|
3
|
+
} from "./chunk-WTD2YIAA.js";
|
|
4
|
+
|
|
5
|
+
// src/shared/external-link.ts
|
|
6
|
+
import { html, nothing } from "lit";
|
|
7
|
+
function isExternalHref(href) {
|
|
8
|
+
if (!/^https?:\/\//i.test(href)) return false;
|
|
9
|
+
try {
|
|
10
|
+
return new URL(href).origin !== window.location.origin;
|
|
11
|
+
} catch {
|
|
12
|
+
return true;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
function externalLinkAttrs(href) {
|
|
16
|
+
const external = isExternalHref(href);
|
|
17
|
+
return { target: external ? "_blank" : nothing, rel: external ? "noopener noreferrer" : nothing };
|
|
18
|
+
}
|
|
19
|
+
var SR_ONLY = "position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0";
|
|
20
|
+
function externalLinkExtras(href) {
|
|
21
|
+
if (!isExternalHref(href)) return nothing;
|
|
22
|
+
return html`<span aria-hidden="true" style="display:inline-flex;margin-inline-start:6px;vertical-align:middle"
|
|
23
|
+
>${arrowUpRightIcon(14)}</span
|
|
24
|
+
><span style=${SR_ONLY}> (opens in new tab)</span>`;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export {
|
|
28
|
+
isExternalHref,
|
|
29
|
+
externalLinkAttrs,
|
|
30
|
+
externalLinkExtras
|
|
31
|
+
};
|
|
32
|
+
//# sourceMappingURL=chunk-T4BIN37Q.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/shared/external-link.ts"],"sourcesContent":["import { html, nothing, type TemplateResult } from 'lit';\nimport { arrowUpRightIcon } from './icons';\n\n/** True for an absolute http(s) URL on another origin: such a link leaves the site. */\nexport function isExternalHref(href: string): boolean {\n if (!/^https?:\\/\\//i.test(href)) return false;\n try {\n return new URL(href).origin !== window.location.origin;\n } catch {\n return true;\n }\n}\n\n/** `target` / `rel` for an anchor: a new tab with `noopener` for an external link, nothing otherwise. */\nexport function externalLinkAttrs(href: string): { target: string | typeof nothing; rel: string | typeof nothing } {\n const external = isExternalHref(href);\n return { target: external ? '_blank' : nothing, rel: external ? 'noopener noreferrer' : nothing };\n}\n\nconst SR_ONLY =\n 'position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0';\n\n/** The ↗ icon plus \"(opens in new tab)\" for screen readers, or nothing for an internal link. */\nexport function externalLinkExtras(href: string): TemplateResult | typeof nothing {\n if (!isExternalHref(href)) return nothing;\n return html`<span aria-hidden=\"true\" style=\"display:inline-flex;margin-inline-start:6px;vertical-align:middle\"\n >${arrowUpRightIcon(14)}</span\n ><span style=${SR_ONLY}> (opens in new tab)</span>`;\n}\n"],"mappings":";;;;;AAAA,SAAS,MAAM,eAAoC;AAI5C,SAAS,eAAe,MAAuB;AACpD,MAAI,CAAC,gBAAgB,KAAK,IAAI,EAAG,QAAO;AACxC,MAAI;AACF,WAAO,IAAI,IAAI,IAAI,EAAE,WAAW,OAAO,SAAS;AAAA,EAClD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAGO,SAAS,kBAAkB,MAAiF;AACjH,QAAM,WAAW,eAAe,IAAI;AACpC,SAAO,EAAE,QAAQ,WAAW,WAAW,SAAS,KAAK,WAAW,wBAAwB,QAAQ;AAClG;AAEA,IAAM,UACJ;AAGK,SAAS,mBAAmB,MAA+C;AAChF,MAAI,CAAC,eAAe,IAAI,EAAG,QAAO;AAClC,SAAO;AAAA,SACA,iBAAiB,EAAE,CAAC;AAAA,mBACV,OAAO;AAC1B;","names":[]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
controlBaseStyles,
|
|
3
3
|
rootFontFamilyStyles
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-NXUS2CH7.js";
|
|
5
5
|
import {
|
|
6
6
|
__decorateClass
|
|
7
7
|
} from "./chunk-EUXUH3YW.js";
|
|
@@ -124,4 +124,4 @@ Stats = __decorateClass([
|
|
|
124
124
|
export {
|
|
125
125
|
Stats
|
|
126
126
|
};
|
|
127
|
-
//# sourceMappingURL=chunk-
|
|
127
|
+
//# sourceMappingURL=chunk-TEAZZPDQ.js.map
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
// src/shared/markdown.ts
|
|
2
|
+
import DOMPurify from "dompurify";
|
|
3
|
+
import { Marked } from "marked";
|
|
4
|
+
var escapeHtml = (text) => text.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """);
|
|
5
|
+
var JSON_TOKEN = /("(?:\\.|[^"\\])*")(\s*:)?|\b(true|false|null)\b|(-?\d+(?:\.\d+)?(?:[eE][+-]?\d+)?)|([{}[\],])/g;
|
|
6
|
+
function highlightJson(source) {
|
|
7
|
+
let out = "";
|
|
8
|
+
let last = 0;
|
|
9
|
+
for (const match of source.matchAll(JSON_TOKEN)) {
|
|
10
|
+
const index = match.index ?? 0;
|
|
11
|
+
out += escapeHtml(source.slice(last, index));
|
|
12
|
+
const [whole, str, colon, literal, number, punct] = match;
|
|
13
|
+
if (str !== void 0) {
|
|
14
|
+
out += `<span class="${colon ? "tok-key" : "tok-string"}">${escapeHtml(str)}</span>`;
|
|
15
|
+
if (colon) out += `<span class="tok-punct">${escapeHtml(colon)}</span>`;
|
|
16
|
+
} else if (literal !== void 0) {
|
|
17
|
+
out += `<span class="tok-literal">${literal}</span>`;
|
|
18
|
+
} else if (number !== void 0) {
|
|
19
|
+
out += `<span class="tok-number">${number}</span>`;
|
|
20
|
+
} else if (punct !== void 0) {
|
|
21
|
+
out += `<span class="tok-punct">${escapeHtml(punct)}</span>`;
|
|
22
|
+
} else {
|
|
23
|
+
out += escapeHtml(whole);
|
|
24
|
+
}
|
|
25
|
+
last = index + whole.length;
|
|
26
|
+
}
|
|
27
|
+
return out + escapeHtml(source.slice(last));
|
|
28
|
+
}
|
|
29
|
+
var markdown = new Marked({
|
|
30
|
+
gfm: true,
|
|
31
|
+
breaks: true,
|
|
32
|
+
async: false,
|
|
33
|
+
renderer: {
|
|
34
|
+
code({ text, lang }) {
|
|
35
|
+
const language = (lang ?? "").trim().split(/\s+/)[0].toLowerCase();
|
|
36
|
+
if (language !== "json") return false;
|
|
37
|
+
return `<pre><code class="language-json">${highlightJson(text)}</code></pre>
|
|
38
|
+
`;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
function renderMarkdown(source) {
|
|
43
|
+
return DOMPurify.sanitize(markdown.parse(source));
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export {
|
|
47
|
+
renderMarkdown
|
|
48
|
+
};
|
|
49
|
+
//# sourceMappingURL=chunk-TJK55CJ2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/shared/markdown.ts"],"sourcesContent":["import DOMPurify from 'dompurify';\nimport { Marked, type Tokens } from 'marked';\n\nconst escapeHtml = (text: string): string =>\n text.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/\"/g, '"');\n\n/* One JSON token per match: a string (a key when a colon follows), a literal, a number or punctuation. */\nconst JSON_TOKEN = /(\"(?:\\\\.|[^\"\\\\])*\")(\\s*:)?|\\b(true|false|null)\\b|(-?\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?)|([{}[\\],])/g;\n\n/**\n * Wraps the tokens of a JSON code block in `<span class=\"tok-…\">` (key, string, number, literal,\n * punct) so `st-markdown` can colour them. Everything between tokens is copied through escaped.\n */\nexport function highlightJson(source: string): string {\n let out = '';\n let last = 0;\n for (const match of source.matchAll(JSON_TOKEN)) {\n const index = match.index ?? 0;\n out += escapeHtml(source.slice(last, index));\n const [whole, str, colon, literal, number, punct] = match;\n if (str !== undefined) {\n out += `<span class=\"${colon ? 'tok-key' : 'tok-string'}\">${escapeHtml(str)}</span>`;\n if (colon) out += `<span class=\"tok-punct\">${escapeHtml(colon)}</span>`;\n } else if (literal !== undefined) {\n out += `<span class=\"tok-literal\">${literal}</span>`;\n } else if (number !== undefined) {\n out += `<span class=\"tok-number\">${number}</span>`;\n } else if (punct !== undefined) {\n out += `<span class=\"tok-punct\">${escapeHtml(punct)}</span>`;\n } else {\n out += escapeHtml(whole);\n }\n last = index + whole.length;\n }\n return out + escapeHtml(source.slice(last));\n}\n\n/* Own instance, so the renderer override never leaks into other users of the global `marked`. */\nconst markdown = new Marked({\n gfm: true,\n breaks: true,\n async: false,\n renderer: {\n code({ text, lang }: Tokens.Code): string | false {\n const language = (lang ?? '').trim().split(/\\s+/)[0].toLowerCase();\n if (language !== 'json') return false;\n return `<pre><code class=\"language-json\">${highlightJson(text)}</code></pre>\\n`;\n }\n }\n});\n\n/**\n * Renders Markdown (GFM, single newlines become `<br>`) to HTML sanitized with DOMPurify. The one\n * place the CMS turns authored Markdown into markup; render the result with `unsafeHTML`.\n * ```json fences get token spans (see highlightJson) for syntax colours.\n */\nexport function renderMarkdown(source: string): string {\n return DOMPurify.sanitize(markdown.parse(source) as string);\n}\n"],"mappings":";AAAA,OAAO,eAAe;AACtB,SAAS,cAA2B;AAEpC,IAAM,aAAa,CAAC,SAClB,KAAK,QAAQ,MAAM,OAAO,EAAE,QAAQ,MAAM,MAAM,EAAE,QAAQ,MAAM,MAAM,EAAE,QAAQ,MAAM,QAAQ;AAGhG,IAAM,aAAa;AAMZ,SAAS,cAAc,QAAwB;AACpD,MAAI,MAAM;AACV,MAAI,OAAO;AACX,aAAW,SAAS,OAAO,SAAS,UAAU,GAAG;AAC/C,UAAM,QAAQ,MAAM,SAAS;AAC7B,WAAO,WAAW,OAAO,MAAM,MAAM,KAAK,CAAC;AAC3C,UAAM,CAAC,OAAO,KAAK,OAAO,SAAS,QAAQ,KAAK,IAAI;AACpD,QAAI,QAAQ,QAAW;AACrB,aAAO,gBAAgB,QAAQ,YAAY,YAAY,KAAK,WAAW,GAAG,CAAC;AAC3E,UAAI,MAAO,QAAO,2BAA2B,WAAW,KAAK,CAAC;AAAA,IAChE,WAAW,YAAY,QAAW;AAChC,aAAO,6BAA6B,OAAO;AAAA,IAC7C,WAAW,WAAW,QAAW;AAC/B,aAAO,4BAA4B,MAAM;AAAA,IAC3C,WAAW,UAAU,QAAW;AAC9B,aAAO,2BAA2B,WAAW,KAAK,CAAC;AAAA,IACrD,OAAO;AACL,aAAO,WAAW,KAAK;AAAA,IACzB;AACA,WAAO,QAAQ,MAAM;AAAA,EACvB;AACA,SAAO,MAAM,WAAW,OAAO,MAAM,IAAI,CAAC;AAC5C;AAGA,IAAM,WAAW,IAAI,OAAO;AAAA,EAC1B,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,UAAU;AAAA,IACR,KAAK,EAAE,MAAM,KAAK,GAAgC;AAChD,YAAM,YAAY,QAAQ,IAAI,KAAK,EAAE,MAAM,KAAK,EAAE,CAAC,EAAE,YAAY;AACjE,UAAI,aAAa,OAAQ,QAAO;AAChC,aAAO,oCAAoC,cAAc,IAAI,CAAC;AAAA;AAAA,IAChE;AAAA,EACF;AACF,CAAC;AAOM,SAAS,eAAe,QAAwB;AACrD,SAAO,UAAU,SAAS,SAAS,MAAM,MAAM,CAAW;AAC5D;","names":[]}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
// src/shared/nav-path.ts
|
|
2
|
+
var EXTERNAL = /^([a-z][a-z0-9+.-]*:|\/\/)/i;
|
|
3
|
+
function normalisePath(value) {
|
|
4
|
+
if (!value || EXTERNAL.test(value)) return "";
|
|
5
|
+
const pathname = value.split(/[?#]/, 1)[0].replace(/^\.\//, "");
|
|
6
|
+
if (!pathname) return "";
|
|
7
|
+
const absolute = pathname.startsWith("/") ? pathname : `/${pathname}`;
|
|
8
|
+
const trimmed = absolute.replace(/\/+$/, "");
|
|
9
|
+
return trimmed || "/";
|
|
10
|
+
}
|
|
11
|
+
function isCurrentPath(href, currentPath) {
|
|
12
|
+
const target = normalisePath(href);
|
|
13
|
+
if (!target) return false;
|
|
14
|
+
const current = normalisePath(currentPath) || "/";
|
|
15
|
+
if (target === "/") return current === "/";
|
|
16
|
+
return current === target || current.startsWith(`${target}/`);
|
|
17
|
+
}
|
|
18
|
+
function hasCurrentLink(root, selector, currentPath, ignoreWithin) {
|
|
19
|
+
return Array.from(root.querySelectorAll(selector)).some((el) => {
|
|
20
|
+
if (ignoreWithin) {
|
|
21
|
+
const skip = el.closest(ignoreWithin);
|
|
22
|
+
if (skip && root.contains(skip)) return false;
|
|
23
|
+
}
|
|
24
|
+
return isCurrentPath(el.href, currentPath) || isCurrentPath(el.ctaHref, currentPath);
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export {
|
|
29
|
+
isCurrentPath,
|
|
30
|
+
hasCurrentLink
|
|
31
|
+
};
|
|
32
|
+
//# sourceMappingURL=chunk-UKIVLF7S.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/shared/nav-path.ts"],"sourcesContent":["/**\n * Decides whether a nav link points at the page being shown. Used by `st-header` (and the nav items\n * it marks) to set `current` / `aria-current=\"page\"`.\n */\n\nconst EXTERNAL = /^([a-z][a-z0-9+.-]*:|\\/\\/)/i;\n\n/**\n * The pathname an `href` points at, normalised for comparison: a relative `t-pilot` becomes\n * `/t-pilot`, the query and hash are dropped, and trailing slashes are removed (`/` stays `/`).\n * Returns `''` for anything that is not a path on this site: external URLs, `#hash`-only and\n * `?query`-only links, or an empty value.\n */\nexport function normalisePath(value: string | undefined): string {\n if (!value || EXTERNAL.test(value)) return '';\n const pathname = value.split(/[?#]/, 1)[0].replace(/^\\.\\//, '');\n if (!pathname) return '';\n const absolute = pathname.startsWith('/') ? pathname : `/${pathname}`;\n const trimmed = absolute.replace(/\\/+$/, '');\n return trimmed || '/';\n}\n\n/**\n * True when `href` is the page at `currentPath`. `/` matches only `/`. Any other `href` matches the\n * same path and everything beneath it (`/products` is current on `/products/pricing`).\n */\nexport function isCurrentPath(href: string | undefined, currentPath: string | undefined): boolean {\n const target = normalisePath(href);\n if (!target) return false;\n const current = normalisePath(currentPath) || '/';\n if (target === '/') return current === '/';\n return current === target || current.startsWith(`${target}/`);\n}\n\n/** The links an element carries that can be the current page: `href`, plus `ctaHref` on a mega column. */\nexport interface NavLinkLike {\n href?: string;\n ctaHref?: string;\n}\n\n/**\n * Whether any of `root`'s descendant nav items (`selector`) links to `currentPath`. Items inside an\n * element matching `ignoreWithin` (e.g. a mega menu's intro/featured shortcuts) don't count.\n */\nexport function hasCurrentLink(root: Element, selector: string, currentPath: string, ignoreWithin?: string): boolean {\n return Array.from(root.querySelectorAll<HTMLElement & NavLinkLike>(selector)).some((el) => {\n if (ignoreWithin) {\n const skip = el.closest(ignoreWithin);\n if (skip && root.contains(skip)) return false;\n }\n return isCurrentPath(el.href, currentPath) || isCurrentPath(el.ctaHref, currentPath);\n });\n}\n"],"mappings":";AAKA,IAAM,WAAW;AAQV,SAAS,cAAc,OAAmC;AAC/D,MAAI,CAAC,SAAS,SAAS,KAAK,KAAK,EAAG,QAAO;AAC3C,QAAM,WAAW,MAAM,MAAM,QAAQ,CAAC,EAAE,CAAC,EAAE,QAAQ,SAAS,EAAE;AAC9D,MAAI,CAAC,SAAU,QAAO;AACtB,QAAM,WAAW,SAAS,WAAW,GAAG,IAAI,WAAW,IAAI,QAAQ;AACnE,QAAM,UAAU,SAAS,QAAQ,QAAQ,EAAE;AAC3C,SAAO,WAAW;AACpB;AAMO,SAAS,cAAc,MAA0B,aAA0C;AAChG,QAAM,SAAS,cAAc,IAAI;AACjC,MAAI,CAAC,OAAQ,QAAO;AACpB,QAAM,UAAU,cAAc,WAAW,KAAK;AAC9C,MAAI,WAAW,IAAK,QAAO,YAAY;AACvC,SAAO,YAAY,UAAU,QAAQ,WAAW,GAAG,MAAM,GAAG;AAC9D;AAYO,SAAS,eAAe,MAAe,UAAkB,aAAqB,cAAgC;AACnH,SAAO,MAAM,KAAK,KAAK,iBAA4C,QAAQ,CAAC,EAAE,KAAK,CAAC,OAAO;AACzF,QAAI,cAAc;AAChB,YAAM,OAAO,GAAG,QAAQ,YAAY;AACpC,UAAI,QAAQ,KAAK,SAAS,IAAI,EAAG,QAAO;AAAA,IAC1C;AACA,WAAO,cAAc,GAAG,MAAM,WAAW,KAAK,cAAc,GAAG,SAAS,WAAW;AAAA,EACrF,CAAC;AACH;","names":[]}
|