bsmnt 0.2.9 → 0.2.11

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 (197) hide show
  1. package/README.md +84 -146
  2. package/dist/configs/skills.d.ts +27 -0
  3. package/dist/configs/skills.d.ts.map +1 -0
  4. package/dist/configs/skills.js +18 -0
  5. package/dist/configs/skills.js.map +1 -0
  6. package/dist/configs/skills.json +26 -0
  7. package/dist/helpers/add/hooks-config.d.ts.map +1 -1
  8. package/dist/helpers/add/hooks-config.js +0 -6
  9. package/dist/helpers/add/hooks-config.js.map +1 -1
  10. package/dist/helpers/create/setup-agent.d.ts.map +1 -1
  11. package/dist/helpers/create/setup-agent.js +15 -5
  12. package/dist/helpers/create/setup-agent.js.map +1 -1
  13. package/dist/helpers/integrate/merge-config.d.ts.map +1 -1
  14. package/dist/helpers/integrate/merge-config.js +1 -0
  15. package/dist/helpers/integrate/merge-config.js.map +1 -1
  16. package/dist/helpers/integrate/sanity/config.d.ts.map +1 -1
  17. package/dist/helpers/integrate/sanity/config.js +8 -2
  18. package/dist/helpers/integrate/sanity/config.js.map +1 -1
  19. package/dist/helpers/integrate/sanity/mergers/layout-merger.d.ts.map +1 -1
  20. package/dist/helpers/integrate/sanity/mergers/layout-merger.js +13 -12
  21. package/dist/helpers/integrate/sanity/mergers/layout-merger.js.map +1 -1
  22. package/dist/helpers/skills/index.d.ts +10 -0
  23. package/dist/helpers/skills/index.d.ts.map +1 -0
  24. package/dist/helpers/skills/index.js +136 -0
  25. package/dist/helpers/skills/index.js.map +1 -0
  26. package/dist/index.js +18 -0
  27. package/dist/index.js.map +1 -1
  28. package/package.json +4 -3
  29. package/src/helpers/integrate/sanity/files/app/api/blog/[slug]/route.ts +2 -1
  30. package/src/helpers/integrate/sanity/files/lib/integrations/sanity/confirm-publish-action.ts +31 -0
  31. package/src/helpers/integrate/sanity/files/lib/integrations/sanity/sanity.config.ts +17 -0
  32. package/src/helpers/integrate/sanity/files/lib/utils/json-ld.tsx +249 -0
  33. package/src/template-hooks/config.js +0 -6
  34. package/src/templates/next-default/README.md +28 -199
  35. package/src/templates/next-default/app/layout.tsx +20 -3
  36. package/src/templates/next-default/biome.json +1 -14
  37. package/src/templates/next-default/components/layout/theme/index.tsx +2 -5
  38. package/src/templates/next-default/components/layout/wrapper/index.tsx +1 -2
  39. package/src/templates/next-default/components/ui/README.md +2 -3
  40. package/src/templates/next-default/components/ui/image/index.tsx +3 -3
  41. package/src/templates/next-default/lib/README.md +3 -3
  42. package/src/templates/next-default/lib/hooks/use-device-detection.ts +4 -3
  43. package/src/templates/next-default/lib/hooks/use-media-breakpoint.ts +11 -4
  44. package/src/templates/next-default/lib/hooks/use-media.ts +29 -0
  45. package/src/templates/next-default/lib/scripts/dev.ts +9 -29
  46. package/src/templates/next-default/lib/styles/README.md +7 -58
  47. package/src/templates/next-default/lib/styles/fonts.ts +7 -15
  48. package/src/templates/next-default/lib/styles/global.css +198 -0
  49. package/src/templates/next-default/lib/styles/index.css +3 -0
  50. package/src/templates/next-default/lib/styles/tokens.css +179 -0
  51. package/src/templates/next-default/lib/utils/global-css.d.ts +1 -0
  52. package/src/templates/next-default/lib/utils/json-ld.tsx +199 -0
  53. package/src/templates/next-default/lib/utils/viewport.ts +11 -5
  54. package/src/templates/next-default/next.config.ts +0 -1
  55. package/src/templates/next-default/package.json +11 -18
  56. package/src/templates/next-default/postcss.config.mjs +0 -14
  57. package/src/templates/next-default/tsconfig.json +1 -0
  58. package/src/templates/next-default/tsconfig.tsbuildinfo +1 -0
  59. package/src/templates/next-experiments/README.md +29 -200
  60. package/src/templates/next-experiments/app/layout.tsx +20 -3
  61. package/src/templates/next-experiments/app/page.tsx +46 -39
  62. package/src/templates/next-experiments/biome.json +1 -14
  63. package/src/templates/next-experiments/components/layout/theme/index.tsx +2 -5
  64. package/src/templates/next-experiments/components/layout/wrapper/index.tsx +1 -2
  65. package/src/templates/next-experiments/components/ui/README.md +2 -3
  66. package/src/templates/next-experiments/components/ui/image/index.tsx +3 -2
  67. package/src/templates/next-experiments/lib/README.md +3 -3
  68. package/src/templates/next-experiments/lib/hooks/use-device-detection.ts +4 -3
  69. package/src/templates/next-experiments/lib/hooks/use-media-breakpoint.ts +11 -4
  70. package/src/templates/next-experiments/lib/hooks/use-media.ts +29 -0
  71. package/src/templates/next-experiments/lib/scripts/dev.ts +9 -29
  72. package/src/templates/next-experiments/lib/styles/README.md +7 -58
  73. package/src/templates/next-experiments/lib/styles/fonts.ts +7 -15
  74. package/src/templates/next-experiments/lib/styles/global.css +198 -0
  75. package/src/templates/next-experiments/lib/styles/index.css +3 -0
  76. package/src/templates/next-experiments/lib/styles/tokens.css +179 -0
  77. package/src/templates/next-experiments/lib/utils/global-css.d.ts +1 -0
  78. package/src/templates/next-experiments/lib/utils/json-ld.tsx +199 -0
  79. package/src/templates/next-experiments/lib/utils/viewport.ts +11 -5
  80. package/src/templates/next-experiments/next.config.ts +0 -1
  81. package/src/templates/next-experiments/package.json +11 -22
  82. package/src/templates/next-experiments/postcss.config.mjs +0 -14
  83. package/src/templates/next-experiments/tsconfig.json +1 -0
  84. package/src/templates/next-experiments/tsconfig.tsbuildinfo +1 -0
  85. package/src/templates/next-webgl/README.md +30 -200
  86. package/src/templates/next-webgl/app/layout.tsx +20 -3
  87. package/src/templates/next-webgl/biome.json +1 -14
  88. package/src/templates/next-webgl/components/layout/theme/index.tsx +2 -5
  89. package/src/templates/next-webgl/components/layout/wrapper/index.tsx +1 -2
  90. package/src/templates/next-webgl/components/ui/README.md +2 -3
  91. package/src/templates/next-webgl/components/ui/image/index.tsx +3 -3
  92. package/src/templates/next-webgl/lib/README.md +3 -3
  93. package/src/templates/next-webgl/lib/hooks/use-device-detection.ts +4 -3
  94. package/src/templates/next-webgl/lib/hooks/use-media-breakpoint.ts +11 -4
  95. package/src/templates/next-webgl/lib/hooks/use-media.ts +29 -0
  96. package/src/templates/next-webgl/lib/scripts/dev.ts +9 -29
  97. package/src/templates/next-webgl/lib/styles/README.md +7 -58
  98. package/src/templates/next-webgl/lib/styles/fonts.ts +7 -15
  99. package/src/templates/next-webgl/lib/styles/global.css +198 -0
  100. package/src/templates/next-webgl/lib/styles/index.css +3 -0
  101. package/src/templates/next-webgl/lib/styles/tokens.css +179 -0
  102. package/src/templates/next-webgl/lib/utils/global-css.d.ts +1 -0
  103. package/src/templates/next-webgl/lib/utils/json-ld.tsx +199 -0
  104. package/src/templates/next-webgl/lib/utils/viewport.ts +11 -5
  105. package/src/templates/next-webgl/next.config.ts +0 -1
  106. package/src/templates/next-webgl/package.json +11 -20
  107. package/src/templates/next-webgl/postcss.config.mjs +0 -14
  108. package/src/templates/next-webgl/tsconfig.json +1 -0
  109. package/src/templates/next-webgl/tsconfig.tsbuildinfo +1 -0
  110. package/plugins/no-anchor-element.grit +0 -11
  111. package/plugins/no-relative-parent-imports.grit +0 -6
  112. package/plugins/no-unnecessary-forwardref.grit +0 -5
  113. package/src/template-hooks/use-media.ts +0 -33
  114. package/src/templates/next-default/components/ui/image/image.module.css +0 -5
  115. package/src/templates/next-default/lib/scripts/generate-component.ts +0 -322
  116. package/src/templates/next-default/lib/scripts/generate-page.ts +0 -193
  117. package/src/templates/next-default/lib/scripts/generate.ts +0 -79
  118. package/src/templates/next-default/lib/store/app.ts +0 -11
  119. package/src/templates/next-default/lib/store/index.ts +0 -11
  120. package/src/templates/next-default/lib/styles/colors.ts +0 -63
  121. package/src/templates/next-default/lib/styles/config.ts +0 -34
  122. package/src/templates/next-default/lib/styles/css/global.css +0 -85
  123. package/src/templates/next-default/lib/styles/css/index.css +0 -6
  124. package/src/templates/next-default/lib/styles/css/reset.css +0 -166
  125. package/src/templates/next-default/lib/styles/css/root.css +0 -68
  126. package/src/templates/next-default/lib/styles/css/tailwind.css +0 -132
  127. package/src/templates/next-default/lib/styles/easings.ts +0 -21
  128. package/src/templates/next-default/lib/styles/index.ts +0 -12
  129. package/src/templates/next-default/lib/styles/layout.mjs +0 -27
  130. package/src/templates/next-default/lib/styles/scripts/README.md +0 -29
  131. package/src/templates/next-default/lib/styles/scripts/generate-root.ts +0 -57
  132. package/src/templates/next-default/lib/styles/scripts/generate-tailwind.ts +0 -162
  133. package/src/templates/next-default/lib/styles/scripts/postcss-functions.mjs +0 -168
  134. package/src/templates/next-default/lib/styles/scripts/setup-styles.ts +0 -24
  135. package/src/templates/next-default/lib/styles/scripts/utils.ts +0 -20
  136. package/src/templates/next-default/lib/styles/typography.ts +0 -36
  137. package/src/templates/next-default/lib/utils/css.d.ts +0 -21
  138. package/src/templates/next-default/lib/utils/math.test.ts +0 -221
  139. package/src/templates/next-default/lib/utils/strings.test.ts +0 -166
  140. package/src/templates/next-default/lib/utils/viewport.test.ts +0 -256
  141. package/src/templates/next-default/public/fonts/geist/Geist-Mono.woff2 +0 -0
  142. package/src/templates/next-experiments/components/ui/image/image.module.css +0 -5
  143. package/src/templates/next-experiments/lib/scripts/generate-component.ts +0 -322
  144. package/src/templates/next-experiments/lib/scripts/generate-page.ts +0 -193
  145. package/src/templates/next-experiments/lib/scripts/generate.ts +0 -79
  146. package/src/templates/next-experiments/lib/store/app.ts +0 -11
  147. package/src/templates/next-experiments/lib/store/index.ts +0 -11
  148. package/src/templates/next-experiments/lib/styles/colors.ts +0 -63
  149. package/src/templates/next-experiments/lib/styles/config.ts +0 -34
  150. package/src/templates/next-experiments/lib/styles/css/global.css +0 -85
  151. package/src/templates/next-experiments/lib/styles/css/index.css +0 -6
  152. package/src/templates/next-experiments/lib/styles/css/reset.css +0 -166
  153. package/src/templates/next-experiments/lib/styles/css/root.css +0 -68
  154. package/src/templates/next-experiments/lib/styles/css/tailwind.css +0 -132
  155. package/src/templates/next-experiments/lib/styles/easings.ts +0 -21
  156. package/src/templates/next-experiments/lib/styles/index.ts +0 -12
  157. package/src/templates/next-experiments/lib/styles/layout.mjs +0 -27
  158. package/src/templates/next-experiments/lib/styles/scripts/README.md +0 -29
  159. package/src/templates/next-experiments/lib/styles/scripts/generate-root.ts +0 -57
  160. package/src/templates/next-experiments/lib/styles/scripts/generate-tailwind.ts +0 -162
  161. package/src/templates/next-experiments/lib/styles/scripts/postcss-functions.mjs +0 -168
  162. package/src/templates/next-experiments/lib/styles/scripts/setup-styles.ts +0 -24
  163. package/src/templates/next-experiments/lib/styles/scripts/utils.ts +0 -20
  164. package/src/templates/next-experiments/lib/styles/typography.ts +0 -36
  165. package/src/templates/next-experiments/lib/utils/css.d.ts +0 -21
  166. package/src/templates/next-experiments/lib/utils/math.test.ts +0 -221
  167. package/src/templates/next-experiments/lib/utils/strings.test.ts +0 -166
  168. package/src/templates/next-experiments/lib/utils/viewport.test.ts +0 -256
  169. package/src/templates/next-experiments/public/fonts/geist/Geist-Mono.woff2 +0 -0
  170. package/src/templates/next-webgl/components/ui/image/image.module.css +0 -5
  171. package/src/templates/next-webgl/lib/scripts/generate-component.ts +0 -322
  172. package/src/templates/next-webgl/lib/scripts/generate-page.ts +0 -193
  173. package/src/templates/next-webgl/lib/scripts/generate.ts +0 -79
  174. package/src/templates/next-webgl/lib/store/app.ts +0 -11
  175. package/src/templates/next-webgl/lib/store/index.ts +0 -11
  176. package/src/templates/next-webgl/lib/styles/colors.ts +0 -63
  177. package/src/templates/next-webgl/lib/styles/config.ts +0 -34
  178. package/src/templates/next-webgl/lib/styles/css/global.css +0 -85
  179. package/src/templates/next-webgl/lib/styles/css/index.css +0 -6
  180. package/src/templates/next-webgl/lib/styles/css/reset.css +0 -166
  181. package/src/templates/next-webgl/lib/styles/css/root.css +0 -68
  182. package/src/templates/next-webgl/lib/styles/css/tailwind.css +0 -132
  183. package/src/templates/next-webgl/lib/styles/easings.ts +0 -21
  184. package/src/templates/next-webgl/lib/styles/index.ts +0 -12
  185. package/src/templates/next-webgl/lib/styles/layout.mjs +0 -27
  186. package/src/templates/next-webgl/lib/styles/scripts/README.md +0 -29
  187. package/src/templates/next-webgl/lib/styles/scripts/generate-root.ts +0 -57
  188. package/src/templates/next-webgl/lib/styles/scripts/generate-tailwind.ts +0 -162
  189. package/src/templates/next-webgl/lib/styles/scripts/postcss-functions.mjs +0 -168
  190. package/src/templates/next-webgl/lib/styles/scripts/setup-styles.ts +0 -24
  191. package/src/templates/next-webgl/lib/styles/scripts/utils.ts +0 -20
  192. package/src/templates/next-webgl/lib/styles/typography.ts +0 -36
  193. package/src/templates/next-webgl/lib/utils/css.d.ts +0 -21
  194. package/src/templates/next-webgl/lib/utils/math.test.ts +0 -221
  195. package/src/templates/next-webgl/lib/utils/strings.test.ts +0 -166
  196. package/src/templates/next-webgl/lib/utils/viewport.test.ts +0 -256
  197. package/src/templates/next-webgl/public/fonts/geist/Geist-Mono.woff2 +0 -0
