@adnap/krysalicss 0.0.1 → 0.1.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 (217) hide show
  1. package/README.md +23 -5
  2. package/dist/element/badge.css +30 -0
  3. package/dist/element/badge.min.css +1 -1
  4. package/dist/element/box.css +193 -0
  5. package/dist/element/box.min.css +1 -0
  6. package/dist/element/button.css +4 -0
  7. package/dist/element/button.min.css +1 -1
  8. package/dist/element/divider.css +155 -0
  9. package/dist/element/divider.min.css +1 -0
  10. package/dist/element/image.css +434 -0
  11. package/dist/element/image.min.css +1 -0
  12. package/dist/element/range.css +2 -2
  13. package/dist/element/spinner.css +190 -0
  14. package/dist/element/spinner.min.css +1 -0
  15. package/dist/helper/border.css +141 -0
  16. package/dist/helper/border.min.css +1 -0
  17. package/dist/helper/color.css +203 -0
  18. package/dist/helper/color.min.css +1 -0
  19. package/dist/helper/flex.css +277 -0
  20. package/dist/helper/flex.min.css +1 -0
  21. package/dist/helper/font-size.css +137 -0
  22. package/dist/helper/font-size.min.css +1 -0
  23. package/dist/helper/interactions.css +142 -0
  24. package/dist/helper/interactions.min.css +1 -0
  25. package/dist/helper/line-height.css +129 -0
  26. package/dist/helper/line-height.min.css +1 -0
  27. package/dist/helper/object-fit.css +133 -0
  28. package/dist/helper/object-fit.min.css +1 -0
  29. package/dist/helper/overflow.css +165 -0
  30. package/dist/helper/overflow.min.css +1 -0
  31. package/dist/helper/position.css +157 -0
  32. package/dist/helper/position.min.css +1 -0
  33. package/dist/helper/ratio.css +142 -0
  34. package/dist/helper/ratio.min.css +1 -0
  35. package/dist/helper/shadow.css +129 -0
  36. package/dist/helper/shadow.min.css +1 -0
  37. package/dist/helper/sizing.css +177 -0
  38. package/dist/helper/sizing.min.css +1 -0
  39. package/dist/helper/spacing.css +563 -0
  40. package/dist/helper/spacing.min.css +1 -0
  41. package/dist/helper/stack.css +127 -0
  42. package/dist/helper/stack.min.css +1 -0
  43. package/dist/helper/text.css +243 -0
  44. package/dist/helper/text.min.css +1 -0
  45. package/dist/helper/tooltip.css +174 -0
  46. package/dist/helper/tooltip.min.css +1 -0
  47. package/dist/helper/visibility.css +334 -0
  48. package/dist/helper/visibility.min.css +1 -0
  49. package/dist/krysalicss.css +3491 -414
  50. package/dist/krysalicss.css.map +1 -1
  51. package/dist/krysalicss.min.css +1 -1
  52. package/dist/layout/footer.css +155 -0
  53. package/dist/layout/footer.min.css +1 -0
  54. package/dist/layout/hero.css +177 -0
  55. package/dist/layout/hero.min.css +1 -0
  56. package/dist/module/alert.css +30 -0
  57. package/dist/module/alert.min.css +1 -1
  58. package/dist/module/breadcrumb.css +163 -0
  59. package/dist/module/breadcrumb.min.css +1 -0
  60. package/dist/module/buttons.css +158 -0
  61. package/dist/module/buttons.min.css +1 -0
  62. package/dist/module/card.css +89 -0
  63. package/dist/module/card.min.css +1 -1
  64. package/dist/module/dropdown.css +253 -0
  65. package/dist/module/dropdown.min.css +1 -0
  66. package/dist/module/navbar.css +1 -1
  67. package/dist/module/navbar.min.css +1 -1
  68. package/dist/module/pagination.css +301 -0
  69. package/dist/module/pagination.min.css +1 -0
  70. package/dist/module/popover.css +272 -0
  71. package/dist/module/popover.min.css +1 -0
  72. package/dist/module/section.css +138 -0
  73. package/dist/module/section.min.css +1 -0
  74. package/dist/module/toast.css +307 -0
  75. package/dist/module/toast.min.css +1 -0
  76. package/dist/scss-api.json +4672 -0
  77. package/dist/typography/blockquote.css +128 -0
  78. package/dist/typography/blockquote.min.css +1 -0
  79. package/dist/typography/figure.css +132 -0
  80. package/dist/typography/figure.min.css +1 -0
  81. package/dist/typography/lead.css +119 -0
  82. package/dist/typography/lead.min.css +1 -0
  83. package/dist/typography/list.css +125 -0
  84. package/dist/typography/list.min.css +1 -0
  85. package/package.json +8 -2
  86. package/src/base/global/_plugin.scss +2 -0
  87. package/src/base/reset/_plugin.scss +2 -0
  88. package/src/base/reset/_variables.scss +2 -0
  89. package/src/element/_index.scss +4 -0
  90. package/src/element/badge/_plugin.scss +6 -8
  91. package/src/element/badge/_variables.scss +4 -6
  92. package/src/element/box/_index.scss +2 -0
  93. package/src/element/box/_plugin.scss +31 -0
  94. package/src/element/box/_variables.scss +18 -0
  95. package/src/element/button/_plugin.scss +20 -1
  96. package/src/element/checkbox/_plugin.scss +3 -4
  97. package/src/element/checkbox/_variables.scss +2 -5
  98. package/src/element/divider/_index.scss +2 -0
  99. package/src/element/divider/_plugin.scss +69 -0
  100. package/src/element/divider/_variables.scss +16 -0
  101. package/src/element/file/_plugin.scss +2 -0
  102. package/src/element/file/_variables.scss +2 -6
  103. package/src/element/image/_index.scss +2 -0
  104. package/src/element/image/_plugin.scss +106 -0
  105. package/src/element/image/_variables.scss +53 -0
  106. package/src/element/progress/_plugin.scss +9 -28
  107. package/src/element/progress/_variables.scss +2 -8
  108. package/src/element/radio/_plugin.scss +4 -4
  109. package/src/element/radio/_variables.scss +2 -2
  110. package/src/element/range/_plugin.scss +9 -20
  111. package/src/element/range/_variables.scss +7 -1
  112. package/src/element/select/_plugin.scss +3 -4
  113. package/src/element/select/_variables.scss +2 -6
  114. package/src/element/spinner/_index.scss +2 -0
  115. package/src/element/spinner/_plugin.scss +78 -0
  116. package/src/element/spinner/_variables.scss +22 -0
  117. package/src/element/switch/_plugin.scss +6 -10
  118. package/src/element/switch/_variables.scss +2 -10
  119. package/src/element/text-input/_plugin.scss +3 -1
  120. package/src/element/text-input/_variables.scss +5 -5
  121. package/src/element/textarea/_plugin.scss +3 -1
  122. package/src/element/textarea/_variables.scss +2 -2
  123. package/src/helper/_border.scss +43 -0
  124. package/src/helper/_color.scss +29 -0
  125. package/src/helper/{_controls.scss → _controls-internal.scss} +21 -0
  126. package/src/helper/_flex.scss +89 -0
  127. package/src/helper/_font-size.scss +22 -0
  128. package/src/helper/_index.scss +18 -1
  129. package/src/helper/_interactions.scss +41 -0
  130. package/src/helper/_line-height.scss +22 -0
  131. package/src/helper/_object-fit.scss +15 -0
  132. package/src/helper/_overflow.scss +28 -0
  133. package/src/helper/_position.scss +47 -0
  134. package/src/helper/_ratio.scss +35 -0
  135. package/src/helper/_shadow.scss +31 -0
  136. package/src/helper/_sizing.scss +65 -0
  137. package/src/helper/_spacing.scss +95 -0
  138. package/src/helper/_stack.scss +24 -0
  139. package/src/helper/_state.scss +2 -17
  140. package/src/helper/_text.scss +92 -0
  141. package/src/helper/_tooltip.scss +100 -0
  142. package/src/helper/_visibility.scss +80 -0
  143. package/src/layout/_index.scss +2 -0
  144. package/src/layout/container/_plugin.scss +2 -0
  145. package/src/layout/container/_variables.scss +2 -0
  146. package/src/layout/flex/_plugin.scss +2 -1
  147. package/src/layout/flex/_variables.scss +2 -2
  148. package/src/layout/footer/_index.scss +2 -0
  149. package/src/layout/footer/_plugin.scss +24 -0
  150. package/src/layout/footer/_variables.scss +11 -0
  151. package/src/layout/grid/_plugin.scss +2 -0
  152. package/src/layout/grid/_variables.scss +20 -16
  153. package/src/layout/hero/_index.scss +2 -0
  154. package/src/layout/hero/_plugin.scss +54 -0
  155. package/src/layout/hero/_variables.scss +23 -0
  156. package/src/module/_index.scss +7 -0
  157. package/src/module/alert/_plugin.scss +6 -1
  158. package/src/module/alert/_variables.scss +7 -0
  159. package/src/module/breadcrumb/_index.scss +2 -0
  160. package/src/module/breadcrumb/_plugin.scss +73 -0
  161. package/src/module/breadcrumb/_variables.scss +27 -0
  162. package/src/module/buttons/_index.scss +2 -0
  163. package/src/module/buttons/_plugin.scss +67 -0
  164. package/src/module/buttons/_variables.scss +10 -0
  165. package/src/module/card/_plugin.scss +96 -2
  166. package/src/module/card/_variables.scss +39 -0
  167. package/src/module/dropdown/_index.scss +2 -0
  168. package/src/module/dropdown/_plugin.scss +155 -0
  169. package/src/module/dropdown/_variables.scss +50 -0
  170. package/src/module/field/_plugin.scss +2 -0
  171. package/src/module/modal/_plugin.scss +2 -0
  172. package/src/module/navbar/_plugin.scss +4 -1
  173. package/src/module/navbar/_variables.scss +6 -2
  174. package/src/module/pagination/_index.scss +2 -0
  175. package/src/module/pagination/_plugin.scss +276 -0
  176. package/src/module/pagination/_variables.scss +64 -0
  177. package/src/module/popover/_index.scss +2 -0
  178. package/src/module/popover/_plugin.scss +183 -0
  179. package/src/module/popover/_variables.scss +44 -0
  180. package/src/module/section/_index.scss +2 -0
  181. package/src/module/section/_plugin.scss +47 -0
  182. package/src/module/section/_variables.scss +24 -0
  183. package/src/module/tabs/_plugin.scss +3 -1
  184. package/src/module/toast/_index.scss +2 -0
  185. package/src/module/toast/_plugin.scss +184 -0
  186. package/src/module/toast/_variables.scss +56 -0
  187. package/src/typography/_index.scss +4 -0
  188. package/src/typography/base/_plugin.scss +2 -0
  189. package/src/typography/base/_variables.scss +4 -3
  190. package/src/typography/blockquote/_index.scss +2 -0
  191. package/src/typography/blockquote/_plugin.scss +22 -0
  192. package/src/typography/blockquote/_variables.scss +13 -0
  193. package/src/typography/content/_plugin.scss +2 -0
  194. package/src/typography/content/_variables.scss +2 -0
  195. package/src/typography/figure/_index.scss +2 -0
  196. package/src/typography/figure/_plugin.scss +29 -0
  197. package/src/typography/figure/_variables.scss +13 -0
  198. package/src/typography/lead/_index.scss +2 -0
  199. package/src/typography/lead/_plugin.scss +12 -0
  200. package/src/typography/lead/_variables.scss +6 -0
  201. package/src/typography/link/_mixins.scss +2 -0
  202. package/src/typography/link/_plugin.scss +2 -0
  203. package/src/typography/link/_variables.scss +2 -0
  204. package/src/typography/list/_index.scss +2 -0
  205. package/src/typography/list/_plugin.scss +18 -0
  206. package/src/typography/list/_variables.scss +6 -0
  207. package/src/typography/table/_plugin.scss +2 -0
  208. package/src/typography/table/_variables.scss +2 -0
  209. package/src/typography/title/_plugin.scss +2 -0
  210. package/src/typography/title/_variables.scss +2 -0
  211. package/src/variables/_color.scss +20 -12
  212. package/src/variables/_feature.scss +36 -0
  213. package/src/variables/_global.scss +8 -0
  214. package/src/variables/_selector.scss +1 -0
  215. package/dist/tokens/dark.json +0 -85
  216. package/dist/tokens/default.json +0 -85
  217. package/dist/tokens/high-contrast.json +0 -85
