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.
- package/css/components/marketing.css +127 -0
- package/dist/index.cjs +42 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +16 -1
- package/dist/index.d.ts +16 -1
- package/dist/index.js +28 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -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,
|