Skip to content

Text

Source

Example

html
<div class="x-text">
    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
</div>

More examples can be found in the Winduum docs.

Example CSS

css
@import "winduum/src/components/text/props/default.css" layer(theme);
@import "winduum/src/components/text/default.css" layer(utilities);

/* Example customization */
@layer theme {
  :root, :host {
    --x-text-content-bold: var(--font-weight-semibold);
    --x-text-content-margin-block: calc(var(--spacing) * 5);
  }
}

Winduum CSS Code

winduum/src/components/text/props/default.css

css
:root, :host {
  --x-text-content-bold: var(--font-weight-semibold);
  --x-text-content-margin-block: calc(var(--spacing) * 5);
  --x-text-list-marker-size: 0.375em;
  --x-text-line-height: calc(1em + 0.75rem);
  --x-text-hr-margin-block: 3em;
  --x-text-heading-line-height: calc(1em + 0.375rem);
  --x-text-heading-margin-block: 1.5em 0.5em;
}

winduum/src/components/text/default.css

css
.x-text {
  font-family: var(--x-text-font-family);
  font-weight: var(--x-text-font-weight);
  font-size: var(--x-text-font-size);
  line-height: var(--x-text-line-height);
  letter-spacing: var(--x-text-letter-spacing);
  text-wrap: pretty;

  > :is(*:first-child) {
    margin-block-start: 0;
  }

  > :is(*:last-child) {
    margin-block-end: 0;
  }

  :where(b, strong) {
    font-weight: var(--x-text-content-bold);
  }

  :where(em) {
    font-style: italic;
  }

  :where(img) {
    display: block;
    height: auto;
  }

  :where(p) {
    margin-block: var(--x-text-p-margin-block, var(--x-text-content-margin-block));

    &:empty {
      line-height: 0;
      margin: 0;

      &::after {
        content: "\00a0";
      }
    }
  }

  :where(hr) {
    margin-block: var(--x-text-hr-margin-block);
    background-color:
      color-mix(
        in var(--x-text-hr-background-color-space, srgb),
        var(--x-text-hr-background-color, currentColor) var(--x-text-hr-background-color-opacity, 10%),
        var(--x-text-hr-background-color-mix, transparent)
      );
  }

  :where(a) {
    color: var(--x-text-link-color, var(--color-accent));
    text-decoration: var(--x-text-link-text-decoration, underline);
    transition: var(--transition-color);

    &:hover {
      color:
        color-mix(
          in var(--x-text-link-hover-color-space, srgb),
          var(--x-text-link-hover-color, var(--color-accent)) var(--x-text-link-hover-color-opacity, 75%),
          var(--x-text-link-hover-color-mix, transparent)
        );
    }

    &:focus-visible {
      color:
        color-mix(
          in var(--x-text-link-focus-color-space, srgb),
          var(--x-text-link-focus-color, var(--color-accent)) var(--x-text-link-focus-color-opacity, 75%),
          var(--x-text-link-focus-color-mix, transparent)
        );
    }
  }

  :where(h1, h2, h3, h4, h5, h6) {
    font-family: var(--x-text-heading-font-family);
    font-weight: var(--x-text-heading-font-weight, var(--x-text-content-bold));
    font-size: var(--x-text-heading-font-size);
    line-height: var(--x-text-heading-line-height);
    letter-spacing: var(--x-text-heading-letter-spacing);
    margin-block: var(--x-text-heading-margin-block);
    color: var(--x-text-heading-color);
    text-wrap: balance;
  }

  :where(h1) {
    --x-text-heading-font-size: var(--x-text-heading-1-font-size, var(--text-4xl));
  }

  :where(h2) {
    --x-text-heading-font-size: var(--x-text-heading-2-font-size, var(--text-3xl));
  }

  :where(h3) {
    --x-text-heading-font-size: var(--x-text-heading-3-font-size, var(--text-2xl));
  }

  :where(h4) {
    --x-text-heading-font-size: var(--x-text-heading-4-font-size, var(--text-xl));
  }

  :where(h5) {
    --x-text-heading-font-size: var(--x-text-heading-5-font-size, var(--text-lg));
  }

  :where(h6) {
    --x-text-heading-font-size: var(--x-text-heading-6-font-size);
  }

  :where(table) {
    border: 0;
    min-inline-size: 100%;

    :where(td, th) {
      padding: var(--x-text-table-cell-padding-block, 1em) var(--x-text-table-cell-padding-inline, 1.25em);
      text-align: left;
    }

    :where(thead) {
      font-weight: var(--x-text-table-thead-font-weight, var(--x-text-content-bold));
      border-block-end:
        1px solid color-mix(
          in var(--x-text-table-thead-border-color-space, srgb),
          var(--x-text-table-thead-border-color, currentColor) var(--x-text-table-thead-border-color-opacity, 10%),
          var(--x-text-table-thead-border-color-mix, transparent)
        );
    }

    :where(tbody tr) {
      &:nth-of-type(even) {
        background-color:
          color-mix(
            in var(--x-text-table-row-even-background-color-space, srgb),
            var(--x-text-table-row-even-background-color, currentColor) var(--x-text-table-row-even-background-color-opacity, 5%),
            var(--x-text-table-row-even-background-color-mix, transparent)
          );
      }
    }
  }

  :where(ol, ul) {
    margin-inline-start: var(--x-text-list-margin-inline-start, 0.75em);
    padding-inline-start: var(--x-text-list-padding-inline-start, 1em);
    margin-block: var(--x-text-list-margin-block, var(--x-text-content-margin-block));

    :where(li) {
      margin-block: var(--x-text-list-item-margin-block, 0.5em);
      padding-inline-start: var(--x-text-list-item-padding-inline-start, 1ch);
    }
  }

  :where(ol) {
    &:not([type]) {
      list-style: decimal;
    }

    & :where(li) {
      &::marker {
        color: var(--x-text-list-marker-color, var(--color-accent));
        font-weight: var(--x-text-list-marker-font-weight, var(--x-text-content-bold));
      }
    }
  }

  :where(ul) {
    :where(li) {
      position: relative;
      list-style-type: "";

      &::before {
        inline-size: var(--x-text-list-marker-size);
        block-size: var(--x-text-list-marker-size);
        inset-inline-start: var(--x-text-list-marker-inset-inline-start, -0.75em);
        inset-block-start: var(--x-text-list-marker-inset-block-start, 0.5lh);
        border:
          var(--x-text-list-marker-border-width, 1px) solid
          var(--x-text-list-marker-border-color, var(--color-accent));
        background-color: var(--x-text-list-marker-background-color, var(--color-accent));
        margin-inline-start: calc((var(--x-text-list-marker-size) / 2) * -1);
        margin-block-start: calc(var(--x-text-list-marker-size) / 2 * -1);
        border-radius: var(--x-text-list-marker-border-radius, 50%);
        mask: var(--x-text-list-marker-mask);
        position: absolute;
        will-change: transform;
        content: "";
      }
    }

    &[style*="square"] {
      --x-text-list-marker-border-radius: 0;
    }

    &[style*="circle"] {
      --x-text-list-marker-background-color: transparent;
    }
  }

  :where(blockquote) {
    border-inline-start:
      var(--x-text-blockquote-border-inline-start-width, 0.375em) solid
      var(--x-text-blockquote-border-inline-start-color, var(--color-accent));
    margin-block: var(--x-text-blockquote-margin-block, var(--x-text-content-margin-block));
    padding: var(--x-text-blockquote-padding-block, 0.5em) var(--x-text-blockquote-padding-inline, 1.25em);
    font-size: var(--x-text-blockquote-font-size, inherit);
  }

  :where(code) {
    font-size: var(--x-text-code-font-size, 87.5%);
  }

  :where(figure) {
    margin-block: var(--x-text-figure-margin-block, var(--x-text-content-margin-block));
  }

  :where(figcaption) {
    font-size: var(--x-text-figcaption-font-size, 87.5%);
    font-weight: var(--x-text-figcaption-font-weight, var(--font-weight-semibold));
    line-height: var(--x-text-figcaption-line-height, 1.5);
    margin-block-start: var(--x-text-figcaption-margin-block-start, 0.5em);
  }
}

Released under the MIT License.