barua-ui 0.8.0 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -166,6 +166,118 @@
166
166
  .b-rating__stars .b-icon { width: 0.95rem; height: 0.95rem; fill: currentColor; }
167
167
  .b-rating__stars .is-empty { color: var(--b-fill); }
168
168
 
169
+ /* ---- Marquee: a row that keeps moving ------------------------------------
170
+ For a line of marks too long to stand still: logos, integrations, the
171
+ names a product works with. The track holds the list TWICE and travels
172
+ exactly half its width, which is what makes the loop seamless; with one
173
+ copy it visibly snaps. It pauses under the pointer so a name can be read,
174
+ and it stops entirely for anyone who asked for less motion, where it
175
+ becomes an ordinary scrolling row instead. --b-marquee-time is the pace. */
176
+ .b-marquee {
177
+ overflow: hidden;
178
+ -webkit-mask-image: linear-gradient(90deg, transparent, #000 6%, #000 94%, transparent);
179
+ mask-image: linear-gradient(90deg, transparent, #000 6%, #000 94%, transparent);
180
+ }
181
+ .b-marquee__track {
182
+ display: flex;
183
+ align-items: center;
184
+ gap: clamp(var(--b-space-6), 5vw, var(--b-space-12));
185
+ width: max-content;
186
+ animation: b-marquee var(--b-marquee-time, 40s) linear infinite;
187
+ }
188
+ .b-marquee:hover .b-marquee__track { animation-play-state: paused; }
189
+ @keyframes b-marquee { to { translate: -50% 0; } }
190
+ @media (prefers-reduced-motion: reduce) {
191
+ .b-marquee { overflow-x: auto; -webkit-mask-image: none; mask-image: none; }
192
+ .b-marquee__track { animation: none; }
193
+ }
194
+
195
+ /* ---- Quote card: a number, a sentence, and who said it -------------------
196
+ The shape a case study takes on a product page. The figure leads because
197
+ it is what gets remembered, the sentence earns it, and the name is what
198
+ makes either believable. On the accent by default, because this is the
199
+ one card on the page that is meant to interrupt. */
200
+ .b-quote-card {
201
+ display: flex;
202
+ flex-direction: column;
203
+ gap: var(--b-space-6);
204
+ padding: clamp(var(--b-space-6), 4vw, var(--b-space-10));
205
+ color: var(--b-color-on-accent);
206
+ background: var(--b-color-accent);
207
+ border-radius: var(--b-radius-2xl);
208
+ color-scheme: dark;
209
+ }
210
+ .b-quote-card__head {
211
+ display: flex;
212
+ flex-wrap: wrap;
213
+ align-items: baseline;
214
+ justify-content: space-between;
215
+ gap: var(--b-space-4);
216
+ }
217
+ .b-quote-card__stat {
218
+ font-size: clamp(2.5rem, 6vw, 4rem);
219
+ font-weight: var(--b-weight-bold);
220
+ letter-spacing: var(--b-tracking-tight);
221
+ line-height: 1;
222
+ }
223
+ .b-quote-card__stat-label { font-size: var(--b-text-footnote); opacity: 0.75; }
224
+ .b-quote-card__quote {
225
+ /* The base layer gives every blockquote a quieter ink and a rule, which is
226
+ right in prose and wrong here: on the accent it renders as dark text on
227
+ a saturated field. The card owns its own colour, so the quote takes it. */
228
+ margin: 0;
229
+ padding: 0;
230
+ border: 0;
231
+ color: inherit;
232
+ font-size: clamp(1.125rem, 2vw, 1.5rem);
233
+ line-height: var(--b-leading-snug);
234
+ text-wrap: pretty;
235
+ }
236
+ .b-quote-card__name { font-weight: var(--b-weight-semibold); }
237
+ .b-quote-card__role { font-size: var(--b-text-footnote); opacity: 0.75; }
238
+
239
+ /* ---- Resource card: something to go and read ----------------------------
240
+ A picture, what kind of thing it is, and enough of the first line to
241
+ decide. The whole card is the link, and the plate stands in when there is
242
+ no picture, so a row of three never has a hole in it. */
243
+ .b-resource-card {
244
+ display: flex;
245
+ flex-direction: column;
246
+ overflow: hidden;
247
+ color: inherit;
248
+ text-decoration: none;
249
+ background: var(--b-surface);
250
+ border: 1px solid var(--b-separator);
251
+ border-radius: var(--b-radius-xl);
252
+ transition: translate var(--b-duration-normal) var(--b-ease-out), box-shadow var(--b-duration-normal);
253
+ }
254
+ .b-resource-card:hover { text-decoration: none; }
255
+ @media (hover: hover) {
256
+ .b-resource-card:hover { translate: 0 -2px; box-shadow: var(--b-elevation-3); }
257
+ }
258
+ .b-resource-card__poster {
259
+ position: relative;
260
+ aspect-ratio: 16 / 9;
261
+ display: grid;
262
+ place-items: center;
263
+ overflow: hidden;
264
+ background: color-mix(in srgb, var(--b-color-accent) 14%, var(--b-fill-tertiary));
265
+ }
266
+ .b-resource-card__poster :is(img, svg) { width: 100%; height: 100%; object-fit: cover; }
267
+ .b-resource-card__type {
268
+ position: absolute;
269
+ inset-block-start: var(--b-space-3);
270
+ inset-inline-start: var(--b-space-3);
271
+ }
272
+ .b-resource-card__body {
273
+ display: flex;
274
+ flex-direction: column;
275
+ gap: var(--b-space-2);
276
+ padding: var(--b-space-4);
277
+ }
278
+ .b-resource-card__title { font-weight: var(--b-weight-semibold); line-height: var(--b-leading-snug); }
279
+ .b-resource-card__excerpt { font-size: var(--b-text-footnote); color: var(--b-text-secondary); }
280
+
169
281
  /* ---- Logo wall: the companies already here ------------------------------- */
170
282
  /* A quiet row, evenly spaced, every mark the same height whatever its
171
283
  proportions — which is the only way a wall of logos looks deliberate
@@ -213,6 +325,21 @@
213
325
  }
214
326
  .b-figure--bleed { margin-inline: calc(var(--b-space-6) * -1); }
215
327
  .b-figure--bleed .b-figure__frame { border-radius: 0; }
328
+ /* A picture that dissolves into the page instead of ending.
329
+
330
+ The product shot under a hero is not a photograph with a bottom edge; it
331
+ is a window into the thing, and a hard edge with a shadow under it asks
332
+ the reader to look at the frame rather than through it. The mask fades the
333
+ last stretch to nothing, so the screen appears to continue past the fold.
334
+ --b-fade-from is where the fade begins. The shadow and the bottom corners
335
+ go with it: both would draw the cut the mask is there to hide. */
336
+ .b-figure--fade .b-figure__frame {
337
+ -webkit-mask-image: linear-gradient(to bottom, #000 var(--b-fade-from, 55%), transparent 100%);
338
+ mask-image: linear-gradient(to bottom, #000 var(--b-fade-from, 55%), transparent 100%);
339
+ border-end-start-radius: 0;
340
+ border-end-end-radius: 0;
341
+ box-shadow: none;
342
+ }
216
343
 
217
344
  /* ---- Alternating rows: picture beside prose ------------------------------ */
218
345
  .b-feature-row {
package/dist/index.cjs CHANGED
@@ -194,6 +194,8 @@ __export(index_exports, {
194
194
  MarketingNav: () => MarketingNav,
195
195
  MarketingNavBrand: () => MarketingNavBrand,
196
196
  MarketingNavLinks: () => MarketingNavLinks,
197
+ Marquee: () => Marquee,
198
+ MarqueeTrack: () => MarqueeTrack,
197
199
  MediaPlaceholder: () => MediaPlaceholder,
198
200
  Menu: () => Menu,
199
201
  MenuBar: () => MenuBar,
@@ -224,6 +226,13 @@ __export(index_exports, {
224
226
  Progress: () => Progress,
225
227
  PromoBand: () => PromoBand,
226
228
  Quote: () => Quote,
229
+ QuoteCard: () => QuoteCard,
230
+ QuoteCardHead: () => QuoteCardHead,
231
+ QuoteCardName: () => QuoteCardName,
232
+ QuoteCardQuote: () => QuoteCardQuote,
233
+ QuoteCardRole: () => QuoteCardRole,
234
+ QuoteCardStat: () => QuoteCardStat,
235
+ QuoteCardStatLabel: () => QuoteCardStatLabel,
227
236
  RadarChart: () => RadarChart,
228
237
  Radio: () => Radio,
229
238
  Rail: () => Rail,
@@ -233,6 +242,11 @@ __export(index_exports, {
233
242
  RatingStars: () => RatingStars,
234
243
  Resizable: () => Resizable,
235
244
  ResizeHandle: () => ResizeHandle,
245
+ ResourceCard: () => ResourceCard,
246
+ ResourceCardBody: () => ResourceCardBody,
247
+ ResourceCardExcerpt: () => ResourceCardExcerpt,
248
+ ResourceCardPoster: () => ResourceCardPoster,
249
+ ResourceCardTitle: () => ResourceCardTitle,
236
250
  Result: () => Result,
237
251
  Reveal: () => Reveal,
238
252
  SafeArea: () => SafeArea,
@@ -2301,6 +2315,20 @@ var Rating = block("p", "b-rating", "Rating");
2301
2315
  var RatingStars = block("span", "b-rating__stars", "RatingStars");
2302
2316
  var LogoWall = block("div", "b-logo-wall", "LogoWall");
2303
2317
  var LogoWallLogo = block("span", "b-logo-wall__logo", "LogoWallLogo");
2318
+ var Marquee = block("div", "b-marquee", "Marquee");
2319
+ var MarqueeTrack = block("div", "b-marquee__track", "MarqueeTrack");
2320
+ var QuoteCard = block("article", "b-quote-card", "QuoteCard");
2321
+ var QuoteCardHead = block("div", "b-quote-card__head", "QuoteCardHead");
2322
+ var QuoteCardStat = block("p", "b-quote-card__stat", "QuoteCardStat");
2323
+ var QuoteCardStatLabel = block("p", "b-quote-card__stat-label", "QuoteCardStatLabel");
2324
+ var QuoteCardQuote = block("blockquote", "b-quote-card__quote", "QuoteCardQuote");
2325
+ var QuoteCardName = block("p", "b-quote-card__name", "QuoteCardName");
2326
+ var QuoteCardRole = block("p", "b-quote-card__role", "QuoteCardRole");
2327
+ var ResourceCard = block("a", "b-resource-card", "ResourceCard");
2328
+ var ResourceCardPoster = block("div", "b-resource-card__poster", "ResourceCardPoster");
2329
+ var ResourceCardBody = block("div", "b-resource-card__body", "ResourceCardBody");
2330
+ var ResourceCardTitle = block("p", "b-resource-card__title", "ResourceCardTitle");
2331
+ var ResourceCardExcerpt = block("p", "b-resource-card__excerpt", "ResourceCardExcerpt");
2304
2332
 
2305
2333
  // src/system.tsx
2306
2334
  var import_react17 = require("react");
@@ -3099,6 +3127,8 @@ function usePersistedState(key, initial) {
3099
3127
  MarketingNav,
3100
3128
  MarketingNavBrand,
3101
3129
  MarketingNavLinks,
3130
+ Marquee,
3131
+ MarqueeTrack,
3102
3132
  MediaPlaceholder,
3103
3133
  Menu,
3104
3134
  MenuBar,
@@ -3129,6 +3159,13 @@ function usePersistedState(key, initial) {
3129
3159
  Progress,
3130
3160
  PromoBand,
3131
3161
  Quote,
3162
+ QuoteCard,
3163
+ QuoteCardHead,
3164
+ QuoteCardName,
3165
+ QuoteCardQuote,
3166
+ QuoteCardRole,
3167
+ QuoteCardStat,
3168
+ QuoteCardStatLabel,
3132
3169
  RadarChart,
3133
3170
  Radio,
3134
3171
  Rail,
@@ -3138,6 +3175,11 @@ function usePersistedState(key, initial) {
3138
3175
  RatingStars,
3139
3176
  Resizable,
3140
3177
  ResizeHandle,
3178
+ ResourceCard,
3179
+ ResourceCardBody,
3180
+ ResourceCardExcerpt,
3181
+ ResourceCardPoster,
3182
+ ResourceCardTitle,
3141
3183
  Result,
3142
3184
  Reveal,
3143
3185
  SafeArea,