Единый форум поддержки

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Единый форум поддержки » Комната отдыха » Новогодняя беседка


Новогодняя беседка

Сообщений 121 страница 140 из 156

1

С наступающим новым годом.
Скоро наступит год лошади.
Кто как готовится?https://upforme.ru/uploads/0000/14/1c/14430/t825059.png

+7

121

кхх, человек вон уже весь дизайн доделал, а мне еще мобилку тыкать. Время адски потупить в выходные!

0

122

Wilhelm написал(а):

кхх, человек вон уже весь дизайн доделал, а мне еще мобилку тыкать. Время адски потупить в выходные!

Вытащили ссылку или чисто скринкастом/скринами удовлетворились?:D
еще прикол расскажу
https://i2.imageban.ru/out/2025/12/12/078fa530bb33be6d26e25b1b68af95fa.png

Отредактировано Амираль (Пт, 12 Дек 2025 05:51:24)

+1

123

Амираль написал(а):

еще прикол расскажу

прекрасно ))

Не, скринами только )

0

124

Wilhelm
ну, лайк за наводку я уже бахнула, но озвучу спасибо еще раз, я реально почти пошла искать иконки, которые можно скейлить нормально)0)
А тут прям собраны в шрифт и прям с контентами, прекрасно же

Отредактировано Амираль (Пт, 12 Дек 2025 06:21:11)

+1

125

Амираль написал(а):

Натягивалось на существующий или у кого-то есть пачка скриптов для мока данных?)

м? )
Серединка на половинку. База была давно, но сейчас перебрал ее снова, потому что надо сломать то, что работает и на что не дышишь.

А что там со станицами не так должно быть? О,о

0

126

Wilhelm написал(а):

м? )
Серединка на половинку. База была давно, но сейчас перебрал ее снова, потому что надо сломать то, что работает и на что не дышишь.

А что там со станицами не так должно быть? О,о

подвохи случаются если забыть про ее существование)0)

0

127

Я вообще нагло и беспринципно вдохновлялась ямаркетом кста :D
Наверное можно вдохновиться до конца и иконки тоже сделать с поясняющим текстом
Для полноты сходства не хватает только название форума на строку поиска заменить, но это в рамках текущих не представляется возможным, ы

0

128

Амираль написал(а):

подвохи случаются если забыть про ее существование)0)

пхх, это про отсутствие в профиле ul на страничке ответа? ))  Да! Безобразие!  https://s5.uploads.ru/AZIWs.png

+1

129

Wilhelm написал(а):

пхх, это про отсутствие в профиле ul на страничке ответа? ))  Да! Безобразие!  https://s5.uploads.ru/AZIWs.png

Там бывают еще приколы, но тут они не так сыграют)0)

0

130

Wilhelm написал(а):

м? )
Серединка на половинку. База была давно, но сейчас перебрал ее снова, потому что надо сломать то, что работает и на что не дышишь.

А насчет этого пункта - я про кучу пользаков в посетивших например. Собсно, вопрос - натягивалось на существующий форум с активностью или оно радостно мокается скриптами на пустой песочнице?
Если второе - вроде ультра полезная штука чтобы пошарить ну или я упорюсь и свой такой же костыль жахну, потому что руками делать те же новые соо утомляет

0

131

Амираль написал(а):

А насчет этого пункта - я про кучу пользаков в посетивших например. Собсно, вопрос - натягивалось на существующий форум с активностью или оно радостно мокается скриптами на пустой песочнице?

А! Просто скопировал кусок кода с посетителями с живого форума и через отладчик прилепил на тестовый пустой форум ради скриншота )

0

132

Wilhelm написал(а):

А! Просто скопировал кусок кода с посетителями с живого форума и через отладчик прилепил на тестовый пустой форум ради скриншота )

Пон, налеплю мокалку наверн)0)

+1

133

