@duskmoon-dev/core 1.19.2 → 1.19.3

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/README.md CHANGED
@@ -442,4 +442,4 @@ See [specs/004-oklch-color-system/quickstart.md](./specs/004-oklch-color-system/
442
442
 
443
443
  MIT
444
444
 
445
- <!-- release 34858431649 -->
445
+ <!-- release 34867104439 -->
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Footer Composition Primitive
3
+ * Responsive, content-neutral groups on an MD3 surface.
4
+ */
5
+
6
+ @layer components {
7
+ .footer {
8
+ display: grid;
9
+ grid-template-columns: repeat(auto-fit, minmax(min(12rem, 100%), 1fr));
10
+ gap: var(--footer-gap, 2rem);
11
+ width: 100%;
12
+ padding: var(--footer-padding, 2rem);
13
+ background-color: var(--color-surface-container-low);
14
+ color: var(--color-on-surface);
15
+ }
16
+
17
+ .footer > :where(nav, section, div):not(.footer-horizontal):not(.footer-vertical) {
18
+ display: grid;
19
+ align-content: start;
20
+ gap: 0.75rem;
21
+ }
22
+
23
+ .footer-title {
24
+ color: var(--color-on-surface-variant);
25
+ font-size: 0.75rem;
26
+ font-weight: 600;
27
+ line-height: 1rem;
28
+ letter-spacing: 0.08em;
29
+ text-transform: uppercase;
30
+ }
31
+
32
+ .footer-center {
33
+ place-items: center;
34
+ text-align: center;
35
+ }
36
+
37
+ .footer-horizontal {
38
+ grid-template-columns: none;
39
+ grid-auto-flow: column;
40
+ grid-auto-columns: minmax(0, 1fr);
41
+ align-items: start;
42
+ }
43
+
44
+ .footer-vertical {
45
+ grid-template-columns: minmax(0, 1fr);
46
+ grid-auto-flow: row;
47
+ }
48
+ }
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Hero Composition Primitive
3
+ * Layers a content region and an optional presentation-neutral overlay.
4
+ */
5
+
6
+ @layer components {
7
+ .hero {
8
+ display: grid;
9
+ width: 100%;
10
+ min-width: 0;
11
+ place-items: center;
12
+ isolation: isolate;
13
+ }
14
+
15
+ .hero > * {
16
+ grid-area: 1 / 1;
17
+ }
18
+
19
+ .hero-content {
20
+ z-index: 1;
21
+ display: flex;
22
+ width: min(100%, var(--hero-content-max-width, 80rem));
23
+ min-width: 0;
24
+ align-items: center;
25
+ justify-content: center;
26
+ }
27
+
28
+ .hero-overlay {
29
+ z-index: 0;
30
+ align-self: stretch;
31
+ justify-self: stretch;
32
+ pointer-events: none;
33
+ }
34
+
35
+ .hero-center {
36
+ justify-items: center;
37
+ text-align: center;
38
+ }
39
+
40
+ .hero-start {
41
+ justify-items: start;
42
+ text-align: start;
43
+ }
44
+
45
+ .hero-end {
46
+ justify-items: end;
47
+ text-align: end;
48
+ }
49
+
50
+ .hero-start > .hero-content {
51
+ justify-content: flex-start;
52
+ }
53
+
54
+ .hero-end > .hero-content {
55
+ justify-content: flex-end;
56
+ }
57
+ }
@@ -15794,6 +15794,411 @@
15794
15794
  }
15795
15795
  }
15796
15796
 