@@ -0,0 +1,54 @@
1
+ @use "sass:list";
2
+ @use "variables" as *;
3
+ @use "../../variables";
4
+ @use "../../helper/controls-internal" as controls;
5
+
6
+ // Documentation: ../../../docs/src/pages/reference/components/layout/hero.mdx
7
+
8
+ @if variables.$feature-layout-hero {
9
+ #{$selector} {
10
+ display: flex;
11
+ flex-direction: column;
12
+
13
+ @if $halfheight-modifier {
14
+ &#{variables.$selector-prefix-is}#{$halfheight-modifier} {
15
+ min-height: 50vh;
16
+ }
17
+ }
18
+
19
+ @if $fullheight-modifier {
20
+ &#{variables.$selector-prefix-is}#{$fullheight-modifier} {
21
+ min-height: 100vh;
22
+ }
23
+ }
24
+
25
+ @if $fullheight-with-navbar-modifier {
26
+ &#{variables.$selector-prefix-is}#{$fullheight-with-navbar-modifier} {
27
+ min-height: calc(100vh - #{$navbar-height});
28
+ }
29
+ }
30
+
31
+ #{$head-selector},
32
+ #{$foot-selector} {
33
+ flex-shrink: 0;
34
+ }
35
+
36
+ #{$body-selector} {
37
+ flex-grow: 1;
38
+ display: flex;
39
+ flex-direction: column;
40
+ justify-content: center;
41
+ padding: $body-padding-block $body-padding-inline;
42
+ }
43
+
44
+ // Size modifier targets the body selector so height modifiers
45
+ // (min-height) and size modifiers (padding) compose on the same element.
46
+ @each $size, $padding in $body-padding-by-size {
47
+ &#{variables.$selector-prefix-is}#{$size} #{$body-selector} {
48
+ padding: list.nth($padding, 1) list.nth($padding, 2);
49
+ }
50
+ }
51
+
52
+ @include controls.combinations-apply();
53
+ }
54
+ }
@@ -0,0 +1,23 @@
1
+ @use "../../variables";
2
+
3
+ // Reference: ../../../docs/src/pages/reference/components/layout/hero.mdx
4
+
5
+ $selector: ".hero" !default;
6
+ $head-selector: ".hero-head" !default;
7
+ $body-selector: ".hero-body" !default;
8
+ $foot-selector: ".hero-foot" !default;
9
+
10
+ $body-padding-block: 3rem !default;
11
+ $body-padding-inline: variables.$global-gap !default;
12
+
13
+ $halfheight-modifier: "halfheight" !default;
14
+ $fullheight-modifier: "fullheight" !default;
15
+ $fullheight-with-navbar-modifier: "fullheight-with-navbar" !default;
16
+
17
+ $navbar-height: 3.25rem !default;
18
+
19
+ $body-padding-by-size: (
20
+ small: (1.5rem, variables.$global-gap),
21
+ medium: (9rem, 4.5rem),
22
+ large: (18rem, 6rem),
23
+ ) !default;
@@ -4,3 +4,10 @@
4
4
  @forward "navbar" as navbar-*;