@Alex_63 Хз куда отнести вопрос - а нет вайба флаги о включенных скриптах от сервиса куда-нибудь вынести в переменные JS? Ну там в FORUM.serviceScriptsState или в что-нибудь подобное? window и FORUM прошерстила, вроде не нашла
А то я по приколу начала лепить мокалку, начала с ЛС и сходу пострадала от того, что надо, блэт, по верстке определять, был ли включен ваш скрипт простых уведомлений о ЛС или нет)0))

Я испытываю кринж, определяя наличие скрипта вот так
Код:
const hasServicePmNotificationScript = !!document.querySelector(`script[src^="${ScriptsURL}/pm_notify/"]`);

+2

134

Амираль
Хм, подумаю над этим. Нет, таких флагов сейчас нет. На самом деле, это далеко не единственная ситуация на форумах, когда приходится костыльными способами определять что-либо. Правда, и фатального ничего в этом не вижу, по крайней мере пока такое определение не требует дополнительных паразитных запросов к серверу (такие ситуации тоже встречаются, к сожалению) и вообще в том или ином виде реализуемо. Но соглашусь, что в перспективе надо бы что-то с этим сделать )

0

135

Alex_63 написал(а):

Амираль
Хм, подумаю над этим. Нет, таких флагов сейчас нет. На самом деле, это далеко не единственная ситуация на форумах, когда приходится костыльными способами определять что-либо. Правда, и фатального ничего в этом не вижу, по крайней мере пока такое определение не требует дополнительных паразитных запросов к серверу (такие ситуации тоже встречаются, к сожалению) и вообще в том или ином виде реализуемо. Но соглашусь, что в перспективе надо бы что-то с этим сделать )

Проблема в том, что при изменении структуры хранения сервисных скриптов (например, при увозе из папки pm_notify) - оно радостно ляжет). Ну точнее станет думать, что скрипта от сервиса нет)
Но при использовании конца ссылки - я вообще не уверена
а) что мне не попадется сторонний скрипт, лежащий где-нибудь на ftp, под названием, совпадающим с pm-notify (это лечится, если юзать и начало и конец, просто в начале юзать чисто скриптсурл)
б) что вы однажды не переименуете файл с теми же последствиями, что и в варианте с началом ссылки)0)

Отредактировано Амираль (Вс, 14 Дек 2025 01:01:11)

0

136

Амираль
Учитывая что с 2016 года ничего из этого ни разу не случалось (а прошло уже почти 10 лет) и в обозримом будущем не ожидается, можно считать, что вариант достаточно стабильный ) Этак и название флага может по какой-то причине смениться или куда-то переехать.

+1

137

Насколько я упоротая если вместо того, чтобы экспериментировать с панелью разраба я забахала вот такую дичь, есть информация?
(Ну и бонусом иллюстрирую, что с подбором цветов у меня все плохо и это нечитабельно)

Осторожно длинная штуковина

[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)

+2

138

Амираль написал(а):

Насколько я упоротая

Нинасколько :)

Цветная тема

https://upforme.ru/uploads/0000/14/1c/38891/798187.webp

У меня юзеры просят сделать кнопку, чтобы в теле комментария можно было менять не только цвет шрифта в словах, но и делать под ними цветную подложку  но у меня руки из жо

0

139

Merlin777 написал(а):

Нинасколько :)

Цветная тема

https://upforme.ru/uploads/0000/14/1c/38891/798187.webp

У меня юзеры просят сделать кнопку, чтобы в теле комментария можно было менять не только цвет шрифта в словах, но и делать под ними цветную подложку  но у меня руки из жо

Наваяла по приколу
Вот такая дичь получится, с точностью до иконок

С кнопками сами чето придумайте, их 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)

+1

140

С наступающим новым годом.
Скоро наступит год лошади.
Кто как готовится?

https://upforme.ru/uploads/0000/14/1c/14430/t825059.png

+2


Вы здесь » Единый форум поддержки » Комната отдыха » Новогодняя беседка