@@ -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";
@@ -0,0 +1,199 @@
1
+ import type {
2
+ Article,
3
+ BreadcrumbList,
4
+ Organization,
5
+ SearchAction,
6
+ Thing,
7
+ WebPage,
8
+ WebSite,
9
+ WithContext,
10
+ } from "schema-dts";
11
+
12
+ const APP_BASE_URL = process.env.NEXT_PUBLIC_BASE_URL;
13
+
14
+ function isAbsoluteUrl(value: string) {
15
+ return /^https?:\/\//.test(value);
16
+ }
17
+
18
+ function resolveUrl(value?: string) {
19
+ if (!value) return APP_BASE_URL;
20
+ if (isAbsoluteUrl(value)) return value;
21
+ if (!APP_BASE_URL) return undefined;
22
+
23
+ return new URL(value, APP_BASE_URL).toString();
24
+ }
25
+
26
+ /* -------------------------------- Component ------------------------------- */
27
+
28
+ export function JsonLd<T extends Thing>({
29
+ data,
30
+ }: {
31
+ data: WithContext<T>;
32
+ }) {
33
+ return (
34
+ <script
35
+ type="application/ld+json"
36
+ dangerouslySetInnerHTML={{
37
+ __html: JSON.stringify(data).replace(/</g, "\\u003c"),
38
+ }}
39
+ />
40
+ );
41
+ }
42
+
43
+ /* -------------------------------- Generators ------------------------------ */
44
+
45
+ interface WebSiteJsonLdOptions {
46
+ name: string;
47
+ url?: string;
48
+ description?: string;
49
+ /** URL to site-wide search (e.g. "/search?q={search_term_string}") */
50
+ searchUrl?: string;
51
+ }
52
+
53
+ export function generateWebSiteJsonLd(
54
+ options: WebSiteJsonLdOptions
55
+ ): WithContext<WebSite> {
56
+ const { name, url, description, searchUrl } = options;
57
+ const resolvedUrl = resolveUrl(url);
58
+ const resolvedSearchUrl = resolveUrl(searchUrl);
59
+
60
+ return {
61
+ "@context": "https://schema.org",
62
+ "@type": "WebSite",
63
+ name,
64
+ ...(resolvedUrl && { url: resolvedUrl }),
65
+ ...(description && { description }),
66
+ ...(resolvedSearchUrl && {
67
+ potentialAction: {
68
+ "@type": "SearchAction",
69
+ target: resolvedSearchUrl,
70
+ "query-input": "required name=search_term_string",
71
+ } as SearchAction & { "query-input": string },
72
+ }),
73
+ };
74
+ }
75
+
76
+ interface OrganizationJsonLdOptions {
77
+ name: string;
78
+ url?: string;
79
+ logo?: string;
80
+ description?: string;
81
+ sameAs?: string[];
82
+ }
83
+
84
+ export function generateOrganizationJsonLd(
85
+ options: OrganizationJsonLdOptions
86
+ ): WithContext<Organization> {
87
+ const { name, url, logo, description, sameAs } = options;
88
+ const resolvedUrl = resolveUrl(url);
89
+ const resolvedLogo = resolveUrl(logo);
90
+
91
+ return {
92
+ "@context": "https://schema.org",
93
+ "@type": "Organization",
94
+ name,
95
+ ...(resolvedUrl && { url: resolvedUrl }),
96
+ ...(resolvedLogo && { logo: resolvedLogo }),
97
+ ...(description && { description }),
98
+ ...(sameAs && { sameAs }),
99
+ };
100
+ }
101
+
102
+ interface WebPageJsonLdOptions {
103
+ title: string;
104
+ url?: string;
105
+ description?: string;
106
+ image?: string;
107
+ datePublished?: string;
108
+ dateModified?: string;
109
+ }
110
+
111
+ export function generateWebPageJsonLd(
112
+ options: WebPageJsonLdOptions
113
+ ): WithContext<WebPage> {
114
+ const { title, url, description, image, datePublished, dateModified } =
115
+ options;
116
+ const resolvedUrl = resolveUrl(url);
117
+ const resolvedImage = resolveUrl(image);
118
+
119
+ return {
120
+ "@context": "https://schema.org",
121
+ "@type": "WebPage",
122
+ name: title,
123
+ ...(resolvedUrl && { url: resolvedUrl }),
124
+ ...(description && { description }),
125
+ ...(resolvedImage && { image: resolvedImage }),
126
+ ...(datePublished && { datePublished }),
127
+ ...(dateModified && { dateModified }),
128
+ };
129
+ }
130
+
131
+ interface ArticleJsonLdOptions {
132
+ title: string;
133
+ url?: string;
134
+ description?: string;
135
+ image?: string;
136
+ datePublished?: string;
137
+ dateModified?: string;
138
+ authorName?: string;
139
+ authorUrl?: string;
140
+ }
141
+
142
+ export function generateArticleJsonLd(
143
+ options: ArticleJsonLdOptions
144
+ ): WithContext<Article> {
145
+ const {
146
+ title,
147
+ url,
148
+ description,
149
+ image,
150
+ datePublished,
151
+ dateModified,
152
+ authorName,
153
+ authorUrl,
154
+ } = options;
155
+ const resolvedUrl = resolveUrl(url);
156
+ const resolvedImage = resolveUrl(image);
157
+
158
+ return {
159
+ "@context": "https://schema.org",
160
+ "@type": "Article",
161
+ headline: title,
162
+ ...(resolvedUrl && { url: resolvedUrl }),
163
+ ...(description && { description }),
164
+ ...(resolvedImage && { image: resolvedImage }),
165
+ ...(datePublished && { datePublished }),
166
+ ...(dateModified && { dateModified }),
167
+ ...(authorName && {
168
+ author: {
169
+ "@type": "Person",
170
+ name: authorName,
171
+ ...(authorUrl && { url: authorUrl }),
172
+ },
173
+ }),
174
+ };
175
+ }
176
+
177
+ interface BreadcrumbItem {
178
+ name: string;
179
+ url: string;
180
+ }
181
+
182
+ export function generateBreadcrumbJsonLd(
183
+ items: BreadcrumbItem[]
184
+ ): WithContext<BreadcrumbList> {
185
+ return {
186
+ "@context": "https://schema.org",
187
+ "@type": "BreadcrumbList",
188
+ itemListElement: items.map((item, index) => {
189
+ const resolvedItemUrl = resolveUrl(item.url);
190
+
191
+ return {
192
+ "@type": "ListItem",
193
+ position: index + 1,
194
+ name: item.name,
195
+ ...(resolvedItemUrl && { item: resolvedItemUrl }),
196
+ };
197
+ }),
198
+ };
199
+ }
@@ -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,45 +7,36 @@
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
- "@radix-ui/react-navigation-menu": "^1.2.5",
29
24
  "@react-three/drei": "^11.0.0-alpha.4",
