bsmnt 0.2.9 → 0.2.10

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 (153) hide show
  1. package/README.md +84 -146
  2. package/package.json +2 -2
  3. package/src/templates/next-default/README.md +28 -199
  4. package/src/templates/next-default/app/layout.tsx +2 -3
  5. package/src/templates/next-default/biome.json +1 -14
  6. package/src/templates/next-default/components/layout/theme/index.tsx +2 -5
  7. package/src/templates/next-default/components/layout/wrapper/index.tsx +1 -2
  8. package/src/templates/next-default/components/ui/README.md +2 -3
  9. package/src/templates/next-default/components/ui/image/index.tsx +3 -3
  10. package/src/templates/next-default/lib/README.md +3 -3
  11. package/src/templates/next-default/lib/hooks/use-device-detection.ts +3 -2
  12. package/src/templates/next-default/lib/hooks/use-media-breakpoint.ts +10 -3
  13. package/src/templates/next-default/lib/scripts/dev.ts +9 -29
  14. package/src/templates/next-default/lib/styles/README.md +7 -58
  15. package/src/templates/next-default/lib/styles/fonts.ts +7 -15
  16. package/src/templates/next-default/lib/styles/global.css +198 -0
  17. package/src/templates/next-default/lib/styles/index.css +3 -0
  18. package/src/templates/next-default/lib/styles/tokens.css +179 -0
  19. package/src/templates/next-default/lib/utils/global-css.d.ts +1 -0
  20. package/src/templates/next-default/lib/utils/viewport.ts +11 -5
  21. package/src/templates/next-default/next.config.ts +0 -1
  22. package/src/templates/next-default/package.json +10 -17
  23. package/src/templates/next-default/postcss.config.mjs +0 -14
  24. package/src/templates/next-default/tsconfig.tsbuildinfo +1 -0
  25. package/src/templates/next-experiments/README.md +29 -200
  26. package/src/templates/next-experiments/app/layout.tsx +2 -3
  27. package/src/templates/next-experiments/app/page.tsx +46 -39
  28. package/src/templates/next-experiments/biome.json +1 -14
  29. package/src/templates/next-experiments/components/layout/theme/index.tsx +2 -5
  30. package/src/templates/next-experiments/components/layout/wrapper/index.tsx +1 -2
  31. package/src/templates/next-experiments/components/ui/README.md +2 -3
  32. package/src/templates/next-experiments/components/ui/image/index.tsx +3 -2
  33. package/src/templates/next-experiments/lib/README.md +3 -3
  34. package/src/templates/next-experiments/lib/hooks/use-device-detection.ts +3 -2
  35. package/src/templates/next-experiments/lib/hooks/use-media-breakpoint.ts +10 -3
  36. package/src/templates/next-experiments/lib/scripts/dev.ts +9 -29
  37. package/src/templates/next-experiments/lib/styles/README.md +7 -58
  38. package/src/templates/next-experiments/lib/styles/fonts.ts +7 -15
  39. package/src/templates/next-experiments/lib/styles/global.css +198 -0
  40. package/src/templates/next-experiments/lib/styles/index.css +3 -0
  41. package/src/templates/next-experiments/lib/styles/tokens.css +179 -0
  42. package/src/templates/next-experiments/lib/utils/global-css.d.ts +1 -0
  43. package/src/templates/next-experiments/lib/utils/viewport.ts +11 -5
  44. package/src/templates/next-experiments/next.config.ts +0 -1
  45. package/src/templates/next-experiments/package.json +10 -21
  46. package/src/templates/next-experiments/postcss.config.mjs +0 -14
  47. package/src/templates/next-experiments/tsconfig.tsbuildinfo +1 -0
  48. package/src/templates/next-webgl/README.md +30 -200
  49. package/src/templates/next-webgl/app/layout.tsx +2 -3
  50. package/src/templates/next-webgl/biome.json +1 -14
  51. package/src/templates/next-webgl/components/layout/theme/index.tsx +2 -5
  52. package/src/templates/next-webgl/components/layout/wrapper/index.tsx +1 -2
  53. package/src/templates/next-webgl/components/ui/README.md +2 -3
  54. package/src/templates/next-webgl/components/ui/image/index.tsx +3 -3
  55. package/src/templates/next-webgl/lib/README.md +3 -3
  56. package/src/templates/next-webgl/lib/hooks/use-device-detection.ts +3 -2
  57. package/src/templates/next-webgl/lib/hooks/use-media-breakpoint.ts +10 -3
  58. package/src/templates/next-webgl/lib/scripts/dev.ts +9 -29
  59. package/src/templates/next-webgl/lib/styles/README.md +7 -58
  60. package/src/templates/next-webgl/lib/styles/fonts.ts +7 -15
  61. package/src/templates/next-webgl/lib/styles/global.css +198 -0
  62. package/src/templates/next-webgl/lib/styles/index.css +3 -0
  63. package/src/templates/next-webgl/lib/styles/tokens.css +179 -0
  64. package/src/templates/next-webgl/lib/utils/global-css.d.ts +1 -0
  65. package/src/templates/next-webgl/lib/utils/viewport.ts +11 -5
  66. package/src/templates/next-webgl/next.config.ts +0 -1
  67. package/src/templates/next-webgl/package.json +10 -19
  68. package/src/templates/next-webgl/postcss.config.mjs +0 -14
  69. package/src/templates/next-webgl/tsconfig.tsbuildinfo +1 -0
  70. package/src/templates/next-default/components/ui/image/image.module.css +0 -5
  71. package/src/templates/next-default/lib/scripts/generate-component.ts +0 -322
  72. package/src/templates/next-default/lib/scripts/generate-page.ts +0 -193
  73. package/src/templates/next-default/lib/scripts/generate.ts +0 -79
  74. package/src/templates/next-default/lib/store/app.ts +0 -11
  75. package/src/templates/next-default/lib/store/index.ts +0 -11
  76. package/src/templates/next-default/lib/styles/colors.ts +0 -63
  77. package/src/templates/next-default/lib/styles/config.ts +0 -34
  78. package/src/templates/next-default/lib/styles/css/global.css +0 -85
  79. package/src/templates/next-default/lib/styles/css/index.css +0 -6
  80. package/src/templates/next-default/lib/styles/css/reset.css +0 -166
  81. package/src/templates/next-default/lib/styles/css/root.css +0 -68
  82. package/src/templates/next-default/lib/styles/css/tailwind.css +0 -132
  83. package/src/templates/next-default/lib/styles/easings.ts +0 -21
  84. package/src/templates/next-default/lib/styles/index.ts +0 -12
  85. package/src/templates/next-default/lib/styles/layout.mjs +0 -27
  86. package/src/templates/next-default/lib/styles/scripts/README.md +0 -29
  87. package/src/templates/next-default/lib/styles/scripts/generate-root.ts +0 -57
  88. package/src/templates/next-default/lib/styles/scripts/generate-tailwind.ts +0 -162
  89. package/src/templates/next-default/lib/styles/scripts/postcss-functions.mjs +0 -168
  90. package/src/templates/next-default/lib/styles/scripts/setup-styles.ts +0 -24
  91. package/src/templates/next-default/lib/styles/scripts/utils.ts +0 -20
  92. package/src/templates/next-default/lib/styles/typography.ts +0 -36
  93. package/src/templates/next-default/lib/utils/css.d.ts +0 -21
  94. package/src/templates/next-default/lib/utils/math.test.ts +0 -221
  95. package/src/templates/next-default/lib/utils/strings.test.ts +0 -166
  96. package/src/templates/next-default/lib/utils/viewport.test.ts +0 -256
  97. package/src/templates/next-default/public/fonts/geist/Geist-Mono.woff2 +0 -0
  98. package/src/templates/next-experiments/components/ui/image/image.module.css +0 -5
  99. package/src/templates/next-experiments/lib/scripts/generate-component.ts +0 -322
  100. package/src/templates/next-experiments/lib/scripts/generate-page.ts +0 -193
  101. package/src/templates/next-experiments/lib/scripts/generate.ts +0 -79
  102. package/src/templates/next-experiments/lib/store/app.ts +0 -11
  103. package/src/templates/next-experiments/lib/store/index.ts +0 -11
  104. package/src/templates/next-experiments/lib/styles/colors.ts +0 -63
  105. package/src/templates/next-experiments/lib/styles/config.ts +0 -34
  106. package/src/templates/next-experiments/lib/styles/css/global.css +0 -85
  107. package/src/templates/next-experiments/lib/styles/css/index.css +0 -6
  108. package/src/templates/next-experiments/lib/styles/css/reset.css +0 -166
  109. package/src/templates/next-experiments/lib/styles/css/root.css +0 -68
  110. package/src/templates/next-experiments/lib/styles/css/tailwind.css +0 -132
  111. package/src/templates/next-experiments/lib/styles/easings.ts +0 -21
  112. package/src/templates/next-experiments/lib/styles/index.ts +0 -12
  113. package/src/templates/next-experiments/lib/styles/layout.mjs +0 -27
  114. package/src/templates/next-experiments/lib/styles/scripts/README.md +0 -29
  115. package/src/templates/next-experiments/lib/styles/scripts/generate-root.ts +0 -57
  116. package/src/templates/next-experiments/lib/styles/scripts/generate-tailwind.ts +0 -162
  117. package/src/templates/next-experiments/lib/styles/scripts/postcss-functions.mjs +0 -168
  118. package/src/templates/next-experiments/lib/styles/scripts/setup-styles.ts +0 -24
  119. package/src/templates/next-experiments/lib/styles/scripts/utils.ts +0 -20
  120. package/src/templates/next-experiments/lib/styles/typography.ts +0 -36
  121. package/src/templates/next-experiments/lib/utils/css.d.ts +0 -21
  122. package/src/templates/next-experiments/lib/utils/math.test.ts +0 -221
  123. package/src/templates/next-experiments/lib/utils/strings.test.ts +0 -166
  124. package/src/templates/next-experiments/lib/utils/viewport.test.ts +0 -256
  125. package/src/templates/next-experiments/public/fonts/geist/Geist-Mono.woff2 +0 -0
  126. package/src/templates/next-webgl/components/ui/image/image.module.css +0 -5
  127. package/src/templates/next-webgl/lib/scripts/generate-component.ts +0 -322
  128. package/src/templates/next-webgl/lib/scripts/generate-page.ts +0 -193
  129. package/src/templates/next-webgl/lib/scripts/generate.ts +0 -79
  130. package/src/templates/next-webgl/lib/store/app.ts +0 -11
  131. package/src/templates/next-webgl/lib/store/index.ts +0 -11
  132. package/src/templates/next-webgl/lib/styles/colors.ts +0 -63
  133. package/src/templates/next-webgl/lib/styles/config.ts +0 -34
  134. package/src/templates/next-webgl/lib/styles/css/global.css +0 -85
  135. package/src/templates/next-webgl/lib/styles/css/index.css +0 -6
  136. package/src/templates/next-webgl/lib/styles/css/reset.css +0 -166
  137. package/src/templates/next-webgl/lib/styles/css/root.css +0 -68
  138. package/src/templates/next-webgl/lib/styles/css/tailwind.css +0 -132
  139. package/src/templates/next-webgl/lib/styles/easings.ts +0 -21
  140. package/src/templates/next-webgl/lib/styles/index.ts +0 -12
  141. package/src/templates/next-webgl/lib/styles/layout.mjs +0 -27
  142. package/src/templates/next-webgl/lib/styles/scripts/README.md +0 -29
  143. package/src/templates/next-webgl/lib/styles/scripts/generate-root.ts +0 -57
  144. package/src/templates/next-webgl/lib/styles/scripts/generate-tailwind.ts +0 -162
  145. package/src/templates/next-webgl/lib/styles/scripts/postcss-functions.mjs +0 -168
  146. package/src/templates/next-webgl/lib/styles/scripts/setup-styles.ts +0 -24
  147. package/src/templates/next-webgl/lib/styles/scripts/utils.ts +0 -20
  148. package/src/templates/next-webgl/lib/styles/typography.ts +0 -36
  149. package/src/templates/next-webgl/lib/utils/css.d.ts +0 -21
  150. package/src/templates/next-webgl/lib/utils/math.test.ts +0 -221
  151. package/src/templates/next-webgl/lib/utils/strings.test.ts +0 -166
  152. package/src/templates/next-webgl/lib/utils/viewport.test.ts +0 -256
  153. package/src/templates/next-webgl/public/fonts/geist/Geist-Mono.woff2 +0 -0