5
5
  @forward "modal" as modal-*;
6
6
  @forward "tabs" as tabs-*;
7
+ @forward "dropdown" as dropdown-*;
8
+ @forward "section" as section-*;
9
+ @forward "breadcrumb" as breadcrumb-*;
10
+ @forward "pagination" as pagination-*;
11
+ @forward "buttons" as buttons-*;
12
+ @forward "toast" as toast-*;
13
+ @forward "popover" as popover-*;
@@ -1,7 +1,9 @@
1
1
  @use "sass:list";
2
2
  @use "variables" as *;
3
3
  @use "../../variables";
4
- @use "../../helper/controls" as controls;
4
+ @use "../../helper/controls-internal" as controls;
5
+
6
+ // Documentation: ../../../docs/src/pages/reference/components/module/alert.mdx
5
7
 
6
8
  @if variables.$feature-module-alert {
7
9
  #{$selector} {
@@ -47,5 +49,8 @@
47
49
  @include controls.nestedLinks;
48
50
 
49
51
  @include controls.combinations-apply();
52
+ @if $enable-light {
53
+ @include controls.combinations-apply-light();
54
+ }
50
55
  }
51
56
  }
@@ -1,8 +1,15 @@
1
1
  @use "../../variables";
2
2
 
3
+ // Documentation: ../../../docs/src/pages/reference/components/module/alert.mdx
4
+
3
5
  $selector: ".alert" !default;
