@aortl/admin-css 0.16.2 → 0.17.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/CHANGELOG.md CHANGED
@@ -4,6 +4,23 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [0.17.0] - 2026-06-15
8
+
9
+ ### Added
10
+
11
+ - `Separator` component / `.separator` class — a styled `<hr>` with a vertical modifier. (both)
12
+ - `Avatar` and `AvatarGroup` / `.avatar` — image with a no-JS initials fallback, circle/square, `sm`/`md`/`lg`, plus `.indicator` auto-offsets for avatar anchors. (both)
13
+ - Badge soft tinted variants (`soft` / `.badge-soft`) and a dismissible remove button (`onRemove`, `removeLabel` / `.badge-remove`). (both)
14
+ - Alert trailing action slot (`action` / `Alert.Action` / `.alert-action`). (both)
15
+ - In-field input icons — `icon` / `iconTrailing` on `Input`, `.input-icon` wrapper. (both)
16
+ - Card media slot (`media` / `Card.Media` / `.card-media`) and scroll region (`scroll` on `Card.Container` / `.card-scroll`). (both)
17
+ - BrandTile `lg` size, soft tint variants, and bordered image tiles. (both)
18
+
19
+ ### Changed
20
+
21
+ - `.link` inside an `.alert` inherits the variant's content color instead of the link blue. (css)
22
+ - `tfoot` rows are styled by default — semibold cells with a strong divider above the first footer row (previously unstyled). (css)
23
+
7
24
  ## [0.16.2] - 2026-06-11
8
25
 
9
26
  - Add a changelog following the Keep a Changelog format.
@@ -45,10 +62,11 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
45
62
  - Make `primary` a high-contrast neutral and move blue to `info`. (both)
46
63
  - Use solid color fills for `Alert` and `Badge` status variants. (both)
47
64
 
48
- [Unreleased]: https://github.com/Digital-Udvikling/admin-design-system/compare/v0.16.2...HEAD
65
+ [Unreleased]: https://github.com/Digital-Udvikling/admin-design-system/compare/v0.17.0...HEAD
49
66
  [0.16.1]: https://github.com/Digital-Udvikling/admin-design-system/compare/v0.16.0...v0.16.1
50
67
  [0.16.0]: https://github.com/Digital-Udvikling/admin-design-system/compare/v0.15.1...v0.16.0
51
68
  [0.15.1]: https://github.com/Digital-Udvikling/admin-design-system/compare/v0.15.0...v0.15.1
52
69
  [0.15.0]: https://github.com/Digital-Udvikling/admin-design-system/releases/tag/v0.15.0
53
70
 
71
+ [0.17.0]: https://github.com/Digital-Udvikling/admin-design-system/compare/v0.16.2...v0.17.0
54
72
  [0.16.2]: https://github.com/Digital-Udvikling/admin-design-system/releases/tag/v0.16.2
package/dist/admin.css CHANGED
@@ -25,6 +25,7 @@
25
25
  --font-weight-medium: 500;
26
26
  --font-weight-semibold: 600;
27
27
  --font-weight-bold: 700;
28
+ --tracking-tight: -0.025em;
28
29
  --tracking-wide: 0.025em;
29
30
  --leading-tight: 1.25;
30
31
  --leading-snug: 1.375;
@@ -417,6 +418,9 @@
417
418
  max-width: 96rem;
418
419
  }
419
420
  }
421
+ .my-4 {
422
+ margin-block: calc(var(--spacing) * 4);
423
+ }
420
424
  .block {
421
425
  display: block;
422
426
  }
@@ -696,11 +700,21 @@
696
700
  row-gap: 0.25rem;
697
701
  align-items: center;
698
702
  }
703
+ .alert:has(> .alert-action) {
704
+ display: grid;
705
+ grid-template-columns: minmax(0, 1fr) auto;
706
+ column-gap: 0.5rem;
707
+ row-gap: 0.25rem;
708
+ align-items: center;
709
+ }
710
+ .alert:has(> :is(i, svg):first-child):has(> .alert-action) {
711
+ grid-template-columns: auto minmax(0, 1fr) auto;
712
+ }
699
713
  .alert > :is(i, svg):first-child {
700
714
  font-size: 1rem;
701
715
  line-height: 1.25;
702
716
  }
