bsmnt 0.1.0 → 0.1.2

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 (102) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/CLAUDE.md +2 -3
  3. package/README.md +1 -2
  4. package/bun.lock +1 -1
  5. package/docs/architecture.drawio +0 -16
  6. package/docs/architecture.mermaid +1 -7
  7. package/package.json +42 -42
  8. package/packages/cli/bin/index.js +0 -4
  9. package/packages/cli/src/commands/add-integration.js +1 -14
  10. package/packages/cli/src/commands/create.js +28 -5
  11. package/packages/create-basement-app/src/mergers/config.js +4 -26
  12. package/packages/create-basement-app/src/mergers/index.js +2 -5
  13. package/packages/create-basement-app/templates/webgl/components/webgl/canvas/index.tsx +3 -8
  14. package/packages/create-basement-app/templates/webgl/components/webgl/components/scene/index.tsx +11 -3
  15. package/packages/create-basement-app/templates/webgl/lib/renderer.ts +7 -0
  16. package/packages/create-basement-app/templates/webgl/package.json +2 -2
  17. package/packages/create-basement-app/integrations/basehub/config.js +0 -21
  18. package/packages/create-basement-app/integrations/basehub/files/README.md +0 -3
  19. package/packages/create-basement-app/templates/webgpu/.biome/plugins/README.md +0 -21
  20. package/packages/create-basement-app/templates/webgpu/.biome/plugins/no-anchor-element.grit +0 -12
  21. package/packages/create-basement-app/templates/webgpu/.biome/plugins/no-relative-parent-imports.grit +0 -10
  22. package/packages/create-basement-app/templates/webgpu/.biome/plugins/no-unnecessary-forwardref.grit +0 -9
  23. package/packages/create-basement-app/templates/webgpu/.cursor/rules/README.md +0 -184
  24. package/packages/create-basement-app/templates/webgpu/.cursor/rules/architecture.mdc +0 -437
  25. package/packages/create-basement-app/templates/webgpu/.cursor/rules/components.mdc +0 -436
  26. package/packages/create-basement-app/templates/webgpu/.cursor/rules/integrations.mdc +0 -447
  27. package/packages/create-basement-app/templates/webgpu/.cursor/rules/main.mdc +0 -278
  28. package/packages/create-basement-app/templates/webgpu/.cursor/rules/styling.mdc +0 -433
  29. package/packages/create-basement-app/templates/webgpu/.editorconfig +0 -40
  30. package/packages/create-basement-app/templates/webgpu/.env.example +0 -81
  31. package/packages/create-basement-app/templates/webgpu/.gitattributes +0 -19
  32. package/packages/create-basement-app/templates/webgpu/.github/PULL_REQUEST_TEMPLATE.md +0 -14
  33. package/packages/create-basement-app/templates/webgpu/.github/workflows/lighthouse-to-slack.yml +0 -136
  34. package/packages/create-basement-app/templates/webgpu/.vscode/extensions.json +0 -20
  35. package/packages/create-basement-app/templates/webgpu/.vscode/settings.json +0 -105
  36. package/packages/create-basement-app/templates/webgpu/README.md +0 -221
  37. package/packages/create-basement-app/templates/webgpu/_gitignore +0 -67
  38. package/packages/create-basement-app/templates/webgpu/app/favicon.ico +0 -0
  39. package/packages/create-basement-app/templates/webgpu/app/layout.tsx +0 -104
  40. package/packages/create-basement-app/templates/webgpu/app/page.tsx +0 -275
  41. package/packages/create-basement-app/templates/webgpu/app/robots.ts +0 -15
  42. package/packages/create-basement-app/templates/webgpu/app/sitemap.ts +0 -16
  43. package/packages/create-basement-app/templates/webgpu/biome.json +0 -250
  44. package/packages/create-basement-app/templates/webgpu/components/basement.svg +0 -1
  45. package/packages/create-basement-app/templates/webgpu/components/layout/footer/index.tsx +0 -27
  46. package/packages/create-basement-app/templates/webgpu/components/layout/header/index.tsx +0 -11
  47. package/packages/create-basement-app/templates/webgpu/components/layout/theme/index.tsx +0 -66
  48. package/packages/create-basement-app/templates/webgpu/components/layout/wrapper/index.tsx +0 -65
  49. package/packages/create-basement-app/templates/webgpu/components/ui/README.md +0 -77
  50. package/packages/create-basement-app/templates/webgpu/components/ui/image/README.md +0 -37
  51. package/packages/create-basement-app/templates/webgpu/components/ui/image/index.tsx +0 -224
  52. package/packages/create-basement-app/templates/webgpu/components/ui/link/index.tsx +0 -146
  53. package/packages/create-basement-app/templates/webgpu/lib/README.md +0 -33
  54. package/packages/create-basement-app/templates/webgpu/lib/hooks/index.ts +0 -12
  55. package/packages/create-basement-app/templates/webgpu/lib/hooks/use-device-detection.ts +0 -81
  56. package/packages/create-basement-app/templates/webgpu/lib/hooks/use-media-breakpoint.ts +0 -15
  57. package/packages/create-basement-app/templates/webgpu/lib/hooks/use-prefetch.ts +0 -74
  58. package/packages/create-basement-app/templates/webgpu/lib/integrations/.gitkeep +0 -0
  59. package/packages/create-basement-app/templates/webgpu/lib/scripts/dev.ts +0 -52
  60. package/packages/create-basement-app/templates/webgpu/lib/scripts/generate-component.ts +0 -322
  61. package/packages/create-basement-app/templates/webgpu/lib/scripts/generate-page.ts +0 -193
  62. package/packages/create-basement-app/templates/webgpu/lib/scripts/generate.ts +0 -79
  63. package/packages/create-basement-app/templates/webgpu/lib/scripts/utils.ts +0 -246
  64. package/packages/create-basement-app/templates/webgpu/lib/store/app.ts +0 -11
  65. package/packages/create-basement-app/templates/webgpu/lib/store/index.ts +0 -11
  66. package/packages/create-basement-app/templates/webgpu/lib/styles/README.md +0 -64
  67. package/packages/create-basement-app/templates/webgpu/lib/styles/cn.ts +0 -7
  68. package/packages/create-basement-app/templates/webgpu/lib/styles/colors.ts +0 -63
  69. package/packages/create-basement-app/templates/webgpu/lib/styles/config.ts +0 -34
  70. package/packages/create-basement-app/templates/webgpu/lib/styles/css/global.css +0 -85
  71. package/packages/create-basement-app/templates/webgpu/lib/styles/css/index.css +0 -6
  72. package/packages/create-basement-app/templates/webgpu/lib/styles/css/reset.css +0 -166
  73. package/packages/create-basement-app/templates/webgpu/lib/styles/css/root.css +0 -68
  74. package/packages/create-basement-app/templates/webgpu/lib/styles/css/tailwind.css +0 -132
  75. package/packages/create-basement-app/templates/webgpu/lib/styles/easings.ts +0 -21
  76. package/packages/create-basement-app/templates/webgpu/lib/styles/fonts.ts +0 -28
  77. package/packages/create-basement-app/templates/webgpu/lib/styles/index.ts +0 -12
  78. package/packages/create-basement-app/templates/webgpu/lib/styles/layout.mjs +0 -27
  79. package/packages/create-basement-app/templates/webgpu/lib/styles/scripts/README.md +0 -29
  80. package/packages/create-basement-app/templates/webgpu/lib/styles/scripts/generate-root.ts +0 -57
  81. package/packages/create-basement-app/templates/webgpu/lib/styles/scripts/generate-tailwind.ts +0 -162
  82. package/packages/create-basement-app/templates/webgpu/lib/styles/scripts/postcss-functions.mjs +0 -168
  83. package/packages/create-basement-app/templates/webgpu/lib/styles/scripts/setup-styles.ts +0 -24
  84. package/packages/create-basement-app/templates/webgpu/lib/styles/scripts/utils.ts +0 -20
  85. package/packages/create-basement-app/templates/webgpu/lib/styles/typography.ts +0 -36
  86. package/packages/create-basement-app/templates/webgpu/lib/utils/README.md +0 -40
  87. package/packages/create-basement-app/templates/webgpu/lib/utils/css.d.ts +0 -21
  88. package/packages/create-basement-app/templates/webgpu/lib/utils/easings.ts +0 -240
  89. package/packages/create-basement-app/templates/webgpu/lib/utils/fetch.ts +0 -84
  90. package/packages/create-basement-app/templates/webgpu/lib/utils/math.test.ts +0 -221
  91. package/packages/create-basement-app/templates/webgpu/lib/utils/math.ts +0 -236
  92. package/packages/create-basement-app/templates/webgpu/lib/utils/metadata.ts +0 -126
  93. package/packages/create-basement-app/templates/webgpu/lib/utils/strings.test.ts +0 -166
  94. package/packages/create-basement-app/templates/webgpu/lib/utils/strings.ts +0 -246
  95. package/packages/create-basement-app/templates/webgpu/lib/utils/types.d.ts +0 -15
  96. package/packages/create-basement-app/templates/webgpu/lib/utils/viewport.test.ts +0 -256
  97. package/packages/create-basement-app/templates/webgpu/lib/utils/viewport.ts +0 -193
  98. package/packages/create-basement-app/templates/webgpu/next.config.ts +0 -142
  99. package/packages/create-basement-app/templates/webgpu/package.json +0 -69
  100. package/packages/create-basement-app/templates/webgpu/postcss.config.mjs +0 -42
  101. package/packages/create-basement-app/templates/webgpu/public/fonts/geist/Geist-Mono.woff2 +0 -0
  102. package/packages/create-basement-app/templates/webgpu/tsconfig.json +0 -43