4
6
  $icon-selector: ".alert__icon" !default;
5
7
 
8
+ // Local toggle for `.is-<combo>.is-light` emission. Derived from the
9
+ // framework-wide `$feature-light-variants` flag — see
10
+ // `variables/_feature.scss` for the cross-component rationale.
11
+ $enable-light: variables.$feature-light-variants !default;
12
+
6
13
  $padding-y: variables.$size-small !default;
7
14
  $padding-x: variables.$size-normal !default;
8
15
 
@@ -0,0 +1,2 @@
1
+ @forward "variables";
2
+ @forward "plugin";
@@ -0,0 +1,73 @@
1
+ @use "variables" as *;
2
+ @use "../../variables";
3
+
4
+ // Documentation: ../../../docs/src/pages/reference/components/module/breadcrumb.mdx
5
+
6
+ @if variables.$feature-module-breadcrumb {
7
+ #{$selector} {
8
+ --kc-breadcrumb-separator: "#{$separator}";
9
+
10
+ display: block;
11
+ font-size: inherit;
12
+
13
+ > ol,
14
+ > ul {
15
+ display: flex;
16
+ flex-wrap: wrap;
17
+ align-items: center;
18
+ gap: $gap;
19
+ margin: 0;
20
+ padding: 0;
21
+ list-style: none;
22
+ }
23
+
24
+ #{$item-selector} {
25
+ display: inline-flex;
26
+ align-items: center;
27
+ gap: $gap;
28
+
29
+ &::before {
30
+ content: var(--kc-breadcrumb-separator, "#{$separator}");
31
+ color: color-mix(
32
+ in srgb,
33
+ var(--kc-fg, currentColor) #{$separator-mix},
34
+ transparent
35
+ );
36
+ flex: 0 0 auto;
37
+ line-height: 1;
38
+ }
39
+
40
+ &:first-child::before {
41
+ content: none;
42
+ }
43
+
44
+ &[aria-current="page"],
45
+ &#{$current-selector} {
46
+ font-weight: $current-font-weight;
47
+ > a {
48
+ color: inherit;
49
+ text-decoration: none;
50
+ pointer-events: none;
51
+ }
52
+ }
53
+ }
54
+
55
+ &#{$centered-selector} > ol,
56
+ &#{$centered-selector} > ul {
57
+ justify-content: center;
58
+ }
59
+
60
+ &#{$right-selector} > ol,
61
+ &#{$right-selector} > ul {
62
+ justify-content: flex-end;
63
+ }
64
+
65
+ &#{$small-selector} {
66
+ font-size: $small-font-size;
67
+ }
68
+
69
+ &#{$large-selector} {
70
+ font-size: $large-font-size;
71
+ }
72
+ }
73
+ }
@@ -0,0 +1,27 @@
1
+ @use "../../variables";
2
+
3
+ // Documentation: ../../../docs/src/pages/reference/components/module/breadcrumb.mdx
4
+
5
+ $selector: ".breadcrumb" !default;
6
+ $item-selector: ".breadcrumb__item" !default;
7
+ $current-selector: "#{variables.$selector-prefix-is}current" !default;
8
+
9
+ $centered-selector: "#{variables.$selector-prefix-is}centered" !default;
10
+ $right-selector: "#{variables.$selector-prefix-is}right" !default;
11
+ $small-selector: "#{variables.$selector-prefix-is}small" !default;
12
+ $large-selector: "#{variables.$selector-prefix-is}large" !default;
13
+
14
+ $gap: variables.$size-small !default;
15
+
16
+ // Single source of truth for the glyph rendered between items. Themes
17
+ // override with `@use 'krysalicss/module/breadcrumb' with ($separator: '/')`
18
+ // or rebind the `--kc-breadcrumb-separator` custom property at any scope.
19
+ // Default: right arrow (U+2192).
20
+ $separator: "\\2192" !default;
21
+
22
+ $separator-mix: 50% !default;
23
+
24
+ $current-font-weight: 600 !default;
25
+
26
+ $small-font-size: variables.$size-small !default;
27
+ $large-font-size: variables.$size-medium !default;
@@ -0,0 +1,2 @@
1
+ @forward "variables";
2
+ @forward "plugin";
@@ -0,0 +1,67 @@
1
+ @use "variables" as *;
2
+ @use "../../variables";
3
+
4
+ // Documentation: ../../../docs/src/pages/reference/components/module/buttons.mdx
5
+
6
+ @if variables.$feature-module-buttons {
7
+ #{$selector} {
8
+ display: flex;
9
+ flex-wrap: wrap;
10
+ gap: $gap;
11
+
12
+ &#{$centered-selector} {
13
+ justify-content: center;
14
+ }
15
+
16
+ &#{$right-selector} {
17
+ justify-content: flex-end;
18
+ }
19
+
20
+ &#{$addons-selector} {
21
+ flex-wrap: nowrap;
22
+ gap: 0;
23
+
24
+ > .button,
25
+ > button {
26
+ border-radius: 0;
27
+
28
+ &:not(:last-child) {
29
+ margin-inline-end: -1px;
30
+ }
31
+
32
+ &:hover,
33
+ &:focus,
34
+ &:focus-visible,
35
+ &:active {
36
+ z-index: 1;
37
+ }
38
+
39
+ &:first-child {
40
+ border-start-start-radius: var(
41
+ --kc-btn-border-radius,
42
+ #{variables.$global-border-radius}
43
+ );
44
+ border-end-start-radius: var(
45
+ --kc-btn-border-radius,
46
+ #{variables.$global-border-radius}
47
+ );
48
+ border-start-end-radius: 0;
49
+ border-end-end-radius: 0;
50
+ }
51
+
52
+ &:last-child {
53
+ border-start-end-radius: var(
54
+ --kc-btn-border-radius,
55
+ #{variables.$global-border-radius}
56
+ );
57
+ border-end-end-radius: var(
58
+ --kc-btn-border-radius,
59
+ #{variables.$global-border-radius}
60
+ );
61
+ border-start-start-radius: 0;
62
+ border-end-start-radius: 0;
63
+ }
64
+ }
65
+ }
66
+ }
67
+ }
@@ -0,0 +1,10 @@
1
+ @use "../../variables";
2
+
3
+ // Documentation: ../../../docs/src/pages/reference/components/module/buttons.mdx
4
+
5
+ $selector: ".buttons" !default;
6
+ $gap: 0.5rem !default;
7
+
8
+ $addons-selector: "#{variables.$selector-prefix-has}addons" !default;
9
+ $centered-selector: "#{variables.$selector-prefix-is}centered" !default;
10
+ $right-selector: "#{variables.$selector-prefix-is}right" !default;
@@ -1,7 +1,9 @@
1
1
  @use "sass:list";
