Skip to content

Latest commit

 

History

History
269 lines (183 loc) · 7.49 KB

theme-css.md

File metadata and controls

269 lines (183 loc) · 7.49 KB

Theme CSS

HTML structure

The basic idea of HTML structure is that <section> elements are corresponding to each slide pages. It is same as reveal.js.

<section><h1>First page</h1></section>
<section><h1>Second page</h1></section>

?> When conversion, Marpit would scope CSS selectors by wrapping them with the selector for container element(s) automatically. However, the theme author doesn't have to be aware of this process.

Create theme CSS

As indicated preceding, all that you have to know to create theme is just that <section> elements are used like a viewport for each slide pages.

/* @theme marpit-theme */

section {
  width: 1280px;
  height: 960px;
  font-size: 40px;
  padding: 40px;
}

h1 {
  font-size: 60px;
  color: #09c;
}

h2 {
  font-size: 50px;
}

We have no any extra classes or mixins, and do almost not need require to know extra rules for creating theme. This is a key factor of Marpit different from other slide framework.

:root pseudo-class selector

In the context of Marpit, :root pseudo-class indicates each <section> elements for the slide page instead of <html>.

The following is similar theme definition to the example shown earlier, but it's using :root selector.

/* @theme marpit-theme */

:root {
  width: 1280px;
  height: 960px;
  font-size: 40px;
  padding: 1rem;
}

h1 {
  font-size: 1.5rem;
  color: #09c;
}

h2 {
  font-size: 1.25rem;
}

rem units in Marpit theme will automatically transform into the calculated relative value from the parent <section> element, so anyone don't have to worry the effect from font-size in the root <html> that placed Marpit slide. Everything would work as the theme author expected.

?> :root selector can use just like as section selector, but there is a difference that :root has higher CSS specificity than section. If both selectors have mixed in a theme CSS, declarations in :root selector will be prefered than section selector.

Metadata

The @theme metadata is always required by Marpit. You must define metadata through CSS comment.

/* @theme name */

!> You should use the /*! comment */ syntax to prevent removing comments if you're using the compressed output of Sass.

Styling

Slide size

width and height declarations in the root section selector or :root pseudo-class selector mean a predefined slide size per theme. The specified size is not only used as the size of section element but also as the size of PDF for printing.

The default size is 1280 x 720 pixels. Try this if you want a classic 4:3 slide:

/* Change to the classic 4:3 slide */
section {
  width: 960px;
  height: 720px;
}

!> Please notice it must define the static length in an absolute unit. We support cm, in, mm, pc, pt, and px.

?> It is determined one size per theme in Marpit. The slide size cannot change through using inline style, custom class, and CSS custom property. But the width of contents may shrink if user was using split backgrounds.

Pagination

paginate local directive may control whether show the page number of slide. The theme creator can style it through section::after (:root::after) pseudo-element.

/* Styling page number */
section::after {
  font-weight: bold;
  text-shadow: 1px 1px 0 #fff;
}

Please refer to the default style of section::after in a scaffold theme as well.

Customize content

Marpit has a default content: attr(data-marpit-pagination), indicates the current page number. Theme CSS can add other strings and attributes to the shown page number.

/* Add "Page" prefix and total page number */
section::after {
  content: 'Page ' attr(data-marpit-pagination) ' / ' attr(data-marpit-pagination-total);
}

attr(data-marpit-pagination-total) means the total page number of rendered slides. Thus, the above example would show as like as Page 1 / 3.

!> Theme CSS must contain attr(data-marpit-pagination) in content declaration because user expects to show the page number by paginate: true directive. Marpit will ignore the whole of content declaration if the reference to that attribute is not contained.

Header and footer

header and footer element have a possible to be rendered by header / footer local directives. Marpit has no default style for these elements.

If you want to place to the marginal of slide, using position: absolute would be a good solution.

section {
  padding: 50px;
}

header,
footer {
  position: absolute;
  left: 50px;
  right: 50px;
  height: 20px;
}

header {
  top: 30px;
}

footer {
  bottom: 30px;
}

Customized theme

We allow creating a customized theme based on another theme.

@import rule

We support importing another theme with CSS @import rule. For example, you can dye a boring monochrome theme to a brilliant orange as follows:

/* @theme base */

section {
  background-color: #fff;
  color: #333;
}
/* @theme customized */

@import 'base';

section {
  background-color: #f80;
  color: #fff;
}

An importing theme must add to theme set by using Marpit.themeSet.add(css) in advance.

@import-theme rule

When you are using CSS preprocessors like Sass, @import might resolve path in compiling and be lost its definitions. So you can use @import-theme rule alternatively.

$bg-color: #f80;
$text-color: #fff;

@import-theme 'base';

section {
  background: $bg-color;
  color: $text-color;
}

@import for theme and @import-theme can place on anywhere of the root of CSS. The imported contents is inserted to the beginning of CSS in order per rules. (@import is processed before @import-theme)

Tweak style through Markdown

Sometimes you might think that want to tweak current theme instead of customizing theme fully.

Marpit gives the <style> HTML element written in Markdown a special treatment. The specified inline style would parse in the context of as same as a theme, and bundle to the converted CSS together with it.

---
theme: base
---

<style>
section {
  background: yellow;
}
</style>

# Tweak style through Markdown

You would see a yellow slide.

<style> elements would not find in rendered HTML, and would merge into emitted CSS.

style global directive also can use as same purpose.

Scoped style

We also support the scoped inline style through <style scoped>. When a style element has the scoped attribute, its style will apply only to the current slide page only.

<!-- Global style -->
<style>
h1 {
  color: red;
}
</style>

# Red text

---

<!-- Scoped style -->
<style scoped>
h1 {
  color: blue;
}
</style>

# Blue text (only in the current slide page)

---

# Red text

It is useful when you want to fine-tune styles per slide page.