@sankhyatronics/sankhya-cms 0.1.4 → 0.1.5

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 (59) hide show
  1. package/custom-elements.json +525 -457
  2. package/dist/bento-grid/index.d.ts +5 -1
  3. package/dist/bento-grid/index.js +1 -1
  4. package/dist/{chunk-OEX5FDMR.js → chunk-2JGWWXEI.js} +4 -2
  5. package/dist/chunk-2JGWWXEI.js.map +1 -0
  6. package/dist/{chunk-USNFT4DU.js → chunk-6H262SG6.js} +8 -6
  7. package/dist/chunk-6H262SG6.js.map +1 -0
  8. package/dist/{chunk-E52WO7R7.js → chunk-BQTDFQ4V.js} +5 -3
  9. package/dist/chunk-BQTDFQ4V.js.map +1 -0
  10. package/dist/{chunk-74MILER4.js → chunk-EMVHNAID.js} +5 -3
  11. package/dist/chunk-EMVHNAID.js.map +1 -0
  12. package/dist/{chunk-3ERKQNZT.js → chunk-HGJT24UG.js} +7 -5
  13. package/dist/chunk-HGJT24UG.js.map +1 -0
  14. package/dist/{chunk-MLF6L3KM.js → chunk-HGTC3LCW.js} +6 -4
  15. package/dist/chunk-HGTC3LCW.js.map +1 -0
  16. package/dist/{chunk-S4ARRDAI.js → chunk-IDBEZY2O.js} +8 -6
  17. package/dist/chunk-IDBEZY2O.js.map +1 -0
  18. package/dist/{chunk-2VZFHTBC.js → chunk-MW43OS47.js} +5 -3
  19. package/dist/chunk-MW43OS47.js.map +1 -0
  20. package/dist/{chunk-N63TVWK3.js → chunk-NN3OCPDV.js} +23 -19
  21. package/dist/chunk-NN3OCPDV.js.map +1 -0
  22. package/dist/{chunk-IMACP7HN.js → chunk-UVNBZD7R.js} +5 -3
  23. package/dist/chunk-UVNBZD7R.js.map +1 -0
  24. package/dist/{chunk-5REZSZCK.js → chunk-VRRBMOUP.js} +5 -3
  25. package/dist/chunk-VRRBMOUP.js.map +1 -0
  26. package/dist/cms-theme.css +11 -0
  27. package/dist/content-block/index.d.ts +2 -0
  28. package/dist/content-block/index.js +1 -1
  29. package/dist/cookie-consent/index.d.ts +2 -0
  30. package/dist/cookie-consent/index.js +1 -1
  31. package/dist/feature-split/index.d.ts +5 -1
  32. package/dist/feature-split/index.js +1 -1
  33. package/dist/features-section/index.d.ts +2 -0
  34. package/dist/features-section/index.js +1 -1
  35. package/dist/index.js +32 -32
  36. package/dist/items-accordion/index.d.ts +5 -1
  37. package/dist/items-accordion/index.js +1 -1
  38. package/dist/mega-menu/index.d.ts +1 -0
  39. package/dist/mega-menu/index.js +1 -1
  40. package/dist/promo-banner/index.d.ts +3 -0
  41. package/dist/promo-banner/index.js +1 -1
  42. package/dist/section/index.d.ts +1 -0
  43. package/dist/section/index.js +1 -1
  44. package/dist/stats/index.d.ts +6 -1
  45. package/dist/stats/index.js +1 -1
  46. package/dist/testimonials/index.d.ts +1 -0
  47. package/dist/testimonials/index.js +2 -2
  48. package/package.json +4 -13
  49. package/dist/chunk-2VZFHTBC.js.map +0 -1
  50. package/dist/chunk-3ERKQNZT.js.map +0 -1
  51. package/dist/chunk-5REZSZCK.js.map +0 -1
  52. package/dist/chunk-74MILER4.js.map +0 -1
  53. package/dist/chunk-E52WO7R7.js.map +0 -1
  54. package/dist/chunk-IMACP7HN.js.map +0 -1
  55. package/dist/chunk-MLF6L3KM.js.map +0 -1
  56. package/dist/chunk-N63TVWK3.js.map +0 -1
  57. package/dist/chunk-OEX5FDMR.js.map +0 -1
  58. package/dist/chunk-S4ARRDAI.js.map +0 -1
  59. package/dist/chunk-USNFT4DU.js.map +0 -1
@@ -10,6 +10,12 @@
10
10
  "kind": "class",
11
11
  "description": "A responsive 4-column bento grid of icon/image cards. Items are set via the `items` property.",
12
12
  "name": "BentoGrid",