703
- .alert:has(> :is(i, svg):first-child):has(> .alert-title) {
717
+ .alert:has(> .alert-title):is(:has(> :is(i, svg):first-child), :has(> .alert-action)) {
704
718
  grid-template-rows: auto auto;
705
719
  align-items: start;
706
720
  }
@@ -708,9 +722,20 @@
708
722
  grid-row: 1 / -1;
709
723
  }
710
724
  .alert > :is(.alert-title, .alert-description) {
711
- grid-column: 2;
712
725
  min-width: 0;
713
726
  }
727
+ .alert:has(> :is(i, svg):first-child) > :is(.alert-title, .alert-description) {
728
+ grid-column: 2;
729
+ }
730
+ .alert > .alert-action {
731
+ --tw-font-weight: var(--font-weight-medium);
732
+ font-weight: var(--font-weight-medium);
733
+ white-space: nowrap;
734
+ grid-column: -2;
735
+ grid-row: 1 / -1;
736
+ justify-self: end;
737
+ align-self: center;
738
+ }
714
739
  .alert-info {
715
740
  border-color: var(--color-info);
716
741
  background-color: var(--color-info);
@@ -738,6 +763,22 @@
738
763
  .alert-description {
739
764
  opacity: 0.85;
740
765
  }
766
+ .alert .link {
767
+ color: currentcolor;
768
+ &:hover {
769
+ @media (hover: hover) {
770
+ color: currentcolor;
771
+ }
772
+ }
773
+ &:hover {
774
+ @media (hover: hover) {
775
+ opacity: 85%;
776
+ }
777
+ }
778
+ &:focus-visible {
779
+ outline-color: currentcolor;
780
+ }
781
+ }
741
782
  }
742
783
  @layer components {
743
784
  .app-shell {
@@ -858,6 +899,74 @@
858
899
  background-color: var(--color-primary);
859
900
  color: var(--color-primary-content);
860
901
  }
902
+ .badge-soft.badge-info {
903
+ border-color: var(--color-info-muted);
904
+ background-color: var(--color-info-muted);
905
+ color: var(--color-info);
906
+ }
907
+ .badge-soft.badge-success {
908
+ border-color: var(--color-success-muted);
909
+ background-color: var(--color-success-muted);
910
+ color: var(--color-success);
911
+ }
912
+ .badge-soft.badge-warning {
913
+ border-color: var(--color-warning-muted);
914
+ background-color: var(--color-warning-muted);
915
+ color: var(--color-text);
916
+ }
917
+ .badge-soft.badge-danger {
918
+ border-color: var(--color-danger-muted);
919
+ background-color: var(--color-danger-muted);
920
+ color: var(--color-danger);
921
+ }
922
+ .badge-soft.badge-primary {
923
+ border-color: var(--color-primary-muted);
924
+ background-color: var(--color-primary-muted);
925
+ color: var(--color-text);
926
+ }
927
+ .badge-remove {
928
+ margin-right: calc(var(--spacing) * -1);
929
+ display: inline-flex;
930
+ width: calc(var(--spacing) * 3.5);
931
+ height: calc(var(--spacing) * 3.5);
932
+ flex-shrink: 0;
933
+ cursor: pointer;
934
+ align-items: center;
935
+ justify-content: center;
936
+ border-radius: calc(infinity * 1px);
937
+ color: inherit;
938
+ transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to;
939
+ transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));
940
+ transition-duration: var(--tw-duration, var(--default-transition-duration));
941
+ --tw-duration: 150ms;
942
+ transition-duration: 150ms;
943
+ &:focus-visible {
944
+ outline-style: var(--tw-outline-style);
945
+ outline-width: 2px;
946
+ }
947
+ &:focus-visible {
948
+ outline-offset: 1px;
949
+ }
950
+ &:focus-visible {
951
+ outline-color: var(--color-focus);
952
+ }
953
+ }
954
+ .badge-remove:hover {
955
+ background-color: currentColor;
956
+ @supports (color: color-mix(in lab, red, red)) {
957
+ background-color: color-mix(in oklab, currentColor 15%, transparent);
958
+ }
959
+ }
960
+ .badge-sm .badge-remove {
961
+ margin-right: calc(var(--spacing) * -0.5);
962
+ width: calc(var(--spacing) * 3);
963
+ height: calc(var(--spacing) * 3);
964
+ }
965
+ .badge-lg .badge-remove {
966
+ margin-right: calc(var(--spacing) * -1.5);
967
+ width: calc(var(--spacing) * 4.5);
968
+ height: calc(var(--spacing) * 4.5);
969
+ }
861
970
  .badge-sm {
862
971
  height: calc(var(--spacing) * 4);
863
972
  gap: calc(var(--spacing) * 0.5);
@@ -891,6 +1000,106 @@
891
1000
  -webkit-user-select: none;
892
1001
  user-select: none;
893
1002
  }
