@birdycom/omniaui-blocks 0.11.0 → 0.11.2
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/LICENSE +21 -21
- package/README.md +10 -10
- package/blocks/about-timeline.html +23 -23
- package/blocks/app-header.html +32 -32
- package/blocks/app-shell.html +84 -84
- package/blocks/auth-split.html +45 -45
- package/blocks/auth.html +21 -21
- package/blocks/contact-grid.html +38 -38
- package/blocks/cta.html +8 -8
- package/blocks/data-table.html +111 -111
- package/blocks/faq.html +33 -33
- package/blocks/features.html +18 -18
- package/blocks/footer.html +41 -41
- package/blocks/forgot-password.html +34 -34
- package/blocks/form-page.html +28 -28
- package/blocks/hero-code.html +27 -27
- package/blocks/hero-orbit.html +38 -38
- package/blocks/hero-split.html +12 -12
- package/blocks/hero.html +10 -10
- package/blocks/login-01.html +41 -41
- package/blocks/login-02.html +55 -55
- package/blocks/login-03.html +47 -47
- package/blocks/module-header.html +24 -24
- package/blocks/otp-01.html +36 -36
- package/blocks/otp-02.html +46 -46
- package/blocks/page-hero.html +10 -10
- package/blocks/portfolio-grid.html +31 -31
- package/blocks/pricing.html +42 -42
- package/blocks/process.html +19 -19
- package/blocks/product-grid.html +37 -37
- package/blocks/profile-header.html +27 -27
- package/blocks/reset-password.html +45 -45
- package/blocks/showcase.html +27 -27
- package/blocks/sidebar-01.html +56 -56
- package/blocks/sidebar-02.html +55 -55
- package/blocks/sidebar-03.html +53 -53
- package/blocks/sidebar-04.html +56 -56
- package/blocks/sidebar-05.html +68 -68
- package/blocks/signup-01.html +53 -53
- package/blocks/signup-02.html +56 -56
- package/blocks/site-footer.html +39 -39
- package/blocks/site-header.html +14 -14
- package/blocks/spotlight.html +22 -22
- package/blocks/stats-counter.html +15 -15
- package/blocks/stats.html +19 -19
- package/blocks/team-list.html +30 -30
- package/blocks/two-factor.html +33 -33
- package/blocks/wizard-dialog.html +36 -36
- package/dist/blocks.css +371 -343
- package/dist/blocks.min.css +1 -1
- package/dist/parts/site-about-timeline.css +61 -61
- package/dist/parts/site-contact-grid.css +58 -58
- package/dist/parts/site-faq.css +52 -52
- package/dist/parts/site-hero-orbit.css +62 -62
- package/dist/parts/site-portfolio-grid.css +23 -23
- package/dist/parts/site-profile-header.css +77 -77
- package/package.json +55 -55
package/dist/blocks.css
CHANGED
|
@@ -718,13 +718,25 @@
|
|
|
718
718
|
|
|
719
719
|
@media (min-width: 62rem) { .oc-block-authsplit-brand { display: flex; } }
|
|
720
720
|
|
|
721
|
+
/* Photo variant: add .oc-block-authsplit-brand--photo and set --oc-authsplit-photo: url(…) on the panel.
|
|
722
|
+
A dark layer over the photo keeps the logo and quote readable (white text in both themes). */
|
|
723
|
+
.oc-block-authsplit-brand--photo {
|
|
724
|
+
color: var(--color-white-100);
|
|
725
|
+
background:
|
|
726
|
+
linear-gradient(to top, oklch(from var(--color-black-100) l c h / 0.8), oklch(from var(--color-black-100) l c h / 0.15) 55%, oklch(from var(--color-black-100) l c h / 0.5)),
|
|
727
|
+
var(--oc-authsplit-photo, none) center / cover no-repeat,
|
|
728
|
+
var(--oc-primary);
|
|
729
|
+
}
|
|
730
|
+
.oc-block-authsplit-brand--photo .oc-block-authsplit-quote { border-inline-start-color: oklch(from var(--color-white-100) l c h / 0.6); }
|
|
731
|
+
|
|
721
732
|
.oc-block-authsplit-logo { display: inline-flex; align-items: center; gap: 0.75rem; font-size: 1.1rem; font-weight: 600; letter-spacing: -0.01em; color: inherit; text-decoration: none; }
|
|
722
733
|
|
|
723
734
|
.oc-block-authsplit-quote { margin: 0; max-inline-size: 28rem; padding-inline-start: 1.25rem; border-inline-start: 2px solid oklch(from var(--oc-primary-foreground) l c h / 0.55); }
|
|
724
735
|
|
|
725
|
-
|
|
736
|
+
/* color: inherit, so a site-wide p { color } does not turn the quote dark on the panel. */
|
|
737
|
+
.oc-block-authsplit-quote p { margin: 0 0 0.5rem; font-size: 1.1rem; line-height: 1.55; font-weight: 500; color: inherit; }
|
|
726
738
|
|
|
727
|
-
.oc-block-authsplit-quote footer { font-size: 0.875rem; opacity: 0.75; }
|
|
739
|
+
.oc-block-authsplit-quote footer { font-size: 0.875rem; opacity: 0.75; color: inherit; }
|
|
728
740
|
|
|
729
741
|
.oc-block-authsplit-form { display: flex; align-items: center; justify-content: center; padding: 2rem 1rem; }
|
|
730
742
|
|
|
@@ -871,6 +883,9 @@
|
|
|
871
883
|
|
|
872
884
|
.oc-block-authcard-fields { display: flex; flex-direction: column; gap: 1rem; }
|
|
873
885
|
|
|
886
|
+
/* A one-time-code field sits centered under the centered heading: label, cells and hint. */
|
|
887
|
+
.oc-block-authcard-fields .oc-field:has(> .oc-otp) { align-items: center; text-align: center; }
|
|
888
|
+
|
|
874
889
|
.oc-block-authcard-row { display: flex; align-items: center; justify-content: space-between; gap: 0.5rem; font-size: 0.8125rem; }
|
|
875
890
|
|
|
876
891
|
.oc-block-authcard-foot { margin: 0; font-size: 0.875rem; text-align: center; color: var(--oc-muted-foreground); }
|
|
@@ -904,12 +919,6 @@
|
|
|
904
919
|
|
|
905
920
|
.oc-block-authduo-grid { display: grid; min-block-size: 34rem; }
|
|
906
921
|
|
|
907
|
-
@container oc-authduo (min-width: 42rem) {
|
|
908
|
-
.oc-block-authduo-grid { grid-template-columns: 1fr 1fr; }
|
|
909
|
-
.oc-block-authduo-panel { display: flex; }
|
|
910
|
-
.oc-block-authduo--reverse .oc-block-authduo-panel { order: 2; }
|
|
911
|
-
}
|
|
912
|
-
|
|
913
922
|
.oc-block-authduo-panel {
|
|
914
923
|
position: relative;
|
|
915
924
|
display: none;
|
|
@@ -936,6 +945,24 @@
|
|
|
936
945
|
|
|
937
946
|
.oc-block-authduo-panel--muted { color: var(--oc-foreground); background: var(--oc-muted); }
|
|
938
947
|
|
|
948
|
+
/* Photo panel: add .oc-block-authduo-panel--photo and set --oc-authduo-photo: url(…) on the panel.
|
|
949
|
+
A dark layer over the photo keeps the logo and quote readable (white text in both themes). */
|
|
950
|
+
.oc-block-authduo-panel--photo {
|
|
951
|
+
color: var(--color-white-100);
|
|
952
|
+
background:
|
|
953
|
+
linear-gradient(to top, oklch(from var(--color-black-100) l c h / 0.8), oklch(from var(--color-black-100) l c h / 0.15) 55%, oklch(from var(--color-black-100) l c h / 0.5)),
|
|
954
|
+
var(--oc-authduo-photo, none) center / cover no-repeat,
|
|
955
|
+
var(--oc-primary);
|
|
956
|
+
}
|
|
957
|
+
|
|
958
|
+
/* After the base rule: the panel is hidden on narrow containers and shown from 42rem
|
|
959
|
+
(before the base rule, display: none always won and the panel never showed). */
|
|
960
|
+
@container oc-authduo (min-width: 42rem) {
|
|
961
|
+
.oc-block-authduo-grid { grid-template-columns: 1fr 1fr; }
|
|
962
|
+
.oc-block-authduo-panel { display: flex; }
|
|
963
|
+
.oc-block-authduo--reverse .oc-block-authduo-panel { order: 2; }
|
|
964
|
+
}
|
|
965
|
+
|
|
939
966
|
.oc-block-authduo-panel > * { position: relative; }
|
|
940
967
|
|
|
941
968
|
.oc-block-authduo-logo { display: inline-flex; align-items: center; gap: 0.6rem; font-weight: 600; color: inherit; text-decoration: none; }
|
|
@@ -944,9 +971,10 @@
|
|
|
944
971
|
|
|
945
972
|
.oc-block-authduo-quote { margin: 0; max-inline-size: 26rem; }
|
|
946
973
|
|
|
947
|
-
|
|
974
|
+
/* color: inherit, so a site-wide p { color } does not override the panel's text color. */
|
|
975
|
+
.oc-block-authduo-quote p { margin: 0 0 0.5rem; font-size: 1.05rem; line-height: 1.55; font-weight: 500; color: inherit; }
|
|
948
976
|
|
|
949
|
-
.oc-block-authduo-quote footer { font-size: 0.8125rem; opacity: 0.8; }
|
|
977
|
+
.oc-block-authduo-quote footer { font-size: 0.8125rem; opacity: 0.8; color: inherit; }
|
|
950
978
|
|
|
951
979
|
.oc-block-authduo-form { display: grid; place-items: center; padding: 2rem 1.25rem; }
|
|
952
980
|
|
|
@@ -1086,346 +1114,346 @@
|
|
|
1086
1114
|
.oc-block-dash-table { inline-size: 100%; }
|
|
1087
1115
|
|
|
1088
1116
|
/* parts/site-about-timeline.css */
|
|
1089
|
-
/* File: packages/blocks/src/parts/site-about-timeline.css
|
|
1090
|
-
Map: section -> split grid -> media placeholder + badge -> copy -> timeline spacing -> reverse variant
|
|
1091
|
-
About block: a picture next to the story of the company, ending in the timeline component. */
|
|
1092
|
-
|
|
1093
|
-
.oc-block-about {
|
|
1094
|
-
container-type: inline-size;
|
|
1095
|
-
max-inline-size: var(--oc-block-max-width, 1200px);
|
|
1096
|
-
margin-inline: auto;
|
|
1097
|
-
padding: clamp(3rem, 7vw, 5rem) var(--oc-block-gap, 24px);
|
|
1098
|
-
}
|
|
1099
|
-
|
|
1100
|
-
.oc-block-about-inner { display: grid; gap: clamp(2rem, 5vw, 3.5rem); align-items: center; }
|
|
1101
|
-
@container (min-width: 52rem) {
|
|
1102
|
-
.oc-block-about-inner { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); }
|
|
1103
|
-
/* Reverse: picture on the right. */
|
|
1104
|
-
.oc-block-about--reverse .oc-block-about-media { order: 2; }
|
|
1105
|
-
}
|
|
1106
|
-
|
|
1107
|
-
/* Picture: an <img> inside, or the accent gradient placeholder when empty. */
|
|
1108
|
-
.oc-block-about-media {
|
|
1109
|
-
position: relative;
|
|
1110
|
-
margin: 0;
|
|
1111
|
-
aspect-ratio: 4 / 3;
|
|
1112
|
-
border: 1px solid var(--oc-border);
|
|
1113
|
-
border-radius: var(--oc-radius-lg, 1.25rem);
|
|
1114
|
-
background:
|
|
1115
|
-
radial-gradient(circle at 25% 20%, color-mix(in oklch, var(--color-white-50) 28%, transparent), transparent 40%),
|
|
1116
|
-
linear-gradient(140deg, var(--oc-accent-from), var(--oc-accent-to));
|
|
1117
|
-
overflow: hidden;
|
|
1118
|
-
}
|
|
1119
|
-
.oc-block-about-media > img { display: block; inline-size: 100%; block-size: 100%; object-fit: cover; }
|
|
1120
|
-
|
|
1121
|
-
/* Floating badge on the picture ("Since 2012"). */
|
|
1122
|
-
.oc-block-about-badge {
|
|
1123
|
-
position: absolute;
|
|
1124
|
-
inset: auto auto 1rem 1rem;
|
|
1125
|
-
display: grid;
|
|
1126
|
-
padding: 0.75rem 1rem;
|
|
1127
|
-
border: 1px solid var(--oc-border);
|
|
1128
|
-
border-radius: var(--oc-radius-md, 0.75rem);
|
|
1129
|
-
background: color-mix(in oklch, var(--oc-background) 85%, transparent);
|
|
1130
|
-
backdrop-filter: blur(10px);
|
|
1131
|
-
color: var(--oc-muted-foreground);
|
|
1132
|
-
font-size: 0.85rem;
|
|
1133
|
-
}
|
|
1134
|
-
.oc-block-about-badge strong { color: var(--oc-foreground); font-size: 1.4rem; line-height: 1.1; }
|
|
1135
|
-
|
|
1136
|
-
.oc-block-about-title {
|
|
1137
|
-
margin: 0 0 1rem;
|
|
1138
|
-
font-size: clamp(1.75rem, 4vw, 2.6rem);
|
|
1139
|
-
font-weight: 700;
|
|
1140
|
-
line-height: 1.15;
|
|
1141
|
-
letter-spacing: -0.02em;
|
|
1142
|
-
text-wrap: balance;
|
|
1143
|
-
}
|
|
1144
|
-
.oc-block-about-copy > p:not([class]) {
|
|
1145
|
-
margin: 0 0 1rem;
|
|
1146
|
-
color: var(--oc-muted-foreground);
|
|
1147
|
-
line-height: 1.65;
|
|
1148
|
-
}
|
|
1149
|
-
.oc-block-about-copy .oc-timeline { margin-block-start: 1.75rem; }
|
|
1117
|
+
/* File: packages/blocks/src/parts/site-about-timeline.css
|
|
1118
|
+
Map: section -> split grid -> media placeholder + badge -> copy -> timeline spacing -> reverse variant
|
|
1119
|
+
About block: a picture next to the story of the company, ending in the timeline component. */
|
|
1120
|
+
|
|
1121
|
+
.oc-block-about {
|
|
1122
|
+
container-type: inline-size;
|
|
1123
|
+
max-inline-size: var(--oc-block-max-width, 1200px);
|
|
1124
|
+
margin-inline: auto;
|
|
1125
|
+
padding: clamp(3rem, 7vw, 5rem) var(--oc-block-gap, 24px);
|
|
1126
|
+
}
|
|
1127
|
+
|
|
1128
|
+
.oc-block-about-inner { display: grid; gap: clamp(2rem, 5vw, 3.5rem); align-items: center; }
|
|
1129
|
+
@container (min-width: 52rem) {
|
|
1130
|
+
.oc-block-about-inner { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); }
|
|
1131
|
+
/* Reverse: picture on the right. */
|
|
1132
|
+
.oc-block-about--reverse .oc-block-about-media { order: 2; }
|
|
1133
|
+
}
|
|
1134
|
+
|
|
1135
|
+
/* Picture: an <img> inside, or the accent gradient placeholder when empty. */
|
|
1136
|
+
.oc-block-about-media {
|
|
1137
|
+
position: relative;
|
|
1138
|
+
margin: 0;
|
|
1139
|
+
aspect-ratio: 4 / 3;
|
|
1140
|
+
border: 1px solid var(--oc-border);
|
|
1141
|
+
border-radius: var(--oc-radius-lg, 1.25rem);
|
|
1142
|
+
background:
|
|
1143
|
+
radial-gradient(circle at 25% 20%, color-mix(in oklch, var(--color-white-50) 28%, transparent), transparent 40%),
|
|
1144
|
+
linear-gradient(140deg, var(--oc-accent-from), var(--oc-accent-to));
|
|
1145
|
+
overflow: hidden;
|
|
1146
|
+
}
|
|
1147
|
+
.oc-block-about-media > img { display: block; inline-size: 100%; block-size: 100%; object-fit: cover; }
|
|
1148
|
+
|
|
1149
|
+
/* Floating badge on the picture ("Since 2012"). */
|
|
1150
|
+
.oc-block-about-badge {
|
|
1151
|
+
position: absolute;
|
|
1152
|
+
inset: auto auto 1rem 1rem;
|
|
1153
|
+
display: grid;
|
|
1154
|
+
padding: 0.75rem 1rem;
|
|
1155
|
+
border: 1px solid var(--oc-border);
|
|
1156
|
+
border-radius: var(--oc-radius-md, 0.75rem);
|
|
1157
|
+
background: color-mix(in oklch, var(--oc-background) 85%, transparent);
|
|
1158
|
+
backdrop-filter: blur(10px);
|
|
1159
|
+
color: var(--oc-muted-foreground);
|
|
1160
|
+
font-size: 0.85rem;
|
|
1161
|
+
}
|
|
1162
|
+
.oc-block-about-badge strong { color: var(--oc-foreground); font-size: 1.4rem; line-height: 1.1; }
|
|
1163
|
+
|
|
1164
|
+
.oc-block-about-title {
|
|
1165
|
+
margin: 0 0 1rem;
|
|
1166
|
+
font-size: clamp(1.75rem, 4vw, 2.6rem);
|
|
1167
|
+
font-weight: 700;
|
|
1168
|
+
line-height: 1.15;
|
|
1169
|
+
letter-spacing: -0.02em;
|
|
1170
|
+
text-wrap: balance;
|
|
1171
|
+
}
|
|
1172
|
+
.oc-block-about-copy > p:not([class]) {
|
|
1173
|
+
margin: 0 0 1rem;
|
|
1174
|
+
color: var(--oc-muted-foreground);
|
|
1175
|
+
line-height: 1.65;
|
|
1176
|
+
}
|
|
1177
|
+
.oc-block-about-copy .oc-timeline { margin-block-start: 1.75rem; }
|
|
1150
1178
|
|
|
1151
1179
|
/* parts/site-contact-grid.css */
|
|
1152
|
-
/* File: packages/blocks/src/parts/site-contact-grid.css
|
|
1153
|
-
Map: section -> head -> card grid -> card (mark, title, lines) -> plain variant
|
|
1154
|
-
Contact grid block: contact info cards (e-mail, phone, address, hours). */
|
|
1155
|
-
|
|
1156
|
-
.oc-block-contact {
|
|
1157
|
-
max-inline-size: var(--oc-block-max-width, 1200px);
|
|
1158
|
-
margin-inline: auto;
|
|
1159
|
-
padding: clamp(3rem, 7vw, 5rem) var(--oc-block-gap, 24px);
|
|
1160
|
-
}
|
|
1161
|
-
|
|
1162
|
-
.oc-block-contact-head { max-inline-size: 40rem; margin-block-end: 2rem; }
|
|
1163
|
-
.oc-block-contact-heading {
|
|
1164
|
-
margin: 0 0 0.75rem;
|
|
1165
|
-
font-size: clamp(1.75rem, 4vw, 2.5rem);
|
|
1166
|
-
font-weight: 700;
|
|
1167
|
-
letter-spacing: -0.02em;
|
|
1168
|
-
}
|
|
1169
|
-
.oc-block-contact-lead { margin: 0; color: var(--oc-muted-foreground); font-size: 1.05rem; line-height: 1.6; }
|
|
1170
|
-
|
|
1171
|
-
.oc-block-contact-grid {
|
|
1172
|
-
display: grid;
|
|
1173
|
-
grid-template-columns: repeat(auto-fill, minmax(min(100%, 15rem), 1fr));
|
|
1174
|
-
gap: 1.25rem;
|
|
1175
|
-
}
|
|
1176
|
-
|
|
1177
|
-
.oc-block-contact-card {
|
|
1178
|
-
display: grid;
|
|
1179
|
-
align-content: start;
|
|
1180
|
-
gap: 0.35rem;
|
|
1181
|
-
padding: 1.5rem;
|
|
1182
|
-
border: 1px solid var(--oc-border);
|
|
1183
|
-
border-radius: var(--oc-radius-lg, 1.25rem);
|
|
1184
|
-
background: var(--oc-surface);
|
|
1185
|
-
font-style: normal; /* the address card is an <address> */
|
|
1186
|
-
}
|
|
1187
|
-
.oc-block-contact-card > .oc-product-mark { margin-block-end: 0.75rem; }
|
|
1188
|
-
.oc-block-contact-title { margin: 0 0 0.25rem; font-size: 1.05rem; font-weight: 700; }
|
|
1189
|
-
|
|
1190
|
-
/* A line of info. As a link it turns to the foreground color on hover. */
|
|
1191
|
-
.oc-block-contact-line {
|
|
1192
|
-
margin: 0;
|
|
1193
|
-
color: var(--oc-muted-foreground);
|
|
1194
|
-
font-size: 0.95rem;
|
|
1195
|
-
line-height: 1.55;
|
|
1196
|
-
text-decoration: none;
|
|
1197
|
-
overflow-wrap: anywhere;
|
|
1198
|
-
}
|
|
1199
|
-
a.oc-block-contact-line { color: var(--oc-foreground); font-weight: 500; }
|
|
1200
|
-
a.oc-block-contact-line:hover { color: var(--oc-brand-1); }
|
|
1201
|
-
|
|
1202
|
-
/* Plain: no card frames, a thin accent line on top of each item. */
|
|
1203
|
-
.oc-block-contact--plain .oc-block-contact-card {
|
|
1204
|
-
padding: 1.25rem 0 0;
|
|
1205
|
-
border: 0;
|
|
1206
|
-
border-block-start: 2px solid var(--oc-border-strong);
|
|
1207
|
-
border-radius: 0;
|
|
1208
|
-
background: none;
|
|
1209
|
-
}
|
|
1180
|
+
/* File: packages/blocks/src/parts/site-contact-grid.css
|
|
1181
|
+
Map: section -> head -> card grid -> card (mark, title, lines) -> plain variant
|
|
1182
|
+
Contact grid block: contact info cards (e-mail, phone, address, hours). */
|
|
1183
|
+
|
|
1184
|
+
.oc-block-contact {
|
|
1185
|
+
max-inline-size: var(--oc-block-max-width, 1200px);
|
|
1186
|
+
margin-inline: auto;
|
|
1187
|
+
padding: clamp(3rem, 7vw, 5rem) var(--oc-block-gap, 24px);
|
|
1188
|
+
}
|
|
1189
|
+
|
|
1190
|
+
.oc-block-contact-head { max-inline-size: 40rem; margin-block-end: 2rem; }
|
|
1191
|
+
.oc-block-contact-heading {
|
|
1192
|
+
margin: 0 0 0.75rem;
|
|
1193
|
+
font-size: clamp(1.75rem, 4vw, 2.5rem);
|
|
1194
|
+
font-weight: 700;
|
|
1195
|
+
letter-spacing: -0.02em;
|
|
1196
|
+
}
|
|
1197
|
+
.oc-block-contact-lead { margin: 0; color: var(--oc-muted-foreground); font-size: 1.05rem; line-height: 1.6; }
|
|
1198
|
+
|
|
1199
|
+
.oc-block-contact-grid {
|
|
1200
|
+
display: grid;
|
|
1201
|
+
grid-template-columns: repeat(auto-fill, minmax(min(100%, 15rem), 1fr));
|
|
1202
|
+
gap: 1.25rem;
|
|
1203
|
+
}
|
|
1204
|
+
|
|
1205
|
+
.oc-block-contact-card {
|
|
1206
|
+
display: grid;
|
|
1207
|
+
align-content: start;
|
|
1208
|
+
gap: 0.35rem;
|
|
1209
|
+
padding: 1.5rem;
|
|
1210
|
+
border: 1px solid var(--oc-border);
|
|
1211
|
+
border-radius: var(--oc-radius-lg, 1.25rem);
|
|
1212
|
+
background: var(--oc-surface);
|
|
1213
|
+
font-style: normal; /* the address card is an <address> */
|
|
1214
|
+
}
|
|
1215
|
+
.oc-block-contact-card > .oc-product-mark { margin-block-end: 0.75rem; }
|
|
1216
|
+
.oc-block-contact-title { margin: 0 0 0.25rem; font-size: 1.05rem; font-weight: 700; }
|
|
1217
|
+
|
|
1218
|
+
/* A line of info. As a link it turns to the foreground color on hover. */
|
|
1219
|
+
.oc-block-contact-line {
|
|
1220
|
+
margin: 0;
|
|
1221
|
+
color: var(--oc-muted-foreground);
|
|
1222
|
+
font-size: 0.95rem;
|
|
1223
|
+
line-height: 1.55;
|
|
1224
|
+
text-decoration: none;
|
|
1225
|
+
overflow-wrap: anywhere;
|
|
1226
|
+
}
|
|
1227
|
+
a.oc-block-contact-line { color: var(--oc-foreground); font-weight: 500; }
|
|
1228
|
+
a.oc-block-contact-line:hover { color: var(--oc-brand-1); }
|
|
1229
|
+
|
|
1230
|
+
/* Plain: no card frames, a thin accent line on top of each item. */
|
|
1231
|
+
.oc-block-contact--plain .oc-block-contact-card {
|
|
1232
|
+
padding: 1.25rem 0 0;
|
|
1233
|
+
border: 0;
|
|
1234
|
+
border-block-start: 2px solid var(--oc-border-strong);
|
|
1235
|
+
border-radius: 0;
|
|
1236
|
+
background: none;
|
|
1237
|
+
}
|
|
1210
1238
|
|
|
1211
1239
|
/* parts/site-faq.css */
|
|
1212
|
-
/* File: packages/blocks/src/parts/site-faq.css
|
|
1213
|
-
Map: section -> head (eyebrow, title, lead) -> accordion list -> "more" line -> split variant
|
|
1214
|
-
FAQ block: a title plus the accordion component on native <details name="…"> (one item open at a time). */
|
|
1215
|
-
|
|
1216
|
-
.oc-block-faq {
|
|
1217
|
-
container-type: inline-size;
|
|
1218
|
-
max-inline-size: var(--oc-block-max-width, 1200px);
|
|
1219
|
-
margin-inline: auto;
|
|
1220
|
-
padding: clamp(3rem, 7vw, 5rem) var(--oc-block-gap, 24px);
|
|
1221
|
-
}
|
|
1222
|
-
|
|
1223
|
-
.oc-block-faq-inner {
|
|
1224
|
-
display: grid;
|
|
1225
|
-
gap: 2rem;
|
|
1226
|
-
max-inline-size: 48rem;
|
|
1227
|
-
margin-inline: auto;
|
|
1228
|
-
}
|
|
1229
|
-
|
|
1230
|
-
.oc-block-faq-head { text-align: center; }
|
|
1231
|
-
.oc-block-faq-title {
|
|
1232
|
-
margin: 0 0 0.75rem;
|
|
1233
|
-
font-size: clamp(1.75rem, 4vw, 2.5rem);
|
|
1234
|
-
font-weight: 700;
|
|
1235
|
-
letter-spacing: -0.02em;
|
|
1236
|
-
text-wrap: balance;
|
|
1237
|
-
}
|
|
1238
|
-
.oc-block-faq-lead {
|
|
1239
|
-
margin: 0;
|
|
1240
|
-
color: var(--oc-block-text-soft, var(--oc-muted-foreground));
|
|
1241
|
-
font-size: 1.05rem;
|
|
1242
|
-
line-height: 1.6;
|
|
1243
|
-
}
|
|
1244
|
-
|
|
1245
|
-
/* The accordion fills the column (the component default is 46rem wide). */
|
|
1246
|
-
.oc-block-faq-list { --oc-accordion-width: 100%; background: var(--oc-block-surface, var(--oc-card)); }
|
|
1247
|
-
|
|
1248
|
-
.oc-block-faq-more {
|
|
1249
|
-
margin: 0;
|
|
1250
|
-
color: var(--oc-block-text-soft, var(--oc-muted-foreground));
|
|
1251
|
-
text-align: center;
|
|
1252
|
-
}
|
|
1253
|
-
|
|
1254
|
-
/* Split: head on the left, questions on the right (from 48rem container width). */
|
|
1255
|
-
@container (min-width: 48rem) {
|
|
1256
|
-
.oc-block-faq--split .oc-block-faq-inner {
|
|
1257
|
-
grid-template-columns: minmax(0, 2fr) minmax(0, 3fr);
|
|
1258
|
-
align-items: start;
|
|
1259
|
-
max-inline-size: none;
|
|
1260
|
-
}
|
|
1261
|
-
.oc-block-faq--split .oc-block-faq-head { text-align: start; position: sticky; inset-block-start: 1rem; }
|
|
1262
|
-
.oc-block-faq--split .oc-block-faq-more { grid-column: 2; text-align: start; }
|
|
1263
|
-
}
|
|
1240
|
+
/* File: packages/blocks/src/parts/site-faq.css
|
|
1241
|
+
Map: section -> head (eyebrow, title, lead) -> accordion list -> "more" line -> split variant
|
|
1242
|
+
FAQ block: a title plus the accordion component on native <details name="…"> (one item open at a time). */
|
|
1243
|
+
|
|
1244
|
+
.oc-block-faq {
|
|
1245
|
+
container-type: inline-size;
|
|
1246
|
+
max-inline-size: var(--oc-block-max-width, 1200px);
|
|
1247
|
+
margin-inline: auto;
|
|
1248
|
+
padding: clamp(3rem, 7vw, 5rem) var(--oc-block-gap, 24px);
|
|
1249
|
+
}
|
|
1250
|
+
|
|
1251
|
+
.oc-block-faq-inner {
|
|
1252
|
+
display: grid;
|
|
1253
|
+
gap: 2rem;
|
|
1254
|
+
max-inline-size: 48rem;
|
|
1255
|
+
margin-inline: auto;
|
|
1256
|
+
}
|
|
1257
|
+
|
|
1258
|
+
.oc-block-faq-head { text-align: center; }
|
|
1259
|
+
.oc-block-faq-title {
|
|
1260
|
+
margin: 0 0 0.75rem;
|
|
1261
|
+
font-size: clamp(1.75rem, 4vw, 2.5rem);
|
|
1262
|
+
font-weight: 700;
|
|
1263
|
+
letter-spacing: -0.02em;
|
|
1264
|
+
text-wrap: balance;
|
|
1265
|
+
}
|
|
1266
|
+
.oc-block-faq-lead {
|
|
1267
|
+
margin: 0;
|
|
1268
|
+
color: var(--oc-block-text-soft, var(--oc-muted-foreground));
|
|
1269
|
+
font-size: 1.05rem;
|
|
1270
|
+
line-height: 1.6;
|
|
1271
|
+
}
|
|
1272
|
+
|
|
1273
|
+
/* The accordion fills the column (the component default is 46rem wide). */
|
|
1274
|
+
.oc-block-faq-list { --oc-accordion-width: 100%; background: var(--oc-block-surface, var(--oc-card)); }
|
|
1275
|
+
|
|
1276
|
+
.oc-block-faq-more {
|
|
1277
|
+
margin: 0;
|
|
1278
|
+
color: var(--oc-block-text-soft, var(--oc-muted-foreground));
|
|
1279
|
+
text-align: center;
|
|
1280
|
+
}
|
|
1281
|
+
|
|
1282
|
+
/* Split: head on the left, questions on the right (from 48rem container width). */
|
|
1283
|
+
@container (min-width: 48rem) {
|
|
1284
|
+
.oc-block-faq--split .oc-block-faq-inner {
|
|
1285
|
+
grid-template-columns: minmax(0, 2fr) minmax(0, 3fr);
|
|
1286
|
+
align-items: start;
|
|
1287
|
+
max-inline-size: none;
|
|
1288
|
+
}
|
|
1289
|
+
.oc-block-faq--split .oc-block-faq-head { text-align: start; position: sticky; inset-block-start: 1rem; }
|
|
1290
|
+
.oc-block-faq--split .oc-block-faq-more { grid-column: 2; text-align: start; }
|
|
1291
|
+
}
|
|
1264
1292
|
|
|
1265
1293
|
/* parts/site-hero-orbit.css */
|
|
1266
|
-
/* File: packages/blocks/src/parts/site-hero-orbit.css
|
|
1267
|
-
Map: visual (square, container) -> dashed ring that turns -> marks on the ring (stay upright) -> center window -> reduced motion
|
|
1268
|
-
Hero orbit block: hero-code layout where product marks orbit around the code window.
|
|
1269
|
-
Place a mark with style="--oc-orbit-angle: 60deg". The ring turns once per --oc-orbit-duration (default 60s). */
|
|
1270
|
-
|
|
1271
|
-
/* Square stage; container units (cqi) give the ring radius. */
|
|
1272
|
-
.oc-block-orbit-visual {
|
|
1273
|
-
position: relative;
|
|
1274
|
-
container-type: inline-size;
|
|
1275
|
-
display: grid;
|
|
1276
|
-
place-items: center;
|
|
1277
|
-
inline-size: 100%;
|
|
1278
|
-
max-inline-size: 32rem;
|
|
1279
|
-
aspect-ratio: 1;
|
|
1280
|
-
margin-inline: auto;
|
|
1281
|
-
}
|
|
1282
|
-
|
|
1283
|
-
/* The ring: a dashed circle that slowly turns and carries the marks. */
|
|
1284
|
-
.oc-block-orbit-ring {
|
|
1285
|
-
position: absolute;
|
|
1286
|
-
inset: 6%;
|
|
1287
|
-
border: 1px dashed color-mix(in oklch, var(--oc-border-strong) 80%, transparent);
|
|
1288
|
-
border-radius: 50%;
|
|
1289
|
-
animation: oc-orbit-spin var(--oc-orbit-duration, 60s) linear infinite;
|
|
1290
|
-
}
|
|
1291
|
-
/* Second, inner ring for depth (no marks). */
|
|
1292
|
-
.oc-block-orbit-ring::before {
|
|
1293
|
-
content: "";
|
|
1294
|
-
position: absolute;
|
|
1295
|
-
inset: 18%;
|
|
1296
|
-
border: 1px solid color-mix(in oklch, var(--oc-border) 70%, transparent);
|
|
1297
|
-
border-radius: 50%;
|
|
1298
|
-
}
|
|
1299
|
-
|
|
1300
|
-
/* A mark sits on the ring at its angle. Radius = half the ring = 44% of the stage width. */
|
|
1301
|
-
.oc-block-orbit-mark {
|
|
1302
|
-
position: absolute;
|
|
1303
|
-
inset-block-start: 50%;
|
|
1304
|
-
inset-inline-start: 50%;
|
|
1305
|
-
translate: -50% -50%;
|
|
1306
|
-
transform: rotate(var(--oc-orbit-angle, 0deg)) translateX(44cqi) rotate(calc(var(--oc-orbit-angle, 0deg) * -1));
|
|
1307
|
-
}
|
|
1308
|
-
/* The mark turns back as fast as the ring turns, so its glyph stays upright. */
|
|
1309
|
-
.oc-block-orbit-mark > * {
|
|
1310
|
-
display: grid;
|
|
1311
|
-
animation: oc-orbit-spin var(--oc-orbit-duration, 60s) linear infinite reverse;
|
|
1312
|
-
}
|
|
1313
|
-
|
|
1314
|
-
/* Center: the code window (or any visual) above the ring. */
|
|
1315
|
-
.oc-block-orbit-center {
|
|
1316
|
-
position: relative;
|
|
1317
|
-
z-index: 1;
|
|
1318
|
-
inline-size: min(100%, 72cqi);
|
|
1319
|
-
}
|
|
1320
|
-
.oc-block-orbit-center.oc-code-window .oc-code-window__body { font-size: clamp(0.7rem, 2.6cqi, 0.9rem); }
|
|
1321
|
-
|
|
1322
|
-
@keyframes oc-orbit-spin { to { rotate: 360deg; } }
|
|
1323
|
-
|
|
1324
|
-
@media (prefers-reduced-motion: reduce) {
|
|
1325
|
-
.oc-block-orbit-ring,
|
|
1326
|
-
.oc-block-orbit-mark > * { animation: none; }
|
|
1327
|
-
}
|
|
1294
|
+
/* File: packages/blocks/src/parts/site-hero-orbit.css
|
|
1295
|
+
Map: visual (square, container) -> dashed ring that turns -> marks on the ring (stay upright) -> center window -> reduced motion
|
|
1296
|
+
Hero orbit block: hero-code layout where product marks orbit around the code window.
|
|
1297
|
+
Place a mark with style="--oc-orbit-angle: 60deg". The ring turns once per --oc-orbit-duration (default 60s). */
|
|
1298
|
+
|
|
1299
|
+
/* Square stage; container units (cqi) give the ring radius. */
|
|
1300
|
+
.oc-block-orbit-visual {
|
|
1301
|
+
position: relative;
|
|
1302
|
+
container-type: inline-size;
|
|
1303
|
+
display: grid;
|
|
1304
|
+
place-items: center;
|
|
1305
|
+
inline-size: 100%;
|
|
1306
|
+
max-inline-size: 32rem;
|
|
1307
|
+
aspect-ratio: 1;
|
|
1308
|
+
margin-inline: auto;
|
|
1309
|
+
}
|
|
1310
|
+
|
|
1311
|
+
/* The ring: a dashed circle that slowly turns and carries the marks. */
|
|
1312
|
+
.oc-block-orbit-ring {
|
|
1313
|
+
position: absolute;
|
|
1314
|
+
inset: 6%;
|
|
1315
|
+
border: 1px dashed color-mix(in oklch, var(--oc-border-strong) 80%, transparent);
|
|
1316
|
+
border-radius: 50%;
|
|
1317
|
+
animation: oc-orbit-spin var(--oc-orbit-duration, 60s) linear infinite;
|
|
1318
|
+
}
|
|
1319
|
+
/* Second, inner ring for depth (no marks). */
|
|
1320
|
+
.oc-block-orbit-ring::before {
|
|
1321
|
+
content: "";
|
|
1322
|
+
position: absolute;
|
|
1323
|
+
inset: 18%;
|
|
1324
|
+
border: 1px solid color-mix(in oklch, var(--oc-border) 70%, transparent);
|
|
1325
|
+
border-radius: 50%;
|
|
1326
|
+
}
|
|
1327
|
+
|
|
1328
|
+
/* A mark sits on the ring at its angle. Radius = half the ring = 44% of the stage width. */
|
|
1329
|
+
.oc-block-orbit-mark {
|
|
1330
|
+
position: absolute;
|
|
1331
|
+
inset-block-start: 50%;
|
|
1332
|
+
inset-inline-start: 50%;
|
|
1333
|
+
translate: -50% -50%;
|
|
1334
|
+
transform: rotate(var(--oc-orbit-angle, 0deg)) translateX(44cqi) rotate(calc(var(--oc-orbit-angle, 0deg) * -1));
|
|
1335
|
+
}
|
|
1336
|
+
/* The mark turns back as fast as the ring turns, so its glyph stays upright. */
|
|
1337
|
+
.oc-block-orbit-mark > * {
|
|
1338
|
+
display: grid;
|
|
1339
|
+
animation: oc-orbit-spin var(--oc-orbit-duration, 60s) linear infinite reverse;
|
|
1340
|
+
}
|
|
1341
|
+
|
|
1342
|
+
/* Center: the code window (or any visual) above the ring. */
|
|
1343
|
+
.oc-block-orbit-center {
|
|
1344
|
+
position: relative;
|
|
1345
|
+
z-index: 1;
|
|
1346
|
+
inline-size: min(100%, 72cqi);
|
|
1347
|
+
}
|
|
1348
|
+
.oc-block-orbit-center.oc-code-window .oc-code-window__body { font-size: clamp(0.7rem, 2.6cqi, 0.9rem); }
|
|
1349
|
+
|
|
1350
|
+
@keyframes oc-orbit-spin { to { rotate: 360deg; } }
|
|
1351
|
+
|
|
1352
|
+
@media (prefers-reduced-motion: reduce) {
|
|
1353
|
+
.oc-block-orbit-ring,
|
|
1354
|
+
.oc-block-orbit-mark > * { animation: none; }
|
|
1355
|
+
}
|
|
1328
1356
|
|
|
1329
1357
|
/* parts/site-portfolio-grid.css */
|
|
1330
|
-
/* File: packages/blocks/src/parts/site-portfolio-grid.css
|
|
1331
|
-
Map: section -> head (title left, "all projects" link right) -> card grid -> two-column variant
|
|
1332
|
-
Portfolio grid block: a heading and a grid of project-card components. */
|
|
1333
|
-
|
|
1334
|
-
.oc-block-portfolio-head {
|
|
1335
|
-
display: flex;
|
|
1336
|
-
flex-wrap: wrap;
|
|
1337
|
-
align-items: flex-end;
|
|
1338
|
-
justify-content: space-between;
|
|
1339
|
-
gap: 1rem 2rem;
|
|
1340
|
-
margin-block-end: 2rem;
|
|
1341
|
-
}
|
|
1342
|
-
.oc-block-portfolio-head .oc-display { margin-block-end: 0; }
|
|
1343
|
-
.oc-block-portfolio-lead { margin: 0.75rem 0 0; color: var(--oc-muted-foreground); max-inline-size: 36rem; }
|
|
1344
|
-
|
|
1345
|
-
.oc-block-portfolio-grid {
|
|
1346
|
-
display: grid;
|
|
1347
|
-
grid-template-columns: repeat(auto-fill, minmax(min(100%, var(--oc-portfolio-min, 18rem)), 1fr));
|
|
1348
|
-
gap: 1.5rem;
|
|
1349
|
-
}
|
|
1350
|
-
|
|
1351
|
-
/* Two columns: bigger cards (fewer, more important projects). */
|
|
1352
|
-
.oc-block-portfolio--two { --oc-portfolio-min: 26rem; }
|
|
1358
|
+
/* File: packages/blocks/src/parts/site-portfolio-grid.css
|
|
1359
|
+
Map: section -> head (title left, "all projects" link right) -> card grid -> two-column variant
|
|
1360
|
+
Portfolio grid block: a heading and a grid of project-card components. */
|
|
1361
|
+
|
|
1362
|
+
.oc-block-portfolio-head {
|
|
1363
|
+
display: flex;
|
|
1364
|
+
flex-wrap: wrap;
|
|
1365
|
+
align-items: flex-end;
|
|
1366
|
+
justify-content: space-between;
|
|
1367
|
+
gap: 1rem 2rem;
|
|
1368
|
+
margin-block-end: 2rem;
|
|
1369
|
+
}
|
|
1370
|
+
.oc-block-portfolio-head .oc-display { margin-block-end: 0; }
|
|
1371
|
+
.oc-block-portfolio-lead { margin: 0.75rem 0 0; color: var(--oc-muted-foreground); max-inline-size: 36rem; }
|
|
1372
|
+
|
|
1373
|
+
.oc-block-portfolio-grid {
|
|
1374
|
+
display: grid;
|
|
1375
|
+
grid-template-columns: repeat(auto-fill, minmax(min(100%, var(--oc-portfolio-min, 18rem)), 1fr));
|
|
1376
|
+
gap: 1.5rem;
|
|
1377
|
+
}
|
|
1378
|
+
|
|
1379
|
+
/* Two columns: bigger cards (fewer, more important projects). */
|
|
1380
|
+
.oc-block-portfolio--two { --oc-portfolio-min: 26rem; }
|
|
1353
1381
|
|
|
1354
1382
|
/* parts/site-profile-header.css */
|
|
1355
|
-
/* File: packages/blocks/src/parts/site-profile-header.css
|
|
1356
|
-
Map: section -> banner -> bar (overhanging avatar, info, actions) -> tab bar -> compact variant
|
|
1357
|
-
Profile header block: banner, an avatar that overlaps the banner edge, name + meta, actions and link tabs.
|
|
1358
|
-
Banner image: style="--oc-profile-banner: url(...)" (default: an accent gradient). */
|
|
1359
|
-
|
|
1360
|
-
.oc-block-profile {
|
|
1361
|
-
container-type: inline-size;
|
|
1362
|
-
max-inline-size: var(--oc-block-max-width, 1200px);
|
|
1363
|
-
margin-inline: auto;
|
|
1364
|
-
}
|
|
1365
|
-
|
|
1366
|
-
.oc-block-profile-banner {
|
|
1367
|
-
aspect-ratio: 6 / 1;
|
|
1368
|
-
min-block-size: 7rem;
|
|
1369
|
-
border-radius: var(--oc-block-radius, 16px);
|
|
1370
|
-
background:
|
|
1371
|
-
var(--oc-profile-banner, radial-gradient(circle at 85% 30%, color-mix(in oklch, var(--color-white-50) 25%, transparent), transparent 40%)),
|
|
1372
|
-
linear-gradient(120deg, var(--oc-accent-from), var(--oc-accent-to));
|
|
1373
|
-
background-size: cover;
|
|
1374
|
-
background-position: center;
|
|
1375
|
-
}
|
|
1376
|
-
|
|
1377
|
-
.oc-block-profile-bar {
|
|
1378
|
-
display: flex;
|
|
1379
|
-
flex-wrap: wrap;
|
|
1380
|
-
align-items: flex-end;
|
|
1381
|
-
gap: 1rem 1.25rem;
|
|
1382
|
-
padding-inline: clamp(1rem, 3vw, 1.5rem);
|
|
1383
|
-
}
|
|
1384
|
-
|
|
1385
|
-
/* The avatar component, made bigger and pulled up over the banner edge. */
|
|
1386
|
-
.oc-block-profile-avatar.oc-avatar {
|
|
1387
|
-
width: 6.5rem;
|
|
1388
|
-
height: 6.5rem;
|
|
1389
|
-
margin-block-start: -3.25rem;
|
|
1390
|
-
border: 4px solid var(--oc-background);
|
|
1391
|
-
font-size: 2rem;
|
|
1392
|
-
}
|
|
1393
|
-
|
|
1394
|
-
.oc-block-profile-info { flex: 1 1 16rem; min-inline-size: 0; padding-block-start: 0.75rem; }
|
|
1395
|
-
.oc-block-profile-name { margin: 0; font-size: clamp(1.4rem, 3vw, 1.9rem); font-weight: 700; letter-spacing: -0.02em; }
|
|
1396
|
-
.oc-block-profile-meta { margin: 0.2rem 0 0; color: var(--oc-muted-foreground); font-size: 0.9rem; }
|
|
1397
|
-
.oc-block-profile-bio { margin: 0.5rem 0 0; color: var(--oc-muted-foreground); font-size: 0.95rem; max-inline-size: 44rem; }
|
|
1398
|
-
.oc-block-profile-actions { display: flex; flex-wrap: wrap; gap: 0.5rem; }
|
|
1399
|
-
|
|
1400
|
-
/* Tab bar: links; the current one gets aria-current="page". Scrolls sideways on small screens. */
|
|
1401
|
-
.oc-block-profile-tabs {
|
|
1402
|
-
display: flex;
|
|
1403
|
-
gap: 0.25rem;
|
|
1404
|
-
margin-block-start: 1.25rem;
|
|
1405
|
-
padding-inline: clamp(1rem, 3vw, 1.5rem);
|
|
1406
|
-
border-block-end: 1px solid var(--oc-border);
|
|
1407
|
-
overflow-x: auto;
|
|
1408
|
-
scrollbar-width: none;
|
|
1409
|
-
}
|
|
1410
|
-
.oc-block-profile-tab {
|
|
1411
|
-
padding: 0.75rem 1rem;
|
|
1412
|
-
border-block-end: 2px solid transparent;
|
|
1413
|
-
color: var(--oc-muted-foreground);
|
|
1414
|
-
font-size: 0.92rem;
|
|
1415
|
-
font-weight: 500;
|
|
1416
|
-
text-decoration: none;
|
|
1417
|
-
white-space: nowrap;
|
|
1418
|
-
transition: color var(--oc-transition-fast, 150ms), border-color var(--oc-transition-fast, 150ms);
|
|
1419
|
-
}
|
|
1420
|
-
.oc-block-profile-tab:hover { color: var(--oc-foreground); }
|
|
1421
|
-
.oc-block-profile-tab[aria-current="page"] { border-block-end-color: var(--oc-brand-1); color: var(--oc-foreground); }
|
|
1422
|
-
.oc-block-profile-tab:focus-visible { outline: 2px solid var(--oc-ring); outline-offset: -2px; }
|
|
1423
|
-
|
|
1424
|
-
/* Compact: low banner and a smaller avatar. */
|
|
1425
|
-
.oc-block-profile--compact .oc-block-profile-banner { aspect-ratio: 10 / 1; min-block-size: 4.5rem; }
|
|
1426
|
-
.oc-block-profile--compact .oc-block-profile-avatar.oc-avatar { width: 4.5rem; height: 4.5rem; margin-block-start: -2.25rem; font-size: 1.4rem; }
|
|
1427
|
-
|
|
1428
|
-
/* Narrow: the actions go below the info, full width. */
|
|
1429
|
-
@container (max-width: 34rem) {
|
|
1430
|
-
.oc-block-profile-actions { flex-basis: 100%; }
|
|
1431
|
-
}
|
|
1383
|
+
/* File: packages/blocks/src/parts/site-profile-header.css
|
|
1384
|
+
Map: section -> banner -> bar (overhanging avatar, info, actions) -> tab bar -> compact variant
|
|
1385
|
+
Profile header block: banner, an avatar that overlaps the banner edge, name + meta, actions and link tabs.
|
|
1386
|
+
Banner image: style="--oc-profile-banner: url(...)" (default: an accent gradient). */
|
|
1387
|
+
|
|
1388
|
+
.oc-block-profile {
|
|
1389
|
+
container-type: inline-size;
|
|
1390
|
+
max-inline-size: var(--oc-block-max-width, 1200px);
|
|
1391
|
+
margin-inline: auto;
|
|
1392
|
+
}
|
|
1393
|
+
|
|
1394
|
+
.oc-block-profile-banner {
|
|
1395
|
+
aspect-ratio: 6 / 1;
|
|
1396
|
+
min-block-size: 7rem;
|
|
1397
|
+
border-radius: var(--oc-block-radius, 16px);
|
|
1398
|
+
background:
|
|
1399
|
+
var(--oc-profile-banner, radial-gradient(circle at 85% 30%, color-mix(in oklch, var(--color-white-50) 25%, transparent), transparent 40%)),
|
|
1400
|
+
linear-gradient(120deg, var(--oc-accent-from), var(--oc-accent-to));
|
|
1401
|
+
background-size: cover;
|
|
1402
|
+
background-position: center;
|
|
1403
|
+
}
|
|
1404
|
+
|
|
1405
|
+
.oc-block-profile-bar {
|
|
1406
|
+
display: flex;
|
|
1407
|
+
flex-wrap: wrap;
|
|
1408
|
+
align-items: flex-end;
|
|
1409
|
+
gap: 1rem 1.25rem;
|
|
1410
|
+
padding-inline: clamp(1rem, 3vw, 1.5rem);
|
|
1411
|
+
}
|
|
1412
|
+
|
|
1413
|
+
/* The avatar component, made bigger and pulled up over the banner edge. */
|
|
1414
|
+
.oc-block-profile-avatar.oc-avatar {
|
|
1415
|
+
width: 6.5rem;
|
|
1416
|
+
height: 6.5rem;
|
|
1417
|
+
margin-block-start: -3.25rem;
|
|
1418
|
+
border: 4px solid var(--oc-background);
|
|
1419
|
+
font-size: 2rem;
|
|
1420
|
+
}
|
|
1421
|
+
|
|
1422
|
+
.oc-block-profile-info { flex: 1 1 16rem; min-inline-size: 0; padding-block-start: 0.75rem; }
|
|
1423
|
+
.oc-block-profile-name { margin: 0; font-size: clamp(1.4rem, 3vw, 1.9rem); font-weight: 700; letter-spacing: -0.02em; }
|
|
1424
|
+
.oc-block-profile-meta { margin: 0.2rem 0 0; color: var(--oc-muted-foreground); font-size: 0.9rem; }
|
|
1425
|
+
.oc-block-profile-bio { margin: 0.5rem 0 0; color: var(--oc-muted-foreground); font-size: 0.95rem; max-inline-size: 44rem; }
|
|
1426
|
+
.oc-block-profile-actions { display: flex; flex-wrap: wrap; gap: 0.5rem; }
|
|
1427
|
+
|
|
1428
|
+
/* Tab bar: links; the current one gets aria-current="page". Scrolls sideways on small screens. */
|
|
1429
|
+
.oc-block-profile-tabs {
|
|
1430
|
+
display: flex;
|
|
1431
|
+
gap: 0.25rem;
|
|
1432
|
+
margin-block-start: 1.25rem;
|
|
1433
|
+
padding-inline: clamp(1rem, 3vw, 1.5rem);
|
|
1434
|
+
border-block-end: 1px solid var(--oc-border);
|
|
1435
|
+
overflow-x: auto;
|
|
1436
|
+
scrollbar-width: none;
|
|
1437
|
+
}
|
|
1438
|
+
.oc-block-profile-tab {
|
|
1439
|
+
padding: 0.75rem 1rem;
|
|
1440
|
+
border-block-end: 2px solid transparent;
|
|
1441
|
+
color: var(--oc-muted-foreground);
|
|
1442
|
+
font-size: 0.92rem;
|
|
1443
|
+
font-weight: 500;
|
|
1444
|
+
text-decoration: none;
|
|
1445
|
+
white-space: nowrap;
|
|
1446
|
+
transition: color var(--oc-transition-fast, 150ms), border-color var(--oc-transition-fast, 150ms);
|
|
1447
|
+
}
|
|
1448
|
+
.oc-block-profile-tab:hover { color: var(--oc-foreground); }
|
|
1449
|
+
.oc-block-profile-tab[aria-current="page"] { border-block-end-color: var(--oc-brand-1); color: var(--oc-foreground); }
|
|
1450
|
+
.oc-block-profile-tab:focus-visible { outline: 2px solid var(--oc-ring); outline-offset: -2px; }
|
|
1451
|
+
|
|
1452
|
+
/* Compact: low banner and a smaller avatar. */
|
|
1453
|
+
.oc-block-profile--compact .oc-block-profile-banner { aspect-ratio: 10 / 1; min-block-size: 4.5rem; }
|
|
1454
|
+
.oc-block-profile--compact .oc-block-profile-avatar.oc-avatar { width: 4.5rem; height: 4.5rem; margin-block-start: -2.25rem; font-size: 1.4rem; }
|
|
1455
|
+
|
|
1456
|
+
/* Narrow: the actions go below the info, full width. */
|
|
1457
|
+
@container (max-width: 34rem) {
|
|
1458
|
+
.oc-block-profile-actions { flex-basis: 100%; }
|
|
1459
|
+
}
|