Новогодняя беседка
Сообщений 121 страница 140 из 156
Поделиться121Пт, 12 Дек 2025 04:49:54
кхх, человек вон уже весь дизайн доделал, а мне еще мобилку тыкать. Время адски потупить в выходные!
Поделиться122Пт, 12 Дек 2025 05:49:47
кхх, человек вон уже весь дизайн доделал, а мне еще мобилку тыкать. Время адски потупить в выходные!
Вытащили ссылку или чисто скринкастом/скринами удовлетворились?
еще прикол расскажу
Отредактировано Амираль (Пт, 12 Дек 2025 05:51:24)
Поделиться123Пт, 12 Дек 2025 05:52:53
еще прикол расскажу
прекрасно ))
Не, скринами только )
Поделиться124Пт, 12 Дек 2025 06:19:07
Wilhelm
ну, лайк за наводку я уже бахнула, но озвучу спасибо еще раз, я реально почти пошла искать иконки, которые можно скейлить нормально)0)
А тут прям собраны в шрифт и прям с контентами, прекрасно же
Отредактировано Амираль (Пт, 12 Дек 2025 06:21:11)
Поделиться125Сб, 13 Дек 2025 23:06:04
Натягивалось на существующий или у кого-то есть пачка скриптов для мока данных?)
м? )
Серединка на половинку. База была давно, но сейчас перебрал ее снова, потому что надо сломать то, что работает и на что не дышишь.
Поделиться126Сб, 13 Дек 2025 23:27:12
м? )
Серединка на половинку. База была давно, но сейчас перебрал ее снова, потому что надо сломать то, что работает и на что не дышишь.А что там со станицами не так должно быть? О,о
подвохи случаются если забыть про ее существование)0)
Поделиться127Сб, 13 Дек 2025 23:31:19
Я вообще нагло и беспринципно вдохновлялась ямаркетом кста 
Наверное можно вдохновиться до конца и иконки тоже сделать с поясняющим текстом
Для полноты сходства не хватает только название форума на строку поиска заменить, но это в рамках текущих не представляется возможным, ы
Поделиться128Сб, 13 Дек 2025 23:32:40
подвохи случаются если забыть про ее существование)0)
пхх, это про отсутствие в профиле ul на страничке ответа? )) Да! Безобразие! 
Поделиться129Сб, 13 Дек 2025 23:35:47
пхх, это про отсутствие в профиле ul на страничке ответа? )) Да! Безобразие!
Там бывают еще приколы, но тут они не так сыграют)0)
Поделиться130Сб, 13 Дек 2025 23:38:49
м? )
Серединка на половинку. База была давно, но сейчас перебрал ее снова, потому что надо сломать то, что работает и на что не дышишь.
А насчет этого пункта - я про кучу пользаков в посетивших например. Собсно, вопрос - натягивалось на существующий форум с активностью или оно радостно мокается скриптами на пустой песочнице?
Если второе - вроде ультра полезная штука чтобы пошарить ну или я упорюсь и свой такой же костыль жахну, потому что руками делать те же новые соо утомляет
Поделиться131Сб, 13 Дек 2025 23:40:32
А насчет этого пункта - я про кучу пользаков в посетивших например. Собсно, вопрос - натягивалось на существующий форум с активностью или оно радостно мокается скриптами на пустой песочнице?
А! Просто скопировал кусок кода с посетителями с живого форума и через отладчик прилепил на тестовый пустой форум ради скриншота )
Поделиться132Сб, 13 Дек 2025 23:41:55
А! Просто скопировал кусок кода с посетителями с живого форума и через отладчик прилепил на тестовый пустой форум ради скриншота )
Пон, налеплю мокалку наверн)0)
Поделиться133Вс, 14 Дек 2025 00:47:14
@Alex_63 Хз куда отнести вопрос - а нет вайба флаги о включенных скриптах от сервиса куда-нибудь вынести в переменные JS? Ну там в FORUM.serviceScriptsState или в что-нибудь подобное? window и FORUM прошерстила, вроде не нашла
А то я по приколу начала лепить мокалку, начала с ЛС и сходу пострадала от того, что надо, блэт, по верстке определять, был ли включен ваш скрипт простых уведомлений о ЛС или нет)0))
Код:const hasServicePmNotificationScript = !!document.querySelector(`script[src^="${ScriptsURL}/pm_notify/"]`);
Поделиться134Вс, 14 Дек 2025 00:55:52
Амираль
Хм, подумаю над этим. Нет, таких флагов сейчас нет. На самом деле, это далеко не единственная ситуация на форумах, когда приходится костыльными способами определять что-либо. Правда, и фатального ничего в этом не вижу, по крайней мере пока такое определение не требует дополнительных паразитных запросов к серверу (такие ситуации тоже встречаются, к сожалению) и вообще в том или ином виде реализуемо. Но соглашусь, что в перспективе надо бы что-то с этим сделать )
Поделиться135Вс, 14 Дек 2025 00:59:11
Амираль
Хм, подумаю над этим. Нет, таких флагов сейчас нет. На самом деле, это далеко не единственная ситуация на форумах, когда приходится костыльными способами определять что-либо. Правда, и фатального ничего в этом не вижу, по крайней мере пока такое определение не требует дополнительных паразитных запросов к серверу (такие ситуации тоже встречаются, к сожалению) и вообще в том или ином виде реализуемо. Но соглашусь, что в перспективе надо бы что-то с этим сделать )
Проблема в том, что при изменении структуры хранения сервисных скриптов (например, при увозе из папки pm_notify) - оно радостно ляжет). Ну точнее станет думать, что скрипта от сервиса нет)
Но при использовании конца ссылки - я вообще не уверена
а) что мне не попадется сторонний скрипт, лежащий где-нибудь на ftp, под названием, совпадающим с pm-notify (это лечится, если юзать и начало и конец, просто в начале юзать чисто скриптсурл)
б) что вы однажды не переименуете файл с теми же последствиями, что и в варианте с началом ссылки)0)
Отредактировано Амираль (Вс, 14 Дек 2025 01:01:11)
Поделиться136Вс, 14 Дек 2025 07:15:41
Амираль
Учитывая что с 2016 года ничего из этого ни разу не случалось (а прошло уже почти 10 лет) и в обозримом будущем не ожидается, можно считать, что вариант достаточно стабильный ) Этак и название флага может по какой-то причине смениться или куда-то переехать.
Поделиться137Ср, 17 Дек 2025 19:24:52
Насколько я упоротая если вместо того, чтобы экспериментировать с панелью разраба я забахала вот такую дичь, есть информация?
(Ну и бонусом иллюстрирую, что с подбором цветов у меня все плохо и это нечитабельно)
[html]<style>
h1 {display: block;}
#pallets-container textarea {
width: 100%;
height: 9em;
}
.combinations {
display: grid;
grid-template-columns: 300px 1fr;
gap: 8px;
}
.example{
padding: 0.5em;
}
.colors {
display: flex;
gap: 8px;
flex-wrap: wrap;
}
</style>
<form id="colors-array-form">
<div id="pallets-container">
</div>
</form><script>(() => {
const initialPallets = [
{header: 'Палитра светлая', colors: [
{color:'#f7e2d2', name:'punbb-color'},
{color: '#aea0a0', name: 'body-color'},
{color: '#15191c', name: 'text-color'},
{color: '#576072', name: 'soft-text-color'},
{color: '#ad6648', name: 'accent-color'},
]},
{header: 'Палитра темная', colors: [
{color:'#5e5853', name:'punbb-color'},
{color: '#2e2828', name: 'body-color'},
{color: '#cfe1ef', name: 'text-color'},
{color: '#9faecd', name: 'soft-text-color'},
{color: '#ad6648', name: 'accent-color'},
]},
];
const palletsContainer = document.querySelector("#pallets-container");
const form = document.querySelector("#colors-array-form");const getColorKeysByPalletIndex = (index) => [...(new FormData(form)).keys()].filter((key) => key.startsWith(`pallet-${index}`));
const refreshPalletCode = (palletIndex) => {
const colorKeys = getColorKeysByPalletIndex(palletIndex);
const variablesElement = document.querySelector(`#pallet-${palletIndex}-variables`);
const variablesContent = colorKeys.map((key) => ['--' + form.querySelector(`#${key}`).labels[0].innerText, document.documentElement.style.getPropertyValue(`--${key}`)].join(': ') + ';').join('\n');
variablesElement.value = `:root\{
${variablesContent }
\}`;
};form.addEventListener('input', (e) => {
document.documentElement.style.setProperty(`--${e.target.id}`, e.target.value);
const palletIndex = +e.target.id.split('-')[1];
refreshPalletCode(palletIndex);
});if (!form || !palletsContainer) return;
const refreshPalletExamples = (palletIndex) => {
const colorKeys = getColorKeysByPalletIndex(palletIndex);const combinations = document.querySelector(`#pallet-${palletIndex}-combinations`);
combinations.replaceChildren();
const styleMarkup = colorKeys.map((colorKey) => `
.${colorKey}-bg{background: var(--${colorKey});}
.${colorKey}-c{color: var(--${colorKey});}
`).join('');
combinations.insertAdjacentHTML('afterbegin', `<style>${styleMarkup}</style>`);refreshPalletCode(palletIndex);
colorKeys.forEach((bgColorPrefix, bgIndex) => {
colorKeys.forEach((colorPrefix, index) => {
if (index === bgIndex) {return;}
combinations.insertAdjacentHTML('beforeend', `
<div class="${bgColorPrefix}-bg ${colorPrefix}-c example">Пример текста</div>
<div>Пример текста цвета <span class="highlight-text">${form.querySelector(`#${colorPrefix}`).labels[0].innerText}</span> на фоне цвета <span class="highlight-text">${form.querySelector(`#${bgColorPrefix}`).labels[0].innerText}</span></div>
`);
});
});
};const createColor = (colorObject, colorIndex, palletIndex, palletContainer) => {
const field = `pallet-${palletIndex}-color-${colorIndex}`;
const {color, name = `color-${colorIndex}`} = (colorObject ? colorObject : {});
document.documentElement.style.setProperty(`--${field}`, color);
const wrapper = document.createElement('div');const label = document.createElement('label');
label.htmlFor = field;
label.innerText = name;
wrapper.append(label);const input = document.createElement('input');
input.type = 'color';
input.name = field;
input.value = color;
input.id = field;
wrapper.append(input);const remover = document.createElement('button');
remover.innerText = 'x';
remover.addEventListener('click', (e) => {
e.preventDefault();
wrapper.remove();
refreshPalletExamples(palletIndex);
});
wrapper.append(remover);
palletContainer.append(wrapper);
};const createPallet = (pallet, index) => {
const {header='Палитра', colors=[]} = (pallet ? pallet : {});
const wrapper = document.createElement('div');const palletHeader = document.createElement('h2');
palletHeader.innerText = header;
wrapper.append(palletHeader);const colorsContainer = document.createElement('div');
colorsContainer.id = `pallet-${index}-colors`;
colorsContainer.classList.add('colors');const addColorButton = document.createElement('button');
addColorButton.innerText = 'Добавить цвет в палитру';
addColorButton.addEventListener('click', (e) => {
e.preventDefault();
const colorsKeys = getColorKeysByPalletIndex(index);
const indicies = colorsKeys.map((key) => +key.split('-').at(-1));
const nextColorIndex = Math.max(...indicies) + 1;
createColor({color: '#000000'}, nextColorIndex, index, colorsContainer);
refreshPalletExamples(index);
});
wrapper.append(addColorButton);wrapper.append(colorsContainer);
const colorsCode = document.createElement('textarea');
colorsCode.id = `pallet-${index}-variables`;
wrapper.append(colorsCode);
const combinationsContainer = document.createElement('div');
combinationsContainer.classList.add('combinations');
combinationsContainer.id = `pallet-${index}-combinations`;
wrapper.append(combinationsContainer);colors.forEach((color, colorIndex) => createColor(color, colorIndex, index, colorsContainer));
palletsContainer.append(wrapper);
refreshPalletExamples(index);
};const init = (pallets) => {
pallets.forEach(createPallet);
};init(initialPallets);
})()
</script>[/html]Если есть желание стащить к себеКод:<style> h1 {display: block;} #pallets-container textarea { width: 100%; height: 9em; } .combinations { display: grid; grid-template-columns: 300px 1fr; gap: 8px; } .example{ padding: 0.5em; } .colors { display: flex; gap: 8px; flex-wrap: wrap; } </style> <form id="colors-array-form"> <div id="pallets-container"> </div> </form> <script>(() => { const initialPallets = [ {header: 'Палитра светлая', colors: [ {color:'#f7e2d2', name:'punbb-color'}, {color: '#aea0a0', name: 'body-color'}, {color: '#15191c', name: 'text-color'}, {color: '#576072', name: 'soft-text-color'}, {color: '#ad6648', name: 'accent-color'}, ]}, {header: 'Палитра темная', colors: [ {color:'#5e5853', name:'punbb-color'}, {color: '#2e2828', name: 'body-color'}, {color: '#cfe1ef', name: 'text-color'}, {color: '#9faecd', name: 'soft-text-color'}, {color: '#ad6648', name: 'accent-color'}, ]}, ]; const palletsContainer = document.querySelector("#pallets-container"); const form = document.querySelector("#colors-array-form"); const getColorKeysByPalletIndex = (index) => [...(new FormData(form)).keys()].filter((key) => key.startsWith(`pallet-${index}`)); const refreshPalletCode = (palletIndex) => { const colorKeys = getColorKeysByPalletIndex(palletIndex); const variablesElement = document.querySelector(`#pallet-${palletIndex}-variables`); const variablesContent = colorKeys.map((key) => ['--' + form.querySelector(`#${key}`).labels[0].innerText, document.documentElement.style.getPropertyValue(`--${key}`)].join(': ') + ';').join('\n'); variablesElement.value = `:root\{ ${variablesContent } \}`; }; form.addEventListener('input', (e) => { document.documentElement.style.setProperty(`--${e.target.id}`, e.target.value); const palletIndex = +e.target.id.split('-')[1]; refreshPalletCode(palletIndex); }); if (!form || !palletsContainer) return; const refreshPalletExamples = (palletIndex) => { const colorKeys = getColorKeysByPalletIndex(palletIndex); const combinations = document.querySelector(`#pallet-${palletIndex}-combinations`); combinations.replaceChildren(); const styleMarkup = colorKeys.map((colorKey) => ` .${colorKey}-bg{background: var(--${colorKey});} .${colorKey}-c{color: var(--${colorKey});} `).join(''); combinations.insertAdjacentHTML('afterbegin', `<style>${styleMarkup}</style>`); refreshPalletCode(palletIndex); colorKeys.forEach((bgColorPrefix, bgIndex) => { colorKeys.forEach((colorPrefix, index) => { if (index === bgIndex) {return;} combinations.insertAdjacentHTML('beforeend', ` <div class="${bgColorPrefix}-bg ${colorPrefix}-c example">Пример текста</div> <div>Пример текста цвета <span class="highlight-text">${form.querySelector(`#${colorPrefix}`).labels[0].innerText}</span> на фоне цвета <span class="highlight-text">${form.querySelector(`#${bgColorPrefix}`).labels[0].innerText}</span></div> `); }); }); }; const createColor = (colorObject, colorIndex, palletIndex, palletContainer) => { const field = `pallet-${palletIndex}-color-${colorIndex}`; const {color, name = `color-${colorIndex}`} = (colorObject ? colorObject : {}); document.documentElement.style.setProperty(`--${field}`, color); const wrapper = document.createElement('div'); const label = document.createElement('label'); label.htmlFor = field; label.innerText = name; wrapper.append(label); const input = document.createElement('input'); input.type = 'color'; input.name = field; input.value = color; input.id = field; wrapper.append(input); const remover = document.createElement('button'); remover.innerText = 'x'; remover.addEventListener('click', (e) => { e.preventDefault(); wrapper.remove(); refreshPalletExamples(palletIndex); }); wrapper.append(remover); palletContainer.append(wrapper); }; const createPallet = (pallet, index) => { const {header='Палитра', colors=[]} = (pallet ? pallet : {}); const wrapper = document.createElement('div'); const palletHeader = document.createElement('h2'); palletHeader.innerText = header; wrapper.append(palletHeader); const colorsContainer = document.createElement('div'); colorsContainer.id = `pallet-${index}-colors`; colorsContainer.classList.add('colors'); const addColorButton = document.createElement('button'); addColorButton.innerText = 'Добавить цвет в палитру'; addColorButton.addEventListener('click', (e) => { e.preventDefault(); const colorsKeys = getColorKeysByPalletIndex(index); const indicies = colorsKeys.map((key) => +key.split('-').at(-1)); const nextColorIndex = Math.max(...indicies) + 1; createColor({color: '#000000'}, nextColorIndex, index, colorsContainer); refreshPalletExamples(index); }); wrapper.append(addColorButton); wrapper.append(colorsContainer); const colorsCode = document.createElement('textarea'); colorsCode.id = `pallet-${index}-variables`; wrapper.append(colorsCode); const combinationsContainer = document.createElement('div'); combinationsContainer.classList.add('combinations'); combinationsContainer.id = `pallet-${index}-combinations`; wrapper.append(combinationsContainer); colors.forEach((color, colorIndex) => createColor(color, colorIndex, index, colorsContainer)); palletsContainer.append(wrapper); refreshPalletExamples(index); }; const init = (pallets) => { pallets.forEach(createPallet); }; init(initialPallets); })() </script>
Отредактировано Амираль (Ср, 17 Дек 2025 20:15:17)
Поделиться138Чт, 18 Дек 2025 01:32:10
Насколько я упоротая
Нинасколько 
У меня юзеры просят сделать кнопку, чтобы в теле комментария можно было менять не только цвет шрифта в словах, но и делать под ними цветную подложку но у меня руки из жо
Поделиться139Чт, 18 Дек 2025 09:50:23
Нинасколько
Цветная тема
У меня юзеры просят сделать кнопку, чтобы в теле комментария можно было менять не только цвет шрифта в словах, но и делать под ними цветную подложку
но у меня руки из жо
Вот такая дичь получится, с точностью до иконокС кнопками сами чето придумайте, их id если что - #button-spanWithBg и #button-blockWithBg
В вверхКод:<script> const showOrCreateColorPicker = (tag, valuePrefix) => { const pickerCandidate = document.querySelector(`[data-tag=${tag}]`); const picker = pickerCandidate ? pickerCandidate : document.createElement('div'); picker.style.display = picker.style.display === 'block' ? 'none' : 'block'; if (picker.parentElement) { return; } picker.dataset.tag = tag; picker.classList.add('container'); document.querySelector('#tags').append(picker); const input = document.createElement('input'); input.type = 'color'; picker.append(input); input.addEventListener('change', (e) => { const value = e.target.value; picker.style.display = 'none'; bbcode(`[${tag}='${valuePrefix}${value}']`, `[/${tag}]`); }) } FORUM.set('editor.spanWithBg', {name: 'Фон надписи', onclick: () => showOrCreateColorPicker('spanWithBg', "background: ")}); FORUM.set('editor.blockWithBg', {name: 'Фон блока', onclick: () => showOrCreateColorPicker('blockWithBg', "background: ")}); </script>В пользовательские теги
Код:spanWithBg[span/style]:ai blockWithBg[div/style]:a
Добавлено спустя 5 минут 44 секунды: Я бы оч хотела, чтобы язык разметки сервисных тегов позволял пихать в конкретные атрибуты style, чтобы запись покомпактнее была, но нет. Можно, конечно, флаг e заюзать и скриптом стиль навешивать ради более компактной записи, но ну нафиг, я лучше чуть более многословный и чуть более гибкий тег оставлю)0)
Добавлено спустя 13 минут 16 секунд: Там еще при желании можно дефолтный колорпикер для текста на эту штуку перевезти довольно тривиально, просто valuePrefix пустой оставить и спилить где-нибудь по дороге дефолтный пикер)0)
Отредактировано Амираль (Чт, 18 Дек 2025 10:03:39)
Похожие темы
| Нужен Новогодний диз. Оплата разумная. | Корзина | Пт, 9 Дек 2011 |
| Беседка | Архив | Чт, 6 Фев 2014 |

