For the complete documentation index, see llms.txt. This page is also available as Markdown.

Custom CSS Guide

This guide explains how to use the Custom CSS feature in NotionApps to style a published app for client-facing or brand-specific use cases.

Custom CSS gives app builders a controlled way to customize the visual appearance of the end-user app. You can use it to adjust fonts, text colors, buttons, form fields, links, images, spacing, and responsive behavior without changing the app's data structure or backend logic.

Custom CSS applies to the published end-user app, not to the NotionApps builder interface.

Who This Guide Is For

This guide is intended for:

  • App builders who want to apply brand styling to a NotionApps app.

  • Technical writers documenting NotionApps customization workflows.

  • Customer success teams helping users style client-facing apps.

  • Developers or advanced users who understand basic CSS selectors.

What You Can Customize

With Custom CSS, you can style many visible parts of the end-user app, including:

  • Text color and typography

  • Headings, labels, body text, and links

  • Buttons and button hover states

  • Inputs, textareas, dropdowns, and placeholders

  • Images and icons

  • Lists and repeated records

  • Borders, spacing, backgrounds, and shadows

  • Mobile-specific layouts using media queries

Custom CSS is best suited for visual customization. It should not be used to control access, hide sensitive data, replace validation logic, or change application behavior.

Before You Begin

Before writing Custom CSS, make sure:

  • You have access to the app in the NotionApps builder.

  • The app has been created and can be saved.

  • You know the styling goal, such as applying a brand font, changing button colors, or styling form fields.

  • You understand that users must save and re-publish the app before published users see the latest CSS.

Add Custom CSS in the Builder

To add Custom CSS:

  1. Open the app in the NotionApps builder.

  2. Go to the app settings area.

  3. Find the Custom CSS section.

  4. Enable Custom CSS.

  5. Paste your CSS into the Custom CSS editor.

  1. Save the app.

  2. Publish or re-publish the app.

  3. Open the published app and verify the style changes.

Understand the End-User Root Selector

The NotionApps end-user app is wrapped in a root element with this attribute:

When writing Custom CSS, scope your selectors to that root element:

This is the recommended pattern because it limits your CSS to the NotionApps end-user app.

Why Scoping Matters

Scoped CSS is safer than global CSS.

For example, this selector targets every button inside the NotionApps end-user app:

This selector targets every button on the page:

The second example is broader and can affect elements outside the app. Use scoped selectors whenever possible.

Create Reusable Brand Variables

CSS variables make brand styles easier to maintain. Define them once on the root selector:

You can then reuse those values:

Style All Text

To change the color of all text inside the end-user app, target both the root and all child elements:

The universal selector * targets every descendant element.

Use this approach when you want a global text color or when testing that Custom CSS is working.

Style Form Field Text

Some browsers apply special rendering to form controls. If the text inside inputs, dropdowns, or textareas does not change color, add -webkit-text-fill-color.

Style Placeholder Text

Placeholder text requires a separate selector:

Use opacity: 1 because some browsers reduce placeholder opacity by default.

Style Headings

Use heading selectors to style screen titles, section titles, or large text elements.

You can style heading levels separately:

Style Paragraphs, Labels, and Inline Text

Use these selectors for common text elements:

If a label does not change, inspect the element in browser DevTools. It may be rendered as a div, span, or another element.

Use the a selector for links:

Style Buttons

Buttons may be rendered as actual button elements or as elements with role="button". Target both:

Add a hover state:

Add a disabled state:

Style Inputs, Textareas, and Dropdowns

Use these selectors for common form fields:

Add focus styling:

Style Lists

Use list selectors for unordered and ordered lists:

Style Images

Use image selectors for rounded corners or consistent sizing:

If images are cropped or displayed in cards, test the change on multiple screen sizes.

Style Icons and SVGs

Icons are often rendered as SVGs. You can target SVG elements:

Some SVGs use path elements:

Use currentColor when possible so icons inherit the surrounding text color.

Style Containers and Cards

Many app layouts are built with div elements. You can target them, but use broad div selectors carefully.

