bsmnt 0.9.0 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/application/add-integration/index.d.ts.map +1 -1
- package/dist/application/add-integration/index.js +19 -2
- package/dist/application/add-integration/index.js.map +1 -1
- package/dist/infrastructure/integrations/ensure-studio-headers.d.ts +6 -0
- package/dist/infrastructure/integrations/ensure-studio-headers.d.ts.map +1 -0
- package/dist/infrastructure/integrations/ensure-studio-headers.js +153 -0
- package/dist/infrastructure/integrations/ensure-studio-headers.js.map +1 -0
- package/dist/modules/features/cms/sanity/config.d.ts.map +1 -1
- package/dist/modules/features/cms/sanity/config.js +2 -1
- package/dist/modules/features/cms/sanity/config.js.map +1 -1
- package/dist/modules/features/cms/sanity-pagebuilder/config.d.ts.map +1 -1
- package/dist/modules/features/cms/sanity-pagebuilder/config.js +2 -1
- package/dist/modules/features/cms/sanity-pagebuilder/config.js.map +1 -1
- package/package.json +2 -2
- package/src/modules/features/cms/sanity/files/app/api/blog/[slug]/route.ts +4 -1
- package/src/modules/features/cms/sanity/files/app/sitemap.md/route.ts +2 -1
- package/src/modules/features/cms/sanity/files/components/ui/sanity-image/index.tsx +19 -5
- package/src/modules/features/cms/sanity/files/lib/integrations/sanity/README.md +31 -0
- package/src/modules/features/cms/sanity/files/proxy.ts +9 -0
- package/src/modules/features/cms/sanity-pagebuilder/files/app/api/[[...slug]]/route.ts +8 -3
- package/src/modules/features/cms/sanity-pagebuilder/files/app/sitemap.md/route.ts +7 -1
- package/src/modules/features/cms/sanity-pagebuilder/files/components/ui/sanity-image/index.tsx +15 -5
- package/src/modules/features/cms/sanity-pagebuilder/files/lib/integrations/sanity/components/slug-field.tsx +13 -7
- package/src/modules/features/cms/sanity-pagebuilder/files/lib/integrations/sanity/components/slug-notices.tsx +135 -0
- package/src/modules/features/cms/sanity-pagebuilder/files/lib/integrations/sanity/live/index.tsx +1 -1
- package/src/modules/features/cms/sanity-pagebuilder/files/lib/integrations/sanity/markdown-proxy.config.ts +1 -1
- package/src/modules/features/cms/sanity-pagebuilder/files/lib/integrations/sanity/schemas/layout/redirect.ts +35 -4
- package/src/modules/features/cms/sanity-pagebuilder/files/proxy.ts +9 -0
- package/src/templates/next-default/.env.example +2 -0
- package/src/templates/next-default/app/robots.ts +2 -3
- package/src/templates/next-default/next.config.ts +36 -2
- package/src/templates/next-default/package.json +9 -9
- package/src/templates/next-experiments/.env.example +2 -0
- package/src/templates/next-experiments/app/robots.ts +2 -3
- package/src/templates/next-experiments/next.config.ts +36 -2
- package/src/templates/next-experiments/package.json +9 -9
- package/src/templates/next-pagebuilder/.env.example +2 -0
- package/src/templates/next-pagebuilder/README.md +31 -0
- package/src/templates/next-pagebuilder/app/(content)/[[...slug]]/page.tsx +24 -9
- package/src/templates/next-pagebuilder/app/robots.ts +2 -3
- package/src/templates/next-pagebuilder/app/sitemap.xml/route.ts +6 -3
- package/src/templates/next-pagebuilder/components/page-builder/components/content-collection/skeleton.tsx +53 -0
- package/src/templates/next-pagebuilder/components/page-builder/renderer.tsx +7 -1
- package/src/templates/next-pagebuilder/next.config.ts +33 -2
- package/src/templates/next-pagebuilder/package.json +4 -4
- package/src/templates/next-webgl/.env.example +2 -0
- package/src/templates/next-webgl/app/robots.ts +2 -3
- package/src/templates/next-webgl/next.config.ts +36 -2
- package/src/templates/next-webgl/package.json +9 -9
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
const FEATURED_PLACEHOLDERS = ["featured-1", "featured-2"]
|
|
2
|
+
const CARD_PLACEHOLDERS = [
|
|
3
|
+
"card-1",
|
|
4
|
+
"card-2",
|
|
5
|
+
"card-3",
|
|
6
|
+
"card-4",
|
|
7
|
+
"card-5",
|
|
8
|
+
"card-6",
|
|
9
|
+
]
|
|
10
|
+
const CHIP_PLACEHOLDERS = ["chip-1", "chip-2", "chip-3", "chip-4"]
|
|
11
|
+
|
|
12
|
+
function CardPlaceholder() {
|
|
13
|
+
return (
|
|
14
|
+
<li className="flex flex-col gap-3">
|
|
15
|
+
<div className="aspect-16/9 w-full rounded-lg bg-black/10" />
|
|
16
|
+
<div className="flex flex-col gap-2">
|
|
17
|
+
<div className="h-3 w-16 rounded bg-black/10" />
|
|
18
|
+
<div className="h-5 w-4/5 rounded bg-black/10" />
|
|
19
|
+
<div className="h-4 w-1/2 rounded bg-black/10" />
|
|
20
|
+
</div>
|
|
21
|
+
</li>
|
|
22
|
+
)
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export function ContentCollectionSkeleton() {
|
|
26
|
+
return (
|
|
27
|
+
<section
|
|
28
|
+
className="flex animate-pulse flex-col gap-8 py-8"
|
|
29
|
+
aria-hidden="true"
|
|
30
|
+
>
|
|
31
|
+
<div className="flex flex-col gap-4 rounded-[1.5rem] border border-black/10 bg-black/[0.02] p-4 sm:p-5">
|
|
32
|
+
<div className="flex flex-wrap gap-2">
|
|
33
|
+
{CHIP_PLACEHOLDERS.map((key) => (
|
|
34
|
+
<div className="h-9 w-28 rounded-full bg-black/10" key={key} />
|
|
35
|
+
))}
|
|
36
|
+
</div>
|
|
37
|
+
<div className="h-4 w-40 rounded bg-black/10" />
|
|
38
|
+
</div>
|
|
39
|
+
|
|
40
|
+
<ul className="grid grid-cols-1 gap-8 md:grid-cols-2">
|
|
41
|
+
{FEATURED_PLACEHOLDERS.map((key) => (
|
|
42
|
+
<CardPlaceholder key={key} />
|
|
43
|
+
))}
|
|
44
|
+
</ul>
|
|
45
|
+
|
|
46
|
+
<ul className="grid grid-cols-2 gap-8 md:grid-cols-2 lg:grid-cols-3">
|
|
47
|
+
{CARD_PLACEHOLDERS.map((key) => (
|
|
48
|
+
<CardPlaceholder key={key} />
|
|
49
|
+
))}
|
|
50
|
+
</ul>
|
|
51
|
+
</section>
|
|
52
|
+
)
|
|
53
|
+
}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
+
import { Suspense } from "react"
|
|
1
2
|
import { ArticleContent } from "./components/article-content"
|
|
2
3
|
import { ContentCollection } from "./components/content-collection"
|
|
4
|
+
import { ContentCollectionSkeleton } from "./components/content-collection/skeleton"
|
|
3
5
|
import type { ContentCollectionSearchParams } from "./components/content-collection/types"
|
|
4
6
|
import { Description } from "./components/description"
|
|
5
7
|
import { GatedContent } from "./components/gated-content"
|
|
@@ -36,7 +38,11 @@ function PageBuilderNode({
|
|
|
36
38
|
}) {
|
|
37
39
|
switch (block._type) {
|
|
38
40
|
case "blogCollection":
|
|
39
|
-
return
|
|
41
|
+
return (
|
|
42
|
+
<Suspense fallback={<ContentCollectionSkeleton />}>
|
|
43
|
+
<ContentCollection block={block} searchParams={searchParams} />
|
|
44
|
+
</Suspense>
|
|
45
|
+
)
|
|
40
46
|
case "blogContent":
|
|
41
47
|
return <ArticleContent block={block} />
|
|
42
48
|
case "hero":
|
|
@@ -68,7 +68,6 @@ const nextConfig: NextConfig = {
|
|
|
68
68
|
browserToTerminal: true,
|
|
69
69
|
},
|
|
70
70
|
experimental: {
|
|
71
|
-
prefetchInlining: true,
|
|
72
71
|
optimizePackageImports: [
|
|
73
72
|
"@react-three/drei",
|
|
74
73
|
"@react-three/fiber",
|
|
@@ -94,7 +93,8 @@ const nextConfig: NextConfig = {
|
|
|
94
93
|
},
|
|
95
94
|
headers: async () => [
|
|
96
95
|
{
|
|
97
|
-
|
|
96
|
+
// Excludes /studio* — must stay mutually exclusive with the rule below.
|
|
97
|
+
source: "/((?!studio(?:/|$)).*)",
|
|
98
98
|
headers: [
|
|
99
99
|
{
|
|
100
100
|
key: "X-Content-Type-Options",
|
|
@@ -126,6 +126,37 @@ const nextConfig: NextConfig = {
|
|
|
126
126
|
},
|
|
127
127
|
],
|
|
128
128
|
},
|
|
129
|
+
{
|
|
130
|
+
// X-Frame-Options can't allow a third-party origin, and Next can't unset
|
|
131
|
+
// it from another rule — the iframe needs it absent, not overridden.
|
|
132
|
+
source: "/studio/:path*",
|
|
133
|
+
headers: [
|
|
134
|
+
{
|
|
135
|
+
key: "X-Content-Type-Options",
|
|
136
|
+
value: "nosniff",
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
key: "Content-Security-Policy",
|
|
140
|
+
value: "frame-ancestors 'self' https://*.sanity.io;",
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
key: "X-XSS-Protection",
|
|
144
|
+
value: "1; mode=block",
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
key: "X-DNS-Prefetch-Control",
|
|
148
|
+
value: "on",
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
key: "Strict-Transport-Security",
|
|
152
|
+
value: "max-age=63072000; includeSubDomains; preload",
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
key: "Permissions-Policy",
|
|
156
|
+
value: "camera=(), microphone=(), geolocation=()",
|
|
157
|
+
},
|
|
158
|
+
],
|
|
159
|
+
},
|
|
129
160
|
],
|
|
130
161
|
}
|
|
131
162
|
|
|
@@ -28,9 +28,9 @@
|
|
|
28
28
|
},
|
|
29
29
|
"dependencies": {
|
|
30
30
|
"class-variance-authority": "^0.7.1",
|
|
31
|
-
"next": "^16",
|
|
32
|
-
"react": "^19",
|
|
33
|
-
"react-dom": "^19",
|
|
31
|
+
"next": "^16.3.0",
|
|
32
|
+
"react": "^19.2.8",
|
|
33
|
+
"react-dom": "^19.2.8",
|
|
34
34
|
"react-use": "^17.6.0",
|
|
35
35
|
"tailwind-merge": "^3.5.0",
|
|
36
36
|
"zod": "^4.3.6"
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
"devDependencies": {
|
|
39
39
|
"@biomejs/biome": "^2.4.14",
|
|
40
40
|
"@csstools/postcss-global-data": "^4.0.0",
|
|
41
|
-
"@next/bundle-analyzer": "^16.
|
|
41
|
+
"@next/bundle-analyzer": "^16.3.0",
|
|
42
42
|
"@svgr/webpack": "^8.1.0",
|
|
43
43
|
"@tailwindcss/postcss": "^4.2.2",
|
|
44
44
|
"@types/bun": "^1.3.11",
|
|
@@ -32,6 +32,8 @@
|
|
|
32
32
|
# Base URL for your site (used for SEO, canonical URLs, etc.)
|
|
33
33
|
# Development: http://localhost:3000
|
|
34
34
|
# Production: https://your-domain.com
|
|
35
|
+
# Inlined at build time — scope this to the Production environment only in
|
|
36
|
+
# Vercel so Preview deployments fall through to VERCEL_PROJECT_PRODUCTION_URL.
|
|
35
37
|
NEXT_PUBLIC_BASE_URL=""
|
|
36
38
|
|
|
37
39
|
# Draft mode secret for preview functionality
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import type { MetadataRoute } from "next"
|
|
2
|
-
|
|
3
|
-
const APP_BASE_URL = process.env.NEXT_PUBLIC_BASE_URL ?? "http://localhost:3000"
|
|
2
|
+
import { getBaseUrl } from "@/lib/utils/url"
|
|
4
3
|
|
|
5
4
|
export default function robots(): MetadataRoute.Robots {
|
|
6
5
|
return {
|
|
@@ -9,6 +8,6 @@ export default function robots(): MetadataRoute.Robots {
|
|
|
9
8
|
allow: "/",
|
|
10
9
|
disallow: [],
|
|
11
10
|
},
|
|
12
|
-
sitemap: `${
|
|
11
|
+
sitemap: `${getBaseUrl()}/sitemap.xml`,
|
|
13
12
|
}
|
|
14
13
|
}
|
|
@@ -64,8 +64,10 @@ const nextConfig: NextConfig = {
|
|
|
64
64
|
},
|
|
65
65
|
},
|
|
66
66
|
},
|
|
67
|
+
logging: {
|
|
68
|
+
browserToTerminal: true,
|
|
69
|
+
},
|
|
67
70
|
experimental: {
|
|
68
|
-
browserDebugInfoInTerminal: true,
|
|
69
71
|
optimizePackageImports: [
|
|
70
72
|
"@react-three/drei",
|
|
71
73
|
"@react-three/fiber",
|
|
@@ -86,7 +88,8 @@ const nextConfig: NextConfig = {
|
|
|
86
88
|
},
|
|
87
89
|
headers: async () => [
|
|
88
90
|
{
|
|
89
|
-
|
|
91
|
+
// Excludes /studio* — must stay mutually exclusive with the rule below.
|
|
92
|
+
source: "/((?!studio(?:/|$)).*)",
|
|
90
93
|
headers: [
|
|
91
94
|
{
|
|
92
95
|
key: "X-Content-Type-Options",
|
|
@@ -118,6 +121,37 @@ const nextConfig: NextConfig = {
|
|
|
118
121
|
},
|
|
119
122
|
],
|
|
120
123
|
},
|
|
124
|
+
{
|
|
125
|
+
// X-Frame-Options can't allow a third-party origin, and Next can't unset
|
|
126
|
+
// it from another rule — the iframe needs it absent, not overridden.
|
|
127
|
+
source: "/studio/:path*",
|
|
128
|
+
headers: [
|
|
129
|
+
{
|
|
130
|
+
key: "X-Content-Type-Options",
|
|
131
|
+
value: "nosniff",
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
key: "Content-Security-Policy",
|
|
135
|
+
value: "frame-ancestors 'self' https://*.sanity.io;",
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
key: "X-XSS-Protection",
|
|
139
|
+
value: "1; mode=block",
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
key: "X-DNS-Prefetch-Control",
|
|
143
|
+
value: "on",
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
key: "Strict-Transport-Security",
|
|
147
|
+
value: "max-age=63072000; includeSubDomains; preload",
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
key: "Permissions-Policy",
|
|
151
|
+
value: "camera=(), microphone=(), geolocation=()",
|
|
152
|
+
},
|
|
153
|
+
],
|
|
154
|
+
},
|
|
121
155
|
],
|
|
122
156
|
redirects: async () => [
|
|
123
157
|
{
|
|
@@ -32,32 +32,32 @@
|
|
|
32
32
|
"@react-three/fiber": "^10.0.0-alpha.2",
|
|
33
33
|
"class-variance-authority": "^0.7.1",
|
|
34
34
|
"clsx": "^2.1.1",
|
|
35
|
-
"next": "^16",
|
|
36
|
-
"react": "^19",
|
|
37
|
-
"react-dom": "^19",
|
|
35
|
+
"next": "^16.3.0",
|
|
36
|
+
"react": "^19.2.8",
|
|
37
|
+
"react-dom": "^19.2.8",
|
|
38
38
|
"tailwind-merge": "^3.4.0",
|
|
39
39
|
"three": "^0.182.0",
|
|
40
40
|
"zod": "^4.3.6"
|
|
41
41
|
},
|
|
42
42
|
"devDependencies": {
|
|
43
43
|
"@biomejs/biome": "^2.4.14",
|
|
44
|
-
"@next/bundle-analyzer": "^16",
|
|
44
|
+
"@next/bundle-analyzer": "^16.3.0",
|
|
45
45
|
"@svgr/webpack": "^8.1.0",
|
|
46
|
-
"@tailwindcss/postcss": "^4",
|
|
46
|
+
"@tailwindcss/postcss": "^4.2.2",
|
|
47
47
|
"@types/bun": "^1.3.6",
|
|
48
48
|
"@types/node": "^24.13.1",
|
|
49
|
-
"@types/react": "^19.2.
|
|
49
|
+
"@types/react": "^19.2.14",
|
|
50
50
|
"@types/react-dom": "^19.2.3",
|
|
51
51
|
"@types/three": "^0.182.0",
|
|
52
|
-
"@typescript/native-preview": "^7.0.0-dev.
|
|
52
|
+
"@typescript/native-preview": "^7.0.0-dev.20260323.1",
|
|
53
53
|
"babel-plugin-react-compiler": "^1.0.0",
|
|
54
54
|
"cross-env": "^10.1.0",
|
|
55
55
|
"knip": "^6.16.1",
|
|
56
56
|
"lefthook": "^1.13.0",
|
|
57
57
|
"postcss-preset-env": "^10.6.1",
|
|
58
58
|
"schema-dts": "^2.0.0",
|
|
59
|
-
"tailwindcss": "^4",
|
|
60
|
-
"typescript": "^5"
|
|
59
|
+
"tailwindcss": "^4.2.2",
|
|
60
|
+
"typescript": "^5.9.3"
|
|
61
61
|
},
|
|
62
62
|
"trustedDependencies": [
|
|
63
63
|
"@biomejs/biome",
|