Giter VIP home page Giter VIP logo

twind-wmr's Introduction

@rschristian/twind-preact-iso


@rschristian/twind-preact-iso is a (slightly) opinionated integration for twind v1 with preact-iso.

Install

$ npm install @rschristian/twind-preact-iso

Usage

The following diff is a basic example taken from the create-preact starter, with the 'router' & 'prerender' options enabled:

-import { LocationProvider, Router, Route, hydrate, prerender as ssr } from 'preact-iso';
+import { LocationProvider, Router, Route } from 'preact-iso';
+import { withTwind } from '@rschristian/twind-preact-iso';

 import { Header } from './components/Header.jsx';
 import { Home } from './pages/Home/index.jsx';
 import { NotFound } from './pages/_404.jsx';
 import './style.css';

 const About = lazy(() => import('./pages/about/index.js'));

 export function App() {
 	return (
 		<LocationProvider>
 			<Header />
 			<main>
 				<Router>
 					<Route path="/" component={Home} />
 					<Route default component={NotFound} />
 				</Router>
 			</main>
 		</LocationProvider>
 	);
 }

+const { hydrate, prerender } = withTwind(
+    () => import('./twind.config'),
+    (data) => <App {...data} />,
+);

 if (typeof window !== 'undefined') {
	hydrate(<App />, document.getElementById('app'));
 }

-export async function prerender(data) {
-    return await ssr(<App {...data} />);
-}
+export { prerender };

API

config

Type: () => Promise<{ twindConfig: TwindConfig | TwindUserConfig }>

Provide your Twind config via a callback function that returns a Promise containing your config upon the twindConfig key. While this is a tad cumbersome, it's done to ensure that no pieces of Twind are dragged into your client-side bundles when you choose not to hydrate with it.

prerenderCallback

Type: (data: any) => VNode

Argument passed to preact-iso's prerender. Pass a callback target for prerendering your app.

hydrateWithTwind

Type: boolean
Default: import.meta.env.NODE_ENV !== 'production'

Whether Twind should be allowed to run client-side, effectively. By default it's disabled in prod.

If you're using grouped classes, I suggest you look at vite-plugin-tailwind-grouping to expand the groups in your JS bundles. Without Twind to translate grouped classes client-side, hydrating with them will result in broken styling.

Acknowledgements

This is massively based upon the excellent @twind/wmr by github.com/sastan.

License

MIT © Ryan Christian

twind-wmr's People

Contributors

rschristian avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.