@krometra/ui-kit 0.0.0-stage → 0.3.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.
Files changed (48) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +228 -2
  3. package/dist/ui-kit.css +2 -0
  4. package/dist/ui-kit.js +14955 -0
  5. package/dist/ui-kit.umd.cjs +3 -0
  6. package/package.json +74 -3
  7. package/src/base.css +32 -0
  8. package/src/components/KAlert.vue +65 -0
  9. package/src/components/KAvatar.vue +67 -0
  10. package/src/components/KBadge.vue +47 -0
  11. package/src/components/KButton.vue +98 -0
  12. package/src/components/KCard.vue +63 -0
  13. package/src/components/KCheckbox.vue +105 -0
  14. package/src/components/KCombobox.vue +232 -0
  15. package/src/components/KCountdown.vue +74 -0
  16. package/src/components/KDescriptions.vue +40 -0
  17. package/src/components/KDropdown.vue +111 -0
  18. package/src/components/KEmpty.vue +39 -0
  19. package/src/components/KFileUpload.vue +121 -0
  20. package/src/components/KFilterBar.vue +91 -0
  21. package/src/components/KIcon.vue +53 -0
  22. package/src/components/KInput.vue +108 -0
  23. package/src/components/KMenuItem.vue +56 -0
  24. package/src/components/KModal.vue +136 -0
  25. package/src/components/KMoney.vue +44 -0
  26. package/src/components/KPage.vue +93 -0
  27. package/src/components/KPagination.vue +113 -0
  28. package/src/components/KProgress.vue +63 -0
  29. package/src/components/KRadioGroup.vue +103 -0
  30. package/src/components/KSegmented.vue +88 -0
  31. package/src/components/KSelect.vue +231 -0
  32. package/src/components/KShell.vue +176 -0
  33. package/src/components/KStat.vue +74 -0
  34. package/src/components/KSteps.vue +119 -0
  35. package/src/components/KSwitch.vue +82 -0
  36. package/src/components/KTable.vue +161 -0
  37. package/src/components/KTabs.vue +102 -0
  38. package/src/components/KTextarea.vue +79 -0
  39. package/src/components/KTimeline.vue +72 -0
  40. package/src/components/KToast.vue +34 -0
  41. package/src/components/KToastItem.vue +86 -0
  42. package/src/components/KTooltip.vue +67 -0
  43. package/src/components/icon-registry.js +143 -0
  44. package/src/composables/useToast.js +52 -0
  45. package/src/format.js +137 -0
  46. package/src/index.js +84 -0
  47. package/src/theme.js +417 -0
  48. package/src/tokens.css +109 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Krometra contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,229 @@
