@contentrain/astro-kit 0.32.0 → 0.33.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/catalog.json +849 -19
  2. package/components/_shared/Button.astro +2 -1
  3. package/components/_shared/KitImage.astro +9 -4
  4. package/components/_shared/Section.astro +3 -1
  5. package/components/_shared/SectionHeader.astro +27 -0
  6. package/components/_shared/measured.ts +13 -0
  7. package/components/_shared/safe-url.ts +67 -0
  8. package/components/_shared/social.ts +73 -0
  9. package/components/announcement/Announcement.astro +2 -1
  10. package/components/announcement/meta.json +1 -1
  11. package/components/band/Band.astro +3 -2
  12. package/components/band/meta.json +1 -0
  13. package/components/breadcrumb/Breadcrumb.astro +2 -1
  14. package/components/breadcrumb/meta.json +1 -1
  15. package/components/card-grid/CardGrid.astro +2 -1
  16. package/components/card-grid/meta.json +1 -0
  17. package/components/consent/Consent.astro +2 -1
  18. package/components/consent/meta.json +1 -1
  19. package/components/contact-details/ContactDetails.astro +3 -2
  20. package/components/contact-details/meta.json +1 -0
  21. package/components/contact-form/ContactForm.astro +4 -3
  22. package/components/contact-form/meta.json +1 -0
  23. package/components/cta/meta.json +1 -1
  24. package/components/dialog/Dialog.astro +113 -0
  25. package/components/dialog/fixtures.json +84 -0
  26. package/components/dialog/meta.json +252 -0
  27. package/components/embed/meta.json +1 -1
  28. package/components/faq/fixtures.json +4 -0
  29. package/components/faq/meta.json +2 -2
  30. package/components/feature-list/meta.json +1 -0
  31. package/components/footer/Footer.astro +5 -4
  32. package/components/footer/meta.json +1 -0
  33. package/components/gallery/Gallery.astro +2 -1
  34. package/components/gallery/meta.json +1 -0
  35. package/components/header/Header.astro +17 -5
  36. package/components/header/fixtures.json +90 -1
  37. package/components/header/meta.json +5 -3
  38. package/components/hero/meta.json +1 -0
  39. package/components/language-switcher/LanguageSwitcher.astro +68 -0
  40. package/components/language-switcher/fixtures.json +51 -0
  41. package/components/language-switcher/meta.json +73 -0
  42. package/components/logo-cloud/LogoCloud.astro +2 -1
  43. package/components/logo-cloud/meta.json +1 -0
  44. package/components/nav/Nav.astro +77 -24
  45. package/components/nav/NavTree.astro +40 -0
  46. package/components/nav/fixtures.json +165 -0
  47. package/components/nav/meta.json +11 -2
  48. package/components/newsletter/Newsletter.astro +2 -1
  49. package/components/newsletter/meta.json +1 -0
  50. package/components/pagination/Pagination.astro +4 -3
  51. package/components/pagination/meta.json +1 -1
  52. package/components/post-card/PostCard.astro +4 -3
  53. package/components/post-card/meta.json +1 -1
  54. package/components/post-list/PostList.astro +3 -2
  55. package/components/post-list/meta.json +1 -0
  56. package/components/pricing/meta.json +1 -0
  57. package/components/search-box/SearchBox.astro +51 -0
  58. package/components/search-box/fixtures.json +31 -0
  59. package/components/search-box/meta.json +75 -0
  60. package/components/slider/Slider.astro +19 -115
  61. package/components/slider/SliderTrack.astro +178 -0
  62. package/components/slider/fixtures.json +2 -1
  63. package/components/slider/meta.json +11 -5
  64. package/components/social-links/SocialLinks.astro +74 -0
  65. package/components/social-links/fixtures.json +67 -0
  66. package/components/social-links/meta.json +94 -0
  67. package/components/split/meta.json +1 -0
  68. package/components/stats/Stats.astro +19 -8
  69. package/components/stats/fixtures.json +87 -0
  70. package/components/stats/meta.json +1 -0
  71. package/components/steps/meta.json +1 -0
  72. package/components/tabs/Tabs.astro +10 -3
  73. package/components/tabs/fixtures.json +4 -0
  74. package/components/tabs/meta.json +5 -2
  75. package/components/team/Team.astro +3 -2
  76. package/components/team/meta.json +2 -0
  77. package/components/team/team.ts +3 -8
  78. package/components/testimonial/meta.json +2 -3
  79. package/dist/index.mjs +1 -1
  80. package/dist/index.mjs.map +1 -1
  81. package/mapping/classic.json +117 -2
  82. package/mapping/divi.json +6 -5
  83. package/mapping/elementor.json +101 -7
  84. package/mapping/gutenberg.json +20 -8
  85. package/package.json +2 -2
package/catalog.json CHANGED
@@ -41,7 +41,9 @@
41
41
  "description": "A one-line notice above the header (sale, event, changed hours) with an optional link. The visitor closes it with no JS (an open <details> whose summary is the close button); the dismissal is not remembered across pages.",
42
42
  "category": "chrome",
43
43
  "uses": [],
