al-design-system 1.7.0 → 1.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/dist/al.css CHANGED
@@ -1,8 +1,8 @@
1
- /* AL Design System 1.7.0 - Foundation + 30 components.
1
+ /* AL Design System 1.9.0 - Foundation + 33 components.
2
2
  * MIT. https://github.com/guilhermedworakowski/al-design-system
3
3
  */
4
4
  /* AL Design System - Foundation
5
- * v1.7.0 - MIT
5
+ * v1.9.0 - MIT
6
6
  * GENERATED by src/foundation/css.py. Do not edit by hand: run the script.
7
7
  */
8
8
 
@@ -8253,3 +8253,599 @@
8253
8253
  outline: var(--al-empty-state-border-width) solid CanvasText;
8254
8254
  }
8255
8255
  }
8256
+
8257
+ /* AL Design System - Slider tokens
8258
+ * GENERATED by src/components/slider/tokens.py. Do not edit by hand.
8259
+ *
8260
+ * Every color is a semantic the theme switches on :root.
8261
+ */
8262
+
8263
+ :root {
8264
+ /* color */
8265
+ --al-slider-label-text: var(--al-text-primary);
8266
+ --al-slider-value-text: var(--al-text-primary);
8267
+ --al-slider-range-text: var(--al-text-secondary);
8268
+ --al-slider-track-bg: var(--al-bg-track);
8269
+ --al-slider-fill-bg: var(--al-bg-brand);
8270
+ --al-slider-thumb-bg: var(--al-bg-brand);
8271
+ --al-slider-thumb-bg-hover: var(--al-bg-brand-hover);
8272
+ --al-slider-thumb-bg-active: var(--al-bg-brand-active);
8273
+ --al-slider-thumb-focus-gap: var(--al-bg-canvas);
8274
+ --al-slider-label-text-disabled: var(--al-text-disabled);
8275
+ --al-slider-track-bg-disabled: var(--al-bg-disabled);
8276
+ --al-slider-fill-bg-disabled: var(--al-text-disabled);
8277
+ --al-slider-thumb-bg-disabled: var(--al-text-disabled);
8278
+
8279
+ /* geometry */
8280
+ --al-slider-track-height: var(--al-space-4);
8281
+ --al-slider-thumb-size: var(--al-space-20);
8282
+ --al-slider-thumb-hit: var(--al-space-24);
8283
+ --al-slider-radius: var(--al-radius-full);
8284
+ --al-slider-gap: var(--al-space-8);
8285
+
8286
+ /* type - label and value share body-md, the range uses caption */
8287
+ --al-slider-font-size: var(--al-font-size-md);
8288
+ --al-slider-line-height: var(--al-line-height-md);
8289
+ --al-slider-font-weight: var(--al-font-weight-regular);
8290
+ --al-slider-range-font-size: var(--al-font-size-xs);
8291
+ --al-slider-range-line-height: var(--al-line-height-xs);
8292
+ }
8293
+
8294
+ /* AL Design System - Slider
8295
+ *
8296
+ * One thumb, one size, no error. The control is a native
8297
+ * <input type="range">: the browser gives the keyboard (arrows, Page Up/Down,
8298
+ * Home/End - rule 16), the click on the track (rule 21) and the value to
8299
+ * assistive tech. The name comes from the visible <label for> (rule 17).
8300
+ *
8301
+ * <div class="al-slider">
8302
+ * <div class="al-slider__header">
8303
+ * <label class="al-slider__label" for="vol">Volume</label>
8304
+ * <output class="al-slider__value" for="vol">60%</output>
8305
+ * </div>
8306
+ * <input class="al-slider__input" id="vol" type="range"
8307
+ * min="0" max="100" value="60" data-unit="%">
8308
+ * <div class="al-slider__range"><span>0%</span><span>100%</span></div>
8309
+ * </div>
8310
+ *
8311
+ * THE FILL NEEDS slider.js
8312
+ *
8313
+ * Only Firefox paints the filled part (::-moz-range-progress). WebKit/Blink
8314
+ * paint it from --al-slider-progress, a percentage slider.js keeps in sync
8315
+ * with the value (it also writes the <output> and aria-valuetext). Without
8316
+ * the script the track still works; the fill shows only in Firefox.
8317
+ *
8318
+ * THE HIT AREA IS THE INPUT, NOT THE THUMB
8319
+ *
8320
+ * The input is 24px tall (slider-thumb-hit) and the whole row takes the
8321
+ * pointer; the thumb is drawn at 20px inside it (WCAG 2.5.8, audit A2).
8322
+ * Figma's track frame is 20px - the 4px are the hit area.
8323
+ *
8324
+ * Vendor pseudo-elements can't share a rule: a selector list with one the
8325
+ * browser doesn't know is dropped whole. That is why the track and the thumb
8326
+ * are written twice.
8327
+ */
8328
+
8329
+ .al-slider {
8330
+ /* public adjustment point: slider.js writes it from value/min/max */
8331
+ --al-slider-progress: 0%;
8332
+
8333
+ display: flex;
8334
+ flex-direction: column;
8335
+ gap: var(--al-slider-gap);
8336
+ inline-size: 100%;
8337
+ font-family: var(--al-font-sans);
8338
+ font-size: var(--al-slider-font-size);
8339
+ line-height: var(--al-slider-line-height);
8340
+ font-weight: var(--al-slider-font-weight);
8341
+ }
8342
+
8343
+ .al-slider__header,
8344
+ .al-slider__range {
8345
+ display: flex;
8346
+ justify-content: space-between;
8347
+ gap: var(--al-slider-gap);
8348
+ }
8349
+
8350
+ .al-slider__label {
8351
+ color: var(--al-slider-label-text);
8352
+ }
8353
+
8354
+ /* tabular figures keep the number from jittering while it is dragged */
8355
+ .al-slider__value {
8356
+ flex: none;
8357
+ color: var(--al-slider-value-text);
8358
+ font-variant-numeric: tabular-nums;
8359
+ }
8360
+
8361
+ .al-slider__range {
8362
+ color: var(--al-slider-range-text);
8363
+ font-size: var(--al-slider-range-font-size);
8364
+ line-height: var(--al-slider-range-line-height);
8365
+ }
8366
+
8367
+ /* ---------------------------------------------------------------- input */
8368
+ .al-slider__input {
8369
+ --_thumb-bg: var(--al-slider-thumb-bg);
8370
+ --_fill: var(--al-slider-fill-bg);
8371
+ --_track: var(--al-slider-track-bg);
8372
+
8373
+ -webkit-appearance: none;
8374
+ appearance: none;
8375
+ display: block;
8376
+ inline-size: 100%;
8377
+ block-size: var(--al-slider-thumb-hit);
8378
+ margin: 0;
8379
+ background: none;
8380
+ cursor: pointer;
8381
+ }
8382
+
8383
+ /* the ring is a shadow on the thumb, never an outline on the whole row */
8384
+ .al-slider__input:focus {
8385
+ outline: none;
8386
+ }
8387
+
8388
+ /* ---------------------------------------------------------------- track */
8389
+ .al-slider__input::-webkit-slider-runnable-track {
8390
+ block-size: var(--al-slider-track-height);
8391
+ border-radius: var(--al-slider-radius);
8392
+ background: linear-gradient(to right,
8393
+ var(--_fill) var(--al-slider-progress),
8394
+ var(--_track) var(--al-slider-progress));
8395
+ }
8396
+
8397
+ .al-slider__input::-moz-range-track {
8398
+ block-size: var(--al-slider-track-height);
8399
+ border-radius: var(--al-slider-radius);
8400
+ background-color: var(--_track);
8401
+ }
8402
+
8403
+ .al-slider__input::-moz-range-progress {
8404
+ block-size: var(--al-slider-track-height);
8405
+ border-radius: var(--al-slider-radius);
8406
+ background-color: var(--_fill);
8407
+ }
8408
+
8409
+ /* ---------------------------------------------------------------- thumb */
8410
+ /* WebKit puts the thumb at the top of the track: the margin centers it. */
8411
+ .al-slider__input::-webkit-slider-thumb {
8412
+ -webkit-appearance: none;
8413
+ appearance: none;
8414
+ inline-size: var(--al-slider-thumb-size);
8415
+ block-size: var(--al-slider-thumb-size);
8416
+ margin-block-start: calc((var(--al-slider-track-height) - var(--al-slider-thumb-size)) / 2);
8417
+ border: none;
8418
+ border-radius: var(--al-slider-radius);
8419
+ background-color: var(--_thumb-bg);
8420
+ transition:
8421
+ background-color var(--al-motion-duration-feedback) var(--al-motion-easing-exit),
8422
+ box-shadow var(--al-motion-duration-feedback) var(--al-motion-easing-exit);
8423
+ }
8424
+
8425
+ .al-slider__input::-moz-range-thumb {
8426
+ inline-size: var(--al-slider-thumb-size);
8427
+ block-size: var(--al-slider-thumb-size);
8428
+ border: none;
8429
+ border-radius: var(--al-slider-radius);
8430
+ background-color: var(--_thumb-bg);
8431
+ transition:
8432
+ background-color var(--al-motion-duration-feedback) var(--al-motion-easing-exit),
8433
+ box-shadow var(--al-motion-duration-feedback) var(--al-motion-easing-exit);
8434
+ }
8435
+
8436
+ /* --------------------------------------------------------------- states */
8437
+ /* hover and active are transient: below 3:1 in dark is the declared
8438
+ thumb-transient exception (rule 15) */
8439
+ .al-slider__input:hover {
8440
+ --_thumb-bg: var(--al-slider-thumb-bg-hover);
8441
+ }
8442
+
8443
+ .al-slider__input:active {
8444
+ --_thumb-bg: var(--al-slider-thumb-bg-active);
8445
+ }
8446
+
8447
+ /* focus: an inner gap in bg-canvas, then the Foundation ring. Without the
8448
+ gap the orange ring reads as a bigger thumb in light (audit A1). */
8449
+ .al-slider__input:focus-visible::-webkit-slider-thumb {
8450
+ box-shadow:
8451
+ inset 0 0 0 var(--al-border-width-2) var(--al-slider-thumb-focus-gap),
8452
+ var(--al-focus-ring-default);
8453
+ }
8454
+
8455
+ .al-slider__input:focus-visible::-moz-range-thumb {
8456
+ box-shadow:
8457
+ inset 0 0 0 var(--al-border-width-2) var(--al-slider-thumb-focus-gap),
8458
+ var(--al-focus-ring-default);
8459
+ }
8460
+
8461
+ /* disabled - last, because it wins over all */
8462
+ .al-slider__input:disabled {
8463
+ --_thumb-bg: var(--al-slider-thumb-bg-disabled);
8464
+ --_fill: var(--al-slider-fill-bg-disabled);
8465
+ --_track: var(--al-slider-track-bg-disabled);
8466
+ cursor: not-allowed;
8467
+ }
8468
+
8469
+ .al-slider:has(.al-slider__input:disabled) :is(.al-slider__label, .al-slider__value, .al-slider__range) {
8470
+ color: var(--al-slider-label-text-disabled);
8471
+ }
8472
+
8473
+ /* ENTER - the destination states take the enter curve */
8474
+ .al-slider__input:hover::-webkit-slider-thumb,
8475
+ .al-slider__input:focus-visible::-webkit-slider-thumb {
8476
+ transition-timing-function: var(--al-motion-easing-enter);
8477
+ }
8478
+
8479
+ .al-slider__input:hover::-moz-range-thumb,
8480
+ .al-slider__input:focus-visible::-moz-range-thumb {
8481
+ transition-timing-function: var(--al-motion-easing-enter);
8482
+ }
8483
+
8484
+ /* --------------------------------------------------------- environment */
8485
+ @media (prefers-reduced-motion: reduce) {
8486
+ .al-slider__input::-webkit-slider-thumb { transition: none; }
8487
+ .al-slider__input::-moz-range-thumb { transition: none; }
8488
+ }
8489
+
8490
+ /* AL Design System - Rating tokens
8491
+ * GENERATED by src/components/rating/tokens.py. Do not edit by hand.
8492
+ *
8493
+ * Every color is a semantic the theme switches on :root.
8494
+ */
8495
+
8496
+ :root {
8497
+ /* color */
8498
+ --al-rating-label-text: var(--al-text-primary);
8499
+ --al-rating-label-text-disabled: var(--al-text-disabled);
8500
+ --al-rating-star-on: var(--al-bg-brand);
8501
+ --al-rating-star-preview: var(--al-bg-brand-hover);
8502
+ --al-rating-star-off: var(--al-border-strong);
8503
+ --al-rating-star-disabled: var(--al-text-disabled);
8504
+ --al-rating-focus-gap: var(--al-bg-canvas);
8505
+
8506
+ /* geometry */
8507
+ --al-rating-star-size: var(--al-icon-size-24);
8508
+ --al-rating-star-stroke: var(--al-border-width-2);
8509
+ --al-rating-gap: var(--al-space-4);
8510
+ --al-rating-label-gap: var(--al-space-8);
8511
+ --al-rating-focus-radius: var(--al-radius-sm);
8512
+
8513
+ /* type */
8514
+ --al-rating-font-size: var(--al-font-size-md);
8515
+ --al-rating-line-height: var(--al-line-height-md);
8516
+ --al-rating-font-weight: var(--al-font-weight-regular);
8517
+ }
8518
+
8519
+ /* AL Design System - Rating
8520
+ *
8521
+ * A radio group of five whole stars (APG rating pattern, rule 15). The radios
8522
+ * are native and sit invisible on top of each star: the browser gives the
8523
+ * single Tab stop, the arrows that move and check (rule 17) and the group
8524
+ * announcement. No script.
8525
+ *
8526
+ * <fieldset class="al-rating">
8527
+ * <legend class="al-rating__label">Como foi a entrega?</legend>
8528
+ * <div class="al-rating__stars">
8529
+ * <label class="al-rating__star">
8530
+ * <input class="al-rating__input" type="radio" name="entrega" value="1"
8531
+ * aria-label="1 estrela">
8532
+ * <svg class="al-rating__glyph" viewBox="0 0 24 24" aria-hidden="true">
8533
+ * <path d="..."/></svg>
8534
+ * </label>
8535
+ * ... x5
8536
+ * </div>
8537
+ * </fieldset>
8538
+ *
8539
+ * READ-ONLY IS ANOTHER MARKUP (rule 12, H=a)
8540
+ *
8541
+ * <span class="al-rating al-rating--readonly" role="img"
8542
+ * aria-label="4,3 de 5 estrelas">
8543
+ * <span class="al-rating__stars">
8544
+ * <svg class="al-rating__glyph al-rating__glyph--on" ...> x4 (rounded)
8545
+ * <svg class="al-rating__glyph" ...> x1
8546
+ * </span>
8547
+ * </span>
8548
+ * No radios, no focus, no hover. Looks the same as Default (rule 14).
8549
+ *
8550
+ * WHICH STARS ARE ON
8551
+ *
8552
+ * A star is on when its radio is checked or a later one is: `:has()` on the
8553
+ * star and on its following siblings. Nothing checked = all off (rule 8).
8554
+ */
8555
+
8556
+ .al-rating {
8557
+ display: flex;
8558
+ flex-direction: column;
8559
+ margin: 0;
8560
+ padding: 0;
8561
+ border: none;
8562
+ min-inline-size: 0;
8563
+ font-family: var(--al-font-sans);
8564
+ font-size: var(--al-rating-font-size);
8565
+ line-height: var(--al-rating-line-height);
8566
+ font-weight: var(--al-rating-font-weight);
8567
+ }
8568
+
8569
+ /* a <legend> is not a flex item, so the fieldset's gap doesn't reach it:
8570
+ the space below it is its own margin */
8571
+ .al-rating__label {
8572
+ padding: 0;
8573
+ margin-block-end: var(--al-rating-label-gap);
8574
+ color: var(--al-rating-label-text);
8575
+ }
8576
+
8577
+ .al-rating__stars {
8578
+ display: flex;
8579
+ gap: var(--al-rating-gap);
8580
+ }
8581
+
8582
+ .al-rating__star {
8583
+ --_ink: var(--al-rating-star-off);
8584
+ --_fill: none;
8585
+
8586
+ position: relative;
8587
+ display: block;
8588
+ inline-size: var(--al-rating-star-size);
8589
+ block-size: var(--al-rating-star-size);
8590
+ border-radius: var(--al-rating-focus-radius);
8591
+ cursor: pointer;
8592
+ }
8593
+
8594
+ /* the radio covers the star: it takes the click and the focus, and stays
8595
+ in the accessibility tree (never display:none) */
8596
+ .al-rating__input {
8597
+ position: absolute;
8598
+ inset: 0;
8599
+ margin: 0;
8600
+ opacity: 0;
8601
+ cursor: inherit;
8602
+ }
8603
+
8604
+ .al-rating__glyph {
8605
+ display: block;
8606
+ inline-size: 100%;
8607
+ block-size: 100%;
8608
+ fill: var(--_fill);
8609
+ stroke: var(--_ink);
8610
+ stroke-width: var(--al-rating-star-stroke);
8611
+ stroke-linejoin: round;
8612
+ pointer-events: none;
8613
+ transition:
8614
+ fill var(--al-motion-duration-feedback) var(--al-motion-easing-exit),
8615
+ stroke var(--al-motion-duration-feedback) var(--al-motion-easing-exit);
8616
+ }
8617
+
8618
+ /* --------------------------------------------------------------- states */
8619
+ /* hover preview: the hovered star and the ones before it (rule 10). The
8620
+ on rule below comes later, so a checked star stays brand. */
8621
+ .al-rating:not(:disabled) .al-rating__star:hover,
8622
+ .al-rating:not(:disabled) .al-rating__star:has(~ .al-rating__star:hover) {
8623
+ --_ink: var(--al-rating-star-preview);
8624
+ --_fill: var(--al-rating-star-preview);
8625
+ }
8626
+
8627
+ /* on: checked, or before the checked one */
8628
+ .al-rating__star:has(.al-rating__input:checked),
8629
+ .al-rating__star:has(~ .al-rating__star .al-rating__input:checked),
8630
+ .al-rating__glyph--on {
8631
+ --_ink: var(--al-rating-star-on);
8632
+ --_fill: var(--al-rating-star-on);
8633
+ }
8634
+
8635
+ /* focus: the ring on the star that holds it (rule 18); the box gets
8636
+ bg-canvas so the ring's gap shows (audit A4) */
8637
+ .al-rating__star:has(.al-rating__input:focus-visible) {
8638
+ background-color: var(--al-rating-focus-gap);
8639
+ box-shadow: var(--al-focus-ring-default);
8640
+ }
8641
+
8642
+ /* disabled - last, because it wins over all. The on stars stay filled.
8643
+ The on selectors carry :has() specificity, so the ink is set again there. */
8644
+ .al-rating:disabled .al-rating__star {
8645
+ --_ink: var(--al-rating-star-disabled);
8646
+ cursor: not-allowed;
8647
+ }
8648
+
8649
+ .al-rating:disabled .al-rating__star:has(.al-rating__input:checked),
8650
+ .al-rating:disabled .al-rating__star:has(~ .al-rating__star .al-rating__input:checked) {
8651
+ --_ink: var(--al-rating-star-disabled);
8652
+ --_fill: var(--al-rating-star-disabled);
8653
+ }
8654
+
8655
+ .al-rating:disabled .al-rating__label {
8656
+ color: var(--al-rating-label-text-disabled);
8657
+ }
8658
+
8659
+ /* read-only: the glyphs paint themselves, nothing reacts */
8660
+ .al-rating--readonly .al-rating__glyph {
8661
+ fill: none;
8662
+ stroke: var(--al-rating-star-off);
8663
+ inline-size: var(--al-rating-star-size);
8664
+ block-size: var(--al-rating-star-size);
8665
+ }
8666
+
8667
+ .al-rating--readonly .al-rating__glyph--on {
8668
+ fill: var(--al-rating-star-on);
8669
+ stroke: var(--al-rating-star-on);
8670
+ }
8671
+
8672
+ /* ENTER - the destination states take the enter curve */
8673
+ .al-rating:not(:disabled) .al-rating__star:hover .al-rating__glyph,
8674
+ .al-rating:not(:disabled) .al-rating__star:has(~ .al-rating__star:hover) .al-rating__glyph {
8675
+ transition-timing-function: var(--al-motion-easing-enter);
8676
+ }
8677
+
8678
+ /* --------------------------------------------------------- environment */
8679
+ @media (prefers-reduced-motion: reduce) {
8680
+ .al-rating__glyph { transition: none; }
8681
+ }
8682
+
8683
+ /* AL Design System - Carousel tokens
8684
+ * GENERATED by src/components/carousel/tokens.py. Do not edit by hand.
8685
+ *
8686
+ * Every color is a semantic the theme switches on :root.
8687
+ */
8688
+
8689
+ :root {
8690
+ /* color */
8691
+ --al-carousel-dot: var(--al-border-strong);
8692
+ --al-carousel-dot-current: var(--al-bg-brand);
8693
+ --al-carousel-slide-bg: var(--al-bg-subtle);
8694
+
8695
+ /* geometry */
8696
+ --al-carousel-gap: var(--al-space-16);
8697
+ --al-carousel-controls-gap: var(--al-space-16);
8698
+ --al-carousel-nav-gap: var(--al-space-8);
8699
+ --al-carousel-dot-size: var(--al-space-8);
8700
+ --al-carousel-dot-current-width: var(--al-space-24);
8701
+ --al-carousel-dot-gap: var(--al-space-8);
8702
+ --al-carousel-dot-radius: var(--al-radius-full);
8703
+ --al-carousel-slide-radius: var(--al-radius-lg);
8704
+ }
8705
+
8706
+ /* AL Design System - Carousel
8707
+ *
8708
+ * Depends on: al-foundation.css, al-carousel-tokens.css, and the Icon Button
8709
+ * (al-icon-tokens.css + icon.css + al-icon-button-tokens.css + icon-button.css)
8710
+ * for the arrows. Behavior in carousel.js.
8711
+ *
8712
+ * The basic carousel of the APG (usage rules 13-23): previous and next below
8713
+ * the content, disabled at the ends, no loop, no auto-rotation. The dots are
8714
+ * decorative.
8715
+ *
8716
+ * <section class="al-carousel" aria-roledescription="carousel" aria-labelledby="t">
8717
+ * <h2 id="t">Visible title</h2> (rule 9 - the page's heading)
8718
+ * <div class="al-carousel__viewport">
8719
+ * <div class="al-carousel__slide" role="group"
8720
+ * aria-roledescription="slide" aria-label="1 of 5">…</div>
8721
+ * …
8722
+ * </div>
8723
+ * <div class="al-carousel__controls">
8724
+ * <span class="al-carousel__dots" aria-hidden="true">
8725
+ * <span class="al-carousel__dot"></span>… (one per slide, carousel.js marks the current)
8726
+ * </span>
8727
+ * <div class="al-carousel__nav">
8728
+ * <button type="button" class="al-icon-btn al-icon-btn--secondary al-icon-btn--sm"
8729
+ * data-al-carousel="prev" aria-label="Previous slide">…chevron-left…</button>
8730
+ * <button type="button" class="al-icon-btn al-icon-btn--secondary al-icon-btn--sm"
8731
+ * data-al-carousel="next" aria-label="Next slide">…chevron-right…</button>
8732
+ * </div>
8733
+ * </div>
8734
+ * <p class="al-carousel__live" aria-live="polite" aria-atomic="true"></p>
8735
+ * </section>
8736
+ *
8737
+ * SLIDE WIDTH IS THE LAYOUT'S (rule 6): --al-carousel-slide-size is a public
8738
+ * adjustment point, not a token. Default 100% = one slide per view; set it
8739
+ * narrower than the viewport so the next slide shows cut at the edge.
8740
+ *
8741
+ * NO JS NEEDED FOR FOCUS (rule 23): focusing a link inside a slide out of
8742
+ * view scrolls the viewport natively.
8743
+ *
8744
+ * The viewport hides its scrollbar: the arrows, swipe and the trackpad move
8745
+ * it. Smooth scrolling is turned off under prefers-reduced-motion (rule 16).
8746
+ */
8747
+
8748
+ .al-carousel {
8749
+ --al-carousel-slide-size: 100%;
8750
+ display: flex;
8751
+ flex-direction: column;
8752
+ gap: var(--al-carousel-controls-gap);
8753
+ min-inline-size: 0;
8754
+ }
8755
+
8756
+ /* -------------------------------------------------------------- viewport */
8757
+ .al-carousel__viewport {
8758
+ display: flex;
8759
+ gap: var(--al-carousel-gap);
8760
+ overflow-x: auto;
8761
+ overscroll-behavior-x: contain;
8762
+ scroll-snap-type: x mandatory;
8763
+ scroll-behavior: smooth;
8764
+ scrollbar-width: none;
8765
+ }
8766
+
8767
+ .al-carousel__viewport::-webkit-scrollbar {
8768
+ display: none;
8769
+ }
8770
+
8771
+ .al-carousel__slide {
8772
+ flex: 0 0 var(--al-carousel-slide-size);
8773
+ scroll-snap-align: start;
8774
+ overflow: hidden;
8775
+ border-radius: var(--al-carousel-slide-radius);
8776
+ background-color: var(--al-carousel-slide-bg); /* rule 18 - shows only when the image is missing */
8777
+ }
8778
+
8779
+ .al-carousel__slide > img {
8780
+ display: block;
8781
+ inline-size: 100%;
8782
+ block-size: 100%;
8783
+ object-fit: cover;
8784
+ }
8785
+
8786
+ /* -------------------------------------------------------------- controls */
8787
+ .al-carousel__controls {
8788
+ display: flex;
8789
+ align-items: center;
8790
+ justify-content: space-between;
8791
+ }
8792
+
8793
+ .al-carousel__nav {
8794
+ display: flex;
8795
+ gap: var(--al-carousel-nav-gap);
8796
+ margin-inline-start: auto;
8797
+ }
8798
+
8799
+ /* the dots: decorative, shape carries the current one (rule 22) */
8800
+ .al-carousel__dots {
8801
+ display: flex;
8802
+ align-items: center;
8803
+ gap: var(--al-carousel-dot-gap);
8804
+ }
8805
+
8806
+ .al-carousel__dot {
8807
+ inline-size: var(--al-carousel-dot-size);
8808
+ block-size: var(--al-carousel-dot-size);
8809
+ border-radius: var(--al-carousel-dot-radius);
8810
+ background-color: var(--al-carousel-dot);
8811
+ transition:
8812
+ inline-size var(--al-motion-duration-feedback) var(--al-motion-easing-exit),
8813
+ background-color var(--al-motion-duration-feedback) var(--al-motion-easing-exit);
8814
+ }
8815
+
8816
+ .al-carousel__dot[data-current] {
8817
+ inline-size: var(--al-carousel-dot-current-width);
8818
+ background-color: var(--al-carousel-dot-current);
8819
+ transition-timing-function: var(--al-motion-easing-enter);
8820
+ }
8821
+
8822
+ /* the polite region that announces the position after an arrow (rule 21) */
8823
+ .al-carousel__live {
8824
+ position: absolute;
8825
+ inline-size: var(--al-border-width-1);
8826
+ block-size: var(--al-border-width-1);
8827
+ margin: 0;
8828
+ overflow: hidden;
8829
+ clip-path: inset(50%);
8830
+ white-space: nowrap;
8831
+ }
8832
+
8833
+ @media (prefers-reduced-motion: reduce) {
8834
+ .al-carousel__viewport {
8835
+ scroll-behavior: auto;
8836
+ }
8837
+
8838
+ .al-carousel__dot {
8839
+ transition: none;
8840
+ }
8841
+ }
8842
+
8843
+ @media (forced-colors: active) {
8844
+ .al-carousel__dot {
8845
+ background-color: CanvasText;
8846
+ }
8847
+
8848
+ .al-carousel__dot[data-current] {
8849
+ background-color: Highlight;
8850
+ }
8851
+ }