@spicemod/creator 0.0.1
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 +674 -0
- package/README.md +35 -0
- package/dist/bin.d.mts +1 -0
- package/dist/bin.mjs +1739 -0
- package/dist/client/index.d.mts +2175 -0
- package/dist/client/index.mjs +7 -0
- package/dist/templates/extension/js/react/eslint.config.js +29 -0
- package/dist/templates/extension/js/react/src/app.jsx +27 -0
- package/dist/templates/extension/js/react/src/components/Onboarding.jsx +72 -0
- package/dist/templates/extension/js/vanilla/components/Onboarding.js +71 -0
- package/dist/templates/extension/js/vanilla/eslint.config.js +16 -0
- package/dist/templates/extension/js/vanilla/src/app.js +12 -0
- package/dist/templates/extension/meta.json +4 -0
- package/dist/templates/extension/shared/.oxlintrc.json +36 -0
- package/dist/templates/extension/shared/README.template.md +53 -0
- package/dist/templates/extension/shared/app.css +163 -0
- package/dist/templates/extension/shared/biome.json +36 -0
- package/dist/templates/extension/shared/css.d.ts +44 -0
- package/dist/templates/extension/shared/jsconfig.json +32 -0
- package/dist/templates/extension/shared/spice.config.js +9 -0
- package/dist/templates/extension/shared/spice.config.ts +9 -0
- package/dist/templates/extension/shared/tsconfig.json +32 -0
- package/dist/templates/extension/ts/react/eslint.config.ts +29 -0
- package/dist/templates/extension/ts/react/src/app.tsx +27 -0
- package/dist/templates/extension/ts/react/src/components/Onboarding.tsx +83 -0
- package/dist/templates/extension/ts/vanilla/biome.json +36 -0
- package/dist/templates/extension/ts/vanilla/eslint.config.ts +16 -0
- package/dist/templates/extension/ts/vanilla/src/app.ts +12 -0
- package/dist/templates/extension/ts/vanilla/src/components/Onboarding.ts +79 -0
- package/dist/templates/liveReload.js +70 -0
- package/dist/templates/theme/js/react/eslint.config.js +29 -0
- package/dist/templates/theme/js/react/src/app.jsx +25 -0
- package/dist/templates/theme/js/react/src/components/Onboarding.jsx +72 -0
- package/dist/templates/theme/js/vanilla/eslint.config.js +16 -0
- package/dist/templates/theme/js/vanilla/src/app.js +11 -0
- package/dist/templates/theme/js/vanilla/src/components/Onboarding.js +71 -0
- package/dist/templates/theme/meta.json +4 -0
- package/dist/templates/theme/shared/.oxlintrc.json +36 -0
- package/dist/templates/theme/shared/README.template.md +53 -0
- package/dist/templates/theme/shared/app.css +163 -0
- package/dist/templates/theme/shared/biome.json +36 -0
- package/dist/templates/theme/shared/css.d.ts +44 -0
- package/dist/templates/theme/shared/jsconfig.json +31 -0
- package/dist/templates/theme/shared/spice.config.js +9 -0
- package/dist/templates/theme/shared/spice.config.ts +9 -0
- package/dist/templates/theme/shared/tsconfig.json +32 -0
- package/dist/templates/theme/ts/react/eslint.config.ts +29 -0
- package/dist/templates/theme/ts/react/src/app.tsx +26 -0
- package/dist/templates/theme/ts/react/src/components/Onboarding.tsx +83 -0
- package/dist/templates/theme/ts/vanilla/eslint.config.ts +16 -0
- package/dist/templates/theme/ts/vanilla/src/app.ts +11 -0
- package/dist/templates/theme/ts/vanilla/src/components/Onboarding.ts +79 -0
- package/dist/templates/wrapper.js +48 -0
- package/package.json +80 -0
- package/templates/extension/js/react/eslint.config.js +29 -0
- package/templates/extension/js/react/src/app.jsx +27 -0
- package/templates/extension/js/react/src/components/Onboarding.jsx +72 -0
- package/templates/extension/js/vanilla/components/Onboarding.js +71 -0
- package/templates/extension/js/vanilla/eslint.config.js +16 -0
- package/templates/extension/js/vanilla/src/app.js +12 -0
- package/templates/extension/meta.json +4 -0
- package/templates/extension/shared/.oxlintrc.json +36 -0
- package/templates/extension/shared/README.template.md +53 -0
- package/templates/extension/shared/app.css +163 -0
- package/templates/extension/shared/biome.json +36 -0
- package/templates/extension/shared/css.d.ts +44 -0
- package/templates/extension/shared/jsconfig.json +32 -0
- package/templates/extension/shared/spice.config.js +9 -0
- package/templates/extension/shared/spice.config.ts +9 -0
- package/templates/extension/shared/tsconfig.json +32 -0
- package/templates/extension/ts/react/eslint.config.ts +29 -0
- package/templates/extension/ts/react/src/app.tsx +27 -0
- package/templates/extension/ts/react/src/components/Onboarding.tsx +83 -0
- package/templates/extension/ts/vanilla/biome.json +36 -0
- package/templates/extension/ts/vanilla/eslint.config.ts +16 -0
- package/templates/extension/ts/vanilla/src/app.ts +12 -0
- package/templates/extension/ts/vanilla/src/components/Onboarding.ts +79 -0
- package/templates/liveReload.js +70 -0
- package/templates/theme/js/react/eslint.config.js +29 -0
- package/templates/theme/js/react/src/app.jsx +25 -0
- package/templates/theme/js/react/src/components/Onboarding.jsx +72 -0
- package/templates/theme/js/vanilla/eslint.config.js +16 -0
- package/templates/theme/js/vanilla/src/app.js +11 -0
- package/templates/theme/js/vanilla/src/components/Onboarding.js +71 -0
- package/templates/theme/meta.json +4 -0
- package/templates/theme/shared/.oxlintrc.json +36 -0
- package/templates/theme/shared/README.template.md +53 -0
- package/templates/theme/shared/app.css +163 -0
- package/templates/theme/shared/biome.json +36 -0
- package/templates/theme/shared/css.d.ts +44 -0
- package/templates/theme/shared/jsconfig.json +31 -0
- package/templates/theme/shared/spice.config.js +9 -0
- package/templates/theme/shared/spice.config.ts +9 -0
- package/templates/theme/shared/tsconfig.json +32 -0
- package/templates/theme/ts/react/eslint.config.ts +29 -0
- package/templates/theme/ts/react/src/app.tsx +26 -0
- package/templates/theme/ts/react/src/components/Onboarding.tsx +83 -0
- package/templates/theme/ts/vanilla/eslint.config.ts +16 -0
- package/templates/theme/ts/vanilla/src/app.ts +11 -0
- package/templates/theme/ts/vanilla/src/components/Onboarding.ts +79 -0
- package/templates/wrapper.js +48 -0
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import js from "@eslint/js";
|
|
2
|
+
import globals from "globals";
|
|
3
|
+
import tseslint from "typescript-eslint";
|
|
4
|
+
import react from "eslint-plugin-react";
|
|
5
|
+
import css from "@eslint/css";
|
|
6
|
+
import { defineConfig } from "eslint/config";
|
|
7
|
+
|
|
8
|
+
export default defineConfig([
|
|
9
|
+
{
|
|
10
|
+
files: ["**/*.{js,mjs,cjs,ts,mts,cts,jsx,tsx}"],
|
|
11
|
+
plugins: { js, react },
|
|
12
|
+
extends: ["js/recommended"],
|
|
13
|
+
languageOptions: {
|
|
14
|
+
parserOptions: {
|
|
15
|
+
ecmaFeatures: {
|
|
16
|
+
jsx: true,
|
|
17
|
+
},
|
|
18
|
+
},
|
|
19
|
+
globals: globals.browser,
|
|
20
|
+
},
|
|
21
|
+
},
|
|
22
|
+
tseslint.configs.recommended,
|
|
23
|
+
{
|
|
24
|
+
files: ["**/*.css"],
|
|
25
|
+
plugins: { css },
|
|
26
|
+
language: "css/css",
|
|
27
|
+
extends: ["css/recommended"],
|
|
28
|
+
},
|
|
29
|
+
]);
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import "@/app.css";
|
|
2
|
+
import { createRoot } from "react-dom/client";
|
|
3
|
+
// you can use aliases too ! (just add them to tsconfig.json)
|
|
4
|
+
import OnboardingCard from "@/components/Onboarding";
|
|
5
|
+
|
|
6
|
+
const config = {
|
|
7
|
+
projectName: "{{project-name}}",
|
|
8
|
+
framework: "{{framework}}",
|
|
9
|
+
language: "{{language}}",
|
|
10
|
+
packageManager: "{{package-manager}}",
|
|
11
|
+
linter: "{{linter}}",
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
function main() {
|
|
15
|
+
// Create a container for the React application
|
|
16
|
+
// We append this to document.body to ensure it sits above the Spotify UI
|
|
17
|
+
const container = document.createElement("div");
|
|
18
|
+
container.id = "spicetify-onboarding-root";
|
|
19
|
+
document.body.appendChild(container);
|
|
20
|
+
|
|
21
|
+
const root = createRoot(container);
|
|
22
|
+
|
|
23
|
+
// Render the Onboarding UI
|
|
24
|
+
root.render(<OnboardingCard config={config} />);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
main();
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { useState } from "react";
|
|
2
|
+
const Onboarding = ({ config }) => {
|
|
3
|
+
const [isVisible, setIsVisible] = useState(true);
|
|
4
|
+
const [isFading, setIsFading] = useState(false);
|
|
5
|
+
|
|
6
|
+
const handleDismiss = () => {
|
|
7
|
+
setIsFading(true);
|
|
8
|
+
setTimeout(() => setIsVisible(false), 250);
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
if (!isVisible) return null;
|
|
12
|
+
|
|
13
|
+
return (
|
|
14
|
+
<div className={`onboarding-overlay ${isFading ? "fade-out" : ""}`} onClick={handleDismiss}>
|
|
15
|
+
<div className="onboarding-card" onClick={(e) => e.stopPropagation()}>
|
|
16
|
+
<button className="close-icon-btn" onClick={handleDismiss} aria-label="Close">
|
|
17
|
+
<svg width="12" height="12" viewBox="0 0 12 12" fill="none">
|
|
18
|
+
<path
|
|
19
|
+
d="M1 1L11 11M1 11L11 1"
|
|
20
|
+
stroke="currentColor"
|
|
21
|
+
strokeWidth="2"
|
|
22
|
+
strokeLinecap="round"
|
|
23
|
+
/>
|
|
24
|
+
</svg>
|
|
25
|
+
</button>
|
|
26
|
+
|
|
27
|
+
<div className="status-badge">🚀 {config.projectName} Ready</div>
|
|
28
|
+
|
|
29
|
+
<div className="config-grid">
|
|
30
|
+
<span className="label">Framework</span>
|
|
31
|
+
<span className="value">{config.framework}</span>
|
|
32
|
+
|
|
33
|
+
<span className="label">Language</span>
|
|
34
|
+
<span className="value">{config.language}</span>
|
|
35
|
+
|
|
36
|
+
<span className="label">Manager</span>
|
|
37
|
+
<span className="value">{config.packageManager}</span>
|
|
38
|
+
|
|
39
|
+
<span className="label">Linter</span>
|
|
40
|
+
<span className="value">{config.linter}</span>
|
|
41
|
+
</div>
|
|
42
|
+
|
|
43
|
+
<div className="footer-tip">
|
|
44
|
+
Next Step: Edit <code>src/app.tsx</code>
|
|
45
|
+
</div>
|
|
46
|
+
|
|
47
|
+
<div className="onboarding-actions">
|
|
48
|
+
<button className="get-started-btn" onClick={() => openLink("{{get-started-link}}")}>
|
|
49
|
+
Get Started
|
|
50
|
+
</button>
|
|
51
|
+
<button className="discord-btn" onClick={() => openLink("{{discord-link}}")}>
|
|
52
|
+
Join Discord
|
|
53
|
+
</button>
|
|
54
|
+
<button className="dismiss-btn" onClick={handleDismiss}>
|
|
55
|
+
Dismiss
|
|
56
|
+
</button>
|
|
57
|
+
</div>
|
|
58
|
+
</div>
|
|
59
|
+
</div>
|
|
60
|
+
);
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
export default Onboarding;
|
|
64
|
+
|
|
65
|
+
function openLink(url, newTab = true) {
|
|
66
|
+
if (!url) return;
|
|
67
|
+
if (newTab) {
|
|
68
|
+
window.open(url, "_blank", "noopener,noreferrer");
|
|
69
|
+
} else {
|
|
70
|
+
window.location.href = url;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
export function initOnboarding(config) {
|
|
2
|
+
const overlay = document.createElement("div");
|
|
3
|
+
overlay.className = "onboarding-overlay";
|
|
4
|
+
|
|
5
|
+
overlay.innerHTML = `
|
|
6
|
+
<div class="onboarding-card">
|
|
7
|
+
<button class="close-icon-btn" aria-label="Close" id="close-x">
|
|
8
|
+
<svg width="12" height="12" viewBox="0 0 12 12" fill="none">
|
|
9
|
+
<path d="M1 1L11 11M1 11L11 1" stroke="currentColor" stroke-width="2" stroke-linecap="round"/>
|
|
10
|
+
</svg>
|
|
11
|
+
</button>
|
|
12
|
+
|
|
13
|
+
<div>
|
|
14
|
+
<span class="status-dot"></span>
|
|
15
|
+
🚀 ${config.projectName} Ready
|
|
16
|
+
</div>
|
|
17
|
+
|
|
18
|
+
<div class="config-grid">
|
|
19
|
+
<span class="label">Framework</span>
|
|
20
|
+
<span class="value">${config.framework}</span>
|
|
21
|
+
|
|
22
|
+
<span class="label">Language</span>
|
|
23
|
+
<span class="value">${config.language}</span>
|
|
24
|
+
|
|
25
|
+
<span class="label">Manager</span>
|
|
26
|
+
<span class="value">${config.packageManager}</span>
|
|
27
|
+
|
|
28
|
+
<span class="label">Linter</span>
|
|
29
|
+
<span class="value">${config.linter}</span>
|
|
30
|
+
</div>
|
|
31
|
+
|
|
32
|
+
<div class="footer-tip">
|
|
33
|
+
Next Step: Edit <code>src/app.tsx</code>
|
|
34
|
+
</div>
|
|
35
|
+
<div class="onboarding-actions">
|
|
36
|
+
<button class="dismiss-btn" id="dismiss-btn">Dismiss</button>
|
|
37
|
+
<button class="discord-btn" id="discord-btn">Join Discord</button>
|
|
38
|
+
<button class="get-started-btn" id="get-started-btn">Get Started</button>
|
|
39
|
+
</div>
|
|
40
|
+
</div>
|
|
41
|
+
`;
|
|
42
|
+
|
|
43
|
+
const dismiss = () => {
|
|
44
|
+
overlay.classList.add("fade-out");
|
|
45
|
+
overlay.addEventListener("transitionend", () => overlay.remove(), {
|
|
46
|
+
once: true,
|
|
47
|
+
});
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
overlay.addEventListener("click", (e) => {
|
|
51
|
+
if (e.target === overlay) dismiss();
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
function openLink(url, newTab = true) {
|
|
55
|
+
if (!url) return;
|
|
56
|
+
if (newTab) {
|
|
57
|
+
window.open(url, "_blank", "noopener,noreferrer");
|
|
58
|
+
} else {
|
|
59
|
+
window.location.href = url;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const getStarted = () => openLink("{{get-started-link}}");
|
|
64
|
+
const openDiscord = () => openLink("{{discord-link}}");
|
|
65
|
+
overlay.querySelector("#close-x")?.addEventListener("click", dismiss);
|
|
66
|
+
overlay.querySelector("#dismiss-btn")?.addEventListener("click", dismiss);
|
|
67
|
+
overlay.querySelector("#discord-btn")?.addEventListener("click", openDiscord);
|
|
68
|
+
overlay.querySelector("#get-started-btn")?.addEventListener("click", getStarted);
|
|
69
|
+
|
|
70
|
+
document.body.prepend(overlay);
|
|
71
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import js from "@eslint/js";
|
|
2
|
+
import globals from "globals";
|
|
3
|
+
import tseslint from "typescript-eslint";
|
|
4
|
+
import css from "@eslint/css";
|
|
5
|
+
import { defineConfig } from "eslint/config";
|
|
6
|
+
|
|
7
|
+
export default defineConfig([
|
|
8
|
+
{
|
|
9
|
+
files: ["**/*.{js,mjs,cjs,ts,mts,cts,jsx,tsx}"],
|
|
10
|
+
plugins: { js },
|
|
11
|
+
extends: ["js/recommended"],
|
|
12
|
+
languageOptions: { globals: globals.browser },
|
|
13
|
+
},
|
|
14
|
+
tseslint.configs.recommended,
|
|
15
|
+
{ files: ["**/*.css"], plugins: { css }, language: "css/css", extends: ["css/recommended"] },
|
|
16
|
+
]);
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import "@/app.css";
|
|
2
|
+
import { initOnboarding } from "@/components/Onboarding";
|
|
3
|
+
|
|
4
|
+
const config = {
|
|
5
|
+
projectName: "{{project-name}}",
|
|
6
|
+
framework: "{{framework}}",
|
|
7
|
+
language: "{{language}}",
|
|
8
|
+
packageManager: "{{package-manager}}",
|
|
9
|
+
linter: "{{linter}}",
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
initOnboarding(config);
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "./node_modules/oxlint/configuration_schema.json",
|
|
3
|
+
"plugins": null,
|
|
4
|
+
"categories": {},
|
|
5
|
+
"rules": {
|
|
6
|
+
"no-await-in-loop": "error",
|
|
7
|
+
"unicorn/prefer-array-find": "error",
|
|
8
|
+
"unicorn/prefer-array-flat-map": "error",
|
|
9
|
+
"unicorn/prefer-set-has": "error"
|
|
10
|
+
},
|
|
11
|
+
"settings": {
|
|
12
|
+
"jsx-a11y": {
|
|
13
|
+
"polymorphicPropName": null,
|
|
14
|
+
"components": {},
|
|
15
|
+
"attributes": {}
|
|
16
|
+
},
|
|
17
|
+
"react": {
|
|
18
|
+
"formComponents": [],
|
|
19
|
+
"linkComponents": [],
|
|
20
|
+
"version": null,
|
|
21
|
+
"componentWrapperFunctions": []
|
|
22
|
+
},
|
|
23
|
+
"jsdoc": {
|
|
24
|
+
"ignorePrivate": false,
|
|
25
|
+
"ignoreInternal": false,
|
|
26
|
+
"ignoreReplacesDocs": true,
|
|
27
|
+
"overrideReplacesDocs": true,
|
|
28
|
+
"augmentsExtendsReplacesDocs": false,
|
|
29
|
+
"implementsReplacesDocs": false,
|
|
30
|
+
"exemptDestructuredRootsFromChecks": false,
|
|
31
|
+
"tagNamePreference": {}
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
"globals": {},
|
|
35
|
+
"ignorePatterns": ["dist/**"]
|
|
36
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# {{project-name}}
|
|
2
|
+
|
|
3
|
+
Welcome to your new **Spicetify {{template}}** project! This project was
|
|
4
|
+
bootstrapped using [@spicetify/creator]({{github-link}}).
|
|
5
|
+
|
|
6
|
+
## Getting Started
|
|
7
|
+
|
|
8
|
+
First, install the dependencies using your package manager:
|
|
9
|
+
|
|
10
|
+
```bash
|
|
11
|
+
{{package-manager}} install
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
Then, run the development server:
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
{{package-manager}} run dev
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
The development server will watch for changes and automatically rebuild your
|
|
21
|
+
project.
|
|
22
|
+
|
|
23
|
+
## Available Scripts
|
|
24
|
+
|
|
25
|
+
### `dev`
|
|
26
|
+
|
|
27
|
+
Runs the project in development mode with hot-reloading.
|
|
28
|
+
|
|
29
|
+
### `build`
|
|
30
|
+
|
|
31
|
+
Optimizes and bundles your {{template}} for production. The output will be
|
|
32
|
+
located in the `dist` directory.
|
|
33
|
+
|
|
34
|
+
### `lint`
|
|
35
|
+
|
|
36
|
+
Checks your code for errors and formatting issues using {{linter}}.
|
|
37
|
+
|
|
38
|
+
## Project Structure
|
|
39
|
+
|
|
40
|
+
```text
|
|
41
|
+
.
|
|
42
|
+
├── src/
|
|
43
|
+
│ └── app.{{entry-ext}} # Main entry point for your {{template}}
|
|
44
|
+
└── spice.config.{{language}} # Configuration for @spicetify/creator
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## Learn More
|
|
48
|
+
|
|
49
|
+
To learn more about Spicetify and how to customize your Spotify client, check
|
|
50
|
+
out the following resources:
|
|
51
|
+
|
|
52
|
+
- [Spicetify]({{spicetify-link}})
|
|
53
|
+
- [@spicetify/creator]({{docs-link}})
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
@import url("https://fonts.googleapis.com/css2?family=Poppins:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&display=swap");
|
|
2
|
+
|
|
3
|
+
.onboarding-overlay {
|
|
4
|
+
position: fixed;
|
|
5
|
+
inset: 0;
|
|
6
|
+
background: rgba(0, 0, 0, 0.75);
|
|
7
|
+
display: flex;
|
|
8
|
+
align-items: center;
|
|
9
|
+
justify-content: center;
|
|
10
|
+
z-index: 10000;
|
|
11
|
+
transition: opacity 0.3s ease;
|
|
12
|
+
font-family: "Poppins", sans-serif;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
.onboarding-overlay.fade-out {
|
|
16
|
+
opacity: 0;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
.onboarding-card {
|
|
20
|
+
background: rgba(24, 24, 24, 0.5);
|
|
21
|
+
border: 1px solid rgba(255, 255, 255, 0.1);
|
|
22
|
+
border-radius: 20px;
|
|
23
|
+
padding: 40px;
|
|
24
|
+
width: 400px;
|
|
25
|
+
box-shadow: 0 30px 60px rgba(0, 0, 0, 0.6);
|
|
26
|
+
transform: translateY(0);
|
|
27
|
+
transition: transform 0.3s ease;
|
|
28
|
+
backdrop-filter: blur(16px);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
.onboarding-overlay.fade-out .onboarding-card {
|
|
32
|
+
transform: translateY(20px);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
.status-badge {
|
|
36
|
+
display: flex;
|
|
37
|
+
align-items: center;
|
|
38
|
+
gap: 12px;
|
|
39
|
+
color: #1db954;
|
|
40
|
+
font-size: 18px;
|
|
41
|
+
font-weight: 800;
|
|
42
|
+
margin-bottom: 30px;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
.close-icon-btn {
|
|
46
|
+
position: absolute;
|
|
47
|
+
top: 12px;
|
|
48
|
+
right: 12px;
|
|
49
|
+
background: transparent;
|
|
50
|
+
border: none;
|
|
51
|
+
color: #666;
|
|
52
|
+
cursor: pointer;
|
|
53
|
+
padding: 8px;
|
|
54
|
+
display: flex;
|
|
55
|
+
align-items: center;
|
|
56
|
+
justify-content: center;
|
|
57
|
+
border-radius: 50%;
|
|
58
|
+
transition: all 0.2s ease;
|
|
59
|
+
z-index: 10;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
.close-icon-btn:hover {
|
|
63
|
+
background: rgba(255, 255, 255, 0.1);
|
|
64
|
+
color: #fff;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
.config-grid {
|
|
68
|
+
display: grid;
|
|
69
|
+
grid-template-columns: 120px 1fr;
|
|
70
|
+
gap: 15px;
|
|
71
|
+
margin-bottom: 30px;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
.label {
|
|
75
|
+
color: #777;
|
|
76
|
+
font-size: 14px;
|
|
77
|
+
}
|
|
78
|
+
.value {
|
|
79
|
+
color: #fff;
|
|
80
|
+
font-size: 14px;
|
|
81
|
+
font-weight: 500;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
.footer-tip {
|
|
85
|
+
font-size: 12px;
|
|
86
|
+
color: #555;
|
|
87
|
+
border-top: 1px solid #282828;
|
|
88
|
+
padding-top: 20px;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
code {
|
|
92
|
+
color: #1db954;
|
|
93
|
+
background: rgba(29, 185, 84, 0.1);
|
|
94
|
+
padding: 2px 4px;
|
|
95
|
+
border-radius: 4px;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
.onboarding-actions {
|
|
99
|
+
display: flex;
|
|
100
|
+
flex-direction: column;
|
|
101
|
+
gap: 12px;
|
|
102
|
+
margin-top: 24px;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
.get-started-btn,
|
|
106
|
+
.dismiss-btn,
|
|
107
|
+
.discord-btn {
|
|
108
|
+
width: 100%;
|
|
109
|
+
padding: 14px;
|
|
110
|
+
border-radius: 10px;
|
|
111
|
+
cursor: pointer;
|
|
112
|
+
font-size: 15px;
|
|
113
|
+
font-weight: 600;
|
|
114
|
+
text-align: center;
|
|
115
|
+
transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);
|
|
116
|
+
display: flex;
|
|
117
|
+
align-items: center;
|
|
118
|
+
justify-content: center;
|
|
119
|
+
backdrop-filter: blur(4px);
|
|
120
|
+
border: 1px solid transparent;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
.get-started-btn {
|
|
124
|
+
background: rgba(16, 185, 129, 0.8);
|
|
125
|
+
color: #ffffff;
|
|
126
|
+
box-shadow: 0 4px 15px rgba(16, 185, 129, 0.2);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
.get-started-btn:hover {
|
|
130
|
+
background: rgba(16, 185, 129, 1);
|
|
131
|
+
transform: scale(1.02);
|
|
132
|
+
box-shadow: 0 4px 20px rgba(16, 185, 129, 0.4);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
.discord-btn {
|
|
136
|
+
background: rgba(88, 101, 242, 0.8);
|
|
137
|
+
color: #ffffff;
|
|
138
|
+
box-shadow: 0 4px 15px rgba(88, 101, 242, 0.2);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
.discord-btn:hover {
|
|
142
|
+
background: rgba(88, 101, 242, 1);
|
|
143
|
+
transform: scale(1.02);
|
|
144
|
+
box-shadow: 0 4px 20px rgba(88, 101, 242, 0.4);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
.dismiss-btn {
|
|
148
|
+
background: rgba(55, 65, 81, 0.8);
|
|
149
|
+
color: #d1d5db;
|
|
150
|
+
border: 1px solid rgba(255, 255, 255, 0.1);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
.dismiss-btn:hover {
|
|
154
|
+
background: rgba(75, 85, 99, 0.9);
|
|
155
|
+
color: #ffffff;
|
|
156
|
+
border-color: rgba(255, 255, 255, 0.2);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
.get-started-btn:active,
|
|
160
|
+
.discord-btn:active,
|
|
161
|
+
.dismiss-btn:active {
|
|
162
|
+
transform: scale(0.98);
|
|
163
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://biomejs.dev/schemas/2.3.13/schema.json",
|
|
3
|
+
"vcs": {
|
|
4
|
+
"enabled": true,
|
|
5
|
+
"clientKind": "git",
|
|
6
|
+
"useIgnoreFile": true
|
|
7
|
+
},
|
|
8
|
+
"files": {
|
|
9
|
+
"ignoreUnknown": true,
|
|
10
|
+
"includes": ["**", "!node_modules", "!dist"]
|
|
11
|
+
},
|
|
12
|
+
"formatter": {
|
|
13
|
+
"enabled": true,
|
|
14
|
+
"indentStyle": "space",
|
|
15
|
+
"indentWidth": 2
|
|
16
|
+
},
|
|
17
|
+
"linter": {
|
|
18
|
+
"enabled": true,
|
|
19
|
+
"rules": {
|
|
20
|
+
"recommended": true,
|
|
21
|
+
"suspicious": {
|
|
22
|
+
"noUnknownAtRules": "off"
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
"domains": {
|
|
26
|
+
"react": "recommended"
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
"assist": {
|
|
30
|
+
"actions": {
|
|
31
|
+
"source": {
|
|
32
|
+
"organizeImports": "on"
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
type CSSModuleClasses = Readonly<Record<string, string>>;
|
|
2
|
+
|
|
3
|
+
declare module "*.module.css" {
|
|
4
|
+
const classes: CSSModuleClasses;
|
|
5
|
+
export default classes;
|
|
6
|
+
}
|
|
7
|
+
declare module "*.module.scss" {
|
|
8
|
+
const classes: CSSModuleClasses;
|
|
9
|
+
export default classes;
|
|
10
|
+
}
|
|
11
|
+
declare module "*.module.sass" {
|
|
12
|
+
const classes: CSSModuleClasses;
|
|
13
|
+
export default classes;
|
|
14
|
+
}
|
|
15
|
+
declare module "*.module.less" {
|
|
16
|
+
const classes: CSSModuleClasses;
|
|
17
|
+
export default classes;
|
|
18
|
+
}
|
|
19
|
+
declare module "*.module.styl" {
|
|
20
|
+
const classes: CSSModuleClasses;
|
|
21
|
+
export default classes;
|
|
22
|
+
}
|
|
23
|
+
declare module "*.module.stylus" {
|
|
24
|
+
const classes: CSSModuleClasses;
|
|
25
|
+
export default classes;
|
|
26
|
+
}
|
|
27
|
+
declare module "*.module.pcss" {
|
|
28
|
+
const classes: CSSModuleClasses;
|
|
29
|
+
export default classes;
|
|
30
|
+
}
|
|
31
|
+
declare module "*.module.sss" {
|
|
32
|
+
const classes: CSSModuleClasses;
|
|
33
|
+
export default classes;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// CSS
|
|
37
|
+
declare module "*.css" {}
|
|
38
|
+
declare module "*.scss" {}
|
|
39
|
+
declare module "*.sass" {}
|
|
40
|
+
declare module "*.less" {}
|
|
41
|
+
declare module "*.styl" {}
|
|
42
|
+
declare module "*.stylus" {}
|
|
43
|
+
declare module "*.pcss" {}
|
|
44
|
+
declare module "*.sss" {}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES2022",
|
|
4
|
+
"useDefineForClassFields": true,
|
|
5
|
+
"module": "ESNext",
|
|
6
|
+
"lib": ["ES2022", "DOM", "DOM.Iterable"],
|
|
7
|
+
"types": ["@spicetify/creator/client"],
|
|
8
|
+
"skipLibCheck": true,
|
|
9
|
+
"jsx": "react-jsx",
|
|
10
|
+
|
|
11
|
+
/* Bundler mode */
|
|
12
|
+
"moduleResolution": "bundler",
|
|
13
|
+
"allowImportingTsExtensions": true,
|
|
14
|
+
"verbatimModuleSyntax": true,
|
|
15
|
+
"moduleDetection": "force",
|
|
16
|
+
"noEmit": true,
|
|
17
|
+
|
|
18
|
+
/* Linting */
|
|
19
|
+
"strict": true,
|
|
20
|
+
"noUnusedLocals": true,
|
|
21
|
+
"noUnusedParameters": true,
|
|
22
|
+
"erasableSyntaxOnly": true,
|
|
23
|
+
"noFallthroughCasesInSwitch": true,
|
|
24
|
+
|
|
25
|
+
// Paths
|
|
26
|
+
"baseUrl": ".",
|
|
27
|
+
"paths": {
|
|
28
|
+
"@/*": ["./src/*"]
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
"include": ["src"]
|
|
32
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES2022",
|
|
4
|
+
"useDefineForClassFields": true,
|
|
5
|
+
"module": "ESNext",
|
|
6
|
+
"lib": ["ES2022", "DOM", "DOM.Iterable"],
|
|
7
|
+
"types": ["@spicetify/creator/client"],
|
|
8
|
+
"skipLibCheck": true,
|
|
9
|
+
"jsx": "react-jsx",
|
|
10
|
+
|
|
11
|
+
/* Bundler mode */
|
|
12
|
+
"moduleResolution": "bundler",
|
|
13
|
+
"allowImportingTsExtensions": true,
|
|
14
|
+
"verbatimModuleSyntax": true,
|
|
15
|
+
"moduleDetection": "force",
|
|
16
|
+
"noEmit": true,
|
|
17
|
+
|
|
18
|
+
/* Linting */
|
|
19
|
+
"strict": true,
|
|
20
|
+
"noUnusedLocals": true,
|
|
21
|
+
"noUnusedParameters": true,
|
|
22
|
+
"erasableSyntaxOnly": true,
|
|
23
|
+
"noFallthroughCasesInSwitch": true,
|
|
24
|
+
|
|
25
|
+
// Paths
|
|
26
|
+
"baseUrl": ".",
|
|
27
|
+
"paths": {
|
|
28
|
+
"@/*": ["./src/*"]
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
"include": ["src"]
|
|
32
|
+
}
|