Skip to content

Commit 1ff1ae4

Browse files
added few testimonials to 3D Bits docs
1 parent 11ee7ff commit 1ff1ae4

File tree

3 files changed

+83
-5
lines changed

3 files changed

+83
-5
lines changed

docs/learn/3d-bits/intro.md

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,31 @@ Traditional online stores use static images, but modern shoppers want to see pro
3232
</iframe>
3333
</div>
3434

35+
## What Our Customers Say
36+
37+
<div class="testimonials-section">
38+
39+
<div class="testimonial-item">
40+
41+
### "An outstanding app for 3D configuration and beyond! It's intuitive, fully customizable, and backed by exceptional support from Matas. You can seamlessly integrate 3D models into Shopify product media and dynamically reflect different variants — from accessories to color changes and more. A definite must-have!"
42+
43+
**Nicolas Quendez, Co-Founder & CEO**
44+
[![Kahe E-Nautic](https://ik.imagekit.io/bitbybit/app/assets/start/shopify/kahe-enautic.webp)](https://kahe-nautic.com/)
45+
46+
</div>
47+
48+
<div class="testimonial-item">
49+
50+
### "I wasn't expecting to be this impressed. This guy delivers real value with authenticity, quality, and professionalism. Every interaction we've had has been smooth, straightforward, and reliable. What you see is exactly what you get, just solid, well-executed work with no unnecessary noise. This is the kind of service I'd recommend without hesitation. I'll definitely continue working with Matas."
51+
52+
**Francesco, Founder & CEO**
53+
[![Ironside Armour](https://ik.imagekit.io/bitbybit/app/assets/start/shopify/ironside-armour.webp)](https://ironsidearmour.com)
54+
55+
</div>
56+
57+
</div>
58+
59+
3560
## How Does 3D Bits Work?
3661

3762
3D Bits is built on the [bitbybit.dev](https://bitbybit.dev) platform, which provides powerful 3D and CAD tools for both beginners and professionals. You can:

docs/src/css/custom.css

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,4 +57,47 @@
5757

5858
.category-icon-small {
5959
width: 100px;
60+
}
61+
62+
.testimonials-section {
63+
display: grid;
64+
grid-template-columns: repeat(2, 1fr);
65+
gap: 2rem;
66+
margin: 2rem 0;
67+
}
68+
69+
.testimonial-item {
70+
background: #34383e;
71+
padding: 1.5rem;
72+
border-radius: 8px;
73+
color: #f0cebb;
74+
border-left: 4px solid #f0cebb;
75+
display: flex;
76+
flex-direction: column;
77+
height: 100%;
78+
}
79+
80+
.testimonial-item h3 {
81+
font-style: italic;
82+
color: white;
83+
font-weight: 400;
84+
margin-bottom: 1rem;
85+
line-height: 1.6;
86+
font-size: 1rem;
87+
flex-grow: 1;
88+
}
89+
90+
.testimonial-item img {
91+
margin-top: 10px;
92+
border-radius: 4px;
93+
width: 160px;
94+
object-fit: contain;
95+
align-self: flex-start;
96+
}
97+
98+
@media (max-width: 768px) {
99+
.testimonials-section {
100+
grid-template-columns: 1fr;
101+
gap: 1rem;
102+
}
60103
}

docs/src/theme/Layout/index.tsx

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,24 @@ export default function LayoutWrapper(props: Props): ReactNode {
1111

1212
const [trackingInitialized, setTrackingInitialized] = useState(false);
1313

14+
// Check if running in iframe
15+
const isInIframe = ExecutionEnvironment.canUseDOM && window.parent !== window;
16+
1417
// Check if cookies are disabled via query parameter
15-
const isCookieDisabled = ExecutionEnvironment.canUseDOM &&
18+
const isCookieDisabledByQuery = ExecutionEnvironment.canUseDOM &&
1619
new URLSearchParams(window.location.search).get("cookies") === "disabled";
1720

21+
// Set decline cookie if disabled by query parameter (but not in iframe)
22+
if (isCookieDisabledByQuery && ExecutionEnvironment.canUseDOM && !isInIframe) {
23+
Cookies.set("bitbybit-docs-cookie-consent", "false", { expires: 365 });
24+
}
25+
26+
// Check if cookies are disabled (by query, iframe, or previous decline)
27+
const cookieConsent = Cookies.get("bitbybit-docs-cookie-consent");
28+
const isCookieDisabled = isCookieDisabledByQuery || cookieConsent === "false" || isInIframe;
29+
1830
const initializeGATracking = () => {
19-
if (ExecutionEnvironment.canUseDOM && !window.gtag) {
31+
if (ExecutionEnvironment.canUseDOM && !window.gtag && !isCookieDisabled) {
2032
const script = document.createElement("script");
2133
script.src = `https://www.googletagmanager.com/gtag/js?id=${GA_MEASUREMENT_ID}`;
2234
script.async = true;
@@ -35,8 +47,6 @@ export default function LayoutWrapper(props: Props): ReactNode {
3547
}
3648
};
3749

38-
const cookieConsent = Cookies.get("bitbybit-docs-cookie-consent");
39-
4050
if (cookieConsent === "true" && trackingInitialized === false && !isCookieDisabled) {
4151
initializeGATracking();
4252
setTrackingInitialized(true);
@@ -45,7 +55,7 @@ export default function LayoutWrapper(props: Props): ReactNode {
4555
return (
4656
<>
4757
<Layout {...props} />
48-
{!isCookieDisabled && (
58+
{!isCookieDisabled && !cookieConsent && (
4959
<CookieConsent
5060
location="bottom"
5161
buttonText="ACCEPT COOKIES ❤️"

0 commit comments

Comments
 (0)