2
2
  @use "variables" as *;
3
3
  @use "../../variables";
4
- @use "../../helper/controls" as controls;
4
+ @use "../../helper/controls-internal" as controls;
5
+
6
+ // Documentation: ../../../docs/src/pages/reference/components/module/card.mdx
5
7
 
6
8
  @if variables.$feature-module-card {
7
9
  #{$selector} {
@@ -12,13 +14,29 @@
12
14
  @include variables.textColor(card-fg, list.nth($default-combination, 2));
13
15
  padding: $gap;
14
16
  border-radius: $border-radius;
15
- border: 1px solid color-mix(in srgb, currentColor 12%, transparent);
17
+ border: 1px solid
18
+ color-mix(
19
+ in srgb,
20
+ currentColor #{variables.$global-subtle-border-mix},
21
+ transparent
22
+ );
23
+ overflow: hidden;
16
24
 
17
25
  @if $container-name {
18
26
  container-type: inline-size;
19
27
  container-name: #{$container-name};
20
28
  }
21
29
 
30
+ // WHY when any subpart is present, surface padding moves into the subparts
31
+ // so the header divider can extend edge-to-edge. `:has()` is in the
32
+ // baseline-browser support window (CLAUDE.md "evergreen, last two years").
33
+ &:has(#{$header-selector}),
34
+ &:has(#{$image-selector}),
35
+ &:has(#{$content-selector}),
36
+ &:has(#{$footer-selector}) {
37
+ padding: 0;
38
+ }
39
+
22
40
  // Nested links inherit the surface fg + carry an underline. Same
23
41
  // rationale as alert: page-level --kc-link is calibrated against page
24
42
  // bg, not card surface bg; pairing with the card's own fg avoids
@@ -26,6 +44,82 @@
26
44
  // in dark themes. Underline preserves the link cue (WCAG 1.4.1).
27
45
  @include controls.nestedLinks;
28
46
 
47
+ #{$header-selector} {
48
+ display: flex;
49
+ align-items: stretch;
50
+ min-height: $header-min-height;
51
+ border-block-end: 1px solid
52
+ color-mix(in srgb, currentColor #{$subpart-divider-mix}, transparent);
53
+ }
54
+
55
+ #{$header-title-selector} {
56
+ flex: 1;
57
+ padding: $header-padding-y $header-padding-x;
58
+ font-weight: $header-title-weight;
59
+ margin: 0;
60
+ }
61
+
62
+ #{$header-icon-selector} {
63
+ display: inline-flex;
64
+ align-items: center;
65
+ justify-content: center;
66
+ padding: $header-padding-y $header-padding-x;
67
+ min-width: variables.$global-min-touch-target;
68
+ }
69
+
70
+ #{$image-selector} {
71
+ display: block;
72
+
73
+ img {
74
+ display: block;
75
+ width: 100%;
76
+ height: auto;
77
+ }
78
+ }
79
+
80
+ #{$content-selector} {
81
+ padding: $content-padding;
82
+ }
83
+
84
+ #{$footer-selector} {
85
+ display: flex;
86
+ align-items: stretch;
87
+ border-block-start: 1px solid
88
+ color-mix(in srgb, currentColor #{$subpart-divider-mix}, transparent);
89
+ }
90
+
91
+ #{$footer-item-selector} {
92
+ flex: 1 1 0;
93
+ padding: $footer-padding-y $footer-item-padding;
94
+ display: inline-flex;
95
+ align-items: center;
96
+ justify-content: center;
97
+ text-align: center;
98
+
99
+ &:not(:last-child) {
100
+ border-inline-end: 1px solid
101
+ color-mix(in srgb, currentColor #{$subpart-divider-mix}, transparent);
102
+ }
103
+ }
104
+
29
105
  @include controls.combinations-apply();
