@morphemecms/cms 0.7.0 → 0.8.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 (72) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/defaults/collections.ts +56 -0
  3. package/defaults/company.ts +13 -4
  4. package/defaults/texts.ts +17 -0
  5. package/icons/lucide/LICENSE-phosphor +21 -0
  6. package/icons/lucide/facebook-logo.svg +1 -0
  7. package/icons/lucide/linkedin-logo.svg +1 -0
  8. package/icons/lucide/pack.json +16 -1
  9. package/icons/lucide/pinterest-logo.svg +1 -0
  10. package/icons/lucide/x-logo.svg +1 -0
  11. package/icons/material-symbols/LICENSE-phosphor +21 -0
  12. package/icons/material-symbols/facebook-logo.svg +1 -0
  13. package/icons/material-symbols/linkedin-logo.svg +1 -0
  14. package/icons/material-symbols/pack.json +15 -0
  15. package/icons/material-symbols/pinterest-logo.svg +1 -0
  16. package/icons/material-symbols/x-logo.svg +1 -0
  17. package/icons/phosphor/facebook-logo.svg +1 -0
  18. package/icons/phosphor/linkedin-logo.svg +1 -0
  19. package/icons/phosphor/pinterest-logo.svg +1 -0
  20. package/icons/phosphor/x-logo.svg +1 -0
  21. package/lib/lead.d.mts +5 -0
  22. package/lib/lead.mjs +10 -0
  23. package/lib/lead.test.mjs +65 -0
  24. package/lib/licenses.mjs +1 -1
  25. package/package.json +2 -1
  26. package/scripts/icon-packs.mjs +51 -13
  27. package/scripts/material-fallback.test.mjs +49 -0
  28. package/site/icons.d.mts +13 -0
  29. package/site/icons.mjs +25 -3
  30. package/site/materialSymbols.d.mts +8 -2
  31. package/site/materialSymbols.mjs +27 -11
  32. package/site/materialSymbols.test.mjs +44 -0
  33. package/site/schema.ts +2 -0
  34. package/site/site.ts +9 -2
  35. package/site/social.d.mts +37 -0
  36. package/site/social.mjs +92 -0
  37. package/site/social.test.mjs +80 -0
  38. package/site/theme.d.mts +2 -0
  39. package/site/theme.mjs +28 -11
  40. package/site/themeImport.test.mjs +40 -0
  41. package/src/EntryForm.tsx +21 -58
  42. package/src/FormFrame.tsx +5 -5
  43. package/src/Parts.tsx +8 -30
  44. package/src/Screen.tsx +12 -5
  45. package/src/editor.css +70 -5
  46. package/src/i18n/da-DK/parts.ts +1 -1
  47. package/src/i18n/da-DK/theme.ts +4 -0
  48. package/src/i18n/en-US/parts.ts +1 -1
  49. package/src/i18n/en-US/theme.ts +4 -0
  50. package/src/icon.tsx +1 -1
  51. package/src/materialIcons.ts +5 -7
  52. package/src/pagePreview.tsx +21 -1
  53. package/src/postLead.d.mts +7 -0
  54. package/src/postLead.mjs +9 -0
  55. package/src/postLead.test.mjs +28 -0
  56. package/src/ui.tsx +41 -96
  57. package/src/virtual.d.ts +5 -0
  58. package/starter/package.json +1 -1
  59. package/starter/src/data/social.json +14 -0
  60. package/theme/components/PostAuthor.astro +20 -0
  61. package/theme/components/PostCard.tsx +26 -0
  62. package/theme/components/PostHeader.astro +36 -0
  63. package/theme/components/PostMeta.tsx +27 -2
  64. package/theme/components/RelatedPosts.astro +29 -0
  65. package/theme/components/ShareRow.astro +48 -0
  66. package/theme/layouts/PostLayout.astro +28 -54
  67. package/theme/styles/base.css +164 -127
  68. package/theme/styles/blocks.css +160 -155
  69. package/theme/styles/components.css +43 -34
  70. package/theme/styles/global.css +316 -303
  71. package/theme/styles/ui.css +43 -34
  72. package/theme/ui/copyLink.script.ts +17 -0
@@ -3,6 +3,9 @@
3
3
  @import '@fontsource-variable/roboto';