@@ -1,6 +1,7 @@
1
1
  import { useEffect, useState } from "react"
2
2
  import { useMedia } from "react-use"
3
- import { breakpoints } from "@/lib/styles/config"
3
+
4
+ const MOBILE_BREAKPOINT = 640
4
5
 
5
6
  /**
6
7
  * Hook for detecting device capabilities and characteristics.
@@ -58,7 +59,7 @@ import { breakpoints } from "@/lib/styles/config"
58
59
  * ```
59
60
  */
60
61
  export function useDeviceDetection() {
61
- const isMobile = useMedia(`(max-width: ${breakpoints.mobile - 1}px)`, true)
62
+ const isMobile = useMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`, true)
62
63
  const isReducedMotion = useMedia("(prefers-reduced-motion: reduce)")
63
64
  const [dpr, setDpr] = useState<number | undefined>(undefined)
64
65
  const [isSafari, setIsSafari] = useState<boolean | undefined>(undefined)
@@ -1,5 +1,12 @@
1
1
  import { useMedia } from "react-use"
2
- import { breakpoints } from "@/lib/styles/config"
2
+
3
+ const BREAKPOINTS = {
4
+ "desktop-large": 1920,
5
+ desktop: 1440,
6
+ "tablet-lg": 1024,
7
+ tablet: 768,
8
+ mobile: 640,
9
+ } as const
3
10
 
4
11
  /**
5
12
  * Hook for detecting if the viewport is at a specific breakpoint.
@@ -8,8 +15,8 @@ import { breakpoints } from "@/lib/styles/config"
8
15
  * @returns True if the viewport is at the breakpoint
9
16
  */
10
17
  export function useMediaBreakpoint(
11
- breakpoint: keyof typeof breakpoints,
18
+ breakpoint: keyof typeof BREAKPOINTS,
12
19
  defaultState = false
13
20
  ) {
14
- return useMedia(`(min-width: ${breakpoints[breakpoint]}px)`, defaultState)
21
+ return useMedia(`(min-width: ${BREAKPOINTS[breakpoint]}px)`, defaultState)
15
22
  }
@@ -1,7 +1,5 @@
1
1
  /**
2
- * Cross-platform parallel dev script
3
- * Replaces npm-run-all for running multiple processes simultaneously
4
- * Works on Windows, macOS, and Linux using Bun's native APIs
2
+ * Cross-platform Next.js dev launcher.
5
3
  */
6
4
 
7
5
  import { bunExecutable, colorEnv } from "./utils"
@@ -14,39 +12,21 @@ const nextDevArgs = [bunExecutable, "next", "dev"]
14
12
  if (isHttps) nextDevArgs.push("--experimental-https")
15
13
  if (isInspect) nextDevArgs.push("--inspect")
16
14
 
17
- // Build environment with FORCE_COLOR
18
15
  const devEnv = colorEnv()
19
16
 
20
- const processes = [
21
- // Style watcher
22
- Bun.spawn(
23
- [bunExecutable, "--watch", "./lib/styles/scripts/setup-styles.ts"],
24
- {
25
- stdout: "inherit",
26
- stderr: "inherit",
27
- env: devEnv,
28
- }
29
- ),
30
-
31
- // Next.js dev server
32
- Bun.spawn(nextDevArgs, {
33
- stdout: "inherit",
34
- stderr: "inherit",
35
- env: devEnv,
36
- }),
37
- ]
38
-
39
- // Handle graceful shutdown
17
+ const nextDevProcess = Bun.spawn(nextDevArgs, {
18
+ stdout: "inherit",
19
+ stderr: "inherit",
20
+ env: devEnv,
21
+ })
22
+
40
23
  const cleanup = () => {
41
- for (const proc of processes) {
42
- proc.kill()
43
- }
24
+ nextDevProcess.kill()
44
25
  process.exit(0)
45
26
  }
46
27
 
47
28
  process.on("SIGINT", cleanup)
48
29
  process.on("SIGTERM", cleanup)
49
30
 
50
- // Wait for any process to exit (if one crashes, we want to know)
51
- await Promise.race(processes.map((p) => p.exited))
31
+ await nextDevProcess.exited
52
32
  cleanup()
@@ -1,64 +1,13 @@
1
1
  # Styles
2
2
 
3
- Hybrid styling with Tailwind CSS v4 and custom PostCSS functions.
3
+ Minimal Tailwind setup for the starter.
4
4
 
5
- ## PostCSS Functions
6
-
7
- ```css
8
- /* Viewport-relative sizing */
9
- .element {
10
- width: tovw(100); /* 6.94vw (100px at 1440px) */
11
- width: tovw(100, 50); /* max(50px, 6.94vw) */
12
- width: tovw(16, undefined, 'mobile'); /* 4.27vw (16px at 375px) */
13
- }
14
-
15
- /* Relative units */
16
- .text {
17
- font-size: torem(24); /* 1.5rem (24px / 16px) */
18
- padding: toem(16, 14); /* 1.14em (16px / 14px) */
19
- }
20
-
21
- /* Grid columns */
22
- .sidebar {
23
- width: columns(3); /* Spans 3 columns + gaps */
24
- }
25
- ```
26
-
27
- ## Custom Utilities (`dr-*`)
28
-
29
- ```tsx
30
- // Responsive sizing (scales with viewport)
31
- <div className="dr-w-150 dr-h-100" />
32
-
33
- // Column-based sizing
34
- <div className="dr-w-col-4" /> {/* 4 columns wide */}
35
-
36
- // Grid layout
37
- <div className="dr-grid" /> {/* 4 cols mobile, 12 cols desktop */}
38
- ```
39
-
40
- ## Breakpoints
41
-
42
- ```css
43
- @media (--mobile) { /* <= 799px */ }
44
- @media (--desktop) { /* >= 800px */ }
45
- ```
46
-
47
- ## Configuration
5
+ ## Files
48
6
 
49
7
  | File | Purpose |
50
8
  |------|---------|
51
- | `colors.ts` | Color palette & themes |
52
- | `typography.ts` | Font sizes & weights |
53
- | `layout.mjs` | Grid, breakpoints, spacing |
54
- | `easings.ts` | Animation curves |
55
- | `fonts.ts` | Font loading |
56
-
57
- After changing config: `bun setup:styles`
58
-
59
- ## Generated Files (Don't Edit)
60
-
61
- - `css/root.css` — CSS custom properties
62
- - `css/tailwind.css` — Tailwind utilities
63
-
64
- See [scripts/README.md](scripts/README.md) for generation details.
9
+ | `index.css` | Single stylesheet entrypoint imported by `app/layout.tsx` |
10
+ | `tokens.css` | Theme variables, breakpoints, and custom Tailwind utilities |
11
+ | `global.css` | Reset and global app styles |
12
+ | `fonts.ts` | Font variable setup |
13
+ | `cn.ts` | Tailwind class merging helper |
@@ -1,17 +1,9 @@
1
- import localFont from "next/font/local"
1
+ import { Geist_Mono } from "next/font/google";
2
2
 
3
- const mono = localFont({
4
- src: [
5
- {
6
- path: "../../public/fonts/geist/Geist-Mono.woff2",
7
- weight: "400",
8
- style: "normal",
9
- },
10
- ],
3
+ const mono = Geist_Mono({
4
+ subsets: ["latin"],
11
5
  display: "swap",
12
6
  variable: "--geist-mono",
13
- preload: true,
14
- adjustFontFallback: "Arial",
15
7
  fallback: [
16
8
  "ui-monospace",
17
9
  "SFMono-Regular",
@@ -20,9 +12,9 @@ const mono = localFont({
20
12
  "Menlo",
21
13
  "monospace",
22
14
  ],
23
- })
15
+ });
24
16
 
25
- const fonts = [mono]
26
- const fontsVariable = fonts.map((font) => font.variable).join(" ")
17
+ const fonts = [mono];
18
+ const fontsVariable = fonts.map((font) => font.variable).join(" ");
27
19
 
28
- export { fontsVariable }
20
+ export { fontsVariable };
@@ -0,0 +1,198 @@
1
+ /***
2
+ The new CSS reset - version 1.11.3 (last updated 25.08.2024)
3
+ GitHub page: https://github.com/elad2412/the-new-css-reset
4
+ ***/
5
+
6
+ *:where(
7
+ :not(
8
+ html,
9
+ iframe,
10
+ canvas,
11
+ img,
12
+ svg,
13
+ video,
14
+ audio,
15
+ dialog,
16
+ vercel-live-feedback,
17
+ nextjs-portal,
18
+ :where(select, option)
19
+ ):not(svg *, symbol *)
20
+ ) {
21
+ all: unset;
22
+ display: revert;
23
+ }
24
+
25
+ *,
26
+ *::before,
27
+ *::after {
28
+ box-sizing: border-box;
29
+ }
30
+
31
+ html {
32
+ --scrollbar-gutter: 0px;
33
+ -moz-text-size-adjust: none;
34
+ -webkit-text-size-adjust: none;
35
+ scrollbar-gutter: stable;
36
+ text-rendering: optimizeLegibility;
37
+ text-size-adjust: none;
38
+
39
+ &.lenis-stopped {
40
+ --scrollbar-gutter: var(--scrollbar-width);
41
+ }
42
+ }
43
+
44
+ html.overflow-hidden {
45
+ overflow: hidden;
46
+ touch-action: none;
47
+ }
48
+
49
+ a,
50
+ button {
51
+ -webkit-tap-highlight-color: transparent;
52
+ cursor: revert;
53
+ }
54
+
55
+ ol,
56
+ ul,
57
+ menu,
58
+ summary {
59
+ list-style: none;
60
+ }
61
+
62
+ ol {
63
+ counter-reset: revert;
64
+ }
65
+
66
+ img,
67
+ video,
68
+ audio {
69
+ max-block-size: 100%;
70
+ max-inline-size: 100%;
71
+ }
72
+
73
+ table {
74
+ border-collapse: collapse;
75
+ }
76
+
77
+ input,
78
+ textarea {
79
+ -webkit-user-select: auto;
80
+ }
81
+
82
+ textarea {
83
+ white-space: revert;
84
+ }
85
+
86
+ meter {
87
+ -webkit-appearance: revert;
88
+ appearance: revert;
89
+ }
90
+
91
+ :where(pre) {
92
+ all: revert;
93
+ box-sizing: border-box;
94
+ }
95
+
96
+ ::placeholder {
97
+ color: unset;
98
+ }
99
+
100
+ :where([hidden]) {
101
+ display: none;
102
+ }
103
+
104
+ :where([contenteditable]:not([contenteditable="false"])) {
105
+ -moz-user-modify: read-write;
106
+ -webkit-line-break: after-white-space;
107
+ -webkit-user-modify: read-write;
108
+ -webkit-user-select: auto;
109
+ overflow-wrap: break-word;
110
+ }
111
+
112
+ :where([draggable="true"]) {
113
+ -webkit-user-drag: element;
114
+ }
115
+
116
+ :where(dialog:modal) {
117
+ all: revert;
118
+ box-sizing: border-box;
119
+ }
120
+
121
+ ::-webkit-details-marker {
122
+ display: none;
123
+ }
124
+
125
+ :root {
126
+ color-scheme: light dark;
127
+ }
128
+
129
+ :where(input[type="file"]) {
130
+ -webkit-appearance: none;
131
+ appearance: none;
132
+ cursor: default;
133
+ }
134
+
135
+ body {
136
+ -moz-osx-font-smoothing: grayscale;
137
+ -webkit-font-smoothing: antialiased;
138
+ background-color: var(--color-primary);
139
+ color: var(--color-secondary);
140
+ display: flex;
141
+ flex-direction: column;
142
+ min-height: 100vh;
143
+ overscroll-behavior: none;
144
+ }
145
+
146
+ *::selection {
147
+ background-color: var(--color-contrast);
148
+ color: var(--color-primary);
149
+ }
150
+
151
+ svg.icon {
152
+ path[fill],
153
+ rect[fill],
154
+ circle[fill] {
155
+ fill: currentColor;
156
+ }
157
+
158
+ path[stroke],
159
+ rect[stroke],
160
+ circle[stroke] {
161
+ stroke: currentColor;
162
+ }
163
+ }
164
+
165
+ .link {
166
+ @media (--hover) {
167
+ &:hover {
168
+ text-decoration: underline;
169
+ }
170
+ }
171
+ }
172
+
173
+ *:focus-visible {
174
+ outline: 2px solid var(--color-contrast);
175
+ }
176
+
177
+ html.scrollbar-grabbing,
178
+ img {
179
+ -moz-user-select: none;
180
+ -ms-user-select: none;
181
+ -o-user-select: none;
182
+ -webkit-touch-callout: none;
183
+ -webkit-user-select: none;
184
+ user-select: none;
185
+ }
186
+
187
+ button {
188
+ cursor: pointer;
189
+ text-box-edge: cap alphabetic;
190
+ text-box-trim: both;
191
+ user-select: none;
192
+ }
193
+
194
+ html.screenshot {
195
+ *:not(:has(canvas), canvas, :has(#orchestra), #orchestra, #orchestra *) {
196
+ opacity: 0 !important;
197
+ }
198
+ }
@@ -0,0 +1,3 @@
1
+ @import "tailwindcss/utilities.css";
2
+ @import "./tokens.css";
3
+ @import "./global.css";
@@ -0,0 +1,179 @@
1
+ @custom-media --hover (hover: hover);
2
+ @custom-media --reduced-motion (prefers-reduced-motion: reduce);
3
+ @custom-media --mobile-only (width < 768px);
4
+ @custom-media --tablet (width >= 768px);
5
+ @custom-media --tablet-lg (width >= 1024px);
6
+ @custom-media --desktop (width >= 1440px);
7
+ @custom-media --desktop-large (width >= 1920px);
8
+
9
+ :root {
10
+ --device-width: 640;
11
+ --device-height: 650;
12
+ --columns: 4;
13
+ --gap: 16px;
14
+ --safe: 16px;
15
+ --header-height: 58px;
16
+ --layout-width: calc(100vw - (2 * var(--safe)));
17
+ --column-width: calc(
18
+ (var(--layout-width) - (var(--columns) - 1) * var(--gap)) / var(--columns)
19
+ );
20
+ --ease-in-quad: cubic-bezier(0.55, 0.085, 0.68, 0.53);
21
+ --ease-in-cubic: cubic-bezier(0.55, 0.055, 0.675, 0.19);
22
+ --ease-in-quart: cubic-bezier(0.895, 0.03, 0.685, 0.22);
23
+ --ease-in-quint: cubic-bezier(0.755, 0.05, 0.855, 0.06);
24
+ --ease-in-expo: cubic-bezier(0.95, 0.05, 0.795, 0.035);
25
+ --ease-in-circ: cubic-bezier(0.6, 0.04, 0.98, 0.335);
26
+ --ease-out-quad: cubic-bezier(0.25, 0.46, 0.45, 0.94);
27
+ --ease-out-cubic: cubic-bezier(0.215, 0.61, 0.355, 1);
28
+ --ease-out-quart: cubic-bezier(0.165, 0.84, 0.44, 1);
29
+ --ease-out-quint: cubic-bezier(0.23, 1, 0.32, 1);
30
+ --ease-out-expo: cubic-bezier(0.19, 1, 0.22, 1);
31
+ --ease-out-circ: cubic-bezier(0.075, 0.82, 0.165, 1);
32
+ --ease-in-out-quad: cubic-bezier(0.455, 0.03, 0.515, 0.955);
33
+ --ease-in-out-cubic: cubic-bezier(0.645, 0.045, 0.355, 1);
34
+ --ease-in-out-quart: cubic-bezier(0.77, 0, 0.175, 1);
35
+ --ease-in-out-quint: cubic-bezier(0.86, 0, 0.07, 1);
36
+ --ease-in-out-expo: cubic-bezier(1, 0, 0, 1);
37
+ --ease-in-out-circ: cubic-bezier(0.785, 0.135, 0.15, 0.86);
38
+ --ease-gleasing: cubic-bezier(0.4, 0, 0, 1);
39
+ --color-black: #000000;
40
+ --color-white: #ffffff;
41
+ --color-orange: #ff4d00;
42
+ --color-blue: #487cff;
43
+ --color-green: #00ff9b;
44
+ --color-violet: #f101a5;
45
+ --color-pink: #ff73a6;
46
+ --color-gray: #666666;
47
+
48
+ @variant desktop {
49
+ --device-width: 1440;
50
+ --device-height: 816;
51
+ --columns: 12;
52
+ --header-height: 98px;
53
+ }
54
+ }
55
+
56
+ @theme {
57
+ --breakpoint-*: initial;
58
+ --breakpoint-desktop-large: 1920px;
59
+ --breakpoint-desktop: 1440px;
60
+ --breakpoint-tablet-lg: 1024px;
61
+ --breakpoint-tablet: 768px;
62
+ --breakpoint-mobile: 640px;
63
+
64
+ --color-*: initial;
65
+ --color-primary: #ffffff;
66
+ --color-secondary: #000000;
67
+ --color-contrast: #ff4d00;
68
+ --color-black: #000000;
69
+ --color-white: #ffffff;
70
+ --color-orange: #ff4d00;
71
+ --color-blue: #487cff;
72
+ --color-green: #00ff9b;
73
+ --color-violet: #f101a5;
74
+ --color-pink: #ff73a6;
75
+ --color-gray: #666666;
76
+ --color-gray-50: #f5f5f5;
77
+ --color-gray-100: #e0e0e0;
78
+ --color-gray-200: #c2c2c2;
79
+ --color-gray-300: #a3a3a3;
80
+ --color-gray-400: #858585;
81
+ --color-gray-500: #666666;
82
+ --color-gray-600: #4d4d4d;
83
+ --color-gray-700: #333333;
84
+ --color-gray-800: #1a1a1a;
85
+
86
+ --spacing: 0.25rem;
87
+ --spacing-0: 0;
88
+ --spacing-safe: var(--safe);
89
+ --spacing-gap: var(--gap);
90
+ --spacing-header-height: var(--header-height);
91
+
92
+ --font-*: initial;
93
+ --font-mono: var(--geist-mono);
94
+
95
+ --ease-*: initial;
96
+ --ease-in-quad: var(--ease-in-quad);
97
+ --ease-in-cubic: var(--ease-in-cubic);
98
+ --ease-in-quart: var(--ease-in-quart);
99
+ --ease-in-quint: var(--ease-in-quint);
100
+ --ease-in-expo: var(--ease-in-expo);
101
+ --ease-in-circ: var(--ease-in-circ);
102
+ --ease-out-quad: var(--ease-out-quad);
103
+ --ease-out-cubic: var(--ease-out-cubic);
104
+ --ease-out-quart: var(--ease-out-quart);
105
+ --ease-out-quint: var(--ease-out-quint);
106
+ --ease-out-expo: var(--ease-out-expo);
107
+ --ease-out-circ: var(--ease-out-circ);
108
+ --ease-in-out-quad: var(--ease-in-out-quad);
109
+ --ease-in-out-cubic: var(--ease-in-out-cubic);
110
+ --ease-in-out-quart: var(--ease-in-out-quart);
111
+ --ease-in-out-quint: var(--ease-in-out-quint);
112
+ --ease-in-out-expo: var(--ease-in-out-expo);
113
+ --ease-in-out-circ: var(--ease-in-out-circ);
114
+ --ease-gleasing: var(--ease-gleasing);
115
+ }
116
+
117
+ [data-theme="light"] {
118
+ --color-primary: #ffffff;
119
+ --color-secondary: #000000;
120
+ --color-contrast: #ff4d00;
121
+ }
122
+
123
+ [data-theme="dark"] {
124
+ --color-primary: #000000;
125
+ --color-secondary: #ffffff;
126
+ --color-contrast: #ff4d00;
127
+ }
128
+
129
+ @utility test-mono {
130
+ font-family: var(--geist-mono);
131
+ font-size: 20px;
132
+ font-style: normal;
133
+ font-weight: 400;
134
+ letter-spacing: 0;
135
+ line-height: 90%;
136
+
137
+ @variant desktop {
138
+ font-size: 24px;
139
+ }
140
+ }
141
+
142
+ @utility desktop-only {
143
+ @media (--mobile-only) {
144
+ display: none !important;
145
+ }
146
+ }
147
+
148
+ @utility mobile-only {
149
+ @media (--tablet) {
150
+ display: none !important;
151
+ }
152
+ }
153
+
154
+ @utility b-grid {
155
+ column-gap: var(--gap);
156
+ display: grid;
157
+ grid-template-columns: repeat(var(--columns), minmax(0, 1fr));
158
+ }
159
+
160
+ @utility b-layout-block {
161
+ margin-inline: auto;
162
+ width: calc(100% - 2 * var(--safe));
163
+ }
164
+
165
+ @utility b-layout-block-inner {
166
+ padding-inline: var(--safe);
167
+ width: 100%;
168
+ }
169
+
170
+ @utility b-layout-grid {
171
+ @apply b-layout-block b-grid;
172
+ }
173
+
174
+ @utility b-layout-grid-inner {
175
+ @apply b-layout-block-inner b-grid;
176
+ }
177
+
178
+ @custom-variant light (&:where([data-theme="light"], [data-theme="light"] *));
179
+ @custom-variant dark (&:where([data-theme="dark"], [data-theme="dark"] *));
@@ -0,0 +1 @@
1
+ declare module "@/lib/styles/index.css";
@@ -25,9 +25,15 @@
25
25
  * - **Runtime calculations**: Use for canvas, WebGL, or dynamic sizing
26
26
  */
27
27
 
28
- import { breakpoints } from "@/lib/styles/config"
28
+ const BREAKPOINTS = {
29
+ "desktop-large": 1920,
30
+ desktop: 1440,
31
+ "tablet-lg": 1024,
32
+ tablet: 768,
33
+ mobile: 640,
34
+ } as const
29
35
 
30
- type ContextSize = keyof typeof breakpoints | number
36
+ type ContextSize = keyof typeof BREAKPOINTS | number
31
37
 
32
38
  /**
33
39
  * Resolves a context size to a pixel value.
@@ -39,7 +45,7 @@ function resolveContext(context: ContextSize): number {
39
45
  if (typeof context === "number") {
40
46
  return context
41
47
  }
42
- return breakpoints[context] ?? breakpoints.desktop
48
+ return BREAKPOINTS[context] ?? BREAKPOINTS.desktop
43
49
  }
44
50
 
45
51
  /**
@@ -50,8 +56,8 @@ function resolveContext(context: ContextSize): number {
50
56
  */
51
57
  function isContextIdentifier(
52
58
  value: unknown
53
- ): value is keyof typeof breakpoints {
54
- return typeof value === "string" && value in breakpoints
59
+ ): value is keyof typeof BREAKPOINTS {
60
+ return typeof value === "string" && value in BREAKPOINTS
55
61
  }
56
62
 
57
63
  /**
@@ -67,7 +67,6 @@ const nextConfig: NextConfig = {
67
67
  "three",
68
68
  "postprocessing",
69
69
  "lenis",
70
- "zustand",
71
70
  ],
72
71
  },
73
72
  images: {
@@ -7,40 +7,34 @@
7
7
  "scripts": {
8
8
  "analyze": "cross-env ANALYZE=true bun run build",
9
9
  "analyze:experimental": "next experimental-analyze",
10
- "build": "bun run setup:styles && next build",
10
+ "build": "next build",
11
11
  "dev": "bun ./lib/scripts/dev.ts",
12
12
  "dev:https": "bun ./lib/scripts/dev.ts --https",
13
13
  "dev:inspect": "bun ./lib/scripts/dev.ts --inspect",
14
14
  "format": "biome format --write .",
15
- "generate": "bun ./lib/scripts/generate.ts",
16
15
  "lighthouse": "bunx @unlighthouse/cli --site http://localhost:3000",
17
16
  "lint": "biome lint --max-diagnostics=200",
18
17
  "lint:fix": "biome lint --write --unsafe --max-diagnostics=200",
19
- "setup:styles": "bun ./lib/styles/scripts/setup-styles.ts",
20
18
  "start": "next start",
21
- "test": "bun test",
22
- "test:setup": "bun test lib/scripts/setup-project.test.ts",
23
19
  "typecheck": "tsgo --noEmit",
24
20
  "typecheck:compare": "bun run typecheck:tsc && bun run typecheck",
25
21
  "typecheck:tsc": "tsc --noEmit --incremental false"
26
22
  },
27
23
  "dependencies": {
28
24
  "class-variance-authority": "^0.7.1",
29
- "next": "16.1.6",
30
- "react": "19.2.4",
31
- "react-dom": "19.2.4",
25
+ "clsx": "^2.1.1",
26
+ "next": "^16",
27
+ "react": "^19",
28
+ "react-dom": "^19",
32
29
  "react-use": "^17.6.0",
33
30
  "tailwind-merge": "^3.4.0",
34
- "zod": "^4.3.6",
35
- "zustand": "^5.0.10"
31
+ "zod": "^4.3.6"
36
32
  },
37
33
  "devDependencies": {
38
34
  "@biomejs/biome": "2.3.14",
39
- "@clack/prompts": "^0.11.0",
40
- "@csstools/postcss-global-data": "^3.1.0",
41
- "@next/bundle-analyzer": "16.1.6",
35
+ "@next/bundle-analyzer": "^16",
42
36
  "@svgr/webpack": "^8.1.0",
43
- "@tailwindcss/postcss": "^4.1.18",
37
+ "@tailwindcss/postcss": "^4",
44
38
  "@types/bun": "^1.3.6",
45
39
  "@types/node": "^20.19.30",
46
40
  "@types/react": "^19.2.9",
@@ -48,10 +42,9 @@
48
42
  "@typescript/native-preview": "^7.0.0-dev.20260122.3",
49
43
  "babel-plugin-react-compiler": "1.0.0",
50
44
  "cross-env": "^10.1.0",
51
- "postcss-functions": "^4.0.2",
52
45
  "postcss-preset-env": "^10.6.1",
53
- "tailwindcss": "^4.1.18",
54
- "typescript": "^5.9.3"
46
+ "tailwindcss": "^4",
47
+ "typescript": "^5"
55
48
  },
56
49
  "trustedDependencies": [
57
50
  "@biomejs/biome",