@unocss/vite 0.32.0 → 0.32.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2021 Anthony Fu <https://github.com/antfu>
3
+ Copyright (c) 2021-PRESENT Anthony Fu <https://github.com/antfu>
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
package/README.md CHANGED
@@ -28,11 +28,33 @@ Add `uno.css` to your main entry:
28
28
  import 'uno.css'
29
29
  ```
30
30
 
31
+ ### Presetless usage
32
+
33
+ ```bash
34
+ npm i -D @unocss/vite
35
+ ```
36
+
37
+ ```ts
38
+ // vite.config.ts
39
+ import Unocss from '@unocss/vite'
40
+
41
+ export default {
42
+ plugins: [
43
+ Unocss({
44
+ presets: [
45
+ /* no presets by default */
46
+ ],
47
+ /* options */
48
+ }),
49
+ ],
50
+ }
51
+ ```
52
+
31
53
  ## Modes
32
54
 
33
55
  The Vite plugin comes with a set of modes that enable different behaviors.
34
56
 
35
- ### global (default)
57
+ ###### `global` (default)
36
58
 
37
59
  This is the default mode for the plugin: in this mode you need to add the import of `uno.css` on your entry point.
38
60
 
@@ -40,25 +62,25 @@ This mode enables a set of Vite plugins for `build` and for `dev` with `HMR` sup
40
62
 
41
63
  The generated `css` will be a global stylesheet injected on the `index.html`.
42
64
 
43
- ### vue-scoped
65
+ ###### `vue-scoped`
44
66
 
45
67
  This mode will inject generated CSS to Vue SFC's `<style scoped>` for isolation.
46
68
 
47
- ### svelte-scoped
69
+ ###### `svelte-scoped`
48
70
 
49
71
  This mode will inject generated CSS to Svelte's `<style>` for isolation.
50
72
 
51
- ### shadow-dom
73
+ ###### `shadow-dom`
52
74
 
53
75
  Since `Web Components` uses `Shadow DOM`, there is no way to style content directly from a global stylesheet (unless you use `custom css vars`, those will penetrate the `Shadow DOM`), you need to inline the generated css by the plugin into the `Shadow DOM` style.
54
76
 
55
77
  To inline the generated css, you only need to configure the plugin mode to `shadow-dom` and include `@unocss-placeholder` magic placeholder on each web component style css block.
56
78
 
57
- ### per-module (Experimental)
79
+ ###### `per-module` (Experimental)
58
80
 
59
81
  This mode will generate a CSS sheet for each module, can be scoped.
60
82
 
61
- ### dist-chunk (Experimental)
83
+ ###### `dist-chunk` (Experimental)
62
84
 
63
85
  This mode will generate a CSS sheet for each code chunk on build, great for MPA.
64
86
 
@@ -201,7 +223,7 @@ You must add the plugin before `@sveltejs/vite-plugin-svelte`.
201
223
 
202
224
  To support `class:foo` and `class:foo={bar}` add the plugin and configure `extractorSvelte` on `extractors` option.
203
225
 
204
- You can use simple rules with `class:`, for example `class:bg-red-500={foo}` or using `shorcuts` to include multiples rules, see `src/App.svelte` on linked example project bellow.
226
+ You can use simple rules with `class:`, for example `class:bg-red-500={foo}` or using `shorcuts` to include multiples rules, see `src/App.svelte` on linked example project below.
205
227
 
206
228
  ```ts
207
229
  // vite.config.js