This rule applies to every div inside the app. For layout styling, inspect the element first and look for a more specific selector when possible.

Use Attribute Selectors

Attribute selectors target elements by attributes.

The root selector is an attribute selector:

Button-like elements can be targeted by role:

You can also target input types:

Use Pseudo-Classes

Pseudo-classes target states such as hover, focus, disabled, or checked.

Use Pseudo-Elements

Pseudo-elements target parts of an element, such as placeholders.

Use Media Queries

Media queries let you apply styles only at certain viewport widths.

Example for mobile:

Example for larger screens:

Use Custom Fonts

If the app also uses the Custom Font feature, set the same font family in Custom CSS:

If a font is loaded from Google Fonts, make sure the font family name in CSS matches the font name exactly.

Example:

CSS:

Example: Make All Font Color Red

Use this example to verify that Custom CSS is working:

After saving and publishing, all visible text inside the end-user app should appear red.

Example: Branded Buttons and Fields

This example applies a client brand color to buttons and form controls:

Example: Softer Form Styling

This example makes form fields feel lighter and more spacious:

Example: Mobile-Friendly Buttons

This example makes buttons easier to tap on mobile screens:

Verify That Custom CSS Worked

After saving and publishing, open the end-user app and inspect it with browser DevTools.

Check for the root element:

Check for the custom style tag:

If that style tag appears, the published app received the Custom CSS payload.

Troubleshooting

CSS Does Not Appear

Confirm the following:

  • Custom CSS is enabled.

  • The app was saved after editing the CSS.

  • The app was re-published.

  • The published app was hard-refreshed.

  • The page contains id="notionapps-end-user-customization".

CSS Appears but Does Not Apply

The existing component style may be more specific than your selector. Increase specificity:

Use !important only when needed.

Input Text Does Not Change Color

Add -webkit-text-fill-color:

Placeholder Text Does Not Change

Target placeholders separately:

Styles Look Different on Mobile

Add mobile-specific media queries:

A Broad Selector Changed Too Much

If a rule affects more than expected, make it narrower.

Broad:

Narrower:

  1. Define the brand variables first.

  2. Add typography styles.

  3. Style buttons.

  4. Style form fields.

  5. Add hover, focus, and disabled states.

  6. Add mobile media queries.

  7. Save and publish.

  8. Verify in the published end-user app.

  9. Inspect problem elements with DevTools.

  10. Refine selectors if a rule is too broad.

CSS Selector Reference

Goal
Selector

App root

[data-notionapps-end-user-root="true"]

All elements in app

[data-notionapps-end-user-root="true"] *

Headings

[data-notionapps-end-user-root="true"] h1, h2, h3

Paragraphs

[data-notionapps-end-user-root="true"] p

Labels

[data-notionapps-end-user-root="true"] label

Links

[data-notionapps-end-user-root="true"] a

Buttons

[data-notionapps-end-user-root="true"] button

Button-like elements

[data-notionapps-end-user-root="true"] [role="button"]

Inputs

[data-notionapps-end-user-root="true"] input

Textareas

[data-notionapps-end-user-root="true"] textarea

Dropdowns

[data-notionapps-end-user-root="true"] select

Placeholders

[data-notionapps-end-user-root="true"] input::placeholder

Images

[data-notionapps-end-user-root="true"] img

SVG icons

[data-notionapps-end-user-root="true"] svg

Best Practices

  • Scope Custom CSS to [data-notionapps-end-user-root="true"].

  • Use CSS variables for repeated brand values.

  • Target both button and [role="button"].

  • Target placeholders separately.

  • Use focus states for form accessibility.

  • Use !important only when needed to override existing component styles.

  • Avoid broad layout changes on every div.

  • Test on both desktop and mobile.

  • Save and re-publish after every meaningful change.

Summary

Custom CSS in NotionApps is a flexible way to make published apps feel more polished and on-brand. The key is to write scoped, intentional CSS that targets the end-user app root. Start with broad proof-of-concept styles when testing, then refine the selectors for production-ready styling.

Last updated