create-react-forge 1.5.2 → 1.6.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.
Files changed (104) hide show
  1. package/README.md +6 -5
  2. package/dist/cli/index.d.ts +2 -2
  3. package/dist/cli/parser.d.ts.map +1 -1
  4. package/dist/cli/parser.js +3 -2
  5. package/dist/cli/parser.js.map +1 -1
  6. package/dist/cli/prompts.d.ts.map +1 -1
  7. package/dist/cli/prompts.js +21 -7
  8. package/dist/cli/prompts.js.map +1 -1
  9. package/dist/config/defaults.d.ts +2 -2
  10. package/dist/config/defaults.d.ts.map +1 -1
  11. package/dist/config/defaults.js +3 -2
  12. package/dist/config/defaults.js.map +1 -1
  13. package/dist/config/schema.d.ts +15 -13
  14. package/dist/config/schema.d.ts.map +1 -1
  15. package/dist/config/schema.js +5 -4
  16. package/dist/config/schema.js.map +1 -1
  17. package/dist/docs/index.d.ts +1 -0
  18. package/dist/docs/index.d.ts.map +1 -1
  19. package/dist/docs/index.js +1 -0
  20. package/dist/docs/index.js.map +1 -1
  21. package/dist/docs/readme-generator.d.ts +6 -0
  22. package/dist/docs/readme-generator.d.ts.map +1 -0
  23. package/dist/docs/readme-generator.js +276 -0
  24. package/dist/docs/readme-generator.js.map +1 -0
  25. package/dist/generator/index.d.ts.map +1 -1
  26. package/dist/generator/index.js +5 -2
  27. package/dist/generator/index.js.map +1 -1
  28. package/dist/templates/registry.d.ts +6 -2
  29. package/dist/templates/registry.d.ts.map +1 -1
  30. package/dist/templates/registry.js +31 -16
  31. package/dist/templates/registry.js.map +1 -1
  32. package/dist/templates/utils.js +4 -4
  33. package/dist/templates/utils.js.map +1 -1
  34. package/package.json +1 -1
  35. package/src/templates/overlays/base/manifest.json +4 -3
  36. package/src/templates/overlays/base/src/components/ui/Button.tsx +103 -31
  37. package/src/templates/overlays/base/src/components/ui/Input.tsx +55 -29
  38. package/src/templates/overlays/base/src/lib/utils.ts +0 -10
  39. package/src/templates/overlays/runtime/nextjs/src/app/error.tsx +39 -10
  40. package/src/templates/overlays/runtime/nextjs/src/app/loading.tsx +25 -7
  41. package/src/templates/overlays/runtime/nextjs/src/app/not-found.tsx +54 -13
  42. package/src/templates/overlays/runtime/nextjs/src/app/page.tsx +55 -13
  43. package/src/templates/overlays/runtime/nextjs/src/styles/globals.css +1 -1
  44. package/src/templates/overlays/runtime/vite/src/components/errors/ErrorFallback.tsx +49 -15
  45. package/src/templates/overlays/runtime/vite/src/components/ui/LoadingSpinner.tsx +33 -13
  46. package/src/templates/overlays/runtime/vite/src/features/misc/routes/Landing.tsx +78 -21
  47. package/src/templates/overlays/runtime/vite/src/features/misc/routes/NotFound.tsx +77 -19
  48. package/src/templates/overlays/runtime/vite/src/main.tsx +0 -2
  49. package/src/templates/overlays/state/jotai/manifest.json +16 -0
  50. package/src/templates/overlays/state/jotai/src/stores/atoms.ts +52 -0
  51. package/src/templates/overlays/state/jotai/src/stores/index.ts +30 -0
  52. package/src/templates/overlays/styling/css/_nextjs/src/app/error.css +49 -0
  53. package/src/templates/overlays/styling/css/_nextjs/src/app/error.tsx +34 -0
  54. package/src/templates/overlays/styling/css/_nextjs/src/app/loading.css +28 -0
  55. package/src/templates/overlays/styling/css/_nextjs/src/app/loading.tsx +13 -0
  56. package/src/templates/overlays/styling/css/_nextjs/src/app/not-found.css +70 -0
  57. package/src/templates/overlays/styling/css/_nextjs/src/app/not-found.tsx +25 -0
  58. package/src/templates/overlays/styling/css/_nextjs/src/app/page.css +73 -0
  59. package/src/templates/overlays/styling/css/_nextjs/src/app/page.tsx +32 -0
  60. package/src/templates/overlays/styling/css/_vite/src/components/errors/ErrorFallback.css +49 -0
  61. package/src/templates/overlays/styling/css/_vite/src/components/errors/ErrorFallback.tsx +22 -0
  62. package/src/templates/overlays/styling/css/_vite/src/components/ui/LoadingSpinner.css +40 -0
  63. package/src/templates/overlays/styling/css/_vite/src/components/ui/LoadingSpinner.tsx +21 -0
  64. package/src/templates/overlays/styling/css/_vite/src/features/misc/routes/Landing.css +73 -0
  65. package/src/templates/overlays/styling/css/_vite/src/features/misc/routes/Landing.tsx +32 -0
  66. package/src/templates/overlays/styling/css/_vite/src/features/misc/routes/NotFound.css +70 -0
  67. package/src/templates/overlays/styling/css/_vite/src/features/misc/routes/NotFound.tsx +25 -0
  68. package/src/templates/overlays/styling/css/manifest.json +17 -0
  69. package/src/templates/overlays/styling/css/src/styles/globals.css +107 -0
  70. package/src/templates/overlays/styling/css-modules/_nextjs/src/app/loading.tsx +13 -0
  71. package/src/templates/overlays/styling/css-modules/_nextjs/src/app/page.module.css +73 -0
  72. package/src/templates/overlays/styling/css-modules/_nextjs/src/app/page.tsx +32 -0
  73. package/src/templates/overlays/styling/css-modules/_vite/src/components/errors/ErrorFallback.module.css +45 -0
  74. package/src/templates/overlays/styling/css-modules/_vite/src/components/errors/ErrorFallback.tsx +22 -0
  75. package/src/templates/overlays/styling/css-modules/_vite/src/components/ui/LoadingSpinner.module.css +40 -0
  76. package/src/templates/overlays/styling/css-modules/_vite/src/components/ui/LoadingSpinner.tsx +23 -0
  77. package/src/templates/overlays/styling/css-modules/_vite/src/features/misc/routes/Landing.module.css +73 -0
  78. package/src/templates/overlays/styling/css-modules/_vite/src/features/misc/routes/Landing.tsx +32 -0
  79. package/src/templates/overlays/styling/css-modules/_vite/src/features/misc/routes/NotFound.module.css +67 -0
  80. package/src/templates/overlays/styling/css-modules/_vite/src/features/misc/routes/NotFound.tsx +25 -0
  81. package/src/templates/overlays/styling/css-modules/manifest.json +6 -3
  82. package/src/templates/overlays/styling/css-modules/src/css.d.ts +13 -0
  83. package/src/templates/overlays/styling/styled-components/_nextjs/src/app/error.tsx +72 -0
  84. package/src/templates/overlays/styling/styled-components/_nextjs/src/app/layout.tsx +25 -0
  85. package/src/templates/overlays/styling/styled-components/_nextjs/src/app/loading.tsx +40 -0
  86. package/src/templates/overlays/styling/styled-components/_nextjs/src/app/not-found.tsx +91 -0
  87. package/src/templates/overlays/styling/styled-components/_nextjs/src/app/page.tsx +102 -0
  88. package/src/templates/overlays/styling/styled-components/_nextjs/src/app/providers.tsx +22 -0
  89. package/src/templates/overlays/styling/styled-components/{src → _nextjs/src}/lib/StyledComponentsRegistry.tsx +10 -2
  90. package/src/templates/overlays/styling/styled-components/_vite/src/app/provider.tsx +27 -0
  91. package/src/templates/overlays/styling/styled-components/_vite/src/components/errors/ErrorFallback.tsx +59 -0
  92. package/src/templates/overlays/styling/styled-components/_vite/src/components/ui/LoadingSpinner.tsx +47 -0
  93. package/src/templates/overlays/styling/styled-components/_vite/src/features/misc/routes/Landing.tsx +100 -0
  94. package/src/templates/overlays/styling/styled-components/_vite/src/features/misc/routes/NotFound.tsx +89 -0
  95. package/src/templates/overlays/styling/styled-components/_vite/src/main.tsx +13 -0
  96. package/src/templates/overlays/styling/styled-components/manifest.json +5 -1
  97. package/src/templates/overlays/styling/tailwind/_nextjs/src/app/error.tsx +33 -0
  98. package/src/templates/overlays/styling/tailwind/_nextjs/src/app/loading.tsx +12 -0
  99. package/src/templates/overlays/styling/tailwind/_nextjs/src/app/not-found.tsx +26 -0
  100. package/src/templates/overlays/styling/tailwind/_nextjs/src/app/page.tsx +33 -0
  101. package/src/templates/overlays/styling/tailwind/manifest.json +5 -3
  102. package/src/templates/overlays/runtime/vite/src/styles/globals.css +0 -55
  103. package/src/templates/overlays/styling/css-modules/src/components/ui/Button.module.css +0 -87
  104. package/src/templates/overlays/styling/css-modules/src/styles/globals.css +0 -91
