hrenpack-theme-style 1.0.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +127 -0
- package/dark-theme.d.ts +2 -0
- package/dark-theme.d.ts.map +1 -0
- package/dark-theme.js +29 -0
- package/dark-theme.js.map +1 -0
- package/input-reversed.d.ts +8 -0
- package/input-reversed.d.ts.map +1 -0
- package/input-reversed.js +32 -0
- package/input-reversed.js.map +1 -0
- package/package.json +5 -5
- package/script.d.ts +2 -0
- package/script.d.ts.map +1 -0
- package/script.js +56 -0
- package/script.js.map +1 -0
package/README.md
ADDED
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
# hrenpack-theme-style
|
|
2
|
+
## Описание
|
|
3
|
+
`hrenpack-theme-style` — это пакет для быстрой настройки тематического оформления веб-сайтов с поддержкой светлой и тёмной темы. Он предоставляет готовые CSS-стили, компоненты для переключения тем и интеграцию с системными настройками пользователя.
|
|
4
|
+
|
|
5
|
+
Пакет идеально подходит для проектов, где требуется гибкое управление цветовыми схемами с минимальными усилиями.
|
|
6
|
+
|
|
7
|
+
## Установка
|
|
8
|
+
|
|
9
|
+
```shell
|
|
10
|
+
npm install hrenpack-theme-style
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## Использование
|
|
14
|
+
### Подключение стилей
|
|
15
|
+
Добавьте следующие стили в ваш HTML-файл:
|
|
16
|
+
|
|
17
|
+
```html
|
|
18
|
+
<!-- Обязательно именно этот id! -->
|
|
19
|
+
<link id="hrenpack-theme-stylesheet" rel="stylesheet" href="node_modules/hrenpack-theme-style/style.css">
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
### Подключение скриптов
|
|
23
|
+
```html
|
|
24
|
+
<!-- Подключите основной скрипт темы -->
|
|
25
|
+
<script type="module" src="node_modules/hrenpack-theme-style/script.js"></script>
|
|
26
|
+
|
|
27
|
+
<!-- Для работы темной темы -->
|
|
28
|
+
<script type="module" src="node_modules/hrenpack-theme-style/dark-theme.js"></script>
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
### Добавление кнопки переключения темы
|
|
32
|
+
Добавьте в HTML-разметку кнопку для переключения между темами:
|
|
33
|
+
|
|
34
|
+
```html
|
|
35
|
+
<div id="hrenpack-change-theme-div"> <!-- div с таким id не обязателен -->
|
|
36
|
+
<button id="hrenpack-toggle-theme" class="btn-hren">Переключить тему</button>
|
|
37
|
+
</div>
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
Кнопка будет автоматически обработана скриптом `dark-theme.ts`.
|
|
41
|
+
|
|
42
|
+
## Компоненты
|
|
43
|
+
### Стили
|
|
44
|
+
- `style.css` — базовые стили и CSS-переменные для светлой темы
|
|
45
|
+
|
|
46
|
+
- `style_light.css` — расширение базовых стилей (импортирует `style.css`)
|
|
47
|
+
|
|
48
|
+
- `style_dark.css` — переопределение переменных для тёмной темы
|
|
49
|
+
|
|
50
|
+
### Скрипты
|
|
51
|
+
- `script.js` — основной скрипт пакета
|
|
52
|
+
|
|
53
|
+
- `dark-theme.js` — управление переключением тем, сохранение выбора в `localStorage` и cookies
|
|
54
|
+
|
|
55
|
+
- `input-reversed.js` — утилита для обработки порядка элементов `input` и `label` внутри формы
|
|
56
|
+
|
|
57
|
+
### CSS-переменные
|
|
58
|
+
Пакет использует CSS-переменные для управления цветами. Основные переменные:
|
|
59
|
+
|
|
60
|
+
- `--hrenpack-background` — цвет фона
|
|
61
|
+
|
|
62
|
+
- `--hrenpack-foreground` — цвет текста
|
|
63
|
+
|
|
64
|
+
- `--hrenpack-a-hover-coloк` — цвет ссылок при наведении
|
|
65
|
+
|
|
66
|
+
- `--hrenpack-button-hover-color` — цвет кнопок при наведении
|
|
67
|
+
|
|
68
|
+
- `--hrenpack-fcu-border-color` — цвет границ полей ввода
|
|
69
|
+
|
|
70
|
+
- И многие другие
|
|
71
|
+
|
|
72
|
+
Все переменные переопределяются в `style_dark.css` для тёмной темы.
|
|
73
|
+
|
|
74
|
+
### Классы
|
|
75
|
+
`.btn-hren`
|
|
76
|
+
Стандартная кнопка пакета. Автоматически получает цвета из CSS-переменных.
|
|
77
|
+
|
|
78
|
+
`.btn-hren-ahren`
|
|
79
|
+
Альтернативный стиль кнопки (инвертированные цвета).
|
|
80
|
+
|
|
81
|
+
`.form-control-hrenpack`
|
|
82
|
+
Стилизованное поле ввода.
|
|
83
|
+
|
|
84
|
+
`.form`
|
|
85
|
+
Готовый стиль для форм с градиентным фоном.
|
|
86
|
+
|
|
87
|
+
`.grid-div` и `.grid-panel`
|
|
88
|
+
Сетка для отображения карточек контента.
|
|
89
|
+
|
|
90
|
+
`.singular-panel`, `.panel`
|
|
91
|
+
Панели для выделения контента.
|
|
92
|
+
|
|
93
|
+
## Зависимости
|
|
94
|
+
- `hrenpack_js` (^2.0.5) — базовые утилиты для работы с cookies, темами и DOM
|
|
95
|
+
|
|
96
|
+
## Совместимость
|
|
97
|
+
- Поддерживает современные браузеры (ES2020+)
|
|
98
|
+
|
|
99
|
+
- TypeScript 5.9.3 и выше
|
|
100
|
+
|
|
101
|
+
- Работает в средах с поддержкой модулей ES
|
|
102
|
+
|
|
103
|
+
## Разработка
|
|
104
|
+
Для сборки из исходников:
|
|
105
|
+
|
|
106
|
+
```shell
|
|
107
|
+
git clone https://github.com/MagIlyasDOMA/hrenpack-theme-style.git
|
|
108
|
+
cd hrenpack-theme-style
|
|
109
|
+
npm install
|
|
110
|
+
npx tsc
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
## Лицензия
|
|
114
|
+
#### MIT © MagIlyasDOMA
|
|
115
|
+
|
|
116
|
+
---
|
|
117
|
+
|
|
118
|
+
## Ссылки
|
|
119
|
+
- [GitHub репозиторий](https://github.com/MagIlyasDOMA/hrenpack-theme-style)
|
|
120
|
+
|
|
121
|
+
- [npm пакет](https://www.npmjs.com/package/hrenpack-theme-style)
|
|
122
|
+
|
|
123
|
+
- [Баг-трекер](https://github.com/MagIlyasDOMA/hrenpack-theme-style/issues)
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
*Примечание: Пакет находится в активной разработке. Пожалуйста, сообщайте об ошибках и предлагайте улучшения через Issues на GitHub.*
|
package/dark-theme.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dark-theme.d.ts","sourceRoot":"","sources":["dark-theme.ts"],"names":[],"mappings":""}
|
package/dark-theme.js
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { getCookie, getScriptSite, getSystemTheme, setCookie } from "hrenpack_js";
|
|
2
|
+
const tt_button = document.querySelector('#hrenpack-toggle-theme');
|
|
3
|
+
const stylesheet = document.querySelector('#hrenpack-theme-stylesheet');
|
|
4
|
+
const cookieTheme = getCookie?.('theme'), lsTheme = localStorage.getItem('theme');
|
|
5
|
+
const theme_url_prefix = getScriptSite(document.currentScript) + '/hrenpack-theme-style/';
|
|
6
|
+
const theme_light = theme_url_prefix + 'style_light.css', theme_dark = theme_url_prefix + 'style_dark.css';
|
|
7
|
+
let currentTheme;
|
|
8
|
+
if (cookieTheme)
|
|
9
|
+
currentTheme = cookieTheme;
|
|
10
|
+
else if (lsTheme)
|
|
11
|
+
currentTheme = lsTheme;
|
|
12
|
+
else
|
|
13
|
+
currentTheme = getSystemTheme() || 'light';
|
|
14
|
+
if (stylesheet) {
|
|
15
|
+
stylesheet.setAttribute('href', currentTheme === 'light' ? theme_light : theme_dark);
|
|
16
|
+
}
|
|
17
|
+
if (tt_button) {
|
|
18
|
+
tt_button.addEventListener('click', () => {
|
|
19
|
+
const newTheme = currentTheme === 'light' ? 'dark' : 'light';
|
|
20
|
+
localStorage.setItem('theme', newTheme);
|
|
21
|
+
if (stylesheet) {
|
|
22
|
+
stylesheet.setAttribute('href', newTheme === 'light' ? theme_light : theme_dark);
|
|
23
|
+
}
|
|
24
|
+
currentTheme = newTheme;
|
|
25
|
+
btn_hren_update();
|
|
26
|
+
setCookie?.('theme', newTheme);
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=dark-theme.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dark-theme.js","sourceRoot":"","sources":["dark-theme.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAE,aAAa,EAAE,cAAc,EAAE,SAAS,EAAC,MAAM,aAAa,CAAC;AAGhF,MAAM,SAAS,GAAsB,QAAQ,CAAC,aAAa,CAAC,wBAAwB,CAAE,CAAC;AACvF,MAAM,UAAU,GAAoB,QAAQ,CAAC,aAAa,CAAC,4BAA4B,CAAE,CAAC;AAC1F,MAAM,WAAW,GAAG,SAAS,EAAE,CAAC,OAAO,CAAC,EAAE,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;AACjF,MAAM,gBAAgB,GAAW,aAAa,CAAC,QAAQ,CAAC,aAAkC,CAAC,GAAG,wBAAwB,CAAA;AACtH,MAAM,WAAW,GAAG,gBAAgB,GAAG,iBAAiB,EAAE,UAAU,GAAG,gBAAgB,GAAG,gBAAgB,CAAA;AAC1G,IAAI,YAAoB,CAAC;AAEzB,IAAI,WAAW;IACX,YAAY,GAAG,WAAW,CAAC;KAC1B,IAAI,OAAO;IACZ,YAAY,GAAG,OAAO,CAAC;;IAEvB,YAAY,GAAG,cAAc,EAAE,IAAI,OAAO,CAAC;AAE/C,IAAI,UAAU,EAAE,CAAC;IACb,UAAU,CAAC,YAAY,CAAC,MAAM,EAAE,YAAY,KAAK,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;AACzF,CAAC;AAED,IAAI,SAAS,EAAE,CAAC;IACZ,SAAS,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;QACrC,MAAM,QAAQ,GAAG,YAAY,KAAK,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;QAC7D,YAAY,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACxC,IAAI,UAAU,EAAE,CAAC;YACb,UAAU,CAAC,YAAY,CAAC,MAAM,EAAE,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;QACrF,CAAC;QACD,YAAY,GAAG,QAAQ,CAAC;QACxB,eAAe,EAAE,CAAC;QAClB,SAAS,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
interface IsInputFirstOutput {
|
|
2
|
+
input: Node;
|
|
3
|
+
label: Node;
|
|
4
|
+
isFirst: boolean;
|
|
5
|
+
}
|
|
6
|
+
declare function isInputFirst(paragraph: HTMLParagraphElement): IsInputFirstOutput;
|
|
7
|
+
declare function formInputReversed(form: HTMLFormElement): void;
|
|
8
|
+
//# sourceMappingURL=input-reversed.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input-reversed.d.ts","sourceRoot":"","sources":["input-reversed.ts"],"names":[],"mappings":"AAAA,UAAU,kBAAkB;IACxB,KAAK,EAAE,IAAI,CAAC;IACZ,KAAK,EAAE,IAAI,CAAC;IACZ,OAAO,EAAE,OAAO,CAAC;CACpB;AAED,iBAAS,YAAY,CAAC,SAAS,EAAE,oBAAoB,GAAG,kBAAkB,CAmBzE;AAED,iBAAS,iBAAiB,CAAC,IAAI,EAAE,eAAe,QAW/C"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
function isInputFirst(paragraph) {
|
|
3
|
+
const input = paragraph.querySelector('input');
|
|
4
|
+
const label = paragraph.querySelector('label');
|
|
5
|
+
const output = { input: input, label: label, isFirst: false };
|
|
6
|
+
if (input && label) {
|
|
7
|
+
const elements = paragraph.children;
|
|
8
|
+
let inputIndex = -1;
|
|
9
|
+
let labelIndex = -1;
|
|
10
|
+
for (let i = 0; i < elements.length; i++) {
|
|
11
|
+
if (elements[i] === input)
|
|
12
|
+
inputIndex = i;
|
|
13
|
+
if (elements[i] === label)
|
|
14
|
+
labelIndex = i;
|
|
15
|
+
}
|
|
16
|
+
output.isFirst = inputIndex !== -1 && labelIndex !== -1 && inputIndex < labelIndex;
|
|
17
|
+
}
|
|
18
|
+
return output;
|
|
19
|
+
}
|
|
20
|
+
function formInputReversed(form) {
|
|
21
|
+
form.querySelectorAll('p').forEach(paragraph => {
|
|
22
|
+
const { input, label, isFirst } = isInputFirst(paragraph);
|
|
23
|
+
if (isFirst) {
|
|
24
|
+
const wrapper = document.createElement('wrapper');
|
|
25
|
+
wrapper.appendChild(input);
|
|
26
|
+
wrapper.appendChild(label);
|
|
27
|
+
paragraph.appendChild(wrapper);
|
|
28
|
+
paragraph.classList.add('input-reversed');
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=input-reversed.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input-reversed.js","sourceRoot":"","sources":["input-reversed.ts"],"names":[],"mappings":";AAMA,SAAS,YAAY,CAAC,SAA+B;IACjD,MAAM,KAAK,GAAG,SAAS,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IAC/C,MAAM,KAAK,GAAG,SAAS,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAG,EAAC,KAAK,EAAE,KAAa,EAAE,KAAK,EAAE,KAAa,EAAE,OAAO,EAAE,KAAK,EAAC,CAAA;IAG3E,IAAI,KAAK,IAAI,KAAK,EAAE,CAAC;QACjB,MAAM,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC;QACpC,IAAI,UAAU,GAAG,CAAC,CAAC,CAAC;QACpB,IAAI,UAAU,GAAG,CAAC,CAAC,CAAC;QAEpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,KAAK;gBAAE,UAAU,GAAG,CAAC,CAAC;YAC1C,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,KAAK;gBAAE,UAAU,GAAG,CAAC,CAAC;QAC9C,CAAC;QAED,MAAM,CAAC,OAAO,GAAG,UAAU,KAAK,CAAC,CAAC,IAAI,UAAU,KAAK,CAAC,CAAC,IAAI,UAAU,GAAG,UAAU,CAAA;IACtF,CAAC;IACD,OAAO,MAAM,CAAA;AACjB,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAqB;IAC5C,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE;QAC3C,MAAM,EAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAC,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;QACxD,IAAI,OAAO,EAAE,CAAC;YACV,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;YAClD,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAA;YAC1B,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAA;YAC1B,SAAS,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA;YAC9B,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAA;QAC7C,CAAC;IACL,CAAC,CAAC,CAAA;AACN,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "hrenpack-theme-style",
|
|
3
|
-
"version": "
|
|
4
|
-
"main": "index.js",
|
|
3
|
+
"version": "2.0.0",
|
|
5
4
|
"repository": {
|
|
6
5
|
"type": "git",
|
|
7
6
|
"url": "git+https://github.com/MagIlyasDOMA/hrenpack-theme-style.git"
|
|
@@ -10,7 +9,7 @@
|
|
|
10
9
|
"hrenpack",
|
|
11
10
|
"frontend",
|
|
12
11
|
"css",
|
|
13
|
-
|
|
12
|
+
"bootstrap",
|
|
14
13
|
"dark-theme"
|
|
15
14
|
],
|
|
16
15
|
"author": "MagIlyasDOMA",
|
|
@@ -21,9 +20,10 @@
|
|
|
21
20
|
"homepage": "https://github.com/MagIlyasDOMA/hrenpack-theme-style#readme",
|
|
22
21
|
"description": "",
|
|
23
22
|
"dependencies": {
|
|
24
|
-
|
|
23
|
+
"bootstrap": "^5.3.8",
|
|
24
|
+
"hrenpack_js": "^2.0.5"
|
|
25
25
|
},
|
|
26
26
|
"devDependencies": {
|
|
27
|
-
|
|
27
|
+
"typescript": "^5.9.3"
|
|
28
28
|
}
|
|
29
29
|
}
|
package/script.d.ts
ADDED
package/script.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"script.d.ts","sourceRoot":"","sources":["script.ts"],"names":[],"mappings":""}
|
package/script.js
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { stylesRoot } from "hrenpack_js";
|
|
2
|
+
function getButtonColor(button, isHoverOrActive = false) {
|
|
3
|
+
if (button.classList.contains('btn-hren-ahren')) {
|
|
4
|
+
return isHoverOrActive
|
|
5
|
+
? stylesRoot.getPropertyValue('--hrenpack-button-hover-color')
|
|
6
|
+
: stylesRoot.getPropertyValue('--hrenpack-background');
|
|
7
|
+
}
|
|
8
|
+
else {
|
|
9
|
+
return isHoverOrActive
|
|
10
|
+
? stylesRoot.getPropertyValue('--hrenpack-button-hover-color')
|
|
11
|
+
: stylesRoot.getPropertyValue('--hrenpack-foreground');
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
function getButtonTextColor(button) {
|
|
15
|
+
return button.classList.contains('btn-hren-ahren')
|
|
16
|
+
? stylesRoot.getPropertyValue('--hrenpack-foreground')
|
|
17
|
+
: stylesRoot.getPropertyValue('--hrenpack-background');
|
|
18
|
+
}
|
|
19
|
+
function btn_hren_press() {
|
|
20
|
+
const buttons = document.querySelectorAll('.btn-hren');
|
|
21
|
+
buttons.forEach(button => {
|
|
22
|
+
button.style.backgroundColor = getButtonColor(button);
|
|
23
|
+
button.style.color = getButtonTextColor(button);
|
|
24
|
+
button.addEventListener('mousedown', function () {
|
|
25
|
+
button.style.backgroundColor = stylesRoot.getPropertyValue('--hrenpack-button-pressed-color');
|
|
26
|
+
button.style.color = getButtonTextColor(button);
|
|
27
|
+
});
|
|
28
|
+
button.addEventListener('mouseover', function () {
|
|
29
|
+
button.style.backgroundColor = getButtonColor(button, true);
|
|
30
|
+
button.style.color = getButtonTextColor(button);
|
|
31
|
+
});
|
|
32
|
+
button.addEventListener('mouseout', function () {
|
|
33
|
+
button.style.backgroundColor = getButtonColor(button);
|
|
34
|
+
button.style.color = getButtonTextColor(button);
|
|
35
|
+
});
|
|
36
|
+
button.addEventListener('mouseup', function () {
|
|
37
|
+
button.style.backgroundColor = getButtonColor(button, true);
|
|
38
|
+
button.style.color = getButtonTextColor(button);
|
|
39
|
+
});
|
|
40
|
+
button.addEventListener('mouseleave', function () {
|
|
41
|
+
button.style.backgroundColor = getButtonColor(button);
|
|
42
|
+
button.style.color = getButtonTextColor(button);
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
function btn_hren_update() {
|
|
47
|
+
const buttons = document.querySelectorAll('.btn-hren');
|
|
48
|
+
buttons.forEach(button => {
|
|
49
|
+
button.style.backgroundColor = getButtonColor(button);
|
|
50
|
+
button.style.color = getButtonTextColor(button);
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
window.onload = function () {
|
|
54
|
+
btn_hren_press();
|
|
55
|
+
};
|
|
56
|
+
//# sourceMappingURL=script.js.map
|
package/script.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"script.js","sourceRoot":"","sources":["script.ts"],"names":[],"mappings":"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"}
|