vanilla-framework 4.48.0 → 4.50.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vanilla-framework",
3
- "version": "4.48.0",
3
+ "version": "4.50.0",
4
4
  "author": {
5
5
  "email": "webteam@canonical.com",
6
6
  "name": "Canonical Webteam"
@@ -1649,3 +1649,174 @@
1649
1649
  @mixin vf-icon-circle-of-friends-themed {
1650
1650
  @include vf-themed-icon($light-value: vf-icon-circle-of-friends-url($colors--light-theme--icon), $dark-value: vf-icon-circle-of-friends-url($colors--dark-theme--icon));
1651
1651
  }
1652
+
1653
+ // ICONS ADDED IN APRIL 2026 v4.49.0
1654
+
1655
+ // devtools
1656
+ @function vf-icon-devtools-url($color) {
1657
+ @return url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='none' viewBox='0 0 16 16'%3E%3Cpath fill='#{vf-url-friendly-color($color)}' d='M10.414 3.469 14.04 8l-3.625 4.531 1.172.938L15.96 8l-4.375-5.469zM.04 8l4.374 5.469 1.172-.938L1.96 8l3.625-4.531-1.172-.938z'/%3E%3C/svg%3E");
1658
+ }
1659
+
1660
+ @mixin vf-icon-devtools($color: $colors--light-theme--icon) {
1661
+ background-image: vf-icon-devtools-url($color);
1662
+ }
1663
+
1664
+ @mixin vf-icon-devtools-themed {
1665
+ @include vf-themed-icon($light-value: vf-icon-devtools-url($colors--light-theme--icon), $dark-value: vf-icon-devtools-url($colors--dark-theme--icon));
1666
+ }
1667
+
1668
+ // devtools-off
1669
+ @function vf-icon-devtools-off-url($color) {
1670
+ @return url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='none' viewBox='0 0 16 16'%3E%3Cpath fill='#{vf-url-friendly-color($color)}' d='m14.78 2.28-1.886 1.886L15.96 8l-4.375 5.469-1.172-.938L14.04 8l-2.213-2.767L2.28 14.78l-1.06-1.06 12.5-12.5zM5.586 3.469 1.96 8l1.323 1.654-1.067 1.068L.039 8l4.375-5.469z'/%3E%3C/svg%3E");
1671
+ }
1672
+
1673
+ @mixin vf-icon-devtools-off($color: $colors--light-theme--icon) {
1674
+ background-image: vf-icon-devtools-off-url($color);
1675
+ }
1676
+
1677
+ @mixin vf-icon-devtools-off-themed {
1678
+ @include vf-themed-icon($light-value: vf-icon-devtools-off-url($colors--light-theme--icon), $dark-value: vf-icon-devtools-off-url($colors--dark-theme--icon));
1679
+ }
1680
+
1681
+ // keyboard
1682
+ @function vf-icon-keyboard-url($color) {
1683
+ @return url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='none' viewBox='0 0 16 16'%3E%3Cpath fill='#{vf-url-friendly-color($color)}' d='M5.5 10a.5.5 0 0 0-.5.5v.5a.5.5 0 0 0 .5.5h5a.5.5 0 0 0 .5-.5v-.5a.5.5 0 0 0-.5-.5zM12.5 7.5a.5.5 0 0 0-.5.5v.5a.5.5 0 0 0 .5.5h.5a.5.5 0 0 0 .5-.5V8a.5.5 0 0 0-.5-.5zM10.25 7.5a.5.5 0 0 0-.5.5v.5a.5.5 0 0 0 .5.5h.5a.5.5 0 0 0 .5-.5V8a.5.5 0 0 0-.5-.5zM8 7.5a.5.5 0 0 0-.5.5v.5A.5.5 0 0 0 8 9h.5a.5.5 0 0 0 .5-.5V8a.5.5 0 0 0-.5-.5zM5.5 7.5A.5.5 0 0 0 5 8v.5a.5.5 0 0 0 .5.5H6a.5.5 0 0 0 .5-.5V8a.5.5 0 0 0-.5-.5zM3 7.5a.5.5 0 0 0-.5.5v.5A.5.5 0 0 0 3 9h.5a.5.5 0 0 0 .5-.5V8a.5.5 0 0 0-.5-.5zM12.5 5a.5.5 0 0 0-.5.5V6a.5.5 0 0 0 .5.5h.5a.5.5 0 0 0 .5-.5v-.5A.5.5 0 0 0 13 5zM10.25 5a.5.5 0 0 0-.5.5V6a.5.5 0 0 0 .5.5h.5a.5.5 0 0 0 .5-.5v-.5a.5.5 0 0 0-.5-.5zM8 5a.5.5 0 0 0-.5.5V6a.5.5 0 0 0 .5.5h.5A.5.5 0 0 0 9 6v-.5a.5.5 0 0 0-.5-.5zM5.5 5a.5.5 0 0 0-.5.5V6a.5.5 0 0 0 .5.5H6a.5.5 0 0 0 .5-.5v-.5A.5.5 0 0 0 6 5zM3 5a.5.5 0 0 0-.5.5V6a.5.5 0 0 0 .5.5h.5A.5.5 0 0 0 4 6v-.5a.5.5 0 0 0-.5-.5z'/%3E%3Cpath fill='#{vf-url-friendly-color($color)}' fill-rule='evenodd' d='M1.5 2A1.5 1.5 0 0 0 0 3.5v9A1.5 1.5 0 0 0 1.5 14h13a1.5 1.5 0 0 0 1.5-1.5v-9A1.5 1.5 0 0 0 14.5 2zm13 10.5h-13v-9h13z' clip-rule='evenodd'/%3E%3C/svg%3E");
1684
+ }
1685
+
1686
+ @mixin vf-icon-keyboard($color: $colors--light-theme--icon) {
1687
+ background-image: vf-icon-keyboard-url($color);
1688
+ }
1689
+
1690
+ @mixin vf-icon-keyboard-themed {
1691
+ @include vf-themed-icon($light-value: vf-icon-keyboard-url($colors--light-theme--icon), $dark-value: vf-icon-keyboard-url($colors--dark-theme--icon));
1692
+ }
1693
+
1694
+ // keyboard-off
1695
+ @function vf-icon-keyboard-off-url($color) {
1696
+ @return url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='none' viewBox='0 0 16 16'%3E%3Cg fill='#{vf-url-friendly-color($color)}' clip-path='url(%23a)'%3E%3Cpath d='M12.5 7.5a.5.5 0 0 0-.5.5v.5a.5.5 0 0 0 .5.5h.5a.5.5 0 0 0 .5-.5V8a.5.5 0 0 0-.5-.5z'/%3E%3Cpath fill-rule='evenodd' d='m.97 14.47 1.06 1.06L3.56 14H14.5a1.5 1.5 0 0 0 1.5-1.5v-9a1.5 1.5 0 0 0-.682-1.258l.712-.712L14.97.47zM14.5 3.5v9H5.06l1-1h4.44a.5.5 0 0 0 .5-.5v-.5a.5.5 0 0 0-.5-.5H7.56l2.27-2.27a.5.5 0 0 0-.08.27v.5a.5.5 0 0 0 .5.5h.5a.5.5 0 0 0 .5-.5V8a.5.5 0 0 0-.5-.5h-.5c-.099 0-.19.03-.269.08L12 5.56V6a.5.5 0 0 0 .5.5h.5a.5.5 0 0 0 .5-.5v-.5A.5.5 0 0 0 13 5h-.44l1.5-1.5z' clip-rule='evenodd'/%3E%3Cpath d='M1.5 2A1.5 1.5 0 0 0 0 3.5v9c0 .27.072.523.197.742L1.5 11.94V3.5h8.44l1.5-1.5z'/%3E%3Cpath d='M3 7.5a.5.5 0 0 0-.5.5v.5A.5.5 0 0 0 3 9h.5a.5.5 0 0 0 .5-.5V8a.5.5 0 0 0-.5-.5zM5.5 7.5A.5.5 0 0 0 5 8v.44l.94-.94zM5.5 5a.5.5 0 0 0-.5.5V6a.5.5 0 0 0 .5.5H6a.5.5 0 0 0 .5-.5v-.5A.5.5 0 0 0 6 5zM3 5a.5.5 0 0 0-.5.5V6a.5.5 0 0 0 .5.5h.5A.5.5 0 0 0 4 6v-.5a.5.5 0 0 0-.5-.5zM8 5a.5.5 0 0 0-.5.5v.44L8.44 5z'/%3E%3C/g%3E%3Cdefs%3E%3CclipPath id='a'%3E%3Cpath fill='#{vf-url-friendly-color($color)}' d='M16 0H0v16h16z'/%3E%3C/clipPath%3E%3C/defs%3E%3C/svg%3E");
1697
+ }
1698
+
1699
+ @mixin vf-icon-keyboard-off($color: $colors--light-theme--icon) {
1700
+ background-image: vf-icon-keyboard-off-url($color);
1701
+ }
1702
+
1703
+ @mixin vf-icon-keyboard-off-themed {
1704
+ @include vf-themed-icon($light-value: vf-icon-keyboard-off-url($colors--light-theme--icon), $dark-value: vf-icon-keyboard-off-url($colors--dark-theme--icon));
1705
+ }
1706
+
1707
+ // resize
1708
+ @function vf-icon-resize-url($color) {
1709
+ @return url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='none' viewBox='0 0 16 16'%3E%3Cpath fill='#{vf-url-friendly-color($color)}' d='M2.5 15H1v-1.5h1.5zM5.375 15h-1.75v-1.5h1.75zM8.875 15h-1.75v-1.5h1.75z'/%3E%3Cpath fill='#{vf-url-friendly-color($color)}' d='M5.75 2.5H3.56l9.94 9.94v-2.19H15V15h-4.75v-1.5h2.19L2.5 3.56v2.19H1V1h4.75zM2.5 12.375H1v-1.75h1.5z'/%3E%3Cpath fill='#{vf-url-friendly-color($color)}' d='M2.5 8.875H1v-1.75h1.5zM15 8.875h-1.5v-1.75H15zM15 5.375h-1.5v-1.75H15zM8.875 2.5h-1.75V1h1.75zM12.375 2.5h-1.75V1h1.75zM15 2.5h-1.5V1H15z'/%3E%3C/svg%3E");
1710
+ }
1711
+
1712
+ @mixin vf-icon-resize($color: $colors--light-theme--icon) {
1713
+ background-image: vf-icon-resize-url($color);
1714
+ }
1715
+
1716
+ @mixin vf-icon-resize-themed {
1717
+ @include vf-themed-icon($light-value: vf-icon-resize-url($colors--light-theme--icon), $dark-value: vf-icon-resize-url($colors--dark-theme--icon));
1718
+ }
1719
+
1720
+ // resize-off
1721
+ @function vf-icon-resize-off-url($color) {
1722
+ @return url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='none' viewBox='0 0 16 16'%3E%3Cg fill='#{vf-url-friendly-color($color)}' clip-path='url(%23a)'%3E%3Cpath d='m16.03 1.53-2.095 2.095H15v1.75h-1.5V4.061L9.31 8.25l4.19 4.19v-2.19H15V15h-4.75v-1.5h2.19L8.25 9.31 4.06 13.5h1.315V15h-1.75v-1.065L2.03 15.53.97 14.47l14-14z'/%3E%3Cpath d='M8.875 15h-1.75v-1.5h1.75zM2.5 10.94l-1.436 1.435H1v-1.75h1.5zM2.5 8.875H1v-1.75h1.5zM15 8.875h-1.5v-1.75H15zM5.75 2.5H3.56l3.69 3.69-1.06 1.06L2.5 3.56v2.19H1V1h4.75zM8.875 2.5h-1.75V1h1.75zM12.375 1.064 10.94 2.5h-.315V1h1.75z'/%3E%3C/g%3E%3Cdefs%3E%3CclipPath id='a'%3E%3Cpath fill='#{vf-url-friendly-color($color)}' d='M0 0h16v16H0z'/%3E%3C/clipPath%3E%3C/defs%3E%3C/svg%3E");
1723
+ }
1724
+
1725
+ @mixin vf-icon-resize-off($color: $colors--light-theme--icon) {
1726
+ background-image: vf-icon-resize-off-url($color);
1727
+ }
1728
+
1729
+ @mixin vf-icon-resize-off-themed {
1730
+ @include vf-themed-icon($light-value: vf-icon-resize-off-url($colors--light-theme--icon), $dark-value: vf-icon-resize-off-url($colors--dark-theme--icon));
1731
+ }
1732
+
1733
+ // rotate-left
1734
+ @function vf-icon-rotate-left-url($color) {
1735
+ @return url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='none' viewBox='0 0 16 16'%3E%3Cpath fill='#{vf-url-friendly-color($color)}' fill-rule='evenodd' d='M3.682 5.56a1.5 1.5 0 0 1 2.12 0l4.951 4.95a1.5 1.5 0 0 1 0 2.122l-2.121 2.12a1.5 1.5 0 0 1-2.008.103l-.113-.102-4.95-4.95a1.5 1.5 0 0 1 0-2.121zm-1.06 3.182 4.95 4.95 2.12-2.12-4.95-4.95z' clip-rule='evenodd'/%3E%3Cpath fill='#{vf-url-friendly-color($color)}' d='M10.03 1.53 8.81 2.75H10a4.75 4.75 0 0 1 4.75 4.75v2h-1.5v-2A3.25 3.25 0 0 0 10 4.25H8.81l1.22 1.22-1.06 1.06L5.94 3.5 8.97.47z'/%3E%3C/svg%3E");
1736
+ }
1737
+
1738
+ @mixin vf-icon-rotate-left($color: $colors--light-theme--icon) {
1739
+ background-image: vf-icon-rotate-left-url($color);
1740
+ }
1741
+
1742
+ @mixin vf-icon-rotate-left-themed {
1743
+ @include vf-themed-icon($light-value: vf-icon-rotate-left-url($colors--light-theme--icon), $dark-value: vf-icon-rotate-left-url($colors--dark-theme--icon));
1744
+ }
1745
+
1746
+ // rotate-right
1747
+ @function vf-icon-rotate-right-url($color) {
1748
+ @return url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='none' viewBox='0 0 16 16'%3E%3Cpath fill='#{vf-url-friendly-color($color)}' fill-rule='evenodd' d='M12.318 5.56a1.5 1.5 0 0 0-2.12 0l-4.951 4.95a1.5 1.5 0 0 0 0 2.122l2.121 2.12a1.5 1.5 0 0 0 2.008.103l.113-.102 4.95-4.95a1.5 1.5 0 0 0 0-2.121zm1.06 3.182-4.95 4.95-2.12-2.12 4.95-4.95z' clip-rule='evenodd'/%3E%3Cpath fill='#{vf-url-friendly-color($color)}' d='m5.97 1.53 1.22 1.22H6A4.75 4.75 0 0 0 1.25 7.5v2h1.5v-2A3.25 3.25 0 0 1 6 4.25h1.19L5.97 5.47l1.06 1.06 3.03-3.03L7.03.47z'/%3E%3C/svg%3E");
1749
+ }
1750
+
1751
+ @mixin vf-icon-rotate-right($color: $colors--light-theme--icon) {
1752
+ background-image: vf-icon-rotate-right-url($color);
1753
+ }
1754
+
1755
+ @mixin vf-icon-rotate-right-themed {
1756
+ @include vf-themed-icon($light-value: vf-icon-rotate-right-url($colors--light-theme--icon), $dark-value: vf-icon-rotate-right-url($colors--dark-theme--icon));
1757
+ }
1758
+
1759
+ // screen-record-start
1760
+ @function vf-icon-screen-record-start-url($color) {
1761
+ @return url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='none' viewBox='0 0 16 16'%3E%3Cpath fill='#{vf-url-friendly-color($color)}' d='M13.5 10.25v3.25h-3.25V15h3.25a1.5 1.5 0 0 0 1.5-1.5v-3.25zM1 13.5A1.5 1.5 0 0 0 2.5 15h3.25v-1.5H2.5v-3.25H1zM8 6a2 2 0 1 0 0 4 2 2 0 0 0 0-4'/%3E%3Cpath fill='#{vf-url-friendly-color($color)}' fill-rule='evenodd' d='M8 3.5a4.5 4.5 0 1 0 0 9 4.5 4.5 0 0 0 0-9M8 5a3 3 0 1 1 0 6 3 3 0 0 1 0-6' clip-rule='evenodd'/%3E%3Cpath fill='#{vf-url-friendly-color($color)}' d='M10.25 2.5h3.25v3.25H15V2.5A1.5 1.5 0 0 0 13.5 1h-3.25zM2.5 1A1.5 1.5 0 0 0 1 2.5v3.25h1.5V2.5h3.25V1z'/%3E%3C/svg%3E");
1762
+ }
1763
+
1764
+ @mixin vf-icon-screen-record-start($color: $colors--light-theme--icon) {
1765
+ background-image: vf-icon-screen-record-start-url($color);
1766
+ }
1767
+
1768
+ @mixin vf-icon-screen-record-start-themed {
1769
+ @include vf-themed-icon($light-value: vf-icon-screen-record-start-url($colors--light-theme--icon), $dark-value: vf-icon-screen-record-start-url($colors--dark-theme--icon));
1770
+ }
1771
+
1772
+ // screen-record-stop
1773
+ @function vf-icon-screen-record-stop-url($color) {
1774
+ @return url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='none' viewBox='0 0 16 16'%3E%3Cpath fill='#{vf-url-friendly-color($color)}' d='M13.5 13.5h-3.25V15h3.25a1.5 1.5 0 0 0 1.5-1.5v-3.25h-1.5zM1 13.5A1.5 1.5 0 0 0 2.5 15h3.25v-1.5H2.5v-3.25H1z'/%3E%3Cpath fill='#{vf-url-friendly-color($color)}' fill-rule='evenodd' d='M5.5 4A1.5 1.5 0 0 0 4 5.5v5a1.5 1.5 0 0 0 1.347 1.492L5.5 12h5a1.5 1.5 0 0 0 1.5-1.5v-5A1.5 1.5 0 0 0 10.5 4zm5 1.5v5h-5v-5z' clip-rule='evenodd'/%3E%3Cpath fill='#{vf-url-friendly-color($color)}' d='M10.25 2.5h3.25v3.25H15V2.5A1.5 1.5 0 0 0 13.5 1h-3.25zM2.5 1A1.5 1.5 0 0 0 1 2.5v3.25h1.5V2.5h3.25V1z'/%3E%3C/svg%3E");
1775
+ }
1776
+
1777
+ @mixin vf-icon-screen-record-stop($color: $colors--light-theme--icon) {
1778
+ background-image: vf-icon-screen-record-stop-url($color);
1779
+ }
1780
+
1781
+ @mixin vf-icon-screen-record-stop-themed {
1782
+ @include vf-themed-icon($light-value: vf-icon-screen-record-stop-url($colors--light-theme--icon), $dark-value: vf-icon-screen-record-stop-url($colors--dark-theme--icon));
1783
+ }
1784
+
1785
+ // screenshot
1786
+ @function vf-icon-screenshot-url($color) {
1787
+ @return url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='none' viewBox='0 0 16 16'%3E%3Cpath fill='#{vf-url-friendly-color($color)}' d='M13.5 10.25v3.25h-3.25V15h3.5c.69 0 1.25-.56 1.25-1.25v-3.5zM1 13.75c0 .69.56 1.25 1.25 1.25h3.5v-1.5H2.5v-3.25H1zM8 7a1 1 0 1 0 0 2 1 1 0 0 0 0-2'/%3E%3Cpath fill='#{vf-url-friendly-color($color)}' fill-rule='evenodd' d='M6.854 3.5a.88.88 0 0 0-.773.455L5.5 5H5a1.5 1.5 0 0 0-1.5 1.5V10A1.5 1.5 0 0 0 5 11.5h6a1.5 1.5 0 0 0 1.5-1.5V6.5A1.5 1.5 0 0 0 11 5h-.5l-.58-1.045a.89.89 0 0 0-.774-.455zm2.763 3H11V10H5V6.5h1.382L7.216 5h1.568z' clip-rule='evenodd'/%3E%3Cpath fill='#{vf-url-friendly-color($color)}' d='M10.25 2.5h3.25v3.25H15v-3.5C15 1.56 14.44 1 13.75 1h-3.5zM2.25 1C1.56 1 1 1.56 1 2.25v3.5h1.5V2.5h3.25V1z'/%3E%3C/svg%3E");
1788
+ }
1789
+
1790
+ @mixin vf-icon-screenshot($color: $colors--light-theme--icon) {
1791
+ background-image: vf-icon-screenshot-url($color);
1792
+ }
1793
+
1794
+ @mixin vf-icon-screenshot-themed {
1795
+ @include vf-themed-icon($light-value: vf-icon-screenshot-url($colors--light-theme--icon), $dark-value: vf-icon-screenshot-url($colors--dark-theme--icon));
1796
+ }
1797
+
1798
+ // volume-down
1799
+ @function vf-icon-volume-down-url($color) {
1800
+ @return url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='none' viewBox='0 0 16 16'%3E%3Cpath fill='#{vf-url-friendly-color($color)}' fill-rule='evenodd' d='M6.342 2.451C6.988 1.886 8 2.345 8 3.204v9.592c0 .859-1.012 1.318-1.658.753l-2.913-2.55H1.5A1.5 1.5 0 0 1 0 9.5v-3A1.5 1.5 0 0 1 1.5 5h1.929zM3.992 6.5H1.5v3h2.492L6.5 11.694v-7.39z' clip-rule='evenodd'/%3E%3Cpath fill='#{vf-url-friendly-color($color)}' d='M16 8.75h-6v-1.5h6z'/%3E%3C/svg%3E");
1801
+ }
1802
+
1803
+ @mixin vf-icon-volume-down($color: $colors--light-theme--icon) {
1804
+ background-image: vf-icon-volume-down-url($color);
1805
+ }
1806
+
1807
+ @mixin vf-icon-volume-down-themed {
1808
+ @include vf-themed-icon($light-value: vf-icon-volume-down-url($colors--light-theme--icon), $dark-value: vf-icon-volume-down-url($colors--dark-theme--icon));
1809
+ }
1810
+
1811
+ // volume-up
1812
+ @function vf-icon-volume-up-url($color) {
1813
+ @return url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='none' viewBox='0 0 16 16'%3E%3Cpath fill='#{vf-url-friendly-color($color)}' fill-rule='evenodd' d='M6.342 2.451C6.988 1.886 8 2.345 8 3.204v9.592c0 .859-1.012 1.318-1.658.753l-2.913-2.55H1.5A1.5 1.5 0 0 1 0 9.5v-3A1.5 1.5 0 0 1 1.5 5h1.929zM3.992 6.5H1.5v3h2.492L6.5 11.694v-7.39z' clip-rule='evenodd'/%3E%3Cpath fill='#{vf-url-friendly-color($color)}' d='M13.745 7.25H16v1.5h-2.255v2.255h-1.5V8.75H10v-1.5h2.245V5.005h1.5z'/%3E%3C/svg%3E");
1814
+ }
1815
+
1816
+ @mixin vf-icon-volume-up($color: $colors--light-theme--icon) {
1817
+ background-image: vf-icon-volume-up-url($color);
1818
+ }
1819
+
1820
+ @mixin vf-icon-volume-up-themed {
1821
+ @include vf-themed-icon($light-value: vf-icon-volume-up-url($colors--light-theme--icon), $dark-value: vf-icon-volume-up-url($colors--dark-theme--icon));
1822
+ }
@@ -4,15 +4,15 @@
4
4
  Content card:
5
5
  .p-content-card:
6
6
  Main element of the content card component.
7
- "&.p-content-card--2-cols":
7
+ "&.p-content-card--cols-2":
8
8
  Modifier for a 2-column width vertical layout. Applied ONLY to the parent .p-content-card.
9
- "&.p-content-card--4-cols":
9
+ "&.p-content-card--cols-4":
10
10
  Modifier for a 4-column width horizontal layout. Applied ONLY to the parent .p-content-card.
11
- "&.p-content-card--6-cols":
11
+ "&.p-content-card--cols-6":
12
12
  Modifier for a 6-column width horizontal layout. Applied ONLY to the parent .p-content-card.
13
- "&.p-content-card__has-image":
13
+ "&.has-image":
14
14
  State class applied to the parent when the card includes an image.
15
- "&.p-content-card__has-desc":
15
+ "&.has-desc":
16
16
  State class applied to the parent when the card includes a description that appears on hover.
17
17
  Links:
18
18
  .p-content-card__overlay-link:
@@ -54,72 +54,170 @@
54
54
 
55
55
  @import 'settings';
56
56
 
57
+ // =========================================
58
+ // CONTENT CARD VARIABLES
59
+ // =========================================
60
+ $card-height-vertical: 23.75rem; // 380px
61
+ $card-height-default: 12rem; // 192px
62
+
63
+ $card-image-width: 17.75rem; // 284px
64
+ // Horizontal image heights are explicit to preserve the tuned text/image balance at each breakpoint
65
+ $card-image-height-horizontal: 9.703125rem; // 155.25px
66
+ $card-image-height-horizontal-large: 9.984375rem; // 159.75px
67
+
68
+ // Horizontal card heights are image height plus vertical spacing budget.
69
+ $card-height-horizontal: $card-image-height-horizontal + $sp-x-large;
70
+ $card-height-horizontal-large: $card-image-height-horizontal-large + $sp-x-large;
71
+
72
+ $card-footer-outer-height: $sp-x-large + ($sp-small * 0.5);
73
+ $card-footer-inner-height: $sp-x-large - ($sp-small * 0.5);
74
+
75
+ $card-nudge-negative: map-get($settings-text-h4, nudge);
76
+ $card-chip-margin-right: 1.5625rem; // 25px
77
+ $card-author-padding-bottom: $sp-small;
78
+
79
+ $card-fallback-spacing-large: $sp-x-large;
80
+ $card-fallback-image-gap: $sp-small + $sp-xx-small;
81
+
82
+ @mixin mq-min($breakpoint) {
83
+ @media screen and (width >= $breakpoint) {
84
+ @content;
85
+ }
86
+ }
87
+
88
+ @mixin mq-max($breakpoint) {
89
+ @media screen and (width < $breakpoint) {
90
+ @content;
91
+ }
92
+ }
93
+
94
+ @mixin mq-between($min, $max) {
95
+ @media screen and ($min <= width < $max) {
96
+ @content;
97
+ }
98
+ }
99
+
57
100
  @mixin vf-p-content-card {
101
+ /* =========================================
102
+ GRID WRAPPER
103
+ (Handles spanning and invisible bottom spacing)
104
+ ========================================= */
105
+ .p-content-card-wrapper {
106
+ display: flex;
107
+ flex-direction: column;
108
+ height: 100%;
109
+ padding-bottom: var(--spacing-vertical-large, $card-fallback-spacing-large);
110
+ width: 100%;
111
+
112
+ /* 2-Column Spanning */
113
+ &--2 {
114
+ grid-column: 1 / -1; /* Mobile */
115
+ @include mq-between($breakpoint-small, $breakpoint-large) {
116
+ grid-column: span 2; /* Medium */
117
+ }
118
+ @include mq-min($breakpoint-large) {
119
+ grid-column: span 2; /* Desktop */
120
+ }
121
+ }
122
+
123
+ /* 4-Column Spanning */
124
+ &--4 {
125
+ grid-column: 1 / -1;
126
+ @include mq-min($breakpoint-large) {
127
+ grid-column: span 4;
128
+ }
129
+ }
130
+
131
+ /* 6-Column Spanning */
132
+ &--6 {
133
+ grid-column: 1 / -1;
134
+ @include mq-min($breakpoint-large) {
135
+ grid-column: span 6;
136
+ }
137
+ }
138
+ }
139
+
140
+ /* =========================================
141
+ CARD COMPONENT
142
+ ========================================= */
58
143
  .p-content-card {
59
144
  align-items: flex-start;
60
145
  border: 1px solid var(--color-border-low-contrast, rgba(0, 0, 0, 0.1));
61
146
  display: flex;
147
+ flex: 1;
62
148
  flex-direction: column;
63
- height: 23.75rem; /* 380px */
149
+ height: 100%;
64
150
  justify-content: space-between;
151
+ max-width: 100%;
152
+
153
+ min-height: $card-height-vertical;
65
154
  overflow: hidden;
66
155
  padding-top: var(--spacing-vertical-large, $sp-medium);
67
156
  position: relative;
68
157
  text-decoration: none !important;
69
158
  transition: all 0.4s ease-in-out;
70
- width: var(--size-width-grid-col-2, 17.75rem); /* 284px */
159
+ width: 100%;
71
160
 
72
- @media screen and (width >= $breakpoint-small) {
73
- &.p-content-card--4-cols,
74
- &.p-content-card--6-cols {
75
- align-items: flex-start;
76
- align-self: stretch;
77
- flex-direction: row;
78
- gap: $sp-medium; /* 16px */
79
- height: 11.703125rem; /* 187.25px */
80
- padding: $sp-medium $sp-medium 0;
81
- width: var(--size-width-grid-col-4, 37.5rem); /* 600px */
82
- }
161
+ &:not(.has-image) {
162
+ height: $card-height-default;
163
+ min-height: $card-height-default;
164
+ }
83
165
 
84
- &.p-content-card--4-cols:not(.has-image),
85
- &.p-content-card--6-cols:not(.has-image) {
86
- height: 12rem; /* 192px - Fixed height */
166
+ /* Shrink-to-fit for cards without footers on mobile */
167
+ @include mq-max($breakpoint-small) {
168
+ &:not(:has(.p-content-card__footer-outer)) {
169
+ height: auto;
170
+ min-height: 0;
171
+ padding-bottom: var(--spacing-vertical-large, $sp-medium); /* Keeps spacing balanced */
87
172
  }
173
+ }
88
174
 
89
- &.p-content-card--4-cols:not(.has-image) .p-rule--muted,
90
- &.p-content-card--6-cols:not(.has-image) .p-rule--muted {
91
- margin-left: -$sp-medium;
92
- margin-right: -$sp-medium;
93
- width: calc(100% + $sp-large); /* 32px */
175
+ /* 2-Column Modifier Internal Resets */
176
+ &.p-content-card--cols-2 {
177
+ @include mq-between($breakpoint-small, $breakpoint-large) {
178
+ .p-content-card__author-and-date {
179
+ display: none !important;
180
+ }
94
181
  }
95
182
  }
96
183
 
97
- @media screen and ($breakpoint-small <= width < $breakpoint-large) {
98
- &.p-content-card--2-cols {
184
+ /* 4 and 6 Column Horizontal Cards (Medium/Large Screens) */
185
+ @include mq-min($breakpoint-small) {
186
+ &.p-content-card--cols-4,
187
+ &.p-content-card--cols-6 {
99
188
  align-items: flex-start;
100
189
  align-self: stretch;
190
+
191
+ flex: 0 0 auto;
101
192
  flex-direction: row;
102
- gap: $sp-medium; /* 16px */
103
- height: 11.703125rem; /* 187.25px */
193
+ gap: $sp-medium;
194
+ height: $card-height-horizontal;
195
+
196
+ max-width: 100%;
197
+ min-height: $card-height-horizontal;
104
198
  padding: $sp-medium $sp-medium 0;
105
- width: var(--size-width-grid-col-4, 37.5rem); /* 600px */
106
199
  }
107
200
 
108
- &.p-content-card--2-cols:not(.has-image) {
109
- height: 10rem; /* 160px - Fixed height */
201
+ &.p-content-card--cols-4:not(.has-image),
202
+ &.p-content-card--cols-6:not(.has-image) {
203
+ height: $card-height-default;
204
+ min-height: $card-height-default;
110
205
  }
111
206
 
112
- &.p-content-card--2-cols:not(.has-image) .p-rule--muted {
207
+ &.p-content-card--cols-4:not(.has-image) .p-rule--muted,
208
+ &.p-content-card--cols-6:not(.has-image) .p-rule--muted {
113
209
  margin-left: -$sp-medium;
114
210
  margin-right: -$sp-medium;
115
- width: calc(100% + $sp-large); /* 32px */
211
+ max-width: none;
212
+ width: calc(100% + (#{$sp-medium} * 2));
116
213
  }
117
214
  }
118
215
 
119
- @media screen and (width >= $breakpoint-large) {
120
- &.p-content-card--6-cols {
121
- height: 11.984375rem; /* 191.75px */
122
- width: var(--size-width-grid-col-6, 57.25rem); /* 916px */
216
+ @include mq-min($breakpoint-large) {
217
+ &.p-content-card--cols-6 {
218
+ height: $card-height-horizontal-large;
219
+ max-width: 100%;
220
+ min-height: $card-height-horizontal-large;
123
221
  }
124
222
  }
125
223
 
@@ -139,6 +237,11 @@
139
237
  overflow: hidden;
140
238
  text-decoration: none !important;
141
239
 
240
+ .p-content-card--cols-6 & {
241
+ -webkit-line-clamp: 2;
242
+ line-clamp: 2;
243
+ }
244
+
142
245
  &:hover,
143
246
  &:focus,
144
247
  &:active,
@@ -174,9 +277,15 @@
174
277
  text-wrap: wrap;
175
278
  width: 100%;
176
279
 
177
- @media screen and (width >= $breakpoint-large) {
178
- .p-content-card--6-cols & {
179
- margin-top: -0.45rem !important;
280
+ .p-content-card--cols-6 & {
281
+ -webkit-line-clamp: 2;
282
+ line-clamp: 2;
283
+ max-height: 3em;
284
+ }
285
+
286
+ @include mq-min($breakpoint-large) {
287
+ .p-content-card--cols-6 & {
288
+ margin-top: $card-nudge-negative !important;
180
289
  }
181
290
  }
182
291
  }
@@ -198,16 +307,11 @@
198
307
  grid-template-columns: 1fr;
199
308
  grid-template-rows: 1fr;
200
309
  overflow: hidden;
201
- padding: 0 $sp-medium; /* 16px */
310
+ padding: 0 $sp-medium;
202
311
 
203
- @media screen and (width >= $breakpoint-small) {
204
- .p-content-card--4-cols &,
205
- .p-content-card--6-cols & {
206
- padding: 0;
207
- }
208
- }
209
- @media screen and ($breakpoint-small <= width < $breakpoint-large) {
210
- .p-content-card--2-cols & {
312
+ @include mq-min($breakpoint-small) {
313
+ .p-content-card--cols-4 &,
314
+ .p-content-card--cols-6 & {
211
315
  padding: 0;
212
316
  }
213
317
  }
@@ -241,30 +345,37 @@
241
345
  margin: 0;
242
346
  overflow: hidden;
243
347
 
244
- @media screen and (width >= $breakpoint-large) {
245
- .p-content-card--6-cols & {
246
- margin-top: -0.45rem !important;
348
+ .p-content-card--cols-6 & {
349
+ -webkit-line-clamp: 2;
350
+ line-clamp: 2;
351
+ }
352
+
353
+ @include mq-min($breakpoint-large) {
354
+ .p-content-card--cols-6 & {
355
+ margin-top: $card-nudge-negative !important;
247
356
  }
248
357
  }
249
358
  }
250
359
 
360
+ &__footer-container {
361
+ /* Structural grouping element.
362
+ Because the parent (.p-content-card__content) uses flexbox space-between,
363
+ this wrapper prevents the <hr> from floating awkwardly in the middle of the card.
364
+ */
365
+ }
366
+
251
367
  &__footer-outer {
252
368
  align-items: center;
253
369
  align-self: stretch;
254
370
  display: flex;
255
- height: 2.25rem; /* Fixed height: 36px */
371
+ height: $card-footer-outer-height;
256
372
  overflow: hidden;
257
373
  padding: 0 $sp-medium var(--spacing-vertical-small, $sp-small) $sp-medium;
258
374
  position: relative;
259
375
 
260
- @media screen and (width >= $breakpoint-small) {
261
- .p-content-card--4-cols &,
262
- .p-content-card--6-cols & {
263
- padding: 0 0 var(--spacing-vertical-small, $sp-small) 0;
264
- }
265
- }
266
- @media screen and ($breakpoint-small <= width < $breakpoint-large) {
267
- .p-content-card--2-cols & {
376
+ @include mq-min($breakpoint-small) {
377
+ .p-content-card--cols-4 &,
378
+ .p-content-card--cols-6 & {
268
379
  padding: 0 0 var(--spacing-vertical-small, $sp-small) 0;
269
380
  }
270
381
  }
@@ -273,8 +384,8 @@
273
384
  &__footer-inner {
274
385
  align-items: center;
275
386
  display: flex;
276
- gap: $sp-small; /* 8px */
277
- height: 1.75rem; /* 28px */
387
+ gap: $sp-small;
388
+ height: $card-footer-inner-height;
278
389
  mask-image: linear-gradient(to right, black 85%, transparent 100%);
279
390
  -ms-overflow-style: none;
280
391
  overflow-x: auto;
@@ -294,14 +405,14 @@
294
405
  }
295
406
 
296
407
  .p-chip--information {
297
- margin: 0 1.5625rem 0 0; /* 25px -> 1.5625rem */
408
+ margin: 0 $card-chip-margin-right 0 0;
298
409
  vertical-align: baseline;
299
410
  }
300
411
 
301
412
  .u-has-icon {
302
413
  align-items: center;
303
414
  display: flex;
304
- gap: $sp-x-small; /* 4px */
415
+ gap: $sp-x-small;
305
416
 
306
417
  .p-content-card__icon[class*='p-icon--'],
307
418
  .p-content-card__small {
@@ -318,24 +429,20 @@
318
429
  aspect-ratio: 16/9;
319
430
  display: block;
320
431
  flex-shrink: 0;
321
- height: 9.984375rem; /* 159.75px */
432
+ height: auto;
322
433
  object-fit: cover;
434
+ width: 100%;
323
435
 
324
- @media screen and (width >= $breakpoint-small) {
325
- .p-content-card--4-cols &,
326
- .p-content-card--6-cols & {
327
- height: 9.703125rem; /* 155.25px */
328
- }
329
- }
330
- @media screen and ($breakpoint-small <= width < $breakpoint-large) {
331
- .p-content-card--2-cols & {
332
- height: 9.703125rem; /* 155.25px */
436
+ @include mq-min($breakpoint-small) {
437
+ .p-content-card--cols-4 &,
438
+ .p-content-card--cols-6 & {
439
+ height: $card-image-height-horizontal;
333
440
  }
334
441
  }
335
442
 
336
- @media screen and (width >= $breakpoint-large) {
337
- .p-content-card--6-cols & {
338
- height: 9.984375rem; /* 159.75px */
443
+ @include mq-min($breakpoint-large) {
444
+ .p-content-card--cols-6 & {
445
+ height: $card-image-height-horizontal-large;
339
446
  }
340
447
  }
341
448
  }
@@ -344,21 +451,18 @@
344
451
  align-items: flex-start;
345
452
  display: flex;
346
453
  flex-direction: column;
347
- gap: var(--spacing-vertical-image-container, 0.625rem); /* 10px -> 0.625rem */
454
+ gap: var(--spacing-vertical-image-container, $card-fallback-image-gap);
455
+ max-width: 100%;
348
456
  padding-bottom: var(--spacing-vertical-large, $sp-medium);
349
- width: 17.75rem; /* 284px */
350
457
 
351
- @media screen and (width >= $breakpoint-small) {
352
- .p-content-card--4-cols &,
353
- .p-content-card--6-cols & {
354
- align-self: stretch;
355
- flex: 0 0 auto;
356
- }
357
- }
358
- @media screen and ($breakpoint-small <= width < $breakpoint-large) {
359
- .p-content-card--2-cols & {
458
+ width: 100%;
459
+
460
+ @include mq-min($breakpoint-small) {
461
+ .p-content-card--cols-4 &,
462
+ .p-content-card--cols-6 & {
360
463
  align-self: stretch;
361
464
  flex: 0 0 auto;
465
+ width: $card-image-width;
362
466
  }
363
467
  }
364
468
  }
@@ -367,61 +471,59 @@
367
471
  align-items: flex-start;
368
472
  align-self: stretch;
369
473
  display: flex;
474
+ padding-bottom: $card-author-padding-bottom;
370
475
 
371
476
  > :first-child {
372
477
  margin-bottom: 0 !important;
373
478
  }
374
479
 
375
- @media screen and ($breakpoint-small <= width < $breakpoint-large) {
376
- .p-content-card--2-cols &,
377
- .p-content-card--6-cols & {
480
+ @include mq-between($breakpoint-small, $breakpoint-large) {
481
+ .p-content-card--cols-6 & {
378
482
  display: none;
379
483
  }
380
484
  }
381
485
 
382
- @media screen and (width >= $breakpoint-large) {
383
- .p-content-card--6-cols & {
486
+ @include mq-min($breakpoint-large) {
487
+ .p-content-card--cols-6 & {
384
488
  display: flex;
385
- margin-top: -0.45rem;
386
489
  }
387
490
  }
388
491
  }
389
492
 
390
- &:not(.has-image) {
391
- height: 12.25rem;
392
- }
393
-
394
493
  &.has-image {
395
494
  padding-top: 0;
396
495
 
397
- @media screen and (width >= $breakpoint-small) {
398
- &.p-content-card--4-cols,
399
- &.p-content-card--6-cols {
400
- padding-top: $sp-medium; /* 16px */
496
+ @include mq-min($breakpoint-small) {
497
+ &.p-content-card--cols-4,
498
+ &.p-content-card--cols-6 {
499
+ padding-top: $sp-medium;
401
500
  }
402
501
  }
403
502
  }
404
503
 
405
- &:has(.p-content-card__main-link:focus-visible) {
406
- outline: 3px solid var(--color-focus, #0066cc);
407
- outline-offset: 2px;
408
- }
409
-
410
504
  &:hover,
411
505
  &:focus-within {
412
506
  border-color: var(--color-border-high-contrast, #707070);
413
507
  text-decoration: none;
508
+ }
414
509
 
415
- &.has-desc {
416
- .p-content-card__primary-content {
417
- opacity: 0;
418
- transform: translateY(-150px);
419
- }
420
- .p-content-card__hover-content {
421
- opacity: 1;
422
- transform: translateY(0);
423
- }
510
+ @include mq-min($breakpoint-large) {
511
+ &.has-desc:hover .p-content-card__primary-content,
512
+ &.has-desc:focus-within .p-content-card__primary-content {
513
+ opacity: 0;
514
+ transform: translateY(-150px);
515
+ }
516
+
517
+ &.has-desc:hover .p-content-card__hover-content,
518
+ &.has-desc:focus-within .p-content-card__hover-content {
519
+ opacity: 1;
520
+ transform: translateY(0);
424
521
  }
425
522
  }
523
+
524
+ &:has(.p-content-card__main-link:focus-visible) {
525
+ outline: 3px solid var(--color-focus, #0066cc);
526
+ outline-offset: 2px;
527
+ }
426
528
  }
427
529
  }
@@ -2100,4 +2100,97 @@
2100
2100
  }
2101
2101
  }
2102
2102
 
2103
- // **Base and Pattern mixins accurate as of March 2026**
2103
+ // ICONS ADDED IN APRIL 2026
2104
+
2105
+ @mixin vf-p-icon-devtools {
2106
+ .p-icon--devtools {
2107
+ @extend %icon;
2108
+ @include vf-icon-devtools-themed;
2109
+ }
2110
+ }
2111
+
2112
+ @mixin vf-p-icon-devtools-off {
2113
+ .p-icon--devtools-off {
2114
+ @extend %icon;
2115
+ @include vf-icon-devtools-off-themed;
2116
+ }
2117
+ }
2118
+
2119
+ @mixin vf-p-icon-keyboard {
2120
+ .p-icon--keyboard {
2121
+ @extend %icon;
2122
+ @include vf-icon-keyboard-themed;
2123
+ }
2124
+ }
2125
+
2126
+ @mixin vf-p-icon-keyboard-off {
2127
+ .p-icon--keyboard-off {
2128
+ @extend %icon;
2129
+ @include vf-icon-keyboard-off-themed;
2130
+ }
2131
+ }
2132
+
2133
+ @mixin vf-p-icon-resize {
2134
+ .p-icon--resize {
2135
+ @extend %icon;
2136
+ @include vf-icon-resize-themed;
2137
+ }
2138
+ }
2139
+
2140
+ @mixin vf-p-icon-resize-off {
2141
+ .p-icon--resize-off {
2142
+ @extend %icon;
2143
+ @include vf-icon-resize-off-themed;
2144
+ }
2145
+ }
2146
+
2147
+ @mixin vf-p-icon-rotate-left {
2148
+ .p-icon--rotate-left {
2149
+ @extend %icon;
2150
+ @include vf-icon-rotate-left-themed;
2151
+ }
2152
+ }
2153
+
2154
+ @mixin vf-p-icon-rotate-right {
2155
+ .p-icon--rotate-right {
2156
+ @extend %icon;
2157
+ @include vf-icon-rotate-right-themed;
2158
+ }
2159
+ }
2160
+
2161
+ @mixin vf-p-icon-screen-record-start {
2162
+ .p-icon--screen-record-start {
2163
+ @extend %icon;
2164
+ @include vf-icon-screen-record-start-themed;
2165
+ }
2166
+ }
2167
+
2168
+ @mixin vf-p-icon-screen-record-stop {
2169
+ .p-icon--screen-record-stop {
2170
+ @extend %icon;
2171
+ @include vf-icon-screen-record-stop-themed;
2172
+ }
2173
+ }
2174
+
2175
+ @mixin vf-p-icon-screenshot {
2176
+ .p-icon--screenshot {
2177
+ @extend %icon;
2178
+ @include vf-icon-screenshot-themed;
2179
+ }
2180
+ }
2181
+
2182
+ @mixin vf-p-icon-volume-down {
2183
+ .p-icon--volume-down {
2184
+ @extend %icon;
2185
+ @include vf-icon-volume-down-themed;
2186
+ }
2187
+ }
2188
+
2189
+ @mixin vf-p-icon-volume-up {
2190
+ .p-icon--volume-up {
2191
+ @extend %icon;
2192
+ @include vf-icon-volume-up-themed;
2193
+ }
2194
+ }
2195
+
2196
+ // **Base and Pattern mixins accurate as of April 2026**
@@ -22,80 +22,77 @@
22
22
 
23
23
  {%- macro vf_card(columns="2", link=None, heading=None, image=None, author=None, date=None, footer=None, description=None) -%}
24
24
 
25
- {%- set layout = 'p-content-card--' ~ columns ~ '-cols' -%}
25
+ {%- set col_str = columns | string -%}
26
+ {%- set layout = 'p-content-card--cols-' ~ col_str -%}
26
27
  {%- set img_class = 'has-image' if image else '' -%}
27
28
  {%- set has_desc = 'has-desc' if description else '' -%}
28
29
 
29
- <div class="p-content-card {{ layout }} {{ img_class }} {{ has_desc }}">
30
-
31
- {%- if link -%}
32
- <a href="{{ link }}" class="p-content-card__overlay-link" tabindex="-1" aria-hidden="true"></a>
33
- {%- endif -%}
30
+ <div class="p-content-card-wrapper p-content-card-wrapper--{{ col_str }}">
31
+
32
+ <div class="p-content-card {{ layout }} {{ img_class }} {{ has_desc }}">
33
+
34
+ {%- if link -%}
35
+ <a href="{{ link }}" class="p-content-card__overlay-link" tabindex="-1" aria-hidden="true"></a>
36
+ {%- endif -%}
34
37
 
35
- {%- if image -%}
36
- <div class="p-content-card__image-wrapper">
37
- <img class="p-content-card__image" src="{{ image.src }}" alt="{{ image.alt }}" />
38
- </div>
39
- {%- endif -%}
38
+ {%- if image -%}
39
+ <div class="p-content-card__image-wrapper">
40
+ <img class="p-content-card__image" src="{{ image.src }}" alt="{{ image.alt }}" />
41
+ </div>
42
+ {%- endif -%}
40
43
 
41
- <div class="p-content-card__content">
42
- <div class="p-content-card__body">
43
-
44
- <div class="p-content-card__primary-content">
45
- <h4 class="p-content-card__heading">
46
- {%- if link -%}
47
- <a href="{{ link }}" class="p-content-card__main-link">{{ heading }}</a>
48
- {%- else -%}
49
- {{ heading }}
50
- {%- endif -%}
51
- </h4>
44
+ <div class="p-content-card__content">
45
+ <div class="p-content-card__body">
52
46
 
53
- {%- if image and (author or date) -%}
54
- <div class="p-content-card__author-and-date u-sv-3">
55
- <small>
56
- {%- if author -%}
57
- <span class="u-text--muted">{{ author }}</span>
58
- {%- endif -%}
59
-
60
- {%- if author and date -%}
61
- &middot;
62
- {%- endif -%}
63
-
64
- {%- if date -%}
65
- <span class="u-text--muted">{{ date }}</span>
47
+ <div class="p-content-card__primary-content">
48
+ <h4 class="p-content-card__heading">
49
+ {%- if link -%}
50
+ <a href="{{ link }}" class="p-content-card__main-link">{{ heading }}</a>
51
+ {%- else -%}
52
+ {{ heading }}
66
53
  {%- endif -%}
67
- </small>
54
+ </h4>
55
+
56
+ {%- if image and (author or date) -%}
57
+ <div class="p-content-card__author-and-date u-sv-3">
58
+ <small>
59
+ {%- set items = [] -%}
60
+ {%- if author -%}{%- set _ = items.append('<span class="u-text--muted">' ~ author ~ '</span>') -%}{%- endif -%}
61
+ {%- if date -%}{%- set _ = items.append('<span class="u-text--muted">' ~ date ~ '</span>') -%}{%- endif -%}
62
+ {{ items | join('&nbsp;&middot;&nbsp;') | safe }}
63
+ </small>
64
+ </div>
65
+ {%- endif -%}
66
+ </div>
67
+
68
+ {%- if description -%}
69
+ <div class="p-content-card__hover-content">
70
+ <p class="p-content-card__description">{{ description }}</p>
68
71
  </div>
69
72
  {%- endif -%}
70
- </div>
71
73
 
72
- {%- if description -%}
73
- <div class="p-content-card__hover-content">
74
- <p class="p-content-card__description">{{ description }}</p>
75
74
  </div>
76
- {%- endif -%}
77
-
78
- </div>
79
-
80
- {%- if footer -%}
81
- <div>
82
- <hr class="p-rule--muted">
83
- <div class="p-content-card__footer-outer">
84
- <div class="p-content-card__footer-inner" tabindex="-1">
85
- {%- if footer.resource_type -%}
86
- <span class="u-has-icon">
87
- <i class="p-content-card__icon p-icon--{{ footer.resource_type.icon }}"></i>
88
- <small class="p-content-card__small">{{ footer.resource_type.text }}</small>
89
- </span>
90
- {%- endif -%}
75
+
76
+ {%- if footer -%}
77
+ <div class="p-content-card__footer-container">
78
+ <hr class="p-rule--muted">
79
+ <div class="p-content-card__footer-outer">
80
+ <div class="p-content-card__footer-inner" tabindex="-1">
81
+ {%- if footer.resource_type -%}
82
+ <span class="u-has-icon">
83
+ <i class="p-content-card__icon p-icon--{{ footer.resource_type.icon }}"></i>
84
+ <small class="p-content-card__small">{{ footer.resource_type.text }}</small>
85
+ </span>
86
+ {%- endif -%}
91
87
 
92
- {%- if footer.content_type %}
93
- <span class="p-chip--information is-readonly">{{ footer.content_type}}</span>
94
- {%- endif -%}
88
+ {%- if footer.content_type %}
89
+ <span class="p-chip--information is-readonly">{{ footer.content_type }}</span>
90
+ {%- endif -%}
91
+ </div>
95
92
  </div>
96
93
  </div>
94
+ {%- endif -%}
97
95
  </div>
98
- {%- endif -%}
99
96
  </div>
100
97
  </div>
101
98
  {%- endmacro -%}