@@ -1,250 +0,0 @@
1
- {
2
- "root": false,
3
- "$schema": "node_modules/@biomejs/biome/configuration_schema.json",
4
- "assist": {
5
- "actions": {
6
- "source": {
7
- "organizeImports": "on"
8
- }
9
- }
10
- },
11
- "css": {
12
- "formatter": {
13
- "enabled": true
14
- },
15
- "linter": {
16
- "enabled": true
17
- },
18
- "parser": {
19
- "cssModules": true,
20
- "tailwindDirectives": true
21
- }
22
- },
23
- "files": {
24
- "ignoreUnknown": true,
25
- "includes": [
26
- "**",
27
- "!node_modules",
28
- "!**/.next",
29
- "!**/dist",
30
- "!**/public",
31
- "!.github",
32
- "!.vercel",
33
- "!pnpm-lock.yaml",
34
- "!bun.lock",
35
- "!**/*.md",
36
- "!**/*.mdx",
37
- "!**/tailwind.css",
38
- "!**/root.css",
39
- "!**/*.grit"
40
- ]
41
- },
42
- "formatter": {
43
- "enabled": true,
44
- "indentStyle": "space",
45
- "indentWidth": 2,
46
- "lineEnding": "lf",
47
- "lineWidth": 80
48
- },
49
- "javascript": {
50
- "formatter": {
51
- "enabled": true,
52
- "quoteStyle": "double",
53
- "semicolons": "asNeeded",
54
- "trailingCommas": "es5"
55
- }
56
- },
57
- "json": {
58
- "parser": {
59
- "allowComments": true
60
- }
61
- },
62
- "linter": {
63
- "domains": {
64
- "next": "recommended",
65
- "react": "recommended"
66
- },
67
- "enabled": true,
68
- "rules": {
69
- "a11y": {
70
- "noAriaUnsupportedElements": "error",
71
- "noAutofocus": "warn",
72
- "noDistractingElements": "error",
73
- "noRedundantAlt": "error",
74
- "useAltText": "error",
75
- "useButtonType": "error",
76
- "useKeyWithClickEvents": "warn",
77
- "useSemanticElements": "warn",
78
- "useValidAnchor": "warn",
79
- "useValidAriaProps": "error",
80
- "useValidAriaRole": "error",
81
- "useValidAriaValues": "error"
82
- },
83
- "complexity": {
84
- "noForEach": "off",
85
- "useFlatMap": "warn",
86
- "useSimplifiedLogicExpression": "warn"
87
- },
88
- "correctness": {
89
- "noInvalidUseBeforeDeclaration": "error",
90
- "noUnknownMediaFeatureName": "off",
91
- "noUnusedFunctionParameters": "warn",
92
- "noUnusedImports": "error",
93
- "noUnusedVariables": "error",
94
- "useExhaustiveDependencies": "warn"
95
- },
96
- "nursery": {
97
- "useSortedClasses": {
98
- "level": "warn",
99
- "options": {
100
- "attributes": ["class", "className"],
101
- "functions": ["cn", "cva"]
102
- }
103
- }
104
- },
105
- "performance": {
106
- "noImgElement": "error"
107
- },
108
- "recommended": true,
109
- "security": {
110
- "noDangerouslySetInnerHtml": "warn",
111
- "noDangerouslySetInnerHtmlWithChildren": "error",
112
- "noGlobalEval": "error"
113
- },
114
- "style": {
115
- "noInferrableTypes": "error",
116
- "noNestedTernary": "error",
117
- "noNonNullAssertion": "off",
118
- "noParameterAssign": "error",
119
- "noUnusedTemplateLiteral": "off",
120
- "noUselessElse": "error",
121
- "useAsConstAssertion": "error",
122
- "useCollapsedElseIf": "warn",
123
- "useConsistentArrayType": "error",
124
- "useConsistentBuiltinInstantiation": "error",
125
- "useDefaultParameterLast": "error",
126
- "useEnumInitializers": "error",
127
- "useExponentiationOperator": "error",
128
- "useFilenamingConvention": {
129
- "level": "warn",
130
- "options": {
131
- "filenameCases": ["kebab-case", "camelCase"],
132
- "strictCase": false
133
- }
134
- },
135
- "useForOf": "warn",
136
- "useNumberNamespace": "error",
137
- "useSelfClosingElements": "error",
138
- "useShorthandAssign": "error",
139
- "useSingleVarDeclarator": "error",
140
- "useTemplate": "warn"
141
- },
142
- "suspicious": {
143
- "noDebugger": "warn",
144
- "noDoubleEquals": "error",
145
- "noEmptyBlockStatements": "warn",
146
- "noExplicitAny": "error",
147
- "noGlobalIsFinite": "error",
148
- "noGlobalIsNan": "error",
149
- "noMisleadingCharacterClass": "error",
150
- "noPrototypeBuiltins": "warn",
151
- "noSelfCompare": "error",
152
- "noSparseArray": "error",
153
- "useAwait": "off"
154
- }
155
- }
156
- },
157
- "overrides": [
158
- {
159
- "includes": ["**/*.css"],
160
- "linter": {
161
- "rules": {
162
- "correctness": {
163
- "noUnknownFunction": "off"
164
- }
165
- }
166
- }
167
- },
168
- {
169
- "includes": ["**/*.tsx", "**/*.jsx"],
170
- "linter": {
171
- "rules": {
172
- "a11y": {
173
- "useKeyWithClickEvents": "error",
174
- "useKeyWithMouseEvents": "error",
175
- "useValidAnchor": "error"
176
- },
177
- "correctness": {
178
- "useJsxKeyInIterable": "error"
179
- }
180
- }
181
- }
182
- },
183
- {
184
- "includes": ["**/*.ts", "**/*.tsx"],
185
- "linter": {
186
- "rules": {
187
- "correctness": {
188
- "noUndeclaredVariables": "off"
189
- },
190
- "style": {
191
- "useConsistentArrayType": "error",
192
- "useExportType": "error",
193
- "useImportType": "error"
194
- }
195
- }
196
- }
197
- },
198
- {
199
- "includes": [
200
- "app/**/*.tsx",
201
- "app/**/*.ts",
202
- "app/**/*.jsx",
203
- "app/**/*.js"
204
- ],
205
- "linter": {
206
- "rules": {
207
- "style": {
208
- "noDefaultExport": "off"
209
- },
210
- "suspicious": {
211
- "useAwait": "off"
212
- }
213
- }
214
- }
215
- },
216
- {
217
- "includes": ["**/*.module.css"],
218
- "linter": {
219
- "rules": {
220
- "correctness": {
221
- "noUnknownProperty": "off"
222
- },
223
- "style": {
224
- "noDescendingSpecificity": "off"
225
- }
226
- }
227
- }
228
- },
229
- {
230
- "includes": ["lib/styles/css/root.css"],
231
- "linter": {
232
- "rules": {
233
- "suspicious": {
234
- "noDuplicateCustomProperties": "off"
235
- }
236
- }
237
- }
238
- }
239
- ],
240
- "plugins": [
241
- "./.biome/plugins/no-anchor-element.grit",
242
- "./.biome/plugins/no-unnecessary-forwardref.grit",
243
- "./.biome/plugins/no-relative-parent-imports.grit"
244
- ],
245
- "vcs": {
246
- "clientKind": "git",
247
- "enabled": true,
248
- "useIgnoreFile": true
249
- }
250
- }
@@ -1 +0,0 @@
1
- <svg width="123" height="18" viewBox="0 0 123 18" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M4.43626 6.76458V.252441H.381348V17.1671H4.33011v-3.0447c.40337 2.1989 1.78331 3.2984 4.13983 3.2984 3.96996 0 4.86166-.9515 4.86166-5.6664V9.91493c0-4.7361-.8704-5.66641-4.64937-5.66641-2.54758 0-3.77892.54973-4.24597 2.51606Zm.02123 5.94122V9.42863c.10615-1.14174.84919-1.69146 2.29282-1.69146 1.95315 0 2.31406.42286 2.31406 2.30463v1.628c0 1.8395-.36091 2.2623-2.31406 2.2623-1.4224 0-2.16544-.4228-2.29282-1.2263Zm10.23281.8035c0 3.4252.7643 4.0384 4.9253 3.9115 1.9956-.0211 3.418-.8035 3.97-2.4949v2.2412h4.0337V8.62519c0-3.70008-.8917-4.37667-5.6259-4.37667h-.9766c-4.9678 0-5.9019.65544-5.9019 4.14409v.50744h4.0337c-.0425-1.45889.3184-1.71261 2.314-1.71261 1.7833 0 2.123.25372 2.123 1.71261v.71887l-4.0337.02114c-4.0973 0-4.8616.61314-4.8616 3.86924Zm4.246.0423c0-.7823.2123-.9303 1.3162-.9303l3.3331-.0212v.5497c0 .9938-.6793 1.3744-2.4627 1.4166h-.2122c-1.656 0-1.9744-.1691-1.9744-1.0148Zm10.0417-.3383c0 3.5309.8917 4.2075 5.5622 4.2075h.9766c5.3499 0 6.3265-.592 6.3265-3.6367 0-1.9451-.4883-3.108-2.5051-3.7-1.104-.31718-2.0805-.5709-4.1611-.90919-1.3799-.21143-1.762-.46515-1.762-.99373 0-.78231.4246-.99374 1.9956-.99374 1.6347 0 2.0805.29601 2.0805 1.33203v.38058h4.0337v-.38058c0-3.61551-.8917-4.27095-5.6259-4.27095h-.9766c-4.8192 0-5.7533.57087-5.7533 3.8058 0 1.69146.4458 2.64288 2.1867 3.31948 1.2738.4863 3.2057.7823 3.9487.9303 1.8682.3383 2.3141.6766 2.3141 1.184 0 .7612-.4883.9726-2.3141.9726-1.9744 0-2.5051-.2748-2.5051-1.2474v-.2749H28.978v.2749Zm14.0967-2.3681c0 5.5396.9765 6.5756 6.1779 6.5756h.9765c5.1589 0 6.1142-.6766 6.1142-4.271h-4.2459c0 1.0784-.3609 1.3109-2.3353 1.3109-2.0593 0-2.4415-.3594-2.4415-2.1989v-.0634h9.1289v-1.9875c0-5.03207-.9766-5.96238-6.2204-5.96238h-.9765c-5.2014 0-6.1779 1.01488-6.1779 6.59668Zm4.2459-1.628v-.06343c0-1.64918.3822-1.96633 2.4415-1.96633 1.9956 0 2.4202.31715 2.4414 2.02976h-4.8829Zm10.9122 7.9499h4.0337V9.83035c0-1.48003.7006-2.22004 2.1017-2.22004 1.6135 0 1.932.31715 1.932 1.96632v7.59047h4.0124l-.0212-7.46361c.0424-1.39546.743-2.09318 2.1017-2.09318 1.6135 0 1.8895.31715 1.8895 1.96632v7.59047h4.0337l-.0212-8.20362c0-3.97494-.7219-4.71496-4.6069-4.71496-2.1443 0-3.4393.90916-3.9063 2.91778-.1699-2.41034-.8705-2.91778-4.0974-2.91778-1.8895 0-2.9722.76116-3.418 2.66406V4.50224h-4.0337V17.1671Zm21.6545-6.3219c0 5.5396.9766 6.5756 6.1991 6.5756h.9766c5.1164 0 6.0717-.6766 6.0717-4.271H88.91c0 1.0784-.3609 1.3109-2.3141 1.3109-2.1017 0-2.4839-.3594-2.4839-2.1989v-.0634h9.1289v-1.9875c0-5.03207-.9766-5.96238-6.1779-5.96238h-.9766c-5.2225 0-6.1991 1.01488-6.1991 6.59668Zm4.2247-1.628v-.06343c0-1.64918.3822-1.96633 2.4839-1.96633 1.9744 0 2.399.31715 2.4202 2.02976H84.112Zm10.891 7.9499h4.0337V9.61892c.0212-1.35317.7642-2.00861 2.2293-2.00861 1.868 0 2.208.35943 2.208 2.30462v7.25217h4.033l-.021-8.20362c0-3.97494-.7-4.71496-4.394-4.71496-2.336 0-3.5671.76116-4.0553 2.81206V4.50224H95.003V17.1671Zm13.545-9.30307h1.252v5.05327c0 3.5732.828 4.2498 5.095 4.2498h2.76v-3.5944h-2.335c-1.253 0-1.486-.2114-1.486-1.2686V7.86403h3.63V4.50224h-3.63V1.77476h-3.821v2.72748h-1.465v3.36179Zm10.636 9.30307h3.63v-3.5944h-3.63v3.5944Z" fill="#EFEFEF"/></svg>
@@ -1,27 +0,0 @@
1
- import Logo from "@/components/basement.svg"
2
- import { Link } from "@/components/ui/link"
3
-
4
- export function Footer() {
5
- return (
6
- <footer className="flex flex-col items-center justify-between p-safe font-mono uppercase 2xl:flex-row 2xl:items-end">
7
- <Link href="https://basement.studio/" className="link">
8
- <Logo className="w-148 text-secondary" />
9
- </Link>
10
- <div>
11
- <Link
12
- href="https://github.com/basementstudio/next-starter/generate"
13
- className="link"
14
- >
15
- use this template
16
- </Link>
17
- {" / "}
18
- <Link
19
- href="https://github.com/basementstudio/next-starter"
20
- className="link"
21
- >
22
- github
23
- </Link>
24
- </div>
25
- </footer>
26
- )
27
- }
@@ -1,11 +0,0 @@
1
- "use client"
2
-
3
- export function Header() {
4
- return (
5
- <nav className="sticky top-0 z-2 flex flex-col font-mono uppercase">
6
- <div className="inline-flex px-safe py-safe">
7
- <h1>Basement Next Starter</h1>
8
- </div>
9
- </nav>
10
- )
11
- }
@@ -1,66 +0,0 @@
1
- "use client"
2
-
3
- import { usePathname } from "next/navigation"
4
- import { createContext, useContext, useEffect, useState } from "react"
5
- import type { Themes } from "@/lib/styles/colors"
6
- import { type ThemeName, themes } from "@/lib/styles/config"
7
-
8
- export const ThemeContext = createContext<{
9
- name: ThemeName
10
- theme: Themes[ThemeName]
11
- setThemeName: (theme: ThemeName) => void
12
- }>({
13
- name: "light",
14
- theme: themes.light,
15
- setThemeName: () => {
16
- void 0
17
- },
18
- })
19
-
20
- export function useTheme() {
21
- return useContext(ThemeContext)
22
- }
23
-
24
- export function Theme({
25
- children,
26
- theme,
27
- global,
28
- }: {
29
- children: React.ReactNode
30
- theme: ThemeName
31
- global?: boolean
32
- }) {
33
- const pathname = usePathname()
34
-
35
- const [currentTheme, setCurrentTheme] = useState(theme)
36
-
37
- useEffect(() => {
38
- setCurrentTheme(theme)
39
- }, [theme])
40
-
41
- // biome-ignore lint/correctness/useExhaustiveDependencies: we need to trigger on path change
42
- useEffect(() => {
43
- if (global) {
44
- document.documentElement.setAttribute("data-theme", currentTheme)
45
- }
46
- }, [pathname, currentTheme, global])
47
-
48
- return (
49
- <>
50
- {global && (
51
- <script>
52
- {`document.documentElement.setAttribute('data-theme', '${currentTheme}');`}
53
- </script>
54
- )}
55
- <ThemeContext.Provider
56
- value={{
57
- name: currentTheme,
58
- theme: themes[currentTheme],
59
- setThemeName: setCurrentTheme,
60
- }}
61
- >
62
- {children}
63
- </ThemeContext.Provider>
64
- </>
65
- )
66
- }
@@ -1,65 +0,0 @@
1
- /**
2
- * Main page wrapper providing theme, smooth scrolling, and WebGL context.
3
- *
4
- * Customize the Header and Footer components for your project needs.
5
- */
6
- "use client"
7
-
8
- import cn from "clsx"
9
- import { Footer } from "@/components/layout/footer"
10
- import { Header } from "@/components/layout/header"
11
- import { Theme } from "@/components/layout/theme"
12
- import type { ThemeName } from "@/lib/styles/config"
13
-
14
- /**
15
- * Props for the Wrapper component.
16
- */
17
- interface WrapperProps extends React.HTMLAttributes<HTMLDivElement> {
18
- /** Theme to apply ('dark' | 'light'). Defaults to 'dark'. */
19
- theme?: ThemeName
20
- }
21
-
22
- /**
23
- * Main page wrapper component providing theme.
24
- *
25
- * This component serves as the root container for pages, automatically handling
26
- * theme application and layout structure.
27
- * It includes navigation and footer.
28
- *
29
- * @param props - Component props
30
- * @param props.theme - Color theme to apply to the page
31
- * @param props.children - Page content
32
- * @param props.className - Additional CSS classes
33
- *
34
- * @example
35
- * ```tsx
36
- * // Basic usage with theme
37
- * export default function Page() {
38
- * return (
39
- * <Wrapper theme="dark">
40
- * <section>My page content</section>
41
- * </Wrapper>
42
- * )
43
- * }
44
- * ```
45
- */
46
- export function Wrapper({
47
- children,
48
- theme = "dark",
49
- className,
50
- ...props
51
- }: WrapperProps) {
52
- return (
53
- <Theme theme={theme} global>
54
- <Header />
55
- <main
56
- id="main-content"
57
- className={cn("relative flex grow flex-col", className)}
58
- {...props}
59
- >
60
- {children}
61
- </main>
62
- <Footer />
63
- </Theme>
64
- )
65
- }
@@ -1,77 +0,0 @@
1
- # Components
2
-
3
- UI components organized by purpose.
4
-
5
- ```
6
- components/
7
- ├── ui/ → Primitives (reusable across projects)
8
- ├── layout/ → Site chrome (customize per project)
9
- └── magic/ → Animation & visual enhancements
10
- ```
11
-
12
- ## Direct Imports (Recommended)
13
-
14
- ```tsx
15
- // UI Components - import directly for better clarity
16
- import { Image } from '@/components/ui/image'
17
- import { Link } from '@/components/ui/link'
18
-
19
- // Layout Components
20
- import { Wrapper } from '@/components/layout/wrapper'
21
- import { Header } from '@/components/layout/header'
22
- import { Footer } from '@/components/layout/footer'
23
-
24
- // Magic Components
25
- import { Marquee } from '@/components/magic/marquee'
26
- ```
27
-
28
- ## UI Components
29
-
30
- | Component | Purpose |
31
- |-----------|---------|
32
- | `image/` | Optimized images (always use this, never `next/image`) |
33
- | `link/` | Smart navigation (auto-detects external) |
34
-
35
- ## Layout Components
36
-
37
- | Component | Purpose |
38
- |-----------|---------|
39
- | `wrapper/` | Page wrapper (theme, WebGL, Lenis) |
40
- | `header/` | Site header/navigation |
41
- | `footer/` | Site footer |
42
- | `lenis/` | Smooth scrolling |
43
-
44
- ```tsx
45
- <Wrapper theme="dark" webgl lenis>
46
- <section>Your content</section>
47
- </Wrapper>
48
- ```
49
-
50
- ## Effects Components
51
-
52
- | Component | Purpose |
53
- |-----------|---------|
54
- | `marquee/` | Infinite scrolling text |
55
-
56
- ## Best Practices
57
-
58
- ```tsx
59
- // ✅ Always use custom Image
60
- import { Image } from '@/components/ui/image'
61
- <Image src="/photo.jpg" alt="Photo" aspectRatio={16/9} />
62
-
63
- // ✅ Always use custom Link
64
- import { Link } from '@/components/ui/link'
65
- <Link href="/about">Internal</Link>
66
- <Link href="https://example.com">External</Link>
67
-
68
- // ✅ CSS Modules + Tailwind
69
- import s from './component.module.css'
70
- <div className={cn(s.wrapper, 'flex items-center')} />
71
- ```
72
-
73
- ## Related
74
-
75
- - [Image docs](ui/image/README.md)
76
- - [Real Viewport docs](ui/real-viewport/README.md)
77
- - [WebGL Components](../lib/webgl/README.md)
@@ -1,37 +0,0 @@
1
- # Image Component
2
-
3
- Optimized images with smart loading, blur placeholders, and responsive sizing.
4
-
5
- ## Usage
6
-
7
- ```tsx
8
- import { Image } from '@/components/ui/image'
9
-
10
- // Basic
11
- <Image src="/hero.jpg" alt="Hero" aspectRatio={16/9} />
12
-
13
- // Priority (LCP images)
14
- <Image src="/hero.jpg" alt="Hero" aspectRatio={16/9} priority />
15
-
16
- // Responsive
17
- <Image
18
- src="/product.jpg"
19
- alt="Product"
20
- mobileSize="100vw"
21
- desktopSize="33vw"
22
- />
23
- ```
24
-
25
- ## Props
26
-
27
- | Prop | Description |
28
- |------|-------------|
29
- | `aspectRatio` | Prevents layout shift, enables blur placeholder |
30
- | `priority` | Eager loading for above-the-fold images |
31
- | `mobileSize` / `desktopSize` | Responsive sizing |
32
-
33
- ## Best Practices
34
-
35
- - Always provide `aspectRatio` (prevents CLS)
36
- - Use `priority` for LCP images
37
- - Never use `next/image` directly