@@ -0,0 +1,27 @@
1
+ import { ErrorFallback } from '@/components/errors/ErrorFallback';
2
+ import { LoadingSpinner } from '@/components/ui/LoadingSpinner';
3
+ import { GlobalStyles } from '@/styles/globals';
4
+ import { Suspense } from 'react';
5
+ import { ErrorBoundary } from 'react-error-boundary';
6
+ import { BrowserRouter } from 'react-router-dom';
7
+
8
+ type AppProviderProps = {
9
+ children: React.ReactNode;
10
+ };
11
+
12
+ export function AppProvider({ children }: AppProviderProps) {
13
+ return (
14
+ <Suspense fallback={<LoadingSpinner />}>
15
+ <ErrorBoundary FallbackComponent={ErrorFallback}>
16
+ <BrowserRouter>
17
+ <GlobalStyles />
18
+ {children}
19
+ </BrowserRouter>
20
+ </ErrorBoundary>
21
+ </Suspense>
22
+ );
23
+ }
24
+
25
+
26
+
27
+
@@ -0,0 +1,59 @@
1
+ import { FallbackProps } from 'react-error-boundary';
2
+ import styled from 'styled-components';
3
+
4
+ const Container = styled.div`
5
+ display: flex;
6
+ min-height: 100vh;
7
+ flex-direction: column;
8
+ align-items: center;
9
+ justify-content: center;
10
+ `;
11
+
12
+ const Content = styled.div`
13
+ text-align: center;
14
+ `;
15
+
16
+ const Title = styled.h1`
17
+ font-size: 1.5rem;
18
+ font-weight: 700;
19
+ color: #dc2626;
20
+ `;
21
+
22
+ const Message = styled.p`
23
+ margin-top: 1rem;
24
+ color: #4b5563;
25
+ `;
26
+
27
+ const RetryButton = styled.button`
28
+ margin-top: 1.5rem;
29
+ border-radius: 0.375rem;
30
+ background-color: #4f46e5;
31
+ padding: 0.625rem 0.875rem;
32
+ font-size: 0.875rem;
33
+ font-weight: 600;
34
+ color: white;
35
+ border: none;
36
+ cursor: pointer;
37
+ box-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);
38
+ transition: background-color 0.2s;
39
+
40
+ &:hover {
41
+ background-color: #6366f1;
42
+ }
43
+ `;
44
+
45
+ export function ErrorFallback({ error, resetErrorBoundary }: FallbackProps) {
46
+ return (
47
+ <Container role="alert">
48
+ <Content>
49
+ <Title>Something went wrong</Title>
50
+ <Message>{error.message || 'An unexpected error occurred'}</Message>
51
+ <RetryButton onClick={resetErrorBoundary}>Try again</RetryButton>
52
+ </Content>
53
+ </Container>
54
+ );
55
+ }
56
+
57
+
58
+
59
+
@@ -0,0 +1,47 @@
1
+ import styled, { keyframes } from 'styled-components';
2
+
3
+ type LoadingSpinnerProps = {
4
+ size?: 'sm' | 'md' | 'lg';
5
+ };
6
+
7
+ const spin = keyframes`
8
+ from {
9
+ transform: rotate(0deg);
10
+ }
11
+ to {
12
+ transform: rotate(360deg);
13
+ }
14
+ `;
15
+
16
+ const sizes = {
17
+ sm: '1rem',
18
+ md: '2rem',
19
+ lg: '4rem',
20
+ };
21
+
22
+ const Container = styled.div`
23
+ display: flex;
24
+ align-items: center;
25
+ justify-content: center;
26
+ `;
27
+
28
+ const Spinner = styled.div<{ $size: 'sm' | 'md' | 'lg' }>`
29
+ width: ${(props) => sizes[props.$size]};
30
+ height: ${(props) => sizes[props.$size]};
31
+ border-radius: 50%;
32
+ border: 2px solid #d1d5db;
33
+ border-top-color: #4f46e5;
34
+ animation: ${spin} 1s linear infinite;
35
+ `;
36
+
37
+ export function LoadingSpinner({ size = 'md' }: LoadingSpinnerProps) {
38
+ return (
39
+ <Container>
40
+ <Spinner $size={size} role="status" aria-label="Loading" />
41
+ </Container>
42
+ );
43
+ }
44
+
45
+
46
+
47
+
@@ -0,0 +1,100 @@
1
+ import { Link } from 'react-router-dom';
2
+ import styled from 'styled-components';
3
+
4
+ const Container = styled.div`
5
+ display: flex;
6
+ min-height: 100vh;
7
+ flex-direction: column;
8
+ align-items: center;
9
+ justify-content: center;
10
+ `;
11
+
12
+ const Content = styled.div`
13
+ text-align: center;
14
+ `;
15
+
16
+ const Title = styled.h1`
17
+ font-size: 2.25rem;
18
+ font-weight: 700;
19
+ letter-spacing: -0.025em;
20
+ color: #111827;
21
+
22
+ @media (min-width: 640px) {
23
+ font-size: 3.75rem;
24
+ }
25
+ `;
26
+
27
+ const Description = styled.p`
28
+ margin-top: 1.5rem;
29
+ font-size: 1.125rem;
30
+ line-height: 2rem;
31
+ color: #4b5563;
32
+ `;
33
+
34
+ const ButtonGroup = styled.div`
35
+ margin-top: 2.5rem;
36
+ display: flex;
37
+ align-items: center;
38
+ justify-content: center;
39
+ gap: 1.5rem;
40
+ `;
41
+
42
+ const PrimaryButton = styled(Link)`
43
+ border-radius: 0.375rem;
44
+ background-color: #4f46e5;
45
+ padding: 0.625rem 0.875rem;
46
+ font-size: 0.875rem;
47
+ font-weight: 600;
48
+ color: white;
49
+ text-decoration: none;
50
+ box-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);
51
+ transition: background-color 0.2s;
52
+
53
+ &:hover {
54
+ background-color: #6366f1;
55
+ }
56
+
57
+ &:focus-visible {
58
+ outline: 2px solid #4f46e5;
59
+ outline-offset: 2px;
60
+ }
61
+ `;
62
+
63
+ const SecondaryLink = styled.a`
64
+ font-size: 0.875rem;
65
+ font-weight: 600;
66
+ line-height: 1.5rem;
67
+ color: #111827;
68
+ text-decoration: none;
69
+
70
+ &:hover {
71
+ color: #4f46e5;
72
+ }
73
+ `;
74
+
75
+ export function Landing() {
76
+ return (
77
+ <Container>
78
+ <Content>
79
+ <Title>Welcome to Your App</Title>
80
+ <Description>
81
+ A production-ready React application scaffolded with create-react-forge.
82
+ </Description>
83
+ <ButtonGroup>
84
+ <PrimaryButton to="/dashboard">Get started</PrimaryButton>
85
+ <SecondaryLink
86
+ href="https://github.com/alan2207/bulletproof-react"
87
+ target="_blank"
88
+ rel="noopener noreferrer"
89
+ >
90
+ Learn more <span aria-hidden="true">→</span>
91
+ </SecondaryLink>
92
+ </ButtonGroup>
93
+ </Content>
94
+ </Container>
95
+ );
96
+ }
97
+
98
+
99
+
100
+
@@ -0,0 +1,89 @@
1
+ import { Link } from 'react-router-dom';
2
+ import styled from 'styled-components';
3
+
4
+ const Container = styled.div`
5
+ display: flex;
6
+ min-height: 100vh;
7
+ flex-direction: column;
8
+ align-items: center;
9
+ justify-content: center;
10
+ `;
11
+
12
+ const Content = styled.div`
13
+ text-align: center;
14
+ `;
15
+
16
+ const ErrorCode = styled.p`
17
+ font-size: 1rem;
18
+ font-weight: 600;
19
+ color: #4f46e5;
20
+ `;
21
+
22
+ const Title = styled.h1`
23
+ margin-top: 1rem;
24
+ font-size: 1.875rem;
25
+ font-weight: 700;
26
+ letter-spacing: -0.025em;
27
+ color: #111827;
28
+
29
+ @media (min-width: 640px) {
30
+ font-size: 3rem;
31
+ }
32
+ `;
33
+
34
+ const Description = styled.p`
35
+ margin-top: 1.5rem;
36
+ font-size: 1rem;
37
+ line-height: 1.75rem;
38
+ color: #4b5563;
39
+ `;
40
+
41
+ const ButtonGroup = styled.div`
42
+ margin-top: 2.5rem;
43
+ display: flex;
44
+ align-items: center;
45
+ justify-content: center;
46
+ gap: 1.5rem;
47
+ `;
48
+
49
+ const PrimaryButton = styled(Link)`
50
+ border-radius: 0.375rem;
51
+ background-color: #4f46e5;
52
+ padding: 0.625rem 0.875rem;
53
+ font-size: 0.875rem;
54
+ font-weight: 600;
55
+ color: white;
56
+ text-decoration: none;
57
+ box-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);
58
+ transition: background-color 0.2s;
59
+
60
+ &:hover {
61
+ background-color: #6366f1;
62
+ }
63
+
64
+ &:focus-visible {
65
+ outline: 2px solid #4f46e5;
66
+ outline-offset: 2px;
67
+ }
68
+ `;
69
+
70
+ export function NotFound() {
71
+ return (
72
+ <Container>
73
+ <Content>
74
+ <ErrorCode>404</ErrorCode>
75
+ <Title>Page not found</Title>
76
+ <Description>
77
+ Sorry, we couldn't find the page you're looking for.
78
+ </Description>
79
+ <ButtonGroup>
80
+ <PrimaryButton to="/">Go back home</PrimaryButton>
81
+ </ButtonGroup>
82
+ </Content>
83
+ </Container>
84
+ );
85
+ }
86
+
87
+
88
+
89
+
@@ -0,0 +1,13 @@
1
+ import { App } from '@/app/App';
2
+ import React from 'react';
3
+ import ReactDOM from 'react-dom/client';
4
+
5
+ ReactDOM.createRoot(document.getElementById('root')!).render(
6
+ <React.StrictMode>
7
+ <App />
8
+ </React.StrictMode>
9
+ );
10
+
11
+
12
+
13
+
@@ -13,7 +13,11 @@
13
13
  "scripts": {},