1003
+ .brand-tile > :is(i, svg) {
1004
+ font-size: 14px;
1005
+ }
1006
+ .brand-tile-lg {
1007
+ width: calc(var(--spacing) * 10);
1008
+ height: calc(var(--spacing) * 10);
1009
+ border-radius: var(--radius-md);
1010
+ font-size: var(--text-sm);
1011
+ line-height: var(--tw-leading, var(--text-sm--line-height));
1012
+ }
1013
+ .brand-tile-lg > :is(i, svg) {
1014
+ font-size: 20px;
1015
+ }
1016
+ .brand-tile-soft {
1017
+ background-color: var(--color-system-accent-muted);
1018
+ color: var(--color-system-accent);
1019
+ }
1020
+ .brand-tile-info {
1021
+ background-color: var(--color-info-muted);
1022
+ color: var(--color-info);
1023
+ }
1024
+ .brand-tile-success {
1025
+ background-color: var(--color-success-muted);
1026
+ color: var(--color-success);
1027
+ }
1028
+ .brand-tile-danger {
1029
+ background-color: var(--color-danger-muted);
1030
+ color: var(--color-danger);
1031
+ }
1032
+ .brand-tile:has(> img) {
1033
+ border-style: var(--tw-border-style);
1034
+ border-width: 1px;
1035
+ border-color: var(--color-border);
1036
+ background-color: var(--color-surface);
1037
+ padding: calc(var(--spacing) * 0.5);
1038
+ }
1039
+ .brand-tile > img {
1040
+ width: 100%;
1041
+ height: 100%;
1042
+ border-radius: inherit;
1043
+ object-fit: contain;
1044
+ }
1045
+ }
1046
+ @layer components {
1047
+ .avatar {
1048
+ position: relative;
1049
+ display: inline-flex;
1050
+ width: calc(var(--spacing) * 8);
1051
+ height: calc(var(--spacing) * 8);
1052
+ flex-shrink: 0;
1053
+ align-items: center;
1054
+ justify-content: center;
1055
+ overflow: hidden;
1056
+ border-radius: calc(infinity * 1px);
1057
+ background-color: var(--color-surface-strong);
1058
+ font-size: var(--text-xs);
1059
+ line-height: var(--tw-leading, var(--text-xs--line-height));
1060
+ --tw-leading: 1;
1061
+ line-height: 1;
1062
+ --tw-font-weight: var(--font-weight-medium);
1063
+ font-weight: var(--font-weight-medium);
1064
+ --tw-tracking: var(--tracking-tight);
1065
+ letter-spacing: var(--tracking-tight);
1066
+ color: var(--color-text-muted);
1067
+ -webkit-user-select: none;
1068
+ user-select: none;
1069
+ }
1070
+ .avatar > img {
1071
+ position: absolute;
1072
+ inset: calc(var(--spacing) * 0);
1073
+ width: 100%;
1074
+ height: 100%;
1075
+ object-fit: cover;
1076
+ }
1077
+ .avatar-square {
1078
+ border-radius: var(--radius-md);
1079
+ }
1080
+ .avatar-sm {
1081
+ width: calc(var(--spacing) * 6);
1082
+ height: calc(var(--spacing) * 6);
1083
+ font-size: 0.625rem;
1084
+ }
1085
+ .avatar-lg {
1086
+ width: calc(var(--spacing) * 10);
1087
+ height: calc(var(--spacing) * 10);
1088
+ font-size: var(--text-sm);
1089
+ line-height: var(--tw-leading, var(--text-sm--line-height));
1090
+ }
1091
+ .avatar-group {
1092
+ display: inline-flex;
1093
+ align-items: center;
1094
+ }
1095
+ .avatar-group > .avatar {
1096
+ --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);
1097
+ box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
1098
+ --tw-ring-color: var(--color-surface);
1099
+ }
1100
+ .avatar-group > .avatar + .avatar {
1101
+ margin-inline-start: calc(var(--spacing) * -2);
1102
+ }
894
1103
  }
