@buley/hexgrid-3d 1.1.0 → 1.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.
- package/build_log.txt +500 -0
- package/build_src_log.txt +8 -0
- package/package.json +1 -1
- package/site/.eslintrc.json +3 -0
- package/site/DEPLOYMENT.md +196 -0
- package/site/INDEX.md +127 -0
- package/site/QUICK_START.md +86 -0
- package/site/README.md +85 -0
- package/site/SITE_SUMMARY.md +180 -0
- package/site/next.config.js +12 -0
- package/site/package.json +26 -0
- package/site/src/app/docs/page.tsx +148 -0
- package/site/src/app/examples/page.tsx +133 -0
- package/site/src/app/globals.css +160 -0
- package/site/src/app/layout.tsx +29 -0
- package/site/src/app/page.tsx +163 -0
- package/site/tsconfig.json +29 -0
- package/site/vercel.json +6 -0
- package/src/adapters/DashAdapter.ts +57 -0
- package/src/algorithms/ParticleSystem3D.ts +25 -4
- package/src/components/NarrationOverlay.tsx +1 -1
- package/src/lib/narration.ts +17 -0
- package/src/lib/stats-tracker.ts +25 -0
- package/src/lib/theme-colors.ts +12 -0
- package/src/math/HexCoordinates.ts +852 -4
- package/src/math/Vector3.ts +482 -15
- package/src/types/shared-utils.d.ts +10 -0
- package/src/types.ts +1 -0
- package/tsconfig.json +21 -14
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import Link from 'next/link';
|
|
2
|
+
|
|
3
|
+
export const metadata = {
|
|
4
|
+
title: 'Documentation - HexGrid 3D',
|
|
5
|
+
description: 'Complete documentation for HexGrid 3D component',
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
export default function DocsPage() {
|
|
9
|
+
return (
|
|
10
|
+
<div className="container" style={{ paddingTop: '4rem', paddingBottom: '4rem' }}>
|
|
11
|
+
<Link href="/" style={{ color: '#667eea', marginBottom: '2rem', display: 'inline-block' }}>
|
|
12
|
+
← Back to Home
|
|
13
|
+
</Link>
|
|
14
|
+
|
|
15
|
+
<h1 style={{ fontSize: '3rem', marginBottom: '1rem' }}>Documentation</h1>
|
|
16
|
+
<p style={{ color: '#a0a0a0', marginBottom: '3rem', fontSize: '1.2rem' }}>
|
|
17
|
+
Complete guide to using HexGrid 3D in your projects
|
|
18
|
+
</p>
|
|
19
|
+
|
|
20
|
+
<div style={{ display: 'grid', gap: '2rem' }}>
|
|
21
|
+
<section>
|
|
22
|
+
<h2 style={{ fontSize: '2rem', marginBottom: '1rem' }}>Installation</h2>
|
|
23
|
+
<div className="code-block">
|
|
24
|
+
<code>npm install @buley/hexgrid-3d</code>
|
|
25
|
+
</div>
|
|
26
|
+
</section>
|
|
27
|
+
|
|
28
|
+
<section>
|
|
29
|
+
<h2 style={{ fontSize: '2rem', marginBottom: '1rem' }}>Basic Usage</h2>
|
|
30
|
+
<div className="code-block">
|
|
31
|
+
<code>
|
|
32
|
+
{`import { HexGrid, Photo } from '@buley/hexgrid-3d'
|
|
33
|
+
|
|
34
|
+
function MyComponent() {
|
|
35
|
+
const photos: Photo[] = [
|
|
36
|
+
{
|
|
37
|
+
id: '1',
|
|
38
|
+
url: 'https://example.com/photo.jpg',
|
|
39
|
+
source: 'example',
|
|
40
|
+
createdAt: new Date().toISOString()
|
|
41
|
+
}
|
|
42
|
+
]
|
|
43
|
+
|
|
44
|
+
return (
|
|
45
|
+
<HexGrid
|
|
46
|
+
photos={photos}
|
|
47
|
+
onHexClick={(photo) => console.log('Clicked:', photo)}
|
|
48
|
+
/>
|
|
49
|
+
)
|
|
50
|
+
}`}
|
|
51
|
+
</code>
|
|
52
|
+
</div>
|
|
53
|
+
</section>
|
|
54
|
+
|
|
55
|
+
<section>
|
|
56
|
+
<h2 style={{ fontSize: '2rem', marginBottom: '1rem' }}>Props</h2>
|
|
57
|
+
<div style={{ background: '#1a1a1a', padding: '1.5rem', borderRadius: '8px', border: '1px solid #2a2a2a' }}>
|
|
58
|
+
<table style={{ width: '100%', borderCollapse: 'collapse' }}>
|
|
59
|
+
<thead>
|
|
60
|
+
<tr style={{ borderBottom: '1px solid #2a2a2a' }}>
|
|
61
|
+
<th style={{ padding: '0.75rem', textAlign: 'left', color: '#fff' }}>Prop</th>
|
|
62
|
+
<th style={{ padding: '0.75rem', textAlign: 'left', color: '#fff' }}>Type</th>
|
|
63
|
+
<th style={{ padding: '0.75rem', textAlign: 'left', color: '#fff' }}>Description</th>
|
|
64
|
+
</tr>
|
|
65
|
+
</thead>
|
|
66
|
+
<tbody>
|
|
67
|
+
<tr style={{ borderBottom: '1px solid #2a2a2a' }}>
|
|
68
|
+
<td style={{ padding: '0.75rem', color: '#a0a0a0' }}><code>photos</code></td>
|
|
69
|
+
<td style={{ padding: '0.75rem', color: '#a0a0a0' }}><code>Photo[]</code></td>
|
|
70
|
+
<td style={{ padding: '0.75rem', color: '#a0a0a0' }}>Array of photos to display</td>
|
|
71
|
+
</tr>
|
|
72
|
+
<tr style={{ borderBottom: '1px solid #2a2a2a' }}>
|
|
73
|
+
<td style={{ padding: '0.75rem', color: '#a0a0a0' }}><code>onHexClick</code></td>
|
|
74
|
+
<td style={{ padding: '0.75rem', color: '#a0a0a0' }}><code>(photo: Photo) => void</code></td>
|
|
75
|
+
<td style={{ padding: '0.75rem', color: '#a0a0a0' }}>Callback when hex is clicked</td>
|
|
76
|
+
</tr>
|
|
77
|
+
<tr style={{ borderBottom: '1px solid #2a2a2a' }}>
|
|
78
|
+
<td style={{ padding: '0.75rem', color: '#a0a0a0' }}><code>spacing</code></td>
|
|
79
|
+
<td style={{ padding: '0.75rem', color: '#a0a0a0' }}><code>number</code></td>
|
|
80
|
+
<td style={{ padding: '0.75rem', color: '#a0a0a0' }}>Grid spacing multiplier</td>
|
|
81
|
+
</tr>
|
|
82
|
+
<tr>
|
|
83
|
+
<td style={{ padding: '0.75rem', color: '#a0a0a0' }}><code>canvasRef</code></td>
|
|
84
|
+
<td style={{ padding: '0.75rem', color: '#a0a0a0' }}><code>RefObject</code></td>
|
|
85
|
+
<td style={{ padding: '0.75rem', color: '#a0a0a0' }}>Optional canvas reference</td>
|
|
86
|
+
</tr>
|
|
87
|
+
</tbody>
|
|
88
|
+
</table>
|
|
89
|
+
</div>
|
|
90
|
+
</section>
|
|
91
|
+
|
|
92
|
+
<section>
|
|
93
|
+
<h2 style={{ fontSize: '2rem', marginBottom: '1rem' }}>Camera Controls</h2>
|
|
94
|
+
<div style={{ background: '#1a1a1a', padding: '1.5rem', borderRadius: '8px', border: '1px solid #2a2a2a' }}>
|
|
95
|
+
<h3 style={{ marginBottom: '1rem', color: '#fff' }}>Mouse/Trackpad</h3>
|
|
96
|
+
<ul style={{ color: '#a0a0a0', lineHeight: '1.8', marginLeft: '1.5rem' }}>
|
|
97
|
+
<li>Left Click + Drag - Rotate camera (yaw and pitch)</li>
|
|
98
|
+
<li>Scroll - Zoom in/out</li>
|
|
99
|
+
<li>Click on Hex - Select photo</li>
|
|
100
|
+
</ul>
|
|
101
|
+
|
|
102
|
+
<h3 style={{ marginTop: '2rem', marginBottom: '1rem', color: '#fff' }}>Touch</h3>
|
|
103
|
+
<ul style={{ color: '#a0a0a0', lineHeight: '1.8', marginLeft: '1.5rem' }}>
|
|
104
|
+
<li>Single Touch Drag - Rotate camera</li>
|
|
105
|
+
<li>Pinch - Zoom in/out</li>
|
|
106
|
+
<li>Tap on Hex - Select photo</li>
|
|
107
|
+
</ul>
|
|
108
|
+
|
|
109
|
+
<h3 style={{ marginTop: '2rem', marginBottom: '1rem', color: '#fff' }}>Keyboard</h3>
|
|
110
|
+
<ul style={{ color: '#a0a0a0', lineHeight: '1.8', marginLeft: '1.5rem' }}>
|
|
111
|
+
<li>D - Toggle debug panel</li>
|
|
112
|
+
<li>Escape - Close debug panel</li>
|
|
113
|
+
</ul>
|
|
114
|
+
</div>
|
|
115
|
+
</section>
|
|
116
|
+
|
|
117
|
+
<section>
|
|
118
|
+
<h2 style={{ fontSize: '2rem', marginBottom: '1rem' }}>Performance</h2>
|
|
119
|
+
<p style={{ color: '#a0a0a0', lineHeight: '1.8', marginBottom: '1rem' }}>
|
|
120
|
+
HexGrid 3D uses Web Workers for heavy calculations to maintain 60fps rendering:
|
|
121
|
+
</p>
|
|
122
|
+
<ul style={{ color: '#a0a0a0', lineHeight: '1.8', marginLeft: '1.5rem' }}>
|
|
123
|
+
<li>Streaming Rendering - Progressively renders tiles</li>
|
|
124
|
+
<li>Texture Caching - Reuses loaded images</li>
|
|
125
|
+
<li>Adaptive Quality - Adjusts detail based on performance</li>
|
|
126
|
+
<li>Low-Res Mode - Optional reduced quality for slower devices</li>
|
|
127
|
+
</ul>
|
|
128
|
+
</section>
|
|
129
|
+
|
|
130
|
+
<section>
|
|
131
|
+
<h2 style={{ fontSize: '2rem', marginBottom: '1rem' }}>More Information</h2>
|
|
132
|
+
<p style={{ color: '#a0a0a0', lineHeight: '1.8' }}>
|
|
133
|
+
For complete API documentation, examples, and advanced usage, see the{' '}
|
|
134
|
+
<a
|
|
135
|
+
href="https://github.com/buley/hexgrid-3d"
|
|
136
|
+
target="_blank"
|
|
137
|
+
rel="noopener noreferrer"
|
|
138
|
+
style={{ color: '#667eea' }}
|
|
139
|
+
>
|
|
140
|
+
GitHub repository
|
|
141
|
+
</a>
|
|
142
|
+
.
|
|
143
|
+
</p>
|
|
144
|
+
</section>
|
|
145
|
+
</div>
|
|
146
|
+
</div>
|
|
147
|
+
);
|
|
148
|
+
}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import Link from 'next/link';
|
|
2
|
+
|
|
3
|
+
export const metadata = {
|
|
4
|
+
title: 'Examples - HexGrid 3D',
|
|
5
|
+
description: 'Example implementations of HexGrid 3D',
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
export default function ExamplesPage() {
|
|
9
|
+
return (
|
|
10
|
+
<div className="container" style={{ paddingTop: '4rem', paddingBottom: '4rem' }}>
|
|
11
|
+
<Link href="/" style={{ color: '#667eea', marginBottom: '2rem', display: 'inline-block' }}>
|
|
12
|
+
← Back to Home
|
|
13
|
+
</Link>
|
|
14
|
+
|
|
15
|
+
<h1 style={{ fontSize: '3rem', marginBottom: '1rem' }}>Examples</h1>
|
|
16
|
+
<p style={{ color: '#a0a0a0', marginBottom: '3rem', fontSize: '1.2rem' }}>
|
|
17
|
+
See HexGrid 3D in action with these example implementations
|
|
18
|
+
</p>
|
|
19
|
+
|
|
20
|
+
<div style={{ display: 'grid', gap: '2rem' }}>
|
|
21
|
+
<section>
|
|
22
|
+
<h2 style={{ fontSize: '2rem', marginBottom: '1rem' }}>Basic Example</h2>
|
|
23
|
+
<div className="code-block">
|
|
24
|
+
<code>
|
|
25
|
+
{`import { HexGrid, Photo } from '@buley/hexgrid-3d'
|
|
26
|
+
|
|
27
|
+
function BasicExample() {
|
|
28
|
+
const photos: Photo[] = [
|
|
29
|
+
{
|
|
30
|
+
id: '1',
|
|
31
|
+
url: 'https://example.com/photo1.jpg',
|
|
32
|
+
source: 'example',
|
|
33
|
+
createdAt: new Date().toISOString()
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
id: '2',
|
|
37
|
+
url: 'https://example.com/photo2.jpg',
|
|
38
|
+
source: 'example',
|
|
39
|
+
createdAt: new Date().toISOString()
|
|
40
|
+
}
|
|
41
|
+
]
|
|
42
|
+
|
|
43
|
+
return (
|
|
44
|
+
<HexGrid
|
|
45
|
+
photos={photos}
|
|
46
|
+
onHexClick={(photo) => {
|
|
47
|
+
console.log('Selected photo:', photo)
|
|
48
|
+
}}
|
|
49
|
+
/>
|
|
50
|
+
)
|
|
51
|
+
}`}
|
|
52
|
+
</code>
|
|
53
|
+
</div>
|
|
54
|
+
</section>
|
|
55
|
+
|
|
56
|
+
<section>
|
|
57
|
+
<h2 style={{ fontSize: '2rem', marginBottom: '1rem' }}>Advanced Example with Controls</h2>
|
|
58
|
+
<div className="code-block">
|
|
59
|
+
<code>
|
|
60
|
+
{`import { HexGrid, Photo, uiStore } from '@buley/hexgrid-3d'
|
|
61
|
+
import { useRef, useState } from 'react'
|
|
62
|
+
|
|
63
|
+
function AdvancedExample() {
|
|
64
|
+
const canvasRef = useRef<HTMLCanvasElement>(null)
|
|
65
|
+
const [modalOpen, setModalOpen] = useState(false)
|
|
66
|
+
|
|
67
|
+
return (
|
|
68
|
+
<div>
|
|
69
|
+
{/* Control buttons */}
|
|
70
|
+
<button onClick={() => uiStore.toggleDebug()}>
|
|
71
|
+
Toggle Debug
|
|
72
|
+
</button>
|
|
73
|
+
<button onClick={() => uiStore.toggleCamera()}>
|
|
74
|
+
Camera Controls
|
|
75
|
+
</button>
|
|
76
|
+
|
|
77
|
+
{/* Visualization */}
|
|
78
|
+
<HexGrid
|
|
79
|
+
photos={photos}
|
|
80
|
+
canvasRef={canvasRef}
|
|
81
|
+
spacing={1.2}
|
|
82
|
+
modalOpen={modalOpen}
|
|
83
|
+
onHexClick={(photo) => setModalOpen(true)}
|
|
84
|
+
autoplayQueueLimit={100}
|
|
85
|
+
/>
|
|
86
|
+
</div>
|
|
87
|
+
)
|
|
88
|
+
}`}
|
|
89
|
+
</code>
|
|
90
|
+
</div>
|
|
91
|
+
</section>
|
|
92
|
+
|
|
93
|
+
<section>
|
|
94
|
+
<h2 style={{ fontSize: '2rem', marginBottom: '1rem' }}>With Custom Theming</h2>
|
|
95
|
+
<div className="code-block">
|
|
96
|
+
<code>
|
|
97
|
+
{`import { HexGrid, Photo } from '@buley/hexgrid-3d'
|
|
98
|
+
import { setCustomAccentColor } from '@/lib/theme-colors'
|
|
99
|
+
|
|
100
|
+
function ThemedExample() {
|
|
101
|
+
// Set custom accent color
|
|
102
|
+
setCustomAccentColor('#ff00ff')
|
|
103
|
+
|
|
104
|
+
return (
|
|
105
|
+
<HexGrid
|
|
106
|
+
photos={photos}
|
|
107
|
+
onHexClick={(photo) => console.log('Clicked:', photo)}
|
|
108
|
+
/>
|
|
109
|
+
)
|
|
110
|
+
}`}
|
|
111
|
+
</code>
|
|
112
|
+
</div>
|
|
113
|
+
</section>
|
|
114
|
+
|
|
115
|
+
<section>
|
|
116
|
+
<h2 style={{ fontSize: '2rem', marginBottom: '1rem' }}>More Examples</h2>
|
|
117
|
+
<p style={{ color: '#a0a0a0', lineHeight: '1.8' }}>
|
|
118
|
+
For more examples and use cases, check out the{' '}
|
|
119
|
+
<a
|
|
120
|
+
href="https://github.com/buley/hexgrid-3d/tree/main/examples"
|
|
121
|
+
target="_blank"
|
|
122
|
+
rel="noopener noreferrer"
|
|
123
|
+
style={{ color: '#667eea' }}
|
|
124
|
+
>
|
|
125
|
+
examples directory
|
|
126
|
+
</a>
|
|
127
|
+
{' '}in the GitHub repository.
|
|
128
|
+
</p>
|
|
129
|
+
</section>
|
|
130
|
+
</div>
|
|
131
|
+
</div>
|
|
132
|
+
);
|
|
133
|
+
}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
* {
|
|
2
|
+
box-sizing: border-box;
|
|
3
|
+
padding: 0;
|
|
4
|
+
margin: 0;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
html,
|
|
8
|
+
body {
|
|
9
|
+
max-width: 100vw;
|
|
10
|
+
overflow-x: hidden;
|
|
11
|
+
background: #000;
|
|
12
|
+
color: #fff;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
body {
|
|
16
|
+
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',
|
|
17
|
+
'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
|
|
18
|
+
sans-serif;
|
|
19
|
+
-webkit-font-smoothing: antialiased;
|
|
20
|
+
-moz-osx-font-smoothing: grayscale;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
a {
|
|
24
|
+
color: inherit;
|
|
25
|
+
text-decoration: none;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
.container {
|
|
29
|
+
max-width: 1200px;
|
|
30
|
+
margin: 0 auto;
|
|
31
|
+
padding: 0 2rem;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
.section {
|
|
35
|
+
padding: 4rem 0;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
.hero {
|
|
39
|
+
min-height: 100vh;
|
|
40
|
+
display: flex;
|
|
41
|
+
flex-direction: column;
|
|
42
|
+
align-items: center;
|
|
43
|
+
justify-content: center;
|
|
44
|
+
text-align: center;
|
|
45
|
+
padding: 2rem;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
.hero h1 {
|
|
49
|
+
font-size: 4rem;
|
|
50
|
+
font-weight: 700;
|
|
51
|
+
margin-bottom: 1rem;
|
|
52
|
+
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
|
53
|
+
-webkit-background-clip: text;
|
|
54
|
+
-webkit-text-fill-color: transparent;
|
|
55
|
+
background-clip: text;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
.hero p {
|
|
59
|
+
font-size: 1.5rem;
|
|
60
|
+
margin-bottom: 2rem;
|
|
61
|
+
color: #a0a0a0;
|
|
62
|
+
max-width: 800px;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
.button {
|
|
66
|
+
display: inline-block;
|
|
67
|
+
padding: 1rem 2rem;
|
|
68
|
+
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
|
69
|
+
color: white;
|
|
70
|
+
border-radius: 8px;
|
|
71
|
+
font-weight: 600;
|
|
72
|
+
transition: transform 0.2s, box-shadow 0.2s;
|
|
73
|
+
border: none;
|
|
74
|
+
cursor: pointer;
|
|
75
|
+
font-size: 1rem;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
.button:hover {
|
|
79
|
+
transform: translateY(-2px);
|
|
80
|
+
box-shadow: 0 10px 20px rgba(102, 126, 234, 0.3);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
.button-secondary {
|
|
84
|
+
background: transparent;
|
|
85
|
+
border: 2px solid #667eea;
|
|
86
|
+
color: #667eea;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
.button-secondary:hover {
|
|
90
|
+
background: #667eea;
|
|
91
|
+
color: white;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
.features-grid {
|
|
95
|
+
display: grid;
|
|
96
|
+
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
|
|
97
|
+
gap: 2rem;
|
|
98
|
+
margin-top: 3rem;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
.feature-card {
|
|
102
|
+
background: #1a1a1a;
|
|
103
|
+
padding: 2rem;
|
|
104
|
+
border-radius: 12px;
|
|
105
|
+
border: 1px solid #2a2a2a;
|
|
106
|
+
transition: transform 0.2s, border-color 0.2s;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
.feature-card:hover {
|
|
110
|
+
transform: translateY(-4px);
|
|
111
|
+
border-color: #667eea;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
.feature-card h3 {
|
|
115
|
+
font-size: 1.5rem;
|
|
116
|
+
margin-bottom: 1rem;
|
|
117
|
+
color: #fff;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
.feature-card p {
|
|
121
|
+
color: #a0a0a0;
|
|
122
|
+
line-height: 1.6;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
.code-block {
|
|
126
|
+
background: #1a1a1a;
|
|
127
|
+
border: 1px solid #2a2a2a;
|
|
128
|
+
border-radius: 8px;
|
|
129
|
+
padding: 1.5rem;
|
|
130
|
+
overflow-x: auto;
|
|
131
|
+
margin: 1.5rem 0;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
.code-block code {
|
|
135
|
+
color: #a0a0a0;
|
|
136
|
+
font-family: 'Courier New', monospace;
|
|
137
|
+
font-size: 0.9rem;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
.footer {
|
|
141
|
+
background: #0a0a0a;
|
|
142
|
+
padding: 3rem 0;
|
|
143
|
+
text-align: center;
|
|
144
|
+
color: #666;
|
|
145
|
+
border-top: 1px solid #1a1a1a;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
@media (max-width: 768px) {
|
|
149
|
+
.hero h1 {
|
|
150
|
+
font-size: 2.5rem;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
.hero p {
|
|
154
|
+
font-size: 1.2rem;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
.features-grid {
|
|
158
|
+
grid-template-columns: 1fr;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { Metadata } from 'next';
|
|
2
|
+
import { Inter } from 'next/font/google';
|
|
3
|
+
import './globals.css';
|
|
4
|
+
|
|
5
|
+
const inter = Inter({ subsets: ['latin'] });
|
|
6
|
+
|
|
7
|
+
export const metadata: Metadata = {
|
|
8
|
+
title: 'HexGrid 3D - Immersive 3D Hexagonal Grid Visualization',
|
|
9
|
+
description: 'A powerful React component for displaying content in an immersive 3D spherical hexagonal grid layout. Perfect for portfolios, galleries, and interactive visualizations.',
|
|
10
|
+
keywords: ['3D', 'hexgrid', 'visualization', 'react', 'three.js', 'spherical', 'interactive'],
|
|
11
|
+
authors: [{ name: 'buley' }],
|
|
12
|
+
openGraph: {
|
|
13
|
+
title: 'HexGrid 3D - Immersive 3D Hexagonal Grid Visualization',
|
|
14
|
+
description: 'A powerful React component for displaying content in an immersive 3D spherical hexagonal grid layout.',
|
|
15
|
+
type: 'website',
|
|
16
|
+
},
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
export default function RootLayout({
|
|
20
|
+
children,
|
|
21
|
+
}: {
|
|
22
|
+
children: React.ReactNode;
|
|
23
|
+
}) {
|
|
24
|
+
return (
|
|
25
|
+
<html lang="en">
|
|
26
|
+
<body className={inter.className}>{children}</body>
|
|
27
|
+
</html>
|
|
28
|
+
);
|
|
29
|
+
}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import Link from 'next/link';
|
|
2
|
+
|
|
3
|
+
export default function HomePage() {
|
|
4
|
+
return (
|
|
5
|
+
<main>
|
|
6
|
+
{/* Hero Section */}
|
|
7
|
+
<section className="hero">
|
|
8
|
+
<h1>HexGrid 3D</h1>
|
|
9
|
+
<p>
|
|
10
|
+
A powerful React component for displaying content in an immersive 3D
|
|
11
|
+
spherical hexagonal grid layout. Perfect for portfolios, galleries, and
|
|
12
|
+
interactive visualizations.
|
|
13
|
+
</p>
|
|
14
|
+
<div style={{ display: 'flex', gap: '1rem', flexWrap: 'wrap', justifyContent: 'center' }}>
|
|
15
|
+
<Link href="/docs" className="button">
|
|
16
|
+
Get Started
|
|
17
|
+
</Link>
|
|
18
|
+
<Link href="/examples" className="button button-secondary">
|
|
19
|
+
View Examples
|
|
20
|
+
</Link>
|
|
21
|
+
<a
|
|
22
|
+
href="https://github.com/buley/hexgrid-3d"
|
|
23
|
+
target="_blank"
|
|
24
|
+
rel="noopener noreferrer"
|
|
25
|
+
className="button button-secondary"
|
|
26
|
+
>
|
|
27
|
+
GitHub
|
|
28
|
+
</a>
|
|
29
|
+
</div>
|
|
30
|
+
</section>
|
|
31
|
+
|
|
32
|
+
{/* Features Section */}
|
|
33
|
+
<section className="section container">
|
|
34
|
+
<h2 style={{ fontSize: '2.5rem', marginBottom: '1rem', textAlign: 'center' }}>
|
|
35
|
+
Powerful Features
|
|
36
|
+
</h2>
|
|
37
|
+
<p style={{ textAlign: 'center', color: '#a0a0a0', marginBottom: '3rem', fontSize: '1.2rem' }}>
|
|
38
|
+
Everything you need to create stunning 3D visualizations
|
|
39
|
+
</p>
|
|
40
|
+
<div className="features-grid">
|
|
41
|
+
<div className="feature-card">
|
|
42
|
+
<div style={{ marginBottom: '1rem', color: '#667eea', fontSize: '2rem' }}>📐</div>
|
|
43
|
+
<h3>3D Hexagonal Grid</h3>
|
|
44
|
+
<p>
|
|
45
|
+
Spherical projection with customizable curvature. Display your content
|
|
46
|
+
in an immersive 3D space that adapts to any viewport.
|
|
47
|
+
</p>
|
|
48
|
+
</div>
|
|
49
|
+
|
|
50
|
+
<div className="feature-card">
|
|
51
|
+
<div style={{ marginBottom: '1rem', color: '#667eea', fontSize: '2rem' }}>📷</div>
|
|
52
|
+
<h3>Interactive Camera</h3>
|
|
53
|
+
<p>
|
|
54
|
+
Pan, zoom, and rotate with smooth transitions. Support for mouse,
|
|
55
|
+
touch, and keyboard controls with inside/outside views.
|
|
56
|
+
</p>
|
|
57
|
+
</div>
|
|
58
|
+
|
|
59
|
+
<div className="feature-card">
|
|
60
|
+
<div style={{ marginBottom: '1rem', color: '#667eea', fontSize: '2rem' }}>⚡</div>
|
|
61
|
+
<h3>High Performance</h3>
|
|
62
|
+
<p>
|
|
63
|
+
Web Worker rendering for 60fps performance. Automatic texture caching
|
|
64
|
+
and adaptive quality based on device capabilities.
|
|
65
|
+
</p>
|
|
66
|
+
</div>
|
|
67
|
+
|
|
68
|
+
<div className="feature-card">
|
|
69
|
+
<div style={{ marginBottom: '1rem', color: '#667eea', fontSize: '2rem' }}>🎨</div>
|
|
70
|
+
<h3>Dynamic Theming</h3>
|
|
71
|
+
<p>
|
|
72
|
+
Automatic accent color extraction from images. Seamless integration
|
|
73
|
+
with your app's theme system.
|
|
74
|
+
</p>
|
|
75
|
+
</div>
|
|
76
|
+
|
|
77
|
+
<div className="feature-card">
|
|
78
|
+
<div style={{ marginBottom: '1rem', color: '#667eea', fontSize: '2rem' }}>📱</div>
|
|
79
|
+
<h3>Responsive Design</h3>
|
|
80
|
+
<p>
|
|
81
|
+
Fully responsive for mobile and desktop. Touch gestures, pinch-to-zoom,
|
|
82
|
+
and adaptive layouts for all screen sizes.
|
|
83
|
+
</p>
|
|
84
|
+
</div>
|
|
85
|
+
|
|
86
|
+
<div className="feature-card">
|
|
87
|
+
<div style={{ marginBottom: '1rem', color: '#667eea', fontSize: '2rem' }}>💻</div>
|
|
88
|
+
<h3>TypeScript Ready</h3>
|
|
89
|
+
<p>
|
|
90
|
+
Fully typed with comprehensive TypeScript definitions. Includes
|
|
91
|
+
comprehensive tests and documentation.
|
|
92
|
+
</p>
|
|
93
|
+
</div>
|
|
94
|
+
</div>
|
|
95
|
+
</section>
|
|
96
|
+
|
|
97
|
+
{/* Quick Start Section */}
|
|
98
|
+
<section className="section container">
|
|
99
|
+
<h2 style={{ fontSize: '2.5rem', marginBottom: '2rem', textAlign: 'center' }}>
|
|
100
|
+
Quick Start
|
|
101
|
+
</h2>
|
|
102
|
+
<div className="code-block">
|
|
103
|
+
<code>
|
|
104
|
+
{`npm install @buley/hexgrid-3d`}
|
|
105
|
+
</code>
|
|
106
|
+
</div>
|
|
107
|
+
<div className="code-block">
|
|
108
|
+
<code>
|
|
109
|
+
{`import { HexGrid, Photo } from '@buley/hexgrid-3d'
|
|
110
|
+
|
|
111
|
+
function MyComponent() {
|
|
112
|
+
const photos: Photo[] = [
|
|
113
|
+
{
|
|
114
|
+
id: '1',
|
|
115
|
+
url: 'https://example.com/photo.jpg',
|
|
116
|
+
source: 'example',
|
|
117
|
+
createdAt: new Date().toISOString()
|
|
118
|
+
}
|
|
119
|
+
]
|
|
120
|
+
|
|
121
|
+
return (
|
|
122
|
+
<HexGrid
|
|
123
|
+
photos={photos}
|
|
124
|
+
onHexClick={(photo) => console.log('Clicked:', photo)}
|
|
125
|
+
/>
|
|
126
|
+
)
|
|
127
|
+
}`}
|
|
128
|
+
</code>
|
|
129
|
+
</div>
|
|
130
|
+
<div style={{ textAlign: 'center', marginTop: '2rem' }}>
|
|
131
|
+
<Link href="/docs" className="button">
|
|
132
|
+
Read Full Documentation
|
|
133
|
+
</Link>
|
|
134
|
+
</div>
|
|
135
|
+
</section>
|
|
136
|
+
|
|
137
|
+
{/* Footer */}
|
|
138
|
+
<footer className="footer">
|
|
139
|
+
<div className="container">
|
|
140
|
+
<p>© 2024 HexGrid 3D. Personal Use Only License.</p>
|
|
141
|
+
<p style={{ marginTop: '0.5rem', fontSize: '0.9rem' }}>
|
|
142
|
+
<a
|
|
143
|
+
href="https://github.com/buley/hexgrid-3d"
|
|
144
|
+
target="_blank"
|
|
145
|
+
rel="noopener noreferrer"
|
|
146
|
+
style={{ color: '#667eea' }}
|
|
147
|
+
>
|
|
148
|
+
View on GitHub
|
|
149
|
+
</a>
|
|
150
|
+
{' • '}
|
|
151
|
+
<Link href="/docs" style={{ color: '#667eea' }}>
|
|
152
|
+
Documentation
|
|
153
|
+
</Link>
|
|
154
|
+
{' • '}
|
|
155
|
+
<Link href="/examples" style={{ color: '#667eea' }}>
|
|
156
|
+
Examples
|
|
157
|
+
</Link>
|
|
158
|
+
</p>
|
|
159
|
+
</div>
|
|
160
|
+
</footer>
|
|
161
|
+
</main>
|
|
162
|
+
);
|
|
163
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES2020",
|
|
4
|
+
"lib": ["dom", "dom.iterable", "esnext"],
|
|
5
|
+
"allowJs": true,
|
|
6
|
+
"skipLibCheck": true,
|
|
7
|
+
"strict": true,
|
|
8
|
+
"noEmit": true,
|
|
9
|
+
"esModuleInterop": true,
|
|
10
|
+
"module": "esnext",
|
|
11
|
+
"moduleResolution": "bundler",
|
|
12
|
+
"resolveJsonModule": true,
|
|
13
|
+
"isolatedModules": true,
|
|
14
|
+
"jsx": "preserve",
|
|
15
|
+
"incremental": true,
|
|
16
|
+
"plugins": [
|
|
17
|
+
{
|
|
18
|
+
"name": "next"
|
|
19
|
+
}
|
|
20
|
+
],
|
|
21
|
+
"paths": {
|
|
22
|
+
"@/*": ["./src/*"],
|
|
23
|
+
"@/components/*": ["./src/components/*"],
|
|
24
|
+
"@/lib/*": ["./src/lib/*"]
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
|
|
28
|
+
"exclude": ["node_modules"]
|
|
29
|
+
}
|