14
14
  "filePatterns": {
15
15
  "include": ["**/*"],
16
- "exclude": ["manifest.json"]
16
+ "exclude": ["manifest.json", "_vite", "_nextjs"]
17
+ },
18
+ "runtimeOverrides": {
19
+ "vite": "_vite",
20
+ "nextjs": "_nextjs"
17
21
  }
18
22
  }
19
23
 
@@ -0,0 +1,33 @@
1
+ 'use client';
2
+
3
+ import { useEffect } from 'react';
4
+
5
+ export default function Error({
6
+ error,
7
+ reset,
8
+ }: {
9
+ error: Error & { digest?: string };
10
+ reset: () => void;
11
+ }) {
12
+ useEffect(() => {
13
+ console.error(error);
14
+ }, [error]);
15
+
16
+ return (
17
+ <div className="flex min-h-screen flex-col items-center justify-center" role="alert">
18
+ <div className="text-center">
19
+ <h1 className="text-2xl font-bold text-red-600">Something went wrong</h1>
20
+ <p className="mt-4 text-gray-600">
21
+ {error.message || 'An unexpected error occurred'}
22
+ </p>
23
+ <button
24
+ onClick={reset}
25
+ className="mt-6 rounded-md bg-indigo-600 px-3.5 py-2.5 text-sm font-semibold text-white shadow-sm hover:bg-indigo-500"
26
+ >
27
+ Try again
28
+ </button>
29
+ </div>
30
+ </div>
31
+ );
32
+ }
33
+
@@ -0,0 +1,12 @@
1
+ export default function Loading() {
2
+ return (
3
+ <div className="flex min-h-screen items-center justify-center">
4
+ <div
5
+ className="h-8 w-8 animate-spin rounded-full border-2 border-gray-300 border-t-indigo-600"
6
+ role="status"
7
+ aria-label="Loading"
8
+ />
9
+ </div>
10
+ );
11
+ }
12
+
@@ -0,0 +1,26 @@
1
+ import Link from 'next/link';
2
+
3
+ export default function NotFound() {
4
+ return (
5
+ <div className="flex min-h-screen flex-col items-center justify-center">
6
+ <div className="text-center">
7
+ <p className="text-base font-semibold text-indigo-600">404</p>
8
+ <h1 className="mt-4 text-3xl font-bold tracking-tight sm:text-5xl">
9
+ Page not found
10
+ </h1>
11
+ <p className="mt-6 text-base leading-7 text-gray-600">
12
+ Sorry, we couldn't find the page you're looking for.
13
+ </p>
14
+ <div className="mt-10 flex items-center justify-center gap-x-6">
15
+ <Link
16
+ href="/"
17
+ className="rounded-md bg-indigo-600 px-3.5 py-2.5 text-sm font-semibold text-white shadow-sm hover:bg-indigo-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600"
18
+ >
19
+ Go back home
20
+ </Link>
21
+ </div>
22
+ </div>
23
+ </div>
24
+ );
25
+ }
26
+
@@ -0,0 +1,33 @@
1
+ import Link from 'next/link';
2
+
3
+ export default function HomePage() {
4
+ return (
5
+ <div className="flex min-h-screen flex-col items-center justify-center">
6
+ <div className="text-center">
7
+ <h1 className="text-4xl font-bold tracking-tight sm:text-6xl">
8
+ Welcome to Your App
9
+ </h1>
10
+ <p className="mt-6 text-lg leading-8 text-gray-600">
11
+ A production-ready Next.js application scaffolded with create-react-forge.
12
+ </p>
13
+ <div className="mt-10 flex items-center justify-center gap-x-6">
14
+ <Link
15
+ href="/dashboard"
16
+ className="rounded-md bg-indigo-600 px-3.5 py-2.5 text-sm font-semibold text-white shadow-sm hover:bg-indigo-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600"
17
+ >
18
+ Get started
19
+ </Link>
20
+ <a
21
+ href="https://github.com/alan2207/bulletproof-react"
22
+ className="text-sm font-semibold leading-6"
23
+ target="_blank"
24
+ rel="noopener noreferrer"
25
+ >
26
+ Learn more <span aria-hidden="true">→</span>
27
+ </a>
28
+ </div>
29
+ </div>
30
+ </div>
31
+ );
32
+ }
33
+
@@ -2,7 +2,7 @@
2
2
  "name": "styling-tailwind",