4
4
 
5
5
  /*
6
+ Material is every theme's fallback: its rules that set more than custom properties sit in @layer fallback (declared last in
7
+ base.css), so a theme's own unlayered rules win over them, whatever the specificity. Custom properties stay unlayered.
8
+
6
9
  The standard theme's look, Material: the site in Material Design 3 (m3.material.io). Roboto and the M3 type scale (regular headlines,
7
10
  medium titles and labels), the M3 shapes (below), tonal surfaces instead of lines, the M3 elevation levels and its emphasized easing; buttons
8
11
  as wide as their label (filled and tonal) and lists in segments. The theme's own parts (the top app bar, the
@@ -971,134 +974,136 @@
971
974
  }
972
975
  }
973
976
 
974
- /* Long text: pictures with large corners. */
975
- .prose :where(img):not(:where(.not-prose img)),
976
- .picture-crop,
977
- .prose :where(iframe) {
978
- border-radius: var(--md-shape-large);
979
- }
977
+ @layer fallback {
978
+ /* Long text: pictures with large corners. */
979
+ .prose :where(img):not(:where(.not-prose img)),
980
+ .picture-crop,
981
+ .prose :where(iframe) {
982
+ border-radius: var(--md-shape-large);
983
+ }
980
984
 
981
- /* The mark before the name on a testimonial without a picture: an avatar, a circle in the highest surface container
985
+ /* The mark before the name on a testimonial without a picture: an avatar, a circle in the highest surface container
982
986
  (it stands on a container) with the name's first letter (data-initial, Testimonial.tsx), as Material's avatars
983
987
  without a picture, not the standard theme's dot. */
984
- .block-testimonial-mark {
985
- display: grid;
986
- width: 2.5rem;
987
- height: 2.5rem;
988
- place-items: center;
989
- border-radius: var(--md-shape-full);
990
- background: var(--md-surface-container-highest);
991
- color: var(--ink);
992
- font-size: var(--type-title-medium-size);
993
- font-weight: var(--type-title-medium-weight);
994
- letter-spacing: var(--type-title-medium-tracking);
995
- line-height: 1;
996
- }
997
- .block-testimonial-mark::before {
998
- content: attr(data-initial);
999
- }
988
+ .block-testimonial-mark {
989
+ display: grid;
990
+ width: 2.5rem;
991
+ height: 2.5rem;
992
+ place-items: center;
993
+ border-radius: var(--md-shape-full);
994
+ background: var(--md-surface-container-highest);
995
+ color: var(--ink);
996
+ font-size: var(--type-title-medium-size);
997
+ font-weight: var(--type-title-medium-weight);
998
+ letter-spacing: var(--type-title-medium-tracking);
999
+ line-height: 1;
1000
+ }
1001
+ .block-testimonial-mark::before {
1002
+ content: attr(data-initial);
1003
+ }
1000
1004
 
1001
- /* The Material theme's own parts (components/Header.astro, MobileMenu.tsx, Footer.astro). */
1005
+ /* The Material theme's own parts (components/Header.astro, MobileMenu.tsx, Footer.astro). */
1002
1006
 
1003
- /* The top app bar (its variables above, Header.astro): 64px high, above the cookie banner, so its menus are too. */
1004
- /* The menu's items: a label in medium weight, a state layer, the open page in an active indicator (the secondary
1007
+ /* The top app bar (its variables above, Header.astro): 64px high, above the cookie banner, so its menus are too. */
1008
+ /* The menu's items: a label in medium weight, a state layer, the open page in an active indicator (the secondary
1005
1009
  container). 40px high, and 48px to touch. */
1006
- .md-nav-item,
1007
- .md-nav-toggle {
1008
- position: relative;
1009
- }
1010
- .md-nav-item::after {
1011
- content: '';
1012
- position: absolute;
1013
- inset: -0.25rem 0;
1014
- }
1015
- .md-nav-toggle::after {
1016
- content: '';
1017
- position: absolute;
1018
- inset: -0.25rem -0.125rem -0.25rem -0.5rem;
1019
- }
1020
- .md-nav-item {
1021
- display: inline-flex;
1022
- min-height: 2.5rem;
1023
- align-items: center;
1024
- gap: 0.25rem;
1025
- border-radius: var(--md-shape-full);
1026
- padding: 0 1rem;
1027
- white-space: nowrap;
1028
- color: var(--muted);
1029
- font-size: var(--type-label-large-size);
1030
- line-height: var(--type-label-large-line-height);
1031
- font-weight: var(--type-label-large-weight);
1032
- letter-spacing: var(--type-label-large-tracking);
1033
- transition:
1034
- background-color var(--motion-effects),
1035
- color var(--motion-effects);
1036
- }
1037
- .md-nav-item:hover {
1038
- background: var(--md-hover);
1039
- color: var(--ink);
1040
- }
1041
- .md-nav-item:focus-visible,
1042
- .md-nav-item:active {
1043
- background: var(--md-pressed);
1044
- color: var(--ink);
1045
- }
1046
- /* An item with sub-pages: its label, then the button that opens them. */
1047
- .md-nav-item-parent {
1048
- padding-right: 0.25rem;
1049
- }
1050
- .md-nav-toggle {
1051
- display: grid;
1052
- width: 2rem;
1053
- height: 2.5rem;
1054
- place-items: center;
1055
- border-radius: var(--md-shape-full);
1056
- color: var(--muted);
1057
- transition:
1058
- background-color var(--motion-effects),
1059
- color var(--motion-effects);
1060
- }
1061
- .md-nav-toggle:hover {
1062
- background: var(--md-hover);
1063
- color: var(--ink);
1064
- }
1065
- .md-nav-toggle:focus-visible,
1066
- .md-nav-toggle:active {
1067
- background: var(--md-pressed);
1068
- color: var(--ink);
1069
- }
1070
- .md-nav-toggle > svg {
1071
- transition: transform var(--motion-spatial-fast);
1072
- }
1073
- .md-nav-toggle[aria-expanded='true'] > svg {
1074
- transform: rotate(180deg);
1075
- }
1076
- .md-nav-item[aria-current='page'],
1077
- li:has(.menu-item[aria-current='page']) > .md-nav-item {
1078
- background: var(--tint);
1079
- color: var(--ink);
1080
- }
1081
- /* A menu (its variables above): a state layer with focus from the keyboard (the ripple when pressed), and the open page
1010
+ .md-nav-item,
1011
+ .md-nav-toggle {
1012
+ position: relative;
1013
+ }
1014
+ .md-nav-item::after {
1015
+ content: '';
1016
+ position: absolute;
1017
+ inset: -0.25rem 0;
1018
+ }
1019
+ .md-nav-toggle::after {
1020
+ content: '';
1021
+ position: absolute;
1022
+ inset: -0.25rem -0.125rem -0.25rem -0.5rem;
1023
+ }
1024
+ .md-nav-item {
1025
+ display: inline-flex;
1026
+ min-height: 2.5rem;
1027
+ align-items: center;
1028
+ gap: 0.25rem;
1029
+ border-radius: var(--md-shape-full);
1030
+ padding: 0 1rem;
1031
+ white-space: nowrap;
1032
+ color: var(--muted);
1033
+ font-size: var(--type-label-large-size);
1034
+ line-height: var(--type-label-large-line-height);
1035
+ font-weight: var(--type-label-large-weight);
1036
+ letter-spacing: var(--type-label-large-tracking);
1037
+ transition:
1038
+ background-color var(--motion-effects),
1039
+ color var(--motion-effects);
1040
+ }
1041
+ .md-nav-item:hover {
1042
+ background: var(--md-hover);
1043
+ color: var(--ink);
1044
+ }
1045
+ .md-nav-item:focus-visible,
1046
+ .md-nav-item:active {
1047
+ background: var(--md-pressed);
1048
+ color: var(--ink);
1049
+ }
1050
+ /* An item with sub-pages: its label, then the button that opens them. */
1051
+ .md-nav-item-parent {
1052
+ padding-right: 0.25rem;
1053
+ }
1054
+ .md-nav-toggle {
1055
+ display: grid;
1056
+ width: 2rem;
1057
+ height: 2.5rem;
1058
+ place-items: center;
1059
+ border-radius: var(--md-shape-full);
1060
+ color: var(--muted);
1061
+ transition:
1062
+ background-color var(--motion-effects),
1063
+ color var(--motion-effects);
1064
+ }
1065
+ .md-nav-toggle:hover {
1066
+ background: var(--md-hover);
1067
+ color: var(--ink);
1068
+ }
1069
+ .md-nav-toggle:focus-visible,
1070
+ .md-nav-toggle:active {
1071
+ background: var(--md-pressed);
1072
+ color: var(--ink);
1073
+ }
1074
+ .md-nav-toggle > svg {
1075
+ transition: transform var(--motion-spatial-fast);
1076
+ }
1077
+ .md-nav-toggle[aria-expanded='true'] > svg {
1078
+ transform: rotate(180deg);
1079
+ }
1080
+ .md-nav-item[aria-current='page'],
1081
+ li:has(.menu-item[aria-current='page']) > .md-nav-item {
1082
+ background: var(--tint);
1083
+ color: var(--ink);
1084
+ }
1085
+ /* A menu (its variables above): a state layer with focus from the keyboard (the ripple when pressed), and the open page
1082
1086
  in the secondary container also when pointed at. */
1083
- .menu-item:focus-visible {
1084
- background: var(--md-pressed);
1085
- }
1086
- .menu-item[aria-current='page']:hover {
1087
- background: var(--tint);
1088
- }
1087
+ .menu-item:focus-visible {
1088
+ background: var(--md-pressed);
1089
+ }
1090
+ .menu-item[aria-current='page']:hover {
1091
+ background: var(--tint);
1092
+ }
1089
1093
 
1090
- /* The extended FAB (its variables above, Header.astro): at the bottom right of the screen, with the ripple when pressed. It
1094
+ /* The extended FAB (its variables above, Header.astro): at the bottom right of the screen, with the ripple when pressed. It
1091
1095
  shows only its icon while the page scrolls down (data-collapsed). */
1092
- [data-fab] {
1093
- position: fixed;
1094
- right: max(1rem, env(safe-area-inset-right));
1095
- bottom: max(1rem, env(safe-area-inset-bottom));
1096
- z-index: 30;
1097
- }
1098
- @media (width >= theme(--breakpoint-medium)) {
1099
1096
  [data-fab] {
1100
- right: 1.5rem;
1101
- bottom: 1.5rem;
1097
+ position: fixed;
1098
+ right: max(1rem, env(safe-area-inset-right));
1099
+ bottom: max(1rem, env(safe-area-inset-bottom));
1100
+ z-index: 30;
1101
+ }
1102
+ @media (width >= theme(--breakpoint-medium)) {
1103
+ [data-fab] {
1104
+ right: 1.5rem;
1105
+ bottom: 1.5rem;
1106
+ }
1102
1107
  }
1103
1108
  }
1104
1109
  /* In the navigation drawer: at the top, in the secondary container, lowered (as in a Google app): M3's lowered FAB, at
@@ -1106,203 +1111,211 @@ li:has(.menu-item[aria-current='page']) > .md-nav-item {
1106
1111
  .navigation-drawer > .extended-fab {
1107
1112
  --fab-shadow: var(--elevation-1);
1108
1113
  --fab-hover-shadow: var(--elevation-2);
1109
- margin: 0.25rem 0 0.75rem 0.5rem;
1110
- align-self: flex-start;
1111
1114
  }
1112
- /* On a phone with a bar at the bottom of the screen (a docked toolbar, components.css), the page's FAB is not shown; the
1115
+ @layer fallback {
1116
+ .navigation-drawer > .extended-fab {
1117
+ margin: 0.25rem 0 0.75rem 0.5rem;
1118
+ align-self: flex-start;
1119
+ }
1120
+ /* On a phone with a bar at the bottom of the screen (a docked toolbar, components.css), the page's FAB is not shown; the
1113
1121
  bar's buttons are the common buttons, round and as everywhere else (only pressed a little squarer), the filled one to
1114
1122
  the right, after the outlined one or the text. */
1115
- @media (width < theme(--breakpoint-medium)) {
1116
- body:has(.theme-action-bar) [data-fab] {
1117
- display: none;
1123
+ @media (width < theme(--breakpoint-medium)) {
1124
+ body:has(.theme-action-bar) [data-fab] {
1125
+ display: none;
1126
+ }
1127
+ }
1128
+ :is(.theme-action-bar, .theme-action-bar-drawn) > .button-filled {
1129
+ order: 2;
1118
1130
  }
1119
- }
1120
- :is(.theme-action-bar, .theme-action-bar-drawn) > .button-filled {
1121
- order: 2;
1122
- }
1123
1131
 
1124
- /* The site's menu in the navigation drawer (its values are ui.css's, MobileMenu.tsx): its head. */
1125
- .md-drawer-head {
1126
- display: flex;
1127
- align-items: center;
1128
- gap: 0.75rem;
1129
- padding: 0.25rem 0 1rem 1rem;
1130
- }
1131
- .md-drawer-name {
1132
- font-size: var(--type-title-medium-size);
1133
- line-height: var(--type-title-medium-line-height);
1134
- font-weight: var(--type-title-medium-weight);
1135
- letter-spacing: var(--type-title-medium-tracking);
1136
- }
1137
- .md-drawer-role {
1138
- color: var(--muted);
1139
- font-size: var(--type-body-medium-size);
1140
- line-height: var(--type-body-medium-line-height);
1141
- font-weight: var(--type-body-medium-weight);
1142
- letter-spacing: var(--type-body-medium-tracking);
1143
- }
1144
- /* An item with sub-pages: its link and the caret in one row, the active indicator around both. */
1145
- .navigation-drawer-row {
1146
- border-radius: var(--md-shape-full);
1147
- transition: background-color var(--motion-effects);
1148
- }
1149
- .navigation-drawer-row > .navigation-drawer-item,
1150
- .navigation-drawer-row > .navigation-drawer-item:hover,
1151
- .navigation-drawer-row > .navigation-drawer-item:focus-visible,
1152
- .navigation-drawer-row > .navigation-drawer-item:active {
1153
- background: none;
1154
- }
1155
- .navigation-drawer-row:has(> .navigation-drawer-item:hover) {
1156
- background: var(--md-hover);
1157
- }
1158
- .navigation-drawer-row:has(> .navigation-drawer-item:focus-visible) {
1159
- background: var(--md-pressed);
1160
- }
1161
- .navigation-drawer-row[data-active] {
1162
- background: var(--secondary-container);
1163
- }
1164
- .navigation-drawer-row[data-active] > .navigation-drawer-item {
1165
- color: var(--on-secondary-container);
1166
- }
1167
- .navigation-drawer-row[data-active]:has(> .navigation-drawer-item:hover) {
1168
- background: color-mix(in srgb, var(--on-secondary-container) 8%, var(--secondary-container));
1169
- }
1170
- .navigation-drawer-row[data-active]:has(> .navigation-drawer-item:focus-visible) {
1171
- background: color-mix(in srgb, var(--on-secondary-container) 10%, var(--secondary-container));
1172
- }
1173
- .navigation-drawer-toggle {
1174
- margin-right: 0.25rem;
1175
- color: var(--muted);
1176
- }
1177
- .navigation-drawer-toggle:focus-visible {
1178
- background: var(--md-pressed);
1179
- }
1180
- /* Directly in the drawer ("Ring"), not in a row with a caret: as high as its content. */
1181
- .navigation-drawer > .navigation-drawer-item {
1182
- flex: none;
1183
- }
1184
- /* A sub-page: an item further in, its label in regular weight. */
1185
- .navigation-drawer-subitem {
1186
- min-height: 3.5rem;
1187
- gap: 0.75rem;
1188
- margin-left: 0;
1189
- border-left: 0;
1190
- border-radius: var(--md-shape-full);
1191
- padding: 0 1.5rem 0 2.25rem;
1192
- color: var(--muted);
1193
- transition: background-color var(--motion-effects);
1194
- }
1195
- .navigation-drawer-subitem:hover {
1196
- background: var(--md-hover);
1197
- color: var(--muted);
1198
- }
1199
- .navigation-drawer-subitem:focus-visible {
1200
- background: var(--md-pressed);
1201
- }
1202
- .navigation-drawer-subitem[data-active] {
1203
- background: var(--secondary-container);
1204
- color: var(--on-secondary-container);
1205
- font-weight: 400;
1206
- }
1132
+ /* The site's menu in the navigation drawer (its values are ui.css's, MobileMenu.tsx): its head. */
1133
+ .md-drawer-head {
1134
+ display: flex;
1135
+ align-items: center;
1136
+ gap: 0.75rem;
1137
+ padding: 0.25rem 0 1rem 1rem;
1138
+ }
1139
+ .md-drawer-name {
1140
+ font-size: var(--type-title-medium-size);
1141
+ line-height: var(--type-title-medium-line-height);
1142
+ font-weight: var(--type-title-medium-weight);
1143
+ letter-spacing: var(--type-title-medium-tracking);
1144
+ }
1145
+ .md-drawer-role {
1146
+ color: var(--muted);
1147
+ font-size: var(--type-body-medium-size);
1148
+ line-height: var(--type-body-medium-line-height);
1149
+ font-weight: var(--type-body-medium-weight);
1150
+ letter-spacing: var(--type-body-medium-tracking);
1151
+ }
1152
+ /* An item with sub-pages: its link and the caret in one row, the active indicator around both. */
1153
+ .navigation-drawer-row {
1154
+ border-radius: var(--md-shape-full);
1155
+ transition: background-color var(--motion-effects);
1156
+ }
1157
+ .navigation-drawer-row > .navigation-drawer-item,
1158
+ .navigation-drawer-row > .navigation-drawer-item:hover,
1159
+ .navigation-drawer-row > .navigation-drawer-item:focus-visible,
1160
+ .navigation-drawer-row > .navigation-drawer-item:active {
1161
+ background: none;
1162
+ }
1163
+ .navigation-drawer-row:has(> .navigation-drawer-item:hover) {
1164
+ background: var(--md-hover);
1165
+ }
1166
+ .navigation-drawer-row:has(> .navigation-drawer-item:focus-visible) {
1167
+ background: var(--md-pressed);
1168
+ }
1169
+ .navigation-drawer-row[data-active] {
1170
+ background: var(--secondary-container);
1171
+ }
1172
+ .navigation-drawer-row[data-active] > .navigation-drawer-item {
1173
+ color: var(--on-secondary-container);
1174
+ }
1175
+ .navigation-drawer-row[data-active]:has(> .navigation-drawer-item:hover) {
1176
+ background: color-mix(in srgb, var(--on-secondary-container) 8%, var(--secondary-container));
1177
+ }
1178
+ .navigation-drawer-row[data-active]:has(> .navigation-drawer-item:focus-visible) {
1179
+ background: color-mix(in srgb, var(--on-secondary-container) 10%, var(--secondary-container));
1180
+ }
1181
+ .navigation-drawer-toggle {
1182
+ margin-right: 0.25rem;
1183
+ color: var(--muted);
1184
+ }
1185
+ .navigation-drawer-toggle:focus-visible {
1186
+ background: var(--md-pressed);
1187
+ }
1188
+ /* Directly in the drawer ("Ring"), not in a row with a caret: as high as its content. */
1189
+ .navigation-drawer > .navigation-drawer-item {
1190
+ flex: none;
1191
+ }
1192
+ /* A sub-page: an item further in, its label in regular weight. */
1193
+ .navigation-drawer-subitem {
1194
+ min-height: 3.5rem;
1195
+ gap: 0.75rem;
1196
+ margin-left: 0;
1197
+ border-left: 0;
1198
+ border-radius: var(--md-shape-full);
1199
+ padding: 0 1.5rem 0 2.25rem;
1200
+ color: var(--muted);
1201
+ transition: background-color var(--motion-effects);
1202
+ }
1203
+ .navigation-drawer-subitem:hover {
1204
+ background: var(--md-hover);
1205
+ color: var(--muted);
1206
+ }
1207
+ .navigation-drawer-subitem:focus-visible {
1208
+ background: var(--md-pressed);
1209
+ }
1210
+ .navigation-drawer-subitem[data-active] {
1211
+ background: var(--secondary-container);
1212
+ color: var(--on-secondary-container);
1213
+ font-weight: 400;
1214
+ }
1207
1215
 
1208
- /* The footer: a surface container with extra-large corners at the top, a headline, lists with leading icons and a
1216
+ /* The footer: a surface container with extra-large corners at the top, a headline, lists with leading icons and a
1209
1217
  state layer, and text buttons at the bottom. */
1210
- .md-footer {
1211
- margin-top: 6rem;
1212
- border-radius: var(--md-shape-extra-large) var(--md-shape-extra-large) var(--md-shape-none) var(--md-shape-none);
1213
- background: var(--md-surface-container);
1214
- }
1215
- .md-footer-name {
1216
- margin-top: 0.75rem;
1217
- font-size: var(--type-headline-small-size);
1218
- line-height: var(--type-headline-small-line-height);
1219
- font-weight: var(--type-headline-small-weight);
1220
- letter-spacing: var(--type-headline-small-tracking);
1221
- }
1222
- .md-footer-text {
1223
- margin-top: 0.5rem;
1224
- max-width: 38ch;
1225
- color: var(--muted);
1226
- font-size: var(--type-body-medium-size);
1227
- line-height: var(--type-body-medium-line-height);
1228
- font-weight: var(--type-body-medium-weight);
1229
- letter-spacing: var(--type-body-medium-tracking);
1230
- }
1231
- .md-footer-heading,
1232
- .md-footer-column > p {
1233
- color: var(--ink);
1234
- font-size: var(--type-label-large-size);
1235
- line-height: var(--type-label-large-line-height);
1236
- font-weight: var(--type-label-large-weight);
1237
- letter-spacing: var(--type-label-large-tracking);
1238
- }
1239
- .md-footer-list,
1240
- .md-footer-column > ul {
1241
- margin: 0.5rem -1rem 0;
1242
- }
1243
- .md-footer-item,
1244
- .md-footer-column > ul a {
1245
- display: flex;
1246
- min-height: 3rem;
1247
- align-items: center;
1248
- gap: 1rem;
1249
- border-radius: var(--md-shape-full);
1250
- padding: 0.5rem 1rem;
1251
- color: var(--muted);
1252
- font-size: var(--type-body-medium-size);
1253
- line-height: var(--type-body-medium-line-height);
1254
- font-weight: var(--type-body-medium-weight);
1255
- letter-spacing: var(--type-body-medium-tracking);
1256
- transition: background-color var(--motion-effects);
1257
- }
1258
- .md-footer-item:hover,
1259
- .md-footer-column > ul a:hover {
1260
- background: var(--md-hover);
1261
- color: var(--ink);
1262
- }
1263
- .md-footer-item:focus-visible,
1264
- .md-footer-item:active,
1265
- .md-footer-column > ul a:focus-visible,
1266
- .md-footer-column > ul a:active {
1267
- background: var(--md-pressed);
1268
- color: var(--ink);
1269
- }
1270
- .md-footer-column > ul > li {
1271
- margin-block: 0;
1272
- }
1273
- .md-footer-item > svg {
1274
- flex-shrink: 0;
1275
- }
1276
- .md-footer-column > a {
1277
- margin-top: 0.5rem;
1278
- font-weight: 500;
1218
+ .md-footer {
1219
+ margin-top: 6rem;
1220
+ border-radius: var(--md-shape-extra-large) var(--md-shape-extra-large) var(--md-shape-none) var(--md-shape-none);
1221
+ background: var(--md-surface-container);
1222
+ }
1223
+ .md-footer-name {
1224
+ margin-top: 0.75rem;
1225
+ font-size: var(--type-headline-small-size);
1226
+ line-height: var(--type-headline-small-line-height);
1227
+ font-weight: var(--type-headline-small-weight);
1228
+ letter-spacing: var(--type-headline-small-tracking);
1229
+ }
1230
+ .md-footer-text {
1231
+ margin-top: 0.5rem;
1232
+ max-width: 38ch;
1233
+ color: var(--muted);
1234
+ font-size: var(--type-body-medium-size);
1235
+ line-height: var(--type-body-medium-line-height);
1236
+ font-weight: var(--type-body-medium-weight);
1237
+ letter-spacing: var(--type-body-medium-tracking);
1238
+ }
1239
+ .md-footer-heading,
1240
+ .md-footer-column > p {
1241
+ color: var(--ink);
1242
+ font-size: var(--type-label-large-size);
1243
+ line-height: var(--type-label-large-line-height);
1244
+ font-weight: var(--type-label-large-weight);
1245
+ letter-spacing: var(--type-label-large-tracking);
1246
+ }
1247
+ .md-footer-list,
1248
+ .md-footer-column > ul {
1249
+ margin: 0.5rem -1rem 0;
1250
+ }
1251
+ .md-footer-item,
1252
+ .md-footer-column > ul a {
1253
+ display: flex;
1254
+ min-height: 3rem;
1255
+ align-items: center;
1256
+ gap: 1rem;
1257
+ border-radius: var(--md-shape-full);
1258
+ padding: 0.5rem 1rem;
1259
+ color: var(--muted);
1260
+ font-size: var(--type-body-medium-size);
1261
+ line-height: var(--type-body-medium-line-height);
1262
+ font-weight: var(--type-body-medium-weight);
1263
+ letter-spacing: var(--type-body-medium-tracking);
1264
+ transition: background-color var(--motion-effects);
1265
+ }
1266
+ .md-footer-item:hover,
1267
+ .md-footer-column > ul a:hover {
1268
+ background: var(--md-hover);
1269
+ color: var(--ink);
1270
+ }
1271
+ .md-footer-item:focus-visible,
1272
+ .md-footer-item:active,
1273
+ .md-footer-column > ul a:focus-visible,
1274
+ .md-footer-column > ul a:active {
1275
+ background: var(--md-pressed);
1276
+ color: var(--ink);
1277
+ }
1278
+ .md-footer-column > ul > li {
1279
+ margin-block: 0;
1280
+ }
1281
+ .md-footer-item > svg {
1282
+ flex-shrink: 0;
1283
+ }
1284
+ .md-footer-column > a {
1285
+ margin-top: 0.5rem;
1286
+ font-weight: 500;
1287
+ }
1279
1288
  }
1280
1289
  .md-footer-bottom {
1281
- display: flex;
1282
- flex-wrap: wrap;
1283
- align-items: center;
1284
- justify-content: space-between;
1285
- gap: 0.5rem 1rem;
1286
- border-top: 1px solid var(--line);
1287
- padding-top: 1rem;
1288
- color: var(--muted);
1289
- font-size: var(--type-body-medium-size);
1290
- line-height: var(--type-body-medium-line-height);
1291
- font-weight: var(--type-body-medium-weight);
1292
- letter-spacing: var(--type-body-medium-tracking);
1293
1290
  /* Its text buttons (the cookie settings, light or dark) with an 18px icon. */
1294
1291
  --button-icon-size: 1.125rem;
1295
1292
  }
1296
- .md-footer-bottom > div {
1297
- margin-inline: -0.75rem;
1298
- }
1299
- /* Room under the footer's last line for the FAB, or for the bar at the bottom of the screen: in the footer instead of
1300
- under the page (components.css), so the footer reaches the bar. */
1301
- @media (width < theme(--breakpoint-medium)) {
1302
- body:has(.theme-action-bar):has(.md-footer) {
1303
- padding-bottom: 0;
1293
+ @layer fallback {
1294
+ .md-footer-bottom {
1295
+ display: flex;
1296
+ flex-wrap: wrap;
1297
+ align-items: center;
1298
+ justify-content: space-between;
1299
+ gap: 0.5rem 1rem;
1300
+ border-top: 1px solid var(--line);
1301
+ padding-top: 1rem;
1302
+ color: var(--muted);
1303
+ font-size: var(--type-body-medium-size);
1304
+ line-height: var(--type-body-medium-line-height);
1305
+ font-weight: var(--type-body-medium-weight);
1306
+ letter-spacing: var(--type-body-medium-tracking);
1304
1307
  }
1305
- body:has(.theme-action-bar, [data-fab]) .md-footer {
1306
- padding-bottom: 5rem;
1308
+ .md-footer-bottom > div {
1309
+ margin-inline: -0.75rem;
1310
+ }
1311
+ /* Room under the footer's last line for the FAB, or for the bar at the bottom of the screen: in the footer instead of
1312
+ under the page (components.css), so the footer reaches the bar. */
1313
+ @media (width < theme(--breakpoint-medium)) {
1314
+ body:has(.theme-action-bar):has(.md-footer) {
1315
+ padding-bottom: 0;
1316
+ }
1317
+ body:has(.theme-action-bar, [data-fab]) .md-footer {
1318
+ padding-bottom: 5rem;
1319
+ }
1307
1320
  }
1308
1321
  }