threed-garden
Version:
ThreeD Garden: WebGL 3D Environment Interface for Next.JS React TypeScript Three.JS React-Three Physics, 2D Paper.JS; APIs: Apollo GraphQL, WordPress; CSS: Tailwind, Radix-UI; Libraries: FarmBot 3D; AI: OpenAI, DeepSeek
443 lines (388 loc) • 8.46 kB
CSS
/* body {
margin: 0;
} */
.garden-bed-3d-model {
height: 100vh;
width: 100vw;
position: relative;
cursor: grab;
&:active {
cursor: grabbing;
}
}
.gear {
position: absolute;
top: 1rem;
right: 1rem;
width: 1rem;
cursor: pointer;
background: rgba(255, 255, 255, 0.4);
box-shadow: rgba(0, 0, 0, 0.2) 0px 0px 5px;
padding: 7px;
border-radius: 5px;
backdrop-filter: blur(5px);
opacity: 0;
&:hover {
opacity: 1;
}
}
.overlay {
position: absolute;
bottom: 0;
left: 0;
right: 0;
top: 0;
pointer-events: none;
user-select: none;
.settings-bar {
display: flex;
justify-content: center;
bottom: 0;
left: 0;
right: 0;
position: absolute;
gap: 1.25rem;
padding: 1rem;
overflow-x: scroll;
background: linear-gradient(0deg, rgba(0, 0, 0, 0.5), transparent);
@media screen and (max-width: 768px) {
justify-content: left;
pointer-events: all;
}
.setting-section {
pointer-events: all;
}
.setting-title {
color: #f4f4f4;
font-family: 'Inknut Antiqua';
text-shadow: 0 0 10px black;
line-height: 1.8rem;
text-align: center;
}
.row {
background: rgba(255, 255, 255, 0.6);
box-shadow: rgba(0, 0, 0, 0.2) 0px 0px 10px;
border-radius: 25px;
height: 40px;
padding: 5px;
display: flex;
justify-content: space-evenly;
backdrop-filter: blur(5px);
gap: 5px;
}
button {
padding: 0 1rem;
border-radius: 25px;
font-family: 'Cabin';
font-weight: bold;
border: none;
background: none;
white-space: nowrap;
color: #222;
&.outdoor.active,
&.lab.active,
&.genesis.active,
&.standard.active,
&.mobile.active {
background: rgba(255, 255, 255, 0.6);
}
&.genesis-xl.active {
background: linear-gradient(315deg, #22a36d, #4ea3ed);
color: #f4f4f4;
}
&.winter.active {
background: linear-gradient(-15deg, #152e40, #3e8dc2);
color: #f4f4f4;
}
&.spring.active {
background: linear-gradient(15deg, #055b08, #49cc78);
color: #f4f4f4;
}
&.summer.active {
background: linear-gradient(-15deg, #d87f09, #f5e40a);
}
&.fall.active {
background: linear-gradient(15deg, #502402, #c69075);
color: #f4f4f4
}
&:hover {
cursor: pointer;
background: rgba(255, 255, 255, 0.3);
}
&.disabled {
color: gray;
&:hover {
cursor: not-allowed;
background: none;
}
}
}
}
}
.tool-tip {
position: absolute;
bottom: 6.5rem;
left: 0;
right: 0;
width: fit-content;
margin: auto;
color: #f4f4f4;
font-family: 'Cabin', Arial;
background: rgba(120, 0, 0, 0.65);
padding: 0.75rem 1rem;
border-radius: 5px;
text-align: center;
pointer-events: none;
backdrop-filter: blur(5px);
box-shadow: rgba(0, 0, 0, 0.2) 0px 0px 5px;
@media screen and (max-width: 768px) {
margin: 0 1rem;
}
}
.all-configs {
position: absolute;
top: 1rem;
right: 1rem;
width: 22rem;
background: #434343;
text-align: left;
padding: 1rem;
font-family: 'Cabin', Arial;
border-radius: 5px;
max-height: 30rem;
overflow-y: scroll;
.close {
position: absolute;
top: 0.5rem;
right: 1rem;
cursor: pointer;
font-size: 1rem;
margin: 0;
padding: 0.5rem 0.75rem;
background: none;
border-radius: 5px;
&:hover {
background: #555;
}
}
.spacer {
margin-top: 1rem;
}
details {
color: #f4f4f4;
label {
font-weight: bold;
}
}
summary {
cursor: pointer;
padding: 1rem;
margin: -1rem;
&:hover {
background: #333;
}
}
.config-row {
display: grid;
grid-template-columns: min-content minmax(30%, 200px) auto;
margin-bottom: 0.25rem;
span {
width: 8rem;
padding-left: 1rem;
color: #ccc;
}
input[type="checkbox"] {
width: 1.1rem;
height: 1.1rem;
justify-self: left;
cursor: pointer;
}
input[type="number"] {
width: 100%;
max-width: 4rem;
}
input[type="radio"] {
width: 1.1rem;
height: 1.1rem;
cursor: pointer;
}
.options {
width: 100%;
justify-content: space-between;
}
input[type="range"] {
width: 8rem;
margin-left: -2rem;
cursor: pointer;
}
}
}
.promo-info {
color: #f4f4f4;
text-align: right;
position: absolute;
top: 3rem;
right: 4rem;
pointer-events: none;
text-shadow: 0 0 3.5rem black, 0 0 1rem black;
display: grid;
gap: 1rem;
justify-items: right;
.title {
font-family: 'Inknut Antiqua';
font-size: 3.5rem;
line-height: 5rem;
margin: 0;
}
.description {
font-family: 'Cabin';
font-weight: normal;
font-size: 1.25rem;
max-width: 40vw;
margin: 0;
line-height: 1.7rem;
.short {
display: none;
}
.full {
display: inline;
}
}
.buy-button {
pointer-events: all;
background: #00a579e0;
border-radius: 7px;
box-shadow: rgba(0, 0, 0, 0.2) 0px 0px 10px;
backdrop-filter: blur(5px);
font-size: 1.5rem;
line-height: 4rem;
padding: 0 1.75rem;
text-shadow: none;
font-family: 'Cabin';
text-transform: uppercase;
text-decoration: none;
color: #f4f4f4;
display: flex;
gap: 0.4rem;
align-items: center;
p {
margin: 0;
}
.genesis-xl {
background: linear-gradient(315deg, #22a36d, #4ea3ed);
box-shadow: 0 0 8px rgba(0, 0, 0, 0.25);
color: #f4f4f4;
border-radius: 50%;
height: 2.5rem;
width: 2.5rem;
line-height: 2.5rem;
text-align: center;
font-size: 80%;
vertical-align: middle;
}
&:hover {
background: #00bb89e5;
}
}
}
.beacon-info {
width: 500px;
font-size: 20px;
background: white;
background: rgba(255, 255, 255, 0.8);
box-shadow: rgba(0, 0, 0, 0.2) 0px 0px 10px;
border-radius: 10px;
padding: 25px;
backdrop-filter: blur(5px);
text-align: left;
user-select: none;
p {
font-family: 'Cabin';
margin-bottom: 0;
}
iframe {
margin-top: 20px;
width: 100%;
height: auto;
border-radius: 5px;
aspect-ratio: 16 / 9;
}
.header {
display: flex;
justify-content: space-between;
h2 {
font-family: 'Inknut Antiqua';
margin: 0;
line-height: 100%;
}
.exit-button {
width: 30px;
height: 30px;
aspect-ratio: 1 / 1;
border-radius: 50%;
filter: grayscale(100%);
font-size: 12px;
line-height: 30px;
text-align: center;
background: rgba(255, 255, 255, 0.4);
box-shadow: rgba(0, 0, 0, 0.2) 0px 0px 10px;
&:hover {
cursor: pointer;
background: rgba(255, 255, 255, 0.6);
}
}
}
}
@media screen and (max-width: 768px) {
.beacon-info-wrapper {
position: absolute;
bottom: 0;
left: 0;
right: 0;
display: grid;
align-items: end;
transform: none;
* {
transform: none;
}
.beacon-info {
width: initial;
border-bottom-left-radius: 0px;
border-bottom-right-radius: 0px;
overflow: scroll;
height: 25vh;
font-size: 100%;
}
}
.promo-info {
top: 1rem;
right: 1rem;
gap: 0.5rem;
.title {
font-size: 1.5rem;
line-height: 2rem;
}
.description {
font-size: 1rem;
max-width: 80vw;
line-height: 1.5rem;
.short {
display: inline;
}
.full {
display: none;
}
}
.buy-button {
font-size: 0.85rem;
line-height: 2.2rem;
padding: 0 0.75rem;
border-radius: 5px;
.genesis-xl {
height: 1.5rem;
width: 1.5rem;
line-height: 1.5rem;
}
}
}
}