1
- # Temporary Holding Version
1
+ # @krometra/ui-kit
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ UI-kit на Vue 3 со сменными темами оформления, светлой и тёмной схемой.
4
+ Интерактивные компоненты построены на машинах состояний [zag.js](https://zagjs.com):
5
+ позиционирование, фокус-трап, клавиатурная навигация и ARIA приходят из машин,
6
+ а не пишутся заново в каждом компоненте.
7
+
8
+ **Витрина и конструктор темы: <https://krometra.github.io/ui-kit/>**
9
+
10
+ 34 компонента, 88 иконок, девять готовых тем, две цветовые схемы и конструктор
11
+ своей темы. Разметка и поведение компонентов одни и те же, а стилистика
12
+ подбирается под проект: цвет, нейтрали, скругления, плотность, тени и шрифт
13
+ задаются CSS-переменными.
14
+
15
+ ## Установка
16
+
17
+ ```bash
18
+ npm install @krometra/ui-kit
19
+ # или из репозитория (скрипт `prepare` собирает `dist/`)
20
+ npm install github:krometra/ui-kit#v0.3.0
21
+ ```
22
+
23
+ Публикация в npm происходит по тегу `v*`, если задан секрет `NPM_TOKEN`.
24
+
25
+ ## Использование
26
+
27
+ Глобально:
28
+
29
+ ```js
30
+ import { createApp } from 'vue'
31
+ import KrometraUiKit from '@krometra/ui-kit'
32
+ import '@krometra/ui-kit/style.css'
33
+ import App from './App.vue'
34
+
35
+ createApp(App).use(KrometraUiKit).mount('#app')
36
+ ```
37
+
38
+ Точечно (tree-shaking):
39
+
40
+ ```vue
41
+ <script setup>
42
+ import { KButton, KTable, KMoney } from '@krometra/ui-kit'
43
+ </script>
44
+ ```
45
+
46
+ Базовый reset страницы подключается отдельно, чтобы кит не навязывал глобальные
47
+ правила приложению:
48
+
49
+ ```js
50
+ import '@krometra/ui-kit/src/base.css'
51
+ ```
52
+
53
+ Уведомления требуют один `<KToast />` в корне приложения; дальше сообщения
54
+ шлются из любого места через `useToast()`.
55
+
56
+ ## Темы
57
+
58
+ Тема — это набор значений для переменных `--k-*`. Меняется в рантайме, без
59
+ пересборки стилей.
60
+
61
+ ```js
62
+ import { applyTheme } from '@krometra/ui-kit'
63
+
64
+ applyTheme('violet') // готовый пресет
65
+ applyTheme({ preset: 'ocean', radius: 'sharp' }) // пресет с правками
66
+ applyTheme({ accent: '#e11d48', density: 'compact' }) // свой акцент
67
+ applyTheme({ preset: 'ocean', textMuted: '#5b6472' }) // свой цвет вторичного текста
68
+ applyTheme({ preset: 'scanflow', scheme: 'dark' }) // тёмная схема
69
+ const stop = applyTheme({ scheme: 'system' }) // следовать за ОС
70
+ ```
71
+
72
+ | Ось | Значения |
73
+ |---|---|
74
+ | `preset` | `default`, `scanflow`, `slate`, `ocean`, `forest`, `violet`, `amber`, `rose`, `mono` |
75
+ | `scheme` | `light`, `dark`, `system` |
76
+ | `neutral` | `cool`, `warm`, `plain` |
77
+ | `radius` | `sharp`, `subtle`, `default`, `soft`, `pill` |
78
+ | `density` | `compact`, `default`, `comfortable` |
79
+ | `elevation` | `flat`, `default`, `lifted` |
80
+ | `font` | `system`, `grotesk`, `serif`, `mono` или своя строка |
81
+ | `bg`, `surface`, `text`, `textMuted`, `textFaint` | свой цвет фона, поверхности и текста поверх нейтральной палитры (hex) |
82
+
83
+ Не заданные оси наследуются из `tokens.css`, поэтому частичная тема — обычный
84
+ способ настройки. `applyTheme` выставляет `data-k-scheme` и `color-scheme` на
85
+ `<html>` и возвращает функцию отката; при `scheme: 'system'` она же снимает
86
+ подписку на смену системной темы.
87
+
88
+ Тёмная схема работает и без JavaScript: достаточно атрибута
89
+ `<html data-k-scheme="dark">` — значения для неё лежат в `tokens.css`.
90
+
91
+ Для статической темы удобнее сгенерировать CSS один раз:
92
+
93
+ ```js
94
+ import { themeToCss } from '@krometra/ui-kit'
95
+ themeToCss({ preset: 'forest', radius: 'soft' }) // ':root { --k-primary: … }'
96
+ ```
97
+
98
+ Отдельные переменные всегда можно переопределить руками:
99
+
100
+ ```css
101
+ :root {
102
+ --k-primary: #0f62fe;
103
+ --k-radius: 10px;
104
+ }
105
+ ```
106
+
107
+ Помимо базовых цветов у каждого статуса есть полный набор: `--k-success`,
108
+ `-hover`, `-soft` (фон плашек), `-strong` (текст на мягком фоне) и
109
+ `--k-on-success` (текст на заливке). Компоненты не содержат захардкоженных
110
+ цветов, поэтому любая схема перекрашивает их целиком.
111
+
112
+ `tokens.css` генерируется из `theme.js` командой `yarn tokens`.
113
+
114
+ ## Компоненты
115
+
116
+ | Группа | Компоненты |
117
+ |---|---|
118
+ | Каркас | `KShell`, `KPage`, `KCard`, `KTabs`, `KSegmented` |
119
+ | Формы | `KInput`, `KTextarea`, `KSelect`, `KCombobox`, `KCheckbox`, `KRadioGroup`, `KSwitch`, `KFileUpload` |
120
+ | Действия | `KButton`, `KDropdown`, `KMenuItem` |
121
+ | Данные | `KTable`, `KPagination`, `KDescriptions`, `KTimeline`, `KEmpty` |
122
+ | Статусы | `KBadge`, `KAlert`, `KStat`, `KProgress`, `KSteps`, `KToast` |
123
+ | Значения | `KMoney`, `KCountdown`, `KAvatar`, `KFilterBar` |
124
+ | Прочее | `KIcon`, `KModal`, `KTooltip` |
125
+
126
+ На zag.js: `KSelect`, `KCombobox`, `KDropdown`, `KModal`, `KToast`,
127
+ `KPagination`, `KTooltip`, `KTabs`, `KCheckbox`, `KSwitch`, `KRadioGroup`,
128
+ `KSegmented`, `KFileUpload`, `KProgress`, `KSteps`. Плавающие слои
129
+ (списки, меню, подсказки, модалки) рендерятся в `<body>`, поэтому не
130
+ обрезаются контейнерами с `overflow` и корректно ложатся друг на друга:
131
+ модалка 1000, списки и меню 1100, подсказки 1200, уведомления 1300.
132
+
133
+ ### Заметные особенности API
134
+
135
+ ```vue
136
+ <!-- select и combobox принимают любые объекты -->
137
+ <KSelect v-model="volumeId" :options="volumes" :get-value="v => v.id" :get-label="v => v.name" clearable />
138
+ <KCombobox v-model="counterpartyId" :options="counterparties" label="Контрагент" @search="load" />
139
+
140
+ <!-- дропдаун: своя кнопка кита или собственный триггер со слотом -->
141
+ <KDropdown label="Экспорт" v-slot="{ close }">
142
+ <KMenuItem icon="download">PDF</KMenuItem>
143
+ </KDropdown>
144
+ <KDropdown>
145
+ <template #trigger="{ props }"><KButton v-bind="props" variant="ghost" icon="more" /></template>
146
+ <KMenuItem icon="edit">Редактировать</KMenuItem>
147
+ </KDropdown>
148
+
149
+ <!-- модалка не закрывается кликом по фону, пока не попросить -->
150
+ <KModal v-model="open" title="Новый документ" close-on-outside>…</KModal>
151
+ ```
152
+
153
+ Иконки задаются семантическим именем (`<KIcon name="settings" />`). Своя
154
+ иконка передаётся компонентом (`<KIcon :component="MyIcon" />`) или
155
+ регистрируется по имени, чтобы работать и в `icon`-пропах кнопок:
156
+
157
+ ```js
158
+ import { registerIcons } from '@krometra/ui-kit'
159
+ import { RotateCw } from 'lucide-vue-next'
160
+ registerIcons({ rescan: RotateCw })
161
+ ```
162
+
163
+ ## Форматтеры
164
+
165
+ ```js
166
+ import { formatMoney, formatBytes, formatDuration, pluralize } from '@krometra/ui-kit'
167
+
168
+ formatMoney(4850000) // «4 850 000 ₽»
169
+ formatBytes(482301) // «471,0 КБ»
170
+ formatDuration(9930) // «02:45:30»
171
+ pluralize(3, ['файл', 'файла', 'файлов']) // «3 файла»
172
+ ```
173
+
174
+ Также: `formatNumber`, `formatPercent`, `formatDate`, `formatDateTime`,
175
+ `formatRelative`, `truncate`, `initials`, `plural`.
176
+
177
+ ## Разработка
178
+
179
+ ```bash
180
+ yarn install
181
+ yarn dev # витрина с конструктором темы на localhost:5173
182
+ yarn build # сборка библиотеки в dist/
183
+ yarn build:demo # сборка витрины для GitHub Pages
184
+ yarn tokens # перегенерировать src/tokens.css из theme.js
185
+ ```
186
+
187
+ Витрина живёт в `demo/Showcase.vue` и служит и документацией, и площадкой для
188
+ визуальной проверки при изменении токенов.
189
+
190
+ ## Что изменилось в 0.3.0
191
+
192
+ - Кит переехал в организацию Крометры: пакет `@krometra/ui-kit`, репозиторий
193
+ `github.com/krometra/ui-kit`. Прежний пакет `foxy-ui-kit` больше не выходит.
194
+ - Префикс сменился на `K`: компоненты `KButton`, `KTable`…, классы `.k-*`,
195
+ CSS-переменные `--k-*`, плагин `KrometraUiKit`. Поведение и API компонентов
196
+ не менялись: переход — замена `Fx` на `K`, `fx-` на `k-` и имени пакета.
197
+
198
+ ## Что изменилось в 0.2.2
199
+
200
+ - `applyTheme`/`buildTheme`: опции `text`, `textMuted` и `textFaint` задают цвета текста
201
+ поверх нейтральной палитры, как `bg` и `surface`. Нужны, когда фон приложения темнее
202
+ палитры кита и вторичный текст на нём теряет контраст.
203
+
204
+ ## Что изменилось в 0.2.1
205
+
206
+ - `KTabs`: у пункта появился `hint` — пояснение второй строкой под названием.
207
+
208
+ ## Что изменилось в 0.2.0
209
+
210
+ - Тёмная схема (`scheme: 'light' | 'dark' | 'system'`) и пресет `scanflow`.
211
+ - Семантические токены `-hover`/`-strong`/`--k-on-*`, `--k-overlay`,
212
+ `--k-tooltip-*`, `--k-selection`; хардкод цветов из компонентов убран.
213
+ - Интерактивные компоненты переведены на zag.js; добавлен `KCombobox`.
214
+ - `KSelect`: пропы `getValue`/`getLabel`/`clearable`, значение в v-model
215
+ остаётся исходного типа; пустой `<option>` для плейсхолдера больше не нужен.
216
+ - `KDropdown`: слот `#trigger` получает `{ props, open }` и обязан привязать
217
+ `props`; пропы `label`/`icon`/`variant`/`size` рисуют кнопку кита; слот по
218
+ умолчанию получает `{ close }`.
219
+ - `KModal`: клик по фону не закрывает окно без `close-on-outside`.
220
+ - `KFileUpload`: в v-model объекты `File`, событие `reject`.
221
+ - `useToast`: очередь на `@zag-js/toast`; экспорт `toasts` заменён на
222
+ `toastStore`; добавлен `loading`.
223
+ - `KAvatar` красится семантическими токенами вместо фиксированной палитры.
224
+ - `registerIcons()` и новые иконки: `rotate`, `scissors`, `restore`, `file-up`,
225
+ `move`, `list`, `grid`, `sun`, `moon`.
226
+
227
+ ## Лицензия
228
+
229
+ MIT
@@ -0,0 +1,2 @@
1
+ :root{--k-primary:#2563eb;--k-primary-hover:#1d4ed8;--k-primary-soft:#eff6ff;--k-on-primary:#fff;--k-bg:#f6f8fb;--k-surface:#fff;--k-surface-muted:#f8fafc;--k-border:#e4e9f0;--k-border-strong:#cbd5e1;--k-text:#172033;--k-text-muted:#64748b;--k-text-faint:#94a3b8;--k-overlay:#0f172a59;--k-tooltip-bg:#172033;--k-tooltip-text:#fff;--k-selection:#d3e0fb;--k-radius-sm:6px;--k-radius:8px;--k-radius-lg:14px;--k-control-h:2.5rem;--k-control-h-sm:2rem;--k-gap:.5rem;--k-shadow-sm:0 1px 2px #0f172a0d;--k-shadow-md:0 4px 16px #0f172a14;--k-shadow-lg:0 18px 44px #0f172a24;--k-font:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;--k-success:#059669;--k-success-hover:#047857;--k-success-soft:#ecfdf5;--k-success-strong:#065f46;--k-on-success:#fff;--k-warning:#f59e0b;--k-warning-hover:#d97706;--k-warning-soft:#fffbeb;--k-warning-strong:#b45309;--k-on-warning:#fff;--k-danger:#dc2626;--k-danger-hover:#b91c1c;--k-danger-soft:#fef2f2;--k-danger-strong:#991b1b;--k-on-danger:#fff;--k-info:#4f46e5;--k-info-hover:#4338ca;--k-info-soft:#eef2ff;--k-info-strong:#3730a3;--k-on-info:#fff;--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light}:root[data-k-scheme=dark]{--k-primary:#3f76ed;--k-primary-hover:#5a89f0;--k-primary-soft:#1b2e56;--k-on-primary:#fff;--k-bg:#0b1220;--k-surface:#111a2b;--k-surface-muted:#18233a;--k-border:#24314a;--k-border-strong:#354764;--k-text:#e5eaf3;--k-text-muted:#9aa7bb;--k-text-faint:#66748c;--k-overlay:#0009;--k-tooltip-bg:#e5eaf3;--k-tooltip-text:#0b1220;--k-selection:#233f79;--k-radius-sm:6px;--k-radius:8px;--k-radius-lg:14px;--k-control-h:2.5rem;--k-control-h-sm:2rem;--k-gap:.5rem;--k-shadow-sm:0 1px 2px #00000059;--k-shadow-md:0 4px 16px #00000073;--k-shadow-lg:0 18px 44px #0009;--k-font:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;--k-success:#34d399;--k-success-hover:#6ee7b7;--k-success-soft:#173b3f;--k-success-strong:#6ee7b7;--k-on-success:#0f172a;--k-warning:#fbbf24;--k-warning-hover:#fcd34d;--k-warning-soft:#3b382a;--k-warning-strong:#fcd34d;--k-on-warning:#0f172a;--k-danger:#f87171;--k-danger-hover:#fca5a5;--k-danger-soft:#3b2a38;--k-danger-strong:#fca5a5;--k-on-danger:#fff;--k-info:#818cf8;--k-info-hover:#a5b4fc;--k-info-soft:#252f50;--k-info-strong:#a5b4fc;--k-on-info:#fff;--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}.k-icon[data-v-a6df347d]{vertical-align:-.15em;flex-shrink:0;display:inline-block}.k-icon--spin[data-v-a6df347d]{animation:1s linear infinite k-icon-spin-a6df347d}@keyframes k-icon-spin-a6df347d{to{transform:rotate(360deg)}}.k-alert[data-v-54c7f48e]{border-radius:var(--k-radius-sm);border:1px solid #0000;align-items:flex-start;gap:.625rem;padding:.75rem .875rem;font-size:.875rem;display:flex}.k-alert__icon[data-v-54c7f48e]{flex:none;margin-top:.1rem}.k-alert__body[data-v-54c7f48e]{flex:1;min-width:0}.k-alert__title[data-v-54c7f48e]{font-weight:600}.k-alert__title+.k-alert__text[data-v-54c7f48e]{margin-top:.15rem}.k-alert__close[data-v-54c7f48e]{color:inherit;opacity:.6;cursor:pointer;background:0 0;border:none;flex:none;padding:0}.k-alert__close[data-v-54c7f48e]:hover{opacity:1}.k-alert--info[data-v-54c7f48e]{background:var(--k-primary-soft);border-color:color-mix(in srgb, var(--k-primary) 25%, transparent);color:var(--k-primary-hover)}.k-alert--success[data-v-54c7f48e]{background:var(--k-success-soft);border-color:color-mix(in srgb, var(--k-success) 30%, transparent);color:var(--k-success-strong)}.k-alert--warning[data-v-54c7f48e]{background:var(--k-warning-soft);border-color:color-mix(in srgb, var(--k-warning) 35%, transparent);color:var(--k-warning-strong)}.k-alert--danger[data-v-54c7f48e]{background:var(--k-danger-soft);border-color:color-mix(in srgb, var(--k-danger) 30%, transparent);color:var(--k-danger-strong)}.k-avatar[data-v-8e5b1629]{-webkit-user-select:none;user-select:none;border-radius:50%;flex:none;justify-content:center;align-items:center;font-weight:600;display:inline-flex}.k-avatar--square[data-v-8e5b1629]{border-radius:var(--k-radius-sm)}.k-avatar--sm[data-v-8e5b1629]{width:1.75rem;height:1.75rem;font-size:.6875rem}.k-avatar--md[data-v-8e5b1629]{width:2.25rem;height:2.25rem;font-size:.8125rem}.k-avatar--lg[data-v-8e5b1629]{width:3rem;height:3rem;font-size:1rem}.k-avatar--primary[data-v-8e5b1629]{background:var(--k-primary-soft);color:var(--k-primary)}.k-avatar--success[data-v-8e5b1629]{background:var(--k-success-soft);color:var(--k-success-strong)}.k-avatar--warning[data-v-8e5b1629]{background:var(--k-warning-soft);color:var(--k-warning-strong)}.k-avatar--info[data-v-8e5b1629]{background:var(--k-info-soft);color:var(--k-info-strong)}.k-avatar--danger[data-v-8e5b1629]{background:var(--k-danger-soft);color:var(--k-danger-strong)}.k-badge[data-v-df0ae949]{white-space:nowrap;border-radius:999px;align-items:center;gap:.35rem;padding:.15rem .5rem;font-size:.75rem;font-weight:500;line-height:1.4;display:inline-flex}.k-badge--sm[data-v-df0ae949]{padding:.1rem .4rem;font-size:.6875rem}.k-badge__dot[data-v-df0ae949]{background:currentColor;border-radius:50%;flex:none;width:6px;height:6px}.k-badge--neutral[data-v-df0ae949]{background:var(--k-surface-muted);color:var(--k-text-muted)}.k-badge--primary[data-v-df0ae949]{background:var(--k-primary-soft);color:var(--k-primary)}.k-badge--success[data-v-df0ae949]{background:var(--k-success-soft);color:var(--k-success-strong)}.k-badge--warning[data-v-df0ae949]{background:var(--k-warning-soft);color:var(--k-warning-strong)}.k-badge--danger[data-v-df0ae949]{background:var(--k-danger-soft);color:var(--k-danger-strong)}.k-badge--info[data-v-df0ae949]{background:var(--k-info-soft);color:var(--k-info-strong)}.k-btn[data-v-92d86bbb]{min-height:var(--k-control-h);border-radius:var(--k-radius-sm);font:inherit;white-space:nowrap;cursor:pointer;-webkit-user-select:none;user-select:none;border:1px solid #0000;justify-content:center;align-items:center;gap:.4rem;padding:0 .875rem;font-size:.9375rem;font-weight:500;line-height:1;transition:background .15s,border-color .15s,color .15s,box-shadow .15s;display:inline-flex}.k-btn[data-v-92d86bbb]:focus{outline:none}.k-btn[data-v-92d86bbb]:focus-visible{outline:2px solid var(--k-primary);outline-offset:2px}.k-btn[data-v-92d86bbb]:disabled{opacity:.55;cursor:not-allowed}.k-btn--block[data-v-92d86bbb]{width:100%}.k-btn--sm[data-v-92d86bbb]{min-height:var(--k-control-h-sm);padding:0 .625rem;font-size:.8125rem}.k-btn--lg[data-v-92d86bbb]{min-height:2.875rem;padding:0 1.25rem;font-size:1rem}.k-btn--icon-only[data-v-92d86bbb]{width:var(--k-control-h);padding:0}.k-btn--icon-only.k-btn--sm[data-v-92d86bbb]{width:var(--k-control-h-sm)}.k-btn--icon-only.k-btn--lg[data-v-92d86bbb]{width:2.875rem}.k-btn--primary[data-v-92d86bbb]{background:var(--k-primary);color:var(--k-on-primary);box-shadow:var(--k-shadow-sm)}.k-btn--primary[data-v-92d86bbb]:hover:not(:disabled){background:var(--k-primary-hover)}.k-btn--secondary[data-v-92d86bbb]{background:var(--k-surface);border-color:var(--k-border-strong);color:var(--k-text)}.k-btn--secondary[data-v-92d86bbb]:hover:not(:disabled){background:var(--k-surface-muted)}.k-btn--ghost[data-v-92d86bbb]{color:var(--k-text-muted);background:0 0}.k-btn--ghost[data-v-92d86bbb]:hover:not(:disabled){background:var(--k-surface-muted);color:var(--k-text)}.k-btn--danger[data-v-92d86bbb]{background:var(--k-danger);color:var(--k-on-danger)}.k-btn--danger[data-v-92d86bbb]:hover:not(:disabled){background:var(--k-danger-hover)}.k-btn--success[data-v-92d86bbb]{background:var(--k-success);color:var(--k-on-success)}.k-btn--success[data-v-92d86bbb]:hover:not(:disabled){background:var(--k-success-hover)}.k-btn--link[data-v-92d86bbb]{color:var(--k-primary);background:0 0;min-height:0;padding:0}.k-btn--link[data-v-92d86bbb]:hover:not(:disabled){text-decoration:underline}.k-card[data-v-04bba3c2]{background:var(--k-surface);border:1px solid var(--k-border);border-radius:var(--k-radius);box-shadow:var(--k-shadow-sm);overflow:hidden}.k-card--hoverable[data-v-04bba3c2]{transition:box-shadow .15s,border-color .15s}.k-card--hoverable[data-v-04bba3c2]:hover{box-shadow:var(--k-shadow-md);border-color:var(--k-border-strong)}.k-card__header[data-v-04bba3c2]{border-bottom:1px solid var(--k-border);justify-content:space-between;align-items:flex-start;gap:1rem;padding:1rem 1.25rem;display:flex}.k-card__heading[data-v-04bba3c2]{min-width:0}.k-card__title[data-v-04bba3c2]{font-size:1rem;font-weight:600}.k-card__subtitle[data-v-04bba3c2]{color:var(--k-text-muted);margin-top:.15rem;font-size:.8125rem}.k-card__actions[data-v-04bba3c2]{flex:none;align-items:center;gap:.5rem;display:flex}.k-card--p-md .k-card__body[data-v-04bba3c2]{padding:1.25rem}.k-card--p-sm .k-card__body[data-v-04bba3c2]{padding:.75rem}.k-card--p-none .k-card__body[data-v-04bba3c2]{padding:0}.k-card__footer[data-v-04bba3c2]{border-top:1px solid var(--k-border);background:var(--k-surface-muted);padding:.875rem 1.25rem}.k-check[data-v-f6be6278]{cursor:pointer;align-items:flex-start;gap:.5rem;margin:0;font-weight:400;display:inline-flex}.k-check[data-disabled][data-v-f6be6278]{cursor:not-allowed;opacity:.6}.k-check__control[data-v-f6be6278]{background:var(--k-surface);border:1px solid var(--k-border-strong);border-radius:calc(var(--k-radius-sm) - 2px);width:1.05rem;height:1.05rem;color:var(--k-on-primary);flex:none;justify-content:center;align-items:center;margin-top:.15rem;transition:background .12s,border-color .12s,box-shadow .12s;display:inline-flex}.k-check__control[data-hover][data-v-f6be6278]:not([data-disabled]){border-color:var(--k-primary)}.k-check__control[data-focus-visible][data-v-f6be6278]{box-shadow:0 0 0 3px var(--k-primary-soft);border-color:var(--k-primary)}.k-check__control[data-state=checked][data-v-f6be6278],.k-check__control[data-state=indeterminate][data-v-f6be6278]{background:var(--k-primary);border-color:var(--k-primary)}.k-check__indicator[data-v-f6be6278]{display:inline-flex}.k-check__indicator[hidden][data-v-f6be6278]{display:none}.k-check__body[data-v-f6be6278]{flex-direction:column;gap:.1rem;min-width:0;display:flex}.k-check__label[data-v-f6be6278]{color:var(--k-text);font-size:.9375rem}.k-check__hint[data-v-f6be6278]{color:var(--k-text-muted);font-size:.75rem}.k-combobox[data-v-9baeafca]{flex-direction:column;gap:.25rem;min-width:0;margin:0;display:flex}.k-combobox__label[data-v-9baeafca]{color:var(--k-text-muted);font-size:.8125rem}.k-combobox__req[data-v-9baeafca]{color:var(--k-danger);margin-left:2px}.k-combobox__box[data-v-9baeafca]{height:var(--k-control-h);background:var(--k-surface);border:1px solid var(--k-border-strong);border-radius:var(--k-radius-sm);align-items:center;padding-right:.25rem;transition:border-color .15s,box-shadow .15s;display:flex}.k-combobox__box[data-v-9baeafca]:focus-within{border-color:var(--k-primary);box-shadow:0 0 0 3px var(--k-primary-soft)}.k-combobox__box--error[data-v-9baeafca]{border-color:var(--k-danger)}.k-combobox__box--error[data-v-9baeafca]:focus-within{box-shadow:0 0 0 3px var(--k-danger-soft)}.k-combobox__box--disabled[data-v-9baeafca]{background:var(--k-surface-muted)}.k-combobox__input[data-v-9baeafca]{min-width:0;height:100%;font:inherit;color:inherit;background:0 0;border:none;outline:none;flex:1;padding:0 .625rem;font-size:.9375rem}.k-combobox__input[data-v-9baeafca]::placeholder{color:var(--k-text-faint)}.k-combobox__input[data-v-9baeafca]:disabled{cursor:not-allowed;color:var(--k-text-muted)}.k-combobox__clear[data-v-9baeafca],.k-combobox__trigger[data-v-9baeafca]{border-radius:var(--k-radius-sm);color:var(--k-text-faint);cursor:pointer;background:0 0;border:none;justify-content:center;align-items:center;padding:.2rem;display:inline-flex}.k-combobox__clear[data-v-9baeafca]:hover,.k-combobox__trigger[data-v-9baeafca]:hover:not(:disabled){color:var(--k-text);background:var(--k-surface-muted)}.k-combobox__trigger[data-v-9baeafca]:disabled{cursor:not-allowed}.k-combobox__hint[data-v-9baeafca]{color:var(--k-text-muted);font-size:.75rem}.k-combobox__error[data-v-9baeafca]{color:var(--k-danger);font-size:.75rem}.k-combobox__content[data-v-9baeafca]{z-index:1100;max-height:260px;min-width:var(--reference-width);background:var(--k-surface);border:1px solid var(--k-border);border-radius:var(--k-radius);box-shadow:var(--k-shadow-md);outline:none;margin:0;padding:.25rem;list-style:none;overflow-y:auto}.k-combobox__content[hidden][data-v-9baeafca]{display:none}.k-combobox__item[data-v-9baeafca]{border-radius:var(--k-radius-sm);cursor:pointer;justify-content:space-between;align-items:center;gap:.5rem;padding:.45rem .6rem;font-size:.9rem;display:flex}.k-combobox__item[data-highlighted][data-v-9baeafca]{background:var(--k-primary-soft);color:var(--k-primary)}.k-combobox__item[data-state=checked][data-v-9baeafca]{font-weight:600}.k-combobox__item-text[data-v-9baeafca]{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.k-combobox__item-check[data-v-9baeafca]{flex:none;display:inline-flex}.k-combobox__item-check[hidden][data-v-9baeafca]{display:none}.k-combobox__empty[data-v-9baeafca]{color:var(--k-text-muted);padding:.5rem .6rem;font-size:.875rem}.k-countdown[data-v-f2953376]{font-variant-numeric:tabular-nums;white-space:nowrap;align-items:center;gap:.35rem;font-weight:600;display:inline-flex}.k-countdown--sm[data-v-f2953376]{font-size:.8125rem}.k-countdown--md[data-v-f2953376]{font-size:.9375rem}.k-countdown--lg[data-v-f2953376]{letter-spacing:-.01em;font-size:1.5rem}.k-countdown--normal[data-v-f2953376]{color:var(--k-text)}.k-countdown--warning[data-v-f2953376]{color:var(--k-warning-strong)}.k-countdown--danger[data-v-f2953376]{color:var(--k-danger)}.k-countdown--ended[data-v-f2953376]{color:var(--k-text-faint);font-weight:500}.k-desc[data-v-a1a1403d]{grid-template-columns:repeat(var(--k-desc-cols,2), minmax(0, 1fr));gap:.875rem 1.5rem;margin:0;display:grid}.k-desc__row[data-v-a1a1403d]{min-width:0}.k-desc__row--wide[data-v-a1a1403d]{grid-column:1/-1}.k-desc__label[data-v-a1a1403d]{color:var(--k-text-muted);text-transform:uppercase;letter-spacing:.04em;font-size:.75rem}.k-desc__value[data-v-a1a1403d]{overflow-wrap:anywhere;margin:.2rem 0 0;font-size:.9375rem}@media (width<=720px){.k-desc[data-v-a1a1403d]{grid-template-columns:1fr}}.k-dropdown[data-v-fa73f15e]{display:inline-flex}.k-dropdown__menu[data-v-fa73f15e]{z-index:1100;background:var(--k-surface);border:1px solid var(--k-border);border-radius:var(--k-radius);box-shadow:var(--k-shadow-md);outline:none;padding:.3rem}.k-dropdown__menu[hidden][data-v-fa73f15e]{display:none}.k-empty[data-v-f3632906]{text-align:center;padding:2.5rem 1.5rem}.k-empty__icon[data-v-f3632906]{background:var(--k-surface-muted);width:3rem;height:3rem;color:var(--k-text-faint);border-radius:50%;justify-content:center;align-items:center;margin-bottom:.75rem;display:inline-flex}.k-empty__title[data-v-f3632906]{font-weight:600}.k-empty__desc[data-v-f3632906]{color:var(--k-text-muted);margin-top:.25rem;font-size:.875rem}.k-empty__actions[data-v-f3632906]{justify-content:center;gap:.5rem;margin-top:1rem;display:flex}.k-upload__zone[data-v-e38c669e]{background:var(--k-surface-muted);border:1px dashed var(--k-border-strong);border-radius:var(--k-radius);width:100%;color:var(--k-text-muted);cursor:pointer;outline:none;flex-direction:column;align-items:center;gap:.2rem;padding:1.25rem;transition:border-color .15s,background .15s;display:flex}.k-upload__zone[data-v-e38c669e]:hover:not([data-disabled]),.k-upload__zone[data-dragging][data-v-e38c669e],.k-upload__zone[data-v-e38c669e]:focus-visible{border-color:var(--k-primary);background:var(--k-primary-soft)}.k-upload__zone[data-disabled][data-v-e38c669e]{opacity:.6;cursor:not-allowed}.k-upload__icon[data-v-e38c669e]{color:var(--k-text-faint)}.k-upload__label[data-v-e38c669e]{color:var(--k-text);font-size:.875rem}.k-upload__hint[data-v-e38c669e]{font-size:.75rem}.k-upload__list[data-v-e38c669e]{flex-direction:column;gap:.375rem;margin:.625rem 0 0;padding:0;list-style:none;display:flex}.k-upload__file[data-v-e38c669e]{background:var(--k-surface);border:1px solid var(--k-border);border-radius:var(--k-radius-sm);align-items:center;gap:.5rem;padding:.4rem .6rem;font-size:.875rem;display:flex}.k-upload__file-icon[data-v-e38c669e]{color:var(--k-text-faint)}.k-upload__file-name[data-v-e38c669e]{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.k-upload__file-size[data-v-e38c669e]{color:var(--k-text-muted);font-size:.75rem}.k-upload__remove[data-v-e38c669e]{color:var(--k-text-faint);cursor:pointer;background:0 0;border:none;padding:.1rem}.k-upload__remove[data-v-e38c669e]:hover{color:var(--k-danger)}.k-filterbar[data-v-f1d38124]{background:var(--k-surface);border:1px solid var(--k-border);border-radius:var(--k-radius);box-shadow:var(--k-shadow-sm);padding:.875rem 1rem}.k-filterbar__row[data-v-f1d38124]{flex-wrap:wrap;align-items:flex-end;gap:.75rem;display:flex}.k-filterbar__search[data-v-f1d38124]{flex:20rem;min-width:14rem}.k-filterbar__fields[data-v-f1d38124]{flex-wrap:wrap;align-items:flex-end;gap:.75rem;display:flex}.k-filterbar__actions[data-v-f1d38124]{align-items:center;gap:.5rem;margin-left:auto;display:flex}.k-filterbar__chips[data-v-f1d38124]{border-top:1px dashed var(--k-border);flex-wrap:wrap;align-items:center;gap:.4rem;margin-top:.75rem;padding-top:.75rem;display:flex}.k-filterbar__chip[data-v-f1d38124]{background:var(--k-primary-soft);color:var(--k-primary);border-radius:999px;align-items:center;gap:.3rem;padding:.15rem .3rem .15rem .55rem;font-size:.75rem;font-weight:500;display:inline-flex}.k-filterbar__chip-x[data-v-f1d38124]{color:inherit;opacity:.65;cursor:pointer;background:0 0;border:none;padding:.1rem;display:inline-flex}.k-filterbar__chip-x[data-v-f1d38124]:hover{opacity:1}.k-filterbar__reset[data-v-f1d38124]{font:inherit;color:var(--k-text-muted);cursor:pointer;background:0 0;border:none;font-size:.75rem;text-decoration:underline}.k-filterbar__reset[data-v-f1d38124]:hover{color:var(--k-text)}.k-input[data-v-1d3a0bd0]{flex-direction:column;gap:.25rem;min-width:0;margin:0;display:flex}.k-input__label[data-v-1d3a0bd0]{color:var(--k-text-muted);font-size:.8125rem}.k-input__req[data-v-1d3a0bd0]{color:var(--k-danger);margin-left:2px}.k-input__box[data-v-1d3a0bd0]{height:var(--k-control-h);background:var(--k-surface);border:1px solid var(--k-border-strong);border-radius:var(--k-radius-sm);align-items:center;gap:.5rem;padding:0 .625rem;transition:border-color .15s,box-shadow .15s;display:flex}.k-input__box[data-v-1d3a0bd0]:focus-within{border-color:var(--k-primary);box-shadow:0 0 0 3px var(--k-primary-soft)}.k-input__box--error[data-v-1d3a0bd0]{border-color:var(--k-danger)}.k-input__box--error[data-v-1d3a0bd0]:focus-within{box-shadow:0 0 0 3px var(--k-danger-soft)}.k-input__box--disabled[data-v-1d3a0bd0]{background:var(--k-surface-muted)}.k-input__icon[data-v-1d3a0bd0]{color:var(--k-text-faint)}.k-input__field[data-v-1d3a0bd0]{min-width:0;font:inherit;color:inherit;background:0 0;border:none;outline:none;flex:1;font-size:.9375rem}.k-input__field[data-v-1d3a0bd0]:disabled{cursor:not-allowed;color:var(--k-text-muted)}.k-input__suffix[data-v-1d3a0bd0]{color:var(--k-text-muted);white-space:nowrap;font-size:.875rem}.k-input__hint[data-v-1d3a0bd0]{color:var(--k-text-muted);font-size:.75rem}.k-input__error[data-v-1d3a0bd0]{color:var(--k-danger);font-size:.75rem}.k-menu-item[data-v-547b0d2a]{border-radius:var(--k-radius-sm);width:100%;font:inherit;color:var(--k-text);text-align:left;cursor:pointer;background:0 0;border:none;align-items:center;gap:.5rem;padding:.45rem .55rem;font-size:.875rem;text-decoration:none;display:flex}.k-menu-item[data-v-547b0d2a]:hover{background:var(--k-surface-muted);text-decoration:none}.k-menu-item[data-v-547b0d2a]:focus-visible{outline:2px solid var(--k-primary);outline-offset:-2px}.k-menu-item[data-v-547b0d2a]:disabled{opacity:.5;cursor:not-allowed}.k-menu-item--danger[data-v-547b0d2a]{color:var(--k-danger-strong)}.k-menu-item--danger[data-v-547b0d2a]:hover{background:var(--k-danger-soft)}.k-menu-item__label[data-v-547b0d2a]{flex:1;min-width:0}.k-modal__backdrop[data-v-500f8743]{z-index:1000;background:var(--k-overlay);-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);position:fixed;inset:0}.k-modal__positioner[data-v-500f8743]{z-index:1000;justify-content:center;align-items:center;padding:1rem;display:flex;position:fixed;inset:0}.k-modal__panel[data-v-500f8743]{width:min(92vw, var(--k-modal-w,34rem));background:var(--k-surface);border-radius:var(--k-radius-lg);max-height:86vh;box-shadow:var(--k-shadow-lg);outline:none;flex-direction:column;display:flex;overflow:hidden}.k-modal__panel--sm[data-v-500f8743]{--k-modal-w:24rem}.k-modal__panel--md[data-v-500f8743]{--k-modal-w:34rem}.k-modal__panel--lg[data-v-500f8743]{--k-modal-w:52rem}.k-modal__header[data-v-500f8743]{border-bottom:1px solid var(--k-border);justify-content:space-between;align-items:flex-start;gap:1rem;padding:1.125rem 1.25rem;display:flex}.k-modal__title[data-v-500f8743]{font-size:1.0625rem;font-weight:600}.k-modal__subtitle[data-v-500f8743]{color:var(--k-text-muted);margin-top:.15rem;font-size:.8125rem}.k-modal__close[data-v-500f8743]{color:var(--k-text-muted);cursor:pointer;border-radius:var(--k-radius-sm);background:0 0;border:none;flex:none;padding:.15rem}.k-modal__close[data-v-500f8743]:hover{background:var(--k-surface-muted);color:var(--k-text)}.k-modal__body[data-v-500f8743]{padding:1.25rem;overflow-y:auto}.k-modal__footer[data-v-500f8743]{border-top:1px solid var(--k-border);background:var(--k-surface-muted);justify-content:flex-end;align-items:center;gap:.5rem;padding:.875rem 1.25rem;display:flex}.k-money[data-v-f98ea4aa]{font-variant-numeric:tabular-nums;white-space:nowrap}.k-money--sm[data-v-f98ea4aa]{font-size:.8125rem}.k-money--lg[data-v-f98ea4aa]{letter-spacing:-.01em;font-size:1.25rem;font-weight:650}.k-money--muted[data-v-f98ea4aa]{color:var(--k-text-muted)}.k-money--success[data-v-f98ea4aa]{color:var(--k-success)}.k-money--danger[data-v-f98ea4aa]{color:var(--k-danger)}.k-page[data-v-ad12f5da]{width:100%;margin:0 auto;padding:1.75rem 2rem 3rem}.k-page--wide[data-v-ad12f5da]{max-width:1360px}.k-page--narrow[data-v-ad12f5da]{max-width:880px}.k-page__crumbs[data-v-ad12f5da]{align-items:center;gap:.3rem;margin-bottom:.6rem;font-size:.8125rem;display:flex}.k-page__crumb[data-v-ad12f5da]{color:var(--k-text-muted);text-decoration:none}.k-page__crumb[data-v-ad12f5da]:hover{color:var(--k-primary)}.k-page__crumb--current[data-v-ad12f5da]{color:var(--k-text)}.k-page__crumb-sep[data-v-ad12f5da]{color:var(--k-text-faint)}.k-page__header[data-v-ad12f5da]{justify-content:space-between;align-items:flex-start;gap:1rem;margin-bottom:1.5rem;display:flex}.k-page__heading[data-v-ad12f5da]{align-items:flex-start;gap:.625rem;min-width:0;display:flex}.k-page__back[data-v-ad12f5da]{border:1px solid var(--k-border);border-radius:var(--k-radius-sm);background:var(--k-surface);width:2rem;height:2rem;color:var(--k-text-muted);flex:none;justify-content:center;align-items:center;margin-top:.15rem;display:inline-flex}.k-page__back[data-v-ad12f5da]:hover{background:var(--k-surface-muted);color:var(--k-text)}.k-page__titles[data-v-ad12f5da]{min-width:0}.k-page__title-row[data-v-ad12f5da]{flex-wrap:wrap;align-items:center;gap:.6rem;display:flex}.k-page__subtitle[data-v-ad12f5da]{color:var(--k-text-muted);margin-top:.25rem;font-size:.875rem}.k-page__actions[data-v-ad12f5da]{flex-wrap:wrap;flex:none;justify-content:flex-end;align-items:center;gap:.5rem;display:flex}@media (width<=720px){.k-page[data-v-ad12f5da]{padding:1.25rem 1rem 2.5rem}.k-page__header[data-v-ad12f5da]{flex-direction:column;align-items:stretch}}.k-pagination[data-v-1eac1a65]{border-top:1px solid var(--k-border);flex-wrap:wrap;justify-content:space-between;align-items:center;gap:1rem;padding:.75rem .875rem;display:flex}.k-pagination__info[data-v-1eac1a65]{color:var(--k-text-muted);font-size:.8125rem}.k-pagination__pages[data-v-1eac1a65]{align-items:center;gap:.25rem;margin-left:auto;display:flex}.k-pagination__page[data-v-1eac1a65],.k-pagination__nav[data-v-1eac1a65]{min-width:var(--k-control-h-sm);height:var(--k-control-h-sm);border-radius:var(--k-radius-sm);font:inherit;color:var(--k-text-muted);cursor:pointer;background:0 0;border:1px solid #0000;justify-content:center;align-items:center;padding:0 .4rem;font-size:.875rem;display:inline-flex}.k-pagination__page[data-v-1eac1a65]:hover,.k-pagination__nav[data-v-1eac1a65]:hover:not(:disabled){background:var(--k-surface-muted);color:var(--k-text)}.k-pagination__page[data-selected][data-v-1eac1a65]{background:var(--k-primary-soft);color:var(--k-primary);border-color:currentColor;font-weight:600}.k-pagination__nav[data-v-1eac1a65]:disabled{opacity:.4;cursor:not-allowed}.k-pagination__gap[data-v-1eac1a65]{color:var(--k-text-faint);padding:0 .25rem}.k-progress__head[data-v-7e309874]{justify-content:space-between;gap:.5rem;margin-bottom:.3rem;font-size:.8125rem;display:flex}.k-progress__label[data-v-7e309874]{color:var(--k-text-muted)}.k-progress__value[data-v-7e309874]{font-variant-numeric:tabular-nums;font-weight:600}.k-progress__track[data-v-7e309874]{background:var(--k-surface-muted);border-radius:999px;height:.5rem;overflow:hidden}.k-progress__bar[data-v-7e309874]{border-radius:999px;height:100%;transition:width .3s}.k-progress__bar[data-state=indeterminate][data-v-7e309874]{width:40%;animation:1.2s ease-in-out infinite k-progress-slide-7e309874}.k-progress__bar--primary[data-v-7e309874]{background:var(--k-primary)}.k-progress__bar--success[data-v-7e309874]{background:var(--k-success)}.k-progress__bar--warning[data-v-7e309874]{background:var(--k-warning)}.k-progress__bar--danger[data-v-7e309874]{background:var(--k-danger)}@keyframes k-progress-slide-7e309874{0%{transform:translate(-100%)}to{transform:translate(250%)}}.k-radio[data-v-98047f64]{min-width:0}.k-radio__legend[data-v-98047f64]{color:var(--k-text-muted);padding-bottom:.375rem;font-size:.8125rem;display:block}.k-radio__items[data-v-98047f64]{flex-direction:column;gap:.5rem;display:flex}.k-radio__items--inline[data-v-98047f64]{flex-flow:wrap;gap:1rem}.k-radio__item[data-v-98047f64]{cursor:pointer;align-items:flex-start;gap:.5rem;display:inline-flex}.k-radio__item[data-disabled][data-v-98047f64]{cursor:not-allowed;opacity:.6}.k-radio__control[data-v-98047f64]{background:var(--k-surface);border:1px solid var(--k-border-strong);border-radius:50%;flex:none;width:1.05rem;height:1.05rem;margin-top:.15rem;transition:border-color .12s,box-shadow .12s;position:relative}.k-radio__control[data-hover][data-v-98047f64]:not([data-disabled]){border-color:var(--k-primary)}.k-radio__control[data-focus-visible][data-v-98047f64]{box-shadow:0 0 0 3px var(--k-primary-soft);border-color:var(--k-primary)}.k-radio__control[data-state=checked][data-v-98047f64]{border-color:var(--k-primary)}.k-radio__control[data-state=checked][data-v-98047f64]:after{content:"";background:var(--k-primary);border-radius:50%;position:absolute;inset:3px}.k-radio__body[data-v-98047f64]{flex-direction:column;gap:.1rem;display:flex}.k-radio__label[data-v-98047f64]{font-size:.9375rem}.k-radio__hint[data-v-98047f64]{color:var(--k-text-muted);font-size:.75rem}.k-segmented[data-v-06f6c695]{background:var(--k-surface-muted);border:1px solid var(--k-border);border-radius:var(--k-radius-sm);gap:.15rem;padding:.15rem;display:inline-flex}.k-segmented__item[data-v-06f6c695]{border-radius:calc(var(--k-radius-sm) - 2px);color:var(--k-text-muted);cursor:pointer;white-space:nowrap;align-items:center;gap:.35rem;padding:.3rem .65rem;font-size:.875rem;transition:background .12s,color .12s,box-shadow .12s;display:inline-flex}.k-segmented--sm .k-segmented__item[data-v-06f6c695]{padding:.2rem .5rem;font-size:.8125rem}.k-segmented__item[data-hover][data-v-06f6c695]:not([data-disabled]){color:var(--k-text)}.k-segmented__item[data-focus-visible][data-v-06f6c695]{box-shadow:0 0 0 2px var(--k-primary)}.k-segmented__item[data-disabled][data-v-06f6c695]{cursor:not-allowed;opacity:.5}.k-segmented__item[data-state=checked][data-v-06f6c695]{background:var(--k-surface);color:var(--k-text);box-shadow:var(--k-shadow-sm);font-weight:550}.k-select[data-v-f59de15e]{flex-direction:column;gap:.25rem;min-width:0;margin:0;display:flex}.k-select__label[data-v-f59de15e]{color:var(--k-text-muted);font-size:.8125rem}.k-select__req[data-v-f59de15e]{color:var(--k-danger);margin-left:2px}.k-select__box[data-v-f59de15e]{height:var(--k-control-h);background:var(--k-surface);border:1px solid var(--k-border-strong);border-radius:var(--k-radius-sm);align-items:center;padding-right:.5rem;transition:border-color .15s,box-shadow .15s;display:flex}.k-select__box[data-v-f59de15e]:focus-within{border-color:var(--k-primary);box-shadow:0 0 0 3px var(--k-primary-soft)}.k-select__box--error[data-v-f59de15e]{border-color:var(--k-danger)}.k-select__box--error[data-v-f59de15e]:focus-within{box-shadow:0 0 0 3px var(--k-danger-soft)}.k-select__box--disabled[data-v-f59de15e]{background:var(--k-surface-muted)}.k-select__trigger[data-v-f59de15e]{min-width:0;height:100%;font:inherit;color:inherit;text-align:left;cursor:pointer;background:0 0;border:none;outline:none;flex:1;padding:0 .625rem;font-size:.9375rem}.k-select__trigger[data-v-f59de15e]:disabled{cursor:not-allowed;color:var(--k-text-muted)}.k-select__value[data-v-f59de15e]{text-overflow:ellipsis;white-space:nowrap;display:block;overflow:hidden}.k-select__value--placeholder[data-v-f59de15e]{color:var(--k-text-faint)}.k-select__clear[data-v-f59de15e]{border-radius:var(--k-radius-sm);color:var(--k-text-faint);cursor:pointer;background:0 0;border:none;padding:.15rem;display:inline-flex}.k-select__clear[data-v-f59de15e]:hover{color:var(--k-text);background:var(--k-surface-muted)}.k-select__chevron[data-v-f59de15e]{color:var(--k-text-faint);pointer-events:none;transition:transform .15s;display:inline-flex}.k-select__chevron[data-state=open][data-v-f59de15e]{transform:rotate(180deg)}.k-select__hint[data-v-f59de15e]{color:var(--k-text-muted);font-size:.75rem}.k-select__error[data-v-f59de15e]{color:var(--k-danger);font-size:.75rem}.k-select__content[data-v-f59de15e]{z-index:1100;max-height:260px;min-width:var(--reference-width);background:var(--k-surface);border:1px solid var(--k-border);border-radius:var(--k-radius);box-shadow:var(--k-shadow-md);outline:none;margin:0;padding:.25rem;list-style:none;overflow-y:auto}.k-select__content[hidden][data-v-f59de15e]{display:none}.k-select__item[data-v-f59de15e]{border-radius:var(--k-radius-sm);color:var(--k-text);cursor:pointer;justify-content:space-between;align-items:center;gap:.5rem;padding:.45rem .6rem;font-size:.9rem;display:flex}.k-select__item[data-highlighted][data-v-f59de15e]{background:var(--k-primary-soft);color:var(--k-primary)}.k-select__item[data-state=checked][data-v-f59de15e]{font-weight:600}.k-select__item[data-disabled][data-v-f59de15e]{opacity:.5;cursor:not-allowed}.k-select__item-text[data-v-f59de15e]{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.k-select__item-check[data-v-f59de15e]{flex:none;display:inline-flex}.k-select__item-check[hidden][data-v-f59de15e]{display:none}.k-select__empty[data-v-f59de15e]{color:var(--k-text-muted);padding:.5rem .6rem;font-size:.875rem}.k-shell[data-v-28e372ea]{background:var(--k-bg);min-height:100vh;display:flex}.k-shell__sidebar[data-v-28e372ea]{background:var(--k-surface);border-right:1px solid var(--k-border);flex-direction:column;flex:none;width:15rem;height:100vh;display:flex;position:sticky;top:0}.k-shell__logo[data-v-28e372ea]{border-bottom:1px solid var(--k-border);letter-spacing:-.01em;align-items:center;gap:.55rem;height:3.75rem;padding:0 1.125rem;font-size:1.0625rem;font-weight:650;display:flex}.k-shell__nav[data-v-28e372ea]{flex:1;padding:.75rem .625rem;overflow-y:auto}.k-shell__section[data-v-28e372ea]{letter-spacing:.06em;text-transform:uppercase;color:var(--k-text-faint);padding:.9rem .55rem .35rem;font-size:.6875rem;font-weight:600}.k-shell__link[data-v-28e372ea]{border-radius:var(--k-radius-sm);color:var(--k-text-muted);align-items:center;gap:.6rem;padding:.5rem .55rem;font-size:.9375rem;text-decoration:none;transition:background .12s,color .12s;display:flex}.k-shell__link[data-v-28e372ea]:hover{background:var(--k-surface-muted);color:var(--k-text);text-decoration:none}.k-shell__link.router-link-active[data-v-28e372ea]{background:var(--k-primary-soft);color:var(--k-primary);font-weight:550}.k-shell__link-icon[data-v-28e372ea]{color:currentColor}.k-shell__link-label[data-v-28e372ea]{flex:1;min-width:0}.k-shell__badge[data-v-28e372ea]{background:var(--k-danger);color:var(--k-on-danger);border-radius:999px;padding:.05rem .35rem;font-size:.6875rem;font-weight:600}.k-shell__sidebar-footer[data-v-28e372ea]{border-top:1px solid var(--k-border);padding:.75rem}.k-shell__main[data-v-28e372ea]{flex-direction:column;flex:1;min-width:0;display:flex}.k-shell__header[data-v-28e372ea]{z-index:40;background:color-mix(in srgb, var(--k-surface) 85%, transparent);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);border-bottom:1px solid var(--k-border);align-items:center;gap:.75rem;height:3.75rem;padding:0 1.25rem;display:flex;position:sticky;top:0}.k-shell__header-left[data-v-28e372ea]{flex:1;align-items:center;gap:.75rem;min-width:0;display:flex}.k-shell__header-actions[data-v-28e372ea]{align-items:center;gap:.5rem;display:flex}.k-shell__burger[data-v-28e372ea]{color:var(--k-text-muted);cursor:pointer;background:0 0;border:none;padding:.25rem;display:none}.k-shell__content[data-v-28e372ea]{flex:1;min-width:0}.k-shell__overlay[data-v-28e372ea]{display:none}@media (width<=900px){.k-shell__sidebar[data-v-28e372ea]{z-index:70;box-shadow:var(--k-shadow-lg);transition:transform .2s;position:fixed;transform:translate(-100%)}.k-shell--nav-open .k-shell__sidebar[data-v-28e372ea]{transform:none}.k-shell--nav-open .k-shell__overlay[data-v-28e372ea]{z-index:60;background:var(--k-overlay);display:block;position:fixed;inset:0}.k-shell__burger[data-v-28e372ea]{display:inline-flex}}.k-stat[data-v-65b0e012]{background:var(--k-surface);border:1px solid var(--k-border);border-radius:var(--k-radius);box-shadow:var(--k-shadow-sm);padding:1rem 1.125rem}.k-stat__head[data-v-65b0e012]{justify-content:space-between;align-items:center;gap:.5rem;display:flex}.k-stat__label[data-v-65b0e012]{color:var(--k-text-muted);font-size:.8125rem}.k-stat__icon[data-v-65b0e012]{border-radius:var(--k-radius-sm);background:var(--k-surface-muted);width:1.75rem;height:1.75rem;color:var(--k-text-muted);justify-content:center;align-items:center;display:inline-flex}.k-stat__icon--primary[data-v-65b0e012]{background:var(--k-primary-soft);color:var(--k-primary)}.k-stat__icon--success[data-v-65b0e012]{background:var(--k-success-soft);color:var(--k-success)}.k-stat__icon--warning[data-v-65b0e012]{background:var(--k-warning-soft);color:var(--k-warning)}.k-stat__icon--danger[data-v-65b0e012]{background:var(--k-danger-soft);color:var(--k-danger)}.k-stat__value[data-v-65b0e012]{letter-spacing:-.02em;margin-top:.35rem;font-size:1.5rem;font-weight:650}.k-stat__foot[data-v-65b0e012]{align-items:center;gap:.5rem;margin-top:.35rem;font-size:.75rem;display:flex}.k-stat__trend[data-v-65b0e012]{align-items:center;gap:.15rem;font-weight:600;display:inline-flex}.k-stat__trend--good[data-v-65b0e012]{color:var(--k-success)}.k-stat__trend--bad[data-v-65b0e012]{color:var(--k-danger)}.k-stat__hint[data-v-65b0e012]{color:var(--k-text-muted)}.k-steps[data-v-84abd47e]{overflow-x:auto}.k-steps__list[data-v-84abd47e]{align-items:center;gap:.5rem;margin:0;padding:0;list-style:none;display:flex}.k-steps__item[data-v-84abd47e]{white-space:nowrap;align-items:center;gap:.5rem;display:flex}.k-steps__trigger[data-v-84abd47e]{border-radius:var(--k-radius-sm);font:inherit;color:inherit;text-align:left;background:0 0;border:none;align-items:center;gap:.5rem;padding:.375rem .5rem;display:flex}.k-steps__trigger--clickable[data-v-84abd47e]{cursor:pointer}.k-steps__trigger--clickable[data-v-84abd47e]:hover{background:var(--k-surface-muted)}.k-steps__trigger[data-v-84abd47e]:focus-visible{outline:2px solid var(--k-primary);outline-offset:2px}.k-steps__trigger[data-v-84abd47e]:disabled{cursor:default}.k-steps__sep[data-v-84abd47e]{background:var(--k-border-strong);flex:none;width:1.5rem;height:1px}.k-steps__marker[data-v-84abd47e]{background:var(--k-surface);border:1px solid var(--k-border-strong);width:1.625rem;height:1.625rem;color:var(--k-text-muted);border-radius:50%;flex:none;justify-content:center;align-items:center;font-size:.8125rem;font-weight:600;display:inline-flex}.k-steps__body[data-v-84abd47e]{flex-direction:column;display:flex}.k-steps__label[data-v-84abd47e]{color:var(--k-text-muted);font-size:.875rem}.k-steps__hint[data-v-84abd47e]{color:var(--k-text-faint);font-size:.6875rem}.k-steps__marker[data-complete][data-v-84abd47e]{background:var(--k-success-soft);color:var(--k-success);border-color:currentColor}.k-steps__trigger[data-complete] .k-steps__label[data-v-84abd47e]{color:var(--k-text)}.k-steps__marker[data-current][data-v-84abd47e]{background:var(--k-primary);border-color:var(--k-primary);color:var(--k-on-primary)}.k-steps__trigger[data-current] .k-steps__label[data-v-84abd47e]{color:var(--k-text);font-weight:600}.k-steps__item[data-complete] .k-steps__label[data-v-84abd47e]{color:var(--k-text)}.k-steps__item[data-current] .k-steps__label[data-v-84abd47e]{color:var(--k-text);font-weight:600}.k-switch[data-v-0896c0cd]{cursor:pointer;align-items:flex-start;gap:.625rem;margin:0;font-weight:400;display:inline-flex}.k-switch[data-disabled][data-v-0896c0cd]{cursor:not-allowed;opacity:.6}.k-switch__track[data-v-0896c0cd]{background:var(--k-border-strong);border-radius:999px;flex:none;width:2.25rem;height:1.3rem;margin-top:.1rem;transition:background .15s,box-shadow .15s;position:relative}.k-switch__track[data-state=checked][data-v-0896c0cd]{background:var(--k-primary)}.k-switch__track[data-focus-visible][data-v-0896c0cd]{box-shadow:0 0 0 3px var(--k-primary-soft)}.k-switch__thumb[data-v-0896c0cd]{background:var(--k-surface);width:1.05rem;height:1.05rem;box-shadow:var(--k-shadow-sm);border-radius:50%;transition:transform .15s;position:absolute;top:2px;left:2px}.k-switch__thumb[data-state=checked][data-v-0896c0cd]{transform:translate(.95rem)}.k-switch__body[data-v-0896c0cd]{flex-direction:column;gap:.1rem;display:flex}.k-switch__label[data-v-0896c0cd]{font-size:.9375rem}.k-switch__hint[data-v-0896c0cd]{color:var(--k-text-muted);font-size:.75rem}.k-table__scroll[data-v-0ce6707d]{overflow-x:auto}.k-table__table[data-v-0ce6707d]{border-collapse:collapse;width:100%;font-size:.9375rem}.k-table__table th[data-v-0ce6707d],.k-table__table td[data-v-0ce6707d]{text-align:left;border-bottom:1px solid var(--k-border);vertical-align:middle;padding:.7rem .875rem}.k-table--dense .k-table__table th[data-v-0ce6707d],.k-table--dense .k-table__table td[data-v-0ce6707d]{padding:.45rem .75rem;font-size:.875rem}.k-table__table th[data-v-0ce6707d]{background:var(--k-surface-muted);letter-spacing:.05em;text-transform:uppercase;color:var(--k-text-muted);white-space:nowrap;font-size:.6875rem;font-weight:600;position:sticky;top:0}.k-table__th-inner[data-v-0ce6707d]{align-items:center;gap:.25rem;display:inline-flex}.k-table__th--sortable[data-v-0ce6707d]{cursor:pointer;-webkit-user-select:none;user-select:none}.k-table__th--sortable[data-v-0ce6707d]:hover{color:var(--k-text)}.k-table__sort[data-v-0ce6707d]{opacity:.35}.k-table__sort--active[data-v-0ce6707d]{opacity:1;color:var(--k-primary)}.k-table__table tbody tr:last-child td[data-v-0ce6707d]{border-bottom:none}.k-table__actions[data-v-0ce6707d]{align-items:center;gap:var(--k-gap);display:inline-flex}.k-table__row--clickable[data-v-0ce6707d]{cursor:pointer}.k-table__row--clickable[data-v-0ce6707d]:hover{background:var(--k-primary-soft)}.k-table__msg[data-v-0ce6707d]{text-align:center;color:var(--k-text-muted);padding:2rem}.k-tabs[data-v-d6a570d0]{overflow-x:auto}.k-tabs__list[data-v-d6a570d0]{align-items:stretch;gap:.25rem;display:flex}.k-tabs--line .k-tabs__list[data-v-d6a570d0]{border-bottom:1px solid var(--k-border)}.k-tabs__tab[data-v-d6a570d0]{font:inherit;color:var(--k-text-muted);cursor:pointer;white-space:nowrap;background:0 0;border:none;align-items:center;gap:.4rem;padding:.6rem .75rem;font-size:.9375rem;font-weight:500;transition:color .15s,background .15s,border-color .15s;display:inline-flex}.k-tabs__tab[data-v-d6a570d0]:focus{outline:none}.k-tabs__tab[data-v-d6a570d0]:focus-visible{outline:2px solid var(--k-primary);outline-offset:-2px;border-radius:var(--k-radius-sm)}.k-tabs__tab[data-disabled][data-v-d6a570d0]{opacity:.5;cursor:not-allowed}.k-tabs--line .k-tabs__tab[data-v-d6a570d0]{border-bottom:2px solid #0000;margin-bottom:-1px}.k-tabs--line .k-tabs__tab[data-v-d6a570d0]:hover:not([data-disabled]){color:var(--k-text)}.k-tabs--line .k-tabs__tab[data-selected][data-v-d6a570d0]{color:var(--k-primary);border-bottom-color:var(--k-primary)}.k-tabs--pill .k-tabs__tab[data-v-d6a570d0]{border-radius:999px;padding:.4rem .85rem}.k-tabs--pill .k-tabs__tab[data-v-d6a570d0]:hover:not([data-disabled]){background:var(--k-surface-muted)}.k-tabs--pill .k-tabs__tab[data-selected][data-v-d6a570d0]{background:var(--k-primary-soft);color:var(--k-primary)}.k-tabs__label[data-v-d6a570d0]{align-items:center;gap:.4rem;display:inline-flex}.k-tabs__tab--hinted[data-v-d6a570d0]{flex-direction:column;justify-content:center;align-items:flex-start;gap:.1rem}.k-tabs__hint[data-v-d6a570d0]{color:var(--k-text-muted);font-size:.75rem;font-weight:400}.k-tabs--pill .k-tabs__tab--hinted[data-v-d6a570d0]{border-radius:var(--k-radius-lg)}.k-tabs__count[data-v-d6a570d0]{background:var(--k-surface-muted);color:var(--k-text-muted);border-radius:999px;padding:.05rem .35rem;font-size:.6875rem;font-weight:600}.k-tabs__tab[data-selected] .k-tabs__count[data-v-d6a570d0]{background:var(--k-primary-soft);color:var(--k-primary)}.k-textarea[data-v-b46790f4]{flex-direction:column;gap:.25rem;min-width:0;margin:0;display:flex}.k-textarea__label[data-v-b46790f4]{color:var(--k-text-muted);font-size:.8125rem}.k-textarea__req[data-v-b46790f4]{color:var(--k-danger);margin-left:2px}.k-textarea__field[data-v-b46790f4]{background:var(--k-surface);border:1px solid var(--k-border-strong);border-radius:var(--k-radius-sm);width:100%;font:inherit;color:inherit;resize:vertical;outline:none;padding:.5rem .625rem;font-size:.9375rem;transition:border-color .15s,box-shadow .15s}.k-textarea__field[data-v-b46790f4]:focus{border-color:var(--k-primary);box-shadow:0 0 0 3px var(--k-primary-soft)}.k-textarea__field--error[data-v-b46790f4]{border-color:var(--k-danger)}.k-textarea__field[data-v-b46790f4]:disabled{background:var(--k-surface-muted);cursor:not-allowed}.k-textarea__hint[data-v-b46790f4]{color:var(--k-text-muted);font-size:.75rem}.k-textarea__error[data-v-b46790f4]{color:var(--k-danger);font-size:.75rem}.k-timeline[data-v-0bbdcdd1]{margin:0;padding:0;list-style:none}.k-timeline__item[data-v-0bbdcdd1]{gap:.75rem;padding-bottom:1rem;display:flex;position:relative}.k-timeline__item[data-v-0bbdcdd1]:not(:last-child):before{content:"";background:var(--k-border);width:1px;position:absolute;top:1.35rem;bottom:.1rem;left:.53rem}.k-timeline__item[data-v-0bbdcdd1]:last-child{padding-bottom:0}.k-timeline__marker[data-v-0bbdcdd1]{z-index:1;border:2px solid var(--k-surface);border-radius:50%;flex:none;justify-content:center;align-items:center;width:1.125rem;height:1.125rem;margin-top:.2rem;display:inline-flex;position:relative}.k-timeline__marker--neutral[data-v-0bbdcdd1]{background:var(--k-border-strong);color:var(--k-surface)}.k-timeline__marker--primary[data-v-0bbdcdd1]{background:var(--k-primary);color:var(--k-on-primary)}.k-timeline__marker--success[data-v-0bbdcdd1]{background:var(--k-success);color:var(--k-on-success)}.k-timeline__marker--warning[data-v-0bbdcdd1]{background:var(--k-warning);color:var(--k-on-warning)}.k-timeline__marker--danger[data-v-0bbdcdd1]{background:var(--k-danger);color:var(--k-on-danger)}.k-timeline__body[data-v-0bbdcdd1]{flex:1;min-width:0}.k-timeline__head[data-v-0bbdcdd1]{justify-content:space-between;align-items:baseline;gap:.75rem;display:flex}.k-timeline__title[data-v-0bbdcdd1]{font-size:.9375rem}.k-timeline__time[data-v-0bbdcdd1]{color:var(--k-text-faint);white-space:nowrap;font-variant-numeric:tabular-nums;font-size:.75rem}.k-timeline__text[data-v-0bbdcdd1]{color:var(--k-text-muted);margin-top:.1rem;font-size:.8125rem}.k-toast[data-v-259b0872]{translate:var(--x) var(--y);scale:var(--scale,1);opacity:var(--opacity);height:var(--height,auto);z-index:var(--z-index);will-change:translate, opacity, scale;background:var(--k-surface);border:1px solid var(--k-border);border-left:3px solid var(--k-primary);border-radius:var(--k-radius-sm);width:min(24rem,100vw - 2rem);box-shadow:var(--k-shadow-md);color:var(--k-text);align-items:flex-start;gap:.6rem;padding:.75rem .875rem;transition:translate .4s cubic-bezier(.21,1.02,.73,1),scale .4s,opacity .4s,height .4s;display:flex}.k-toast[data-type=success][data-v-259b0872]{border-left-color:var(--k-success)}.k-toast[data-type=warning][data-v-259b0872]{border-left-color:var(--k-warning)}.k-toast[data-type=error][data-v-259b0872]{border-left-color:var(--k-danger)}.k-toast__icon[data-v-259b0872]{color:var(--k-text-muted);flex:none;margin-top:.1rem}.k-toast[data-type=success] .k-toast__icon[data-v-259b0872]{color:var(--k-success)}.k-toast[data-type=warning] .k-toast__icon[data-v-259b0872]{color:var(--k-warning-strong)}.k-toast[data-type=error] .k-toast__icon[data-v-259b0872]{color:var(--k-danger)}.k-toast__body[data-v-259b0872]{flex:1;min-width:0}.k-toast__title[data-v-259b0872]{font-size:.9375rem;font-weight:600}.k-toast__text[data-v-259b0872]{color:var(--k-text-muted);white-space:pre-line;overflow-wrap:break-word;font-size:.8125rem}.k-toast__close[data-v-259b0872]{color:var(--k-text-faint);cursor:pointer;background:0 0;border:none;flex:none;padding:0}.k-toast__close[data-v-259b0872]:hover{color:var(--k-text)}.k-toasts[data-v-c623c427]{z-index:1300}.k-tooltip[data-v-e8bb1df5]{outline:none;display:inline-flex}.k-tooltip[data-v-e8bb1df5]:focus-visible{outline:2px solid var(--k-primary);outline-offset:2px;border-radius:var(--k-radius-sm)}.k-tooltip__bubble[data-v-e8bb1df5]{z-index:1200;background:var(--k-tooltip-bg);max-width:18rem;color:var(--k-tooltip-text);border-radius:var(--k-radius-sm);box-shadow:var(--k-shadow-md);padding:.4rem .55rem;font-size:.75rem;line-height:1.4}
2
+ /*$vite$:1*/