From 30bab14983c4a43c574cfbeb03c7009c102b8005 Mon Sep 17 00:00:00 2001 From: Ash Logan Date: Fri, 6 Mar 2026 22:33:19 +1100 Subject: [PATCH 1/6] feat(ctr): banners on new post page --- .../src/services/juxt-web/routes/console/communities.tsx | 3 ++- .../src/services/juxt-web/routes/console/posts.tsx | 3 ++- .../src/services/juxt-web/views/ctr/newPostView.tsx | 6 +++--- .../src/services/juxt-web/views/web/newPostView.tsx | 8 ++++---- 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/apps/juxtaposition-ui/src/services/juxt-web/routes/console/communities.tsx b/apps/juxtaposition-ui/src/services/juxt-web/routes/console/communities.tsx index 0df7878e..8a84e77e 100644 --- a/apps/juxtaposition-ui/src/services/juxt-web/routes/console/communities.tsx +++ b/apps/juxtaposition-ui/src/services/juxt-web/routes/console/communities.tsx @@ -135,7 +135,8 @@ communitiesRouter.get('/:communityID/create', async function (req, res) { name: community.name, url: `/posts/new`, show: 'post', - shotMode + shotMode, + community }; res.jsxForDirectory({ ctr: , diff --git a/apps/juxtaposition-ui/src/services/juxt-web/routes/console/posts.tsx b/apps/juxtaposition-ui/src/services/juxt-web/routes/console/posts.tsx index 4472059c..abc0207b 100644 --- a/apps/juxtaposition-ui/src/services/juxt-web/routes/console/posts.tsx +++ b/apps/juxtaposition-ui/src/services/juxt-web/routes/console/posts.tsx @@ -270,7 +270,8 @@ postsRouter.get('/:post_id/create', async function (req, res) { pid: parent.pid, url: `/posts/${parent.id}/new`, show: 'post', - shotMode + shotMode, + community }; res.jsxForDirectory({ ctr: , diff --git a/apps/juxtaposition-ui/src/services/juxt-web/views/ctr/newPostView.tsx b/apps/juxtaposition-ui/src/services/juxt-web/views/ctr/newPostView.tsx index 55f2b80b..cc286103 100644 --- a/apps/juxtaposition-ui/src/services/juxt-web/views/ctr/newPostView.tsx +++ b/apps/juxtaposition-ui/src/services/juxt-web/views/ctr/newPostView.tsx @@ -41,17 +41,17 @@ export function CtrNewPostView(props: NewPostViewProps): ReactNode { const url = useUrl(); const user = useUser(); const cache = useCache(); - const { ctrBanner, ctrLegacy } = props; + const { bannerUrl, legacy } = props.community ? url.ctrHeader(props.community) : {}; const name = props.name ?? cache.getUserName(props.pid ?? 0); return (
-
+
@@ -93,7 +93,18 @@ export function CtrNewPostView(props: NewPostViewProps): ReactNode { {props.shotMode !== 'block' ? ( -
Screenshots are not ready yet. Check back soon!
+
+ +
+ + +
+
+ +
+
+ +
) : null } diff --git a/apps/juxtaposition-ui/webfiles/ctr/css/new-post-view.css b/apps/juxtaposition-ui/webfiles/ctr/css/new-post-view.css index 0358b9f2..8c7e2195 100644 --- a/apps/juxtaposition-ui/webfiles/ctr/css/new-post-view.css +++ b/apps/juxtaposition-ui/webfiles/ctr/css/new-post-view.css @@ -97,8 +97,83 @@ height: 100%; } - #shot-msg { - padding: 5px; + #shot-preview { + float: right; + width: 200px; /* to do */ + height: 120px; + + background-color: lightgray; + background-size: contain; + background-repeat: no-repeat; + background-position: center; + border: 0; + } + + .shot-picker { + display: inline-block; + padding: 4px; + margin: 5px 14px; + border: 1px solid gray; + + position: relative; + border-radius: 2px; + + input { + appearance: none; + display: block; + padding: 0; + margin: 0; + cursor: pointer; + } + + .shot { + margin: auto; + border: 1px solid white; + border-radius: 2px; + + /* background-image set via script */ + background-size: contain; + + height: 50px; /* 48 + border */ + &.top { + /* 400x240px -> 80px + border */ + width: 82px; + } + &.btm { + /* 320x240px -> 64 + border*/ + width: 66px; + } + &:checked { + border: 1px solid #6b3cb5; + } + } + + #shot-clear { + width: 17px; + height: 17px; + position: absolute; + bottom: -4px; /* ^^; */ + right: -9px; + + border-radius: 2px; + border: 1px solid gray; + background: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#dfdfdf)) 0 0; + input { + width: 100%; + height: 100%; + } + } + } + + /* Display: none makes it stop taking focus.. so instead just kinda hide it */ + input[type="file"] { + position: absolute; + top: 0px; + opacity: 0; + /* Small enough to fit */ + width: 10px; + height: 10px; + pointer-events: none; } #memo-img-input { diff --git a/apps/juxtaposition-ui/webfiles/ctr/images/dummy-shot-bottom.jpg b/apps/juxtaposition-ui/webfiles/ctr/images/dummy-shot-bottom.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4d58d0bd4c5e5b0636b8442c5d536d0f9c7eefb0 GIT binary patch literal 11462 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 F|9>9yUJ?KR literal 0 HcmV?d00001 diff --git a/apps/juxtaposition-ui/webfiles/ctr/images/sprites/clear.png b/apps/juxtaposition-ui/webfiles/ctr/images/sprites/clear.png new file mode 100644 index 0000000000000000000000000000000000000000..2fe83ade03f570914f635ff9838c2f2e60e9188d GIT binary patch literal 196 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{VjKx9jPK-BC>eK@{Ea{HEjtmSN z`?>!lvI6-E$sR$z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBDBgTe~DWM4fg&8)O literal 0 HcmV?d00001 diff --git a/apps/juxtaposition-ui/webfiles/ctr/js/debug.js b/apps/juxtaposition-ui/webfiles/ctr/js/debug.js index 241e42c0..2f69fcf7 100644 --- a/apps/juxtaposition-ui/webfiles/ctr/js/debug.js +++ b/apps/juxtaposition-ui/webfiles/ctr/js/debug.js @@ -550,9 +550,9 @@ if (typeof cave === 'undefined') { console.log('cave.getPath(' + key + ')'); var value = localStorage.getItem(key); if (value == 0) { - return '/img/dummy-image/screenshot-dummy-3ds-low.jpeg'; + return '/images/dummy-shot-bottom.jpg'; } else { - return '/img/dummy-image/screenshot-dummy-3ds-upper.jpeg'; + return '/images/dummy-shot-top.jpg'; } }, /** diff --git a/apps/juxtaposition-ui/webfiles/ctr/js/new-post-view.ts b/apps/juxtaposition-ui/webfiles/ctr/js/new-post-view.ts index 93a80aa5..22b8728c 100644 --- a/apps/juxtaposition-ui/webfiles/ctr/js/new-post-view.ts +++ b/apps/juxtaposition-ui/webfiles/ctr/js/new-post-view.ts @@ -27,13 +27,69 @@ export function initNewPostView(): void { memo_image.addEventListener('click', delayedMemo); ctabOnShown(ctab, 'painting', delayedMemo); + initScreenshotControl(page, ctab); +} + +function initScreenshotControl(page: Element, ctab: Element): void { // screenshots var shot_tab = page.querySelector('[data-shot-mode]') as HTMLElement | null; - if (shot_tab !== null) { - var shotMode = shot_tab.getAttribute('data-shot-mode')!; - // Hide on game's request - if (shotMode === 'allow' && !cave.capture_isEnabled()) { - shot_tab.style.display = 'none'; - } + if (shot_tab === null) { + return; } + var shotMode = shot_tab.getAttribute('data-shot-mode')!; + // Hide on game's request + if (shotMode === 'allow' && !cave.capture_isEnabled()) { + shot_tab.style.display = 'none'; + return; + } + + // input type file + var shotUpload = page.querySelector('[data-shot-upload]') as HTMLInputElement; + // radios + var shots = page.querySelectorAll('[data-shot]') as NodeListOf; + var shotClear = page.querySelector('[data-shot-clear]') as HTMLInputElement; + // preview + var shotPreview = page.querySelector('[data-shot-preview]') as HTMLImageElement; + + // top/bottom screen picker + function pickShot(e: Event): void { + var me = e.currentTarget as HTMLInputElement; + var lls = me.getAttribute('data-lls')!; + + shotPreview.style.backgroundImage = `url(${cave.lls_getPath(lls)})`; + shotUpload.setAttribute('lls', lls); + } + shots.forEach(s => s.addEventListener('change', pickShot)); + + // has to be enabled at submission + page.addEventListener('submit', () => { + // Fidget with disabled to keep it out of the D-pad navigation + shotUpload.disabled = false; + shotUpload.focus(); + shotUpload.click(); + shotUpload.blur(); + }); + + // reset/clear button + shotClear.addEventListener('change', () => { + shotPreview.style.backgroundImage = ''; + shotUpload.removeAttribute('lls'); + shotUpload.value = ''; + }); + + // actually populate the images after page load (laggy) + function shot(e: Event): void { + shots.forEach((s) => { + var num = parseInt(s.getAttribute('data-shot')!); + var lls = s.getAttribute('data-lls')!; + + cave.lls_setCaptureImage(lls, num); + s.style.backgroundImage = `url(${cave.lls_getPath(lls)})`; + }); + + // no need to call more than once per load + e.currentTarget?.removeEventListener(e.type, shot); + } + + ctabOnShown(ctab, 'shot', shot); } diff --git a/apps/miiverse-api/src/images.ts b/apps/miiverse-api/src/images.ts index f7cd1812..8fab8ff0 100644 --- a/apps/miiverse-api/src/images.ts +++ b/apps/miiverse-api/src/images.ts @@ -220,12 +220,14 @@ export type ScreenshotUrls = { }; export type UploadScreenshotOptions = { + buffer?: Buffer; blob: string; pid: number; postId: string; }; export async function uploadScreenshot(opts: UploadScreenshotOptions): Promise { - const screenshotBuf = Buffer.from(opts.blob.replace(/\0/g, '').trim(), 'base64'); + // try buffer, otherwise blob + const screenshotBuf = opts.buffer ?? Buffer.from(opts.blob.replace(/\0/g, '').trim(), 'base64'); const screenshots = processJpgScreenshot(screenshotBuf); if (screenshots === null) { return null; From 14e00a636cbdb5a57fc95745946504abed847d76 Mon Sep 17 00:00:00 2001 From: Ash Logan Date: Tue, 10 Mar 2026 11:28:46 +1100 Subject: [PATCH 5/6] fix(ctr): unused to do comment --- apps/juxtaposition-ui/webfiles/ctr/css/new-post-view.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/juxtaposition-ui/webfiles/ctr/css/new-post-view.css b/apps/juxtaposition-ui/webfiles/ctr/css/new-post-view.css index 8c7e2195..36c50713 100644 --- a/apps/juxtaposition-ui/webfiles/ctr/css/new-post-view.css +++ b/apps/juxtaposition-ui/webfiles/ctr/css/new-post-view.css @@ -97,9 +97,9 @@ height: 100%; } - #shot-preview { + #shot-preview { float: right; - width: 200px; /* to do */ + width: 200px; height: 120px; background-color: lightgray; From a47f6c37f102e0b4821aa3ae4f20c01e00a17a67 Mon Sep 17 00:00:00 2001 From: Ash Logan Date: Tue, 10 Mar 2026 11:32:11 +1100 Subject: [PATCH 6/6] fix(ctr): use self-closing tags --- .../src/services/juxt-web/views/ctr/newPostView.tsx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/juxtaposition-ui/src/services/juxt-web/views/ctr/newPostView.tsx b/apps/juxtaposition-ui/src/services/juxt-web/views/ctr/newPostView.tsx index db19d1e9..40095c0f 100644 --- a/apps/juxtaposition-ui/src/services/juxt-web/views/ctr/newPostView.tsx +++ b/apps/juxtaposition-ui/src/services/juxt-web/views/ctr/newPostView.tsx @@ -96,15 +96,15 @@ export function CtrNewPostView(props: NewPostViewProps): ReactNode {

- - + +
-
- +
+
- + ) : null }