SOURCE / PINNED RELEASE
Made of little things.
Napcraft
- Release
- ee47ac6a25df…
- Author-recorded commit
- 410dea87e109…
- License
- LICENSE
- Author’s source reference
- nostr://npub182jczunncwe0jn6frpqwq3e0qjws7yqqnc3auccqv9nte2dnd63scjm4rf/wss%3A%2F%2Fgit.napplet.soy%2F/n-52f9e22f5ce
Archive hash verified: 9e6e0cabb18d0d46…. The source-to-build association is the author’s claim; it has not been independently rebuilt.
:root {
font-family: ui-rounded, 'Avenir Next', Avenir, system-ui, sans-serif;
color: #463656;
background: #dedcf5;
font-synthesis: none;
--ink: #463656;
--purple: #7657a8;
--paper: #fffaf7;
--line: #58416e24;
--napplet-text-selection: none;
}
* {
box-sizing: border-box;
}
html,
body,
#app {
height: 100%;
width: 100%;
margin: 0;
overflow: hidden;
}
#app {
position: relative;
isolation: isolate;
}
button,
input {
font: inherit;
}
button {
cursor: pointer;
touch-action: manipulation;
border: 1px solid var(--line);
color: var(--ink);
font-weight: 750;
background: var(--paper);
border-radius: 12px;
min-height: 44px;
padding: 10px 17px;
box-shadow: 0 3px 0 #58416e18;
transition:
transform 0.12s,
background 0.12s;
}
button:active {
transform: translateY(2px);
box-shadow: none;
}
button:hover {
background: #f0e8fb;
}
button:disabled {
opacity: 0.55;
cursor: wait;
}
button:focus-visible,
input:focus-visible,
canvas:focus-visible {
outline: 3px solid #a084d2;
outline-offset: 3px;
}
button.primary {
background: #7657a8;
color: white;
border-color: #60458e;
box-shadow: 0 4px 0 #513679;
}
button.primary:hover {
background: #8767ba;
}
button.icon {
width: 44px;
padding: 8px;
font-size: 20px;
}
button.small {
font-size: 12px;
padding: 8px 13px;
}
button[hidden],
[hidden] {
display: none !important;
}
#scene {
display: block;
width: 100%;
height: 100%;
touch-action: none;
outline: none;
}
header.hud {
position: absolute;
top: max(16px, env(safe-area-inset-top));
left: 20px;
right: 20px;
display: flex;
justify-content: space-between;
align-items: flex-start;
gap: 10px;
pointer-events: none;
}
.hud > * {
pointer-events: auto;
}
.world-chip {
display: flex;
align-items: center;
gap: 12px;
text-align: left;
padding: 10px 14px;
background: #fffaf7ed;
max-width: 48%;
font-size: 13px;
}
.world-chip b {
display: block;
font-weight: 850;
letter-spacing: 0.03em;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
max-width: 230px;
}
.world-chip small {
display: block;
font-size: 10px;
font-weight: 600;
opacity: 0.7;
margin-top: 3px;
}
.logo {
display: grid;
place-items: center;
background: #a186ca;
color: white;
border-radius: 8px;
font-size: 28px;
width: 37px;
height: 37px;
}
.top-right {
display: flex;
gap: 8px;
align-items: center;
}
.pill {
font-size: 10px;
letter-spacing: 0.08em;
font-weight: 800;
background: #fffaf7b8;
border: 1px solid #ffffff7a;
padding: 10px 14px;
border-radius: 40px;
}
.save-pill {
position: absolute;
top: 91px;
left: 24px;
font-size: 11px;
font-weight: 700;
color: #645274;
max-width: 60%;
background: #fffaf7ad;
padding: 6px 10px;
border-radius: 8px;
}
.zoom {
position: absolute;
right: 20px;
top: 97px;
display: flex;
gap: 6px;
}
.zoom button {
background: #fffaf7c9;
}
.bottom {
position: absolute;
bottom: max(18px, env(safe-area-inset-bottom));
left: 50%;
transform: translateX(-50%);
width: min(620px, calc(100% - 32px));
display: flex;
align-items: center;
flex-direction: column;
gap: 11px;
pointer-events: none;
}
.bottom > * {
pointer-events: auto;
}
.hint {
font-size: 11px;
font-weight: 650;
background: #fffaf7bf;
padding: 7px 13px;
border-radius: 20px;
white-space: nowrap;
}
.materials {
display: flex;
align-items: center;
gap: 6px;
background: #fffaf7ed;
border: 1px solid #ffffff;
padding: 8px;
border-radius: 17px;
box-shadow: 0 5px 25px #6651821a;
}
.material {
width: 68px;
height: 64px;
padding: 5px 4px;
display: flex;
align-items: center;
justify-content: center;
flex-direction: column;
gap: 4px;
border: 2px solid transparent;
box-shadow: none;
background: transparent;
position: relative;
}
.material[aria-pressed='true'] {
border-color: var(--purple);
background: #ede3f8;
}
.material span.swatch {
display: block;
height: 24px;
width: 25px;
border-radius: 4px;
box-shadow:
inset -7px -6px 0 #46365624,
0 2px 0 #46365620;
transform: rotate(-6deg);
}
.material small {
font-size: 9px;
font-weight: 750;
}
.material kbd {
position: absolute;
top: 2px;
right: 4px;
font-size: 8px;
opacity: 0.5;
}
.control-row {
display: flex;
justify-content: space-between;
align-items: center;
width: 100%;
gap: 20px;
}
.dpad {
display: grid;
grid-template-columns: repeat(3, 44px);
grid-template-rows: repeat(2, 42px);
gap: 3px;
}
.dpad button {
padding: 4px;
min-height: 42px;
font-size: 20px;
background: #fffaf7ca;
touch-action: none;
}
.dpad button:first-child {
grid-column: 2;
}
.dpad button:nth-child(2) {
grid-row: 2;
grid-column: 1;
}
.dpad button:nth-child(3) {
grid-row: 2;
grid-column: 2;
}
.dpad button:nth-child(4) {
grid-row: 2;
grid-column: 3;
}
.build-actions {
display: flex;
gap: 8px;
align-self: flex-end;
padding-bottom: 3px;
}
.build-actions button {
min-height: 51px;
font-size: 16px;
padding: 10px 22px;
}
.erase {
background: #fffaf7db;
}
.overlay {
position: absolute;
inset: 0;
display: flex;
align-items: center;
justify-content: center;
padding: 85px 20px 20px;
background: #dcd7eb25;
backdrop-filter: blur(1px);
}
.panel {
width: min(430px, 100%);
max-height: 100%;
overflow: auto;
border: 2px solid #ffffff;
border-radius: 24px;
background: #fffaf7f5;
box-shadow: 0 18px 70px #53436c25;
padding: 28px;
}
.panel.directory-panel { width: min(650px, 100%); }
.lobby-heading { display: flex; align-items: center; gap: 18px; justify-content: space-between; margin-bottom: 20px; }
.lobby-heading h1 { font-size: 29px; margin: 0; }
.lobby-heading button { flex-shrink: 0; min-height: 46px; }
.directory-heading { display: flex; align-items: center; justify-content: space-between; gap: 12px; }
.panel .directory-heading h2 { font-size: 19px; margin: 0; letter-spacing: -.02em; }
.directory-refresh { min-height: 44px; padding: 8px 12px; font-size: 12px; }
.panel .directory-caption { font-size: 12px; margin: 5px 0 12px; }
.panel .directory-status { font-size: 12px; line-height: 1.5; margin: 8px 0 12px; color: #746484; }
.world-list { display: grid; gap: 8px; margin-bottom: 16px; }
.world-row { display: flex; align-items: center; gap: 12px; padding: 12px; background: #f0eaf5; border: 1px solid #e6dbef; border-radius: 15px; }
.world-emblem { display: grid; place-items: center; background: #b19acb; color: white; width: 38px; height: 38px; border-radius: 10px; font-size: 25px; flex-shrink: 0; }
.world-copy { display: grid; gap: 4px; min-width: 0; flex: 1; }
.world-copy strong { font-size: 14px; line-height: 1.3; overflow-wrap: anywhere; }
.world-copy span { font-size: 11px; color: #746484; }
.world-join { min-width: 58px; min-height: 44px; padding: 8px 12px; flex-shrink: 0; }
.panel .recents-heading { font-size: 12px; margin: 20px 0 8px; }
.listing-control { padding: 14px; background: #f0eaf5; border-radius: 15px; margin: 0 0 18px; }
.listing-control h3 { font-size: 16px; margin: 0 0 8px; }
.panel .listing-control p { font-size: 12px; line-height: 1.5; }
.sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0,0,0,0); white-space: nowrap; border: 0; }
@media (max-width: 550px) {
.lobby-heading { flex-direction: column; align-items: stretch; gap: 12px; }
.lobby-heading h1 { font-size: 27px; }
.world-row { gap: 8px; padding: 10px; }
.world-emblem { display: none; }
}
.stamp {
display: inline-block;
color: #8864af;
letter-spacing: 0.13em;
font-size: 10px;
font-weight: 850;
margin-bottom: 10px;
}
.panel h1,
.panel h2 {
font-size: 33px;
line-height: 1.06;
letter-spacing: -0.035em;
margin: 0 0 13px;
font-weight: 850;
}
.panel p {
font-size: 13px;
line-height: 1.65;
color: #796782;
margin: 8px 0 19px;
}
.panel label {
display: block;
font-size: 11px;
font-weight: 750;
margin-bottom: 7px;
}
.panel input {
width: 100%;
min-height: 45px;
border: 1px solid #d4c8df;
border-radius: 10px;
background: #fff;
color: var(--ink);
padding: 10px 12px;
user-select: text;
margin-bottom: 12px;
font-size: 14px;
}
.panel input.code {
font:
11px ui-monospace,
monospace;
}
.panel textarea.code {
width: 100%;
margin-top: 10px;
padding: 10px;
border: 1px solid #d4c8df;
border-radius: 8px;
resize: vertical;
font: 10px ui-monospace, monospace;
user-select: text;
}
.panel details { font-size: 11px; line-height: 1.5; }
.panel summary { cursor: pointer; }
.panel .recovery-consent { display: flex; align-items: flex-start; gap: 10px; line-height: 1.5; }
.panel .recovery-consent input { width: 22px; min-height: 22px; flex-shrink: 0; }
.panel .wide {
width: 100%;
margin-bottom: 10px;
}
.panel .secondary-row {
display: flex;
gap: 8px;
}
.secondary-row button {
flex: 1;
font-size: 12px;
}
.panel .footnote {
font-size: 10px;
line-height: 1.6;
margin: 14px 0 0;
}
.panel .close {
float: right;
width: 36px;
min-height: 36px;
padding: 4px;
font-size: 20px;
}
.panel .recent {
display: flex;
width: 100%;
margin-top: 8px;
text-align: left;
justify-content: space-between;
font-size: 12px;
}
.panel .error {
color: #a84663;
font-size: 12px;
white-space: pre-wrap;
}
.help-grid {
display: grid;
grid-template-columns: 95px 1fr;
gap: 10px;
font-size: 12px;
line-height: 1.6;
}
.help-grid b {
color: #7657a8;
}
.toast {
position: absolute;
left: 50%;
top: 28%;
transform: translateX(-50%);
background: #463656ef;
color: #fff;
padding: 12px 19px;
border-radius: 13px;
box-shadow: 0 5px 20px #46365622;
font-size: 12px;
max-width: 85%;
text-align: center;
pointer-events: none;
z-index: 5;
}
.tiny {
display: none;
}
.world-chip span:nth-child(2) {
min-width: 0;
}
input::placeholder {
color: #ac9bb6;
}
button.linkish {
box-shadow: none;
background: transparent;
border: none;
color: #8864af;
font-size: 12px;
text-decoration: underline;
}
.warning {
color: #a84663 !important;
}
@media (min-width: 1000px) and (min-height: 650px) {
.bottom {
bottom: 28px;
}
.panel {
padding: 34px;
}
.panel h1 {
font-size: 39px;
}
.materials {
padding: 10px;
}
.material {
width: 75px;
height: 70px;
}
}
@media (max-width: 600px) {
header.hud {
top: 10px;
left: 10px;
right: 10px;
gap: 5px;
}
.world-chip {
max-width: 58%;
gap: 7px;
padding: 8px;
font-size: 11px;
}
.world-chip small {
font-size: 9px;
}
.logo {
width: 28px;
height: 32px;
font-size: 25px;
}
.pill {
font-size: 9px;
padding: 8px;
letter-spacing: 0;
}
.top-right {
gap: 5px;
}
.top-right .pill {
position: absolute;
top: 100px;
left: 2px;
max-width: calc(100% - 65px);
}
.save-pill {
top: 77px;
left: 12px;
font-size: 10px;
}
.zoom {
right: 10px;
top: 76px;
flex-direction: column;
}
.zoom button {
min-height: 36px;
height: 36px;
width: 36px;
}
.bottom {
bottom: max(12px, env(safe-area-inset-bottom));
width: calc(100% - 20px);
gap: 8px;
}
.materials {
gap: 1px;
padding: 5px;
width: 100%;
justify-content: center;
border-radius: 14px;
}
.material {
width: calc(100% / 6);
height: 58px;
min-width: 0;
}
.material small {
font-size: 8px;
}
.material kbd {
display: none;
}
.hint {
font-size: 10px;
padding: 6px 10px;
}
.control-row {
gap: 8px;
}
.build-actions {
gap: 5px;
}
.build-actions button {
padding: 10px 12px;
font-size: 13px;
min-width: 60px;
}
.dpad {
grid-template-columns: repeat(3, 44px);
grid-template-rows: repeat(2, 44px);
gap: 2px;
}
.dpad button {
min-height: 44px;
}
.overlay {
padding: 80px 13px 14px;
}
.panel {
padding: 21px;
border-radius: 19px;
}
.panel h1,
.panel h2 {
font-size: 30px;
}
.panel p {
font-size: 12px;
}
.panel .footnote {
font-size: 9px;
}
.hint {
max-width: 100%;
white-space: normal;
text-align: center;
}
.panel .secondary-row {
gap: 5px;
}
.secondary-row button {
padding: 9px;
font-size: 11px;
}
}
@media (max-height: 470px) and (min-width: 600px) {
header.hud {
top: 8px;
}
.world-chip {
padding: 6px 10px;
}
.world-chip small {
display: none;
}
.logo {
height: 30px;
}
.save-pill {
top: 65px;
}
.bottom {
bottom: 10px;
width: calc(100% - 40px);
}
.materials {
position: absolute;
bottom: 0;
left: 50%;
transform: translateX(-50%);
padding: 4px;
}
.material {
width: 51px;
height: 54px;
}
.control-row {
align-items: end;
}
.hint {
display: none;
}
.zoom {
top: 70px;
}
.overlay {
padding: 65px 15px 10px;
}
.panel {
padding: 16px 25px;
}
.panel h1 {
font-size: 27px;
}
.panel p {
margin-bottom: 10px;
}
.dpad {
grid-template-columns: repeat(3, 44px);
}
.build-actions {
flex-direction: column;
gap: 5px;
}
.build-actions button {
min-height: 44px;
padding: 6px 13px;
}
}
@media (max-width: 299px), (max-height: 339px) {
.tiny {
display: flex;
position: absolute;
inset: 0;
z-index: 20;
background: #ebe5f6ef;
padding: 20px;
align-items: center;
justify-content: center;
flex-direction: column;
gap: 10px;
text-align: center;
}
.tiny b {
font-size: 15px;
}
.tiny span {
font-size: 11px;
line-height: 1.5;
}
.hud,
.overlay,
#playHud {
visibility: hidden;
}
}
@media (prefers-reduced-motion: reduce) {
* {
transition: none !important;
}
}