895
1104
  @layer components {
896
1105
  .kbd {
@@ -954,6 +1163,18 @@
954
1163
  .indicator:has(> .card) {
955
1164
  --indicator-offset: 6px;
956
1165
  }
1166
+ .indicator:has(> .avatar) {
1167
+ --indicator-offset: 5px;
1168
+ }
1169
+ .indicator:has(> .avatar-sm) {
1170
+ --indicator-offset: 3px;
1171
+ }
1172
+ .indicator:has(> .avatar-lg) {
1173
+ --indicator-offset: 6px;
1174
+ }
1175
+ .indicator:has(> .avatar-square) {
1176
+ --indicator-offset: 2px;
1177
+ }
957
1178
  .indicator-item {
958
1179
  position: absolute;
959
1180
  z-index: 1;
@@ -1387,6 +1608,24 @@
1387
1608
  color: var(--color-success);
1388
1609
  }
1389
1610
  }
1611
+ @layer components {
1612
+ .separator {
1613
+ margin: calc(var(--spacing) * 0);
1614
+ display: block;
1615
+ height: 1px;
1616
+ width: 100%;
1617
+ flex-shrink: 0;
1618
+ border-style: var(--tw-border-style);
1619
+ border-width: 0px;
1620
+ background-color: var(--color-border);
1621
+ }
1622
+ .separator-vertical {
1623
+ height: auto;
1624
+ width: 1px;
1625
+ align-self: stretch;
1626
+ min-height: 1lh;
1627
+ }
1628
+ }
1390
1629
  @layer components {
1391
1630
  .btn {
1392
1631
  display: inline-flex;
@@ -1821,6 +2060,53 @@
1821
2060
  color: var(--color-text-muted);
1822
2061
  }
1823
2062
  }
2063
+ @layer components {
2064
+ .input-icon {
2065
+ position: relative;
2066
+ display: inline-flex;
2067
+ width: 100%;
2068
+ align-items: center;
2069
+ font-size: var(--text-sm);
2070
+ line-height: var(--tw-leading, var(--text-sm--line-height));
2071
+ color: var(--color-text-muted);
2072
+ --input-icon-inset: calc(var(--spacing) * 3);
2073
+ --input-icon-pad: calc(var(--spacing) * 9);
2074
+ }
2075
+ .input-icon:has(> .input-sm) {
2076
+ font-size: var(--text-xs);
2077
+ line-height: var(--tw-leading, var(--text-xs--line-height));
2078
+ --input-icon-inset: calc(var(--spacing) * 2.5);
2079
+ --input-icon-pad: calc(var(--spacing) * 8);
2080
+ }
2081
+ .input-icon:has(> .input-lg) {
2082
+ font-size: var(--text-base);
2083
+ line-height: var(--tw-leading, var(--text-base--line-height));
2084
+ --input-icon-inset: calc(var(--spacing) * 4);
2085
+ --input-icon-pad: calc(var(--spacing) * 10);
2086
+ }
2087
+ .input-icon > :where(i, svg) {
2088
+ pointer-events: none;
2089
+ position: absolute;
2090
+ top: calc(1 / 2 * 100%);
2091
+ --tw-translate-y: calc(calc(1 / 2 * 100%) * -1);
2092
+ translate: var(--tw-translate-x) var(--tw-translate-y);
2093
+ }
2094
+ .input-icon > :where(i, svg):first-child {
2095
+ left: var(--input-icon-inset);
2096
+ }
2097
+ .input-icon > .input ~ :where(i, svg) {
2098
+ right: var(--input-icon-inset);
2099
+ }
2100
+ .input-icon:has(> :where(i, svg):first-child) > .input {
2101
+ padding-left: var(--input-icon-pad);
2102
+ }
2103
+ .input-icon:has(> .input ~ :where(i, svg)) > .input {
2104
+ padding-right: var(--input-icon-pad);
2105
+ }
2106
+ .input-icon:has(> .input:disabled) > :where(i, svg) {
2107
+ opacity: 50%;
2108
+ }
2109
+ }
1824
2110
  @layer components {
1825
2111
  .textarea {
1826
2112
  display: block;
@@ -2570,6 +2856,55 @@
2570
2856
  .card-danger .card-title {
2571
2857
  color: var(--color-danger);
2572
2858
  }
2859
+ .card-media {
2860
+ display: block;
2861
+ width: 100%;
2862
+ flex-shrink: 0;
2863
+ overflow: hidden;
2864
+ }
2865
+ .card-media:first-child {
2866
+ border-top-left-radius: inherit;
2867
+ border-top-right-radius: inherit;
2868
+ }
2869
+ .card-media:last-child {
2870
+ border-bottom-left-radius: inherit;
2871
+ border-bottom-right-radius: inherit;
2872
+ }
2873
+ .card-media > :is(img, video) {
2874
+ display: block;
2875
+ height: 100%;
2876
+ width: 100%;
2877
+ object-fit: cover;
2878
+ }
2879
+ .card-scroll > .card-header {
2880
+ flex-shrink: 0;
2881
+ border-bottom-style: var(--tw-border-style);
2882
+ border-bottom-width: 1px;
2883
+ border-color: var(--color-border);
2884
+ padding-inline: calc(var(--spacing) * 5);
2885
+ padding-block: calc(var(--spacing) * 3);
2886
+ }
2887
+ .card-scroll > .card-body {
2888
+ min-height: calc(var(--spacing) * 0);
2889
+ flex: 1;
2890
+ overflow-y: auto;
2891
+ }
2892
+ .card-scroll > .card-body:last-child {
2893
+ border-bottom-left-radius: inherit;
2894
+ border-bottom-right-radius: inherit;
2895
+ }
2896
+ .card-scroll > .card-actions {
2897
+ flex-shrink: 0;
2898
+ border-top-style: var(--tw-border-style);
2899
+ border-top-width: 1px;
2900
+ border-color: var(--color-border);
2901
+ padding-inline: calc(var(--spacing) * 5);
2902
+ padding-block: calc(var(--spacing) * 3);
2903
+ }
2904
+ .card-compact.card-scroll > :is(.card-header, .card-actions) {
2905
+ padding-inline: calc(var(--spacing) * 3);
2906
+ padding-block: calc(var(--spacing) * 2);
2907
+ }
2573
2908
  }
2574
2909
  @layer components {
2575
2910
  .stat-card {
@@ -3953,6 +4288,15 @@
3953
4288
  white-space: nowrap;
3954
4289
  color: var(--color-text-muted);
3955
4290
  }
4291
+ .table :where(tfoot :is(td, th)) {
4292
+ --tw-font-weight: var(--font-weight-semibold);
4293
+ font-weight: var(--font-weight-semibold);
4294
+ }
4295
+ .table :where(tfoot tr:first-child :is(td, th)) {
4296
+ border-top-style: var(--tw-border-style);
4297
+ border-top-width: 2px;
4298
+ border-top-color: var(--color-border-strong);
4299
+ }
3956
4300
  .table :where(td), .table-cell {
3957
4301
  overflow-wrap: break-word;
3958
4302
  }
@@ -4650,6 +4994,10 @@
4650
4994
  syntax: "*";
4651
4995
  inherits: false;
4652
4996
  }
4997
+ @property --tw-tracking {
4998
+ syntax: "*";
4999
+ inherits: false;
5000
+ }
4653
5001
  @property --tw-translate-x {
4654
5002
  syntax: "*";
4655
5003
  inherits: false;
@@ -4665,10 +5013,6 @@
4665
5013
  inherits: false;
4666
5014
  initial-value: 0;
4667
5015
  }
4668
- @property --tw-tracking {
4669
- syntax: "*";
4670
- inherits: false;
4671
- }
4672
5016
  @layer properties {
4673
5017
  @supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))) {
4674
5018
  *, ::before, ::after, ::backdrop {
@@ -4701,10 +5045,10 @@
4701
5045
  --tw-border-style: solid;
4702
5046
  --tw-outline-style: solid;
4703
5047
  --tw-duration: initial;
5048
+ --tw-tracking: initial;
4704
5049
  --tw-translate-x: 0;
4705
5050
  --tw-translate-y: 0;
4706
5051
  --tw-translate-z: 0;
4707
- --tw-tracking: initial;
4708
5052
  }
4709
5053
  }
4710
5054
  }