
Security News
arXiv Is Rate Limiting Authors Following a Flood of AI Slop Submissions
arXiv now limits authors to two submissions a month as AI slop overwhelms moderators, delays good papers, and sparks debate over applying the limit to everyone.
@drop-in/graffiti
Advanced tools
A minimal CSS framework with utilities that are actually useful.
npm install @drop-in/graffiti
Then import in your project:
// Import everything (default, ~75KB)
import "@drop-in/graffiti";
// Or import only what you need for smaller bundles
import "@drop-in/graffiti/minimal"; // core + utilities (~26KB)
import "@drop-in/graffiti/standard"; // core + utilities + layouts (~33KB)
// Or pick individual modules
import "@drop-in/graffiti/core"; // variables, reset, typography
import "@drop-in/graffiti/utilities"; // helper classes
import "@drop-in/graffiti/layouts"; // page layouts
import "@drop-in/graffiti/components"; // UI components
// Optionally import decks component styles separately
import "@drop-in/graffiti/decks";
Download the CSS file directly:
https://raw.githubusercontent.com/stolinski/graffiti/refs/heads/main/drop-in.css
npx @drop-in/graffiti
This copies drop-in.css to your src/ folder.
Fluid typography that scales automatically between viewport sizes:
<h1 class="fs-xxxl">Extra Large</h1>
<h1>H1 - Large Heading</h1>
<h2>H2 - Med Heading</h2>
<h3>H3 - Small Heading</h3>
<p class="fs-xs">Extra small text</p>
Custom fluid sizing:
<div style="--fl: 3">Scales like an h3</div>
Container-based fluid text:
<div class="fc">
<h1>Scales with container, not viewport</h1>
</div>
Auto-fill card grid:
<div class="layout-card">
<div>Card 1</div>
<div>Card 2</div>
<div>Card 3</div>
</div>
Sidebar layout:
<div class="layout-sidebar">
<aside>Sidebar (250px)</aside>
<main>Main Content</main>
</div>
<!-- Variants: .narrow (150px), .wide (350px), .invert (sidebar on right) -->
50/50 split:
<div class="layout-split">
<div>Left Column</div>
<div>Right Column</div>
</div>
<!-- Add .no-stack to stay side-by-side on mobile -->
Three columns:
<div class="layout-three-col">
<div>Column 1</div>
<div>Column 2</div>
<div>Column 3</div>
</div>
Readable content container:
<div class="layout-readable center">
<p>Optimal line length for readability</p>
<div class="full-bleed">Breaks out to full width!</div>
</div>
<!-- Variants: .center, .end -->
Holy Grail layout:
<div class="layout-holy-grail">
<div style="width: 200px">Left sidebar</div>
<div>Main content</div>
<div style="width: 200px">Right sidebar</div>
</div>
Stack (vertical spacing):
<div class="stack">
<div>Item 1</div>
<div>Item 2</div>
<div>Item 3</div>
</div>
Cluster (horizontal wrapping):
<div class="cluster">
<span>Tag 1</span>
<span>Tag 2</span>
<span>Tag 3</span>
</div>
<!-- Perfect for tags, pills, breadcrumbs -->
Carousel (horizontal scroll-snap):
<div class="carousel">
<div>Slide 1</div>
<div>Slide 2</div>
<div>Slide 3</div>
</div>
<!-- CSS scroll-snap, no JavaScript required -->
Reel (vertical scroll-snap):
<div class="reel" style="--reel-height: 400px">
<div>Panel 1</div>
<div>Panel 2</div>
<div>Panel 3</div>
</div>
<!-- Vertical scrolling with CSS scroll-snap -->
App Shell (iOS-safe):
<div class="app-shell">
<header>Sticky Header</header>
<main>Scrollable Content</main>
<footer>Sticky Footer</footer>
</div>
<!-- Uses 100dvh, respects safe-area-inset-* for notch/home indicator -->
Bottom Navigation:
<nav class="bottom-nav">
<a href="/" aria-current="page">
<svg><!-- icon --></svg>
<span>Home</span>
</a>
<a href="/search">
<svg><!-- icon --></svg>
<span>Search</span>
</a>
</nav>
<!-- Fixed bottom tab bar, respects safe-bottom -->
Bottom Sheet:
<aside class="bottom-sheet">
<h3>Sheet Title</h3>
<p>Content with drag handle at top.</p>
</aside>
Mobile Utilities:
<div class="safe-top">Padding for notch</div>
<div class="safe-bottom">Padding for home indicator</div>
<div class="hide-scrollbar">Hide scrollbar</div>
<div class="momentum-scroll">iOS-style scrolling</div>
Display utilities:
<div class="flex">Flexbox with gap</div>
<div class="grid">Grid with gap</div>
<div class="split">Space-between flex</div>
Box styles:
<div class="box-1">Subtle box</div>
<div class="box-2">Semi-gloss box</div>
Callout boxes:
<!-- Default info callout (blue) -->
<div class="callout">
<h3>Information</h3>
<p>This is an informational message.</p>
</div>
<!-- Warning callout (yellow) -->
<div class="callout warning">
<h3>Warning</h3>
<p>Please be careful!</p>
</div>
<!-- Error callout (red) -->
<div class="callout error">
<h3>Error</h3>
<p>Something went wrong!</p>
</div>
<!-- Success callout (green) -->
<div class="callout success">
<h3>Success</h3>
<p>Operation completed successfully!</p>
</div>
<!-- Ghost callout (gray) -->
<div class="callout ghost">
<h3>Note</h3>
<p>A neutral message.</p>
</div>
<!-- Hard variant with thick left border -->
<div class="callout warning hard">
<h3>Important</h3>
<p>This has a thick left border accent.</p>
</div>
Table wrapper:
<div class="table">
<table>
<thead>
<tr>
<th>Header 1</th>
<th>Header 2</th>
<th>Header 3</th>
</tr>
</thead>
<tbody>
<tr>
<td>Data 1</td>
<td>Data 2</td>
<td>Data 3</td>
</tr>
<tr>
<td>Data 4</td>
<td>Data 5</td>
<td>Data 6</td>
</tr>
</tbody>
</table>
</div>
<!-- Responsive with horizontal scroll on small screens -->
Aspect ratio utilities:
<div class="aspect-square">1:1</div>
<div class="aspect-video">16:9</div>
<div class="aspect-4-3">4:3</div>
<div class="aspect-21-9">21:9</div>
<!-- Or use custom: aspect-ratio: var(--aspect-ratio) -->
Form validation states:
<input class="error" />
<small class="error">Error message</small>
<input class="success" />
<small class="success">Success message</small>
<input class="warning" />
<small class="warning">Warning message</small>
Other utilities:
<ul class="no-list">
Clean list
</ul>
<div class="visually-hidden">Screen reader only</div>
<button class="circle">Icon</button>
Customize layouts:
<div class="layout-card" style="--min-card-width: 250px; --gap: 1rem;">
<!-- Cards with custom min-width and gap -->
</div>
Use design tokens:
.custom-box {
padding: var(--pad-m);
border-radius: var(--br-s);
box-shadow: var(--shadow-3);
background: var(--fg-05);
}
Available variables:
--vs-s, --vs-base, --vs-m, --vs-l, --vs-xl--br-xs, --br-s, --br-m, --br-l--border-05, --border-1, --border-2--pad-xs, --pad-s, --pad-m, --pad-l--lh-tight, --lh-normal, --lh-loose--shadow-1 through --shadow-6--ease-smooth, --ease-bounce, --ease-emphasized--yellow, --yellow-1 through --yellow-9--amber, --amber-1 through --amber-9--orange, --orange-1 through --orange-9--red, --red-1 through --red-9--pink, --pink-1 through --pink-9--purple, --purple-1 through --purple-9--indigo, --indigo-1 through --indigo-9--blue, --blue-1 through --blue-9--teal, --teal-1 through --teal-9--green, --green-1 through --green-9--lime, --lime-1 through --lime-9--highlighter, --highlighter-1 through --highlighter-9--brown, --brown-1 through --brown-9--gray-1 through --gray-9--slate, --slate-1 through --slate-9--fg, --bg, --fg-05, --fg-1clamp() and pow().fc classlight-dark() with color-scheme for automatic theming@drop-in/decks component stylesGraffiti uses modern CSS features and requires recent browser versions:
Minimum versions:
Key features requiring modern browsers:
light-dark() function for automatic theminglinear() easing functionsGraceful degradation:
While these features enhance the experience, basic layout and typography will work in older browsers. Consider using @supports queries if you need to support older browsers:
@supports (color: oklch(0.5 0.2 180)) {
/* OKLCH color styles */
}
Full documentation: https://drop-in-graffiti.netlify.app/
ISC
FAQs
A dope package to theme @drop-in
The npm package @drop-in/graffiti receives a total of 144 weekly downloads. As such, @drop-in/graffiti popularity was classified as not popular.
We found that @drop-in/graffiti demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.

Security News
arXiv now limits authors to two submissions a month as AI slop overwhelms moderators, delays good papers, and sparks debate over applying the limit to everyone.

Research
/Security News
A new GhostAction wave hits hundreds of GitHub repos, expanding CI/CD secret theft to cloud and AI credentials in source code and git history.

Research
/Security News
Tensorlake npm SDK version 0.5.144 was compromised in a ChainDrop / Shai-Hulud attack, delivering credential-stealing malware.