13
+ "cssProperties": [
14
+ {
15
+ "description": "Overrides the block's padding.",
16
+ "name": "--st-bento-grid-padding"
17
+ }
18
+ ],
13
19
  "members": [
14
20
  {
15
21
  "kind": "field",
@@ -648,6 +654,12 @@
648
654
  "kind": "class",
649
655
  "description": "A long-form article section: centered title/subtitle, an optional featured image with caption,\r\nthen Markdown body text. Ports `SankhyaUI`'s React `ContentBlock`. The body comes from\r\n`content-src` (a Markdown URL, as in the source) or an inline `content` string (added so the\r\nblock works without a fetch); `content-src` wins when both are set.",
650
656
  "name": "ContentBlock",
657
+ "cssProperties": [
658
+ {
659
+ "description": "Overrides the block's padding.",
660
+ "name": "--st-content-block-padding"
661
+ }
662
+ ],
651
663
  "members": [
652
664
  {
653
665
  "kind": "field",
@@ -828,6 +840,12 @@
828
840
  "kind": "class",
829
841
  "description": "Fixed bottom consent bar. The source read/wrote consent through a React `UserContext`; here the\r\nelement persists the choice itself in localStorage (`storage-key`, default the source's\r\n`sankhya_ui_cookie_consent`; storage errors are ignored) and renders nothing once a choice\r\nexists. Fires `cookie-consent-accept` / `cookie-consent-refuse` (detail `{ status }`). The\r\ndefault slot replaces the message text.",
830
842
  "name": "CookieConsent",
843
+ "cssProperties": [
844
+ {
845
+ "description": "Overrides the bar's padding.",
846
+ "name": "--st-cookie-consent-padding"
847
+ }
848
+ ],
831
849
  "members": [
832
850
  {
833
851
  "kind": "field",
@@ -1585,6 +1603,12 @@
1585
1603
  "kind": "class",
1586
1604
  "description": "A title/markdown-subtitle/feature-list block beside (or under) an image.",
1587
1605
  "name": "FeatureSplit",
1606
+ "cssProperties": [
1607
+ {
1608
+ "description": "Overrides the block's padding.",
1609
+ "name": "--st-feature-split-padding"
1610
+ }
1611
+ ],
1588
1612
  "members": [
1589
1613
  {
1590
1614
  "kind": "field",
@@ -1923,6 +1947,12 @@
1923
1947
  "kind": "class",
1924
1948
  "description": "A titled grid of feature tiles. Ports `SankhyaUI`'s React `FeaturesSection`: tiles come from the\r\n`items` property, from slotted `st-feature-item` elements (the source's `children`), or both\r\n(slotted first). `columns` sets the grid width (default 2; one column below 768px). `inverted`\r\nis passed on to the `items` tiles; slotted tiles need their own `inverted` attribute.",
1925
1949
  "name": "FeaturesSection",
1950
+ "cssProperties": [
1951
+ {
1952
+ "description": "Overrides the section's padding.",
1953
+ "name": "--st-features-section-padding"
1954
+ }
1955
+ ],
1926
1956
  "members": [
1927
1957
  {
1928
1958
  "kind": "field",
@@ -2324,32 +2354,12 @@
2324
2354
  },
2325
2355
  {
2326
2356
  "kind": "javascript-module",
2327
- "path": "src/hero/Hero.ts",
2357
+ "path": "src/header/Header.ts",
2328
2358
  "declarations": [
2329
2359
  {
2330
2360
  "kind": "class",
2331
- "description": "Full-width hero banner: background image with a darkening overlay, optional eyebrow, title,\r\noptional subtitle and up to two call-to-action links. Port of `SankhyaUI`'s React `Hero`; the\r\nframer-motion entrance is redone as CSS keyframes (skipped under `prefers-reduced-motion`).\r\n\r\n`size`, `content-position` and `overlay=\"gradient\"` give the large editorial layout (copy on the\r\nlower left over a gradient that darkens towards it) used by enterprise marketing heroes; the\r\ndefaults keep the original centered banner. Put several heroes in an `st-carousel` with\r\n`indicator-style=\"tabs\"` for a tabbed hero carousel.",
2332
- "name": "Hero",
2333
- "cssProperties": [
2334
- {
2335
- "description": "Text colour over the image.",
2336
- "name": "--st-hero-text-color"
2337
- },
2338
- {
2339
- "description": "Minimum height when `size` is `large` (default `640px`).",
2340
- "name": "--st-hero-min-height"
2341
- }
2342
- ],
2343
- "cssParts": [
2344
- {
2345
- "description": "The small label above the title.",
2346
- "name": "eyebrow"
2347
- },
2348
- {
2349
- "description": "The outlined second button.",
2350
- "name": "secondary-action"
2351
- }
2352
- ],
2361
+ "description": "The app-shell header bar — brand (image + title, or title alone) on the left, a `slot=\"menu\"`\r\nfor primary nav (e.g. `st-dropdown`/`st-menu-grid` mega-menus, or plain links) taking the\r\nmiddle, and a `slot=\"utility\"` for account/app-switcher/theme controls on the right. Ported\r\nfrom `SankhyaUI`'s React `Header` (a separate, unrelated marketing-site project) to this\r\npackage's Lit conventions and this workspace's actual needs — that source component takes an\r\n`imageSrc` logo with no text fallback, but none of this suite's apps has a logo image today, so\r\n`title` is the primary brand prop here and `brand-image-url` is optional, mirroring\r\n`st-app-header`'s own brand/title split (this component's slotted-menu/utility shape is a\r\ndeliberately different, more generic surface than `st-app-header`'s fixed nav-links/user-menu\r\nprops — pick whichever fits a given app's header).\r\n\r\nLayout follows the source's `Header.css`: the menu starts 4rem after the brand, the utility\r\ncontrols sit after a vertical divider, and below `BREAKPOINT_TABLET` (900px here; 768px in the\r\nsource) `menu`/`utility` collapse behind a hamburger toggle into a full-screen layer under the\r\ntoggle (closes on Escape or a click inside it), where the menu's `st-dropdown`s are switched to\r\n`inline` so they open in the flow — the same two slotted elements just get repositioned by CSS\r\n(`.mobile-panel`'s `display: contents` at desktop width vs. a real fixed-position box below\r\n`BREAKPOINT_TABLET`), rather than the slots being duplicated in the template, since a shadow\r\nroot can only ever assign a given light-DOM child to the *first* slot of a given name.\r\n\r\nAlso carries an optional built-in language switcher (`languages`/`currentLanguageCode`, fires\r\n`language-change`) — ported from `st-app-header`'s own implementation verbatim rather than\r\nrebuilt, since the source `Header`'s reference story shows an equivalent flag/language `Select`\r\nas a first-class header utility. Hidden entirely when `languages` has fewer than two entries.\r\nThis component has no translation logic itself; the consuming app owns what a language `code`\r\nmeans and which content it re-renders in response.",
2362
+ "name": "Header",
2353
2363
  "members": [
2354
2364
  {
2355
2365
  "kind": "field",
@@ -2362,59 +2372,53 @@
2362
2372
  },
2363
2373
  {
2364
2374
  "kind": "field",
2365
- "name": "subtitle",
2375
+ "name": "brandImageUrl",
2366
2376
  "type": {
2367
2377
  "text": "string"
2368
2378
  },
2369
2379
  "default": "''",
2370
- "attribute": "subtitle"
2380
+ "description": "Optional logo image URL, shown before `title`. Omitted entirely when empty — none of this suite's apps has one today. Matches the source component's `imageSrc` (renamed here to pair with `title`/`logoHref`, since this component's only image use is the brand mark).",
2381
+ "attribute": "brand-image-url"
2371
2382
  },
2372
2383
  {
2373
2384
  "kind": "field",
2374
- "name": "imageSrc",
2385
+ "name": "altText",
2375
2386
  "type": {
2376
2387
  "text": "string"
2377
2388
  },
2378
- "default": "''",
2379
- "attribute": "image-src"
2389
+ "default": "'Logo'",
2390
+ "description": "`alt` text for the brand image — matches the source component's `altText` (default `'Logo'`).",
2391
+ "attribute": "alt-text"
2380
2392
  },
2381
2393
  {
2382
2394
  "kind": "field",
2383
- "name": "actionLabel",
2395
+ "name": "logoHref",
2384
2396
  "type": {
2385
2397
  "text": "string"
2386
2398
  },
2387
2399
  "default": "''",
2388
- "attribute": "action-label"
2400
+ "description": "Wraps the brand in an `<a>` when set (e.g. `/`); a plain non-link `<div>` otherwise.",
2401
+ "attribute": "logoHref"
2389
2402
  },
2390
2403
  {
2391
2404
  "kind": "field",
2392
- "name": "href",
2405
+ "name": "logoTarget",
2393
2406
  "type": {
2394
2407
  "text": "string"
2395
2408
  },
2396
- "default": "''",
2397
- "attribute": "href"
2398
- },
2399
- {
2400
- "kind": "field",
2401
- "name": "textAlignment",
2402
- "type": {
2403
- "text": "'left' | 'center' | 'right' | 'justify'"
2404
- },
2405
- "default": "'left'",
2406
- "attribute": "text-alignment",
2407
- "reflects": true
2409
+ "default": "'_self'",
2410
+ "description": "`target` for the brand `<a>` — matches the source component's `logoTarget` (default `_self`). No effect when `logoHref` isn't set.",
2411
+ "attribute": "logo-target"
2408
2412
  },
2409
2413
  {
2410
2414
  "kind": "field",
2411
- "name": "padding",
2415
+ "name": "logoClassName",
2412
2416
  "type": {
2413
- "text": "'none' | 'small' | 'medium' | 'large'"
2417
+ "text": "string"
2414
2418
  },
2415
- "default": "'none'",
2416
- "attribute": "padding",
2417
- "reflects": true
2419
+ "default": "''",
2420
+ "description": "Extra class(es) appended to the brand link/div — matches the source component's `logoClassName`.",
2421
+ "attribute": "logo-class-name"
2418
2422
  },
2419
2423
  {
2420
2424
  "kind": "field",
@@ -2423,618 +2427,653 @@
2423
2427
  "text": "boolean"
2424
2428
  },
2425
2429
  "default": "false",
2430
+ "description": "Inverts the header's color roles (light-on-dark instead of dark-on-light) — matches the\r\nsource component's `inverted` (from its shared `BaseProps`).",
2426
2431
  "attribute": "inverted",
2427
2432
  "reflects": true
2428
2433
  },
2429
2434
  {
2430
2435
  "kind": "field",
2431
- "name": "focalPoint",
2436
+ "name": "sticky",
2432
2437
  "type": {
2433
- "text": "'top' | 'left' | 'right' | 'bottom' | 'center'"
2438
+ "text": "boolean"
2434
2439
  },
2435
- "default": "'center'",
2436
- "attribute": "focal-point"
2440
+ "default": "false",
2441
+ "attribute": "sticky",
2442
+ "reflects": true
2437
2443
  },
2438
2444
  {
2439
2445
  "kind": "field",
2440
- "name": "eyebrow",
2446
+ "name": "transparent",
2441
2447
  "type": {
2442
- "text": "string"
2448
+ "text": "boolean"
2443
2449
  },
2444
- "default": "''",
2445
- "description": "Small uppercase label above the title (e.g. an event or product name).",
2446
- "attribute": "eyebrow"
2450
+ "default": "false",
2451
+ "description": "Fixes the header over the top of the page and makes it see-through, with light text\r\n(`--st-header-transparent-color`), until the page scrolls past `scroll-threshold` — for a\r\nheader laid over a dark hero. It then takes its normal background and a shadow. The page\r\ncontent starts under it, so the first section should leave room for the 64px bar.",
2452
+ "attribute": "transparent",
2453
+ "reflects": true
2447
2454
  },
2448
2455
  {
2449
2456
  "kind": "field",
2450
- "name": "secondaryActionLabel",
2457
+ "name": "hideOnScroll",
2451
2458
  "type": {
2452
- "text": "string"
2459
+ "text": "boolean"
2453
2460
  },
2454
- "default": "''",
2455
- "description": "Label of an outlined second button next to the primary one.",
2456
- "attribute": "secondary-action-label"
2461
+ "default": "false",
2462
+ "description": "Slides the header out of view while the page scrolls down and back in when it scrolls up.",
2463
+ "attribute": "hide-on-scroll",
2464
+ "reflects": true
2457
2465
  },
2458
2466
  {
2459
2467
  "kind": "field",
2460
- "name": "secondaryHref",
2468
+ "name": "scrollThreshold",
2461
2469
  "type": {
2462
- "text": "string"
2470
+ "text": "number"
2463
2471
  },
2464
- "default": "''",
2465
- "attribute": "secondary-href"
2472
+ "default": "8",
2473
+ "description": "Scroll distance in px after which the header counts as `scrolled`.",
2474
+ "attribute": "scroll-threshold"
2466
2475
  },
2467
2476
  {
2468
2477
  "kind": "field",
2469
- "name": "size",
2478
+ "name": "scrolled",
2470
2479
  "type": {
2471
- "text": "'auto' | 'large' | 'full'"
2480
+ "text": "boolean"
2472
2481
  },
2473
- "default": "'auto'",
2474
- "description": "`auto` sizes to the content; `large` is a tall editorial hero (`--st-hero-min-height`); `full` fills the viewport.",
2475
- "attribute": "size",
2482
+ "default": "false",
2483
+ "description": "True once the page has scrolled past `scroll-threshold`; reflected so pages can style `st-header[scrolled]`. Set by the header, never from outside.",
2484
+ "attribute": "scrolled",
2476
2485
  "reflects": true
2477
2486
  },
2478
2487
  {
2479
2488
  "kind": "field",
2480
- "name": "contentPosition",
2489
+ "name": "scrollHidden",
2481
2490
  "type": {
2482
- "text": "'center' | 'bottom'"
2491
+ "text": "boolean"
2483
2492
  },
2484
- "default": "'center'",
2485
- "description": "`center` keeps the copy in the middle; `bottom` puts it in the lower part of the hero, on the page container.",
2486
- "attribute": "content-position",
2493
+ "default": "false",
2494
+ "description": "True while `hide-on-scroll` has slid the header away. Set by the header, never from outside.",
2495
+ "attribute": "scroll-hidden",
2487
2496
  "reflects": true
2488
2497
  },
2489
2498
  {
2490
2499
  "kind": "field",
2491
- "name": "overlay",
2500
+ "name": "lastScrollY",
2492
2501
  "type": {
2493
- "text": "'even' | 'gradient' | 'none'"
2502
+ "text": "number"
2494
2503
  },
2495
- "default": "'even'",
2496
- "description": "`even` darkens the whole image; `gradient` darkens behind the copy only; `none` shows the image as is.",
2497
- "attribute": "overlay",
2498
- "reflects": true
2504
+ "privacy": "private",
2505
+ "default": "0"
2499
2506
  },
2500
2507
  {
2501
2508
  "kind": "field",
2502
- "name": "positions",
2503
- "privacy": "private",
2504
- "static": true,
2505
- "default": "{ top: 'center top', left: 'left center', right: 'right center', bottom: 'center bottom', center: 'center center' }",
2509
+ "name": "scrollFrame",
2506
2510
  "type": {
2507
- "text": "{\r\n top: 'center top',\r\n left: 'left center',\r\n right: 'right center',\r\n bottom: 'center bottom',\r\n center: 'center center'\r\n }"
2508
- }
2509
- },
2510
- {
2511
- "kind": "method",
2512
- "name": "emitAction",
2513
- "privacy": "private",
2514
- "return": {
2515
- "type": {
2516
- "text": "void"
2517
- }
2511
+ "text": "number"
2518
2512
  },
2519
- "parameters": [
2520
- {
2521
- "name": "event",
2522
- "type": {
2523
- "text": "MouseEvent"
2524
- }
2525
- },
2526
- {
2527
- "name": "href",
2528
- "type": {
2529
- "text": "string"
2530
- }
2531
- },
2532
- {
2533
- "name": "kind",
2534
- "type": {
2535
- "text": "'primary' | 'secondary'"
2536
- }
2537
- }
2538
- ]
2513
+ "privacy": "private",
2514
+ "default": "0"
2539
2515
  },
2540
2516
  {
2541
2517
  "kind": "field",
2542
- "name": "onClick",
2518
+ "name": "onScroll",
2543
2519
  "privacy": "private"
2544
2520
  },
2545
2521
  {
2546
2522
  "kind": "field",
2547
- "name": "onSecondaryClick",
2548
- "privacy": "private"
2549
- }
2550
- ],
2551
- "events": [
2552
- {
2553
- "description": "Cancelable, before navigating. Detail `{ href, kind }`, `kind` being `primary` or `secondary`.",
2554
- "name": "action"
2555
- }
2556
- ],
2557
- "attributes": [
2558
- {
2559
- "name": "title",
2523
+ "name": "languages",
2560
2524
  "type": {
2561
- "text": "string"
2525
+ "text": "{ code: string; label: string }[]"
2562
2526
  },
2563
- "default": "''",
2564
- "fieldName": "title"
2527
+ "default": "[]",
2528
+ "description": "Language switcher options, e.g. `[{ code: 'en', label: 'English' }, ...]` — hidden entirely\r\nwhen empty or when only one language is offered (same convention as `st-app-header`'s\r\n`languages`, which this reuses verbatim). This component has no translation logic itself —\r\nselecting an option fires `language-change` (detail: `{ code }`), and the consuming app owns\r\nwhat `code` actually means and which content it re-renders."
2565
2529
  },
2566
2530
  {
2567
- "name": "subtitle",
2531
+ "kind": "field",
2532
+ "name": "currentLanguageCode",
2568
2533
  "type": {
2569
2534
  "text": "string"
2570
2535
  },
2571
2536
  "default": "''",
2572
- "fieldName": "subtitle"
2537
+ "attribute": "current-language-code"
2573
2538
  },
2574
2539
  {
2575
- "name": "image-src",
2540
+ "kind": "field",
2541
+ "name": "languageMenuLabel",
2576
2542
  "type": {
2577
2543
  "text": "string"
2578
2544
  },
2579
- "default": "''",
2580
- "fieldName": "imageSrc"
2545
+ "default": "'Language'",
2546
+ "attribute": "language-menu-label"
2581
2547
  },
2582
2548
  {
2583
- "name": "action-label",
2549
+ "kind": "field",
2550
+ "name": "mobileOpen",
2584
2551
  "type": {
2585
- "text": "string"
2552
+ "text": "boolean"
2586
2553
  },
2587
- "default": "''",
2588
- "fieldName": "actionLabel"
2554
+ "default": "false",
2555
+ "description": "Internal open/closed state for the mobile nav overlay, reflected to an attribute purely so\r\nthe `:host([mobile-open])` CSS selector above can react to it — not meant to be set from\r\noutside.",
2556
+ "attribute": "mobile-open",
2557
+ "reflects": true
2589
2558
  },
2590
2559
  {
2591
- "name": "href",
2560
+ "kind": "field",
2561
+ "name": "compact",
2592
2562
  "type": {
2593
- "text": "string"
2563
+ "text": "boolean"
2594
2564
  },
2595
- "default": "''",
2596
- "fieldName": "href"
2565
+ "default": "false",
2566
+ "description": "True while the menu doesn't fit the bar at the current width: the header then shows the same\r\nhamburger layout it uses on a narrow screen. Set by `evaluateFit`, never from outside.",
2567
+ "attribute": "compact",
2568
+ "reflects": true
2597
2569
  },
2598
2570
  {
2599
- "name": "text-alignment",
2600
- "type": {
2601
- "text": "'left' | 'center' | 'right' | 'justify'"
2602
- },
2603
- "default": "'left'",
2604
- "fieldName": "textAlignment"
2605
- },
2606
- {
2607
- "name": "padding",
2571
+ "kind": "field",
2572
+ "name": "languageMenuOpen",
2608
2573
  "type": {
2609
- "text": "'none' | 'small' | 'medium' | 'large'"
2574
+ "text": "boolean"
2610
2575
  },
2611
- "default": "'none'",
2612
- "fieldName": "padding"
2576
+ "privacy": "private",
2577
+ "default": "false"
2613
2578
  },
2614
2579
  {
2615
- "name": "inverted",
2580
+ "kind": "field",
2581
+ "name": "hasUtility",
2616
2582
  "type": {
2617
2583
  "text": "boolean"
2618
2584
  },
2585
+ "privacy": "private",
2619
2586
  "default": "false",
2620
- "fieldName": "inverted"
2587
+ "description": "Whether `slot=\"utility\"` has content — an empty utility row (and its divider) is hidden."
2621
2588
  },
2622
2589
  {
2623
- "name": "focal-point",
2590
+ "kind": "field",
2591
+ "name": "resizeObserver",
2624
2592
  "type": {
2625
- "text": "'top' | 'left' | 'right' | 'bottom' | 'center'"
2593
+ "text": "ResizeObserver | undefined"
2626
2594
  },
2627
- "default": "'center'",
2628
- "fieldName": "focalPoint"
2595
+ "privacy": "private"
2629
2596
  },
2630
2597
  {
2631
- "name": "eyebrow",
2598
+ "kind": "field",
2599
+ "name": "narrowQuery",
2632
2600
  "type": {
2633
- "text": "string"
2601
+ "text": "MediaQueryList | undefined"
2634
2602
  },
2635
- "default": "''",
2636
- "description": "Small uppercase label above the title (e.g. an event or product name).",
2637
- "fieldName": "eyebrow"
2603
+ "privacy": "private",
2604
+ "description": "Matches below BREAKPOINT_TABLET, where the hamburger layout is always on."
2638
2605
  },
2639
2606
  {
2640
- "name": "secondary-action-label",
2607
+ "kind": "field",
2608
+ "name": "inlinedDropdowns",
2609
+ "privacy": "private",
2610
+ "default": "new Set<HTMLElement & { inline: boolean; open: boolean }>()",
2611
+ "description": "The dropdowns this header switched to `inline` — only these are switched back, so a caller's\r\nown `inline` setting is left alone."
2612
+ },
2613
+ {
2614
+ "kind": "field",
2615
+ "name": "syncInlineDropdowns",
2616
+ "privacy": "private",
2617
+ "description": "While the hamburger layout is on, the dropdowns in the header open in the flow of the\r\nfull-screen panel instead of floating over it (SankhyaUI's touch-device layout)."
2618
+ },
2619
+ {
2620
+ "kind": "field",
2621
+ "name": "onUtilitySlotChange",
2622
+ "privacy": "private"
2623
+ },
2624
+ {
2625
+ "kind": "field",
2626
+ "name": "onMenuSlotChange",
2627
+ "privacy": "private"
2628
+ },
2629
+ {
2630
+ "kind": "field",
2631
+ "name": "collapsedAtWidth",
2641
2632
  "type": {
2642
- "text": "string"
2633
+ "text": "number"
2643
2634
  },
2644
- "default": "''",
2645
- "description": "Label of an outlined second button next to the primary one.",
2646
- "fieldName": "secondaryActionLabel"
2635
+ "privacy": "private",
2636
+ "default": "0",
2637
+ "description": "The bar width at which the menu last overflowed — the bar only expands again once it is\r\nclearly wider than this, so it can't flip back and forth right at the threshold."
2647
2638
  },
2648
2639
  {
2649
- "name": "secondary-href",
2650
- "type": {
2651
- "text": "string"
2640
+ "kind": "field",
2641
+ "name": "evaluateFit",
2642
+ "privacy": "private",
2643
+ "description": "Collapses to the hamburger layout when the slotted menu overflows its row, and expands again\r\nonce there is room. The collapsed layout hides the menu, so the room it needs can't be\r\nmeasured then; the width remembered when it collapsed stands in for it."
2644
+ },
2645
+ {
2646
+ "kind": "method",
2647
+ "name": "menuOverflows",
2648
+ "privacy": "private",
2649
+ "return": {
2650
+ "type": {
2651
+ "text": "boolean"
2652
+ }
2652
2653
  },
2653
- "default": "''",
2654
- "fieldName": "secondaryHref"
2654
+ "description": "Whether the visible menu items reach past the right edge of the menu row. Measured from the\r\nitems' own boxes (the slotted elements and their direct children), not the row's scrollWidth:\r\na closed dropdown's absolutely positioned panel also counts towards scrollWidth, which would\r\nreport overflow at any width."
2655
2655
  },
2656
2656
  {
2657
- "name": "size",
2657
+ "kind": "field",
2658
+ "name": "lightDomObserver",
2658
2659
  "type": {
2659
- "text": "'auto' | 'large' | 'full'"
2660
+ "text": "MutationObserver | undefined"
2660
2661
  },
2661
- "default": "'auto'",
2662
- "description": "`auto` sizes to the content; `large` is a tall editorial hero (`--st-hero-min-height`); `full` fills the viewport.",
2663
- "fieldName": "size"
2662
+ "privacy": "private"
2664
2663
  },
2665
2664
  {
2666
- "name": "content-position",
2667
- "type": {
2668
- "text": "'center' | 'bottom'"
2665
+ "kind": "field",
2666
+ "name": "closeOnEscape",
2667
+ "privacy": "private"
2668
+ },
2669
+ {
2670
+ "kind": "field",
2671
+ "name": "closeLanguageMenuOnOutsideClick",
2672
+ "privacy": "private"
2673
+ },
2674
+ {
2675
+ "kind": "method",
2676
+ "name": "renderLanguageMenu",
2677
+ "privacy": "private"
2678
+ },
2679
+ {
2680
+ "kind": "method",
2681
+ "name": "onLanguageSelect",
2682
+ "privacy": "private",
2683
+ "return": {
2684
+ "type": {
2685
+ "text": "void"
2686
+ }
2669
2687
  },
2670
- "default": "'center'",
2671
- "description": "`center` keeps the copy in the middle; `bottom` puts it in the lower part of the hero, on the page container.",
2672
- "fieldName": "contentPosition"
2688
+ "parameters": [
2689
+ {
2690
+ "name": "code",
2691
+ "type": {
2692
+ "text": "string"
2693
+ }
2694
+ }
2695
+ ]
2673
2696
  },
2674
2697
  {
2675
- "name": "overlay",
2698
+ "kind": "method",
2699
+ "name": "renderBrand",
2700
+ "privacy": "private"
2701
+ }
2702
+ ],
2703
+ "events": [
2704
+ {
2705
+ "name": "language-change",
2676
2706
  "type": {
2677
- "text": "'even' | 'gradient' | 'none'"
2678
- },
2679
- "default": "'even'",
2680
- "description": "`even` darkens the whole image; `gradient` darkens behind the copy only; `none` shows the image as is.",
2681
- "fieldName": "overlay"
2707
+ "text": "CustomEvent"
2708
+ }
2682
2709
  }
2683
2710
  ],
2684
- "superclass": {
2685
- "name": "LitElement",
2686
- "package": "lit"
2687
- },
2688
- "tagName": "st-hero",
2689
- "customElement": true
2690
- }
2691
- ],
2692
- "exports": [
2693
- {
2694
- "kind": "js",
2695
- "name": "Hero",
2696
- "declaration": {
2697
- "name": "Hero",
2698
- "module": "src/hero/Hero.ts"
2699
- }
2700
- },
2701
- {
2702
- "kind": "custom-element-definition",
2703
- "name": "st-hero",
2704
- "declaration": {
2705
- "name": "Hero",
2706
- "module": "src/hero/Hero.ts"
2707
- }
2708
- }
2709
- ]
2710
- },
2711
- {
2712
- "kind": "javascript-module",
2713
- "path": "src/header/Header.ts",
2714
- "declarations": [
2715
- {
2716
- "kind": "class",
2717
- "description": "The app-shell header bar — brand (image + title, or title alone) on the left, a `slot=\"menu\"`\r\nfor primary nav (e.g. `st-dropdown`/`st-menu-grid` mega-menus, or plain links) taking the\r\nmiddle, and a `slot=\"utility\"` for account/app-switcher/theme controls on the right. Ported\r\nfrom `SankhyaUI`'s React `Header` (a separate, unrelated marketing-site project) to this\r\npackage's Lit conventions and this workspace's actual needs — that source component takes an\r\n`imageSrc` logo with no text fallback, but none of this suite's apps has a logo image today, so\r\n`title` is the primary brand prop here and `brand-image-url` is optional, mirroring\r\n`st-app-header`'s own brand/title split (this component's slotted-menu/utility shape is a\r\ndeliberately different, more generic surface than `st-app-header`'s fixed nav-links/user-menu\r\nprops — pick whichever fits a given app's header).\r\n\r\nLayout follows the source's `Header.css`: the menu starts 4rem after the brand, the utility\r\ncontrols sit after a vertical divider, and below `BREAKPOINT_TABLET` (900px here; 768px in the\r\nsource) `menu`/`utility` collapse behind a hamburger toggle into a full-screen layer under the\r\ntoggle (closes on Escape or a click inside it), where the menu's `st-dropdown`s are switched to\r\n`inline` so they open in the flow — the same two slotted elements just get repositioned by CSS\r\n(`.mobile-panel`'s `display: contents` at desktop width vs. a real fixed-position box below\r\n`BREAKPOINT_TABLET`), rather than the slots being duplicated in the template, since a shadow\r\nroot can only ever assign a given light-DOM child to the *first* slot of a given name.\r\n\r\nAlso carries an optional built-in language switcher (`languages`/`currentLanguageCode`, fires\r\n`language-change`) — ported from `st-app-header`'s own implementation verbatim rather than\r\nrebuilt, since the source `Header`'s reference story shows an equivalent flag/language `Select`\r\nas a first-class header utility. Hidden entirely when `languages` has fewer than two entries.\r\nThis component has no translation logic itself; the consuming app owns what a language `code`\r\nmeans and which content it re-renders in response.",
2718
- "name": "Header",
2719
- "members": [
2711
+ "attributes": [
2720
2712
  {
2721
- "kind": "field",
2722
2713
  "name": "title",
2723
2714
  "type": {
2724
2715
  "text": "string"
2725
2716
  },
2726
2717
  "default": "''",
2727
- "attribute": "title"
2718
+ "fieldName": "title"
2728
2719
  },
2729
2720
  {
2730
- "kind": "field",
2731
- "name": "brandImageUrl",
2721
+ "name": "brand-image-url",
2732
2722
  "type": {
2733
2723
  "text": "string"
2734
2724
  },
2735
2725
  "default": "''",
2736
2726
  "description": "Optional logo image URL, shown before `title`. Omitted entirely when empty — none of this suite's apps has one today. Matches the source component's `imageSrc` (renamed here to pair with `title`/`logoHref`, since this component's only image use is the brand mark).",
2737
- "attribute": "brand-image-url"
2727
+ "fieldName": "brandImageUrl"
2738
2728
  },
2739
2729
  {
2740
- "kind": "field",
2741
- "name": "altText",
2730
+ "name": "alt-text",
2742
2731
  "type": {
2743
2732
  "text": "string"
2744
2733
  },
2745
2734
  "default": "'Logo'",
2746
2735
  "description": "`alt` text for the brand image — matches the source component's `altText` (default `'Logo'`).",
2747
- "attribute": "alt-text"
2736
+ "fieldName": "altText"
2748
2737
  },
2749
2738
  {
2750
- "kind": "field",
2751
2739
  "name": "logoHref",
2752
2740
  "type": {
2753
2741
  "text": "string"
2754
2742
  },
2755
2743
  "default": "''",
2756
2744
  "description": "Wraps the brand in an `<a>` when set (e.g. `/`); a plain non-link `<div>` otherwise.",
2757
- "attribute": "logoHref"
2745
+ "fieldName": "logoHref"
2758
2746
  },
2759
2747
  {
2760
- "kind": "field",
2761
- "name": "logoTarget",
2748
+ "name": "logo-target",
2762
2749
  "type": {
2763
2750
  "text": "string"
2764
2751
  },
2765
2752
  "default": "'_self'",
2766
2753
  "description": "`target` for the brand `<a>` — matches the source component's `logoTarget` (default `_self`). No effect when `logoHref` isn't set.",
2767
- "attribute": "logo-target"
2754
+ "fieldName": "logoTarget"
2768
2755
  },
2769
2756
  {
2770
- "kind": "field",
2771
- "name": "logoClassName",
2757
+ "name": "logo-class-name",
2772
2758
  "type": {
2773
2759
  "text": "string"
2774
2760
  },
2775
2761
  "default": "''",
2776
2762
  "description": "Extra class(es) appended to the brand link/div — matches the source component's `logoClassName`.",
2777
- "attribute": "logo-class-name"
2763
+ "fieldName": "logoClassName"
2778
2764
  },
2779
2765
  {
2780
- "kind": "field",
2781
2766
  "name": "inverted",
2782
2767
  "type": {
2783
2768
  "text": "boolean"
2784
2769
  },
2785
2770
  "default": "false",
2786
2771
  "description": "Inverts the header's color roles (light-on-dark instead of dark-on-light) — matches the\r\nsource component's `inverted` (from its shared `BaseProps`).",
2787
- "attribute": "inverted",
2788
- "reflects": true
2772
+ "fieldName": "inverted"
2789
2773
  },
2790
2774
  {
2791
- "kind": "field",
2792
2775
  "name": "sticky",
2793
2776
  "type": {
2794
2777
  "text": "boolean"
2795
2778
  },
2796
2779
  "default": "false",
2797
- "attribute": "sticky",
2798
- "reflects": true
2780
+ "fieldName": "sticky"
2799
2781
  },
2800
2782
  {
2801
- "kind": "field",
2802
2783
  "name": "transparent",
2803
2784
  "type": {
2804
2785
  "text": "boolean"
2805
2786
  },
2806
2787
  "default": "false",
2807
2788
  "description": "Fixes the header over the top of the page and makes it see-through, with light text\r\n(`--st-header-transparent-color`), until the page scrolls past `scroll-threshold` — for a\r\nheader laid over a dark hero. It then takes its normal background and a shadow. The page\r\ncontent starts under it, so the first section should leave room for the 64px bar.",
2808
- "attribute": "transparent",
2809
- "reflects": true
2789
+ "fieldName": "transparent"
2810
2790
  },
2811
2791
  {
2812
- "kind": "field",
2813
- "name": "hideOnScroll",
2792
+ "name": "hide-on-scroll",
2814
2793
  "type": {
2815
2794
  "text": "boolean"
2816
2795
  },
2817
2796
  "default": "false",
2818
2797
  "description": "Slides the header out of view while the page scrolls down and back in when it scrolls up.",
2819
- "attribute": "hide-on-scroll",
2820
- "reflects": true
2798
+ "fieldName": "hideOnScroll"
2821
2799
  },
2822
2800
  {
2823
- "kind": "field",
2824
- "name": "scrollThreshold",
2801
+ "name": "scroll-threshold",
2825
2802
  "type": {
2826
2803
  "text": "number"
2827
2804
  },
2828
2805
  "default": "8",
2829
2806
  "description": "Scroll distance in px after which the header counts as `scrolled`.",
2830
- "attribute": "scroll-threshold"
2807
+ "fieldName": "scrollThreshold"
2831
2808
  },
2832
2809
  {
2833
- "kind": "field",
2834
2810
  "name": "scrolled",
2835
2811
  "type": {
2836
2812
  "text": "boolean"
2837
2813
  },
2838
2814
  "default": "false",
2839
2815
  "description": "True once the page has scrolled past `scroll-threshold`; reflected so pages can style `st-header[scrolled]`. Set by the header, never from outside.",
2840
- "attribute": "scrolled",
2841
- "reflects": true
2816
+ "fieldName": "scrolled"
2842
2817
  },
2843
2818
  {
2844
- "kind": "field",
2845
- "name": "scrollHidden",
2819
+ "name": "scroll-hidden",
2846
2820
  "type": {
2847
2821
  "text": "boolean"
2848
2822
  },
2849
2823
  "default": "false",
2850
2824
  "description": "True while `hide-on-scroll` has slid the header away. Set by the header, never from outside.",
2851
- "attribute": "scroll-hidden",
2852
- "reflects": true
2825
+ "fieldName": "scrollHidden"
2853
2826
  },
2854
2827
  {
2855
- "kind": "field",
2856
- "name": "lastScrollY",
2828
+ "name": "current-language-code",
2857
2829
  "type": {
2858
- "text": "number"
2830
+ "text": "string"
2859
2831
  },
2860
- "privacy": "private",
2861
- "default": "0"
2832
+ "default": "''",
2833
+ "fieldName": "currentLanguageCode"
2862
2834
  },
2863
2835
  {
2864
- "kind": "field",
2865
- "name": "scrollFrame",
2836
+ "name": "language-menu-label",
2866
2837
  "type": {
2867
- "text": "number"
2838
+ "text": "string"
2868
2839
  },
2869
- "privacy": "private",
2870
- "default": "0"
2840
+ "default": "'Language'",
2841
+ "fieldName": "languageMenuLabel"
2871
2842
  },
2872
2843
  {
2873
- "kind": "field",
2874
- "name": "onScroll",
2875
- "privacy": "private"
2844
+ "name": "mobile-open",
2845
+ "type": {
2846
+ "text": "boolean"
2847
+ },
2848
+ "default": "false",
2849
+ "description": "Internal open/closed state for the mobile nav overlay, reflected to an attribute purely so\r\nthe `:host([mobile-open])` CSS selector above can react to it — not meant to be set from\r\noutside.",
2850
+ "fieldName": "mobileOpen"
2876
2851
  },
2877
2852
  {
2878
- "kind": "field",
2879
- "name": "languages",
2853
+ "name": "compact",
2880
2854
  "type": {
2881
- "text": "{ code: string; label: string }[]"
2855
+ "text": "boolean"
2882
2856
  },
2883
- "default": "[]",
2884
- "description": "Language switcher options, e.g. `[{ code: 'en', label: 'English' }, ...]` — hidden entirely\r\nwhen empty or when only one language is offered (same convention as `st-app-header`'s\r\n`languages`, which this reuses verbatim). This component has no translation logic itself —\r\nselecting an option fires `language-change` (detail: `{ code }`), and the consuming app owns\r\nwhat `code` actually means and which content it re-renders."
2857
+ "default": "false",
2858
+ "description": "True while the menu doesn't fit the bar at the current width: the header then shows the same\r\nhamburger layout it uses on a narrow screen. Set by `evaluateFit`, never from outside.",
2859
+ "fieldName": "compact"
2860
+ }
2861
+ ],
2862
+ "superclass": {
2863
+ "name": "LitElement",
2864
+ "package": "lit"
2865
+ },
2866
+ "tagName": "st-header",
2867
+ "customElement": true
2868
+ }
2869
+ ],
2870
+ "exports": [
2871
+ {
2872
+ "kind": "js",
2873
+ "name": "Header",
2874
+ "declaration": {
2875
+ "name": "Header",
2876
+ "module": "src/header/Header.ts"
2877
+ }
2878
+ },
2879
+ {
2880
+ "kind": "custom-element-definition",
2881
+ "name": "st-header",
2882
+ "declaration": {
2883
+ "name": "Header",
2884
+ "module": "src/header/Header.ts"
2885
+ }
2886
+ }
2887
+ ]
2888
+ },
2889
+ {
2890
+ "kind": "javascript-module",
2891
+ "path": "src/hero/Hero.ts",
2892
+ "declarations": [
2893
+ {
2894
+ "kind": "class",
2895
+ "description": "Full-width hero banner: background image with a darkening overlay, optional eyebrow, title,\r\noptional subtitle and up to two call-to-action links. Port of `SankhyaUI`'s React `Hero`; the\r\nframer-motion entrance is redone as CSS keyframes (skipped under `prefers-reduced-motion`).\r\n\r\n`size`, `content-position` and `overlay=\"gradient\"` give the large editorial layout (copy on the\r\nlower left over a gradient that darkens towards it) used by enterprise marketing heroes; the\r\ndefaults keep the original centered banner. Put several heroes in an `st-carousel` with\r\n`indicator-style=\"tabs\"` for a tabbed hero carousel.",
2896
+ "name": "Hero",
2897
+ "cssProperties": [
2898
+ {
2899
+ "description": "Text colour over the image.",
2900
+ "name": "--st-hero-text-color"
2901
+ },
2902
+ {
2903
+ "description": "Minimum height when `size` is `large` (default `640px`).",
2904
+ "name": "--st-hero-min-height"
2905
+ }
2906
+ ],
2907
+ "cssParts": [
2908
+ {
2909
+ "description": "The small label above the title.",
2910
+ "name": "eyebrow"
2885
2911
  },
2912
+ {
2913
+ "description": "The outlined second button.",
2914
+ "name": "secondary-action"
2915
+ }
2916
+ ],
2917
+ "members": [
2886
2918
  {
2887
2919
  "kind": "field",
2888
- "name": "currentLanguageCode",
2920
+ "name": "title",
2889
2921
  "type": {
2890
2922
  "text": "string"
2891
2923
  },
2892
2924
  "default": "''",
2893
- "attribute": "current-language-code"
2925
+ "attribute": "title"
2894
2926
  },
2895
2927
  {
2896
2928
  "kind": "field",
2897
- "name": "languageMenuLabel",
2929
+ "name": "subtitle",
2898
2930
  "type": {
2899
2931
  "text": "string"
2900
2932
  },
2901
- "default": "'Language'",
2902
- "attribute": "language-menu-label"
2933
+ "default": "''",
2934
+ "attribute": "subtitle"
2903
2935
  },
2904
2936
  {
2905
2937
  "kind": "field",
2906
- "name": "mobileOpen",
2938
+ "name": "imageSrc",
2907
2939
  "type": {
2908
- "text": "boolean"
2940
+ "text": "string"
2909
2941
  },
2910
- "default": "false",
2911
- "description": "Internal open/closed state for the mobile nav overlay, reflected to an attribute purely so\r\nthe `:host([mobile-open])` CSS selector above can react to it — not meant to be set from\r\noutside.",
2912
- "attribute": "mobile-open",
2913
- "reflects": true
2942
+ "default": "''",
2943
+ "attribute": "image-src"
2914
2944
  },
2915
2945
  {
2916
2946
  "kind": "field",
2917
- "name": "compact",
2947
+ "name": "actionLabel",
2918
2948
  "type": {
2919
- "text": "boolean"
2949
+ "text": "string"
2920
2950
  },
2921
- "default": "false",
2922
- "description": "True while the menu doesn't fit the bar at the current width: the header then shows the same\r\nhamburger layout it uses on a narrow screen. Set by `evaluateFit`, never from outside.",
2923
- "attribute": "compact",
2924
- "reflects": true
2951
+ "default": "''",
2952
+ "attribute": "action-label"
2925
2953
  },
2926
2954
  {
2927
2955
  "kind": "field",
2928
- "name": "languageMenuOpen",
2956
+ "name": "href",
2929
2957
  "type": {
2930
- "text": "boolean"
2958
+ "text": "string"
2931
2959
  },
2932
- "privacy": "private",
2933
- "default": "false"
2960
+ "default": "''",
2961
+ "attribute": "href"
2934
2962
  },
2935
2963
  {
2936
2964
  "kind": "field",
2937
- "name": "hasUtility",
2965
+ "name": "textAlignment",
2938
2966
  "type": {
2939
- "text": "boolean"
2967
+ "text": "'left' | 'center' | 'right' | 'justify'"
2940
2968
  },
2941
- "privacy": "private",
2942
- "default": "false",
2943
- "description": "Whether `slot=\"utility\"` has content — an empty utility row (and its divider) is hidden."
2969
+ "default": "'left'",
2970
+ "attribute": "text-alignment",
2971
+ "reflects": true
2944
2972
  },
2945
2973
  {
2946
2974
  "kind": "field",
2947
- "name": "resizeObserver",
2975
+ "name": "padding",
2948
2976
  "type": {
2949
- "text": "ResizeObserver | undefined"
2977
+ "text": "'none' | 'small' | 'medium' | 'large'"
2950
2978
  },
2951
- "privacy": "private"
2979
+ "default": "'none'",
2980
+ "attribute": "padding",
2981
+ "reflects": true
2952
2982
  },
2953
2983
  {
2954
2984
  "kind": "field",
2955
- "name": "narrowQuery",
2985
+ "name": "inverted",
2956
2986
  "type": {
2957
- "text": "MediaQueryList | undefined"
2987
+ "text": "boolean"
2958
2988
  },
2959
- "privacy": "private",
2960
- "description": "Matches below BREAKPOINT_TABLET, where the hamburger layout is always on."
2961
- },
2962
- {
2963
- "kind": "field",
2964
- "name": "inlinedDropdowns",
2965
- "privacy": "private",
2966
- "default": "new Set<HTMLElement & { inline: boolean; open: boolean }>()",
2967
- "description": "The dropdowns this header switched to `inline` — only these are switched back, so a caller's\r\nown `inline` setting is left alone."
2989
+ "default": "false",
2990
+ "attribute": "inverted",
2991
+ "reflects": true
2968
2992
  },
2969
2993
  {
2970
2994
  "kind": "field",
2971
- "name": "syncInlineDropdowns",
2972
- "privacy": "private",
2973
- "description": "While the hamburger layout is on, the dropdowns in the header open in the flow of the\r\nfull-screen panel instead of floating over it (SankhyaUI's touch-device layout)."
2995
+ "name": "focalPoint",
2996
+ "type": {
2997
+ "text": "'top' | 'left' | 'right' | 'bottom' | 'center'"
2998
+ },
2999
+ "default": "'center'",
3000
+ "attribute": "focal-point"
2974
3001
  },
2975
3002
  {
2976
3003
  "kind": "field",
2977
- "name": "onUtilitySlotChange",
2978
- "privacy": "private"
3004
+ "name": "eyebrow",
3005
+ "type": {
3006
+ "text": "string"
3007
+ },
3008
+ "default": "''",
3009
+ "description": "Small uppercase label above the title (e.g. an event or product name).",
3010
+ "attribute": "eyebrow"
2979
3011
  },
2980
3012
  {
2981
3013
  "kind": "field",
2982
- "name": "onMenuSlotChange",
2983
- "privacy": "private"
3014
+ "name": "secondaryActionLabel",
3015
+ "type": {
3016
+ "text": "string"
3017
+ },
3018
+ "default": "''",
3019
+ "description": "Label of an outlined second button next to the primary one.",
3020
+ "attribute": "secondary-action-label"
2984
3021
  },
2985
3022
  {
2986
3023
  "kind": "field",
2987
- "name": "collapsedAtWidth",
3024
+ "name": "secondaryHref",
2988
3025
  "type": {
2989
- "text": "number"
3026
+ "text": "string"
2990
3027
  },
2991
- "privacy": "private",
2992
- "default": "0",
2993
- "description": "The bar width at which the menu last overflowed — the bar only expands again once it is\r\nclearly wider than this, so it can't flip back and forth right at the threshold."
3028
+ "default": "''",
3029
+ "attribute": "secondary-href"
2994
3030
  },
2995
3031
  {
2996
3032
  "kind": "field",
2997
- "name": "evaluateFit",
2998
- "privacy": "private",
2999
- "description": "Collapses to the hamburger layout when the slotted menu overflows its row, and expands again\r\nonce there is room. The collapsed layout hides the menu, so the room it needs can't be\r\nmeasured then; the width remembered when it collapsed stands in for it."
3000
- },
3001
- {
3002
- "kind": "method",
3003
- "name": "menuOverflows",
3004
- "privacy": "private",
3005
- "return": {
3006
- "type": {
3007
- "text": "boolean"
3008
- }
3033
+ "name": "size",
3034
+ "type": {
3035
+ "text": "'auto' | 'large' | 'full'"
3009
3036
  },
3010
- "description": "Whether the visible menu items reach past the right edge of the menu row. Measured from the\r\nitems' own boxes (the slotted elements and their direct children), not the row's scrollWidth:\r\na closed dropdown's absolutely positioned panel also counts towards scrollWidth, which would\r\nreport overflow at any width."
3037
+ "default": "'auto'",
3038
+ "description": "`auto` sizes to the content; `large` is a tall editorial hero (`--st-hero-min-height`); `full` fills the viewport.",
3039
+ "attribute": "size",
3040
+ "reflects": true
3011
3041
  },
3012
3042
  {
3013
3043
  "kind": "field",
3014
- "name": "lightDomObserver",
3044
+ "name": "contentPosition",
3015
3045
  "type": {
3016
- "text": "MutationObserver | undefined"
3046
+ "text": "'center' | 'bottom'"
3017
3047
  },
3018
- "privacy": "private"
3048
+ "default": "'center'",
3049
+ "description": "`center` keeps the copy in the middle; `bottom` puts it in the lower part of the hero, on the page container.",
3050
+ "attribute": "content-position",
3051
+ "reflects": true
3019
3052
  },
3020
3053
  {
3021
3054
  "kind": "field",
3022
- "name": "closeOnEscape",
3023
- "privacy": "private"
3055
+ "name": "overlay",
3056
+ "type": {
3057
+ "text": "'even' | 'gradient' | 'none'"
3058
+ },
3059
+ "default": "'even'",
3060
+ "description": "`even` darkens the whole image; `gradient` darkens behind the copy only; `none` shows the image as is.",
3061
+ "attribute": "overlay",
3062
+ "reflects": true
3024
3063
  },
3025
3064
  {
3026
3065
  "kind": "field",
3027
- "name": "closeLanguageMenuOnOutsideClick",
3028
- "privacy": "private"
3029
- },
3030
- {
3031
- "kind": "method",
3032
- "name": "renderLanguageMenu",
3033
- "privacy": "private"
3066
+ "name": "positions",
3067
+ "privacy": "private",
3068
+ "static": true,
3069
+ "default": "{ top: 'center top', left: 'left center', right: 'right center', bottom: 'center bottom', center: 'center center' }",
3070
+ "type": {
3071
+ "text": "{\r\n top: 'center top',\r\n left: 'left center',\r\n right: 'right center',\r\n bottom: 'center bottom',\r\n center: 'center center'\r\n }"
3072
+ }
3034
3073
  },
3035
3074
  {
3036
3075
  "kind": "method",
3037
- "name": "onLanguageSelect",
3076
+ "name": "emitAction",
3038
3077
  "privacy": "private",
3039
3078
  "return": {
3040
3079
  "type": {
@@ -3043,25 +3082,40 @@
3043
3082
  },
3044
3083
  "parameters": [
3045
3084
  {
3046
- "name": "code",
3085
+ "name": "event",
3086
+ "type": {
3087
+ "text": "MouseEvent"
3088
+ }
3089
+ },
3090
+ {
3091
+ "name": "href",
3047
3092
  "type": {
3048
3093
  "text": "string"
3049
3094
  }
3095
+ },
3096
+ {
3097
+ "name": "kind",
3098
+ "type": {
3099
+ "text": "'primary' | 'secondary'"
3100
+ }
3050
3101
  }
3051
3102
  ]
3052
3103
  },
3053
3104
  {
3054
- "kind": "method",
3055
- "name": "renderBrand",
3105
+ "kind": "field",
3106
+ "name": "onClick",
3107
+ "privacy": "private"
3108
+ },
3109
+ {
3110
+ "kind": "field",
3111
+ "name": "onSecondaryClick",
3056
3112
  "privacy": "private"
3057
3113
  }
3058
3114
  ],
3059
3115
  "events": [
3060
3116
  {
3061
- "name": "language-change",
3062
- "type": {
3063
- "text": "CustomEvent"
3064
- }
3117
+ "description": "Cancelable, before navigating. Detail `{ href, kind }`, `kind` being `primary` or `secondary`.",
3118
+ "name": "action"
3065
3119
  }
3066
3120
  ],
3067
3121
  "attributes": [
@@ -3074,170 +3128,146 @@
3074
3128
  "fieldName": "title"
3075
3129
  },
3076
3130
  {
3077
- "name": "brand-image-url",
3131
+ "name": "subtitle",
3078
3132
  "type": {
3079
3133
  "text": "string"
3080
3134
  },
3081
3135
  "default": "''",
3082
- "description": "Optional logo image URL, shown before `title`. Omitted entirely when empty — none of this suite's apps has one today. Matches the source component's `imageSrc` (renamed here to pair with `title`/`logoHref`, since this component's only image use is the brand mark).",
3083
- "fieldName": "brandImageUrl"
3084
- },
3085
- {
3086
- "name": "alt-text",
3087
- "type": {
3088
- "text": "string"
3089
- },
3090
- "default": "'Logo'",
3091
- "description": "`alt` text for the brand image — matches the source component's `altText` (default `'Logo'`).",
3092
- "fieldName": "altText"
3136
+ "fieldName": "subtitle"
3093
3137
  },
3094
3138
  {
3095
- "name": "logoHref",
3139
+ "name": "image-src",
3096
3140
  "type": {
3097
3141
  "text": "string"
3098
3142
  },
3099
3143
  "default": "''",
3100
- "description": "Wraps the brand in an `<a>` when set (e.g. `/`); a plain non-link `<div>` otherwise.",
3101
- "fieldName": "logoHref"
3144
+ "fieldName": "imageSrc"
3102
3145
  },
3103
3146
  {
3104
- "name": "logo-target",
3147
+ "name": "action-label",
3105
3148
  "type": {
3106
3149
  "text": "string"
3107
3150
  },
3108
- "default": "'_self'",
3109
- "description": "`target` for the brand `<a>` — matches the source component's `logoTarget` (default `_self`). No effect when `logoHref` isn't set.",
3110
- "fieldName": "logoTarget"
3151
+ "default": "''",
3152
+ "fieldName": "actionLabel"
3111
3153
  },
3112
3154
  {
3113
- "name": "logo-class-name",
3155
+ "name": "href",
3114
3156
  "type": {
3115
3157
  "text": "string"
3116
3158
  },
3117
3159
  "default": "''",
3118
- "description": "Extra class(es) appended to the brand link/div — matches the source component's `logoClassName`.",
3119
- "fieldName": "logoClassName"
3120
- },
3121
- {
3122
- "name": "inverted",
3123
- "type": {
3124
- "text": "boolean"
3125
- },
3126
- "default": "false",
3127
- "description": "Inverts the header's color roles (light-on-dark instead of dark-on-light) — matches the\r\nsource component's `inverted` (from its shared `BaseProps`).",
3128
- "fieldName": "inverted"
3160
+ "fieldName": "href"
3129
3161
  },
3130
3162
  {
3131
- "name": "sticky",
3163
+ "name": "text-alignment",
3132
3164
  "type": {
3133
- "text": "boolean"
3165
+ "text": "'left' | 'center' | 'right' | 'justify'"
3134
3166
  },
3135
- "default": "false",
3136
- "fieldName": "sticky"
3167
+ "default": "'left'",
3168
+ "fieldName": "textAlignment"
3137
3169
  },
3138
3170
  {
3139
- "name": "transparent",
3171
+ "name": "padding",
3140
3172
  "type": {
3141
- "text": "boolean"
3173
+ "text": "'none' | 'small' | 'medium' | 'large'"
3142
3174
  },
3143
- "default": "false",
3144
- "description": "Fixes the header over the top of the page and makes it see-through, with light text\r\n(`--st-header-transparent-color`), until the page scrolls past `scroll-threshold` — for a\r\nheader laid over a dark hero. It then takes its normal background and a shadow. The page\r\ncontent starts under it, so the first section should leave room for the 64px bar.",
3145
- "fieldName": "transparent"
3175
+ "default": "'none'",
3176
+ "fieldName": "padding"
3146
3177
  },
3147
3178
  {
3148
- "name": "hide-on-scroll",
3179
+ "name": "inverted",
3149
3180
  "type": {
3150
3181
  "text": "boolean"
3151
3182
  },
3152
3183
  "default": "false",
3153
- "description": "Slides the header out of view while the page scrolls down and back in when it scrolls up.",
3154
- "fieldName": "hideOnScroll"
3184
+ "fieldName": "inverted"
3155
3185
  },
3156
3186
  {
3157
- "name": "scroll-threshold",
3187
+ "name": "focal-point",
3158
3188
  "type": {
3159
- "text": "number"
3189
+ "text": "'top' | 'left' | 'right' | 'bottom' | 'center'"
3160
3190
  },
3161
- "default": "8",
3162
- "description": "Scroll distance in px after which the header counts as `scrolled`.",
3163
- "fieldName": "scrollThreshold"
3191
+ "default": "'center'",
3192
+ "fieldName": "focalPoint"
3164
3193
  },
3165
3194
  {
3166
- "name": "scrolled",
3195
+ "name": "eyebrow",
3167
3196
  "type": {
3168
- "text": "boolean"
3197
+ "text": "string"
3169
3198
  },
3170
- "default": "false",
3171
- "description": "True once the page has scrolled past `scroll-threshold`; reflected so pages can style `st-header[scrolled]`. Set by the header, never from outside.",
3172
- "fieldName": "scrolled"
3199
+ "default": "''",
3200
+ "description": "Small uppercase label above the title (e.g. an event or product name).",
3201
+ "fieldName": "eyebrow"
3173
3202
  },
3174
3203
  {
3175
- "name": "scroll-hidden",
3204
+ "name": "secondary-action-label",
3176
3205
  "type": {
3177
- "text": "boolean"
3206
+ "text": "string"
3178
3207
  },
3179
- "default": "false",
3180
- "description": "True while `hide-on-scroll` has slid the header away. Set by the header, never from outside.",
3181
- "fieldName": "scrollHidden"
3208
+ "default": "''",
3209
+ "description": "Label of an outlined second button next to the primary one.",
3210
+ "fieldName": "secondaryActionLabel"
3182
3211
  },
3183
3212
  {
3184
- "name": "current-language-code",
3213
+ "name": "secondary-href",
3185
3214
  "type": {
3186
3215
  "text": "string"
3187
3216
  },
3188
3217
  "default": "''",
3189
- "fieldName": "currentLanguageCode"
3218
+ "fieldName": "secondaryHref"
3190
3219
  },
3191
3220
  {
3192
- "name": "language-menu-label",
3221
+ "name": "size",
3193
3222
  "type": {
3194
- "text": "string"
3223
+ "text": "'auto' | 'large' | 'full'"
3195
3224
  },
3196
- "default": "'Language'",
3197
- "fieldName": "languageMenuLabel"
3225
+ "default": "'auto'",
3226
+ "description": "`auto` sizes to the content; `large` is a tall editorial hero (`--st-hero-min-height`); `full` fills the viewport.",
3227
+ "fieldName": "size"
3198
3228
  },
3199
3229
  {
3200
- "name": "mobile-open",
3230
+ "name": "content-position",
3201
3231
  "type": {
3202
- "text": "boolean"
3232
+ "text": "'center' | 'bottom'"
3203
3233
  },
3204
- "default": "false",
3205
- "description": "Internal open/closed state for the mobile nav overlay, reflected to an attribute purely so\r\nthe `:host([mobile-open])` CSS selector above can react to it — not meant to be set from\r\noutside.",
3206
- "fieldName": "mobileOpen"
3234
+ "default": "'center'",
3235
+ "description": "`center` keeps the copy in the middle; `bottom` puts it in the lower part of the hero, on the page container.",
3236
+ "fieldName": "contentPosition"
3207
3237
  },
3208
3238
  {
3209
- "name": "compact",
3239
+ "name": "overlay",
3210
3240
  "type": {
3211
- "text": "boolean"
3241
+ "text": "'even' | 'gradient' | 'none'"
3212
3242
  },
3213
- "default": "false",
3214
- "description": "True while the menu doesn't fit the bar at the current width: the header then shows the same\r\nhamburger layout it uses on a narrow screen. Set by `evaluateFit`, never from outside.",
3215
- "fieldName": "compact"
3243
+ "default": "'even'",
3244
+ "description": "`even` darkens the whole image; `gradient` darkens behind the copy only; `none` shows the image as is.",
3245
+ "fieldName": "overlay"
3216
3246
  }
3217
3247
  ],
3218
3248
  "superclass": {
3219
3249
  "name": "LitElement",
3220
3250
  "package": "lit"
3221
3251
  },
3222
- "tagName": "st-header",
3252
+ "tagName": "st-hero",
3223
3253
  "customElement": true
3224
3254
  }
3225
3255
  ],
3226
3256
  "exports": [
3227
3257
  {
3228
3258
  "kind": "js",
3229
- "name": "Header",
3259
+ "name": "Hero",
3230
3260
  "declaration": {
3231
- "name": "Header",
3232
- "module": "src/header/Header.ts"
3261
+ "name": "Hero",
3262
+ "module": "src/hero/Hero.ts"
3233
3263
  }
3234
3264
  },
3235
3265
  {
3236
3266
  "kind": "custom-element-definition",
3237
- "name": "st-header",
3267
+ "name": "st-hero",
3238
3268
  "declaration": {
3239
- "name": "Header",
3240
- "module": "src/header/Header.ts"
3269
+ "name": "Hero",
3270
+ "module": "src/hero/Hero.ts"
3241
3271
  }
3242
3272
  }
3243
3273
  ]
@@ -3326,6 +3356,12 @@
3326
3356
  "kind": "class",
3327
3357
  "description": "A vertical list of collapsible title/content rows; one open at a time unless `allow-multiple`.",
3328
3358
  "name": "ItemsAccordion",
3359
+ "cssProperties": [
3360
+ {
3361
+ "description": "Overrides the block's padding.",
3362
+ "name": "--st-items-accordion-padding"
3363
+ }
3364
+ ],
3329
3365
  "members": [
3330
3366
  {
3331
3367
  "kind": "field",
@@ -3770,6 +3806,12 @@
3770
3806
  "kind": "class",
3771
3807
  "description": "One column (or one group within a column) of an `st-mega-menu`: a heading, an optional line of\ndescription, then its links stacked — usually `st-menu-item`s with `variant=\"link\"`. Nest\ncolumns to stack several headed groups in one column, as okta.com does.\n\n`variant=\"card\"` puts the column on a tinted rounded tile and `variant=\"accent\"` on a solid\naccent tile with light text; both suit a row of equal columns without intro or featured area.\n`cta-label` + `cta-href` add a pill button at the bottom of the column.\n\nThe heading (when `href` is set) and the button fire a *cancelable* `mega-menu-select` event\n(detail: `{ href }`) before navigating; a host doing client-side routing calls\n`event.preventDefault()` on it.",
3772
3808
  "name": "MegaMenuColumn",
3809
+ "cssProperties": [
3810
+ {
3811
+ "description": "Overrides the padding of a `card`/`accent` column.",
3812
+ "name": "--st-mega-menu-column-padding"
3813
+ }
3814
+ ],
3773
3815
  "cssParts": [
3774
3816
  {
3775
3817
  "description": "The heading text or link.",
@@ -4806,6 +4848,16 @@
4806
4848
  "kind": "class",
4807
4849
  "description": "Rounded call-to-action banner (title, subtitle, one outlined button) on a dark panel or a\r\nbackground image. Port of `SankhyaUI`'s React `PromoBanner`; the button fires an `action` event\r\n(detail `{ href }`, empty unless set) in place of `onAction`.",
4808
4850
  "name": "PromoBanner",
4851
+ "cssProperties": [
4852
+ {
4853
+ "description": "Overrides the banner's margin.",
4854
+ "name": "--st-promo-banner-margin"
4855
+ },
4856
+ {
4857
+ "description": "Overrides the banner's padding.",
4858
+ "name": "--st-promo-banner-padding"
4859
+ }
4860
+ ],
4809
4861
  "members": [
4810
4862
  {
4811
4863
  "kind": "field",
@@ -4957,6 +5009,10 @@
4957
5009
  {
4958
5010
  "description": "Overrides the background colour picked by `background`.",
4959
5011
  "name": "--st-section-bg"
5012
+ },
5013
+ {
5014
+ "description": "Overrides the left/right padding (not with `width=\"full\"`).",
5015
+ "name": "--st-section-padding-inline"
4960
5016
  }
4961
5017
  ],
4962
5018
  "cssParts": [
@@ -5389,8 +5445,14 @@
5389
5445
  "declarations": [
5390
5446
  {
5391
5447
  "kind": "class",
5392
- "description": "Responsive grid of headline numbers with a label and optional description. Port of React `Stats`.",
5448
+ "description": "Responsive grid of headline numbers with a label and optional description. Port of React `Stats`.\r\n`inverted` puts it on the dark band (`--st-cms-band-dark-bg`), which stays dark in the dark theme.",
5393
5449
  "name": "Stats",
5450
+ "cssProperties": [
5451
+ {
5452
+ "description": "Overrides the block's padding.",
5453
+ "name": "--st-stats-padding"
5454
+ }
5455
+ ],
5394
5456
  "members": [
5395
5457
  {
5396
5458
  "kind": "field",
@@ -5456,6 +5518,12 @@
5456
5518
  "kind": "class",
5457
5519
  "description": "Section heading plus customer quotes or stories. Port of React `Testimonials`.\n\nEach card shows whatever its item has: a cover image, the customer logo, a story headline, a\nquote with star rating, result metrics, the author and a \"See full story\" link. `layout=\"grid\"`\n(default) lays the cards out in a grid; `layout=\"carousel\"` puts them on one horizontally\nscrolling, snapping row with previous/next buttons next to the heading — the customer-story\ncarousel of enterprise marketing pages. `action-label`/`action-href` add a section-level link\n(e.g. \"Explore customer stories\").",
5458
5520
  "name": "Testimonials",
5521
+ "cssProperties": [
5522
+ {
5523
+ "description": "Overrides the section's padding.",
5524
+ "name": "--st-testimonials-padding"
5525
+ }
5526
+ ],
5459
5527
  "members": [
5460
5528
  {
5461
5529
  "kind": "field",