3
3
  "version": "1.0.0",
4
4
  "description": "Tailwind CSS styling setup with modern configuration",
5
- "compatibleWith": ["runtime-vite", "runtime-nextjs"],
5
+ "compatibleWith": ["runtime-nextjs"],
6
6
  "dependencies": {},
7
7
  "devDependencies": {
8
8
  "tailwindcss": "^4.0.0",
@@ -13,7 +13,9 @@
13
13
  "scripts": {},
14
14
  "filePatterns": {
15
15
  "include": ["**/*"],
16
- "exclude": ["manifest.json"]
16
+ "exclude": ["manifest.json", "_nextjs"]
17
+ },
18
+ "runtimeOverrides": {
19
+ "nextjs": "_nextjs"
17
20
  }
18
21
  }
19
-
@@ -1,55 +0,0 @@
1
- /* Base styles - will be enhanced by styling overlay (tailwind/css-modules) */
2
-
3
- *,
4
- *::before,
5
- *::after {
6
- box-sizing: border-box;
7
- }
8
-
9
- * {
10
- margin: 0;
11
- }
12
-
13
- html,
14
- body {
15
- height: 100%;
16
- }
17
-
18
- body {
19
- line-height: 1.5;
20
- -webkit-font-smoothing: antialiased;
21
- font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto,
22
- 'Helvetica Neue', Arial, sans-serif;
23
- }
24
-
25
- img,
26
- picture,
27
- video,
28
- canvas,
29
- svg {
30
- display: block;
31
- max-width: 100%;
32
- }
33
-
34
- input,
35
- button,
36
- textarea,
37
- select {
38
- font: inherit;
39
- }
40
-
41
- p,
42
- h1,
43
- h2,
44
- h3,
45
- h4,
46
- h5,
47
- h6 {
48
- overflow-wrap: break-word;
49
- }
50
-
51
- #root {
52
- isolation: isolate;
53
- height: 100%;
54
- }
55
-
@@ -1,87 +0,0 @@
1
- .button {
2
- display: inline-flex;
3
- align-items: center;
4
- justify-content: center;
5
- border-radius: var(--radius-md);
6
- font-weight: 600;
7
- transition: all 0.15s ease;
8
- cursor: pointer;
9
- border: none;
10
- }
11
-
12
- .button:disabled {
13
- opacity: 0.5;
14
- cursor: not-allowed;
15
- }
16
-
17
- /* Variants */
18
- .primary {
19
- background-color: var(--color-primary-600);
20
- color: white;
21
- }
22
-
23
- .primary:hover:not(:disabled) {
24
- background-color: var(--color-primary-500);
25
- }
26
-
27
- .secondary {
28
- background-color: var(--color-gray-100);
29
- color: var(--color-gray-900);
30
- }
31
-
32
- .secondary:hover:not(:disabled) {
33
- background-color: var(--color-gray-200);
34
- }
35
-
36
- .outline {
37
- background-color: transparent;
38
- border: 1px solid var(--color-gray-300);
39
- color: var(--color-gray-700);
40
- }
41
-
42
- .outline:hover:not(:disabled) {
43
- background-color: var(--color-gray-50);
44
- }
45
-
46
- .danger {
47
- background-color: var(--color-red-600);
48
- color: white;
49
- }
50
-
51
- .danger:hover:not(:disabled) {
52
- background-color: var(--color-red-500);
53
- }
54
-
55
- /* Sizes */
56
- .sm {
57
- padding: var(--spacing-1) var(--spacing-2);
58
- font-size: 0.75rem;
59
- }
60
-
61
- .md {
62
- padding: var(--spacing-2) var(--spacing-4);
63
- font-size: 0.875rem;
64
- }
65
-
66
- .lg {
67
- padding: var(--spacing-3) var(--spacing-4);
68
- font-size: 1rem;
69
- }
70
-
71
- /* Loading spinner */
72
- .spinner {
73
- width: 1rem;
74
- height: 1rem;
75
- margin-right: var(--spacing-2);
76
- border: 2px solid currentColor;
77
- border-top-color: transparent;
78
- border-radius: var(--radius-full);
79
- animation: spin 0.6s linear infinite;
80
- }
81
-
82
- @keyframes spin {
83
- to {
84
- transform: rotate(360deg);
85
- }
86
- }
87
-