Skip to content

Commit 74f436f

Browse files
sacrosancticjycouetmanuel3108
authored
feat(cli): co-locate css file from usage (+layout.svelte) (#780)
Co-authored-by: jyc.dev <[email protected]> Co-authored-by: Manuel Serret <[email protected]>
1 parent b983cb3 commit 74f436f

File tree

7 files changed

+37
-8
lines changed

7 files changed

+37
-8
lines changed

.changeset/busy-sides-play.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'sv': patch
3+
---
4+
5+
feat(tailwind): add vscode setting for tailwind

.changeset/rich-tires-talk.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'sv': patch
3+
---
4+
5+
feat(create): co-locate css file from usage (`layout.css` & `+layout.svelte`)

documentation/docs/30-add-ons/50-tailwind.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ npx sv add tailwindcss
1414

1515
- Tailwind setup following the [Tailwind for SvelteKit guide](https://tailwindcss.com/docs/installation/framework-guides/sveltekit)
1616
- Tailwind Vite plugin
17-
- updated `app.css` and `+layout.svelte` (for SvelteKit) or `App.svelte` (for non-SvelteKit Vite apps)
17+
- updated `layout.css` and `+layout.svelte` (for SvelteKit) or `app.css` and `App.svelte` (for non-SvelteKit Vite apps)
1818
- integration with `prettier` if using that package
1919

2020
## Options

packages/addons/prettier/index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ export default defineAddon({
77
shortDescription: 'formatter',
88
homepage: 'https://prettier.io',
99
options: {},
10-
run: ({ sv, dependencyVersion }) => {
10+
run: ({ sv, dependencyVersion, kit }) => {
1111
const tailwindcssInstalled = Boolean(dependencyVersion('tailwindcss'));
1212
if (tailwindcssInstalled) sv.devDependency('prettier-plugin-tailwindcss', '^0.7.1');
1313

@@ -53,7 +53,7 @@ export default defineAddon({
5353
if (!plugins.includes('prettier-plugin-tailwindcss')) {
5454
data.plugins.unshift('prettier-plugin-tailwindcss');
5555
}
56-
data.tailwindStylesheet ??= './src/app.css';
56+
data.tailwindStylesheet ??= kit ? `${kit?.routesDirectory}/layout.css` : './src/app.css';
5757
}
5858
if (!plugins.includes('prettier-plugin-svelte')) {
5959
data.plugins.unshift('prettier-plugin-svelte');

packages/addons/tailwindcss/index.ts

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,16 @@ export default defineAddon({
3535
run: ({ sv, options, files, typescript, kit, dependencyVersion }) => {
3636
const prettierInstalled = Boolean(dependencyVersion('prettier'));
3737

38+
const stylesheet = kit
39+
? ({
40+
rootPath: `${kit.routesDirectory}/layout.css`,
41+
relativePath: './layout.css'
42+
} as const)
43+
: ({
44+
rootPath: 'src/app.css',
45+
relativePath: './app.css'
46+
} as const);
47+
3848
sv.devDependency('tailwindcss', '^4.1.14');
3949
sv.devDependency('@tailwindcss/vite', '^4.1.14');
4050
sv.pnpmBuildDependency('@tailwindcss/oxide');
@@ -58,7 +68,7 @@ export default defineAddon({
5868
return generateCode();
5969
});
6070

61-
sv.file('src/app.css', (content) => {
71+
sv.file(stylesheet.rootPath, (content) => {
6272
let atRules = parseCss(content).ast.nodes.filter((node) => node.type === 'atrule');
6373

6474
const findAtRule = (name: string, params: string) =>
@@ -96,13 +106,13 @@ export default defineAddon({
96106
if (!kit) {
97107
sv.file('src/App.svelte', (content) => {
98108
const { script, generateCode } = parseSvelte(content, { typescript });
99-
imports.addEmpty(script.ast, { from: './app.css' });
109+
imports.addEmpty(script.ast, { from: stylesheet.relativePath });
100110
return generateCode({ script: script.generateCode() });
101111
});
102112
} else {
103113
sv.file(`${kit?.routesDirectory}/+layout.svelte`, (content) => {
104114
const { script, template, generateCode } = parseSvelte(content, { typescript });
105-
imports.addEmpty(script.ast, { from: '../app.css' });
115+
imports.addEmpty(script.ast, { from: stylesheet.relativePath });
106116

107117
if (content.length === 0) {
108118
const svelteVersion = dependencyVersion('svelte');
@@ -120,6 +130,15 @@ export default defineAddon({
120130
});
121131
}
122132

133+
sv.file('.vscode/settings.json', (content) => {
134+
const { data, generateCode } = parseJson(content);
135+
136+
data['files.associations'] ??= {};
137+
data['files.associations']['*.css'] = 'tailwind';
138+
139+
return generateCode();
140+
});
141+
123142
if (prettierInstalled) {
124143
sv.file('.prettierrc', (content) => {
125144
const { data, generateCode } = parseJson(content);
@@ -130,7 +149,7 @@ export default defineAddon({
130149

131150
if (!plugins.includes(PLUGIN_NAME)) plugins.push(PLUGIN_NAME);
132151

133-
data.tailwindStylesheet ??= './src/app.css';
152+
data.tailwindStylesheet ??= stylesheet.rootPath;
134153

135154
return generateCode();
136155
});

packages/create/templates/demo/src/routes/+layout.svelte

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<script lang="ts">
22
import Header from './Header.svelte';
3-
import '../app.css';
3+
import './layout.css';
44
55
/** @type {{children: import('svelte').Snippet}} */
66
let { children } = $props();

0 commit comments

Comments
 (0)