@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.
Files changed (57) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +10 -10
  3. package/blocks/about-timeline.html +23 -23
  4. package/blocks/app-header.html +32 -32
  5. package/blocks/app-shell.html +84 -84
  6. package/blocks/auth-split.html +45 -45
  7. package/blocks/auth.html +21 -21
  8. package/blocks/contact-grid.html +38 -38
  9. package/blocks/cta.html +8 -8
  10. package/blocks/data-table.html +111 -111
  11. package/blocks/faq.html +33 -33
  12. package/blocks/features.html +18 -18
  13. package/blocks/footer.html +41 -41
  14. package/blocks/forgot-password.html +34 -34
  15. package/blocks/form-page.html +28 -28
  16. package/blocks/hero-code.html +27 -27
  17. package/blocks/hero-orbit.html +38 -38
  18. package/blocks/hero-split.html +12 -12
  19. package/blocks/hero.html +10 -10
  20. package/blocks/login-01.html +41 -41
  21. package/blocks/login-02.html +55 -55
  22. package/blocks/login-03.html +47 -47
  23. package/blocks/module-header.html +24 -24
  24. package/blocks/otp-01.html +36 -36
  25. package/blocks/otp-02.html +46 -46
  26. package/blocks/page-hero.html +10 -10
  27. package/blocks/portfolio-grid.html +31 -31
  28. package/blocks/pricing.html +42 -42
  29. package/blocks/process.html +19 -19
  30. package/blocks/product-grid.html +37 -37
  31. package/blocks/profile-header.html +27 -27
  32. package/blocks/reset-password.html +45 -45
  33. package/blocks/showcase.html +27 -27
  34. package/blocks/sidebar-01.html +56 -56
  35. package/blocks/sidebar-02.html +55 -55
  36. package/blocks/sidebar-03.html +53 -53
  37. package/blocks/sidebar-04.html +56 -56
  38. package/blocks/sidebar-05.html +68 -68
  39. package/blocks/signup-01.html +53 -53
  40. package/blocks/signup-02.html +56 -56
  41. package/blocks/site-footer.html +39 -39
  42. package/blocks/site-header.html +14 -14
  43. package/blocks/spotlight.html +22 -22
  44. package/blocks/stats-counter.html +15 -15
  45. package/blocks/stats.html +19 -19
  46. package/blocks/team-list.html +30 -30
  47. package/blocks/two-factor.html +33 -33
  48. package/blocks/wizard-dialog.html +36 -36
  49. package/dist/blocks.css +371 -343
  50. package/dist/blocks.min.css +1 -1
  51. package/dist/parts/site-about-timeline.css +61 -61
  52. package/dist/parts/site-contact-grid.css +58 -58
  53. package/dist/parts/site-faq.css +52 -52
  54. package/dist/parts/site-hero-orbit.css +62 -62
  55. package/dist/parts/site-portfolio-grid.css +23 -23
  56. package/dist/parts/site-profile-header.css +77 -77
  57. 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
- .oc-block-authsplit-quote p { margin: 0 0 0.5rem; font-size: 1.1rem; line-height: 1.55; font-weight: 500; }
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
- .oc-block-authduo-quote p { margin: 0 0 0.5rem; font-size: 1.05rem; line-height: 1.55; font-weight: 500; }
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
+ }