106
+ @if $enable-light {
107
+ @include controls.combinations-apply-light();
108
+ }
109
+
110
+ // Under Windows High Contrast the `color-mix(currentColor, transparent)`
111
+ // dividers collapse to a system colour with low alpha that often renders
112
+ // invisible; pin to `CanvasText` so structural separators stay readable
113
+ // (WCAG 1.4.11).
114
+ @media (forced-colors: active) {
115
+ #{$header-selector},
116
+ #{$footer-selector} {
117
+ border-color: CanvasText;
118
+ }
119
+
120
+ #{$footer-item-selector}:not(:last-child) {
121
+ border-inline-end-color: CanvasText;
122
+ }
123
+ }
30
124
  }
31
125
  }
@@ -1,13 +1,52 @@
1
1
  @use "../../variables";
2
2
 
3
+ // Documentation: ../../../docs/src/pages/reference/components/module/card.mdx
4
+
3
5
  $selector: ".card" !default;
6
+
7
+ // BEM-style subparts. The root `.card` orchestrates layout; each subpart owns
8
+ // its own padding so the outer surface can collapse to `padding: 0` when any
9
+ // subpart is detected via `:has()`. A consumer overriding `$selector` is
10
+ // expected to override these in lockstep — the framework does not derive them
11
+ // from `$selector` to keep customisation explicit.
12
+ $header-selector: ".card__header" !default;
13
+ $header-title-selector: ".card__header-title" !default;
14
+ $header-icon-selector: ".card__header-icon" !default;
15
+ $image-selector: ".card__image" !default;
16
+ $content-selector: ".card__content" !default;
17
+ $footer-selector: ".card__footer" !default;
18
+ $footer-item-selector: ".card__footer-item" !default;
19
+
4
20
  $gap: variables.$global-gap !default;