15797
+ /**
15798
+ * Footer Composition Primitive
15799
+ * Responsive, content-neutral groups on an MD3 surface.
15800
+ */
15801
+
15802
+ @layer components {
15803
+ .footer {
15804
+ display: grid;
15805
+ grid-template-columns: repeat(auto-fit, minmax(min(12rem, 100%), 1fr));
15806
+ gap: var(--footer-gap, 2rem);
15807
+ width: 100%;
15808
+ padding: var(--footer-padding, 2rem);
15809
+ background-color: var(--color-surface-container-low);
15810
+ color: var(--color-on-surface);
15811
+ }
15812
+
15813
+ .footer > :where(nav, section, div):not(.footer-horizontal):not(.footer-vertical) {
15814
+ display: grid;
15815
+ align-content: start;
15816
+ gap: 0.75rem;
15817
+ }
15818
+
15819
+ .footer-title {
15820
+ color: var(--color-on-surface-variant);
15821
+ font-size: 0.75rem;
15822
+ font-weight: 600;
15823
+ line-height: 1rem;
15824
+ letter-spacing: 0.08em;
15825
+ text-transform: uppercase;
15826
+ }
15827
+
15828
+ .footer-center {
15829
+ place-items: center;
15830
+ text-align: center;
15831
+ }
15832
+
15833
+ .footer-horizontal {
15834
+ grid-template-columns: none;
15835
+ grid-auto-flow: column;
15836
+ grid-auto-columns: minmax(0, 1fr);
15837
+ align-items: start;
15838
+ }
15839
+
15840
+ .footer-vertical {
15841
+ grid-template-columns: minmax(0, 1fr);
15842
+ grid-auto-flow: row;
15843
+ }
15844
+ }
15845
+
15846
+ /**
15847
+ * Hero Composition Primitive
15848
+ * Layers a content region and an optional presentation-neutral overlay.
15849
+ */
15850
+
15851
+ @layer components {
15852
+ .hero {
15853
+ display: grid;
15854
+ width: 100%;
15855
+ min-width: 0;
15856
+ place-items: center;
15857
+ isolation: isolate;
15858
+ }
15859
+
15860
+ .hero > * {
15861
+ grid-area: 1 / 1;
15862
+ }
15863
+
15864
+ .hero-content {
15865
+ z-index: 1;
15866
+ display: flex;
15867
+ width: min(100%, var(--hero-content-max-width, 80rem));
15868
+ min-width: 0;
15869
+ align-items: center;
15870
+ justify-content: center;
15871
+ }
15872
+
15873
+ .hero-overlay {
15874
+ z-index: 0;
15875
+ align-self: stretch;
15876
+ justify-self: stretch;
15877
+ pointer-events: none;
15878
+ }
15879
+
15880
+ .hero-center {
15881
+ justify-items: center;
15882
+ text-align: center;
15883
+ }
15884
+
15885
+ .hero-start {
15886
+ justify-items: start;
15887
+ text-align: start;
15888
+ }
15889
+
15890
+ .hero-end {
15891
+ justify-items: end;
15892
+ text-align: end;
15893
+ }
15894
+
15895
+ .hero-start > .hero-content {
15896
+ justify-content: flex-start;
15897
+ }
15898
+
15899
+ .hero-end > .hero-content {
15900
+ justify-content: flex-end;
15901
+ }
15902
+ }
15903
+
15904
+ /**
15905
+ * Indicator Composition Primitive
15906
+ * Positions arbitrary content around an inline-sized anchor.
15907
+ */
15908
+
15909
+ @layer components {
15910
+ .indicator {
15911
+ position: relative;
15912
+ display: inline-grid;
15913
+ width: max-content;
15914
+ max-width: 100%;
15915
+ }
15916
+
15917
+ .indicator-item {
15918
+ --indicator-block: 0%;
15919
+ --indicator-inline: 0%;
15920
+ --indicator-x: 50%;
15921
+ --indicator-y: -50%;
15922
+ position: absolute;
15923
+ z-index: 1;
15924
+ inset-block-start: var(--indicator-block);
15925
+ inset-inline-end: var(--indicator-inline);
15926
+ translate: var(--indicator-x) var(--indicator-y);
15927
+ }
15928
+
15929
+ .indicator-top {
15930
+ --indicator-block: 0%;
15931
+ --indicator-y: -50%;
15932
+ }
15933
+
15934
+ .indicator-middle {
15935
+ --indicator-block: 50%;
15936
+ --indicator-y: -50%;
15937
+ }
15938
+
15939
+ .indicator-bottom {
15940
+ --indicator-block: 100%;
15941
+ --indicator-y: -50%;
15942
+ }
15943
+
15944
+ .indicator-start {
15945
+ --indicator-inline: 100%;
15946
+ --indicator-x: 50%;
15947
+ }
15948
+
15949
+ .indicator-center {
15950
+ --indicator-inline: 50%;
15951
+ --indicator-x: 50%;
15952
+ }
15953
+
15954
+ .indicator-end {
15955
+ --indicator-inline: 0%;
15956
+ --indicator-x: 50%;
15957
+ }
15958
+
15959
+ :dir(rtl) .indicator-item {
15960
+ --indicator-x: -50%;
15961
+ }
15962
+
15963
+ :dir(rtl) .indicator-start {
15964
+ --indicator-x: -50%;
15965
+ }
15966
+ }
15967
+
15968
+ /**
15969
+ * Join Composition Primitive
15970
+ * Visually connects arbitrary adjacent controls.
15971
+ */
15972
+
15973
+ @layer components {
15974
+ .join {
15975
+ display: inline-flex;
15976
+ align-items: stretch;
15977
+ flex-direction: row;
15978
+ width: max-content;
15979
+ max-width: 100%;
15980
+ vertical-align: middle;
15981
+ }
15982
+
15983
+ .join > .join-item {
15984
+ position: relative;
15985
+ flex: 0 1 auto;
15986
+ }
15987
+
15988
+ .join > .join-item:hover,
15989
+ .join > .join-item:focus,
15990
+ .join > .join-item:focus-within {
15991
+ z-index: 1;
15992
+ }
15993
+
15994
+ :is(.join, .join-horizontal) > .join-item:not(:first-child) {
15995
+ margin-inline-start: -1px;
15996
+ }
15997
+
15998
+ :is(.join, .join-horizontal) > .join-item:not(:first-child):not(:last-child) {
15999
+ border-radius: 0;
16000
+ }
16001
+
16002
+ :is(.join, .join-horizontal) > .join-item:first-child:not(:last-child) {
16003
+ border-start-end-radius: 0;
16004
+ border-end-end-radius: 0;
16005
+ }
16006
+
16007
+ :is(.join, .join-horizontal) > .join-item:last-child:not(:first-child) {
16008
+ border-start-start-radius: 0;
16009
+ border-end-start-radius: 0;
16010
+ }
16011
+
16012
+ .join-vertical {
16013
+ flex-direction: column;
16014
+ }
16015
+
16016
+ .join-vertical > .join-item {
16017
+ margin-inline-start: 0;
16018
+ }
16019
+
16020
+ .join-vertical > .join-item:not(:first-child) {
16021
+ margin-block-start: -1px;
16022
+ }
16023
+
16024
+ .join-vertical > .join-item:not(:first-child):not(:last-child) {
16025
+ border-radius: 0;
16026
+ }
16027
+
16028
+ .join-vertical > .join-item:first-child:not(:last-child) {
16029
+ border-end-start-radius: 0;
16030
+ border-end-end-radius: 0;
16031
+ }
16032
+
16033
+ .join-vertical > .join-item:last-child:not(:first-child) {
16034
+ border-start-start-radius: 0;
16035
+ border-start-end-radius: 0;
16036
+ }
16037
+ }
16038
+
16039
+ /**
16040
+ * Mask Composition Primitive
16041
+ * Small, dependency-free catalog of reusable clipping shapes.
16042
+ */
16043
+
16044
+ @layer components {
16045
+ .mask {
16046
+ display: inline-block;
16047
+ max-width: 100%;
16048
+ overflow: hidden;
16049
+ vertical-align: middle;
16050
+ object-fit: cover;
16051
+ }
16052
+
16053
+ .mask-circle {
16054
+ clip-path: circle(50% at 50% 50%);
16055
+ }
16056
+
16057
+ .mask-squircle {
16058
+ clip-path: inset(0 round 28%);
16059
+ }
16060
+
16061
+ .mask-square {
16062
+ clip-path: inset(0);
16063
+ }
16064
+
16065
+ .mask-diamond {
16066
+ clip-path: polygon(50% 0, 100% 50%, 50% 100%, 0 50%);
16067
+ }
16068
+
16069
+ .mask-hexagon {
16070
+ clip-path: polygon(25% 6.7%, 75% 6.7%, 100% 50%, 75% 93.3%, 25% 93.3%, 0 50%);
16071
+ }
16072
+
16073
+ .mask-triangle {
16074
+ clip-path: polygon(50% 0, 100% 100%, 0 100%);
16075
+ }
16076
+ }
16077
+
16078
+ /**
16079
+ * Sidebar Layout Composition Primitive
16080
+ * Persistent, responsive sidebar + content grid; application code owns state.
16081
+ */
16082
+
16083
+ @layer components {
16084
+ .sidebar-layout {
16085
+ --sidebar-layout-width: 17.5rem;
16086
+ --sidebar-layout-compact-width: 5rem;
16087
+ container-type: inline-size;
16088
+ container-name: sidebar-layout;
16089
+ display: grid;
16090
+ grid-template-columns: auto minmax(0, 1fr);
16091
+ grid-template-areas: "sidebar content";
16092
+ width: 100%;
16093
+ min-width: 0;
16094
+ min-height: 0;
16095
+ background-color: var(--color-surface);
16096
+ color: var(--color-on-surface);
16097
+ }
16098
+
16099
+ .sidebar-layout-sidebar {
16100
+ display: none;
16101
+ grid-area: sidebar;
16102
+ width: var(--sidebar-layout-width);
16103
+ min-width: 0;
16104
+ overflow: hidden;
16105
+ background-color: var(--color-surface-container-low);
16106
+ color: var(--color-on-surface);
16107
+ border-inline-end: 1px solid var(--color-outline-variant);
16108
+ }
16109
+
16110
+ .sidebar-layout-content {
16111
+ grid-area: content;
16112
+ min-width: 0;
16113
+ }
16114
+
16115
+ .sidebar-layout-start {
16116
+ grid-template-columns: auto minmax(0, 1fr);
16117
+ grid-template-areas: "sidebar content";
16118
+ }
16119
+
16120
+ .sidebar-layout-end {
16121
+ grid-template-columns: minmax(0, 1fr) auto;
16122
+ grid-template-areas: "content sidebar";
16123
+ }
16124
+
16125
+ .sidebar-layout-end > .sidebar-layout-sidebar {
16126
+ border-inline-start: 1px solid var(--color-outline-variant);
16127
+ border-inline-end: 0;
16128
+ }
16129
+
16130
+ @container sidebar-layout (min-width: 48rem) {
16131
+ .sidebar-layout-sidebar {
16132
+ display: block;
16133
+ }
16134
+ }
16135
+
16136
+ .sidebar-layout-compact > .sidebar-layout-sidebar {
16137
+ width: var(--sidebar-layout-compact-width);
16138
+ }
16139
+
16140
+ .sidebar-layout-hidden > .sidebar-layout-sidebar {
16141
+ display: none;
16142
+ }
16143
+ }
16144
+
16145
+ /**
16146
+ * Stack Composition Primitive
16147
+ * Overlaps arbitrary children in one intrinsic CSS Grid area.
16148
+ */
16149
+
16150
+ @layer components {
16151
+ .stack {
16152
+ --stack-inline-offset: 0;
16153
+ --stack-block-offset: 0.375rem;
16154
+ display: inline-grid;
16155
+ place-items: stretch;
16156
+ isolation: isolate;
16157
+ }
16158
+
16159
+ .stack > * {
16160
+ grid-area: 1 / 1;
16161
+ position: relative;
16162
+ min-width: 0;
16163
+ }
16164
+
16165
+ .stack > :first-child {
16166
+ z-index: 3;
16167
+ }
16168
+
16169
+ .stack > :nth-child(2) {
16170
+ z-index: 2;
16171
+ inset-inline-start: var(--stack-inline-offset);
16172
+ inset-block-start: var(--stack-block-offset);
16173
+ }
16174
+
16175
+ .stack > :nth-child(n + 3) {
16176
+ z-index: 1;
16177
+ inset-inline-start: calc(var(--stack-inline-offset) * 2);
16178
+ inset-block-start: calc(var(--stack-block-offset) * 2);
16179
+ }
16180
+
16181
+ .stack-top {
16182
+ --stack-inline-offset: 0;
16183
+ --stack-block-offset: -0.375rem;
16184
+ }
16185
+
16186
+ .stack-bottom {
16187
+ --stack-inline-offset: 0;
16188
+ --stack-block-offset: 0.375rem;
16189
+ }
16190
+
16191
+ .stack-start {
16192
+ --stack-inline-offset: -0.375rem;
16193
+ --stack-block-offset: 0;
16194
+ }
16195
+
16196
+ .stack-end {
16197
+ --stack-inline-offset: 0.375rem;
16198
+ --stack-block-offset: 0;
16199
+ }
16200
+ }
16201
+
15797
16202
  /**
15798
16203
  * Home Page Layout
15799
16204
  * App-bar-led public application shell driven by its containing width.
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Indicator Composition Primitive
3
+ * Positions arbitrary content around an inline-sized anchor.
4
+ */
5
+
6
+ @layer components {
7
+ .indicator {
8
+ position: relative;
9
+ display: inline-grid;
10
+ width: max-content;
11
+ max-width: 100%;
12
+ }
13
+
14
+ .indicator-item {
15
+ --indicator-block: 0%;
16
+ --indicator-inline: 0%;
17
+ --indicator-x: 50%;
18
+ --indicator-y: -50%;
19
+ position: absolute;
20
+ z-index: 1;
21
+ inset-block-start: var(--indicator-block);
22
+ inset-inline-end: var(--indicator-inline);
23
+ translate: var(--indicator-x) var(--indicator-y);
24
+ }
25
+
26
+ .indicator-top {
27
+ --indicator-block: 0%;
28
+ --indicator-y: -50%;
29
+ }
30
+
31
+ .indicator-middle {
32
+ --indicator-block: 50%;
33
+ --indicator-y: -50%;
34
+ }
35
+
36
+ .indicator-bottom {
37
+ --indicator-block: 100%;
38
+ --indicator-y: -50%;
39
+ }
40
+
41
+ .indicator-start {
42
+ --indicator-inline: 100%;
43
+ --indicator-x: 50%;
44
+ }
45
+
46
+ .indicator-center {
47
+ --indicator-inline: 50%;
48
+ --indicator-x: 50%;
49
+ }
50
+
51
+ .indicator-end {
52
+ --indicator-inline: 0%;
53
+ --indicator-x: 50%;
54
+ }
55
+
56
+ :dir(rtl) .indicator-item {
57
+ --indicator-x: -50%;
58
+ }
59
+
60
+ :dir(rtl) .indicator-start {
61
+ --indicator-x: -50%;
62
+ }
63
+ }
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Join Composition Primitive
3
+ * Visually connects arbitrary adjacent controls.
4
+ */
5
+
6
+ @layer components {
7
+ .join {
8
+ display: inline-flex;
9
+ align-items: stretch;
10
+ flex-direction: row;
11
+ width: max-content;
12
+ max-width: 100%;
13
+ vertical-align: middle;
14
+ }
15
+
16
+ .join > .join-item {
17
+ position: relative;
18
+ flex: 0 1 auto;
19
+ }
20
+
21
+ .join > .join-item:hover,
22
+ .join > .join-item:focus,
23
+ .join > .join-item:focus-within {
24
+ z-index: 1;
25
+ }
26
+
27
+ :is(.join, .join-horizontal) > .join-item:not(:first-child) {
28
+ margin-inline-start: -1px;
29
+ }
30
+
31
+ :is(.join, .join-horizontal) > .join-item:not(:first-child):not(:last-child) {
32
+ border-radius: 0;
33
+ }
34
+
35
+ :is(.join, .join-horizontal) > .join-item:first-child:not(:last-child) {
36
+ border-start-end-radius: 0;
37
+ border-end-end-radius: 0;
38
+ }
39
+
40
+ :is(.join, .join-horizontal) > .join-item:last-child:not(:first-child) {
41
+ border-start-start-radius: 0;
42
+ border-end-start-radius: 0;
43
+ }
44
+
45
+ .join-vertical {
46
+ flex-direction: column;
47
+ }
48
+
49
+ .join-vertical > .join-item {
50
+ margin-inline-start: 0;
51
+ }
52
+
53
+ .join-vertical > .join-item:not(:first-child) {
54
+ margin-block-start: -1px;
55
+ }
56
+
57
+ .join-vertical > .join-item:not(:first-child):not(:last-child) {
58
+ border-radius: 0;
59
+ }
60
+
61
+ .join-vertical > .join-item:first-child:not(:last-child) {
62
+ border-end-start-radius: 0;
63
+ border-end-end-radius: 0;
64
+ }
65
+
66
+ .join-vertical > .join-item:last-child:not(:first-child) {
67
+ border-start-start-radius: 0;
68
+ border-start-end-radius: 0;
69
+ }
70
+ }
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Mask Composition Primitive
3
+ * Small, dependency-free catalog of reusable clipping shapes.
4
+ */
5
+
6
+ @layer components {
7
+ .mask {
8
+ display: inline-block;
9
+ max-width: 100%;
10
+ overflow: hidden;
11
+ vertical-align: middle;
12
+ object-fit: cover;
13
+ }
14
+
15
+ .mask-circle {
16
+ clip-path: circle(50% at 50% 50%);
17
+ }
18
+
19
+ .mask-squircle {
20
+ clip-path: inset(0 round 28%);
21
+ }
22
+
23
+ .mask-square {
24
+ clip-path: inset(0);
25
+ }
26
+
27
+ .mask-diamond {
28
+ clip-path: polygon(50% 0, 100% 50%, 50% 100%, 0 50%);
29
+ }
30
+
31
+ .mask-hexagon {
32
+ clip-path: polygon(25% 6.7%, 75% 6.7%, 100% 50%, 75% 93.3%, 25% 93.3%, 0 50%);
33
+ }
34
+
35
+ .mask-triangle {
36
+ clip-path: polygon(50% 0, 100% 100%, 0 100%);
37
+ }
38
+ }