@@ -226,7 +248,7 @@ You have a `Vite + Svelte` example project on [examples/vite-svelte](https://git
226
248
 
227
249
  To support `class:foo` and `class:foo={bar}` add the plugin and configure `extractorSvelte` on `extractors` option.
228
250
 
229
- You can use simple rules with `class:`, for example `class:bg-red-500={foo}` or using `shorcuts` to include multiples rules, see `src/routes/__layout.svelte` on linked example project bellow.
251
+ You can use simple rules with `class:`, for example `class:bg-red-500={foo}` or using `shorcuts` to include multiples rules, see `src/routes/__layout.svelte` on linked example project below.
230
252
 
231
253
  ```ts
232
254
  // svelte.config.js
@@ -240,7 +262,7 @@ const config = {
240
262
  // for more information about preprocessors
241
263
  preprocess: preprocess(),
242
264
  kit: {
243
- vite: {
265
+ vite: {
244
266
  plugins: [
245
267
  UnoCss({
246
268
  extractors: [extractorSvelte],
@@ -305,7 +327,7 @@ You have a `Web Components` example project on [examples/vite-lit](https://githu
305
327
 
306
328
  #### `::part` built-in support
307
329
 
308
- You can use `::part` since the plugin supports it via `shortcuts` and using `part-[<part-name>]:<rule|shortcut>` rule from `preset-mini`, for example using it with simple rules like `part-[<part-name>]:bg-green-500` or using some `shortcut`: check `src/my-element.ts` on linked example project bellow.
330
+ You can use `::part` since the plugin supports it via `shortcuts` and using `part-[<part-name>]:<rule|shortcut>` rule from `preset-mini`, for example using it with simple rules like `part-[<part-name>]:bg-green-500` or using some `shortcut`: check `src/my-element.ts` on linked example project below.
309
331
 
310
332
  The `part-[<part-name>]:<rule|shortcut>` will work only with this plugin using the `shadow-dom` mode.
311
333
 
@@ -401,4 +423,4 @@ You have a `Vite + Elm` example project on [examples/vite-elm](https://github.co
401
423
 
402
424
  ## License
403
425
 
404
- MIT License © 2021-PRESENT [Anthony Fu](https://github.com/antfu)
426
+ MIT License &copy; 2021-PRESENT [Anthony Fu](https://github.com/antfu)
package/dist/index.cjs CHANGED
@@ -119,12 +119,29 @@ function createContext(configOrPath, defaults = {}, extraConfigSources = [], res
119
119
  };
120
120
  }
121
121
 
122
- function getHash(input, length = 8) {
123
- return crypto.createHash("sha256").update(input).digest("hex").slice(0, length);
124
- }
125
122
  function getPath(id) {
126
123
  return id.replace(/\?.*$/, "");
127
124
  }
125
+ function replaceAsync(string, searchValue, replacer) {
126
+ try {
127
+ if (typeof replacer === "function") {
128
+ const values = [];
129
+ String.prototype.replace.call(string, searchValue, (...args) => {
130
+ values.push(replacer(...args));
131
+ return "";
132
+ });
133
+ return Promise.all(values).then((resolvedValues) => {
134
+ return String.prototype.replace.call(string, searchValue, () => {
135
+ return resolvedValues.shift() || "";
136
+ });
137
+ });
138
+ } else {
139
+ return Promise.resolve(String.prototype.replace.call(string, searchValue, replacer));
140
+ }
141
+ } catch (error) {
142
+ return Promise.reject(error);
143
+ }
144
+ }
128
145
 
129
146
  function ChunkModeBuildPlugin({ uno, filter }) {
130
147
  let cssPlugin;
@@ -168,6 +185,10 @@ function ChunkModeBuildPlugin({ uno, filter }) {
168
185
  };
169
186
  }
170
187
 
188
+ function getHash(input, length = 8) {
189
+ return crypto.createHash("sha256").update(input).digest("hex").slice(0, length);
190
+ }
191
+
171
192
  function GlobalModeBuildPlugin({ uno, ready, extract, tokens, modules, filter, getConfig }) {
172
193
  const vfsLayerMap = /* @__PURE__ */ new Map();
173
194
  let tasks = [];
@@ -268,11 +289,11 @@ function GlobalModeBuildPlugin({ uno, ready, extract, tokens, modules, filter, g
268
289
  for (const file of cssFiles) {
269
290
  const chunk = bundle[file];
270
291
  if (chunk.type === "asset" && typeof chunk.source === "string") {
271
- const css = chunk.source.replace(HASH_PLACEHOLDER_RE, "").replace(LAYER_PLACEHOLDER_RE, (_2, __, layer) => {
292
+ const css = chunk.source.replace(HASH_PLACEHOLDER_RE, "");
293
+ chunk.source = await replaceAsync(css, LAYER_PLACEHOLDER_RE, async (_2, __, layer) => {
272
294
  replaced = true;
273
- return layer === LAYER_MARK_ALL ? result.getLayers(void 0, Array.from(vfsLayerMap.values())) : result.getLayer(layer) || "";
295
+ return await transformCSS(layer === LAYER_MARK_ALL ? result.getLayers(void 0, Array.from(vfsLayerMap.values())) : result.getLayer(layer) || "", `${chunk.fileName}.css`);
274
296
  });
275
- chunk.source = await transformCSS(css, `${chunk.fileName}.css`);
276
297
  }
277
298
  }
278
299
  if (!replaced)
@@ -289,7 +310,6 @@ function GlobalModeDevPlugin({ uno, tokens, onInvalidate, extract, filter }) {
289
310
  let base = "";
290
311
  const tasks = [];
291
312
  const entries = /* @__PURE__ */ new Map();
292
- const cssModules = /* @__PURE__ */ new Set();
293
313
  let invalidateTimer;
294
314
  let lastUpdate = Date.now();
295
315
  let lastServed = 0;
@@ -303,12 +323,8 @@ function GlobalModeDevPlugin({ uno, tokens, onInvalidate, extract, filter }) {
303
323
  base = base.slice(0, base.length - 1);
304
324
  }
305
325
  function invalidate(timer = 10) {
306
- const ids = [
307
- ...entries.keys(),
308
- ...cssModules.keys()
309
- ];
310
326
  for (const server of servers) {
311
- for (const id of ids) {
327
+ for (const id of entries.keys()) {
312
328
  const mod = server.moduleGraph.getModuleById(id);
313
329
  if (!mod)
314
330
  continue;
@@ -320,14 +336,10 @@ function GlobalModeDevPlugin({ uno, tokens, onInvalidate, extract, filter }) {
320
336
  }
321
337
  function sendUpdate() {
322
338
  lastUpdate = Date.now();
323
- const ids = [
324
- ...entries.keys(),
325
- ...cssModules.keys()
326
- ];
327
339
  for (const server of servers) {
328
340
  server.ws.send({
329
341
  type: "update",
330
- updates: Array.from(ids).map((i) => ({
342
+ updates: Array.from(entries.keys()).map((i) => ({
331
343
  acceptedPath: i,
332
344
  path: i,
333
345
  timestamp: lastUpdate,
@@ -388,8 +400,6 @@ function GlobalModeDevPlugin({ uno, tokens, onInvalidate, extract, filter }) {
388
400
  entries.set(entry.id, entry.layer);
389
401
  return entry.id;
390
402
  }
391
- if (id.match(regexCssId))
392
- cssModules.add(id);
393
403
  },
394
404
  async load(id) {
395
405
  const layer = entries.get(getPath(id));
package/dist/index.mjs CHANGED
@@ -109,12 +109,29 @@ function createContext(configOrPath, defaults = {}, extraConfigSources = [], res
109
109
  };
110
110
  }
111
111
 
112
- function getHash(input, length = 8) {
113
- return createHash("sha256").update(input).digest("hex").slice(0, length);
114
- }
115
112
  function getPath(id) {
116
113
  return id.replace(/\?.*$/, "");
117
114
  }
115
+ function replaceAsync(string, searchValue, replacer) {
116
+ try {
117
+ if (typeof replacer === "function") {
118
+ const values = [];
119
+ String.prototype.replace.call(string, searchValue, (...args) => {
120
+ values.push(replacer(...args));
121
+ return "";
122
+ });
123
+ return Promise.all(values).then((resolvedValues) => {
124
+ return String.prototype.replace.call(string, searchValue, () => {
125
+ return resolvedValues.shift() || "";
126
+ });
127
+ });
128
+ } else {
129
+ return Promise.resolve(String.prototype.replace.call(string, searchValue, replacer));
130
+ }
131
+ } catch (error) {
132
+ return Promise.reject(error);
133
+ }
134
+ }
118
135
 
119
136
  function ChunkModeBuildPlugin({ uno, filter }) {
120
137
  let cssPlugin;
@@ -158,6 +175,10 @@ function ChunkModeBuildPlugin({ uno, filter }) {
158
175
  };
159
176
  }
160
177
 
178
+ function getHash(input, length = 8) {
179
+ return createHash("sha256").update(input).digest("hex").slice(0, length);
180
+ }
181
+
161
182
  function GlobalModeBuildPlugin({ uno, ready, extract, tokens, modules, filter, getConfig }) {
162
183
  const vfsLayerMap = /* @__PURE__ */ new Map();
163
184
  let tasks = [];
@@ -258,11 +279,11 @@ function GlobalModeBuildPlugin({ uno, ready, extract, tokens, modules, filter, g
258
279
  for (const file of cssFiles) {
259
280
  const chunk = bundle[file];
260
281
  if (chunk.type === "asset" && typeof chunk.source === "string") {
261
- const css = chunk.source.replace(HASH_PLACEHOLDER_RE, "").replace(LAYER_PLACEHOLDER_RE, (_2, __, layer) => {
282
+ const css = chunk.source.replace(HASH_PLACEHOLDER_RE, "");
283
+ chunk.source = await replaceAsync(css, LAYER_PLACEHOLDER_RE, async (_2, __, layer) => {
262
284
  replaced = true;
263
- return layer === LAYER_MARK_ALL ? result.getLayers(void 0, Array.from(vfsLayerMap.values())) : result.getLayer(layer) || "";
285
+ return await transformCSS(layer === LAYER_MARK_ALL ? result.getLayers(void 0, Array.from(vfsLayerMap.values())) : result.getLayer(layer) || "", `${chunk.fileName}.css`);
264
286
  });
265
- chunk.source = await transformCSS(css, `${chunk.fileName}.css`);
266
287
  }
267
288
  }
268
289
  if (!replaced)
@@ -279,7 +300,6 @@ function GlobalModeDevPlugin({ uno, tokens, onInvalidate, extract, filter }) {
279
300
  let base = "";
280
301
  const tasks = [];
281
302
  const entries = /* @__PURE__ */ new Map();
282
- const cssModules = /* @__PURE__ */ new Set();
283
303
  let invalidateTimer;
284
304
  let lastUpdate = Date.now();
285
305
  let lastServed = 0;
@@ -293,12 +313,8 @@ function GlobalModeDevPlugin({ uno, tokens, onInvalidate, extract, filter }) {
293
313
  base = base.slice(0, base.length - 1);
294
314
  }
295
315
  function invalidate(timer = 10) {
296
- const ids = [
297
- ...entries.keys(),
298
- ...cssModules.keys()
299
- ];
300
316
  for (const server of servers) {
301
- for (const id of ids) {
317
+ for (const id of entries.keys()) {
302
318
  const mod = server.moduleGraph.getModuleById(id);
303
319
  if (!mod)
304
320
  continue;
@@ -310,14 +326,10 @@ function GlobalModeDevPlugin({ uno, tokens, onInvalidate, extract, filter }) {
310
326
  }
311
327
  function sendUpdate() {
312
328
  lastUpdate = Date.now();
313
- const ids = [
314
- ...entries.keys(),
315
- ...cssModules.keys()
316
- ];
317
329
  for (const server of servers) {
318
330
  server.ws.send({
319
331
  type: "update",
320
- updates: Array.from(ids).map((i) => ({
332
+ updates: Array.from(entries.keys()).map((i) => ({
321
333
  acceptedPath: i,
322
334
  path: i,
323
335
  timestamp: lastUpdate,
@@ -378,8 +390,6 @@ function GlobalModeDevPlugin({ uno, tokens, onInvalidate, extract, filter }) {
378
390
  entries.set(entry.id, entry.layer);
379
391
  return entry.id;
380
392
  }
381
- if (id.match(regexCssId))
382
- cssModules.add(id);
383
393
  },
384
394
  async load(id) {
385
395
  const layer = entries.get(getPath(id));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unocss/vite",
3
- "version": "0.32.0",
3
+ "version": "0.32.8",
4
4
  "description": "The Vite plugin for UnoCSS",
5
5
  "keywords": [
6
6
  "unocss",
@@ -43,19 +43,18 @@
43
43
  },
44
44
  "dependencies": {
45
45
  "@rollup/pluginutils": "^4.2.1",
46
- "@unocss/config": "0.32.0",
47
- "@unocss/core": "0.32.0",
48
- "@unocss/inspector": "0.32.0",
49
- "@unocss/scope": "0.32.0",
50
- "@unocss/transformer-directives": "0.32.0",
46
+ "@unocss/config": "0.32.8",
47
+ "@unocss/core": "0.32.8",
48
+ "@unocss/inspector": "0.32.8",
49
+ "@unocss/scope": "0.32.8",
50
+ "@unocss/transformer-directives": "0.32.8",
51
51
  "magic-string": "^0.26.1"
52
52
  },
53
53
  "devDependencies": {
54
- "vite": "^2.9.5"
54
+ "vite": "^2.9.6"
55
55
  },
56
56
  "scripts": {
57
57
  "build": "unbuild",
58
58
  "stub": "unbuild --stub"
59
- },
60
- "readme": "# @unocss/vite\n\nThe Vite plugin for UnoCSS. Ships with the `unocss` package.\n\n> This plugin does not come with any default presets. You are building a meta framework on top of UnoCSS, see [this file](https://github.com/unocss/unocss/blob/main/packages/unocss/src/vite.ts) for an example to bind the default presets.\n\n## Installation\n\n```bash\nnpm i -D unocss\n```\n\n```ts\n// vite.config.ts\nimport Unocss from 'unocss/vite'\n\nexport default {\n plugins: [\n Unocss({ /* options */ }),\n ],\n}\n```\n\nAdd `uno.css` to your main entry:\n\n```ts\n// main.ts\nimport 'uno.css'\n```\n\n## Modes\n\nThe Vite plugin comes with a set of modes that enable different behaviors.\n\n### global (default)\n\nThis is the default mode for the plugin: in this mode you need to add the import of `uno.css` on your entry point.\n\nThis mode enables a set of Vite plugins for `build` and for `dev` with `HMR` support.\n\nThe generated `css` will be a global stylesheet injected on the `index.html`.\n\n### vue-scoped\n\nThis mode will inject generated CSS to Vue SFC's `<style scoped>` for isolation.\n\n### svelte-scoped\n\nThis mode will inject generated CSS to Svelte's `<style>` for isolation.\n\n### shadow-dom\n\nSince `Web Components` uses `Shadow DOM`, there is no way to style content directly from a global stylesheet (unless you use `custom css vars`, those will penetrate the `Shadow DOM`), you need to inline the generated css by the plugin into the `Shadow DOM` style.\n\nTo inline the generated css, you only need to configure the plugin mode to `shadow-dom` and include `@unocss-placeholder` magic placeholder on each web component style css block.\n\n### per-module (Experimental)\n\nThis mode will generate a CSS sheet for each module, can be scoped.\n\n### dist-chunk (Experimental)\n\nThis mode will generate a CSS sheet for each code chunk on build, great for MPA.\n\n## \"Design in DevTools\"\n\nBecause of limitation of \"on-demand\" where the DevTools don't know those you haven't used in your source code yet. So if you want to try how things work by directly changing the classes in DevTools, just add the following lines to your main entry.\n\n```ts\nimport 'uno.css'\nimport 'virtual:unocss-devtools'\n```\n\n> ⚠️ Please use it with caution, under the hood we use [`MutationObserver`](https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver) to detect the class changes. Which means not only your manual changes but also the changes made by your scripts will be detected and included in the stylesheet. This could cause some misalignment between dev and the production build when you add dynamic classes based on some logic in script tags. We recommended adding your dynamic parts to the [safelist](https://github.com/unocss/unocss/issues/511) or setup UI regression tests for your production build if possible.\n\n`virtual:unocss-devtools` will be an empty bundle in production.\n\n## Frameworks\n\nSome UI/App frameworks have some caveats that must be fixed to make it work, if you're using one of the following frameworks, just apply the suggestions.\n\n### React\n\n**WARNING**: You should import the `uno.css` virtual module using `import 'virtual:uno.css'` instead `import 'uno.css'`. When you start the dev server first time, you'll need to update some style module to get it working (we're trying to fix it).\n\nIf you're using `@vitejs/plugin-react`:\n\n```ts\n// vite.config.js\nimport react from '@vitejs/plugin-react'\nimport Unocss from 'unocss/vite'\n\nexport default {\n plugins: [\n react(),\n Unocss({\n /* options */\n }),\n ],\n}\n```\n\nor if you're using `@vitejs/plugin-react-refresh`:\n\n```ts\n// vite.config.js\nimport reactRefresh from '@vitejs/plugin-react-refresh'\nimport Unocss from 'unocss/vite'\n\nexport default {\n plugins: [\n reactRefresh(),\n Unocss({\n /* options */\n }),\n ],\n}\n```\n\nIf you're using `@unocss/preset-attributify` you should remove `tsc` from the `build` script.\n\nIf you are using `@vitejs/plugin-react` with `@unocss/preset-attributify`, you must add the plugin before `@vitejs/plugin-react`.\n\n```ts\n// vite.config.js\nimport react from '@vitejs/plugin-react'\nimport Unocss from 'unocss/vite'\n\nexport default {\n plugins: [\n Unocss({\n /* options */\n }),\n react(),\n ],\n}\n```\n\nYou have a `React` example project on [examples/vite-react](https://github.com/unocss/unocss/tree/main/examples/vite-react) directory using both plugins, check the scripts on `package.json` and its Vite configuration file.\n\n### Preact\n\nIf you're using `@preact/preset-vite`:\n\n```ts\n// vite.config.js\nimport preact from '@preact/preset-vite'\nimport Unocss from 'unocss/vite'\n\nexport default {\n plugins: [\n preact(),\n Unocss({\n /* options */\n }),\n ],\n}\n```\n\nor if you're using `@prefresh/vite`:\n\n```ts\n// vite.config.js\nimport prefresh from '@prefresh/vite'\nimport Unocss from 'unocss/vite'\n\nexport default {\n plugins: [\n prefresh(),\n Unocss({\n /* options */\n }),\n ],\n}\n```\n\nIf you're using `@unocss/preset-attributify` you should remove `tsc` from the `build` script.\n\nIf you are using `@preact/preset-vite` with `@unocss/preset-attributify`, you must add the plugin before `@preact/preset-vite`.\n\n```ts\n// vite.config.js\nimport preact from '@preact/preset-vite'\nimport Unocss from 'unocss/vite'\n\nexport default {\n plugins: [\n Unocss({\n /* options */\n }),\n preact(),\n ],\n}\n```\n\nYou have a `Preact` example project on [examples/vite-preact](https://github.com/unocss/unocss/tree/main/examples/vite-preact) directory using both plugins, check the scripts on `package.json` and its Vite configuration file.\n\n### Svelte\n\nYou must add the plugin before `@sveltejs/vite-plugin-svelte`.\n\nTo support `class:foo` and `class:foo={bar}` add the plugin and configure `extractorSvelte` on `extractors` option.\n\nYou can use simple rules with `class:`, for example `class:bg-red-500={foo}` or using `shorcuts` to include multiples rules, see `src/App.svelte` on linked example project bellow.\n\n```ts\n// vite.config.js\nimport { svelte } from '@sveltejs/vite-plugin-svelte'\nimport Unocss from 'unocss/vite'\nimport { extractorSvelte } from '@unocss/core'\n\nexport default {\n plugins: [\n Unocss({\n extractors: [extractorSvelte],\n /* more options */\n }),\n svelte(),\n ],\n}\n```\n\nYou have a `Vite + Svelte` example project on [examples/vite-svelte](https://github.com/unocss/unocss/tree/main/examples/vite-svelte) directory.\n\n### Sveltekit\n\nTo support `class:foo` and `class:foo={bar}` add the plugin and configure `extractorSvelte` on `extractors` option.\n\nYou can use simple rules with `class:`, for example `class:bg-red-500={foo}` or using `shorcuts` to include multiples rules, see `src/routes/__layout.svelte` on linked example project bellow.\n\n```ts\n// svelte.config.js\nimport preprocess from 'svelte-preprocess'\nimport UnoCss from 'unocss/vite'\nimport { extractorSvelte } from '@unocss/core'\n\n/** @type {import('@sveltejs/kit').Config} */\nconst config = {\n // Consult https://github.com/sveltejs/svelte-preprocess\n // for more information about preprocessors\n preprocess: preprocess(),\n kit: {\n vite: {\n plugins: [\n UnoCss({\n extractors: [extractorSvelte],\n /* more options */\n }),\n ],\n },\n },\n}\n```\n\nYou have a `SvelteKit` example project on [examples/sveltekit](https://github.com/unocss/unocss/tree/main/examples/sveltekit) directory.\n\n### Web Components\n\nTo work with web components you need to enable `shadow-dom` mode on the plugin.\n\nDon't forget to remove the import for `uno.css` since the `shadow-dom` mode will not expose it and the application will not work.\n\n```ts\n// vite.config.js\nimport Unocss from 'unocss/vite'\n\nexport default {\n plugins: [\n Unocss({\n mode: 'shadow-dom',\n /* more options */\n }),\n ],\n}\n```\n\nOn each `web component` just add `@unocss-placeholder` to its style css block:\n```ts\nconst template = document.createElement('template')\ntemplate.innerHTML = `\n<style>\n:host {...}\n@unocss-placeholder\n</style>\n<div class=\"m-1em\">\n...\n</div>\n`\n```\n\nIf you're using [Lit](https://lit.dev/):\n\n```ts\n@customElement('my-element')\nexport class MyElement extends LitElement {\n static styles = css`\n :host {...}\n @unocss-placeholder\n `\n // ...\n}\n```\n\nYou have a `Web Components` example project on [examples/vite-lit](https://github.com/unocss/unocss/tree/main/examples/vite-lit) directory.\n\n#### `::part` built-in support\n\nYou can use `::part` since the plugin supports it via `shortcuts` and using `part-[<part-name>]:<rule|shortcut>` rule from `preset-mini`, for example using it with simple rules like `part-[<part-name>]:bg-green-500` or using some `shortcut`: check `src/my-element.ts` on linked example project bellow.\n\nThe `part-[<part-name>]:<rule|shortcut>` will work only with this plugin using the `shadow-dom` mode.\n\nThe plugin uses `nth-of-type` to avoid collisions with multiple parts in the same web component and for the same parts on distinct web components, you don't need to worry about it, the plugin will take care for you.\n\n```ts\n// vite.config.js\nimport Unocss from 'unocss/vite'\n\nexport default {\n plugins: [\n Unocss({\n mode: 'shadow-dom',\n shortcuts: [\n { 'cool-blue': 'bg-blue-500 text-white' },\n { 'cool-green': 'bg-green-500 text-black' },\n ],\n /* more options */\n }),\n ],\n}\n```\n\nthen in your web components:\n\n```ts\n// my-container-wc.ts\nconst template = document.createElement('template')\ntemplate.innerHTML = `\n<style>\n@unocss-placeholder\n</style>\n<my-wc-with-parts class=\"part-[cool-part]:cool-blue part-[another-cool-part]:cool-green\">...</my-wc-with-parts>\n`\n```\n\n```ts\n// my-wc-with-parts.ts\nconst template = document.createElement('template')\ntemplate.innerHTML = `\n<style>\n@unocss-placeholder\n</style>\n<div>\n <div part=\"cool-part\">...</div>\n <div part=\"another-cool-part\">...</div>\n</div>\n`\n```\n\n### Solid\n\n**WARNING**: You should import the `uno.css` virtual module using `import 'virtual:uno.css'` instead `import 'uno.css'`. When you start the dev server first time, you'll need to update some style module to get it working (we're trying to fix it).\n\n```ts\n// vite.config.js\nimport solidPlugin from 'vite-plugin-solid'\nimport Unocss from 'unocss/vite'\n\nexport default {\n plugins: [\n solidPlugin(),\n Unocss({\n /* options */\n }),\n ],\n}\n```\n\nYou have a `Vite + Solid` example project on [examples/vite-solid](https://github.com/unocss/unocss/tree/main/examples/vite-solid) directory.\n\n### Elm\n\nYou need to add the `vite-plugin-elm` plugin before UnoCSS's plugin.\n\n```ts\n// vite.config.js\nimport { defineConfig } from 'vite'\nimport elmPlugin from 'vite-plugin-elm'\nimport Unocss from 'unocss/vite'\n\nexport default defineConfig({\n plugins: [\n elmPlugin(),\n Unocss({\n /* options */\n }),\n ],\n})\n```\n\nYou have a `Vite + Elm` example project on [examples/vite-elm](https://github.com/unocss/unocss/tree/main/examples/vite-elm) directory.\n\n## License\n\nMIT License © 2021-PRESENT [Anthony Fu](https://github.com/antfu)\n"
59
+ }
61
60
  }