44
- "shared": [],
44
+ "shared": [
45
+ "safe-url.ts"
46
+ ],
45
47
  "variants": {
46
48
  "tone": {
47
49
  "options": [
@@ -102,6 +104,7 @@
102
104
  "KitImage.astro",
103
105
  "Section.astro",
104
106
  "measured.ts",
107
+ "safe-url.ts",
105
108
  "types.ts"
106
109
  ],
107
110
  "variants": {
@@ -450,6 +453,7 @@
450
453
  "category": "content",
451
454
  "uses": [],
452
455
  "shared": [
456
+ "safe-url.ts",
453
457
  "types.ts"
454
458
  ],
455
459
  "variants": {
@@ -532,6 +536,7 @@
532
536
  "Section.astro",
533
537
  "image.ts",
534
538
  "measured.ts",
539
+ "safe-url.ts",
535
540
  "types.ts"
536
541
  ],
537
542
  "variants": {
@@ -789,7 +794,9 @@
789
794
  "description": "Cookie consent bar with accept and decline. Consent is denied by default: until the visitor explicitly accepts, <html data-consent> is \"denied\" (set before first paint) and nothing may start measurement. The choice is stored in localStorage (`kit-consent`), set as <html data-consent=\"granted|denied\"> and dispatched as a `kit:consent` event on document with {granted}; the site-settings analytics gate reads data-consent and loads analytics only when it is \"granted\". The bar shows only while no choice is stored, with no flash on later visits.",
790
795
  "category": "chrome",
791
796
  "uses": [],
792
- "shared": [],
797
+ "shared": [
798
+ "safe-url.ts"
799
+ ],
793
800
  "variants": {
794
801
  "position": {
795
802
  "options": [
@@ -862,6 +869,7 @@
862
869
  "shared": [
863
870
  "Section.astro",
864
871
  "measured.ts",
872
+ "safe-url.ts",
865
873
  "types.ts"
866
874
  ],
867
875
  "variants": {
@@ -1092,6 +1100,7 @@
1092
1100
  "shared": [
1093
1101
  "Section.astro",
1094
1102
  "measured.ts",
1103
+ "safe-url.ts",
1095
1104
  "types.ts"
1096
1105
  ],
1097
1106
  "variants": {
@@ -1412,6 +1421,7 @@
1412
1421
  "KitImage.astro",
1413
1422
  "Section.astro",
1414
1423
  "measured.ts",
1424
+ "safe-url.ts",
1415
1425
  "types.ts"
1416
1426
  ],
1417
1427
  "variants": {
@@ -1700,6 +1710,271 @@
1700
1710
  "actions[].style": "actions[].style"
1701
1711
  }
1702
1712
  },
1713
+ {
1714
+ "id": "dialog",
1715
+ "name": "Dialog",
1716
+ "description": "A popup as a dialog the visitor opens: a button in a section of the page and a modal <dialog> with a heading, text and buttons. Never opens by itself. Focus is trapped inside and returns to the button, Escape closes it; the button opens it with no script where Invoker Commands exist, a small script covers other browsers and closes on a backdrop click, and with scripting off the content is laid out in the section itself.",
1717
+ "category": "section",
1718
+ "uses": [
1719
+ "prose"
1720
+ ],
1721
+ "shared": [
1722
+ "Button.astro",
1723
+ "Section.astro",
1724
+ "measured.ts",
1725
+ "safe-url.ts",
1726
+ "types.ts"
1727
+ ],
1728
+ "variants": {
1729
+ "triggerStyle": {
1730
+ "options": [
1731
+ "primary",
1732
+ "secondary",
1733
+ "ghost",
1734
+ "link"
1735
+ ],
1736
+ "default": "primary",
1737
+ "description": "How the opening button looks: a filled or outlined button, or a text link."
1738
+ },
1739
+ "size": {
1740
+ "options": [
1741
+ "sm",
1742
+ "md",
1743
+ "lg"
1744
+ ],
1745
+ "default": "md",
1746
+ "description": "Width of the dialog: 28, 40 or 56 rem (never wider than the screen)."
1747
+ },
1748
+ "align": {
1749
+ "options": [
1750
+ "start",
1751
+ "center",
1752
+ "end"
1753
+ ],
1754
+ "default": "start",
1755
+ "description": "Where the button sits in the section; the measured align when not set."
1756
+ },
1757
+ "tone": {
1758
+ "options": [
1759
+ "default",
1760
+ "muted",
1761
+ "inverse",
1762
+ "accent"
1763
+ ],
1764
+ "default": "default",
1765
+ "description": "Section background."
1766
+ }
1767
+ },
1768
+ "props": {
1769
+ "triggerLabel": {
1770
+ "type": "string",
1771
+ "required": true,
1772
+ "label": "Button text",
1773
+ "description": "Text of the button that opens the dialog (the popup's trigger link or button)."
1774
+ },
1775
+ "heading": {
1776
+ "type": "string",
1777
+ "label": "Heading",
1778
+ "description": "The dialog's title; it names the dialog for screen readers."
1779
+ },
1780
+ "html": {
1781
+ "type": "richtext",
1782
+ "label": "Text",
1783
+ "description": "The popup's content as rendered HTML (the popup template's text)."
1784
+ },
1785
+ "actions": {
1786
+ "type": "array",
1787
+ "label": "Buttons",
1788
+ "required": false,
1789
+ "items": {
1790
+ "type": "object",
1791
+ "fields": {
1792
+ "label": {
1793
+ "type": "string",
1794
+ "label": "Label",
1795
+ "required": true,
1796
+ "description": "The button text."
1797
+ },
1798
+ "href": {
1799
+ "type": "url",
1800
+ "label": "Link",
1801
+ "required": true,
1802
+ "description": "Where the button goes: a page on this site or a full address."
1803
+ },
1804
+ "newTab": {
1805
+ "type": "boolean",
1806
+ "label": "Open in a new tab",
1807
+ "description": "Open the link in a new tab (an external site the reader should not leave for)."
1808
+ },
1809
+ "style": {
1810
+ "type": "select",
1811
+ "label": "Style",
1812
+ "options": [
1813
+ "primary",
1814
+ "secondary",
1815
+ "ghost"
1816
+ ],
1817
+ "description": "primary for the main action, secondary or ghost for the ones beside it."
1818
+ }
1819
+ }
1820
+ },
1821
+ "description": "The popup's own buttons, under its text, in order; none by default."
1822
+ },
1823
+ "id": {
1824
+ "type": "string",
1825
+ "default": "dialog",
1826
+ "content": false,
1827
+ "description": "Unique on the page: the button points at the dialog by it."
1828
+ },
1829
+ "closeLabel": {
1830
+ "type": "string",
1831
+ "default": "Close",
1832
+ "content": false,
1833
+ "description": "Accessible name of the close button (ui-strings dialog.close)."
1834
+ },
1835
+ "measured": {
1836
+ "type": "object",
1837
+ "content": false,
1838
+ "description": "The source section's measured style (MeasuredStyle): frame width, padding, fill, image, columns per width, gap, text tone, radius, minimum height — all in pixels. Absent, the site's tokens; present, it wins over tone and columns. Values that are not a number, a colour or a known keyword are dropped.",
1839
+ "fields": {
1840
+ "containerPx": {
1841
+ "type": "integer",
1842
+ "min": 0,
1843
+ "max": 2560,
1844
+ "description": "The frame's content width."
1845
+ },
1846
+ "padY": {
1847
+ "type": "integer",
1848
+ "min": 0,
1849
+ "max": 400,
1850
+ "description": "Top and bottom padding."
1851
+ },
1852
+ "padX": {
1853
+ "type": "integer",
1854
+ "min": 0,
1855
+ "max": 200,
1856
+ "description": "The frame's side padding (gutter)."
1857
+ },
1858
+ "bg": {
1859
+ "type": "object",
1860
+ "description": "The section's background.",
1861
+ "fields": {
1862
+ "color": {
1863
+ "type": "string",
1864
+ "description": "Fill colour: hex, rgb(a) or hsl(a)."
1865
+ },
1866
+ "image": {
1867
+ "type": "string",
1868
+ "description": "Background image address (http(s) or root-relative), drawn behind the content."
1869
+ },
1870
+ "overlay": {
1871
+ "type": "string",
1872
+ "description": "Colour or linear/radial gradient laid over the image or the fill."
1873
+ },
1874
+ "size": {
1875
+ "type": "string",
1876
+ "description": "cover, contain or auto; anything else draws as cover."
1877
+ },
1878
+ "position": {
1879
+ "type": "string",
1880
+ "description": "One or two of center/top/bottom/left/right or percentages."
1881
+ }
1882
+ }
1883
+ },
1884
+ "columns": {
1885
+ "type": "object",
1886
+ "description": "Item columns at 390 (base), 768 (md) and 1280 (lg) px; a missing width follows the narrower one.",
1887
+ "fields": {
1888
+ "390": {
1889
+ "type": "integer",
1890
+ "min": 1,
1891
+ "max": 6,
1892
+ "description": "Phone."
1893
+ },
1894
+ "768": {
1895
+ "type": "integer",
1896
+ "min": 1,
1897
+ "max": 6,
1898
+ "description": "Tablet."
1899
+ },
1900
+ "1280": {
1901
+ "type": "integer",
1902
+ "min": 1,
1903
+ "max": 6,
1904
+ "description": "Desktop."
1905
+ }
1906
+ }
1907
+ },
1908
+ "gap": {
1909
+ "type": "integer",
1910
+ "min": 0,
1911
+ "max": 200,
1912
+ "description": "Gap between items."
1913
+ },
1914
+ "tone": {
1915
+ "type": "select",
1916
+ "options": [
1917
+ "light",
1918
+ "dark"
1919
+ ],
1920
+ "description": "What the text is set for: dark = light text on a dark band. Without it, a fill's own lightness decides."
1921
+ },
1922
+ "align": {
1923
+ "type": "select",
1924
+ "options": [
1925
+ "start",
1926
+ "center",
1927
+ "end"
1928
+ ],
1929
+ "description": "Where the heading and lead sit; read by a component whose own align is not set."
1930
+ },
1931
+ "radius": {
1932
+ "type": "integer",
1933
+ "min": 0,
1934
+ "max": 200,
1935
+ "description": "Card and item corner radius."
1936
+ },
1937
+ "minHeight": {
1938
+ "type": "integer",
1939
+ "min": 0,
1940
+ "max": 2000,
1941
+ "description": "The section's minimum height."
1942
+ }
1943
+ }
1944
+ },
1945
+ "open": {
1946
+ "type": "boolean",
1947
+ "default": false,
1948
+ "content": false,
1949
+ "description": "Rendered already open, in the flow of the section and not modal: for previews and visual baselines only, never for a page."
1950
+ }
1951
+ },
1952
+ "slots": {},
1953
+ "js": "vanilla",
1954
+ "dependencies": {},
1955
+ "sources": {
1956
+ "elementor": [
1957
+ "elementor/popup"
1958
+ ],
1959
+ "classic": [
1960
+ "classic/popup-maker"
1961
+ ]
1962
+ },
1963
+ "a11y": "A native modal <dialog> (the APG dialog pattern as the platform implements it): focus moves in and stays in, the page behind is inert, Escape closes and focus returns to the button. The heading names it (aria-labelledby; the button text when there is no heading). The close button is named by closeLabel. Nothing opens on load, on scroll or on exit intent; the text is in the HTML, so crawlers read it, and with scripting off it is shown in the section as a plain block, so nothing is hidden or blocks the page.",
1964
+ "files": [
1965
+ "Dialog.astro"
1966
+ ],
1967
+ "contentFields": {
1968
+ "triggerLabel": "trigger_label",
1969
+ "heading": "heading",
1970
+ "html": "html",
1971
+ "actions": "actions",
1972
+ "actions[].label": "actions[].label",
1973
+ "actions[].href": "actions[].href",
1974
+ "actions[].newTab": "actions[].new_tab",
1975
+ "actions[].style": "actions[].style"
1976
+ }
1977
+ },
1703
1978
  {
1704
1979
  "id": "embed",
1705
1980
  "name": "Embed",
@@ -1708,6 +1983,7 @@
1708
1983
  "uses": [],
1709
1984
  "shared": [
1710
1985
  "KitImage.astro",
1986
+ "safe-url.ts",
1711
1987
  "types.ts"
1712
1988
  ],
1713
1989
  "variants": {
@@ -1817,6 +2093,7 @@
1817
2093
  "shared": [
1818
2094
  "Section.astro",
1819
2095
  "measured.ts",
2096
+ "safe-url.ts",
1820
2097
  "types.ts"
1821
2098
  ],
1822
2099
  "variants": {
@@ -2063,7 +2340,8 @@
2063
2340
  "divi/et_pb_toggle"
2064
2341
  ],
2065
2342
  "classic": [
2066
- "classic/faq"
2343
+ "classic/faq",
2344
+ "classic/details"
2067
2345
  ]
2068
2346
  },
2069
2347
  "a11y": "Native <details>/<summary>: keyboard operable and announced as expandable by every screen reader, with no script to fail. The plus icon is decorative. The JSON-LD answer text is the answer with its markup removed.",
@@ -2087,6 +2365,7 @@
2087
2365
  "shared": [
2088
2366
  "Section.astro",
2089
2367
  "measured.ts",
2368
+ "safe-url.ts",
2090
2369
  "types.ts"
2091
2370
  ],
2092
2371
  "variants": {
@@ -2339,6 +2618,7 @@
2339
2618
  "category": "chrome",
2340
2619
  "uses": [],
2341
2620
  "shared": [
2621
+ "safe-url.ts",
2342
2622
  "types.ts"
2343
2623
  ],
2344
2624
  "variants": {
@@ -2538,6 +2818,7 @@
2538
2818
  "Section.astro",
2539
2819
  "image.ts",
2540
2820
  "measured.ts",
2821
+ "safe-url.ts",
2541
2822
  "types.ts"
2542
2823
  ],
2543
2824
  "variants": {
@@ -2826,11 +3107,13 @@
2826
3107
  "description": "Site header: brand (logo and/or name), navigation and an optional call-to-action button.",
2827
3108
  "category": "chrome",
2828
3109
  "uses": [
2829
- "nav"
3110
+ "nav",
3111
+ "search-box"
2830
3112
  ],
2831
3113
  "shared": [
2832
3114
  "Button.astro",
2833
3115
  "KitImage.astro",
3116
+ "safe-url.ts",
2834
3117
  "types.ts"
2835
3118
  ],
2836
3119
  "variants": {
@@ -2859,6 +3142,14 @@
2859
3142
  ],
2860
3143
  "default": "static",
2861
3144
  "description": "Sticky keeps the header at the top while scrolling."
3145
+ },
3146
+ "menu": {
3147
+ "options": [
3148
+ "flyout",
3149
+ "mega"
3150
+ ],
3151
+ "default": "flyout",
3152
+ "description": "How submenus open on wide screens: a list under the item (flyout) or a wide panel of columns (mega). Submenus nest to any depth."
2862
3153
  }
2863
3154
  },
2864
3155
  "props": {
@@ -2981,6 +3272,24 @@
2981
3272
  },
2982
3273
  "description": "Header button, shown on wide screens."
2983
3274
  },
3275
+ "search": {
3276
+ "type": "object",
3277
+ "fields": {
3278
+ "label": {
3279
+ "type": "string"
3280
+ },
3281
+ "placeholder": {
3282
+ "type": "string"
3283
+ },
3284
+ "submitLabel": {
3285
+ "type": "string"
3286
+ },
3287
+ "action": {
3288
+ "type": "url"
3289
+ }
3290
+ },
3291
+ "description": "A search field in the bar: a GET form to the site's search page (default /search); below the bar on a phone."
3292
+ },
2984
3293
  "navLabel": {
2985
3294
  "type": "string",
2986
3295
  "description": "Accessible name of the navigation (ui-strings nav.label)."
@@ -3030,6 +3339,7 @@
3030
3339
  "KitImage.astro",
3031
3340
  "Section.astro",
3032
3341
  "measured.ts",
3342
+ "safe-url.ts",
3033
3343
  "types.ts"
3034
3344
  ],
3035
3345
  "variants": {
@@ -3355,16 +3665,95 @@
3355
3665
  }
3356
3666
  },
3357
3667
  {
3358
- "id": "logo-cloud",
3359
- "name": "Logo cloud",
3360
- "description": "A grid, a row or an endless strip of client or partner logos, each optionally linked, under an optional heading (\"Trusted by\").",
3361
- "category": "section",
3668
+ "id": "language-switcher",
3669
+ "name": "LanguageSwitcher",
3670
+ "description": "Links to the same page in the site's other languages, each with hreflang and its own lang; the current one is marked aria-current. A plain list or a native <details> menu; no JavaScript. The addresses are the page's equivalents in each language, supplied by the caller.",
3671
+ "category": "chrome",
3672
+ "uses": [],
3673
+ "shared": [
3674
+ "safe-url.ts"
3675
+ ],
3676
+ "variants": {
3677
+ "layout": {
3678
+ "options": [
3679
+ "list",
3680
+ "menu"
3681
+ ],
3682
+ "default": "list",
3683
+ "description": "A row of links, or a menu that shows the current language and opens on click."
3684
+ },
3685
+ "align": {
3686
+ "options": [
3687
+ "start",
3688
+ "end"
3689
+ ],
3690
+ "default": "start",
3691
+ "description": "Which edge the menu panel lines up with."
3692
+ },
3693
+ "labelStyle": {
3694
+ "options": [
3695
+ "name",
3696
+ "code"
3697
+ ],
3698
+ "default": "name",
3699
+ "description": "The language's own name (\"Deutsch\") or its code (\"DE\")."
3700
+ }
3701
+ },
3702
+ "props": {
3703
+ "languages": {
3704
+ "type": "array",
3705
+ "items": {
3706
+ "type": "object",
3707
+ "fields": {
3708
+ "lang": {
3709
+ "type": "string",
3710
+ "required": true
3711
+ },
3712
+ "label": {
3713
+ "type": "string",
3714
+ "required": true
3715
+ },
3716
+ "href": {
3717
+ "type": "url",
3718
+ "required": true
3719
+ },
3720
+ "current": {
3721
+ "type": "boolean"
3722
+ }
3723
+ }
3724
+ },
3725
+ "description": "The languages: BCP 47 code, the language's own name, the page's address in it, and whether it is the page being read."
3726
+ },
3727
+ "label": {
3728
+ "type": "string",
3729
+ "description": "Accessible name (ui-strings language.label)."
3730
+ }
3731
+ },
3732
+ "slots": {},
3733
+ "js": "none",
3734
+ "dependencies": {},
3735
+ "sources": {
3736
+ "gutenberg": [
3737
+ "polylang/language-switcher"
3738
+ ]
3739
+ },
3740
+ "a11y": "List layout: a labelled <nav>; menu layout: a native <details> whose summary carries the label for assistive technology and the current language visibly. Every link has lang and hreflang, so screen readers pronounce each name in its language; the current one is aria-current=true. Fewer than two languages draw nothing.",
3741
+ "files": [
3742
+ "LanguageSwitcher.astro"
3743
+ ]
3744
+ },
3745
+ {
3746
+ "id": "logo-cloud",
3747
+ "name": "Logo cloud",
3748
+ "description": "A grid, a row or an endless strip of client or partner logos, each optionally linked, under an optional heading (\"Trusted by\").",
3749
+ "category": "section",
3362
3750
  "uses": [],
3363
3751
  "shared": [
3364
3752
  "KitImage.astro",
3365
3753
  "Section.astro",
3366
3754
  "image.ts",
3367
3755
  "measured.ts",
3756
+ "safe-url.ts",
3368
3757
  "types.ts"
3369
3758
  ],
3370
3759
  "variants": {
@@ -3614,10 +4003,11 @@
3614
4003
  {
3615
4004
  "id": "nav",
3616
4005
  "name": "Navigation",
3617
- "description": "Site navigation: an inline list with hover/focus submenus on wide screens and a toggle on narrow ones that opens a native popover drawer or a <details> dropdown. No JavaScript.",
4006
+ "description": "Site navigation: an inline list with hover/focus submenus on wide screens and a toggle on narrow ones that opens a native popover drawer or a <details> dropdown. Submenus nest to any depth; the mega variant draws them as a column panel. Works without JavaScript; a small script (only when a menu has submenus) keeps aria-expanded true and lets Escape close a panel.",
3618
4007
  "category": "chrome",
3619
4008
  "uses": [],
3620
4009
  "shared": [
4010
+ "safe-url.ts",
3621
4011
  "types.ts"
3622
4012
  ],
3623
4013
  "variants": {
@@ -3629,6 +4019,14 @@
3629
4019
  "default": "popover",
3630
4020
  "description": "Narrow-screen menu: a side drawer (Popover API) or a dropdown under the toggle."
3631
4021
  },
4022
+ "menu": {
4023
+ "options": [
4024
+ "flyout",
4025
+ "mega"
4026
+ ],
4027
+ "default": "flyout",
4028
+ "description": "How a submenu opens on wide screens: a list under the item (flyout) or a wide panel with one column per child and the grandchildren listed under it (mega)."
4029
+ },
3632
4030
  "align": {
3633
4031
  "options": [
3634
4032
  "start",
@@ -3720,9 +4118,10 @@
3720
4118
  "classic/nav-menu"
3721
4119
  ]
3722
4120
  },
3723
- "a11y": "A <nav> landmark with a label; the current page carries aria-current. Submenus open on :focus-within as well as hover. The drawer is a native popover: Escape and light dismiss close it and focus returns to the toggle.",
4121
+ "a11y": "A <nav> landmark with a label; the current page carries aria-current. Each parent has a button (aria-controls its panel, labelled by the item) that opens the panel on hover and :focus-within; with the small script aria-expanded follows what is open and Escape closes the panel and returns focus to the button, as in the WAI-ARIA disclosure navigation pattern. Tab leaves a panel and closes it; nothing is hidden from crawlers (the panels are in the HTML). The drawer is a native popover: Escape and light dismiss close it and focus returns to the toggle.",
3724
4122
  "files": [
3725
- "Nav.astro"
4123
+ "Nav.astro",
4124
+ "NavTree.astro"
3726
4125
  ]
3727
4126
  },
3728
4127
  {
@@ -3734,6 +4133,7 @@
3734
4133
  "shared": [
3735
4134
  "Section.astro",
3736
4135
  "measured.ts",
4136
+ "safe-url.ts",
3737
4137
  "types.ts"
3738
4138
  ],
3739
4139
  "variants": {
@@ -3973,7 +4373,9 @@
3973
4373
  "description": "Links between the pages of a post list, at WordPress addresses (<base>page/<n>/).",
3974
4374
  "category": "content",
3975
4375
  "uses": [],
3976
- "shared": [],
4376
+ "shared": [
4377
+ "safe-url.ts"
4378
+ ],
3977
4379
  "variants": {
3978
4380
  "style": {
3979
4381
  "options": [
@@ -4058,6 +4460,7 @@
4058
4460
  "uses": [],
4059
4461
  "shared": [
4060
4462
  "KitImage.astro",
4463
+ "safe-url.ts",
4061
4464
  "types.ts"
4062
4465
  ],
4063
4466
  "variants": {
@@ -4216,6 +4619,7 @@
4216
4619
  "shared": [
4217
4620
  "Section.astro",
4218
4621
  "measured.ts",
4622
+ "safe-url.ts",
4219
4623
  "types.ts"
4220
4624
  ],
4221
4625
  "variants": {
@@ -4530,6 +4934,7 @@
4530
4934
  "Button.astro",
4531
4935
  "Section.astro",
4532
4936
  "measured.ts",
4937
+ "safe-url.ts",
4533
4938
  "types.ts"
4534
4939
  ],
4535
4940
  "variants": {
@@ -4934,6 +5339,86 @@
4934
5339
  "Prose.astro"
4935
5340
  ]
4936
5341
  },
5342
+ {
5343
+ "id": "search-box",
5344
+ "name": "SearchBox",
5345
+ "description": "A search field that sends the visitor to the site's search page (`/search?q=…`): a plain GET form with a labelled role=search landmark, no JavaScript. For a header slot or inline in a page.",
5346
+ "category": "chrome",
5347
+ "uses": [],
5348
+ "shared": [
5349
+ "safe-url.ts"
5350
+ ],
5351
+ "variants": {
5352
+ "size": {
5353
+ "options": [
5354
+ "sm",
5355
+ "md"
5356
+ ],
5357
+ "default": "md",
5358
+ "description": "Field and button height (36 and 44 px)."
5359
+ },
5360
+ "width": {
5361
+ "options": [
5362
+ "auto",
5363
+ "full"
5364
+ ],
5365
+ "default": "auto",
5366
+ "description": "A compact field (up to 20 rem) or the whole column."
5367
+ },
5368
+ "button": {
5369
+ "options": [
5370
+ "text",
5371
+ "icon"
5372
+ ],
5373
+ "default": "text",
5374
+ "description": "The button reads its label, or shows a magnifier named by the same label."
5375
+ },
5376
+ "labelStyle": {
5377
+ "options": [
5378
+ "hidden",
5379
+ "shown"
5380
+ ],
5381
+ "default": "hidden",
5382
+ "description": "The field's label for assistive technology only, or printed above the field."
5383
+ }
5384
+ },
5385
+ "props": {
5386
+ "action": {
5387
+ "type": "url",
5388
+ "default": "/search",
5389
+ "description": "The search page the form sends to; it reads `q`."
5390
+ },
5391
+ "label": {
5392
+ "type": "string",
5393
+ "description": "The landmark's and field's accessible name (ui-strings search.label)."
5394
+ },
5395
+ "placeholder": {
5396
+ "type": "string",
5397
+ "description": "Hint text in the field (ui-strings search.placeholder)."
5398
+ },
5399
+ "submitLabel": {
5400
+ "type": "string",
5401
+ "description": "The button's name (ui-strings search.submit)."
5402
+ },
5403
+ "id": {
5404
+ "type": "string",
5405
+ "default": "site-search",
5406
+ "description": "Prefix of the field's id; set it when two search boxes share a page."
5407
+ }
5408
+ },
5409
+ "slots": {},
5410
+ "js": "none",
5411
+ "dependencies": {},
5412
+ "sources": {
5413
+ "gutenberg": [
5414
+ "core/search"
5415
+ ]
5416
+ },
5417
+ "a11y": "A <form role=\"search\"> with a real <label> for the type=search field (sr-only unless shown); the button has a text or aria-label name; focus rings on both.",
5418
+ "files": [
5419
+ "SearchBox.astro"
5420
+ ]
5421
+ },
4937
5422
  {
4938
5423
  "id": "slider",
4939
5424
  "name": "Slider",
@@ -4943,7 +5428,11 @@
4943
5428
  "shared": [
4944
5429
  "Button.astro",
4945
5430
  "KitImage.astro",
5431
+ "Section.astro",
5432
+ "SectionHeader.astro",
4946
5433
  "image.ts",
5434
+ "measured.ts",
5435
+ "safe-url.ts",
4947
5436
  "types.ts"
4948
5437
  ],
4949
5438
  "variants": {
@@ -5048,6 +5537,175 @@
5048
5537
  "default": false,
5049
5538
  "content": false,
5050
5539
  "description": "Wrap from the last slide to the first."
5540
+ },
5541
+ "id": {
5542
+ "type": "string",
5543
+ "default": "slider",
5544
+ "content": false,
5545
+ "description": "Unique on the page: names the track that the previous/next buttons control (aria-controls)."
5546
+ },
5547
+ "heading": {
5548
+ "type": "string",
5549
+ "label": "Heading",
5550
+ "description": "The section heading."
5551
+ },
5552
+ "intro": {
5553
+ "type": "text",
5554
+ "label": "Introduction",
5555
+ "description": "A sentence under the heading."
5556
+ },
5557
+ "eyebrow": {
5558
+ "type": "string",
5559
+ "label": "Eyebrow",
5560
+ "description": "A short line above the heading."
5561
+ },
5562
+ "actions": {
5563
+ "type": "array",
5564
+ "label": "Buttons",
5565
+ "required": false,
5566
+ "items": {
5567
+ "type": "object",
5568
+ "fields": {
5569
+ "label": {
5570
+ "type": "string",
5571
+ "label": "Label",
5572
+ "required": true,
5573
+ "description": "The button text."
5574
+ },
5575
+ "href": {
5576
+ "type": "url",
5577
+ "label": "Link",
5578
+ "required": true,
5579
+ "description": "Where the button goes: a page on this site or a full address."
5580
+ },
5581
+ "newTab": {
5582
+ "type": "boolean",
5583
+ "label": "Open in a new tab",
5584
+ "description": "Open the link in a new tab (an external site the reader should not leave for)."
5585
+ },
5586
+ "style": {
5587
+ "type": "select",
5588
+ "label": "Style",
5589
+ "options": [
5590
+ "primary",
5591
+ "secondary",
5592
+ "ghost"
5593
+ ],
5594
+ "description": "primary for the main action, secondary or ghost for the ones beside it."
5595
+ }
5596
+ }
5597
+ },
5598
+ "description": "Buttons under the intro, in order; none by default."
5599
+ },
5600
+ "measured": {
5601
+ "type": "object",
5602
+ "content": false,
5603
+ "description": "The source section's measured style (MeasuredStyle): frame width, padding, fill, image, columns per width, gap, text tone, radius, minimum height — all in pixels. Absent, the site's tokens; present, it wins over tone and columns. Values that are not a number, a colour or a known keyword are dropped.",
5604
+ "fields": {
5605
+ "containerPx": {
5606
+ "type": "integer",
5607
+ "min": 0,
5608
+ "max": 2560,
5609
+ "description": "The frame's content width."
5610
+ },
5611
+ "padY": {
5612
+ "type": "integer",
5613
+ "min": 0,
5614
+ "max": 400,
5615
+ "description": "Top and bottom padding."
5616
+ },
5617
+ "padX": {
5618
+ "type": "integer",
5619
+ "min": 0,
5620
+ "max": 200,
5621
+ "description": "The frame's side padding (gutter)."
5622
+ },
5623
+ "bg": {
5624
+ "type": "object",
5625
+ "description": "The section's background.",
5626
+ "fields": {
5627
+ "color": {
5628
+ "type": "string",
5629
+ "description": "Fill colour: hex, rgb(a) or hsl(a)."
5630
+ },
5631
+ "image": {
5632
+ "type": "string",
5633
+ "description": "Background image address (http(s) or root-relative), drawn behind the content."
5634
+ },
5635
+ "overlay": {
5636
+ "type": "string",
5637
+ "description": "Colour or linear/radial gradient laid over the image or the fill."
5638
+ },
5639
+ "size": {
5640
+ "type": "string",
5641
+ "description": "cover, contain or auto; anything else draws as cover."
5642
+ },
5643
+ "position": {
5644
+ "type": "string",
5645
+ "description": "One or two of center/top/bottom/left/right or percentages."
5646
+ }
5647
+ }
5648
+ },
5649
+ "columns": {
5650
+ "type": "object",
5651
+ "description": "Slides in view at 390 (base), 768 (md) and 1280 (lg) px; a missing width follows the narrower one. Wins over perView.",
5652
+ "fields": {
5653
+ "390": {
5654
+ "type": "integer",
5655
+ "min": 1,
5656
+ "max": 6,
5657
+ "description": "Phone."
5658
+ },
5659
+ "768": {
5660
+ "type": "integer",
5661
+ "min": 1,
5662
+ "max": 6,
5663
+ "description": "Tablet."
5664
+ },
5665
+ "1280": {
5666
+ "type": "integer",
5667
+ "min": 1,
5668
+ "max": 6,
5669
+ "description": "Desktop."
5670
+ }
5671
+ }
5672
+ },
5673
+ "gap": {
5674
+ "type": "integer",
5675
+ "min": 0,
5676
+ "max": 200,
5677
+ "description": "Gap between slides."
5678
+ },
5679
+ "tone": {
5680
+ "type": "select",
5681
+ "options": [
5682
+ "light",
5683
+ "dark"
5684
+ ],
5685
+ "description": "What the text is set for: dark = light text on a dark band. Without it, a fill's own lightness decides."
5686
+ },
5687
+ "align": {
5688
+ "type": "select",
5689
+ "options": [
5690
+ "start",
5691
+ "center",
5692
+ "end"
5693
+ ],
5694
+ "description": "Where the heading and lead sit; read by a component whose own align is not set."
5695
+ },
5696
+ "radius": {
5697
+ "type": "integer",
5698
+ "min": 0,
5699
+ "max": 200,
5700
+ "description": "Card and item corner radius."
5701
+ },
5702
+ "minHeight": {
5703
+ "type": "integer",
5704
+ "min": 0,
5705
+ "max": 2000,
5706
+ "description": "The section's minimum height."
5707
+ }
5708
+ }
5051
5709
  }
5052
5710
  },
5053
5711
  "slots": {},
@@ -5062,7 +5720,9 @@
5062
5720
  "elementor": [
5063
5721
  "elementor/image-carousel",
5064
5722
  "elementor/slides",
5065
- "elementor/media-carousel"
5723
+ "elementor/media-carousel",
5724
+ "elementor/nested-carousel",
5725
+ "elementor/loop-carousel"
5066
5726
  ],
5067
5727
  "divi": [
5068
5728
  "divi/et_pb_slider",
@@ -5072,12 +5732,17 @@
5072
5732
  "classic": [
5073
5733
  "classic/revslider",
5074
5734
  "classic/metaslider",
5075
- "classic/smart-slider"
5735
+ "classic/smart-slider",
5736
+ "classic/swiper",
5737
+ "classic/slick",
5738
+ "classic/splide",
5739
+ "classic/owl"
5076
5740
  ]
5077
5741
  },
5078
- "a11y": "WAI-ARIA carousel pattern: a labelled region with aria-roledescription=carousel, slides as labelled groups ('Slide 2 of 5'), labelled previous/next buttons disabled at the ends, and dot buttons marking the current slide. No autoplay; with prefers-reduced-motion slides change without animation. Without JavaScript every slide is reachable by scrolling.",
5742
+ "a11y": "WAI-ARIA carousel pattern: a labelled region with aria-roledescription=carousel, slides as labelled groups ('Slide 2 of 5'), labelled previous/next buttons disabled at the ends, and dot buttons marking the current slide. The track and the buttons are tied by aria-controls, the row takes focus (arrow keys page it, polite live announcement). There is no autoplay, so nothing moves unasked; with prefers-reduced-motion slides change without animation. Without JavaScript every slide is reachable by scrolling.",
5079
5743
  "files": [
5080
- "Slider.astro"
5744
+ "Slider.astro",
5745
+ "SliderTrack.astro"
5081
5746
  ],
5082
5747
  "contentFields": {
5083
5748
  "slides": "slides",
@@ -5086,9 +5751,114 @@
5086
5751
  "slides[].title": "slides[].title",
5087
5752
  "slides[].text": "slides[].text",
5088
5753
  "slides[].ctaLabel": "slides[].cta_label",
5089
- "slides[].ctaHref": "slides[].cta_href"
5754
+ "slides[].ctaHref": "slides[].cta_href",
5755
+ "heading": "heading",
5756
+ "intro": "intro",
5757
+ "eyebrow": "eyebrow",
5758
+ "actions": "actions",
5759
+ "actions[].label": "actions[].label",
5760
+ "actions[].href": "actions[].href",
5761
+ "actions[].newTab": "actions[].new_tab",
5762
+ "actions[].style": "actions[].style"
5090
5763
  }
5091
5764
  },
5765
+ {
5766
+ "id": "social-links",
5767
+ "name": "SocialLinks",
5768
+ "description": "Links to the site's profiles on other networks as marks, names or both. The network is read from each address's host (the table Team uses), so a link carries only its address; an unknown host is shown as itself. Stands alone in a header, top bar, contact section or author box.",
5769
+ "category": "chrome",
5770
+ "uses": [],
5771
+ "shared": [
5772
+ "social.ts",
5773
+ "safe-url.ts"
5774
+ ],
5775
+ "variants": {
5776
+ "display": {
5777
+ "options": [
5778
+ "icons",
5779
+ "text",
5780
+ "both"
5781
+ ],
5782
+ "default": "icons",
5783
+ "description": "Mark only (named for assistive technology), the network's name, or both."
5784
+ },
5785
+ "size": {
5786
+ "options": [
5787
+ "sm",
5788
+ "md",
5789
+ "lg"
5790
+ ],
5791
+ "default": "md",
5792
+ "description": "Mark and touch target size (32, 40 and 48 px minimum)."
5793
+ },
5794
+ "align": {
5795
+ "options": [
5796
+ "start",
5797
+ "center",
5798
+ "end"
5799
+ ],
5800
+ "default": "start",
5801
+ "description": "Where the row sits in its container."
5802
+ },
5803
+ "shape": {
5804
+ "options": [
5805
+ "plain",
5806
+ "circle"
5807
+ ],
5808
+ "default": "plain",
5809
+ "description": "Bare marks, or each in a ringed circle."
5810
+ }
5811
+ },
5812
+ "props": {
5813
+ "links": {
5814
+ "type": "array",
5815
+ "required": true,
5816
+ "items": {
5817
+ "type": "object",
5818
+ "fields": {
5819
+ "href": {
5820
+ "type": "url",
5821
+ "required": true
5822
+ },
5823
+ "label": {
5824
+ "type": "string"
5825
+ }
5826
+ }
5827
+ },
5828
+ "description": "The profiles; `label` only for a link whose host names no network (a personal site, \"Newsletter\")."
5829
+ },
5830
+ "name": {
5831
+ "type": "string",
5832
+ "description": "Whose profiles these are, for \"{name} on {network}\"."
5833
+ },
5834
+ "label": {
5835
+ "type": "string",
5836
+ "description": "Accessible name of the list (ui-strings social.label)."
5837
+ },
5838
+ "profileLabel": {
5839
+ "type": "string",
5840
+ "description": "How each link announces itself; {name} and {network} are replaced (ui-strings social.profile)."
5841
+ }
5842
+ },
5843
+ "slots": {},
5844
+ "js": "none",
5845
+ "dependencies": {},
5846
+ "sources": {
5847
+ "gutenberg": [
5848
+ "core/social-links"
5849
+ ],
5850
+ "elementor": [
5851
+ "elementor/social-icons"
5852
+ ],
5853
+ "divi": [
5854
+ "divi/et_pb_social_media_follow"
5855
+ ]
5856
+ },
5857
+ "a11y": "A labelled list of links; each link's accessible name is \"{name} on {network}\" and always contains the visible text; marks are aria-hidden; links open in a new tab with rel=me noopener; every target is at least 32 px.",
5858
+ "files": [
5859
+ "SocialLinks.astro"
5860
+ ]
5861
+ },
5092
5862
  {
5093
5863
  "id": "split",
5094
5864
  "name": "Split",
@@ -5103,6 +5873,7 @@
5103
5873
  "KitImage.astro",
5104
5874
  "Section.astro",
5105
5875
  "measured.ts",
5876
+ "safe-url.ts",
5106
5877
  "types.ts"
5107
5878
  ],
5108
5879
  "variants": {
@@ -5499,6 +6270,7 @@
5499
6270
  "Section.astro",
5500
6271
  "image.ts",
5501
6272
  "measured.ts",
6273
+ "safe-url.ts",
5502
6274
  "types.ts"
5503
6275
  ],
5504
6276
  "variants": {
@@ -5790,6 +6562,7 @@
5790
6562
  "Section.astro",
5791
6563
  "image.ts",
5792
6564
  "measured.ts",
6565
+ "safe-url.ts",
5793
6566
  "types.ts"
5794
6567
  ],
5795
6568
  "variants": {
@@ -6065,8 +6838,11 @@
6065
6838
  "category": "content",
6066
6839
  "uses": [],
6067
6840
  "shared": [
6841
+ "Button.astro",
6068
6842
  "Section.astro",
6843
+ "SectionHeader.astro",
6069
6844
  "measured.ts",
6845
+ "safe-url.ts",
6070
6846
  "types.ts"
6071
6847
  ],
6072
6848
  "variants": {
@@ -6098,6 +6874,54 @@
6098
6874
  }
6099
6875
  },
6100
6876
  "props": {
6877
+ "intro": {
6878
+ "type": "text",
6879
+ "label": "Introduction",
6880
+ "description": "A sentence under the heading."
6881
+ },
6882
+ "eyebrow": {
6883
+ "type": "string",
6884
+ "label": "Eyebrow",
6885
+ "description": "A short line above the heading."
6886
+ },
6887
+ "actions": {
6888
+ "type": "array",
6889
+ "label": "Buttons",
6890
+ "required": false,
6891
+ "items": {
6892
+ "type": "object",
6893
+ "fields": {
6894
+ "label": {
6895
+ "type": "string",
6896
+ "label": "Label",
6897
+ "required": true,
6898
+ "description": "The button text."
6899
+ },
6900
+ "href": {
6901
+ "type": "url",
6902
+ "label": "Link",
6903
+ "required": true,
6904
+ "description": "Where the button goes: a page on this site or a full address."
6905
+ },
6906
+ "newTab": {
6907
+ "type": "boolean",
6908
+ "label": "Open in a new tab",
6909
+ "description": "Open the link in a new tab (an external site the reader should not leave for)."
6910
+ },
6911
+ "style": {
6912
+ "type": "select",
6913
+ "label": "Style",
6914
+ "options": [
6915
+ "primary",
6916
+ "secondary",
6917
+ "ghost"
6918
+ ],
6919
+ "description": "primary for the main action, secondary or ghost for the ones beside it."
6920
+ }
6921
+ }
6922
+ },
6923
+ "description": "Buttons under the intro, in order; none by default."
6924
+ },
6101
6925
  "measured": {
6102
6926
  "type": "object",
6103
6927
  "content": false,
@@ -6254,7 +7078,8 @@
6254
7078
  "divi/et_pb_tabs"
6255
7079
  ],
6256
7080
  "classic": [
6257
- "classic/tabs"
7081
+ "classic/tabs",
7082
+ "classic/aria-tabs"
6258
7083
  ]
6259
7084
  },
6260
7085
  "a11y": "Zag.js tabs: role=tablist/tab/tabpanel with aria-selected, aria-controls and aria-labelledby; arrow keys (per orientation), Home and End move between tabs. Before the script runs every panel is visible with its own title (an h3 under the section's h2, an h2 when there is no heading); after, the titles become screen-reader-only and the tabs label the panels.",
@@ -6273,6 +7098,8 @@
6273
7098
  "Section.astro",
6274
7099
  "image.ts",
6275
7100
  "measured.ts",
7101
+ "social.ts",
7102
+ "safe-url.ts",
6276
7103
  "types.ts"
6277
7104
  ],
6278
7105
  "variants": {
@@ -6578,6 +7405,7 @@
6578
7405
  "Section.astro",
6579
7406
  "image.ts",
6580
7407
  "measured.ts",
7408
+ "safe-url.ts",
6581
7409
  "types.ts"
6582
7410
  ],
6583
7411
  "variants": {
@@ -6836,7 +7664,9 @@
6836
7664
  "dependencies": {},
6837
7665
  "sources": {
6838
7666
  "elementor": [
6839
- "elementor/testimonial"
7667
+ "elementor/testimonial",
7668
+ "elementor/testimonial-carousel",
7669
+ "elementor/reviews"
6840
7670
  ],
6841
7671
  "divi": [
6842
7672
  "divi/et_pb_testimonial"