30
25
  "@react-three/fiber": "10.0.0-alpha.2",
31
26
  "class-variance-authority": "^0.7.1",
32
- "leva": "^0.9.35",
33
- "next": "16.1.6",
34
- "react": "19.2.4",
35
- "react-dom": "19.2.4",
36
- "react-use": "^17.6.0",
27
+ "clsx": "^2.1.1",
28
+ "next": "^16",
29
+ "react": "^19",
30
+ "react-dom": "^19",
37
31
  "tailwind-merge": "^3.4.0",
38
32
  "three": "^0.182.0",
39
- "zod": "^4.3.6",
40
- "zustand": "^5.0.10"
33
+ "zod": "^4.3.6"
41
34
  },
42
35
  "devDependencies": {
43
36
  "@biomejs/biome": "2.3.14",
44
- "@clack/prompts": "^0.11.0",
45
- "@csstools/postcss-global-data": "^3.1.0",
46
- "@next/bundle-analyzer": "16.1.6",
37
+ "@next/bundle-analyzer": "^16",
47
38
  "@svgr/webpack": "^8.1.0",
48
- "@tailwindcss/postcss": "^4.1.18",
39
+ "@tailwindcss/postcss": "^4",
49
40
  "@types/bun": "^1.3.6",
50
41
  "@types/node": "^20.19.30",
51
42
  "@types/react": "^19.2.9",
@@ -54,10 +45,10 @@
54
45
  "@typescript/native-preview": "^7.0.0-dev.20260122.3",
55
46
  "babel-plugin-react-compiler": "1.0.0",
56
47
  "cross-env": "^10.1.0",
57
- "postcss-functions": "^4.0.2",
58
48
  "postcss-preset-env": "^10.6.1",
59
- "tailwindcss": "^4.1.18",
60
- "typescript": "^5.9.3"
49
+ "schema-dts": "^2.0.0",
50
+ "tailwindcss": "^4",
51
+ "typescript": "^5"
61
52
  },
62
53
  "trustedDependencies": [
63
54
  "@biomejs/biome",