5
21
  $border-radius: variables.$global-border-radius !default;
6
22
  $default-combination: variables.$color-combination-default !default;
7
23
 
24
+ // Local toggle for `.is-<combo>.is-light` emission. Derived from the
25
+ // framework-wide `$feature-light-variants` flag — see
26
+ // `variables/_feature.scss` for the cross-component rationale.
27
+ $enable-light: variables.$feature-light-variants !default;
28
+
8
29
  // Opt-in container-query host. When non-null, the plugin emits
9
30
  // `container-type: inline-size; container-name: <value>;` on the card so
10
31
  // consumers can scope their own `containerFrom(...)` rules to card width
11
32
  // instead of the viewport. The framework itself emits no container-query
12
33
  // rules for card today; this is a hook for downstream code.
13
34
  $container-name: null !default;
35
+
36
+ // Subpart knobs. Sized off `$global-*` / `$size-*` so a consumer retuning the
37
+ // framework's spacing scale at the root carries through to card structure.
38
+ $header-padding-y: variables.$size-small !default;
39
+ $header-padding-x: variables.$global-gap !default;
40
+ $header-title-weight: 600 !default;
41
+ $header-min-height: variables.$global-min-touch-target !default;
42
+ $content-padding: variables.$global-gap !default;
43
+ $footer-padding-y: variables.$size-small !default;
44
+ $footer-item-padding: variables.$size-small !default;
45
+
46
+ // Divider opacity for header / footer separators and inter-footer-item rules.
47
+ // Mixed against `currentColor` so the divider tracks the surface fg through
48
+ // theme switches and `.is-*` combinations — no separate token needed.
49
+ // Defaults to `$global-subtle-border-mix` so card subpart dividers and the
50
+ // card outer border / popover / dropdown / modal borders all track the same
51
+ // global tint when a consumer retunes the framework.
52
+ $subpart-divider-mix: variables.$global-subtle-border-mix !default;
@@ -0,0 +1,2 @@
1
+ @forward "variables";
2
+ @forward "plugin";
@@ -0,0 +1,155 @@
1
+ @use "sass:list";
2
+ @use "variables" as *;
3
+ @use "../../variables";
4
+ @use "../../helper/controls-internal" as controls;
5
+
6
+ // Documentation: ../../../docs/src/pages/reference/components/module/dropdown.mdx
7
+
8
+ @if variables.$feature-module-dropdown {
9
+ #{$selector} {
10
+ position: relative;
11
+ display: inline-block;
12
+
13
+ // Visually hide the toggle but keep it focusable / clickable via the
14
+ // paired <label for>. Same clip-rect technique as `tabs/_plugin.scss`.
15
+ #{$toggle-selector} {
16
+ position: absolute;
17
+ width: 1px;
18
+ height: 1px;
19
+ padding: 0;
20
+ margin: -1px;
21
+ overflow: hidden;
22
+ clip: rect(0, 0, 0, 0);
23
+ white-space: nowrap;
24
+ border: 0;
25
+ }
26
+
27
+ #{$trigger-selector} {
28
+ display: inline-block;
29
+ padding: $item-padding-y $item-padding-x;
30
+ border-radius: $border-radius;
31
+ cursor: pointer;
32
+ // Reset UA chrome so <button> and <label> render identically.
33
+ appearance: none;
34
+ background: transparent;
35
+ color: inherit;
36
+ font: inherit;
37
+ border: 0;
38
+ text-decoration: none;
39
+ user-select: none;
40
+
41
+ &:hover {
42
+ background: $hover-bg;
43
+ }
44
+ }
45
+
46
+ #{$toggle-selector}:focus-visible + #{$trigger-selector} {
47
+ @include controls.focus-ring();
48
+ }
49
+
50
+ #{$menu-selector} {
51
+ display: none;
52
+ position: absolute;
53
+ inset-block-start: calc(100% + #{$offset});
54
+ inset-inline-start: 0;
55
+ min-width: $min-width;
56
+ padding: $padding;
57
+ margin: 0;
58
+ list-style: none;
59
+ border-radius: $border-radius;
60
+ @include variables.backgroundColor(
61
+ dropdown-bg,
62
+ var(--kc-bg, #{list.nth($default-combination, 1)}),
63
+ );
64
+ @include variables.textColor(
65
+ dropdown-fg,
66
+ var(--kc-fg, #{list.nth($default-combination, 2)}),
67
+ );
68
+ border: 1px solid
69
+ color-mix(in srgb, currentColor #{$border-mix}, transparent);
70
+ box-shadow: 0 4px 12px color-mix(in srgb, currentColor 18%, transparent);
71
+ z-index: $z-index;
72
+
73
+ a,
74
+ button {
75
+ display: block;
76
+ padding: $item-padding-y $item-padding-x;
77
+ border-radius: $border-radius;
78
+ color: inherit;
79
+ text-decoration: none;
80
+ background: transparent;
81
+ border: 0;
82
+ font: inherit;
83
+ width: 100%;
84
+ text-align: start;
85
+ cursor: pointer;
86
+
87
+ &:hover {
88
+ background: $hover-bg;
89
+ }
90
+
91
+ &:focus-visible {
92
+ @include controls.focus-ring();
93
+ }
94
+ }
95
+ }
96
+
97
+ &#{$right-modifier} #{$menu-selector} {
98
+ inset-inline-start: auto;
99
+ inset-inline-end: 0;
100
+ }
101
+
102
+ &#{$up-modifier} #{$menu-selector} {
103
+ inset-block-start: auto;
104
+ inset-block-end: calc(100% + #{$offset});
105
+ }
106
+
107
+ @if $arrow {
108
+ #{$trigger-selector}::after {
109
+ content: "";
110
+ display: inline-block;
111
+ margin-inline-start: $arrow-gap;
112
+ width: 0;
113
+ height: 0;
114
+ border-style: solid;
115
+ border-color: currentColor transparent transparent;
116
+ border-width: $arrow-size $arrow-size 0;
117
+ vertical-align: middle;
118
+ }
119
+
120
+ &#{$up-modifier} #{$trigger-selector}::after {
121
+ border-color: transparent transparent currentColor;
122
+ border-width: 0 $arrow-size $arrow-size;
123
+ }
124
+ }
125
+
126
+ @if variables.has-controls("css", $controls) {
127
+ &:has(#{$toggle-selector}:checked) #{$menu-selector} {
128
+ display: block;
129
+ }
130
+ }
131
+
132
+ @if variables.has-controls("js", $controls) {
133
+ &:has([aria-expanded="true"]) #{$menu-selector},
134
+ &#{$active-modifier} #{$menu-selector} {
135
+ display: block;
136
+ }
137
+ }
138
+
139
+ @if variables.has-controls("css", $controls) {
140
+ &#{$hoverable-modifier} {
141
+ &:hover #{$menu-selector},
142
+ &:focus-within #{$menu-selector} {
143
+ display: block;
144
+ }
145
+ }
146
+ }
147
+
148
+ @include variables.combinations using ($label, $tuple) {
149
+ #{$menu-selector} {
150
+ @include variables.backgroundColor(#{$label}-bg, list.nth($tuple, 1));
151
+ @include variables.textColor(#{$label}-fg, list.nth($tuple, 2));
152
+ }
153
+ }
154
+ }
155
+ }