BUR #55774 has been rejected.
create alias sideways -> sideways_(clockwise)
deprecate sideways
I'd like to propose splitting sideways into two tags: sideways_(clockwise) and sideways_(counterclockwise). This would be more precise than combining both under one tag. I think this would be preferable to simply creating those two tags while preserving sideways because it would encourage more accurate tagging, and you could still get both tags at once by searching for sideways_(*clockwise). Sorry if this alias/deprecate thing isn't the correct way to go about this - maybe an alternative could be to make a pool of clockwise posts, then convert it to a tag?
It would also help with the creation of extensions or userscripts to automatically rotate images on the user's end, or generate rotated images with the Download button. I have a feeling sideways is missing from a lot of posts that should have it, these tools could also encourage better tagging.
A tool like this would also be useful for fixing the ~2500 posts that would be incorrectly tagged with this rename. With tag script mode, fixing posts would be relatively easy. Just for a quick proof of concept, here's an example userscript I had Claude generate - it works, although the positions of some thumbnails get shifted around slightly for some reason:
Show
// ==UserScript==
// @name Danbooru Rotate Sideways Thumbnails Clockwise
// @namespace http://tampermonkey.net/
// @version 1.0
// @description Rotates thumbnails on Danbooru search result pages 90 degrees clockwise if they have the "sideways" tag
// @author Claude Sonnet 4.6
// @match https://danbooru.donmai.us/posts?tags=*
// @grant none
// @icon https://danbooru.donmai.us/favicon.ico
// ==/UserScript==
(function () {
'use strict';
function rotateSidewaysThumbnails() {
const articles = document.querySelectorAll('article.post-preview[data-tags]');
for (const article of articles) {
const tags = article.getAttribute('data-tags');
if (!tags) continue;
const tagList = tags.split(' ');
if (!tagList.includes('sideways')) continue;
const img = article.querySelector('img.post-preview-image');
if (!img) continue;
// Skip if already rotated
if (img.dataset.rotated) continue;
img.dataset.rotated = 'true';
const naturalW = img.getAttribute('width');
const naturalH = img.getAttribute('height');
// After 90° CW rotation, width and height swap.
// We use a wrapper to preserve the layout footprint.
const wrapper = document.createElement('div');
wrapper.style.cssText = `
display: inline-block;
width: ${naturalH}px;
height: ${naturalW}px;
overflow: hidden;
position: relative;
`;
img.parentNode.insertBefore(wrapper, img);
wrapper.appendChild(img);
img.style.cssText = `
transform: rotate(90deg) translateY(-100%);
transform-origin: top left;
position: absolute;
top: 0;
left: 0;
`;
}
}
// Run on initial load
rotateSidewaysThumbnails();
// Re-run if Danbooru dynamically loads more posts (infinite scroll / AJAX)
const observer = new MutationObserver(() => {
rotateSidewaysThumbnails();
});
observer.observe(document.body, { childList: true, subtree: true });
})();