diff --git a/.gitignore b/.gitignore index e535eb88..1f6be103 100644 --- a/.gitignore +++ b/.gitignore @@ -59,3 +59,4 @@ src/assets/components/themes .playwright-mcp/* .claude/* +.worktrees/ diff --git a/docs/superpowers/plans/2026-04-16-inputnumber.md b/docs/superpowers/plans/2026-04-16-inputnumber.md deleted file mode 100644 index ab3591e0..00000000 --- a/docs/superpowers/plans/2026-04-16-inputnumber.md +++ /dev/null @@ -1,808 +0,0 @@ -# InputNumber Component — Implementation Plan - -> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. - -**Goal:** Создать Angular wrapper-компонент InputNumber с CSS-переопределениями и Storybook-сториями. - -**Architecture:** Standalone CVA-компонент `InputNumberComponent`, оборачивающий PrimeNG `p-inputnumber`. CSS-оверрайды в `src/prime-preset/tokens/components/inputnumber.ts`, подключаются через `map-tokens.ts`. Четыре стории: Default (динамический template из args), FloatLabel (нативный `p-inputnumber` внутри `p-floatlabel`), Currency, MinMax. - -**Tech Stack:** Angular 20, PrimeNG 20, Storybook 8, Tailwind, `dt()` токены, Tabler Icons. - ---- - -## File Map - -| Действие | Путь | -|---|---| -| Создать | `src/lib/components/inputnumber/inputnumber.component.ts` | -| Создать | `src/prime-preset/tokens/components/inputnumber.ts` | -| Изменить | `src/prime-preset/map-tokens.ts` | -| Создать | `src/stories/components/inputnumber/inputnumber.stories.ts` | -| Создать | `src/stories/components/inputnumber/examples/inputnumber-float-label.component.ts` | -| Создать | `src/stories/components/inputnumber/examples/inputnumber-currency.component.ts` | -| Создать | `src/stories/components/inputnumber/examples/inputnumber-minmax.component.ts` | - ---- - -### Task 1: CSS-переопределения InputNumber - -**Files:** -- Create: `src/prime-preset/tokens/components/inputnumber.ts` -- Modify: `src/prime-preset/map-tokens.ts` - -- [ ] **Step 1: Создать файл CSS-токенов** - -Создать `src/prime-preset/tokens/components/inputnumber.ts`: - -```typescript -export const inputnumberCss = ({ dt }: { dt: (token: string) => string }): string => ` - -/* ─── Кнопки +/− ─── */ -.p-inputnumber-button { - border-width: ${dt('inputnumber.extend.borderWidth')}; -} - -.p-inputnumber-horizontal .p-inputnumber-button { - min-height: ${dt('inputnumber.extend.extButton.height')}; -} - -/* ─── Disabled состояние кнопок ─── */ -.p-inputnumber-horizontal:has(.p-inputnumber-input:disabled) .p-inputnumber-button { - background: ${dt('inputtext.root.disabledBackground')}; - color: ${dt('inputtext.root.disabledColor')}; -} - -/* ─── Extra Large ─── */ -.p-inputnumber.p-inputnumber-xlg .p-inputnumber-input { - font-size: ${dt('inputtext.extend.extXlg.fontSize')}; - padding: ${dt('inputtext.extend.extXlg.paddingY')} ${dt('inputtext.extend.extXlg.paddingX')}; -} -`; -``` - -- [ ] **Step 2: Зарегистрировать CSS в map-tokens.ts** - -Открыть `src/prime-preset/map-tokens.ts`. Добавить импорт после строки с `inputtextCss`: - -```typescript -import { inputnumberCss } from './tokens/components/inputnumber'; -``` - -Добавить запись в объект `components` после блока `inputtext`: - -```typescript -inputnumber: { - ...(tokens.components.inputnumber as unknown as ComponentsDesignTokens['inputnumber']), - css: inputnumberCss, -}, -``` - -- [ ] **Step 3: Проверить компиляцию** - -```bash -cd /Users/d.khaliulin/Downloads/angular-ui-kit-feature-styles-debug -npx tsc --noEmit -``` - -Ожидается: нет ошибок. - -- [ ] **Step 4: Коммит** - -```bash -git add src/prime-preset/tokens/components/inputnumber.ts src/prime-preset/map-tokens.ts -git commit -m "feat(inputnumber): добавить CSS-переопределения токенов" -``` - ---- - -### Task 2: InputNumberComponent - -**Files:** -- Create: `src/lib/components/inputnumber/inputnumber.component.ts` - -- [ ] **Step 1: Создать компонент** - -Создать `src/lib/components/inputnumber/inputnumber.component.ts`: - -```typescript -import { Component, Input, forwardRef } from '@angular/core'; -import { ControlValueAccessor, NG_VALUE_ACCESSOR, FormsModule } from '@angular/forms'; -import { NgClass } from '@angular/common'; -import { InputNumber } from 'primeng/inputnumber'; - -export type InputNumberSize = 'small' | 'base' | 'large' | 'xlarge'; -export type InputNumberButtonLayout = 'horizontal' | 'vertical' | 'stacked'; -export type InputNumberMode = 'decimal' | 'currency'; - -@Component({ - selector: 'input-number', - standalone: true, - imports: [InputNumber, NgClass, FormsModule], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => InputNumberComponent), - multi: true, - }, - ], - template: ` - - `, -}) -export class InputNumberComponent implements ControlValueAccessor { - @Input() size: InputNumberSize = 'base'; - @Input() placeholder = ''; - @Input() disabled = false; - @Input() readonly = false; - @Input() invalid = false; - @Input() showButtons = true; - @Input() buttonLayout: InputNumberButtonLayout = 'horizontal'; - @Input() mode: InputNumberMode = 'decimal'; - @Input() currency = 'RUB'; - @Input() locale = 'ru-RU'; - @Input() prefix: string | undefined = undefined; - @Input() suffix: string | undefined = undefined; - @Input() min: number | undefined = undefined; - @Input() max: number | undefined = undefined; - @Input() step = 1; - @Input() minFractionDigits = 0; - @Input() maxFractionDigits = 20; - @Input() fluid = false; - - modelValue: number | null = null; - - private _onChange: (value: number | null) => void = () => {}; - onTouched: () => void = () => {}; - - get primeSize(): 'small' | 'large' | undefined { - if (this.size === 'small') return 'small'; - if (this.size === 'large' || this.size === 'xlarge') return 'large'; - return undefined; - } - - get sizeClass(): Record { - return { 'p-inputnumber-xlg': this.size === 'xlarge' }; - } - - onInputChange(event: { value: number | null | undefined }): void { - const value = event.value ?? null; - this.modelValue = value; - this._onChange(value); - } - - writeValue(value: number | null): void { - this.modelValue = value ?? null; - } - - registerOnChange(fn: (value: number | null) => void): void { - this._onChange = fn; - } - - registerOnTouched(fn: () => void): void { - this.onTouched = fn; - } - - setDisabledState(isDisabled: boolean): void { - this.disabled = isDisabled; - } -} -``` - -- [ ] **Step 2: Проверить компиляцию** - -```bash -npx tsc --noEmit -``` - -Ожидается: нет ошибок. - -- [ ] **Step 3: Коммит** - -```bash -git add src/lib/components/inputnumber/inputnumber.component.ts -git commit -m "feat(inputnumber): добавить компонент InputNumberComponent" -``` - ---- - -### Task 3: FloatLabel story - -**Files:** -- Create: `src/stories/components/inputnumber/examples/inputnumber-float-label.component.ts` - -- [ ] **Step 1: Создать файл** - -Создать `src/stories/components/inputnumber/examples/inputnumber-float-label.component.ts`: - -```typescript -import { Component } from '@angular/core'; -import { FormsModule } from '@angular/forms'; -import { StoryObj } from '@storybook/angular'; -import { InputNumber } from 'primeng/inputnumber'; -import { FloatLabel } from 'primeng/floatlabel'; - -const template = ` -
- - - - -
-`; -const styles = ''; - -@Component({ - selector: 'app-inputnumber-float-label', - standalone: true, - imports: [InputNumber, FloatLabel, FormsModule], - template, - styles, -}) -export class InputNumberFloatLabelComponent { - value: number | null = null; -} - -export const FloatLabelStory: StoryObj = { - name: 'FloatLabel', - render: () => ({ - template: ``, - }), - parameters: { - controls: { disable: true }, - docs: { - description: { - story: - 'Интеграция с `p-floatlabel` — плавающая метка внутри поля. Требует нативный `p-inputnumber` как прямой дочерний элемент `p-floatlabel`.', - }, - source: { - language: 'ts', - code: ` -import { Component } from '@angular/core'; -import { InputNumber } from 'primeng/inputnumber'; -import { FloatLabel } from 'primeng/floatlabel'; -import { FormsModule } from '@angular/forms'; - -@Component({ - selector: 'app-inputnumber-float-label', - standalone: true, - imports: [InputNumber, FloatLabel, FormsModule], - template: \` - - - - - \`, -}) -export class InputNumberFloatLabelComponent { - value: number | null = null; -} - `, - }, - }, - }, -}; -``` - -- [ ] **Step 2: Проверить компиляцию** - -```bash -npx tsc --noEmit -``` - -Ожидается: нет ошибок. - ---- - -### Task 4: Currency story - -**Files:** -- Create: `src/stories/components/inputnumber/examples/inputnumber-currency.component.ts` - -- [ ] **Step 1: Создать файл** - -Создать `src/stories/components/inputnumber/examples/inputnumber-currency.component.ts`: - -```typescript -import { StoryObj } from '@storybook/angular'; -import { InputNumberComponent } from '../../../../lib/components/inputnumber/inputnumber.component'; - -type Story = StoryObj; - -export const Currency: Story = { - name: 'Currency', - render: (args) => ({ - props: { ...args, value: null }, - template: ` - - `, - }), - args: { - mode: 'currency', - currency: 'RUB', - locale: 'ru-RU', - minFractionDigits: 2, - maxFractionDigits: 2, - }, - parameters: { - docs: { - description: { - story: 'Режим валюты — форматирует значение с символом валюты по заданной локали.', - }, - source: { - language: 'ts', - code: ` -import { InputNumberComponent } from '@cdek-it/angular-ui-kit'; -import { FormsModule } from '@angular/forms'; - -// template: -// - `, - }, - }, - }, -}; -``` - ---- - -### Task 5: MinMax story - -**Files:** -- Create: `src/stories/components/inputnumber/examples/inputnumber-minmax.component.ts` - -- [ ] **Step 1: Создать файл** - -Создать `src/stories/components/inputnumber/examples/inputnumber-minmax.component.ts`: - -```typescript -import { StoryObj } from '@storybook/angular'; -import { InputNumberComponent } from '../../../../lib/components/inputnumber/inputnumber.component'; - -type Story = StoryObj; - -export const MinMax: Story = { - name: 'Min / Max / Step', - render: (args) => ({ - props: { ...args, value: null }, - template: ` - - `, - }), - args: { - min: 0, - max: 100, - step: 1, - placeholder: '0–100', - }, - parameters: { - docs: { - description: { - story: 'Ограничения min/max и шаг изменения через кнопки и клавиатуру.', - }, - source: { - language: 'ts', - code: ` -import { InputNumberComponent } from '@cdek-it/angular-ui-kit'; -import { FormsModule } from '@angular/forms'; - -// template: -// - `, - }, - }, - }, -}; -``` - ---- - -### Task 6: Main stories file - -**Files:** -- Create: `src/stories/components/inputnumber/inputnumber.stories.ts` - -- [ ] **Step 1: Создать файл** - -Создать `src/stories/components/inputnumber/inputnumber.stories.ts`: - -```typescript -import { Meta, StoryObj, moduleMetadata } from '@storybook/angular'; -import { FormsModule } from '@angular/forms'; -import { InputNumberComponent } from '../../../lib/components/inputnumber/inputnumber.component'; -import { InputNumberFloatLabelComponent, FloatLabelStory } from './examples/inputnumber-float-label.component'; -import { Currency } from './examples/inputnumber-currency.component'; -import { MinMax } from './examples/inputnumber-minmax.component'; - -type InputNumberArgs = InputNumberComponent; - -const meta: Meta = { - title: 'Components/Form/InputNumber', - component: InputNumberComponent, - tags: ['autodocs'], - decorators: [ - moduleMetadata({ - imports: [ - InputNumberComponent, - FormsModule, - InputNumberFloatLabelComponent, - ], - }), - ], - parameters: { - designTokens: { prefix: '--p-inputnumber' }, - docs: { - description: { - component: `Числовое поле ввода с поддержкой форматирования и кнопок +/−. - -\`\`\`typescript -import { InputNumberComponent } from '@cdek-it/angular-ui-kit'; -\`\`\``, - }, - }, - }, - argTypes: { - // ── Props ──────────────────────────────────────────────── - size: { - control: 'select', - options: ['small', 'base', 'large', 'xlarge'], - description: 'Размер поля', - table: { - category: 'Props', - defaultValue: { summary: "'base'" }, - type: { summary: "'small' | 'base' | 'large' | 'xlarge'" }, - }, - }, - placeholder: { - control: 'text', - description: 'Подсказка при пустом поле', - table: { - category: 'Props', - defaultValue: { summary: "''" }, - type: { summary: 'string' }, - }, - }, - disabled: { - control: 'boolean', - description: 'Отключает взаимодействие', - table: { - category: 'Props', - defaultValue: { summary: 'false' }, - type: { summary: 'boolean' }, - }, - }, - readonly: { - control: 'boolean', - description: 'Только для чтения', - table: { - category: 'Props', - defaultValue: { summary: 'false' }, - type: { summary: 'boolean' }, - }, - }, - invalid: { - control: 'boolean', - description: 'Невалидное состояние', - table: { - category: 'Props', - defaultValue: { summary: 'false' }, - type: { summary: 'boolean' }, - }, - }, - showButtons: { - control: 'boolean', - description: 'Показывать кнопки +/−', - table: { - category: 'Props', - defaultValue: { summary: 'true' }, - type: { summary: 'boolean' }, - }, - }, - buttonLayout: { - control: 'select', - options: ['horizontal', 'vertical', 'stacked'], - description: 'Расположение кнопок', - table: { - category: 'Props', - defaultValue: { summary: "'horizontal'" }, - type: { summary: "'horizontal' | 'vertical' | 'stacked'" }, - }, - }, - mode: { - control: 'select', - options: ['decimal', 'currency'], - description: 'Режим отображения значения', - table: { - category: 'Props', - defaultValue: { summary: "'decimal'" }, - type: { summary: "'decimal' | 'currency'" }, - }, - }, - currency: { - control: 'text', - description: 'Код валюты ISO 4217, используется при mode="currency"', - table: { - category: 'Props', - defaultValue: { summary: "'RUB'" }, - type: { summary: 'string' }, - }, - }, - locale: { - control: 'text', - description: 'Локаль для форматирования числа', - table: { - category: 'Props', - defaultValue: { summary: "'ru-RU'" }, - type: { summary: 'string' }, - }, - }, - prefix: { - control: 'text', - description: 'Префикс перед значением', - table: { - category: 'Props', - type: { summary: 'string' }, - }, - }, - suffix: { - control: 'text', - description: 'Суффикс после значения (например, "%")', - table: { - category: 'Props', - type: { summary: 'string' }, - }, - }, - min: { - control: 'number', - description: 'Минимально допустимое значение', - table: { - category: 'Props', - type: { summary: 'number' }, - }, - }, - max: { - control: 'number', - description: 'Максимально допустимое значение', - table: { - category: 'Props', - type: { summary: 'number' }, - }, - }, - step: { - control: 'number', - description: 'Шаг изменения значения', - table: { - category: 'Props', - defaultValue: { summary: '1' }, - type: { summary: 'number' }, - }, - }, - minFractionDigits: { - control: { type: 'number', min: 0, max: 20 }, - description: 'Минимальное количество знаков после запятой', - table: { - category: 'Props', - defaultValue: { summary: '0' }, - type: { summary: 'number' }, - }, - }, - maxFractionDigits: { - control: { type: 'number', min: 0, max: 20 }, - description: 'Максимальное количество знаков после запятой', - table: { - category: 'Props', - defaultValue: { summary: '20' }, - type: { summary: 'number' }, - }, - }, - fluid: { - control: 'boolean', - description: 'Растягивает поле на всю ширину контейнера', - table: { - category: 'Props', - defaultValue: { summary: 'false' }, - type: { summary: 'boolean' }, - }, - }, - // Hidden computed props - modelValue: { table: { disable: true } }, - primeSize: { table: { disable: true } }, - sizeClass: { table: { disable: true } }, - }, - args: { - size: 'base', - placeholder: '0', - disabled: false, - readonly: false, - invalid: false, - showButtons: true, - buttonLayout: 'horizontal', - mode: 'decimal', - currency: 'RUB', - locale: 'ru-RU', - step: 1, - minFractionDigits: 0, - maxFractionDigits: 20, - fluid: false, - }, -}; - -export default meta; -type Story = StoryObj; - -// ── Default ────────────────────────────────────────────────────────────────── -export const Default: Story = { - name: 'Default', - render: (args) => { - const parts: string[] = []; - - if (args.size && args.size !== 'base') parts.push(`size="${args.size}"`); - if (args.placeholder) parts.push(`placeholder="${args.placeholder}"`); - if (args.disabled) parts.push(`[disabled]="true"`); - if (args.readonly) parts.push(`[readonly]="true"`); - if (args.invalid) parts.push(`[invalid]="true"`); - if (!args.showButtons) parts.push(`[showButtons]="false"`); - if (args.buttonLayout && args.buttonLayout !== 'horizontal') parts.push(`buttonLayout="${args.buttonLayout}"`); - if (args.mode && args.mode !== 'decimal') parts.push(`mode="${args.mode}"`); - if (args.mode === 'currency' && args.currency) parts.push(`currency="${args.currency}"`); - if (args.locale && args.locale !== 'ru-RU') parts.push(`locale="${args.locale}"`); - if (args.prefix) parts.push(`prefix="${args.prefix}"`); - if (args.suffix) parts.push(`suffix="${args.suffix}"`); - if (args.min !== undefined) parts.push(`[min]="${args.min}"`); - if (args.max !== undefined) parts.push(`[max]="${args.max}"`); - if (args.step && args.step !== 1) parts.push(`[step]="${args.step}"`); - if (args.minFractionDigits) parts.push(`[minFractionDigits]="${args.minFractionDigits}"`); - if (args.maxFractionDigits && args.maxFractionDigits !== 20) parts.push(`[maxFractionDigits]="${args.maxFractionDigits}"`); - if (args.fluid) parts.push(`[fluid]="true"`); - parts.push(`[(ngModel)]="value"`); - - const template = ``; - - return { props: { ...args, value: null }, template }; - }, - parameters: { - docs: { - description: { - story: 'Базовый пример компонента. Используйте Controls для интерактивного изменения пропсов.', - }, - }, - }, -}; - -// ── Re-exports from example components ──────────────────────────────────── -export { FloatLabelStory as FloatLabel, Currency, MinMax }; -``` - -- [ ] **Step 2: Проверить компиляцию** - -```bash -npx tsc --noEmit -``` - -Ожидается: нет ошибок. - -- [ ] **Step 3: Коммит** - -```bash -git add src/stories/components/inputnumber/ -git commit -m "feat(inputnumber): добавить Storybook-стории" -``` - ---- - -### Task 7: Финальная проверка - -- [ ] **Step 1: Полная проверка TypeScript** - -```bash -npx tsc --noEmit -``` - -Ожидается: нет ошибок. - -- [ ] **Step 2: Запустить Storybook и проверить визуально** - -```bash -npm run storybook -``` - -Открыть `http://localhost:6006` и проверить: -- `Components/Form/InputNumber` → Default: Controls меняют пропсы, code-snippet обновляется -- FloatLabel: метка анимируется при фокусе/вводе -- Currency: значение форматируется с символом ₽ -- Min/Max: кнопки не выходят за диапазон 0–100 - -- [ ] **Step 3: Финальный коммит** - -```bash -git add -A -git commit -m "feat(inputnumber): компонент InputNumber готов" -``` - ---- - -## Self-Review - -**Spec coverage:** -- ✅ Компонент с CVA — Task 2 -- ✅ Все 18 пропсов — Task 2 (InputNumberComponent) -- ✅ Size mapping (primeSize + p-inputnumber-xlg) — Task 2 -- ✅ Tabler Icons через `incrementButtonIcon` / `decrementButtonIcon` — Task 2 -- ✅ CSS overrides (border, height, disabled, xlarge) — Task 1 -- ✅ map-tokens регистрация — Task 1 -- ✅ Default story с динамическим template — Task 6 -- ✅ FloatLabel story (нативный p-inputnumber) — Task 3 -- ✅ Currency story — Task 4 -- ✅ MinMax story — Task 5 -- ✅ modelValue / primeSize / sizeClass скрыты в argTypes — Task 6 - -**Placeholder scan:** нет TBD/TODO. - -**Type consistency:** `InputNumberSize`, `InputNumberButtonLayout`, `InputNumberMode` определены в Task 2 и используются в `argTypes` Task 6 через строковые литералы — согласованы. diff --git a/docs/superpowers/plans/2026-06-22-figma-code-connect-static.md b/docs/superpowers/plans/2026-06-22-figma-code-connect-static.md new file mode 100644 index 00000000..f15edce2 --- /dev/null +++ b/docs/superpowers/plans/2026-06-22-figma-code-connect-static.md @@ -0,0 +1,370 @@ +# Static Figma Code Connect — Implementation Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Создать статический файловый аналог Figma Code Connect для `@cdek-it/angular-ui-kit`, дающий LLM контракт Figma↔код без рантайма CLI. + +**Architecture:** Колокация `.figma.md` рядом с каждым компонентом + глобальные артефакты в `src/lib/figma-code-connect/`. Формат — Markdown с YAML frontmatter и жёстким порядком секций. Lookup по Figma `nodeId` через `grep` без отдельного индекса. Валидация структуры — Node-скриптом перед коммитом. + +**Tech Stack:** Angular 20, PrimeNG, Markdown, YAML, Node ≥18 (для validator), `js-yaml` (единственная новая dev-зависимость). + +## Global Constraints + +- Все пути относительно корня проекта. +- Один кодовый компонент = ровно один `.figma.md` файл; варианты — секциями внутри. +- Глобалы лежат в `src/lib/figma-code-connect/`; индивидуальные `.figma.md` ссылаются на них через относительные ссылки. +- Frontmatter — YAML; обязательные поля: `component`, `selector`, `import.symbol`, `import.from`, `figma.fileKey`, `figma.nodeId`, `figma.componentKey`, `figma.name`, `status`, `updated`. +- Жёсткий порядок секций тела: `## Overview` → `## Props mapping` → `## Variants` → `## Slots` → `## Related` → `## Do / Don't`. +- Все code-fence обязаны иметь язык (`html`, `ts`, `scss`). +- Никаких inline-значений токенов/иконок — только ссылки на `tokens.md` / `icons.md`. +- Figma fileKey — per-component: берётся из Figma MCP для каждого компонента и может различаться (linked libraries). Базовый файл-точка-входа: `Khh7arsuXss3ncqy1Dz3OZ` (UI Kit v2.0); компоненты могут жить в связанных файлах библиотек. nodeId/componentKey пилотов вытаскивать через Figma MCP. Если MCP недоступен — `fileKey/nodeId/componentKey: null`, `status: orphan-code`. +- Дата `updated:` во всех файлах = `2026-06-22`. +- Никаких рантайм-зависимостей. validator — devDependency `js-yaml`. +- Не модифицировать `.env`, `angular.json`, существующие `*.component.ts`. Создаём только новые файлы. + +--- + +### Task 1: Validator-скрипт (контракт формата) + +**Files:** +- Create: `scripts/figma-code-connect/validate.mjs` +- Create: `scripts/figma-code-connect/__fixtures__/valid.figma.md` +- Create: `scripts/figma-code-connect/__fixtures__/invalid-missing-frontmatter.figma.md` +- Create: `scripts/figma-code-connect/__fixtures__/invalid-wrong-section-order.figma.md` +- Create: `scripts/figma-code-connect/validate.test.mjs` +- Modify: `package.json` — добавить script `"validate:figma-cc": "node scripts/figma-code-connect/validate.mjs"` и devDependency `"js-yaml": "^4.1.0"`. + +**Interfaces:** +- Consumes: ничего. +- Produces: CLI `node scripts/figma-code-connect/validate.mjs [path...]` — без аргументов сканирует `src/lib/**/*.figma.md`; с аргументами валидирует переданные файлы. Exit 0 = OK, 1 = errors; ошибки в stderr строкой `: `. Экспорт `validateFile(path): Promise`. + +**Steps:** + +- [ ] **Step 1: Создать fixture валидного файла** `scripts/figma-code-connect/__fixtures__/valid.figma.md`: + +``` +--- +component: extra-fixture +selector: extra-fixture +import: + symbol: ExtraFixtureComponent + from: '@cdek-it/angular-ui-kit' +figma: + fileKey: TESTKEY + nodeId: '1:2' + componentKey: stable-key + name: 'Fixture' +status: stable +updated: 2026-06-22 +--- + +## Overview +Тестовый компонент. + +## Props mapping +| Figma | Angular | Type | Notes | +|-------|---------|------|-------| +| Size | size | 'sm' | | + +## Variants +### Default +Figma nodeId: `1:3` + +```html + +``` + +## Slots +Нет. + +## Related +Нет. + +## Do / Don't +- ✅ ОК. +- ❌ Не ОК. +``` + +- [ ] **Step 2: Fixture с пропущенным frontmatter** `scripts/figma-code-connect/__fixtures__/invalid-missing-frontmatter.figma.md`: + +``` +## Overview +Нет frontmatter. +``` + +- [ ] **Step 3: Fixture с нарушенным порядком секций** `scripts/figma-code-connect/__fixtures__/invalid-wrong-section-order.figma.md` — копия валидного, но `## Variants` стоит перед `## Props mapping`. + +- [ ] **Step 4: Тест `validate.test.mjs`** (запустить до реализации — должен упасть): + +```javascript +import { strict as assert } from 'node:assert'; +import { test } from 'node:test'; +import { validateFile } from './validate.mjs'; + +test('valid fixture passes', async () => { + const errors = await validateFile('scripts/figma-code-connect/__fixtures__/valid.figma.md'); + assert.deepEqual(errors, []); +}); + +test('missing frontmatter fails', async () => { + const errors = await validateFile('scripts/figma-code-connect/__fixtures__/invalid-missing-frontmatter.figma.md'); + assert.ok(errors.some(e => /frontmatter/i.test(e))); +}); + +test('wrong section order fails', async () => { + const errors = await validateFile('scripts/figma-code-connect/__fixtures__/invalid-wrong-section-order.figma.md'); + assert.ok(errors.some(e => /order/i.test(e))); +}); +``` + +- [ ] **Step 5: Запустить тест — ожидать FAIL** `node --test scripts/figma-code-connect/validate.test.mjs` → fail (нет validate.mjs). + +- [ ] **Step 6: Реализовать `scripts/figma-code-connect/validate.mjs`**: + +```javascript +import { readFile } from 'node:fs/promises'; +import yaml from 'js-yaml'; + +const REQUIRED_FIELDS = ['component', 'selector', 'import', 'figma', 'status', 'updated']; +const REQUIRED_FIGMA = ['fileKey', 'nodeId', 'componentKey', 'name']; +const SECTION_ORDER = ['## Overview', '## Props mapping', '## Variants', '## Slots', '## Related', "## Do / Don't"]; + +export async function validateFile(path) { + const errors = []; + const raw = await readFile(path, 'utf8'); + const m = raw.match(/^---\n([\s\S]*?)\n---\n([\s\S]*)$/); + if (!m) { errors.push(`${path}: missing frontmatter`); return errors; } + let fm; + try { fm = yaml.load(m[1]); } + catch (e) { errors.push(`${path}: invalid YAML: ${e.message}`); return errors; } + for (const f of REQUIRED_FIELDS) if (!(f in fm)) errors.push(`${path}: missing field ${f}`); + if (fm.figma) for (const f of REQUIRED_FIGMA) if (!(f in fm.figma)) errors.push(`${path}: missing figma.${f}`); + const body = m[2]; + const positions = SECTION_ORDER.map(s => body.indexOf(`\n${s}`)); + const present = positions.map((p, i) => [p, i]).filter(([p]) => p !== -1); + for (let i = 1; i < present.length; i++) { + if (present[i][0] < present[i-1][0]) { + errors.push(`${path}: section order violation near ${SECTION_ORDER[present[i][1]]}`); + break; + } + } + for (const f of [...body.matchAll(/^```(\w*)$/gm)]) + if (!f[1]) errors.push(`${path}: code-fence without language`); + return errors; +} + +if (import.meta.url === `file://${process.argv[1]}`) { + const args = process.argv.slice(2); + let files; + if (args.length) files = args; + else { + const { glob } = await import('node:fs/promises'); + files = []; + for await (const p of glob('src/lib/**/*.figma.md')) files.push(p); + } + let total = 0; + for (const f of files) { + const errs = await validateFile(f); + for (const e of errs) console.error(e); + total += errs.length; + } + process.exit(total === 0 ? 0 : 1); +} +``` + +- [ ] **Step 7: Запустить тест — PASS** `node --test scripts/figma-code-connect/validate.test.mjs`. + +- [ ] **Step 8: Обновить `package.json`** — добавить в `scripts`: `"validate:figma-cc": "node scripts/figma-code-connect/validate.mjs"`; в `devDependencies`: `"js-yaml": "^4.1.0"`; запустить `npm install`. + +- [ ] **Step 9: CLI smoke** — `node scripts/figma-code-connect/validate.mjs scripts/figma-code-connect/__fixtures__/valid.figma.md` → exit 0; на `invalid-missing-frontmatter.figma.md` → exit 1 + stderr. + +- [ ] **Step 10: Commit** `git add scripts/figma-code-connect/ package.json package-lock.json && git commit -m "feat(figma-cc): add validator and fixtures"`. + +--- + +### Task 2: schema.md + README.md + +**Files:** +- Create: `src/lib/figma-code-connect/schema.md` +- Create: `src/lib/figma-code-connect/README.md` + +**Interfaces:** +- Consumes: validator из Task 1. +- Produces: ссылочные документы для Tasks 3–7. + +**Steps:** + +- [ ] **Step 1: Написать `schema.md`** с полной спецификацией: + - Перечень обязательных полей frontmatter (`component`, `selector`, `import.{symbol,from}`, `figma.{fileKey,nodeId,componentKey,name}`, `status`, `updated`). + - Опциональные: `deprecated.{replaceWith,since,reason}`. + - Фиксированный порядок секций тела (6 пунктов из Global Constraints). + - Правила: code-fence с языком; никаких inline-значений токенов/иконок; ссылки на `tokens.md` / `icons.md`. + +- [ ] **Step 2: Написать `README.md`** — точка входа: краткое описание, ссылки на schema/conventions/tokens/icons/missing, инструкция «как агент использует» (grep по nodeId), команда валидации `npm run validate:figma-cc`. + +- [ ] **Step 3: Прогнать validator** `npm run validate:figma-cc` → exit 0 (validator сканирует только `src/lib/**/*.figma.md`, глобалы в `src/lib/figma-code-connect/*.md` не валидируются). + +- [ ] **Step 4: Commit** `git add src/lib/figma-code-connect/schema.md src/lib/figma-code-connect/README.md && git commit -m "feat(figma-cc): add schema and README"`. + +--- + +### Task 3: conventions.md + +**Files:** +- Create: `src/lib/figma-code-connect/conventions.md` + +**Interfaces:** +- Consumes: ничего. +- Produces: справочник, на который ссылается README.md и индивидуальные `.figma.md`. + +**Steps:** + +- [ ] **Step 1: Написать `conventions.md`** с разделами: + - **Naming**: префикс селектора `extra-`, класс `ExtraComponent`, импорт из `@cdek-it/angular-ui-kit`. + - **Figma property → Angular @Input**: `Variant=primary` → `variant="primary"`, `State=Disabled` → `[disabled]="true"`, `Size=base` → `size="base"`, boolean Figma props → `[prop]="true|false"`. + - **Two-way binding**: `[(visible)]`, `[(ngModel)]`. + - **Slots / content projection**: структурные директивы `extraHeader`/`extraFooter` либо ``. + - **Red lines**: не описывать приватные компоненты; не дублировать Storybook; не описывать runtime-логику; не инлайнить токены; не создавать файлы под отдельные варианты. + +- [ ] **Step 2: Validator** `npm run validate:figma-cc` → exit 0. + +- [ ] **Step 3: Commit** `git add src/lib/figma-code-connect/conventions.md && git commit -m "feat(figma-cc): add conventions"`. + +--- + +### Task 4: tokens.md + icons.md + missing.md + +**Files:** +- Create: `src/lib/figma-code-connect/tokens.md` +- Create: `src/lib/figma-code-connect/icons.md` +- Create: `src/lib/figma-code-connect/missing.md` + +**Interfaces:** +- Consumes: `src/lib/providers/prime-preset/` (текущие токены), `src/styles.scss`, опционально Figma MCP variables. +- Produces: anchor-ссылки для индивидуальных `.figma.md`. + +**Steps:** + +- [ ] **Step 1: Собрать актуальные токены** — `grep -r --include='*.ts' 'preset' src/lib/providers/prime-preset/ | head -50`, прочитать `src/styles.scss`. Если значения недоступны — отметить «pending» и сослаться на `missing.md`. + +- [ ] **Step 2: Написать `tokens.md`** — разделы Colors / Spacing / Radius / Typography. Каждый — таблица или подразделы с anchor-friendly заголовками (`### color-primary`, `### spacing-base`). Минимум 1 строка в каждой таблице. Inline-значения недопустимы в `.figma.md`, но в `tokens.md` сами значения и есть контент. + +- [ ] **Step 3: Написать `icons.md`** — источник иконок (`primeicons` через PrimeNG); таблица `Figma layer | код | пример использования`; правила (передача строкой `'pi pi-'`, цвет наследуется). + +- [ ] **Step 4: Написать `missing.md`** — backlog таблица `Figma name | nodeId | componentKey | заметка | статус`, изначально пустая, с пояснением «не путать с `status: orphan-code`». + +- [ ] **Step 5: Validator** `npm run validate:figma-cc` → exit 0. + +- [ ] **Step 6: Commit** `git add src/lib/figma-code-connect/tokens.md src/lib/figma-code-connect/icons.md src/lib/figma-code-connect/missing.md && git commit -m "feat(figma-cc): add tokens, icons, missing globals"`. + +--- + +### Task 5: button.figma.md (пилот 1) + +**Files:** +- Create: `src/lib/components/button/button.figma.md` +- Read: `src/lib/components/button/button.component.ts`, `src/lib/components/button/public_api.ts`, `src/stories/components/button/button.stories.ts`. + +**Interfaces:** +- Consumes: schema (Task 2), conventions (Task 3), tokens/icons (Task 4). +- Produces: эталон формата для Tasks 6–7. + +**Steps:** + +- [ ] **Step 1: Получить Figma данные.** Через Figma MCP (`figma fileKey Khh7arsuXss3ncqy1Dz3OZ`) найти компонент `Button`: nodeId componentSet, componentKey, nodeId каждого variant. Если MCP недоступен — `figma.nodeId: null`, `figma.componentKey: null`, `status: orphan-code`; в `## Overview` второе предложение «Маппинг Figma в процессе синхронизации.». + +- [ ] **Step 2: Написать `button.figma.md`** с frontmatter (component/selector/import/figma/status/updated) и телом по schema. Покрыть варианты: Primary/Base, Secondary/Base, Outlined/Large, Text/Base, Link/Base, With icon (prefix), Icon only, Loading, Danger. Props mapping должен покрывать все `@Input` из `button.component.ts` (variant, size, severity, disabled, loading, iconPos, iconOnly, showBadge, badge, badgeSeverity, rounded, fluid, label, icon, ariaLabel). Иконку передавать строкой `'pi pi-'`. Ссылка на `icons.md` обязательна. + +- [ ] **Step 3: Validator** `npm run validate:figma-cc` → exit 0. При ошибке — поправить frontmatter/секции. + +- [ ] **Step 4: Smoke lookup** (только если nodeId заполнен): `grep -rl --include='*.figma.md' "nodeId: '<один_из_nodeId>'" src/lib/components` → одна строка `src/lib/components/button/button.figma.md`. + +- [ ] **Step 5: Commit** `git add src/lib/components/button/button.figma.md && git commit -m "feat(figma-cc): add button.figma.md pilot"`. + +--- + +### Task 6: inputtext.figma.md (пилот 2) + +**Files:** +- Create: `src/lib/components/inputtext/inputtext.figma.md` +- Read: `src/lib/components/inputtext/inputtext.component.ts`, `src/stories/components/inputtext/*.stories.ts`. + +**Interfaces:** +- Consumes: schema (Task 2), conventions (Task 3). +- Produces: пример с ControlValueAccessor (FormControl/ngModel). + +**Steps:** + +- [ ] **Step 1: Figma данные** аналогично Task 5 Step 1, имя в Figma — `Input / Text` (либо `TextField`/`Input` — найти точное). + +- [ ] **Step 2: Написать `inputtext.figma.md`** с frontmatter и телом. Selector `extra-input-text`, symbol `ExtraInputTextComponent`. Props: `size`, `disabled`, `readonly`, `showClear`, `fluid`, `placeholder`, value через `[(ngModel)]` / `formControl`. Варианты: Default/Base, With clear, Disabled, Fluid/Large, With reactive form. В `## Related` — `inputgroup` и `form-field`. В `## Do/Don't` — обязательность использования `[(ngModel)]`/`formControl` (компонент реализует CVA). + +- [ ] **Step 3: Validator** `npm run validate:figma-cc` → exit 0. + +- [ ] **Step 4: Commit** `git add src/lib/components/inputtext/inputtext.figma.md && git commit -m "feat(figma-cc): add inputtext.figma.md pilot"`. + +--- + +### Task 7: dialog.figma.md (пилот 3) + +**Files:** +- Create: `src/lib/components/dialog/dialog.figma.md` +- Read: `src/lib/components/dialog/dialog.component.ts`, `src/stories/components/dialog/*.stories.ts`. + +**Interfaces:** +- Consumes: schema (Task 2), conventions (Task 3). +- Produces: пример композиции (dialog с button в footer) — демонстрирует `## Related` в действии. + +**Steps:** + +- [ ] **Step 1: Figma данные** аналогично Task 5 Step 1, имя `Dialog`. + +- [ ] **Step 2: Написать `dialog.figma.md`** с frontmatter и телом. Selector `extra-dialog`, symbol `ExtraDialogComponent`. Props: `size` (`'sm' | 'default' | 'lg' | 'xlg'`), `modal`, `header`, `dismissableMask`, `closeOnEscape`, `showHeader`, `[(visible)]`. Варианты: Default/md, Large with custom header (через `*extraDialogHeader`), With actions in footer (через `*extraDialogFooter` с `extra-button`), Non-modal. В `## Slots`: ``, `*extraDialogHeader`, `*extraDialogFooter`. В `## Related` — `button`, `confirm-dialog`. В `## Do/Don't` — управлять через `[(visible)]`, не `*ngIf`; не более 2 кнопок в footer; не выключать `closeOnEscape` (a11y). + +- [ ] **Step 3: Validator** `npm run validate:figma-cc` → exit 0. + +- [ ] **Step 4: Commit** `git add src/lib/components/dialog/dialog.figma.md && git commit -m "feat(figma-cc): add dialog.figma.md pilot"`. + +--- + +### Task 8: Acceptance — сквозная проверка + +**Files:** +- Опционально modify: `package.json` — добавить `"prebuild": "npm run validate:figma-cc"`. +- Read: `docs/superpowers/specs/2026-06-22-figma-code-connect-static-design.md` секция 9. + +**Interfaces:** +- Consumes: всё из Tasks 1–7. +- Produces: подтверждение MVP-критериев. + +**Steps:** + +- [ ] **Step 1: Полный прогон validator** `npm run validate:figma-cc` → exit 0, без stderr. + +- [ ] **Step 2: Lookup smoke по каждому пилоту**: + - `grep -rl --include='*.figma.md' "component: extra-button" src/lib/components` → `src/lib/components/button/button.figma.md`. + - Аналогично для `extra-input-text` и `extra-dialog`. + +- [ ] **Step 3: Сверка с spec § 9** — открыть spec, проверить 5 критериев приёмки; каждый — closed by соответствующая Task. + +- [ ] **Step 4: Опционально prebuild hook** — если согласовано, в `package.json` добавить `"prebuild": "npm run validate:figma-cc"`. Иначе пропустить. + +- [ ] **Step 5: Commit** (если prebuild добавлен) `git add package.json && git commit -m "chore(figma-cc): wire validator into prebuild"`. + +--- + +## Self-Review + +**Spec coverage:** +- § 1–2 → Architecture + Tasks 2–7. +- § 3 → Tasks 5–7 (структура); Task 2 (формализация); Task 1 (валидация). +- § 4 → Task 8 Step 2. +- § 5 → Tasks 5–7 Step 1 (источники). +- § 6 → fallback orphan-code в Global Constraints и Tasks 5–7. +- § 7 → conventions.md (Task 3). +- § 8 → план учитывает доступность/недоступность MCP. +- § 9 → Task 8. + +**Type consistency:** `validateFile(path)` определён в Task 1, использован там же. Селекторы `extra-button`, `extra-input-text`, `extra-dialog` соответствуют реальным. + +**Placeholders:** нет TBD-плейсхолдеров. Метки получения Figma данных — рабочие инструкции с явным fallback на `orphan-code`. diff --git a/docs/superpowers/specs/2026-06-22-figma-code-connect-static-design.md b/docs/superpowers/specs/2026-06-22-figma-code-connect-static-design.md new file mode 100644 index 00000000..669b73c7 --- /dev/null +++ b/docs/superpowers/specs/2026-06-22-figma-code-connect-static-design.md @@ -0,0 +1,181 @@ +# Статический Figma Code Connect — дизайн + +**Дата:** 2026-06-22 +**Проект:** `@cdek-it/angular-ui-kit` (Angular 20 + PrimeNG) +**Тип:** design spec +**Статус:** утверждён к реализации + +## 1. Постановка задачи + +Реализовать статический (file-based) аналог Figma Code Connect для Angular UI Kit. +Цель — предоставить LLM-агенту тот же контекст связки «Figma-компонент ↔ кодовый компонент», +который даёт оригинальный Figma Code Connect, но без рантайма Figma CLI и без TypeScript-DSL. + +**Потребитель:** LLM/Claude при генерации Angular-кода (страниц, виджетов) по Figma-дизайну. +**Триггер:** агент получает Figma `nodeId` / `componentKey` из MCP и ищет соответствующий файл контекста. +**Не-цели:** +- Не заменяет Storybook (это не интерактивная песочница). +- Не описывает приватные компоненты. +- Не отражает runtime-логику (animations, CDK overlay) — только props/template-API. + +## 2. Архитектура файлов + +### Расположение +Колокация рядом с компонентом: + +``` +src/lib/components//.figma.md +``` + +Один кодовый компонент → один `.figma.md`. Варианты компонента (`primary`, `secondary`, +`outlined` и т.д.) — секциями внутри файла, отдельных файлов под варианты нет. + +### Глобальные артефакты +``` +src/lib/figma-code-connect/ + README.md # точка входа: что это, как использовать + schema.md # единственный источник правды о формате + conventions.md # общие соглашения проекта (префиксы, naming) + tokens.md # маппинг Figma variables → CSS-переменные / Tailwind + icons.md # icon-set: имена в Figma → имена в коде + missing.md # backlog: Figma-компоненты без реализации в коде +``` + +Индивидуальные `.figma.md` ссылаются на глобалы через относительные ссылки +(`[token](../../figma-code-connect/tokens.md#color-primary)`). Значения не дублируются. + +## 3. Структура файла `.figma.md` + +### Frontmatter (YAML) + +Обязательные поля: +```yaml +--- +component: extra-button # имя Angular-компонента (обратный поиск) +selector: extra-button # Angular-селектор +import: + symbol: ExtraButtonComponent + from: '@cdek-it/angular-ui-kit' +figma: + fileKey: # per-component; берётся из Figma MCP для каждого компонента; может различаться при использовании linked libraries + nodeId: '123:456' # ID родительского componentSet (или массив) + componentKey: + name: 'Button' # имя в Figma (для отладки) +status: stable | beta | deprecated | orphan-code +updated: 2026-06-22 +--- +``` + +Опциональные поля: +```yaml +deprecated: + replaceWith: extra-other + since: 2026-03-01 + reason: 'Заменён на extra-other из-за изменения a11y-контракта' +``` + +Если `nodeId` — массив, в `Overview` обязана быть заметка о правилах выбора. + +### Тело — фиксированный порядок секций + +1. `## Overview` — 1–2 предложения о назначении, когда брать именно этот компонент. +2. `## Props mapping` — таблица `Figma property | Angular @Input | Type / values | Notes`. +3. `## Variants` — для каждого варианта `### ` + строка `Figma nodeId: \`\`` + code-fence `html` со сниппетом. +4. `## Slots` — описание `ng-content` / структурных директив; «Нет.» если отсутствуют. +5. `## Related` — ссылки на смежные `.figma.md`; «Нет.» если отсутствуют. +6. `## Do / Don't` — список `✅`/`❌`, ≤ 5 пунктов. + +### Правила тела +- Жёсткий порядок секций (для детерминированного парсинга). +- Все code-fence обязаны иметь язык (`html`, `ts`, `scss`). +- Свободного текста между секциями нет — только содержимое самих секций. +- Никаких inline-значений токенов или цветов — только ссылки на `tokens.md`. + +## 4. Поиск по `nodeId` (lookup) + +**MVP-стратегия:** без индекс-файла. + +``` +grep -rl "nodeId: '123:456'" src/lib/components --include='*.figma.md' +``` + +Работает потому что: +- `.figma.md` ≤ количества компонентов (~40); +- frontmatter содержит `nodeId` родителя, секции `## Variants` — `nodeId` каждого варианта; +- grep по проекту такого размера < 100 мс. + +**Обратный lookup (по имени компонента):** соглашение пути +`src/lib/components//.figma.md` — агент строит путь напрямую. + +**Когда добавим индекс:** при превышении ~200 компонентов или времени grep > 500 мс. +До тех пор — YAGNI. + +## 5. Источники данных и процесс генерации + +### Источники (в порядке приоритета при конфликте) + +1. **Figma MCP** — `componentKey`, `nodeId`, variants, Figma property panel. +2. **`src/lib/components//.component.ts`** — селектор, `@Input`/`@Output`, + типы (`ExtraButtonVariant = 'primary' | …`), дефолты. +3. **`src/stories/components//*.stories.ts`** — канонические сниппеты для `## Variants`. +4. **`public_api.ts`** — реальный import symbol и публичный путь. + +### Разрешение конфликтов +- Тип в коде ≠ variant в Figma → побеждает код. Заметка в `## Do / Don't`. +- Селектор не совпадает с шаблоном `extra-*` → фиксируется как есть, `status: beta`. + +### Генерация одного файла +1. Прочитать `.component.ts` → props, типы, селектор. +2. Прочитать `public_api.ts` → import symbol. +3. Figma MCP по имени → `nodeId`, `componentKey`, variants. +4. Прочитать stories в `src/stories/components//` (если есть) → канонические сниппеты. +5. Скомпоновать `.figma.md` строго по schema. +6. Self-check: все обязательные поля frontmatter заполнены, все Figma-variants + представлены секциями `## Variants`. + +### Обновление существующего файла +- Триггер: изменение `.component.ts` или соответствующих stories. +- Регенерация по тому же процессу, но `figma.fileKey/nodeId/componentKey` берутся + из старого frontmatter (Figma-ID стабильнее имени). +- Поле `updated:` обновляется на текущую дату. + +## 6. Edge cases + +| Случай | Поведение | +|--------|-----------| +| Компонент в коде, нет в Figma | Файл создаётся, `figma.nodeId = null`, `status: orphan-code`. Агент не предлагает первым при генерации. | +| Компонент в Figma, нет в коде | Файл НЕ создаётся. Запись в `figma-code-connect/missing.md`. | +| Variant в Figma не покрыт типом в коде | Блок `### …` создаётся, в code-fence `` + сниппет ближайшего поддерживаемого. Запись в `## Do / Don't`. | +| Несколько Figma-компонентов → один кодовый | `figma.nodeId` — массив, в `## Overview` правила выбора. | +| Deprecated | `status: deprecated` + поле `deprecated: { replaceWith, since, reason }`. Агент только распознаёт, не предлагает. | +| Composition (dialog→button) | В `## Related` — ссылка, в `## Variants` — пример композиции. Детали зависимого компонента не дублируются. | +| Токены/иконки | Только ссылки на `tokens.md` / `icons.md`. Inline-значений нет. | + +## 7. Red lines + +- Не описывать приватные компоненты (которых нет в `public_api.ts`). +- Не отражать runtime-логику (анимации, CDK overlay, router-выборы). +- Не дублировать Storybook — это контракт, а не песочница. +- Не инлайнить значения токенов/иконок — только ссылки на глобалы. +- Не создавать отдельные файлы под варианты компонента. + +## 8. Что нужно от пользователя + +**Обязательно:** +- URL Figma-файла UI Kit (для MCP). +- Подтверждение прав на запись в `src/lib/`. +- Решение по MVP-объёму: пилот на 3–5 компонентов или сразу все ~40. + +**Желательно:** +- Существующий `figma.config.json` / Code Connect TS-файлы (если есть) — для переиспользования nodeId. +- Канонические Storybook stories (`src/stories/`) как источник сниппетов. +- Внутренние соглашения по a11y и именованию иконок. + +## 9. Критерии приёмки (MVP) + +1. Создан каркас `src/lib/figma-code-connect/` со всеми пятью глобальными файлами. +2. Сгенерированы `.figma.md` для пилотных компонентов (`button`, `inputtext`, `dialog`). +3. Каждый пилотный файл проходит self-check по `schema.md`. +4. Lookup по `nodeId` через grep возвращает корректный файл. +5. Агент по `.figma.md` пилотного компонента генерирует валидный Angular-код, + соответствующий контракту в коде (props, типы, селектор). diff --git a/package-lock.json b/package-lock.json index 5fe8bcf3..4cee0460 100644 --- a/package-lock.json +++ b/package-lock.json @@ -31,6 +31,7 @@ "@angular/router": "20.3.15", "@compodoc/compodoc": "1.1.32", "@primeng/themes": "20.4.0", + "@primeuix/themes": "1.2.5", "@storybook/addon-a11y": "10.1.8", "@storybook/addon-docs": "10.1.8", "@storybook/addon-themes": "^10.1.8", @@ -46,6 +47,7 @@ "eslint-plugin-prefer-arrow": "1.2.3", "eslint-plugin-storybook": "10.1.8", "jasmine-core": "5.13.0", + "js-yaml": "^4.1.0", "karma": "6.4.4", "karma-chrome-launcher": "3.2.0", "karma-coverage": "2.2.1", diff --git a/package.json b/package.json index 8fa837c7..334eade9 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,8 @@ "build:storybook": "ng run angular-ui-kit:build-storybook", "build:lib": "ng build angular-ui-kit-lib", "security:check": "npm audit --production --audit-level high", - "copy:dist": "cpx 'src/lib/providers/prime-preset/**/*.{json,ts}' dist/ && cpx 'src-tokens/theme.preset.ts' dist/" + "copy:dist": "cpx 'src/lib/providers/prime-preset/**/*.{json,ts}' dist/ && cpx 'src-tokens/theme.preset.ts' dist/", + "validate:figma-cc": "node scripts/figma-code-connect/validate.mjs" }, "repository": "github:cdek-it/angular-ui-kit", "devDependencies": { @@ -60,6 +61,7 @@ "eslint-plugin-prefer-arrow": "1.2.3", "eslint-plugin-storybook": "10.1.8", "jasmine-core": "5.13.0", + "js-yaml": "^4.1.0", "karma": "6.4.4", "karma-chrome-launcher": "3.2.0", "karma-coverage": "2.2.1", diff --git a/scripts/figma-code-connect/__fixtures__/invalid-bad-status.figma.md b/scripts/figma-code-connect/__fixtures__/invalid-bad-status.figma.md new file mode 100644 index 00000000..b19e2d61 --- /dev/null +++ b/scripts/figma-code-connect/__fixtures__/invalid-bad-status.figma.md @@ -0,0 +1,40 @@ +--- +component: extra-fixture +selector: extra-fixture +import: + symbol: ExtraFixtureComponent + from: '@cdek-it/angular-ui-kit' +figma: + fileKey: TESTKEY + nodeId: '1:2' + componentKey: stable-key + name: 'Fixture' +status: nonsense +updated: '2026-06-22' +--- + +## Overview +Тестовый компонент. + +## Props mapping +| Figma | Angular | Type | Notes | +|-------|---------|------|-------| +| Size | size | 'sm' | | + +## Variants +### Default +Figma nodeId: `1:3` + +```html + +``` + +## Slots +Нет. + +## Related +Нет. + +## Do / Don't +- ✅ ОК. +- ❌ Не ОК. diff --git a/scripts/figma-code-connect/__fixtures__/invalid-closing-fence-language.figma.md b/scripts/figma-code-connect/__fixtures__/invalid-closing-fence-language.figma.md new file mode 100644 index 00000000..075c8978 --- /dev/null +++ b/scripts/figma-code-connect/__fixtures__/invalid-closing-fence-language.figma.md @@ -0,0 +1,40 @@ +--- +component: extra-fixture +selector: extra-fixture +import: + symbol: ExtraFixtureComponent + from: '@cdek-it/angular-ui-kit' +figma: + fileKey: TESTKEY + nodeId: '1:2' + componentKey: stable-key + name: 'Fixture' +status: stable +updated: '2026-06-22' +--- + +## Overview +Тестовый компонент. + +## Props mapping +| Figma | Angular | Type | Notes | +|-------|---------|------|-------| +| Size | size | 'sm' | | + +## Variants +### Default +Figma nodeId: `1:3` + +```html + +```html + +## Slots +Нет. + +## Related +Нет. + +## Do / Don't +- ✅ ОК. +- ❌ Не ОК. diff --git a/scripts/figma-code-connect/__fixtures__/invalid-dangling-cross-link.figma.md b/scripts/figma-code-connect/__fixtures__/invalid-dangling-cross-link.figma.md new file mode 100644 index 00000000..3f1eb722 --- /dev/null +++ b/scripts/figma-code-connect/__fixtures__/invalid-dangling-cross-link.figma.md @@ -0,0 +1,40 @@ +--- +component: extra-fixture-link +selector: extra-fixture-link +import: + symbol: ExtraFixtureLinkComponent + from: '@cdek-it/angular-ui-kit' +figma: + fileKey: TESTKEY + nodeId: '1:9' + componentKey: link-key + name: 'FixtureLink' +status: stable +updated: '2026-06-22' +--- + +## Overview +Фикстура со ссылкой на несуществующий контракт. + +## Props mapping +| Figma | Angular | Type | Notes | +|-------|---------|------|-------| +| Size | size | 'sm' | | + +## Variants +### Default +Figma nodeId: `1:10` + +```html + +``` + +## Slots +Нет. + +## Related +- [Nonexistent](./does-not-exist.figma.md) — намеренно битая ссылка + +## Do / Don't +- ✅ ОК. +- ❌ Не ОК. diff --git a/scripts/figma-code-connect/__fixtures__/invalid-dup-nodeid.figma.md b/scripts/figma-code-connect/__fixtures__/invalid-dup-nodeid.figma.md new file mode 100644 index 00000000..2c998137 --- /dev/null +++ b/scripts/figma-code-connect/__fixtures__/invalid-dup-nodeid.figma.md @@ -0,0 +1,40 @@ +--- +component: extra-fixture-dup +selector: extra-fixture-dup +import: + symbol: ExtraFixtureDupComponent + from: '@cdek-it/angular-ui-kit' +figma: + fileKey: TESTKEY + nodeId: '1:2' + componentKey: dup-key + name: 'FixtureDup' +status: stable +updated: '2026-06-22' +--- + +## Overview +Фикстура с тем же nodeId, что и valid.figma.md (1:2) — для проверки уникальности. + +## Props mapping +| Figma | Angular | Type | Notes | +|-------|---------|------|-------| +| Size | size | 'sm' | | + +## Variants +### Default +Figma nodeId: `1:4` + +```html + +``` + +## Slots +Нет. + +## Related +Нет. + +## Do / Don't +- ✅ ОК. +- ❌ Не ОК. diff --git a/scripts/figma-code-connect/__fixtures__/invalid-missing-frontmatter.figma.md b/scripts/figma-code-connect/__fixtures__/invalid-missing-frontmatter.figma.md new file mode 100644 index 00000000..b8345b33 --- /dev/null +++ b/scripts/figma-code-connect/__fixtures__/invalid-missing-frontmatter.figma.md @@ -0,0 +1,2 @@ +## Overview +Нет frontmatter. diff --git a/scripts/figma-code-connect/__fixtures__/invalid-missing-open-fence-language.figma.md b/scripts/figma-code-connect/__fixtures__/invalid-missing-open-fence-language.figma.md new file mode 100644 index 00000000..304737f0 --- /dev/null +++ b/scripts/figma-code-connect/__fixtures__/invalid-missing-open-fence-language.figma.md @@ -0,0 +1,40 @@ +--- +component: extra-fixture +selector: extra-fixture +import: + symbol: ExtraFixtureComponent + from: '@cdek-it/angular-ui-kit' +figma: + fileKey: TESTKEY + nodeId: '1:2' + componentKey: stable-key + name: 'Fixture' +status: stable +updated: 2026-06-22 +--- + +## Overview +Тестовый компонент. + +## Props mapping +| Figma | Angular | Type | Notes | +|-------|---------|------|-------| +| Size | size | 'sm' | | + +## Variants +### Default +Figma nodeId: `1:3` + +``` + +``` + +## Slots +Нет. + +## Related +Нет. + +## Do / Don't +- ✅ ОК. +- ❌ Не ОК. diff --git a/scripts/figma-code-connect/__fixtures__/invalid-wrong-section-order.figma.md b/scripts/figma-code-connect/__fixtures__/invalid-wrong-section-order.figma.md new file mode 100644 index 00000000..e1958e95 --- /dev/null +++ b/scripts/figma-code-connect/__fixtures__/invalid-wrong-section-order.figma.md @@ -0,0 +1,40 @@ +--- +component: extra-fixture +selector: extra-fixture +import: + symbol: ExtraFixtureComponent + from: '@cdek-it/angular-ui-kit' +figma: + fileKey: TESTKEY + nodeId: '1:2' + componentKey: stable-key + name: 'Fixture' +status: stable +updated: 2026-06-22 +--- + +## Overview +Тестовый компонент. + +## Variants +### Default +Figma nodeId: `1:3` + +```html + +``` + +## Props mapping +| Figma | Angular | Type | Notes | +|-------|---------|------|-------| +| Size | size | 'sm' | | + +## Slots +Нет. + +## Related +Нет. + +## Do / Don't +- ✅ ОК. +- ❌ Не ОК. diff --git a/scripts/figma-code-connect/__fixtures__/valid.figma.md b/scripts/figma-code-connect/__fixtures__/valid.figma.md new file mode 100644 index 00000000..26b549da --- /dev/null +++ b/scripts/figma-code-connect/__fixtures__/valid.figma.md @@ -0,0 +1,40 @@ +--- +component: extra-fixture +selector: extra-fixture +import: + symbol: ExtraFixtureComponent + from: '@cdek-it/angular-ui-kit' +figma: + fileKey: TESTKEY + nodeId: '1:2' + componentKey: stable-key + name: 'Fixture' +status: stable +updated: '2026-06-22' +--- + +## Overview +Тестовый компонент. + +## Props mapping +| Figma | Angular | Type | Notes | +|-------|---------|------|-------| +| Size | size | 'sm' | | + +## Variants +### Default +Figma nodeId: `1:3` + +```html + +``` + +## Slots +Нет. + +## Related +Нет. + +## Do / Don't +- ✅ ОК. +- ❌ Не ОК. diff --git a/scripts/figma-code-connect/validate.mjs b/scripts/figma-code-connect/validate.mjs new file mode 100644 index 00000000..42cac1cb --- /dev/null +++ b/scripts/figma-code-connect/validate.mjs @@ -0,0 +1,121 @@ +import { readFile, access } from 'node:fs/promises'; +import { dirname, resolve } from 'node:path'; +import yaml from 'js-yaml'; + +const REQUIRED_FIELDS = ['component', 'selector', 'import', 'figma', 'status', 'updated']; +const REQUIRED_FIGMA = ['fileKey', 'nodeId', 'componentKey', 'name']; +const SECTION_ORDER = ['## Overview', '## Props mapping', '## Variants', '## Slots', '## Related', "## Do / Don't"]; +const ALLOWED_STATUSES = ['stable', 'beta', 'deprecated', 'orphan-code']; + +// Markdown links pointing at another component's contract, with optional #anchor. +const CROSS_LINK_RE = /\]\(([^)\s#]+\.figma\.md)(#[^)]*)?\)/g; + +const FRONTMATTER_RE = /^---\n([\s\S]*?)\n---\n([\s\S]*)$/; + +function parseFrontmatter(raw) { + const m = raw.match(FRONTMATTER_RE); + if (!m) return null; + try { return { fm: yaml.load(m[1]), body: m[2] }; } + catch { return null; } +} + +export async function validateFile(path) { + const errors = []; + const raw = await readFile(path, 'utf8'); + const m = raw.match(FRONTMATTER_RE); + if (!m) { errors.push(`${path}: missing frontmatter`); return errors; } + let fm; + try { fm = yaml.load(m[1]); } + catch (e) { errors.push(`${path}: invalid YAML: ${e.message}`); return errors; } + for (const f of REQUIRED_FIELDS) if (!(f in fm)) errors.push(`${path}: missing field ${f}`); + if (fm.figma) for (const f of REQUIRED_FIGMA) if (!(f in fm.figma)) errors.push(`${path}: missing figma.${f}`); + if ('status' in fm && !ALLOWED_STATUSES.includes(fm.status)) { + errors.push(`${path}: unknown status "${fm.status}", expected one of: ${ALLOWED_STATUSES.join(' | ')}`); + } + const body = m[2]; + const positions = SECTION_ORDER.map(s => body.indexOf(`\n${s}`)); + const present = positions.map((p, i) => [p, i]).filter(([p]) => p !== -1); + for (let i = 1; i < present.length; i++) { + if (present[i][0] < present[i-1][0]) { + errors.push(`${path}: section order violation near ${SECTION_ORDER[present[i][1]]}`); + break; + } + } + const fences = [...body.matchAll(/^```(\w*)$/gm)]; + for (let i = 0; i < fences.length; i++) { + // Only opening fences (even index: 0, 2, 4, …) must carry a language. + // Closing fences (odd index) are bare ``` per CommonMark spec. + if (i % 2 === 0 && !fences[i][1]) errors.push(`${path}: code-fence without language`); + if (i % 2 === 1 && fences[i][1]) errors.push(`${path}: closing fence has language "${fences[i][1]}", must be bare`); + } + return errors; +} + +// Cross-links to sibling component contracts are reported as warnings, not errors: +// a contract may legitimately reference a pilot that hasn't been written yet +// (forward reference) without blocking the build. +export async function crossLinkWarnings(path) { + const raw = await readFile(path, 'utf8'); + const baseDir = dirname(path); + const seen = new Set(); + const warnings = []; + for (const m of raw.matchAll(CROSS_LINK_RE)) { + const link = m[1]; + const target = resolve(baseDir, link); + if (seen.has(target)) continue; + seen.add(target); + try { + await access(target); + } catch { + warnings.push(`${path}: dangling cross-link → ${link} (file not found)`); + } + } + return warnings; +} + +// nodeId uniqueness is a cross-file invariant, so it can only be checked over the +// whole set of contracts. A nodeId shared by two files breaks grep-based lookup. +export async function duplicateNodeIdErrors(paths) { + const byNodeId = new Map(); + for (const path of paths) { + const raw = await readFile(path, 'utf8'); + const parsed = parseFrontmatter(raw); + const nodeId = parsed?.fm?.figma?.nodeId; + if (!nodeId) continue; + if (!byNodeId.has(nodeId)) byNodeId.set(nodeId, []); + byNodeId.get(nodeId).push(path); + } + const errors = []; + for (const [nodeId, files] of byNodeId) { + if (files.length > 1) { + errors.push(`nodeId '${nodeId}' is not unique — appears in: ${files.join(', ')}`); + } + } + return errors; +} + +export async function validateAll(paths) { + const errors = []; + const warnings = []; + for (const path of paths) { + errors.push(...await validateFile(path)); + warnings.push(...await crossLinkWarnings(path)); + } + errors.push(...await duplicateNodeIdErrors(paths)); + return { errors, warnings }; +} + +if (import.meta.url === `file://${process.argv[1]}`) { + const args = process.argv.slice(2); + let files; + if (args.length) files = args; + else { + const { glob } = await import('node:fs/promises'); + files = []; + for await (const p of glob('src/lib/**/*.figma.md')) files.push(p); + } + const { errors, warnings } = await validateAll(files); + for (const w of warnings) console.error(`warning: ${w}`); + for (const e of errors) console.error(e); + process.exit(errors.length === 0 ? 0 : 1); +} diff --git a/scripts/figma-code-connect/validate.test.mjs b/scripts/figma-code-connect/validate.test.mjs new file mode 100644 index 00000000..2d8f54f8 --- /dev/null +++ b/scripts/figma-code-connect/validate.test.mjs @@ -0,0 +1,68 @@ +import { strict as assert } from 'node:assert'; +import { test } from 'node:test'; +import { validateFile, crossLinkWarnings, duplicateNodeIdErrors, validateAll } from './validate.mjs'; + +const FIX = 'scripts/figma-code-connect/__fixtures__'; + +test('valid fixture passes', async () => { + const errors = await validateFile('scripts/figma-code-connect/__fixtures__/valid.figma.md'); + assert.deepEqual(errors, []); +}); + +test('missing frontmatter fails', async () => { + const errors = await validateFile('scripts/figma-code-connect/__fixtures__/invalid-missing-frontmatter.figma.md'); + assert.ok(errors.some(e => /frontmatter/i.test(e))); +}); + +test('wrong section order fails', async () => { + const errors = await validateFile('scripts/figma-code-connect/__fixtures__/invalid-wrong-section-order.figma.md'); + assert.ok(errors.some(e => /order/i.test(e))); +}); + +test('missing open fence language fails', async () => { + const errors = await validateFile('scripts/figma-code-connect/__fixtures__/invalid-missing-open-fence-language.figma.md'); + assert.ok(errors.some(e => /code-fence/i.test(e))); +}); + +test('unknown status value fails', async () => { + const errors = await validateFile('scripts/figma-code-connect/__fixtures__/invalid-bad-status.figma.md'); + assert.ok(errors.some(e => /unknown status/i.test(e))); +}); + +test('closing fence with language fails', async () => { + const errors = await validateFile('scripts/figma-code-connect/__fixtures__/invalid-closing-fence-language.figma.md'); + assert.ok(errors.some(e => /closing fence/i.test(e))); +}); + +test('dangling cross-link is a warning, not an error', async () => { + const path = `${FIX}/invalid-dangling-cross-link.figma.md`; + const warnings = await crossLinkWarnings(path); + assert.ok(warnings.some(w => /dangling cross-link/i.test(w) && /does-not-exist/.test(w))); + // It must NOT surface as a hard error — forward references are allowed. + const errors = await validateFile(path); + assert.deepEqual(errors, []); +}); + +test('valid fixture has no dangling cross-link warnings', async () => { + const warnings = await crossLinkWarnings(`${FIX}/valid.figma.md`); + assert.deepEqual(warnings, []); +}); + +test('duplicate nodeId across files is an error', async () => { + const errors = await duplicateNodeIdErrors([ + `${FIX}/valid.figma.md`, + `${FIX}/invalid-dup-nodeid.figma.md`, + ]); + assert.ok(errors.some(e => /not unique/i.test(e) && /1:2/.test(e))); +}); + +test('unique nodeIds produce no duplicate error', async () => { + const errors = await duplicateNodeIdErrors([`${FIX}/valid.figma.md`]); + assert.deepEqual(errors, []); +}); + +test('validateAll separates errors from warnings', async () => { + const { errors, warnings } = await validateAll([`${FIX}/invalid-dangling-cross-link.figma.md`]); + assert.deepEqual(errors, []); + assert.ok(warnings.some(w => /dangling cross-link/i.test(w))); +}); diff --git a/scripts/tokens/baseline.json b/scripts/tokens/baseline.json new file mode 100644 index 00000000..869e9334 --- /dev/null +++ b/scripts/tokens/baseline.json @@ -0,0 +1,5072 @@ +{ + "primitive": { + "colors": { + "alpha": { + "white": { + "100": "rgba(255, 255, 255, 0.1000)", + "200": "rgba(255, 255, 255, 0.2000)", + "300": "rgba(255, 255, 255, 0.3000)", + "400": "rgba(255, 255, 255, 0.4000)", + "500": "rgba(255, 255, 255, 0.5000)", + "600": "rgba(255, 255, 255, 0.6000)", + "700": "rgba(255, 255, 255, 0.7000)", + "800": "rgba(255, 255, 255, 0.8000)", + "900": "rgba(255, 255, 255, 0.9000)", + "1000": "#ffffff" + }, + "black": { + "100": "rgba(0, 0, 0, 0.1000)", + "200": "rgba(0, 0, 0, 0.2000)", + "300": "rgba(0, 0, 0, 0.3000)", + "400": "rgba(0, 0, 0, 0.4000)", + "500": "rgba(0, 0, 0, 0.5000)", + "600": "rgba(0, 0, 0, 0.6000)", + "700": "rgba(0, 0, 0, 0.7000)", + "800": "rgba(0, 0, 0, 0.8000)", + "900": "rgba(0, 0, 0, 0.9000)", + "1000": "#000000" + } + }, + "solid": { + "purple": { + "50": "#faf5ff", + "100": "#f3e8ff", + "200": "#e9d5ff", + "300": "#d8b4fe", + "400": "#c084fc", + "500": "#a855f7", + "600": "#9333ea", + "700": "#7e22ce", + "800": "#6b21a8", + "900": "#581c87", + "950": "#3b0764" + }, + "fuchsia": { + "50": "#fdf4ff", + "100": "#fae8ff", + "200": "#f5d0fe", + "300": "#f0abfc", + "400": "#e879f9", + "500": "#d946ef", + "600": "#c026d3", + "700": "#a21caf", + "800": "#86198f", + "900": "#701a75", + "950": "#4a044e" + }, + "pink": { + "50": "#fdf2f8", + "100": "#fce7f3", + "200": "#fbcfe8", + "300": "#f9a8d4", + "400": "#f472b6", + "500": "#ec4899", + "600": "#db2777", + "700": "#be185d", + "800": "#9d174d", + "900": "#831843", + "950": "#500724" + }, + "rose": { + "50": "#fff1f2", + "100": "#ffe4e6", + "200": "#fecdd3", + "300": "#fda4af", + "400": "#fb7185", + "500": "#f43f5e", + "600": "#e11d48", + "700": "#be123c", + "800": "#9f1239", + "900": "#881337", + "950": "#4c0519" + }, + "teal": { + "50": "#f0fdfa", + "100": "#ccfbf1", + "200": "#99f6e4", + "300": "#5eead4", + "400": "#2dd4bf", + "500": "#14b8a6", + "600": "#0d9488", + "700": "#0f766e", + "800": "#115e59", + "900": "#134e4a", + "950": "#042f2e" + }, + "cyan": { + "50": "#ecfeff", + "100": "#cffafe", + "200": "#a5f3fc", + "300": "#67e8f9", + "400": "#22d3ee", + "500": "#06b6d4", + "600": "#0891b2", + "700": "#0e7490", + "800": "#155e75", + "900": "#164e63", + "950": "#013138" + }, + "sky": { + "50": "#f0f9ff", + "100": "#e0f2fe", + "200": "#bae6fd", + "300": "#7dd3fc", + "400": "#38bdf8", + "500": "#0ea5e9", + "600": "#0284c7", + "700": "#0369a1", + "800": "#075985", + "900": "#0c4a6e", + "950": "#082f49" + }, + "blue": { + "50": "#fafdff", + "100": "#f0f9ff", + "200": "#d4ecfe", + "300": "#aad7fb", + "400": "#77baf4", + "500": "#4496e8", + "600": "#1e76cd", + "700": "#18538d", + "800": "#123a61", + "900": "#0e2a45", + "950": "#0c243b" + }, + "indigo": { + "50": "#eef2ff", + "100": "#e0e7ff", + "200": "#c7d2fe", + "300": "#a5b4fc", + "400": "#818cf8", + "500": "#6366f1", + "600": "#4f46e5", + "700": "#4338ca", + "800": "#3730a3", + "900": "#312e81", + "950": "#1e1b4b" + }, + "violet": { + "50": "#fcfaff", + "100": "#f6f0ff", + "200": "#e5d4fe", + "300": "#cbaafb", + "400": "#b284f5", + "500": "#a265ec", + "600": "#9457ea", + "700": "#48188d", + "800": "#321261", + "900": "#240e45", + "950": "#1f0c3b" + }, + "emerald": { + "50": "#ecfdf5", + "100": "#d1fae5", + "200": "#a7f3d0", + "300": "#6ee7b7", + "400": "#34d399", + "500": "#10b981", + "600": "#059669", + "700": "#047857", + "800": "#065f46", + "900": "#064e3b", + "950": "#022c22" + }, + "green": { + "50": "#fafffb", + "100": "#f0fff3", + "200": "#d4fedc", + "300": "#aafbb7", + "400": "#77f48a", + "500": "#44e858", + "600": "#1dc831", + "700": "#168322", + "800": "#12611b", + "900": "#0e4514", + "950": "#0c3b11" + }, + "lime": { + "50": "#f7fee7", + "100": "#ecfccb", + "200": "#d9f99d", + "300": "#bef264", + "400": "#a3e635", + "500": "#84cc16", + "600": "#65a30d", + "700": "#4d7c0f", + "800": "#3f6212", + "900": "#365314", + "950": "#1a2e05" + }, + "red": { + "50": "#fffafa", + "100": "#fff0f0", + "200": "#fed4d4", + "300": "#fbacaa", + "400": "#f47f77", + "500": "#e85244", + "600": "#db3424", + "700": "#8d2218", + "800": "#611912", + "900": "#45120e", + "950": "#3b100c" + }, + "orange": { + "50": "#fffbfa", + "100": "#fff3f0", + "200": "#ffddd5", + "300": "#ffbca9", + "400": "#ff9273", + "500": "#fe6434", + "600": "#d53f0b", + "700": "#a83107", + "800": "#752506", + "900": "#561c05", + "950": "#4b1905" + }, + "amber": { + "50": "#fffbeb", + "100": "#fef3c7", + "200": "#fde68a", + "300": "#fcd34d", + "400": "#fbbf24", + "500": "#f59e0b", + "600": "#d97706", + "700": "#b45309", + "800": "#92400e", + "900": "#78350f", + "950": "#451a03" + }, + "yellow": { + "50": "#fffdfa", + "100": "#fff9f0", + "200": "#ffeed4", + "300": "#fddeaa", + "400": "#facb75", + "500": "#f5b83d", + "600": "#dc9710", + "700": "#9d6d0e", + "800": "#6d4c0b", + "900": "#4f3709", + "950": "#453008" + }, + "slate": { + "50": "#f8fafc", + "100": "#f1f5f9", + "200": "#e2e8f0", + "300": "#cbd5e1", + "400": "#94a3b8", + "500": "#64748b", + "600": "#475569", + "700": "#334155", + "800": "#1e293b", + "900": "#0f172a", + "950": "#020617" + }, + "gray": { + "50": "#f9fafb", + "100": "#f3f4f6", + "200": "#e5e7eb", + "300": "#d1d5db", + "400": "#9ca3af", + "500": "#6b7280", + "600": "#4b5563", + "700": "#374151", + "800": "#1f2937", + "900": "#111827", + "950": "#030712" + }, + "zinc": { + "50": "#fafafa", + "100": "#f0f0f1", + "200": "#e2e2e4", + "300": "#cecfd2", + "400": "#a2a5a9", + "500": "#85888e", + "600": "#6d7076", + "700": "#56595f", + "800": "#404348", + "900": "#2b2e33", + "950": "#181a1f" + }, + "neutral": { + "50": "#fafafa", + "100": "#f5f5f5", + "200": "#e5e5e5", + "300": "#d4d4d4", + "400": "#a3a3a3", + "500": "#737373", + "600": "#525252", + "700": "#404040", + "800": "#262626", + "900": "#171717", + "950": "#0a0a0a" + }, + "stone": { + "50": "#fafaf9", + "100": "#f5f5f4", + "200": "#e7e5e4", + "300": "#d6d3d1", + "400": "#a8a29e", + "500": "#78716c", + "600": "#57534e", + "700": "#44403c", + "800": "#292524", + "900": "#1c1917", + "950": "#0c0a09" + } + } + }, + "borderRadius": { + "100": "0.25rem", + "200": "0.5rem", + "300": "0.75rem", + "400": "1rem", + "500": "1.5rem", + "none": "0rem", + "max": "71.3571rem" + }, + "borderWidth": { + "100": "0.0714rem", + "200": "0.1429rem", + "300": "0.25rem", + "none": "0rem" + }, + "fonts": { + "fontFamily": { + "heading": "TT Fellows", + "base": "PT Sans" + }, + "fontWeight": { + "regular": "400", + "medium": "500", + "demibold": "600", + "bold": "700" + }, + "fontSize": { + "100": "0.75rem", + "200": "0.875rem", + "300": "1rem", + "400": "1.125rem", + "500": "1.25rem", + "600": "1.5rem", + "650": "1.875rem", + "700": "2.25rem", + "750": "3rem", + "800": "3.75rem", + "900": "4.5rem", + "1000": "6rem" + }, + "lineHeight": { + "100": "0.7857rem", + "150": "0.8571rem", + "200": "0.9286rem", + "250": "1rem", + "300": "1.0714rem", + "350": "1.1429rem", + "400": "1.2857rem", + "450": "1.4286rem", + "500": "1.5rem", + "550": "1.5714rem", + "600": "1.7143rem", + "700": "1.8571rem", + "800": "2.2857rem", + "850": "2.3571rem", + "900": "2.7857rem", + "1000": "3.3571rem", + "auto": "auto" + } + }, + "spacing": { + "none": "0rem", + "1x": "0.25rem", + "2x": "0.5rem", + "3x": "0.75rem", + "4x": "1rem", + "5x": "1.25rem", + "6x": "1.5rem", + "7x": "1.75rem", + "8x": "2rem", + "9x": "2.25rem", + "10x": "2.5rem", + "11x": "2.75rem", + "12x": "3rem", + "14x": "3.5rem", + "16x": "4rem", + "20x": "5rem", + "24x": "6rem", + "28x": "7rem", + "32x": "8rem", + "36x": "9rem", + "40x": "10rem" + }, + "sizing": { + "none": "0rem", + "min": "0.0714rem", + "1x": "0.25rem", + "2x": "0.5rem", + "3x": "0.75rem", + "4x": "1rem", + "5x": "1.25rem", + "6x": "1.5rem", + "7x": "1.75rem", + "8x": "2rem", + "9x": "2.25rem", + "10x": "2.5rem", + "11x": "2.75rem", + "12x": "3rem", + "14x": "3.5rem", + "16x": "4rem", + "20x": "5rem", + "24x": "6rem", + "28x": "7rem", + "32x": "8rem", + "36x": "9rem", + "40x": "10rem", + "44x": "11rem", + "48x": "12rem", + "52x": "13rem", + "56x": "14rem", + "60x": "15rem", + "64x": "16rem", + "68x": "17rem", + "72x": "18rem", + "76x": "19rem", + "80x": "20rem", + "84x": "21rem", + "88x": "22rem", + "92x": "23rem", + "96x": "24rem", + "100x": "25rem", + "104x": "26rem", + "108x": "27rem", + "112x": "28rem", + "116x": "29rem", + "120x": "30rem", + "124x": "34rem", + "128x": "45rem", + "132x": "50rem", + "136x": "54rem", + "140x": "58rem", + "144x": "60rem", + "max": "100%" + }, + "shadows": { + "100": "0 0 0.1rem {colors.alpha.black.200}", + "200": "0 0 0.25rem {colors.alpha.black.200}", + "300": "0 0.1rem 0.25rem {colors.alpha.black.200}", + "400": "0 0.25rem 0.5rem {colors.alpha.black.200}", + "500": "0 0.5rem 1rem 0 {colors.alpha.black.200}", + "none": "none" + }, + "transition": { + "easing": { + "linear": "linear", + "in": "cubic-bezier(0.55, 0.06, 0.7, 0.2)", + "out": "cubic-bezier(0.2, 0.6, 0.4, 1)", + "inOut": "cubic-bezier(0.65, 0.05, 0.35, 1)" + }, + "duration": { + "100": "140ms", + "200": "180ms", + "300": "240ms", + "400": "320ms", + "500": "400ms" + } + }, + "opacity": { + "250": "0.25", + "500": "0.5", + "1000": "1" + } + }, + "semantic": { + "list": { + "padding": "{spacing.1x}", + "gap": { + "100": "{spacing.1x}", + "200": "{spacing.2x}" + }, + "header": { + "padding": "{spacing.4x} {spacing.4x} 0 {spacing.4x}" + }, + "option": { + "padding": "{spacing.2x} {spacing.3x}", + "borderRadius": "{borderRadius.200}" + }, + "optionGroup": { + "padding": "{spacing.2x} {spacing.3x}", + "fontWeight": "{fonts.fontWeight.demibold}" + } + }, + "focusRing": { + "width": "{borderWidth.300}", + "style": "none", + "color": "{focusRing.extend.success}", + "offset": "0rem" + }, + "form": { + "padding": { + "100": "{spacing.1x}", + "200": "{spacing.2x}", + "300": "{spacing.3x}", + "400": "{spacing.4x}", + "500": "{spacing.5x}", + "600": "{spacing.6x}", + "700": "{spacing.7x}" + }, + "borderRadius": { + "100": "{borderRadius.200}", + "200": "{borderRadius.300}", + "300": "{borderRadius.max}" + }, + "borderWidth": "{borderWidth.100}", + "icon": { + "100": "{sizing.2x}", + "200": "{sizing.3x}", + "300": "{sizing.4x}", + "400": "{sizing.5x}", + "500": "{sizing.6x}" + }, + "transitionDuration": "{transition.duration.200}", + "size": { + "100": "{sizing.min}", + "150": "{sizing.1x}", + "200": "{sizing.2x}", + "250": "{sizing.3x}", + "300": "{sizing.4x}", + "350": "{sizing.5x}", + "400": "{sizing.6x}", + "500": "{sizing.8x}", + "600": "{sizing.10x}", + "700": "{sizing.12x}", + "800": "{sizing.16x}", + "900": "{sizing.20x}" + }, + "width": { + "100": "{sizing.6x}", + "200": "{sizing.8x}", + "300": "{sizing.10x}", + "350": "{sizing.11x}", + "400": "{sizing.12x}", + "500": "{sizing.60x}", + "full": "{sizing.max}" + }, + "gap": { + "100": "{spacing.1x}", + "200": "{spacing.2x}", + "300": "{spacing.3x}", + "400": "{spacing.4x}" + }, + "focusRing": { + "width": "{focusRing.width}", + "style": "{focusRing.style}", + "color": "{focusRing.color}", + "offset": "{focusRing.offset}" + }, + "sm": { + "width": "{sizing.60x}", + "fontSize": "{fonts.fontSize.300}", + "paddingX": "{spacing.3x}", + "paddingY": "{spacing.3x}" + }, + "fontSize": "{fonts.fontSize.300}", + "paddingX": "{spacing.4x}", + "paddingY": "{spacing.4x}", + "lg": { + "width": "{sizing.76x}", + "fontSize": "{fonts.fontSize.300}", + "paddingX": "{spacing.5x}", + "paddingY": "{spacing.5x}" + }, + "xlg": { + "width": "{sizing.84x}", + "fontSize": "{fonts.fontSize.300}", + "paddingX": "{spacing.6x}", + "paddingY": "{spacing.6x}" + } + }, + "content": { + "borderRadius": "{borderRadius.300}", + "padding": { + "100": "{spacing.1x}", + "200": "{spacing.2x}", + "300": "{spacing.4x}", + "400": "{spacing.6x}", + "500": "{spacing.7x}" + }, + "borderWidth": "{sizing.min}", + "gap": { + "100": "{spacing.1x}", + "200": "{spacing.2x}", + "300": "{spacing.3x}", + "400": "{spacing.4x}" + } + }, + "navigation": { + "width": { + "100": "{borderWidth.100}", + "200": "{borderWidth.300}" + }, + "borderRadius": "{borderRadius.100}", + "padding": { + "100": "{spacing.1x}", + "200": "{spacing.3x}", + "300": "{spacing.4x}", + "400": "{spacing.6x}" + }, + "size": { + "100": "{sizing.1x}", + "200": "{sizing.2x}", + "300": "{sizing.5x}", + "400": "{sizing.8x}", + "500": "{sizing.16x}" + }, + "submenu": { + "padding": "{spacing.5x}" + }, + "list": { + "padding": { + "100": "{spacing.1x}", + "200": "{spacing.2x}" + }, + "gap": "{spacing.1x}" + }, + "item": { + "padding": "{spacing.2x} {spacing.3x}", + "borderRadius": "{borderRadius.200}", + "gap": "{spacing.2x}" + }, + "submenuLabel": { + "padding": "{spacing.2x} {spacing.3x}", + "fontWeight": "{fonts.fontWeight.regular}" + }, + "submenuIcon": { + "size": "{fonts.fontSize.500}" + } + }, + "overlay": { + "mask": { + "transitionDuration": "{transition.duration.200}" + }, + "select": { + "borderRadius": "{borderRadius.300}", + "padding": "{spacing.1x}" + }, + "borderWidth": "{borderWidth.100}", + "icon": { + "size": { + "100": "{sizing.4x}", + "200": "{sizing.6x}", + "300": "{sizing.7x}", + "400": "{sizing.8x}", + "500": "{sizing.9x}" + } + }, + "popover": { + "borderRadius": "{borderRadius.200}", + "width": { + "100": "{sizing.2x}", + "200": "{sizing.3x}" + }, + "padding": { + "100": "{spacing.3x}", + "200": "{spacing.5x}" + } + }, + "modal": { + "borderRadius": "{borderRadius.500}", + "padding": { + "100": "{spacing.4x}", + "200": "{spacing.5x}", + "300": "{spacing.6x}" + } + }, + "gap": { + "100": "{spacing.1x}", + "200": "{spacing.2x}", + "300": "{spacing.3x}", + "400": "{spacing.4x}" + }, + "width": "{sizing.100x}", + "drawer": { + "padding": "{spacing.2x}" + }, + "sm": { + "width": "{sizing.80x}" + }, + "lg": { + "width": "{sizing.120x}" + }, + "xlg": { + "width": "{sizing.128x}" + } + }, + "feedback": { + "transitionDuration": "{transition.duration.200}", + "width": { + "100": "{sizing.min}", + "200": "{sizing.1x}", + "300": "{sizing.2x}", + "400": "{sizing.3x}", + "500": "{sizing.4x}", + "550": "{sizing.5x}", + "600": "{sizing.6x}", + "650": "{sizing.7x}", + "700": "{sizing.8x}", + "800": "{sizing.12x}", + "900": "{sizing.16x}" + }, + "icon": { + "size": { + "100": "{sizing.2x}", + "200": "{sizing.4x}", + "300": "{sizing.6x}", + "350": "{sizing.7x}", + "400": "{sizing.8x}", + "500": "{sizing.9x}" + } + }, + "padding": { + "100": "{spacing.2x}", + "200": "{spacing.4x}" + }, + "height": { + "100": "{sizing.2x}", + "200": "{sizing.3x}", + "300": "{sizing.4x}", + "400": "{sizing.5x}", + "500": "{sizing.6x}", + "600": "{sizing.7x}", + "650": "{sizing.8x}", + "700": "{sizing.9x}", + "750": "{sizing.10x}", + "800": "{sizing.11x}", + "850": "{sizing.12x}", + "900": "{sizing.16x}" + }, + "gap": { + "100": "{spacing.1x}", + "200": "{spacing.2x}", + "300": "{spacing.3x}", + "400": "{spacing.4x}" + } + }, + "data": { + "padding": { + "100": "{spacing.1x}", + "200": "{spacing.2x}", + "300": "{spacing.3x}", + "400": "{spacing.4x}", + "500": "{spacing.5x}" + }, + "icon": { + "size": { + "100": "{sizing.4x}", + "200": "{sizing.5x}", + "300": "{sizing.6x}", + "400": "{sizing.7x}", + "500": "{sizing.8x}", + "600": "{sizing.9x}", + "700": "{sizing.10x}" + } + }, + "transitionDuration": "{transition.duration.200}", + "borderWidth": "{borderWidth.none}", + "borderRadius": "{borderRadius.100}", + "gap": { + "100": "{spacing.1x}", + "200": "{spacing.2x}", + "300": "{spacing.3x}" + }, + "width": { + "100": "{sizing.min}", + "200": "{sizing.1x}", + "300": "{sizing.2x}", + "400": "{sizing.20x}" + } + }, + "media": { + "size": { + "100": "{sizing.1x}", + "200": "{sizing.2x}", + "300": "{sizing.8x}", + "400": "{sizing.10x}", + "500": "{sizing.14x}", + "600": "{sizing.16x}" + }, + "borderRadius": { + "100": "{borderRadius.200}", + "200": "{borderRadius.300}", + "300": "{borderRadius.400}", + "400": "{borderRadius.500}", + "max": "{borderRadius.max}" + }, + "icon": { + "size": { + "100": "{sizing.4x}", + "200": "{sizing.6x}", + "300": "{sizing.8x}" + } + }, + "transitionDuration": "{transition.duration.200}", + "padding": { + "100": "{spacing.1x}", + "200": "{spacing.2x}", + "300": "{spacing.3x}", + "400": "{spacing.4x}", + "500": "{spacing.5x}", + "600": "{spacing.6x}" + }, + "gap": { + "100": "{spacing.1x}", + "200": "{spacing.2x}" + } + }, + "controls": { + "iconOnly": { + "100": "{sizing.2x}", + "200": "{sizing.4x}", + "300": "{sizing.5x}", + "400": "{sizing.6x}", + "500": "{sizing.7x}", + "600": "{sizing.8x}", + "700": "{sizing.10x}", + "800": "{sizing.11x}", + "850": "{sizing.14x}", + "900": "{sizing.16x}" + }, + "borderRadius": { + "100": "{borderRadius.300}", + "200": "{borderRadius.400}", + "max": "{borderRadius.max}" + }, + "transitionDuration": "{transition.duration.200}", + "padding": { + "100": "{spacing.1x}", + "200": "{spacing.2x}", + "300": "{spacing.3x}", + "400": "{spacing.4x}", + "500": "{spacing.5x}", + "600": "{spacing.6x}" + }, + "gap": { + "100": "{spacing.2x}", + "200": "{spacing.3x}", + "300": "{spacing.4x}" + }, + "width": { + "100": "{sizing.min}" + } + }, + "colorScheme": { + "light": { + "success": { + "50": "{colors.solid.green.50}", + "100": "{colors.solid.green.100}", + "200": "{colors.solid.green.200}", + "300": "{colors.solid.green.300}", + "400": "{colors.solid.green.400}", + "500": "{colors.solid.green.500}", + "600": "{colors.solid.green.600}", + "700": "{colors.solid.green.700}", + "800": "{colors.solid.green.800}", + "900": "{colors.solid.green.900}", + "950": "{colors.solid.green.950}" + }, + "info": { + "50": "{colors.solid.blue.50}", + "100": "{colors.solid.blue.100}", + "200": "{colors.solid.blue.200}", + "300": "{colors.solid.blue.300}", + "400": "{colors.solid.blue.400}", + "500": "{colors.solid.blue.500}", + "600": "{colors.solid.blue.600}", + "700": "{colors.solid.blue.700}", + "800": "{colors.solid.blue.800}", + "900": "{colors.solid.blue.900}", + "950": "{colors.solid.blue.950}" + }, + "warn": { + "50": "{colors.solid.yellow.50}", + "100": "{colors.solid.yellow.100}", + "200": "{colors.solid.yellow.200}", + "300": "{colors.solid.yellow.300}", + "400": "{colors.solid.yellow.400}", + "500": "{colors.solid.yellow.500}", + "600": "{colors.solid.yellow.600}", + "700": "{colors.solid.yellow.700}", + "800": "{colors.solid.yellow.800}", + "900": "{colors.solid.yellow.900}", + "950": "{colors.solid.yellow.950}" + }, + "transparent": "rgba(255, 255, 255, 0.0001)", + "help": { + "50": "{colors.solid.purple.50}", + "100": "{colors.solid.purple.100}", + "200": "{colors.solid.purple.200}", + "300": "{colors.solid.purple.300}", + "400": "{colors.solid.purple.400}", + "500": "{colors.solid.purple.500}", + "600": "{colors.solid.purple.600}", + "700": "{colors.solid.purple.700}", + "800": "{colors.solid.purple.800}", + "900": "{colors.solid.purple.900}", + "950": "{colors.solid.purple.950}" + }, + "error": { + "50": "{colors.solid.red.50}", + "100": "{colors.solid.red.100}", + "200": "{colors.solid.red.200}", + "300": "{colors.solid.red.300}", + "400": "{colors.solid.red.400}", + "500": "{colors.solid.red.500}", + "600": "{colors.solid.red.600}", + "700": "{colors.solid.red.700}", + "800": "{colors.solid.red.800}", + "900": "{colors.solid.red.900}", + "950": "{colors.solid.red.950}" + }, + "surface": { + "0": "{colors.alpha.white.1000}", + "50": "{colors.solid.zinc.50}", + "100": "{colors.solid.zinc.100}", + "200": "{colors.solid.zinc.200}", + "300": "{colors.solid.zinc.300}", + "400": "{colors.solid.zinc.400}", + "500": "{colors.solid.zinc.500}", + "600": "{colors.solid.zinc.600}", + "700": "{colors.solid.zinc.700}", + "800": "{colors.solid.zinc.800}", + "900": "{colors.solid.zinc.900}", + "950": "{colors.solid.zinc.950}" + }, + "primary": { + "color": "{colors.solid.green.500}", + "contrastColor": "{colors.alpha.white.1000}", + "hoverColor": "{colors.solid.green.600}", + "activeColor": "{colors.solid.green.700}", + "hoverBackground": "{colors.solid.green.50}", + "activeBackground": "{colors.solid.green.100}", + "borderColor": "{colors.solid.green.200}", + "selectedBackground": "{colors.solid.green.500}", + "selectedHoverBackground": "{colors.solid.green.600}" + }, + "highlight": { + "background": "{colors.solid.zinc.900}", + "focusBackground": "{colors.solid.zinc.800}", + "color": "{colors.alpha.white.1000}", + "focusColor": "{colors.alpha.white.1000}" + }, + "focusRing": { + "shadow": "{shadows.200}", + "extend": { + "invalid": "{colors.solid.red.200}", + "success": "{colors.solid.green.200}", + "warning": "{colors.solid.yellow.200}", + "info": "{colors.solid.blue.200}" + } + }, + "mask": { + "background": "{colors.alpha.black.400}", + "color": "{surface.200}" + }, + "form": { + "background": "{colors.alpha.white.1000}", + "disabledBackground": "{colors.solid.zinc.200}", + "readonlyBackground": "{colors.solid.zinc.100}", + "filledBackground": "{colors.alpha.white.1000}", + "filledHoverBackground": "{colors.alpha.white.1000}", + "filledFocusBackground": "{colors.alpha.white.1000}", + "borderColor": "{colors.solid.zinc.300}", + "hoverBorderPrimaryColor": "{colors.solid.zinc.900}", + "focusBorderPrimaryColor": "{colors.solid.zinc.900}", + "hoverBorderSecondaryColor": "{colors.solid.green.600}", + "focusBorderSecondaryColor": "{colors.solid.green.600}", + "invalidBorderColor": "{colors.solid.red.400}", + "color": "{colors.solid.zinc.950}", + "disabledColor": "{colors.solid.zinc.500}", + "placeholderColor": "{colors.solid.zinc.500}", + "invalidPlaceholderColor": "{colors.solid.red.600}", + "floatLabelColor": "{colors.solid.zinc.500}", + "floatLabelFocusColor": "{colors.solid.zinc.500}", + "floatLabelActiveColor": "{colors.solid.zinc.500}", + "floatLabelInvalidColor": "{form.invalidPlaceholderColor}", + "iconColor": "{colors.solid.zinc.950}", + "backgroundHandler": "{colors.alpha.white.1000}", + "shadow": "{shadows.200}" + }, + "text": { + "color": "{colors.solid.zinc.900}", + "extend": { + "colorPrimaryStatic": "{colors.solid.zinc.900}", + "colorSecondaryStatic": "{colors.alpha.white.1000}", + "colorInverted": "{colors.alpha.white.1000}" + }, + "hoverColor": "{colors.solid.zinc.700}", + "primaryColor": "{colors.solid.green.600}", + "hoverPrimaryColor": "{colors.solid.green.700}", + "secondaryColor": "{colors.solid.zinc.600}", + "hoverSecondaryColor": "{colors.solid.zinc.400}", + "mutedColor": "{colors.solid.zinc.500}", + "hoverMutedColor": "{colors.solid.zinc.300}", + "disabledColor": "{colors.solid.zinc.300}", + "infoColor": "{colors.solid.blue.600}", + "successColor": "{colors.solid.green.700}", + "dangerColor": "{colors.solid.red.600}", + "warningColor": "{colors.solid.yellow.600}", + "helpColor": "{colors.solid.purple.600}" + }, + "content": { + "background": "{colors.alpha.white.1000}", + "hoverBackground": "{colors.solid.zinc.100}", + "borderColor": "{colors.solid.zinc.200}", + "activeBorderColor": "{colors.solid.zinc.800}", + "color": "{text.color}", + "hoverColor": "{text.hoverColor}", + "shadow": "{shadows.400}" + }, + "list": { + "option": { + "background": "{colors.alpha.white.1000}", + "focusBackground": "{colors.solid.zinc.100}", + "selectedBackground": "{colors.solid.zinc.900}", + "selectedFocusBackground": "{colors.solid.zinc.700}", + "color": "{text.color}", + "focusColor": "{text.color}", + "selectedColor": "{text.extend.colorInverted}", + "selectedFocusColor": "{text.extend.colorInverted}", + "icon": { + "color": "{text.color}", + "focusColor": "{text.color}" + } + }, + "optionGroup": { + "background": "{colors.alpha.white.1000}", + "color": "{text.mutedColor}" + } + }, + "overlay": { + "select": { + "background": "{colors.alpha.white.1000}", + "borderColor": "{colors.solid.zinc.200}", + "color": "{text.color}", + "shadow": "0 0.25rem 0.5rem {colors.alpha.black.200}" + }, + "popover": { + "background": "{colors.alpha.white.1000}", + "borderColor": "{form.borderColor}", + "color": "{text.color}", + "shadow": "{shadows.400}" + }, + "modal": { + "background": "{colors.alpha.white.1000}", + "backdrop": "{colors.alpha.black.300}", + "borderColor": "{colors.solid.zinc.200}", + "color": "{text.color}", + "shadow": "{shadows.200}" + } + }, + "navigation": { + "submenuLabel": { + "background": "rgba(255, 255, 255, 0.0000)", + "color": "{text.mutedColor}" + }, + "submenuIcon": { + "color": "{colors.solid.zinc.900}", + "focusColor": "{colors.solid.zinc.900}", + "activeColor": "{colors.alpha.white.1000}" + }, + "item": { + "focusBackground": "{colors.solid.zinc.100}", + "activeBackground": "{colors.solid.zinc.900}", + "color": "{colors.solid.zinc.900}", + "focusColor": "{colors.solid.zinc.900}", + "icon": { + "color": "{colors.solid.zinc.900}", + "focusColor": "{colors.solid.zinc.900}", + "activeColor": "{colors.alpha.white.1000}" + }, + "activeColor": "{colors.alpha.white.1000}" + }, + "shadow": "{shadows.400}" + } + }, + "dark": { + "success": { + "50": "{colors.solid.green.950}", + "100": "{colors.solid.green.900}", + "200": "{colors.solid.green.800}", + "300": "{colors.solid.green.700}", + "400": "{colors.solid.green.600}", + "500": "{colors.solid.green.500}", + "600": "{colors.solid.green.400}", + "700": "{colors.solid.green.300}", + "800": "{colors.solid.green.200}", + "900": "{colors.solid.green.100}", + "950": "{colors.solid.green.50}" + }, + "info": { + "50": "{colors.solid.blue.950}", + "100": "{colors.solid.blue.900}", + "200": "{colors.solid.blue.800}", + "300": "{colors.solid.blue.700}", + "400": "{colors.solid.blue.600}", + "500": "{colors.solid.blue.500}", + "600": "{colors.solid.blue.400}", + "700": "{colors.solid.blue.300}", + "800": "{colors.solid.blue.200}", + "900": "{colors.solid.blue.100}", + "950": "{colors.solid.blue.50}" + }, + "warn": { + "50": "{colors.solid.yellow.950}", + "100": "{colors.solid.yellow.900}", + "200": "{colors.solid.yellow.800}", + "300": "{colors.solid.yellow.700}", + "400": "{colors.solid.yellow.600}", + "500": "{colors.solid.yellow.500}", + "600": "{colors.solid.yellow.400}", + "700": "{colors.solid.yellow.300}", + "800": "{colors.solid.yellow.200}", + "900": "{colors.solid.yellow.100}", + "950": "{colors.solid.yellow.50}" + }, + "transparent": "rgba(0, 0, 0, 0.0001)", + "help": { + "50": "{colors.solid.purple.950}", + "100": "{colors.solid.purple.900}", + "200": "{colors.solid.purple.800}", + "300": "{colors.solid.purple.700}", + "400": "{colors.solid.purple.600}", + "500": "{colors.solid.purple.500}", + "600": "{colors.solid.purple.400}", + "700": "{colors.solid.purple.300}", + "800": "{colors.solid.purple.200}", + "900": "{colors.solid.purple.100}", + "950": "{colors.solid.purple.50}" + }, + "error": { + "50": "{colors.solid.red.950}", + "100": "{colors.solid.red.900}", + "200": "{colors.solid.red.800}", + "300": "{colors.solid.red.700}", + "400": "{colors.solid.red.600}", + "500": "{colors.solid.red.500}", + "600": "{colors.solid.red.400}", + "700": "{colors.solid.red.300}", + "800": "{colors.solid.red.200}", + "900": "{colors.solid.red.100}", + "950": "{colors.solid.red.50}" + }, + "surface": { + "0": "{colors.alpha.black.1000}", + "50": "{colors.solid.zinc.950}", + "100": "{colors.solid.zinc.900}", + "200": "{colors.solid.zinc.800}", + "300": "{colors.solid.zinc.700}", + "400": "{colors.solid.zinc.600}", + "500": "{colors.solid.zinc.500}", + "600": "{colors.solid.zinc.400}", + "700": "{colors.solid.zinc.300}", + "800": "{colors.solid.zinc.200}", + "900": "{colors.solid.zinc.100}", + "950": "{colors.solid.zinc.50}" + }, + "primary": { + "color": "{colors.solid.green.500}", + "contrastColor": "{colors.solid.zinc.900}", + "hoverColor": "{colors.solid.green.400}", + "activeColor": "{colors.solid.green.300}", + "hoverBackground": "{colors.solid.green.950}", + "activeBackground": "{colors.solid.green.900}", + "borderColor": "{colors.solid.green.800}", + "selectedBackground": "{colors.solid.green.500}", + "selectedHoverBackground": "{colors.solid.green.600}" + }, + "highlight": { + "background": "{colors.solid.zinc.100}", + "focusBackground": "{colors.solid.zinc.200}", + "color": "{colors.solid.zinc.900}", + "focusColor": "{colors.solid.zinc.900}" + }, + "focusRing": { + "shadow": "{shadows.200}", + "extend": { + "invalid": "{colors.solid.red.800}", + "success": "{colors.solid.green.800}", + "warning": "{colors.solid.yellow.800}", + "info": "{colors.solid.blue.800}" + } + }, + "mask": { + "background": "{colors.alpha.black.600}", + "color": "{surface.800}" + }, + "form": { + "background": "{colors.solid.zinc.950}", + "disabledBackground": "{colors.solid.zinc.800}", + "readonlyBackground": "{colors.solid.zinc.900}", + "filledBackground": "{colors.solid.zinc.950}", + "filledHoverBackground": "{colors.solid.zinc.950}", + "filledFocusBackground": "{colors.solid.zinc.950}", + "borderColor": "{colors.solid.zinc.700}", + "hoverBorderPrimaryColor": "{colors.solid.zinc.100}", + "focusBorderPrimaryColor": "{colors.solid.zinc.100}", + "hoverBorderSecondaryColor": "{colors.solid.green.400}", + "focusBorderSecondaryColor": "{colors.solid.green.400}", + "invalidBorderColor": "{colors.solid.red.600}", + "color": "{colors.alpha.white.1000}", + "disabledColor": "{colors.solid.zinc.500}", + "placeholderColor": "{colors.solid.zinc.500}", + "invalidPlaceholderColor": "{colors.solid.red.400}", + "floatLabelColor": "{colors.solid.zinc.500}", + "floatLabelFocusColor": "{colors.solid.zinc.500}", + "floatLabelActiveColor": "{colors.solid.zinc.500}", + "floatLabelInvalidColor": "{form.invalidPlaceholderColor}", + "iconColor": "{colors.alpha.white.1000}", + "backgroundHandler": "{colors.alpha.white.1000}", + "shadow": "{shadows.200}" + }, + "text": { + "color": "{colors.alpha.white.1000}", + "extend": { + "colorPrimaryStatic": "{colors.solid.zinc.900}", + "colorSecondaryStatic": "{colors.alpha.white.1000}", + "colorInverted": "{colors.solid.zinc.900}" + }, + "hoverColor": "{colors.solid.zinc.300}", + "primaryColor": "{colors.solid.green.400}", + "hoverPrimaryColor": "{colors.solid.green.300}", + "secondaryColor": "{colors.solid.zinc.400}", + "hoverSecondaryColor": "{colors.solid.zinc.600}", + "mutedColor": "{colors.solid.zinc.500}", + "hoverMutedColor": "{colors.solid.zinc.700}", + "disabledColor": "{colors.solid.zinc.700}", + "infoColor": "{colors.solid.blue.400}", + "successColor": "{colors.solid.green.400}", + "dangerColor": "{colors.solid.red.400}", + "warningColor": "{colors.solid.yellow.400}", + "helpColor": "{colors.solid.purple.400}" + }, + "content": { + "background": "{colors.solid.zinc.900}", + "hoverBackground": "{colors.solid.zinc.800}", + "borderColor": "{colors.solid.zinc.800}", + "activeBorderColor": "{colors.solid.zinc.200}", + "color": "{text.color}", + "hoverColor": "{text.hoverColor}", + "shadow": "{shadows.400}" + }, + "list": { + "option": { + "background": "{colors.solid.zinc.900}", + "focusBackground": "{colors.solid.zinc.800}", + "selectedBackground": "{colors.solid.zinc.100}", + "selectedFocusBackground": "{colors.solid.zinc.300}", + "color": "{text.color}", + "focusColor": "{text.color}", + "selectedColor": "{text.extend.colorInverted}", + "selectedFocusColor": "{text.extend.colorInverted}", + "icon": { + "color": "{text.color}", + "focusColor": "{text.color}" + } + }, + "optionGroup": { + "background": "{colors.solid.zinc.900}", + "color": "{text.mutedColor}" + } + }, + "overlay": { + "select": { + "background": "{colors.solid.zinc.900}", + "borderColor": "{colors.solid.zinc.800}", + "color": "{text.color}", + "shadow": "{shadows.400}" + }, + "popover": { + "background": "{colors.solid.zinc.900}", + "borderColor": "{form.borderColor}", + "color": "{text.color}", + "shadow": "{shadows.400}" + }, + "modal": { + "background": "{colors.solid.zinc.900}", + "backdrop": "{colors.alpha.black.300}", + "borderColor": "{colors.solid.zinc.800}", + "color": "{text.color}", + "shadow": "{shadows.200}" + } + }, + "navigation": { + "submenuLabel": { + "background": "rgba(255, 255, 255, 0.0000)", + "color": "{text.mutedColor}" + }, + "submenuIcon": { + "color": "{colors.solid.zinc.100}", + "focusColor": "{colors.solid.zinc.100}", + "activeColor": "{colors.solid.zinc.900}" + }, + "item": { + "focusBackground": "{colors.solid.zinc.900}", + "activeBackground": "{colors.solid.zinc.100}", + "color": "{colors.alpha.white.1000}", + "focusColor": "{colors.alpha.white.1000}", + "icon": { + "color": "{colors.alpha.white.1000}", + "focusColor": "{colors.alpha.white.1000}", + "activeColor": "{colors.solid.zinc.900}" + }, + "activeColor": "{colors.solid.zinc.900}" + }, + "shadow": "{shadows.400}" + } + } + } + }, + "components": { + "accordion": { + "extend": { + "extHeader": { + "iconSize": "{controls.iconOnly.300}", + "gap": "{controls.gap.100}" + } + }, + "colorScheme": { + "light": { + "header": { + "background": "{transparent}", + "hoverBackground": "{transparent}", + "activeBackground": "{transparent}", + "activeHoverBackground": "{transparent}" + } + } + }, + "header": { + "color": "{text.color}", + "hoverColor": "{text.hoverColor}", + "activeColor": "{text.color}", + "activeHoverColor": "{text.hoverColor}", + "borderColor": "{transparent}", + "padding": "{navigation.padding.300} 0 {navigation.padding.300} 0", + "fontWeight": "{fonts.fontWeight.bold}", + "borderRadius": "{borderRadius.none}", + "borderWidth": "{borderWidth.none}", + "focusRing": { + "width": "{focusRing.width}", + "style": "{focusRing.style}", + "color": "{focusRing.color}", + "offset": "{focusRing.offset}", + "shadow": "inset {focus.ring.shadow}" + }, + "toggleIcon": { + "color": "{text.color}", + "hoverColor": "{text.hoverColor}", + "activeColor": "{text.color}", + "activeHoverColor": "{text.hoverColor}" + }, + "last": { + "bottomBorderRadius": "{borderRadius.none}", + "activeBottomBorderRadius": "{borderRadius.none}" + }, + "first": { + "borderWidth": "{borderWidth.none}", + "topBorderRadius": "{borderRadius.none}" + } + }, + "root": { + "transitionDuration": "{controls.transitionDuration}" + }, + "panel": { + "borderWidth": "{borderWidth.none} {borderWidth.none} {navigation.width.100} {borderWidth.none}", + "borderColor": "{form.borderColor}" + }, + "content": { + "borderWidth": "{content.borderWidth} {borderWidth.none} {borderWidth.none} {borderWidth.none}", + "borderColor": "{transparent}", + "background": "{transparent}", + "color": "{text.color}", + "padding": "0 {content.padding.400} {content.padding.300} {content.padding.400}" + } + }, + "autocomplete": { + "extend": { + "extOption": { + "gap": "{form.gap.200}" + }, + "extOptionGroup": { + "gap": "{form.gap.200}" + } + }, + "colorScheme": { + "light": { + "chip": { + "focusBackground": "{chip.colorScheme.light.root.background}", + "focusColor": "{chip.colorScheme.light.root.color}" + }, + "dropdown": { + "background": "{form.background}", + "hoverBackground": "{form.background}", + "activeBackground": "{form.background}", + "color": "{form.color}", + "hoverColor": "{form.color}", + "activeColor": "{form.color}" + } + } + }, + "root": { + "background": "{form.background}", + "disabledBackground": "{form.disabledBackground}", + "filledBackground": "{form.filledBackground}", + "filledHoverBackground": "{form.filledHoverBackground}", + "filledFocusBackground": "{form.filledFocusBackground}", + "borderColor": "{form.borderColor}", + "hoverBorderColor": "{form.hoverBorderSecondaryColor}", + "focusBorderColor": "{form.focusBorderSecondaryColor}", + "invalidBorderColor": "{form.invalidBorderColor}", + "color": "{form.color}", + "disabledColor": "{form.disabledColor}", + "placeholderColor": "{form.placeholderColor}", + "invalidPlaceholderColor": "{form.invalidPlaceholderColor}", + "shadow": "0", + "paddingX": "{form.padding.300}", + "paddingY": "{form.padding.300}", + "borderRadius": "{form.borderRadius.200}", + "transitionDuration": "{form.transitionDuration}", + "focusRing": { + "width": "{focusRing.width}", + "style": "{form.focusRing.style}", + "color": "{form.focusRing.color}", + "offset": "{form.focusRing.offset}", + "shadow": "0" + } + }, + "overlay": { + "background": "{overlay.select.background}", + "borderColor": "{overlay.select.borderColor}", + "borderRadius": "{overlay.select.borderRadius}", + "color": "{overlay.select.color}", + "shadow": "{form.shadow}" + }, + "list": { + "padding": "{list.padding}", + "gap": "{list.gap.100}" + }, + "option": { + "focusBackground": "{list.option.focusBackground}", + "selectedBackground": "{list.option.selectedBackground}", + "selectedFocusBackground": "{list.option.selectedFocusBackground}", + "color": "{list.option.color}", + "focusColor": "{list.option.focusColor}", + "selectedColor": "{list.option.selectedColor}", + "selectedFocusColor": "{list.option.selectedFocusColor}", + "padding": "{list.option.padding}", + "borderRadius": "{list.option.borderRadius}" + }, + "optionGroup": { + "background": "{list.optionGroup.background}", + "color": "{list.optionGroup.color}", + "fontWeight": "{fonts.fontWeight.demibold}", + "padding": "{list.optionGroup.padding}" + }, + "dropdown": { + "width": "{form.width.300}", + "borderColor": "{form.borderColor}", + "hoverBorderColor": "{form.hoverBorderSecondaryColor}", + "activeBorderColor": "{form.focusBorderSecondaryColor}", + "borderRadius": "{form.borderRadius.200}", + "focusRing": { + "width": "{focusRing.width}", + "style": "{form.focusRing.style}", + "color": "{form.focusRing.color}", + "offset": "{form.focusRing.offset}", + "shadow": "0" + }, + "sm": { + "width": "{form.width.200}" + }, + "lg": { + "width": "{form.width.400}" + } + }, + "chip": { + "borderRadius": "{chip.root.borderRadius}" + }, + "emptyMessage": { + "padding": "{list.option.padding}" + } + }, + "avatar": { + "extend": { + "borderColor": "{form.borderColor}", + "circle": { + "borderRadius": "{media.borderRadius.max}" + } + }, + "root": { + "width": "{media.size.300}", + "height": "{media.size.300}", + "fontSize": "{fonts.fontSize.200}", + "color": "{text.extend.colorPrimaryStatic}", + "background": "{primary.color}", + "borderRadius": "{media.borderRadius.200}" + }, + "icon": { + "size": "{media.icon.size.100}" + }, + "group": { + "borderColor": "{content.background}", + "offset": "-{media.padding.300}" + }, + "lg": { + "width": "{media.size.400}", + "height": "{media.size.400}", + "fontSize": "{fonts.fontSize.300}", + "icon": { + "size": "{media.icon.size.100}" + }, + "group": { + "offset": "-{media.padding.300}" + } + }, + "xl": { + "width": "{media.size.500}", + "height": "{media.size.500}", + "icon": { + "size": "{media.icon.size.200}" + }, + "group": { + "offset": "-{media.padding.600}" + }, + "fontSize": "{fonts.fontSize.500}" + } + }, + "badge": { + "extend": { + "extDot": { + "success": { + "background": "{colors.solid.green.400}" + }, + "info": { + "background": "{info.400}" + }, + "warn": { + "background": "{warn.400}" + }, + "danger": { + "background": "{error.400}" + }, + "lg": { + "size": "{feedback.width.400}" + }, + "xlg": { + "size": "{feedback.width.500}" + } + }, + "ext": { + "padding": "0rem" + } + }, + "colorScheme": { + "light": { + "primary": { + "color": "{text.extend.colorPrimaryStatic}", + "background": "{primary.color}" + }, + "secondary": { + "color": "{text.extend.colorInverted}", + "background": "{surface.900}" + }, + "success": { + "color": "{success.900}", + "background": "{success.300}" + }, + "info": { + "color": "{info.900}", + "background": "{info.300}" + }, + "warn": { + "color": "{warn.900}", + "background": "{warn.300}" + }, + "danger": { + "color": "{error.900}", + "background": "{error.300}" + } + } + }, + "root": { + "borderRadius": "{feedback.width.300}", + "padding": "{feedback.padding.100}", + "fontSize": "{fonts.fontSize.100}", + "fontWeight": "{fonts.fontWeight.regular}", + "minWidth": "{feedback.width.600}", + "height": "{feedback.height.500}" + }, + "dot": { + "size": "{feedback.width.300}" + }, + "sm": { + "fontSize": "{fonts.fontSize.100}", + "minWidth": "0rem", + "height": "0rem" + }, + "lg": { + "fontSize": "{fonts.fontSize.100}", + "minWidth": "{feedback.width.650}", + "height": "{feedback.height.600}" + }, + "xl": { + "fontSize": "{fonts.fontSize.100}", + "minWidth": "{feedback.width.700}", + "height": "{feedback.height.650}" + } + }, + "breadcrumb": { + "extend": { + "hoverBackground": "{surface.100}", + "iconSize": "{navigation.size.300}", + "extItem": { + "padding": "{navigation.padding.100}" + } + }, + "root": { + "padding": "0rem", + "background": "{transparent}", + "gap": "0rem", + "transitionDuration": "{form.transitionDuration}" + }, + "focusRing": { + "width": "{focusRing.width}", + "style": "{focusRing.style}", + "color": "{focusRing.color}", + "offset": "{focusRing.offset}", + "shadow": "{focusRing.shadow}" + }, + "item": { + "color": "{text.color}", + "hoverColor": "{text.hoverColor}", + "borderRadius": "{navigation.borderRadius}", + "gap": "{navigation.item.gap}", + "icon": { + "color": "{text.color}", + "hoverColor": "{text.hoverColor}" + } + }, + "separator": { + "color": "{text.color}" + } + }, + "button": { + "extend": { + "disabledBackground": "{form.disabledBackground}", + "extOutlined": { + "danger": { + "focusBackground": "{transparent}" + }, + "warn": { + "focusBackground": "{transparent}" + }, + "info": { + "focusBackground": "{transparent}" + }, + "help": { + "focusBackground": "{transparent}" + }, + "success": { + "focusBackground": "{transparent}" + } + }, + "disabledColor": "{form.disabledColor}", + "extText": { + "danger": { + "focusBackground": "{transparent}" + }, + "warn": { + "focusBackground": "{transparent}" + }, + "info": { + "focusBackground": "{transparent}" + }, + "help": { + "focusBackground": "{transparent}" + }, + "success": { + "focusBackground": "{transparent}" + } + }, + "extLink": { + "background": "{transparent}", + "colorHover": "{text.hoverColor}", + "paddingX": "0rem", + "paddingY": "{controls.padding.100}", + "sm": { + "iconOnlyWidth": "{controls.iconOnly.200}" + }, + "base": { + "iconOnlyWidth": "{controls.iconOnly.400}" + }, + "lg": { + "iconOnlyWidth": "{controls.iconOnly.500}" + }, + "xlg": { + "iconOnlyWidth": "{controls.iconOnly.600}" + } + }, + "extSm": { + "borderRadius": "{controls.borderRadius.100}", + "gap": "{controls.gap.100}" + }, + "extLg": { + "borderRadius": "{controls.borderRadius.200}", + "gap": "{controls.gap.200}", + "height": "{controls.iconOnly.850}" + }, + "extXlg": { + "borderRadius": "{controls.borderRadius.200}", + "gap": "{controls.gap.200}", + "iconOnlyWidth": "{controls.iconOnly.900}", + "paddingX": "{controls.padding.600}", + "paddingY": "{controls.padding.500}", + "height": "{controls.iconOnly.900}" + }, + "borderWidth": "{controls.width.100}", + "iconSize": { + "sm": "{controls.iconOnly.200}", + "md": "{controls.iconOnly.300}", + "lg": "{controls.iconOnly.400}" + } + }, + "colorScheme": { + "light": { + "root": { + "primary": { + "background": "{primary.color}", + "hoverBackground": "{primary.hoverColor}", + "activeBackground": "{primary.activeColor}", + "borderColor": "{transparent}", + "hoverBorderColor": "{transparent}", + "activeBorderColor": "{transparent}", + "color": "{text.extend.colorPrimaryStatic}", + "hoverColor": "{text.extend.colorPrimaryStatic}", + "activeColor": "{text.extend.colorPrimaryStatic}", + "focusRing": { + "color": "{focusRing.color}", + "shadow": "{focusRing.shadow}" + } + }, + "secondary": { + "background": "{surface.900}", + "hoverBackground": "{surface.800}", + "activeBackground": "{surface.700}", + "borderColor": "{transparent}", + "hoverBorderColor": "{transparent}", + "activeBorderColor": "{transparent}", + "color": "{text.extend.colorInverted}", + "hoverColor": "{text.extend.colorInverted}", + "activeColor": "{text.extend.colorInverted}", + "focusRing": { + "color": "{focusRing.color}", + "shadow": "{focusRing.shadow}" + } + }, + "contrast": { + "background": "{surface.200}", + "hoverBackground": "{surface.300}", + "activeBackground": "{surface.400}", + "borderColor": "{transparent}", + "hoverBorderColor": "{transparent}", + "activeBorderColor": "{transparent}", + "color": "{text.color}", + "hoverColor": "{text.color}", + "activeColor": "{text.color}", + "focusRing": { + "color": "{focusRing.color}", + "shadow": "{focusRing.shadow}" + } + }, + "info": { + "background": "{info.300}", + "hoverBackground": "{info.400}", + "activeBackground": "{info.500}", + "borderColor": "{transparent}", + "hoverBorderColor": "{transparent}", + "activeBorderColor": "{transparent}", + "color": "{info.900}", + "hoverColor": "{info.950}", + "activeColor": "{info.900}" + }, + "success": { + "background": "{success.300}", + "hoverBackground": "{success.400}", + "activeBackground": "{success.500}", + "borderColor": "{transparent}", + "hoverBorderColor": "{transparent}", + "activeBorderColor": "{transparent}", + "color": "{success.900}", + "hoverColor": "{success.950}", + "activeColor": "{success.900}" + }, + "warn": { + "background": "{warn.300}", + "hoverBackground": "{warn.400}", + "activeBackground": "{warn.500}", + "borderColor": "{transparent}", + "hoverBorderColor": "{transparent}", + "activeBorderColor": "{transparent}", + "color": "{warn.900}", + "hoverColor": "{warn.950}", + "activeColor": "{warn.900}" + }, + "help": { + "background": "{help.300}", + "hoverBackground": "{help.400}", + "activeBackground": "{help.500}", + "borderColor": "{transparent}", + "hoverBorderColor": "{transparent}", + "activeBorderColor": "{transparent}", + "color": "{help.900}", + "hoverColor": "{help.950}", + "activeColor": "{help.900}" + }, + "danger": { + "background": "{error.300}", + "hoverBackground": "{error.400}", + "activeBackground": "{error.500}", + "borderColor": "{transparent}", + "hoverBorderColor": "{transparent}", + "activeBorderColor": "{transparent}", + "color": "{error.900}", + "hoverColor": "{error.950}", + "activeColor": "{error.900}" + } + }, + "outlined": { + "primary": { + "hoverBackground": "{primary.hoverBackground}", + "activeBackground": "{primary.activeBackground}", + "borderColor": "{primary.borderColor}", + "color": "{primary.color}" + }, + "success": { + "hoverBackground": "{success.100}", + "activeBackground": "{success.200}", + "borderColor": "{success.600}", + "color": "{success.600}" + }, + "info": { + "hoverBackground": "{info.100}", + "activeBackground": "{info.200}", + "borderColor": "{info.600}", + "color": "{info.600}" + }, + "warn": { + "hoverBackground": "{warn.100}", + "activeBackground": "{warn.200}", + "borderColor": "{warn.600}", + "color": "{warn.600}" + }, + "help": { + "hoverBackground": "{help.100}", + "activeBackground": "{help.200}", + "borderColor": "{help.600}", + "color": "{help.600}" + }, + "danger": { + "hoverBackground": "{error.100}", + "activeBackground": "{error.200}", + "borderColor": "{error.600}", + "color": "{error.600}" + } + }, + "text": { + "primary": { + "hoverBackground": "{surface.100}", + "activeBackground": "{surface.200}", + "color": "{text.color}" + }, + "success": { + "hoverBackground": "{success.100}", + "activeBackground": "{success.200}", + "color": "{success.600}" + }, + "info": { + "hoverBackground": "{info.100}", + "activeBackground": "{info.200}", + "color": "{info.600}" + }, + "warn": { + "hoverBackground": "{warn.100}", + "activeBackground": "{warn.200}", + "color": "{warn.600}" + }, + "help": { + "hoverBackground": "{help.100}", + "activeBackground": "{help.200}", + "color": "{help.600}" + }, + "danger": { + "hoverBackground": "{error.100}", + "activeBackground": "{error.200}", + "color": "{error.600}" + } + }, + "link": { + "color": "{text.color}", + "hoverColor": "{text.hoverColor}", + "activeColor": "{text.mutedColor}" + } + }, + "dark": { + "root": { + "primary": { + "background": "{primary.color}", + "hoverBackground": "{primary.hoverColor}", + "activeBackground": "{primary.activeColor}", + "borderColor": "{transparent}", + "hoverBorderColor": "{transparent}", + "activeBorderColor": "{transparent}", + "color": "{text.extend.colorPrimaryStatic}", + "hoverColor": "{text.extend.colorPrimaryStatic}", + "activeColor": "{text.extend.colorPrimaryStatic}", + "focusRing": { + "color": "{focusRing.color}", + "shadow": "{focusRing.shadow}" + } + }, + "secondary": { + "background": "{surface.200}", + "hoverBackground": "{surface.300}", + "activeBackground": "{surface.400}", + "borderColor": "{transparent}", + "hoverBorderColor": "{transparent}", + "activeBorderColor": "{transparent}", + "color": "{surface.950}", + "hoverColor": "{surface.950}", + "activeColor": "{surface.950}", + "focusRing": { + "color": "{focusRing.color}", + "shadow": "{focusRing.shadow}" + } + }, + "contrast": { + "background": "{surface.950}", + "hoverBackground": "{surface.900}", + "activeBackground": "{surface.800}", + "borderColor": "{transparent}", + "hoverBorderColor": "{transparent}", + "activeBorderColor": "{transparent}", + "color": "{surface.0}", + "hoverColor": "{surface.0}", + "activeColor": "{surface.0}", + "focusRing": { + "color": "{focusRing.color}", + "shadow": "{focusRing.shadow}" + } + }, + "info": { + "background": "{info.500}", + "hoverBackground": "{info.400}", + "activeBackground": "{info.300}", + "borderColor": "{transparent}", + "hoverBorderColor": "{transparent}", + "activeBorderColor": "{transparent}", + "color": "{text.extend.colorPrimaryStatic}", + "hoverColor": "{text.extend.colorPrimaryStatic}", + "activeColor": "{text.extend.colorPrimaryStatic}" + }, + "success": { + "background": "{success.500}", + "hoverBackground": "{success.400}", + "activeBackground": "{success.300}", + "borderColor": "{transparent}", + "hoverBorderColor": "{transparent}", + "activeBorderColor": "{transparent}", + "color": "{text.extend.colorPrimaryStatic}", + "hoverColor": "{text.extend.colorPrimaryStatic}", + "activeColor": "{text.extend.colorPrimaryStatic}" + }, + "warn": { + "background": "{warn.500}", + "hoverBackground": "{warn.400}", + "activeBackground": "{warn.300}", + "borderColor": "{transparent}", + "hoverBorderColor": "{transparent}", + "activeBorderColor": "{transparent}", + "color": "{text.extend.colorPrimaryStatic}", + "hoverColor": "{text.extend.colorPrimaryStatic}", + "activeColor": "{text.extend.colorPrimaryStatic}" + }, + "help": { + "background": "{help.500}", + "hoverBackground": "{help.400}", + "activeBackground": "{help.300}", + "borderColor": "{transparent}", + "hoverBorderColor": "{transparent}", + "activeBorderColor": "{transparent}", + "color": "{text.extend.colorPrimaryStatic}", + "hoverColor": "{text.extend.colorPrimaryStatic}", + "activeColor": "{text.extend.colorPrimaryStatic}" + }, + "danger": { + "background": "{error.500}", + "hoverBackground": "{error.400}", + "activeBackground": "{error.300}", + "borderColor": "{transparent}", + "hoverBorderColor": "{transparent}", + "activeBorderColor": "{transparent}", + "color": "{text.extend.colorPrimaryStatic}", + "hoverColor": "{text.extend.colorPrimaryStatic}", + "activeColor": "{text.extend.colorPrimaryStatic}" + } + }, + "outlined": { + "primary": { + "hoverBackground": "{primary.hoverBackground}", + "activeBackground": "{primary.activeBackground}", + "borderColor": "{primary.borderColor}", + "color": "{primary.color}" + }, + "success": { + "hoverBackground": "{success.950}", + "activeBackground": "{success.900}", + "borderColor": "{success.500}", + "color": "{success.500}" + }, + "info": { + "hoverBackground": "{info.950}", + "activeBackground": "{info.900}", + "borderColor": "{info.500}", + "color": "{info.500}" + }, + "warn": { + "hoverBackground": "{warn.950}", + "activeBackground": "{warn.900}", + "borderColor": "{warn.500}", + "color": "{warn.500}" + }, + "help": { + "hoverBackground": "{help.950}", + "activeBackground": "{help.900}", + "borderColor": "{help.500}", + "color": "{help.500}" + }, + "danger": { + "hoverBackground": "{error.950}", + "activeBackground": "{error.900}", + "borderColor": "{error.500}", + "color": "{error.500}" + } + }, + "text": { + "primary": { + "hoverBackground": "{surface.800}", + "activeBackground": "{surface.700}", + "color": "{text.color}" + }, + "success": { + "hoverBackground": "{success.950}", + "activeBackground": "{success.900}", + "color": "{success.500}" + }, + "info": { + "hoverBackground": "{info.950}", + "activeBackground": "{info.900}", + "color": "{info.500}" + }, + "warn": { + "hoverBackground": "{warn.950}", + "activeBackground": "{warn.900}", + "color": "{warn.500}" + }, + "help": { + "hoverBackground": "{help.950}", + "activeBackground": "{help.900}", + "color": "{help.500}" + }, + "danger": { + "hoverBackground": "{error.950}", + "activeBackground": "{error.900}", + "color": "{error.500}" + } + }, + "link": { + "color": "{text.color}", + "hoverColor": "{text.hoverColor}", + "activeColor": "{text.mutedColor}" + } + } + }, + "root": { + "borderRadius": "{controls.borderRadius.100}", + "roundedBorderRadius": "{controls.borderRadius.max}", + "gap": "{controls.gap.100}", + "fontSize": "{fonts.fontSize.200}", + "paddingX": "{controls.padding.400}", + "paddingY": "{controls.padding.200}", + "iconOnlyWidth": "{controls.iconOnly.700}", + "raisedShadow": "none", + "badgeSize": "{feedback.width.500}", + "transitionDuration": "{controls.transitionDuration}", + "focusRing": { + "width": "{focusRing.width}", + "style": "{focusRing.style}", + "offset": "{focusRing.offset}" + }, + "sm": { + "fontSize": "{fonts.fontSize.200}", + "iconOnlyWidth": "{controls.iconOnly.600}", + "paddingX": "{controls.padding.300}", + "paddingY": "{controls.padding.200}" + }, + "lg": { + "fontSize": "{fonts.fontSize.500}", + "iconOnlyWidth": "{controls.iconOnly.850}", + "paddingX": "{controls.padding.600}", + "paddingY": "{controls.padding.400}" + }, + "label": { + "fontWeight": "{fonts.fontWeight.demibold}" + } + } + }, + "card": { + "extend": { + "borderColor": "{content.borderColor}", + "borderWidth": "{content.borderWidth}" + }, + "root": { + "background": "{content.background}", + "borderRadius": "{content.gap.400}", + "color": "{content.color}" + }, + "body": { + "padding": "{content.padding.300}", + "gap": "{content.gap.400}" + }, + "caption": { + "gap": "{content.gap.100}" + }, + "title": { + "fontSize": "{fonts.fontSize.400}", + "fontWeight": "{fonts.fontWeight.demibold}" + }, + "subtitle": { + "color": "{text.mutedColor}" + } + }, + "carousel": { + "colorScheme": { + "light": { + "indicator": { + "background": "{surface.300}", + "hoverBackground": "{surface.400}", + "activeBackground": "{surface.900}" + } + } + }, + "root": { + "transitionDuration": "{media.transitionDuration}" + }, + "content": { + "gap": "{media.gap.200}" + }, + "indicatorList": { + "padding": "{media.padding.400}", + "gap": "{media.gap.200}" + }, + "indicator": { + "width": "{controls.iconOnly.100}", + "height": "{controls.iconOnly.100}", + "borderRadius": "{media.borderRadius.400}", + "focusRing": { + "width": "{focusRing.width}", + "style": "{focusRing.style}", + "color": "{focusRing.color}", + "offset": "{focusRing.offset}", + "shadow": "{focusRing.shadow}" + } + } + }, + "checkbox": { + "root": { + "borderRadius": "{form.borderRadius.100}", + "extend": { + "borderWidth": "{form.borderWidth}" + }, + "width": "{form.size.400}", + "height": "{form.size.400}", + "background": "{form.background}", + "checkedBackground": "{surface.900}", + "checkedHoverBackground": "{surface.800}", + "disabledBackground": "{form.disabledBackground}", + "filledBackground": "{form.filledBackground}", + "borderColor": "{form.borderColor}", + "hoverBorderColor": "{form.hoverBorderPrimaryColor}", + "focusBorderColor": "{form.focusBorderPrimaryColor}", + "checkedBorderColor": "{surface.900}", + "checkedHoverBorderColor": "{surface.800}", + "checkedFocusBorderColor": "{primary.color}", + "checkedDisabledBorderColor": "{form.borderColor}", + "invalidBorderColor": "{form.invalidBorderColor}", + "shadow": "0", + "focusRing": { + "focusRing": "{focusRing.width}", + "style": "{focusRing.style}", + "color": "{focusRing.color}", + "offset": "{focusRing.offset}", + "shadow": "{focusRing.shadow}" + }, + "sm": { + "width": "{form.size.200}", + "height": "{form.size.200}" + }, + "lg": { + "width": "{form.size.350}", + "height": "{form.size.350}" + }, + "transitionDuration": "{form.transitionDuration}" + }, + "icon": { + "size": "{form.icon.300}", + "color": "{form.color}", + "checkedColor": "{primary.contrastColor}", + "checkedHoverColor": "{primary.contrastColor}", + "disabledColor": "{form.disabledColor}", + "sm": { + "size": "{form.icon.200}" + }, + "lg": { + "size": "{form.icon.400}" + } + } + }, + "chip": { + "extend": { + "borderColor": "{transparent}", + "borderWidth": "{controls.width.100}" + }, + "root": { + "borderRadius": "{media.borderRadius.100}", + "paddingX": "{media.padding.200}", + "paddingY": "{media.padding.100}", + "gap": "{media.gap.200}", + "transitionDuration": "{media.transitionDuration}" + }, + "colorScheme": { + "light": { + "root": { + "background": "{surface.200}", + "color": "{text.color}" + }, + "icon": { + "color": "{text.color}" + }, + "removeIcon": { + "color": "{text.color}" + } + } + }, + "image": { + "width": "0rem", + "height": "0rem" + }, + "icon": { + "size": "{media.icon.size.100}" + }, + "removeIcon": { + "size": "{media.icon.size.100}", + "focusRing": { + "width": "{form.focusRing.width}", + "style": "{form.focusRing.style}", + "color": "{focusRing.color}", + "offset": "{form.focusRing.offset}", + "shadow": "{focusRing.shadow}" + } + } + }, + "confirmdialog": { + "extend": { + "extIcon": { + "success": "{success.500}", + "info": "{info.500}", + "help": "{help.500}", + "warn": "{warn.500}", + "danger": "{error.500}" + } + }, + "icon": { + "size": "{overlay.icon.size.200}", + "color": "{overlay.modal.color}" + }, + "content": { + "gap": "0rem" + } + }, + "confirmpopup": { + "root": { + "background": "{overlay.popover.background}", + "color": "{overlay.popover.color}", + "shadow": "{overlay.popover.shadow}", + "gutter": "{overlay.gap.300}", + "arrowOffset": "{overlay.modal.padding.200}" + }, + "content": { + "padding": "{overlay.popover.padding.100}", + "gap": "{overlay.gap.400}" + }, + "icon": { + "size": "{overlay.icon.size.200}", + "color": "{overlay.popover.color}" + }, + "footer": { + "gap": "{overlay.gap.200}", + "padding": "0 {overlay.popover.padding} {overlay.popover.padding} {overlay.popover.padding}" + } + }, + "contextmenu": { + "root": { + "background": "{content.background}", + "color": "{content.color}", + "shadow": "{navigation.shadow}" + }, + "list": { + "padding": "{navigation.list.padding.md} 0", + "gap": "{navigation.list.gap}" + }, + "item": { + "padding": "{navigation.item.padding}", + "gap": "{navigation.item.gap}" + }, + "submenu": { + "mobileIndent": "{navigation.submenu.padding}" + } + }, + "datatable": { + "colorScheme": { + "light": { + "root": { + "color": "{text.color}", + "borderColor": "{content.borderColor}" + }, + "header": { + "background": "{surface.50}", + "color": "{text.color}" + }, + "headerCell": { + "background": "{surface.50}", + "hoverBackground": "{surface.100}", + "color": "{text.color}" + }, + "footer": { + "background": "{surface.100}", + "color": "{text.color}" + }, + "footerCell": { + "background": "{content.hoverBackground}", + "color": "{text.color}" + }, + "row": { + "stripedBackground": "{content.hoverBackground}" + }, + "bodyCell": { + "selectedBorderColor": "{content.borderColor}" + } + } + }, + "extended": { + "extHeaderCell": { + "selectedHoverBackground": "{surface.800}" + }, + "extRow": { + "selectedHoverBackground": "{surface.800}", + "stripedHoverBackground": "{surface.100}" + } + }, + "root": { + "transitionDuration": "{data.transitionDuration}" + }, + "header": { + "borderColor": "{content.borderColor}", + "borderWidth": "{data.width.100} 0 {data.width.100} 0", + "padding": "{data.padding.400}", + "sm": { + "padding": "{data.padding.200}" + }, + "lg": { + "padding": "{data.padding.500}" + } + }, + "headerCell": { + "selectedBackground": "{highlight.background}", + "borderColor": "{content.borderColor}", + "hoverColor": "{text.extend.colorInverted}", + "selectedColor": "{highlight.color}", + "gap": "{data.gap.200}", + "padding": "{data.padding.400}", + "focusRing": { + "width": "{focusRing.width}", + "style": "{focusRing.style}", + "color": "{focusRing.color}", + "offset": "{focusRing.offset}", + "shadow": "inset {focus.ring.shadow}" + }, + "sm": { + "padding": "{data.padding.200}" + }, + "lg": { + "padding": "{data.padding.500}" + } + }, + "columnTitle": { + "fontWeight": "{fonts.fontWeight.bold}" + }, + "row": { + "background": "{content.background}", + "hoverBackground": "{content.hoverBackground}", + "selectedBackground": "{highlight.background}", + "color": "{content.color}", + "hoverColor": "{content.hoverColor}", + "selectedColor": "{highlight.color}", + "focusRing": { + "width": "{focusRing.width}", + "style": "{focusRing.style}", + "color": "{focusRing.color}", + "offset": "{focusRing.offset}", + "shadow": "inset {focus.ring.shadow}" + } + }, + "bodyCell": { + "borderColor": "{content.borderColor}", + "padding": "{data.padding.400}", + "sm": { + "padding": "{data.padding.200}" + }, + "lg": { + "padding": "{data.padding.500}" + } + }, + "footerCell": { + "borderColor": "{content.borderColor}", + "padding": "{data.padding.400}", + "sm": { + "padding": "{data.padding.200}" + }, + "lg": { + "padding": "{data.padding.500}" + } + }, + "columnFooter": { + "fontWeight": "{fonts.fontWeight.bold}" + }, + "dropPoint": { + "color": "{highlight.background}" + }, + "footer": { + "borderColor": "{content.borderColor}", + "borderWidth": "0 0 {data.width.100} 0", + "padding": "{data.padding.400}", + "sm": { + "padding": "{data.padding.200}" + }, + "lg": { + "padding": "{data.padding.500}" + } + }, + "columnResizer": { + "width": "{data.width.300}" + }, + "resizeIndicator": { + "width": "{data.width.100}", + "color": "{highlight.background}" + }, + "sortIcon": { + "color": "{text.color}", + "hoverColor": "{text.hoverColor}", + "size": "{data.icon.size.100}" + }, + "loadingIcon": { + "size": "{data.icon.size.500}" + }, + "rowToggleButton": { + "hoverBackground": "{content.hoverBackground}", + "selectedHoverBackground": "{content.hoverBackground}", + "color": "{text.color}", + "hoverColor": "{text.color}", + "selectedHoverColor": "{text.color}", + "size": "{data.icon.size.500}", + "borderRadius": "{content.borderRadius}", + "focusRing": { + "width": "{focusRing.width}", + "style": "{focusRing.style}", + "color": "{focusRing.color}", + "offset": "{focusRing.offset}", + "shadow": "{focusRing.shadow}" + } + }, + "filter": { + "inlineGap": "{data.gap.200}", + "rule": { + "borderColor": "{content.borderColor}" + }, + "constraintList": { + "padding": "{list.padding}", + "gap": "{list.gap.100}" + }, + "constraint": { + "focusBackground": "{list.option.focusBackground}", + "selectedBackground": "{list.option.selectedBackground}", + "selectedFocusBackground": "{list.option.selectedFocusBackground}", + "color": "{list.option.color}", + "focusColor": "{list.option.focusColor}", + "selectedColor": "{list.option.selectedColor}", + "selectedFocusColor": "{list.option.selectedFocusColor}", + "padding": "{list.option.padding}", + "borderRadius": "{list.option.borderRadius}", + "separator": { + "borderColor": "{content.borderColor}" + } + }, + "overlaySelect": { + "background": "{overlay.select.background}", + "color": "{overlay.select.color}", + "borderColor": "{overlay.select.borderColor}", + "borderRadius": "{overlay.select.borderRadius}", + "shadow": "{overlay.select.shadow}" + }, + "overlayPopover": { + "background": "{overlay.popover.background}", + "color": "{overlay.popover.color}", + "borderColor": "{overlay.select.borderColor}", + "borderRadius": "{overlay.select.borderRadius}", + "shadow": "{overlay.popover.shadow}", + "padding": "{overlay.popover.padding.100}", + "gap": "{list.gap.100}" + } + }, + "paginatorTop": { + "borderColor": "{form.borderColor}", + "borderWidth": "0 0 {data.width.100} 0" + }, + "paginatorBottom": { + "borderWidth": "0 0 {data.width.100} 0", + "borderColor": "{content.borderColor}" + } + }, + "dataview": { + "root": { + "borderWidth": "{data.width.100}", + "borderRadius": "{data.borderRadius}", + "padding": "0rem", + "borderColor": "{content.borderColor}" + }, + "header": { + "borderWidth": "0 0 {data.width.100} 0", + "padding": "{data.padding.200} {data.padding.300}", + "borderRadius": "0 0 0 0", + "color": "{text.color}" + }, + "content": { + "background": "{content.background}", + "color": "{content.color}", + "borderColor": "{content.borderColor}", + "borderWidth": "0rem", + "padding": "0rem", + "borderRadius": "0" + }, + "footer": { + "background": "{surface.100}", + "color": "{text.color}", + "borderWidth": "{data.width.100} 0 0 0", + "padding": "{data.padding.200} {data.padding.300}", + "borderRadius": "0 0 0 0" + }, + "paginatorTop": { + "borderWidth": "0 0 {data.width.100} 0" + }, + "paginatorBottom": { + "borderWidth": "{data.width.100} 0 0 0" + } + }, + "datepicker": { + "extend": { + "extDate": { + "selectedHoverBackground": "{surface.800}" + }, + "extToday": { + "hoverBackground": "{content.hoverBackground}", + "borderColor": "{content.activeBorderColor}" + }, + "extTitle": { + "width": "{form.width.500}" + }, + "extTimePicker": { + "minWidth": "{form.width.400}", + "color": "{content.color}" + } + }, + "colorScheme": { + "light": { + "dropdown": { + "background": "{content.background}", + "hoverBackground": "{navigation.item.focusBackground}", + "activeBackground": "{navigation.item.activeBackground}", + "color": "{navigation.item.color}", + "hoverColor": "{navigation.item.focusColor}", + "activeColor": "{navigation.item.activeColor}" + }, + "today": { + "background": "{transparent}", + "color": "{text.extend.colorPrimaryStatic}" + } + } + }, + "panel": { + "background": "{content.background}", + "borderColor": "{content.borderColor}", + "color": "{content.color}", + "borderRadius": "{content.borderRadius}", + "shadow": "{overlay.popover.shadow}", + "padding": "0rem" + }, + "header": { + "background": "{content.background}", + "borderColor": "{content.borderColor}", + "color": "{content.color}", + "padding": "{overlay.popover.padding.100}" + }, + "title": { + "gap": "{form.gap.200}", + "fontWeight": "{fonts.fontWeight.bold}" + }, + "selectMonth": { + "hoverBackground": "{content.hoverBackground}", + "color": "{content.color}", + "hoverColor": "{content.hoverColor}", + "borderRadius": "{content.borderRadius}", + "padding": "{form.padding.200}" + }, + "inputIcon": { + "color": "{form.floatLabelColor}" + }, + "dropdown": { + "width": "{form.width.300}", + "borderColor": "{form.borderColor}", + "hoverBorderColor": "{form.borderColor}", + "activeBorderColor": "{form.borderColor}", + "borderRadius": "{form.borderRadius.200}", + "focusRing": { + "width": "{form.focusRing.width}", + "style": "{form.focusRing.style}", + "color": "{form.focusRing.color}", + "offset": "{form.focusRing.offset}", + "shadow": "{focusRing.shadow}" + }, + "sm": { + "width": "0rem" + }, + "lg": { + "width": "0rem" + } + }, + "group": { + "borderColor": "{content.borderColor}", + "gap": "{overlay.popover.padding.100}" + }, + "selectYear": { + "hoverBackground": "{content.hoverBackground}", + "color": "{content.color}", + "hoverColor": "{content.hoverColor}", + "borderRadius": "{content.borderRadius}", + "padding": "{overlay.select.padding}" + }, + "dayView": { + "margin": "{overlay.popover.padding.100}" + }, + "weekDay": { + "padding": "{form.padding.100}", + "fontWeight": "{fonts.fontWeight.bold}", + "color": "{content.color}" + }, + "date": { + "hoverBackground": "{content.hoverBackground}", + "selectedBackground": "{highlight.background}", + "rangeSelectedBackground": "{list.option.focusBackground}", + "color": "{content.color}", + "hoverColor": "{content.color}", + "selectedColor": "{text.extend.colorInverted}", + "rangeSelectedColor": "{text.color}", + "width": "{form.size.500}", + "height": "{form.size.500}", + "borderRadius": "{form.borderRadius.100}", + "padding": "{form.padding.100}", + "focusRing": { + "width": "{form.focusRing.width}", + "style": "{form.focusRing.style}", + "color": "{form.focusRing.color}", + "offset": "{form.focusRing.offset}", + "shadow": "{focusRing.shadow}" + } + }, + "monthView": { + "margin": "0 0 0 0" + }, + "month": { + "padding": "0", + "borderRadius": "0rem" + }, + "yearView": { + "margin": "0 0 0 0" + }, + "year": { + "padding": "0", + "borderRadius": "0rem" + }, + "buttonbar": { + "padding": "{overlay.popover.padding.100}", + "borderColor": "{content.borderColor}" + }, + "timePicker": { + "padding": "{form.padding.300}", + "borderColor": "{content.borderColor}", + "gap": "{form.gap.200}", + "buttonGap": "{form.gap.100}" + }, + "root": { + "transitionDuration": "{form.transitionDuration}" + } + }, + "dialog": { + "extend": { + "borderWidth": "{overlay.borderWidth}", + "backdrop": "{overlay.modal.backdrop}" + }, + "root": { + "background": "{overlay.modal.background}", + "borderColor": "{overlay.modal.borderColor}", + "color": "{overlay.modal.color}", + "borderRadius": "{overlay.modal.borderRadius}", + "shadow": "{overlay.popover.shadow}" + }, + "header": { + "padding": "{overlay.modal.padding.300} {overlay.modal.padding.300} 1rem {overlay.modal.padding.300}", + "gap": "{overlay.gap.200}" + }, + "title": { + "fontSize": "{fonts.fontSize.500}", + "fontWeight": "{fonts.fontWeight.demibold}" + }, + "content": { + "padding": "{content.padding.400}" + }, + "footer": { + "padding": "0 {overlay.modal.padding.300} {overlay.modal.padding.300} {overlay.modal.padding.300}", + "gap": "{content.gap.200}" + } + }, + "divider": { + "colorScheme": { + "light": { + "content": { + "background": "{content.background}", + "color": "{text.mutedColor}" + }, + "borderColor": "{content.borderColor}" + } + }, + "extend": { + "content": { + "gap": "{content.gap.200}" + }, + "iconSize": "{media.icon.size.100}" + }, + "horizontal": { + "margin": "{content.padding.300} 0", + "padding": "0 {content.padding.300}", + "content": { + "padding": "0 {content.padding.200}" + } + }, + "vertical": { + "margin": "0 {content.padding.300}", + "padding": "{content.padding.300} 0", + "content": { + "padding": "{content.padding.200} 0" + } + } + }, + "drawer": { + "extend": { + "borderRadius": "{overlay.popover.borderRadius}", + "borderWidth": "{overlay.borderWidth}", + "width": "{overlay.width}", + "extHeader": { + "gap": "{overlay.gap.200}", + "borderColor": "{drawer.root.borderColor}" + }, + "padding": "{overlay.drawer.padding}", + "scale": "0.125rem", + "backdrop": "{overlay.modal.backdrop}" + }, + "root": { + "background": "{overlay.modal.background}", + "borderColor": "{overlay.modal.borderColor}", + "color": "{overlay.modal.color}", + "shadow": "{overlay.modal.shadow}", + "width": "{overlay.width}" + }, + "sm": { + "width": "{overlay.sm.width}" + }, + "lg": { + "width": "{overlay.lg.width}" + }, + "xlg": { + "width": "{overlay.xlg.width}" + }, + "header": { + "padding": "{overlay.modal.padding.300} {overlay.modal.padding.300} {overlay.modal.padding.200} {overlay.modal.padding.300} " + }, + "title": { + "fontSize": "{fonts.fontSize.500}", + "fontWeight": "{fonts.fontWeight.demibold}" + }, + "content": { + "padding": "{overlay.modal.padding.300}" + }, + "footer": { + "padding": "0 {overlay.modal.padding.300} {overlay.modal.padding.300} {overlay.modal.padding.300} " + } + }, + "fileupload": { + "extend": { + "extDragNdrop": { + "background": "{surface.0}", + "borderRadius": "{form.borderRadius.200}", + "iconSize": "{form.size.500}", + "padding": "{form.padding.400}", + "info": { + "gap": "{form.gap.100}" + } + }, + "extFile": { + "iconSize": "{form.size.350}" + }, + "extContent": { + "borderRadius": "{content.borderRadius}", + "highlightBorderDefault": "{form.borderColor}" + } + }, + "colorScheme": { + "light": { + "header": { + "background": "{surface.0}", + "color": "{text.color}" + } + } + }, + "root": { + "background": "{content.background}", + "borderColor": "{content.borderColor}", + "color": "{content.color}", + "borderRadius": "{content.borderRadius}", + "transitionDuration": "{form.transitionDuration}" + }, + "header": { + "borderColor": "{content.borderColor}", + "borderWidth": "0rem", + "padding": "0rem", + "borderRadius": "0rem", + "gap": "{content.gap.200}" + }, + "content": { + "highlightBorderColor": "{surface.900}", + "padding": "0rem", + "gap": "{content.gap.200}" + }, + "file": { + "padding": "{content.padding.200}", + "gap": "{content.gap.200}", + "borderColor": "{form.borderColor}", + "info": { + "gap": "{content.gap.100}" + } + }, + "fileList": { + "gap": "{content.gap.200}" + }, + "progressbar": { + "height": "{feedback.height.100}" + }, + "basic": { + "gap": "{content.gap.200}" + } + }, + "floatlabel": { + "extend": { + "height": "{form.size.800}", + "iconSize": "{form.icon.400}" + }, + "root": { + "color": "{form.floatLabelColor}", + "focusColor": "{form.floatLabelFocusColor}", + "activeColor": "{form.floatLabelActiveColor}", + "invalidColor": "{form.floatLabelInvalidColor}", + "transitionDuration": "{form.transitionDuration}", + "positionX": "{form.padding.300}", + "positionY": "{form.padding.300}", + "fontWeight": "{fonts.fontWeight.regular}", + "active": { + "fontSize": "{fonts.fontSize.100}", + "fontWeight": "{fonts.fontWeight.regular}" + } + }, + "over": { + "active": { + "top": "{form.padding.400}" + } + }, + "in": { + "input": { + "paddingTop": "{form.padding.700}", + "paddingBottom": "{form.padding.300}" + }, + "active": { + "top": "{form.padding.300}" + } + }, + "on": { + "borderRadius": "0rem", + "active": { + "padding": "0 {form.padding.100}", + "background": "{form.background}" + } + } + }, + "galleria": { + "extend": { + "backdrop": "{overlay.modal.backdrop}" + }, + "colorScheme": { + "light": { + "thumbnailContent": { + "background": "{surface.100}" + }, + "thumbnailNavButton": { + "hoverBackground": "{colors.alpha.white.200}", + "color": "{text.color}", + "hoverColor": "{text.hoverColor}" + }, + "indicatorButton": { + "background": "{surface.300}", + "hoverBackground": "{surface.400}" + } + } + }, + "root": { + "borderWidth": "{content.borderWidth}", + "borderColor": "{content.borderColor}", + "borderRadius": "{content.borderRadius}", + "transitionDuration": "{media.transitionDuration}" + }, + "navButton": { + "background": "{transparent}", + "hoverBackground": "{colors.alpha.white.200}", + "color": "{text.extend.colorInverted}", + "hoverColor": "{text.extend.colorInverted}", + "size": "{media.size.600}", + "gutter": "{media.gap.200}", + "prev": { + "borderRadius": "{navigation.item.borderRadius}" + }, + "next": { + "borderRadius": "{navigation.item.borderRadius}" + }, + "focusRing": { + "width": "{focusRing.width}", + "style": "{focusRing.style}", + "color": "{focusRing.color}", + "offset": "{focusRing.offset}", + "shadow": "{focusRing.shadow}" + } + }, + "navIcon": { + "size": "{media.icon.size.300}" + }, + "thumbnailsContent": { + "padding": "{media.padding.100}" + }, + "thumbnailNavButton": { + "size": "{media.size.300}", + "borderRadius": "{content.borderRadius}", + "gutter": "{media.gap.200}", + "focusRing": { + "width": "{focusRing.width}", + "style": "{focusRing.style}", + "color": "{focusRing.color}", + "offset": "{focusRing.offset}", + "shadow": "{focusRing.shadow}" + } + }, + "thumbnailNavButtonIcon": { + "size": "{media.icon.size.100}" + }, + "caption": { + "background": "{colors.alpha.white.500}", + "color": "{text.color}", + "padding": "{media.gap.200}" + }, + "indicatorList": { + "gap": "{media.gap.200}", + "padding": "{media.padding.400}" + }, + "indicatorButton": { + "width": "{media.size.200}", + "height": "{media.size.200}", + "activeBackground": "{surface.900}", + "borderRadius": "{content.borderRadius}", + "focusRing": { + "width": "{focusRing.width}", + "style": "{focusRing.style}", + "color": "{focusRing.color}", + "offset": "{focusRing.offset}", + "shadow": "{focusRing.shadow}" + } + }, + "insetIndicatorList": { + "background": "{colors.alpha.black.500}" + }, + "insetIndicatorButton": { + "background": "{colors.alpha.white.100}", + "hoverBackground": "{colors.alpha.white.200}", + "activeBackground": "{colors.alpha.white.500}" + }, + "closeButton": { + "size": "{media.size.600}", + "gutter": "{media.gap.200}", + "background": "{colors.alpha.white.100}", + "hoverBackground": "{colors.alpha.white.200}", + "color": "{text.extend.colorInverted}", + "hoverColor": "{text.extend.colorInverted}", + "borderRadius": "{controls.borderRadius.200}", + "focusRing": { + "width": "{focusRing.width}", + "style": "{focusRing.style}", + "color": "{focusRing.color}", + "offset": "{focusRing.offset}", + "shadow": "{focusRing.shadow}" + } + }, + "closeButtonIcon": { + "size": "{media.icon.size.300}" + } + }, + "inputgroup": { + "extend": { + "borderWidth": "{form.borderWidth}", + "iconSize": "{form.icon.300}" + }, + "colorScheme": { + "light": { + "addon": { + "background": "{form.background}", + "borderColor": "{form.borderColor}", + "color": "{text.mutedColor}" + } + } + }, + "addon": { + "borderRadius": "{form.borderRadius.200}", + "padding": "{form.padding.300}", + "minWidth": "{form.width.300}" + } + }, + "inputnumber": { + "extend": { + "borderWidth": "{form.borderWidth}", + "extButton": { + "height": "{form.size.600}", + "iconSize": "{form.icon.300}" + } + }, + "colorScheme": { + "light": { + "button": { + "background": "{content.background}", + "hoverBackground": "{content.hoverBackground}", + "activeBackground": "{transparent}", + "borderColor": "{form.borderColor}", + "hoverBorderColor": "{form.borderColor}", + "activeBorderColor": "{form.borderColor}", + "color": "{text.color}", + "hoverColor": "{text.hoverColor}", + "activeColor": "{text.color}" + } + } + }, + "transitionDuration": { + "transitionDuration": "{form.transitionDuration}" + }, + "button": { + "width": "{form.size.600}", + "borderRadius": "{form.borderRadius.200}", + "verticalPadding": "{form.padding.300}" + } + }, + "inputotp": { + "extend": { + "height": "{form.size.600}", + "borderWidth": "{form.borderWidth}" + }, + "root": { + "gap": "{form.gap.200}" + }, + "input": { + "width": "{form.width.400}" + }, + "sm": { + "width": "0rem" + }, + "lg": { + "width": "0rem" + } + }, + "inputtext": { + "extend": { + "readonlyBackground": "{form.readonlyBackground}", + "iconSize": "{form.icon.300}", + "borderWidth": "{form.borderWidth}", + "extXlg": { + "fontSize": "{form.xlg.fontSize}", + "paddingX": "{form.padding.300}", + "paddingY": "{form.padding.600}" + } + }, + "root": { + "background": "{form.background}", + "disabledBackground": "{form.disabledBackground}", + "filledBackground": "{form.filledBackground}", + "filledHoverBackground": "{form.filledHoverBackground}", + "filledFocusBackground": "{form.filledFocusBackground}", + "borderColor": "{form.borderColor}", + "hoverBorderColor": "{form.hoverBorderSecondaryColor}", + "focusBorderColor": "{form.focusBorderSecondaryColor}", + "invalidBorderColor": "{form.invalidBorderColor}", + "color": "{text.color}", + "disabledColor": "{form.disabledColor}", + "placeholderColor": "{form.placeholderColor}", + "invalidPlaceholderColor": "{form.invalidPlaceholderColor}", + "shadow": "0", + "paddingX": "{form.padding.300}", + "paddingY": "{form.padding.300}", + "borderRadius": "{form.borderRadius.200}", + "transitionDuration": "{form.transitionDuration}", + "sm": { + "fontSize": "{fonts.fontSize.300}", + "paddingX": "{form.padding.300}", + "paddingY": "{form.padding.200}" + }, + "lg": { + "fontSize": "{fonts.fontSize.300}", + "paddingX": "{form.padding.300}", + "paddingY": "{form.padding.400}" + }, + "focusRing": { + "width": "{form.focusRing.width}", + "style": "{form.focusRing.style}", + "color": "{form.focusRing.color}", + "offset": "{form.focusRing.offset}", + "shadow": "0" + } + } + }, + "listbox": { + "extend": { + "extOption": { + "label": { + "gap": "{list.gap.100}" + }, + "caption": { + "color": "{text.mutedColor}", + "stripedColor": "{text.mutedColor}" + }, + "gap": "{list.gap.200}" + } + }, + "colorScheme": { + "light": { + "option": { + "stripedBackground": "{surface.50}" + } + } + }, + "root": { + "background": "{form.background}", + "disabledBackground": "{form.disabledBackground}", + "borderColor": "{form.borderColor}", + "invalidBorderColor": "{form.invalidBorderColor}", + "color": "{form.color}", + "disabledColor": "{form.disabledColor}", + "shadow": "0", + "borderRadius": "{form.borderRadius.200}", + "transitionDuration": "{form.transitionDuration}" + }, + "list": { + "padding": "{list.padding}", + "gap": "{list.gap.100}", + "header": { + "padding": "{list.header.padding}" + } + }, + "option": { + "focusBackground": "{list.option.focusBackground}", + "selectedBackground": "{list.option.selectedBackground}", + "selectedFocusBackground": "{list.option.selectedFocusBackground}", + "color": "{list.option.color}", + "focusColor": "{list.option.focusColor}", + "selectedColor": "{list.option.selectedColor}", + "selectedFocusColor": "{list.option.selectedFocusColor}", + "padding": "{list.option.padding}", + "borderRadius": "{list.option.borderRadius}" + }, + "optionGroup": { + "background": "{list.optionGroup.background}", + "color": "{list.optionGroup.color}", + "fontWeight": "{fonts.fontWeight.regular}", + "padding": "{list.option.padding}" + }, + "checkmark": { + "color": "{list.option.color}", + "gutterStart": "-{list.gap.200}", + "gutterEnd": "{list.gap.200}" + }, + "emptyMessage": { + "padding": "{list.option.padding}" + } + }, + "megamenu": { + "extend": { + "extItem": { + "caption": { + "color": "{text.mutedColor}", + "gap": "{content.gap.100}" + } + }, + "iconSize": "{navigation.submenuIcon.size}" + }, + "colorScheme": { + "light": { + "root": { + "background": "{transparent}" + } + } + }, + "root": { + "borderColor": "{transparent}", + "borderRadius": "{content.borderRadius}", + "color": "{content.color}", + "gap": "{content.gap.100}", + "transitionDuration": "{form.transitionDuration}", + "verticalOrientation": { + "padding": "{navigation.list.padding.100}", + "gap": "{navigation.list.gap}" + }, + "horizontalOrientation": { + "padding": "{navigation.list.padding.100}", + "gap": "{navigation.list.gap}" + } + }, + "baseItem": { + "borderRadius": "{content.borderRadius}", + "padding": "{navigation.item.padding}" + }, + "item": { + "focusBackground": "{navigation.item.focusBackground}", + "activeBackground": "{navigation.item.activeBackground}", + "color": "{navigation.item.color}", + "focusColor": "{navigation.item.focusColor}", + "activeColor": "{navigation.item.activeColor}", + "padding": "{navigation.item.padding}", + "borderRadius": "{navigation.item.borderRadius}", + "gap": "{navigation.item.gap}", + "icon": { + "color": "{navigation.item.icon.color}", + "focusColor": "{navigation.item.icon.focusColor}", + "activeColor": "{navigation.item.icon.activeColor}" + } + }, + "overlay": { + "padding": "{content.padding.100}", + "background": "{content.background}", + "borderColor": "{content.borderColor}", + "borderRadius": "{content.borderRadius}", + "color": "{content.color}", + "shadow": "{navigation.shadow}", + "gap": "0rem" + }, + "submenu": { + "padding": "{navigation.list.padding.100}", + "gap": "{navigation.list.gap}" + }, + "submenuLabel": { + "fontWeight": "{navigation.submenuLabel.fontWeight}", + "padding": "{navigation.submenuLabel.padding}", + "background": "{navigation.submenuLabel.background}", + "color": "{navigation.submenuLabel.color}" + }, + "submenuIcon": { + "size": "{navigation.submenuIcon.size}", + "color": "{navigation.submenuIcon.color}", + "focusColor": "{navigation.submenuIcon.focusColor}", + "activeColor": "{navigation.submenuIcon.activeColor}" + }, + "separator": { + "borderColor": "{content.borderColor}" + }, + "mobileButton": { + "borderRadius": "{navigation.item.borderRadius}", + "size": "{controls.iconOnly.600}", + "color": "{text.color}", + "hoverColor": "{text.hoverColor}", + "hoverBackground": "{content.hoverBackground}", + "focusRing": { + "width": "{focusRing.width}", + "style": "{focusRing.style}", + "color": "{focusRing.color}", + "offset": "{focusRing.offset}", + "shadow": "{focusRing.shadow}" + } + } + }, + "menu": { + "extend": { + "paddingX": "0.25rem", + "iconSize": "{navigation.submenuIcon.size}", + "paddingY": "0.25rem", + "extItem": { + "caption": { + "gap": "{content.gap.100}" + }, + "activeBackground": "{navigation.item.activeBackground}", + "activeColor": "{navigation.item.activeColor}" + } + }, + "colorScheme": { + "light": { + "extend": { + "extItem": { + "caption": { + "color": "{text.mutedColor}" + }, + "icon": { + "activeColor": "{navigation.item.icon.activeColor}" + } + } + }, + "root": { + "background": "{content.background}", + "borderColor": "{content.borderColor}", + "color": "{content.color}" + }, + "item": { + "focusBackground": "{navigation.item.focusBackground}", + "color": "{navigation.item.color}", + "focusColor": "{navigation.item.focusColor}", + "icon": { + "color": "{navigation.item.icon.color}", + "focusColor": "{navigation.item.icon.focusColor}" + } + } + } + }, + "root": { + "borderRadius": "{content.borderRadius}", + "shadow": "{navigation.shadow}", + "transitionDuration": "{form.transitionDuration}" + }, + "list": { + "padding": "{navigation.list.padding.100}", + "gap": "{navigation.list.gap}" + }, + "submenuLabel": { + "padding": "{navigation.submenuLabel.padding}", + "fontWeight": "{fonts.fontWeight.regular}", + "background": "{navigation.submenuLabel.background}", + "color": "{navigation.submenuLabel.color}" + }, + "separator": { + "borderColor": "{content.borderColor}" + }, + "item": { + "padding": "{navigation.item.padding}", + "borderRadius": "{navigation.item.borderRadius}", + "gap": "{navigation.item.gap}" + } + }, + "menubar": { + "extend": { + "iconSize": "{navigation.submenuIcon.size}", + "extItem": { + "caption": { + "color": "{text.mutedColor}", + "gap": "{content.padding.100}" + } + }, + "extSubmenuLabel": { + "padding": "{navigation.submenuLabel.padding}", + "fontWeight": "{fonts.fontWeight.demibold}", + "background": "{navigation.submenuLabel.background}", + "color": "{navigation.submenuLabel.color}" + } + }, + "colorScheme": { + "light": { + "root": { + "background": "{transparent}" + } + } + }, + "root": { + "borderColor": "{transparent}", + "borderRadius": "{navigation.item.borderRadius}", + "color": "{content.color}", + "gap": "{content.padding.100}", + "padding": "{navigation.list.padding.100}", + "transitionDuration": "{form.transitionDuration}" + }, + "baseItem": { + "borderRadius": "{navigation.item.borderRadius}", + "padding": "{navigation.item.padding}" + }, + "item": { + "focusBackground": "{navigation.item.focusBackground}", + "activeBackground": "{navigation.item.activeBackground}", + "color": "{navigation.item.color}", + "focusColor": "{navigation.item.focusColor}", + "activeColor": "{navigation.item.activeColor}", + "padding": "{navigation.item.padding}", + "borderRadius": "{navigation.item.borderRadius}", + "gap": "{navigation.item.gap}", + "icon": { + "color": "{navigation.item.icon.color}", + "focusColor": "{navigation.item.icon.focusColor}", + "activeColor": "{navigation.item.icon.activeColor}" + } + }, + "submenu": { + "padding": "{navigation.list.padding.100}", + "gap": "{navigation.list.gap}", + "background": "{content.background}", + "borderColor": "{content.borderColor}", + "borderRadius": "{content.borderRadius}", + "shadow": "{navigation.shadow}", + "mobileIndent": "{navigation.padding.200}", + "icon": { + "size": "{navigation.submenuIcon.size}", + "color": "{navigation.submenuIcon.color}", + "focusColor": "{navigation.submenuIcon.focusColor}", + "activeColor": "{navigation.submenuIcon.activeColor}" + } + }, + "separator": { + "borderColor": "{content.borderColor}" + }, + "mobileButton": { + "borderRadius": "{navigation.item.borderRadius}", + "size": "{controls.iconOnly.600}", + "color": "{text.color}", + "hoverColor": "{text.hoverColor}", + "hoverBackground": "{content.hoverBackground}", + "focusRing": { + "width": "{focusRing.width}", + "style": "{focusRing.style}", + "color": "{focusRing.color}", + "offset": "{focusRing.offset}", + "shadow": "{focusRing.shadow}" + } + } + }, + "message": { + "extend": { + "width": "{messages.width}", + "extText": { + "gap": "{feedback.gap.100}" + }, + "extInfo": { + "color": "{info.500}", + "closeButton": { + "color": "{info.500}", + "borderColor": "{info.500}" + }, + "caption": { + "color": "{text.color}" + } + }, + "extAccentLine": { + "width": "{feedback.width.200}" + }, + "extCloseButton": { + "width": "{feedback.width.100}" + }, + "extSuccess": { + "color": "{success.500}", + "closeButton": { + "color": "{success.500}", + "borderColor": "{success.500}" + }, + "caption": { + "color": "{text.color}" + } + }, + "extWarn": { + "color": "{warn.500}", + "closeButton": { + "color": "{warn.500}", + "borderColor": "{warn.500}" + }, + "caption": { + "color": "{text.color}" + } + }, + "extError": { + "color": "{error.500}", + "closeButton": { + "color": "{error.500}", + "borderColor": "{error.500}" + }, + "caption": { + "color": "{text.color}" + } + } + }, + "colorScheme": { + "light": { + "success": { + "background": "{success.50}", + "borderColor": "{success.500}", + "color": "{text.color}", + "shadow": "none", + "outlined": { + "color": "{text.color}", + "borderColor": "{success.500}" + }, + "closeButton": { + "hoverBackground": "{success.200}", + "focusRing": { + "color": "{focusRing.color}", + "shadow": "{focusRing.shadow}" + } + }, + "simple": { + "color": "{text.color}" + } + }, + "outlined": { + "root": { + "borderWidth": "0rem" + }, + "closeButton": { + "hoverBackground": "{transparent}", + "focusRing": { + "color": "{focusRing.color}", + "shadow": "{focusRing.shadow}" + } + }, + "outlined": { + "color": "{transparent}", + "borderColor": "{transparent}" + }, + "simple": { + "color": "{transparent}" + } + }, + "simple": { + "content": { + "padding": "0rem" + } + }, + "warn": { + "background": "{warn.50}", + "borderColor": "{warn.500}", + "color": "{text.color}", + "shadow": "none", + "outlined": { + "color": "{text.color}", + "borderColor": "{warn.500}" + }, + "closeButton": { + "hoverBackground": "{warn.200}", + "focusRing": { + "color": "{focusRing.color}", + "shadow": "{focusRing.shadow}" + } + }, + "simple": { + "color": "{text.color}" + } + }, + "error": { + "background": "{error.50}", + "borderColor": "{error.500}", + "color": "{text.color}", + "shadow": "none", + "outlined": { + "color": "{text.color}", + "borderColor": "{error.500}" + }, + "closeButton": { + "hoverBackground": "{error.200}", + "focusRing": { + "color": "{focusRing.color}", + "shadow": "{focusRing.shadow}" + } + }, + "simple": { + "color": "{text.color}" + } + }, + "secondary": { + "borderColor": "{transparent}", + "shadow": "none", + "closeButton": { + "hoverBackground": "{transparent}", + "focusRing": { + "color": "{focusRing.color}", + "shadow": "{focusRing.shadow}" + } + }, + "simple": { + "color": "{transparent}" + }, + "outlined": { + "color": "{transparent}", + "borderColor": "{transparent}" + } + }, + "contrast": { + "borderColor": "{transparent}", + "shadow": "none", + "closeButton": { + "hoverBackground": "{transparent}", + "focusRing": { + "color": "{focusRing.color}", + "shadow": "{focusRing.shadow}" + } + }, + "simple": { + "color": "{transparent}" + }, + "outlined": { + "color": "{transparent}", + "borderColor": "{transparent}" + } + }, + "info": { + "background": "{info.50}", + "borderColor": "{info.500}", + "color": "{text.color}", + "shadow": "none", + "closeButton": { + "hoverBackground": "{info.200}", + "focusRing": { + "color": "{focusRing.color}", + "shadow": "{focusRing.shadow}" + } + }, + "outlined": { + "color": "{text.color}", + "borderColor": "{info.500}" + }, + "simple": { + "color": "{text.color}" + } + } + } + }, + "root": { + "borderRadius": "{content.borderRadius}", + "borderWidth": "{feedback.width.100}", + "transitionDuration": "{feedback.transitionDuration}" + }, + "content": { + "padding": "{feedback.padding.200}", + "gap": "{feedback.gap.400}", + "sm": { + "padding": "{feedback.padding.200}" + }, + "lg": { + "padding": "{feedback.padding.200}" + } + }, + "text": { + "fontSize": "{fonts.fontSize.300}", + "fontWeight": "{fonts.fontWeight.bold}", + "sm": { + "fontSize": "{fonts.fontSize.300}" + }, + "lg": { + "fontSize": "{fonts.fontSize.300}" + } + }, + "icon": { + "size": "{feedback.icon.size.500}", + "sm": { + "size": "{feedback.icon.size.500}" + }, + "lg": { + "size": "{feedback.icon.size.500}" + } + }, + "closeButton": { + "width": "{controls.iconOnly.600}", + "height": "{controls.iconOnly.600}", + "borderRadius": "{controls.borderRadius.100}", + "focusRing": { + "width": "{focusRing.width}", + "style": "{focusRing.style}", + "offset": "{focusRing.offset}" + } + }, + "closeIcon": { + "size": "{feedback.icon.size.200}", + "sm": { + "size": "{feedback.icon.size.200}" + }, + "lg": { + "size": "{feedback.icon.size.200}" + } + } + }, + "metergroup": { + "extend": { + "extLabel": { + "color": "{text.mutedColor}" + } + }, + "root": { + "borderRadius": "{content.borderRadius}", + "gap": "{feedback.gap.300}" + }, + "meters": { + "size": "{feedback.height.100}", + "background": "{content.borderColor}" + }, + "label": { + "gap": "{feedback.gap.100}" + }, + "labelMarker": { + "size": "{feedback.icon.size.100}" + }, + "labelIcon": { + "size": "{feedback.icon.size.200}" + }, + "labelList": { + "verticalGap": "{feedback.gap.200}", + "horizontalGap": "{feedback.gap.300}" + } + }, + "multiselect": { + "colorScheme": { + "overlay": { + "background": "{overlay.select.background}", + "borderColor": "{overlay.select.borderColor}", + "color": "{overlay.select.color}" + }, + "option": { + "focusBackground": "{list.option.focusBackground}", + "selectedBackground": "{list.option.selectedBackground}", + "selectedFocusBackground": "{list.option.selectedFocusBackground}", + "color": "{list.option.color}", + "focusColor": "{list.option.focusColor}", + "selectedColor": "{list.option.selectedColor}", + "selectedFocusColor": "{list.option.selectedFocusColor}" + }, + "root": { + "background": "{form.background}", + "disabledBackground": "{form.disabledBackground}", + "filledBackground": "{form.filledBackground}", + "filledHoverBackground": "{form.filledHoverBackground}", + "filledFocusBackground": "{form.filledFocusBackground}", + "borderColor": "{form.borderColor}", + "hoverBorderColor": "{form.hoverBorderSecondaryColor}", + "focusBorderColor": "{form.focusBorderSecondaryColor}", + "invalidBorderColor": "{form.invalidBorderColor}", + "color": "{form.color}", + "disabledColor": "{form.disabledColor}", + "placeholderColor": "{form.placeholderColor}", + "invalidPlaceholderColor": "{form.invalidPlaceholderColor}", + "focusRing": { + "color": "{form.focusRing.color}" + } + }, + "dropdown": { + "color": "{form.floatLabelColor}" + }, + "optionGroup": { + "background": "{list.optionGroup.background}", + "color": "{list.optionGroup.color}" + }, + "clearIcon": { + "color": "{form.floatLabelColor}" + } + }, + "extend": { + "paddingX": "0.3571rem", + "paddingY": "0.3571rem", + "borderWidth": "{form.borderWidth}", + "iconSize": "{form.icon.300}", + "width": "{form.width}", + "readonlyBackground": "{form.readonlyBackground}" + }, + "root": { + "shadow": "0", + "paddingX": "{form.paddingX}", + "paddingY": "{form.paddingY}", + "borderRadius": "{form.borderRadius.200}", + "transitionDuration": "{form.transitionDuration}", + "sm": { + "fontSize": "{fonts.fontSize.300}", + "paddingX": "{form.padding.200}", + "paddingY": "{form.padding.200}" + }, + "lg": { + "fontSize": "{fonts.fontSize.300}", + "paddingX": "{form.padding.400}", + "paddingY": "{form.padding.400}" + }, + "focusRing": { + "width": "{form.focusRing.width}", + "style": "{form.focusRing.style}", + "offset": "{form.focusRing.offset}", + "shadow": "0" + } + }, + "dropdown": { + "width": "{form.width.300}" + }, + "overlay": { + "borderRadius": "{overlay.select.borderRadius}", + "shadow": "{overlay.select.shadow}" + }, + "list": { + "padding": "{list.padding}", + "header": { + "padding": "{list.header.padding}" + }, + "gap": "{list.gap.100}" + }, + "chip": { + "borderRadius": "{form.borderRadius.100}" + }, + "option": { + "padding": "{list.option.padding}", + "borderRadius": "{list.option.borderRadius}", + "gap": "{list.gap.200}" + }, + "optionGroup": { + "fontWeight": "{fonts.fontWeight.demibold}", + "padding": "{list.optionGroup.padding}" + }, + "emptyMessage": { + "padding": "{list.option.padding}" + } + }, + "paginator": { + "root": { + "padding": "0 {data.padding.200}", + "gap": "{data.gap.200}", + "borderRadius": "{content.borderRadius}", + "background": "{transparent}", + "color": "{content.color}", + "transitionDuration": "{data.transitionDuration}" + }, + "currentPageReport": { + "color": "{text.mutedColor}" + }, + "navButton": { + "background": "{transparent}", + "hoverBackground": "{content.hoverBackground}", + "selectedBackground": "{highlight.background}", + "color": "{text.color}", + "hoverColor": "{text.hoverColor}", + "selectedColor": "{text.extend.colorInverted}", + "width": "{data.icon.size.700}", + "height": "{data.icon.size.700}", + "borderRadius": "{content.borderRadius}", + "focusRing": { + "width": "{focusRing.width}", + "style": "{focusRing.style}", + "color": "{focusRing.color}", + "offset": "{focusRing.offset}", + "focus": "{focusRing.shadow}" + } + }, + "jumpToPageInput": { + "maxWidth": "{data.width.400}" + } + }, + "panelmenu": { + "extend": { + "extPanel": { + "gap": "{content.gap.100}" + }, + "iconSize": "{navigation.submenuIcon.size}", + "extItem": { + "activeBackground": "{navigation.item.activeBackground}", + "activeColor": "{navigation.item.activeColor}", + "caption": { + "color": "{text.mutedColor}", + "gap": "{content.gap.100}" + } + } + }, + "root": { + "gap": "{content.gap.100}", + "transitionDuration": "{form.transitionDuration}" + }, + "panel": { + "background": "{transparent}", + "borderColor": "{transparent}", + "borderWidth": "{navigation.width.100}", + "color": "{content.color}", + "padding": "{content.padding.100}", + "borderRadius": "{content.borderRadius}", + "first": { + "borderWidth": "{navigation.width.100} {navigation.width.100} 0 {navigation.width.100}", + "topBorderRadius": "{content.borderRadius}" + }, + "last": { + "borderWidth": "0 {navigation.width.100} {navigation.width.100} {navigation.width.100}", + "topBorderRadius": "{content.borderRadius}" + } + }, + "item": { + "focusBackground": "{navigation.item.focusBackground}", + "color": "{navigation.item.color}", + "focusColor": "{navigation.item.focusColor}", + "gap": "{navigation.item.gap}", + "padding": "{navigation.item.padding}", + "borderRadius": "{navigation.item.borderRadius}", + "icon": { + "color": "{navigation.item.icon.color}", + "focusColor": "{navigation.item.icon.focusColor}" + } + }, + "submenu": { + "indent": "{navigation.padding.400}" + }, + "separator": { + "borderColor": "{content.borderColor}" + }, + "submenuIcon": { + "color": "{navigation.submenuIcon.color}", + "focusColor": "{navigation.submenuIcon.focusColor}" + } + }, + "password": { + "extend": { + "borderWidth": "{form.borderWidth}" + }, + "colorScheme": { + "light": { + "strength": { + "weakBackground": "{error.500}", + "mediumBackground": "{warn.500}", + "strongBackground": "{success.600}" + }, + "icon": { + "color": "{form.placeholderColor}" + } + }, + "dark": { + "strength": { + "weakBackground": "{error.500}", + "mediumBackground": "{warn.500}", + "strongBackground": "{success.600}" + }, + "icon": { + "color": "{form.placeholderColor}" + } + } + }, + "meter": { + "background": "{content.borderColor}", + "borderRadius": "{content.borderRadius}", + "height": "{feedback.height.100}" + }, + "overlay": { + "background": "{overlay.popover.background}", + "borderColor": "{overlay.popover.borderColor}", + "borderRadius": "{overlay.popover.borderRadius}", + "color": "{overlay.popover.color}", + "padding": "{overlay.popover.padding.100}", + "shadow": "{overlay.popover.shadow}" + }, + "content": { + "gap": "{content.gap.200}" + } + }, + "popover": { + "extend": { + "borderWidth": "{overlay.borderWidth}", + "arrow": { + "width": "{overlay.popover.width.200}", + "height": "{overlay.popover.width.100}" + } + }, + "root": { + "background": "{overlay.popover.background}", + "borderColor": "{overlay.popover.borderColor}", + "color": "{overlay.popover.color}", + "borderRadius": "{overlay.popover.borderRadius}", + "shadow": "{overlay.popover.shadow}", + "gutter": "{overlay.gap.300}", + "arrowOffset": "{overlay.popover.padding.200}", + "arrowLeft": "0px" + }, + "content": { + "padding": "{overlay.popover.padding.100}" + } + }, + "progressbar": { + "label": { + "color": "{text.extend.colorPrimaryStatic}", + "fontSize": "{fonts.fontSize.100}", + "fontWeight": "{fonts.fontWeight.regular}" + }, + "root": { + "background": "{content.borderColor}", + "borderRadius": "{content.borderRadius}", + "height": "{feedback.height.300}" + }, + "value": { + "background": "{primary.color}" + } + }, + "progressspinner": { + "extend": { + "small": "{feedback.width.500}", + "medium": "{feedback.width.700}", + "large": "{feedback.width.800}", + "xlarge": "{feedback.width.900}" + }, + "colorScheme": { + "light": { + "root": { + "colorOne": "{success.500}", + "colorTwo": "{info.500}", + "colorThree": "{error.500}", + "colorFour": "{warn.500}" + } + } + }, + "root": { + "borderWidth": "{feedback.width.200}" + } + }, + "radiobutton": { + "root": { + "width": "{form.size.400}", + "height": "{form.size.400}", + "background": "{form.background}", + "checkedBackground": "{surface.900}", + "checkedHoverBackground": "{surface.800}", + "disabledBackground": "{form.disabledBackground}", + "filledBackground": "{form.filledBackground}", + "borderColor": "{form.borderColor}", + "hoverBorderColor": "{form.hoverBorderPrimaryColor}", + "focusBorderColor": "{form.borderColor}", + "checkedBorderColor": "{surface.900}", + "checkedHoverBorderColor": "{form.hoverBorderPrimaryColor}", + "checkedFocusBorderColor": "{form.focusBorderPrimaryColor}", + "checkedDisabledBorderColor": "{form.borderColor}", + "invalidBorderColor": "{form.invalidBorderColor}", + "shadow": "0", + "transitionDuration": "{form.transitionDuration}" + }, + "focusRing": { + "width": "{focusRing.width}", + "style": "{focusRing.style}", + "color": "{focusRing.color}", + "offset": "{focusRing.offset}", + "shadow": "{focusRing.shadow}" + }, + "sm": { + "width": "{form.size.300}", + "height": "{form.size.300}" + }, + "lg": { + "width": "{form.size.350}", + "height": "{form.size.350}" + }, + "icon": { + "size": "0.7rem", + "checkedColor": "{text.extend.colorInverted}", + "checkedHoverColor": "{text.extend.colorInverted}", + "disabledColor": "{text.mutedColor}", + "sm": { + "size": "{form.icon.100}" + }, + "lg": { + "size": "{form.icon.300}" + } + } + }, + "rating": { + "root": { + "gap": "{form.gap.200}", + "transitionDuration": "{form.transitionDuration}" + }, + "focusRing": { + "width": "{form.focusRing.width}", + "style": "{form.focusRing.style}", + "color": "{form.focusRing.color}", + "offset": "{form.focusRing.offset}", + "shadow": "{focusRing.shadow}" + }, + "icon": { + "size": "{form.icon.500}", + "color": "{surface.500}", + "hoverColor": "{warn.500}", + "activeColor": "{warn.500}" + } + }, + "ripple": { + "colorScheme": { + "light": { + "root": { + "background": "rgba(255, 255, 255, 0.0100)" + } + } + } + }, + "scrollpanel": { + "colorScheme": { + "light": { + "bar": { + "background": "{surface.300}" + } + } + }, + "root": { + "transitionDuration": "{media.transitionDuration}" + }, + "bar": { + "size": "{media.size.200}", + "borderRadius": "{media.borderRadius.100}", + "focusRing": { + "width": "0rem", + "style": "{focusRing.style}", + "color": "{focusRing.color}", + "offset": "{focusRing.offset}", + "shadow": "{focusRing.shadow}" + } + } + }, + "select": { + "extend": { + "extOption": { + "background": "{list.option.background}", + "gap": "{list.gap.200}" + }, + "extOptionGroup": { + "gap": "{list.gap.200}" + }, + "readonlyBackground": "{form.readonlyBackground}", + "borderWidth": "{form.borderWidth}", + "iconSize": "{form.icon.300}" + }, + "root": { + "background": "{form.background}", + "disabledBackground": "{form.disabledBackground}", + "filledBackground": "{form.filledBackground}", + "filledHoverBackground": "{form.filledHoverBackground}", + "filledFocusBackground": "{form.filledFocusBackground}", + "borderColor": "{form.borderColor}", + "hoverBorderColor": "{form.hoverBorderSecondaryColor}", + "focusBorderColor": "{form.focusBorderSecondaryColor}", + "invalidBorderColor": "{form.invalidBorderColor}", + "color": "{text.color}", + "disabledColor": "{form.disabledColor}", + "placeholderColor": "{form.placeholderColor}", + "invalidPlaceholderColor": "{form.invalidPlaceholderColor}", + "shadow": "0", + "paddingX": "{form.padding.300}", + "paddingY": "{form.padding.300}", + "borderRadius": "{form.borderRadius.200}", + "transitionDuration": "{form.transitionDuration}", + "sm": { + "fontSize": "{fonts.fontSize.300}", + "paddingX": "{form.padding.300}", + "paddingY": "{form.padding.200}" + }, + "lg": { + "fontSize": "{fonts.fontSize.300}", + "paddingX": "{form.padding.300}", + "paddingY": "{form.padding.400}" + }, + "focusRing": { + "width": "{form.focusRing.width}", + "style": "{form.focusRing.style}", + "color": "{form.focusRing.color}", + "offset": "{form.focusRing.offset}", + "shadow": "0" + } + }, + "dropdown": { + "width": "{form.width.300}", + "color": "{form.iconColor}" + }, + "overlay": { + "background": "{overlay.select.background}", + "borderColor": "{overlay.select.borderColor}", + "borderRadius": "{overlay.select.borderRadius}", + "color": "{overlay.select.color}", + "shadow": "{overlay.select.shadow}" + }, + "list": { + "padding": "{list.padding}", + "gap": "{list.gap.100}", + "header": { + "padding": "{list.header.padding}" + } + }, + "option": { + "focusBackground": "{list.option.focusBackground}", + "selectedBackground": "{list.option.selectedBackground}", + "selectedFocusBackground": "{list.option.selectedFocusBackground}", + "color": "{list.option.color}", + "focusColor": "{list.option.focusColor}", + "selectedColor": "{list.option.selectedColor}", + "selectedFocusColor": "{list.option.selectedFocusColor}", + "padding": "{list.option.padding}", + "borderRadius": "{list.option.borderRadius}" + }, + "optionGroup": { + "background": "{list.optionGroup.background}", + "color": "{list.optionGroup.color}", + "fontWeight": "{fonts.fontWeight.regular}", + "padding": "{list.option.padding}" + }, + "clearIcon": { + "color": "{form.iconColor}" + }, + "checkmark": { + "color": "{list.option.color}", + "gutterStart": "-{form.padding.200}", + "gutterEnd": "{form.padding.200}" + }, + "emptyMessage": { + "padding": "{list.option.padding}" + } + }, + "selectbutton": { + "extend": { + "gap": "{form.gap.100}", + "paddingX": "{controls.padding.100}", + "paddingY": "{controls.padding.100}", + "checkedBackground": "{form.background}", + "iconSize": { + "sm": "{controls.iconOnly.200}", + "md": "{controls.iconOnly.300}", + "lg": "{controls.iconOnly.400}", + "xlg": "{controls.iconOnly.500}" + }, + "checkedBorderColor": "{form.background}", + "checkedColor": "{form.color}", + "ext": { + "borderRadius": "{borderRadius.200}" + } + }, + "colorScheme": { + "light": { + "root": { + "invalidBorderColor": "{form.invalidBorderColor}" + }, + "extend": { + "background": "{surface.200}" + } + } + }, + "root": { + "borderRadius": "{form.borderRadius.200}" + } + }, + "skeleton": { + "extend": { + "minWidth": "{feedback.width.700}", + "height": "{feedback.height.650}" + }, + "colorScheme": { + "light": { + "root": { + "background": "{surface.200}", + "animationBackground": "{surface.100}" + } + } + }, + "root": { + "borderRadius": "{content.borderRadius}" + } + }, + "slider": { + "colorScheme": { + "handle": { + "content": { + "background": "{surface.0}" + } + } + }, + "root": { + "transitionDuration": "{form.transitionDuration}" + }, + "track": { + "background": "{content.borderColor}", + "borderRadius": "{content.borderRadius}", + "size": "{form.size.150}" + }, + "range": { + "background": "{surface.900}" + }, + "handle": { + "width": "{form.size.350}", + "height": "{form.size.350}", + "borderRadius": "{form.borderRadius.300}", + "background": "{surface.900}", + "hoverBackground": "{surface.900}", + "focusRing": { + "width": "{form.focusRing.width}", + "style": "{form.focusRing.style}", + "color": "{form.focusRing.color}", + "offset": "{form.focusRing.offset}", + "shadow": "{focusRing.shadow}" + }, + "content": { + "borderRadius": "{form.borderRadius.300}", + "hoverBackground": "{surface.900}", + "width": "{form.size.250}", + "height": "{form.size.250}", + "shadow": "none" + } + } + }, + "splitter": { + "colorScheme": { + "light": { + "handle": { + "background": "{surface.900}" + } + } + }, + "gutter": { + "background": "{surface.100}" + }, + "root": { + "background": "{content.background}", + "borderColor": "{content.borderColor}", + "color": "{content.color}", + "transitionDuration": "{controls.transitionDuration}" + }, + "handle": { + "size": "{form.size.150}", + "borderRadius": "{content.borderRadius}", + "focusRing": { + "width": "{form.focusRing.width}", + "style": "{form.focusRing.style}", + "color": "{form.focusRing.color}", + "offset": "{form.focusRing.offset}", + "shadow": "{focusRing.shadow}" + } + } + }, + "stepper": { + "extend": { + "extCaption": { + "gap": "{feedback.gap.100}" + }, + "extStepNumber": { + "invalidBackground": "{error.400}", + "invalidColor": "{error.900}", + "invalidBorderColor": "{error.400}", + "borderWidth": "{feedback.width.100}", + "iconSize": "{feedback.icon.size.300}" + } + }, + "root": { + "transitionDuration": "{feedback.transitionDuration}" + }, + "separator": { + "background": "{content.borderColor}", + "activeBackground": "{form.focusBorderPrimaryColor}", + "margin": "0 0 0 1.625rem", + "size": "{form.size.100}" + }, + "step": { + "padding": "{feedback.padding.100}", + "gap": "{feedback.gap.200}" + }, + "stepHeader": { + "padding": "0rem", + "borderRadius": "0rem", + "gap": "{feedback.gap.200}", + "focusRing": { + "width": "{focusRing.width}", + "style": "{focusRing.style}", + "color": "{focusRing.color}", + "offset": "{focusRing.offset}", + "shadow": "{focusRing.shadow}" + } + }, + "stepTitle": { + "color": "{text.color}", + "activeColor": "{text.color}", + "fontWeight": "{fonts.fontWeight.regular}" + }, + "stepNumber": { + "background": "{content.background}", + "activeBackground": "{primary.color}", + "borderColor": "{content.borderColor}", + "activeBorderColor": "{primary.color}", + "color": "{text.color}", + "activeColor": "{text.extend.colorPrimaryStatic}", + "size": "{form.size.400}", + "fontSize": "{fonts.fontSize.300}", + "fontWeight": "{fonts.fontWeight.bold}", + "borderRadius": "{form.borderRadius.300}", + "shadow": "none" + }, + "steppanels": { + "padding": "{feedback.padding.200}" + }, + "steppanel": { + "background": "{content.background}", + "color": "{content.color}", + "padding": "0rem", + "indent": "0rem" + } + }, + "steps": { + "itemLink": { + "gap": "{form.gap.200}" + }, + "itemLabel": { + "fontWeight": "{fonts.fontWeight.regular}" + }, + "itemNumber": { + "background": "{content.background}", + "size": "{form.size.500}", + "fontSize": "{fonts.fontSize.300}", + "fontWeight": "{fonts.fontWeight.bold}", + "borderRadius": "{form.borderRadius.300}", + "shadow": "none" + } + }, + "tabs": { + "colorScheme": { + "light": { + "navButton": { + "shadow": "none" + }, + "tab": { + "background": "{transparent}", + "hoverBackground": "{transparent}", + "activeBackground": "{transparent}" + } + } + }, + "root": { + "transitionDuration": "{data.transitionDuration}" + }, + "tablist": { + "borderWidth": "0 0 {data.width.100} 0", + "background": "{transparent}", + "borderColor": "{content.borderColor}" + }, + "tab": { + "borderWidth": "0", + "borderColor": "{content.borderColor}", + "hoverBorderColor": "{content.borderColor}", + "activeBorderColor": "{content.activeBorderColor}", + "color": "{text.mutedColor}", + "hoverColor": "{text.color}", + "activeColor": "{text.color}", + "padding": "{content.padding.300}", + "fontWeight": "{fonts.fontWeight.demibold}", + "margin": "0", + "gap": "{content.gap.200}", + "focusRing": { + "width": "{focusRing.width}", + "style": "{focusRing.style}", + "color": "{focusRing.color}", + "offset": "{focusRing.offset}", + "shadow": "{focusRing.shadow}" + } + }, + "tabpanel": { + "background": "{transparent}", + "color": "{text.color}", + "padding": "{spacing.4x}", + "focusRing": { + "width": "{focusRing.width}", + "style": "{focusRing.style}", + "color": "{focusRing.color}", + "offset": "{focusRing.offset}", + "shadow": "{focusRing.shadow}" + } + }, + "navButton": { + "background": "{content.background}", + "color": "{content.color}", + "hoverColor": "{content.hoverColor}", + "width": "{controls.iconOnly.400}", + "focusRing": { + "width": "{focusRing.width}", + "style": "{focusRing.style}", + "color": "{focusRing.color}", + "offset": "{focusRing.offset}", + "shadow": "{focusRing.shadow}" + } + }, + "activeBar": { + "height": "0.18rem", + "bottom": "-0.18rem", + "background": "{content.color}" + } + }, + "toast": { + "extend": { + "extInfo": { + "color": "{info.500}", + "closeButton": { + "color": "{info.500}", + "borderColor": "{info.500}" + }, + "caption": { + "color": "{text.color}" + } + }, + "extAccentLine": { + "width": "{feedback.width.200}" + }, + "extCloseButton": { + "width": "{feedback.width.100}" + }, + "extSuccess": { + "color": "{success.500}", + "closeButton": { + "color": "{success.500}", + "borderColor": "{success.500}" + }, + "caption": { + "color": "{text.color}" + } + }, + "extWarn": { + "color": "{warn.500}", + "closeButton": { + "color": "{warn.500}", + "borderColor": "{warn.500}" + }, + "caption": { + "color": "{text.color}" + } + }, + "extError": { + "color": "{error.500}", + "closeButton": { + "color": "{error.500}", + "borderColor": "{error.500}" + }, + "caption": { + "color": "{text.color}" + } + } + }, + "colorScheme": { + "light": { + "info": { + "background": "{info.50}", + "borderColor": "{info.500}", + "color": "{text.color}", + "detailColor": "{text.color}", + "shadow": "{overlay.popover.shadow}", + "closeButton": { + "hoverBackground": "{info.200}", + "focusRing": { + "color": "{focusRing.color}", + "shadow": "{focusRing.shadow}" + } + } + }, + "success": { + "background": "{success.50}", + "borderColor": "{success.500}", + "color": "{text.color}", + "detailColor": "{text.color}", + "shadow": "{overlay.popover.shadow}", + "closeButton": { + "hoverBackground": "{success.200}", + "focusRing": { + "color": "{focusRing.color}", + "shadow": "{focusRing.shadow}" + } + } + }, + "warn": { + "background": "{warn.50}", + "borderColor": "{warn.500}", + "color": "{text.color}", + "detailColor": "{text.color}", + "shadow": "{overlay.popover.shadow}", + "closeButton": { + "hoverBackground": "{warn.200}", + "focusRing": { + "color": "{focusRing.color}", + "shadow": "none" + } + } + }, + "error": { + "background": "{error.50}", + "borderColor": "{error.500}", + "color": "{text.color}", + "detailColor": "{text.color}", + "shadow": "{overlay.popover.shadow}", + "closeButton": { + "hoverBackground": "{error.200}", + "focusRing": { + "color": "{focusRing.color}", + "shadow": "{focusRing.shadow}" + } + } + }, + "secondary": { + "shadow": "{overlay.popover.shadow}" + }, + "contrast": { + "shadow": "{overlay.popover.shadow}" + } + } + }, + "root": { + "width": "{messages.width}", + "borderWidth": "{feedback.width.100}", + "borderRadius": "{content.borderRadius}", + "transitionDuration": "{feedback.transitionDuration}" + }, + "icon": { + "size": "{feedback.icon.size.500}" + }, + "content": { + "padding": "{feedback.padding.200}", + "gap": "{feedback.gap.400}" + }, + "text": { + "gap": "{feedback.gap.100}" + }, + "summary": { + "fontWeight": "{fonts.fontWeight.bold}", + "fontSize": "{fonts.fontSize.300}" + }, + "detail": { + "fontWeight": "{fonts.fontWeight.regular}", + "fontSize": "{fonts.fontSize.200}" + }, + "closeButton": { + "width": "{feedback.icon.size.400}", + "height": "{feedback.icon.size.400}", + "borderRadius": "{controls.borderRadius.100}", + "focusRing": { + "width": "{focusRing.width}", + "style": "{focusRing.style}", + "offset": "{focusRing.offset}" + } + }, + "closeIcon": { + "size": "{feedback.icon.size.200}" + } + }, + "tag": { + "colorScheme": { + "light": { + "primary": { + "background": "{primary.selectedBackground}", + "color": "{text.color}" + }, + "secondary": { + "background": "{surface.200}", + "color": "{text.color}" + }, + "success": { + "background": "{success.400}", + "color": "{success.900}" + }, + "info": { + "background": "{info.300}", + "color": "{info.900}" + }, + "warn": { + "background": "{warn.300}", + "color": "{warn.900}" + }, + "danger": { + "background": "{error.300}", + "color": "{error.900}" + } + } + }, + "root": { + "fontSize": "{fonts.fontSize.100}", + "fontWeight": "{fonts.fontWeight.regular}", + "padding": "{media.padding.100} {media.padding.200}", + "gap": "{media.gap.100}", + "borderRadius": "{media.size.200}", + "roundedBorderRadius": "{media.borderRadius.400}" + }, + "icon": { + "size": "{media.icon.size.100}" + } + }, + "textarea": { + "extend": { + "readonlyBackground": "{form.readonlyBackground}", + "borderWidth": "{form.borderWidth}", + "iconSize": "{form.icon.300}", + "minHeight": "{form.size.900}", + "extXlg": { + "fontSize": "{fonts.fontSize.300}", + "paddingX": "{form.padding.300}", + "paddingY": "{form.padding.500}" + } + }, + "root": { + "background": "{form.background}", + "disabledBackground": "{form.disabledBackground}", + "filledBackground": "{form.filledBackground}", + "filledHoverBackground": "{form.filledHoverBackground}", + "filledFocusBackground": "{form.filledFocusBackground}", + "borderColor": "{form.borderColor}", + "hoverBorderColor": "{form.hoverBorderSecondaryColor}", + "focusBorderColor": "{form.focusBorderSecondaryColor}", + "invalidBorderColor": "{form.invalidBorderColor}", + "color": "{form.color}", + "disabledColor": "{form.disabledColor}", + "placeholderColor": "{form.placeholderColor}", + "invalidPlaceholderColor": "{form.invalidPlaceholderColor}", + "shadow": "0", + "paddingX": "{form.padding.300}", + "paddingY": "{form.padding.300}", + "borderRadius": "{form.borderRadius.200}", + "transitionDuration": "{form.transitionDuration}", + "focusRing": { + "width": "{form.focusRing.width}", + "style": "{form.focusRing.style}", + "color": "{form.focusRing.color}", + "offset": "{form.focusRing.offset}", + "shadow": "0" + }, + "sm": { + "fontSize": "{fonts.fontSize.300}", + "paddingX": "{form.padding.300}", + "paddingY": "{form.padding.200}" + }, + "lg": { + "fontSize": "{fonts.fontSize.300}", + "paddingX": "{form.padding.300}", + "paddingY": "{form.padding.400}" + } + } + }, + "tieredmenu": { + "extend": { + "extSubmenu": { + "borderColor": "{content.borderColor}", + "background": "{content.background}" + }, + "iconSize": "{navigation.submenuIcon.size}", + "extItem": { + "caption": { + "gap": "{content.gap.100}", + "color": "{text.mutedColor}" + } + } + }, + "root": { + "background": "{content.background}", + "borderColor": "{transparent}", + "color": "{content.color}", + "borderRadius": "{content.borderRadius}", + "shadow": "{navigation.shadow}", + "transitionDuration": "{feedback.transitionDuration}" + }, + "list": { + "padding": "{navigation.list.padding.100}", + "gap": "{navigation.list.gap}" + }, + "item": { + "focusBackground": "{navigation.item.focusBackground}", + "activeBackground": "{navigation.item.activeBackground}", + "color": "{navigation.item.color}", + "focusColor": "{navigation.item.focusColor}", + "activeColor": "{navigation.item.activeColor}", + "padding": "{navigation.item.padding}", + "borderRadius": "{navigation.item.borderRadius}", + "gap": "{navigation.item.gap}", + "icon": { + "color": "{navigation.item.icon.color}", + "focusColor": "{navigation.item.icon.focusColor}", + "activeColor": "{navigation.item.icon.activeColor}" + } + }, + "submenu": { + "mobileIndent": "{overlay.popover.padding.100}" + }, + "separator": { + "borderColor": "{content.borderColor}" + } + }, + "timeline": { + "extend": { + "extEvent": { + "gap": "{feedback.gap.100}" + } + }, + "event": { + "minHeight": "{feedback.height.900}" + }, + "vertical": { + "eventContent": { + "padding": "0 {feedback.padding.100}" + } + }, + "horizontal": { + "eventContent": { + "padding": "{feedback.padding.100} 0" + } + }, + "eventMarker": { + "size": "{feedback.width.500}", + "borderRadius": "{content.borderRadius}", + "borderWidth": "{feedback.width.200}", + "background": "{content.background}", + "borderColor": "{primary.color}", + "content": { + "borderRadius": "{content.borderRadius}", + "size": "{feedback.width.400}", + "background": "{transparent}", + "insetShadow": "none" + } + }, + "eventConnector": { + "color": "{content.borderColor}", + "size": "{feedback.width.100}" + }, + "colorScheme": { + "light": { + "eventMarker": { + "background": "{content.background}", + "borderColor": "{primary.color}" + } + }, + "dark": { + "eventMarker": { + "background": "{content.background}", + "borderColor": "{primary.color}" + } + } + } + }, + "togglebutton": { + "extend": { + "ext": { + "gap": "{form.gap.300}" + }, + "iconSize": { + "sm": "{controls.iconOnly.200}", + "md": "{controls.iconOnly.300}", + "lg": "{controls.iconOnly.400}" + }, + "iconOnlyWidth": "{form.size.600}", + "hoverBorderColor": "{surface.300}", + "checkedHoverColor": "{text.extend.colorInverted}", + "checkedHoverBackground": "{surface.800}", + "checkedHoverBorderColor": "{surface.800}", + "extXlg": { + "padding": "{form.padding.500} {form.padding.600}", + "iconOnlyWidth": "4.0714rem" + }, + "extSm": { + "iconOnlyWidth": "2.1429rem" + }, + "extLg": { + "iconOnlyWidth": "3.5714rem" + } + }, + "colorScheme": { + "light": { + "root": { + "background": "{surface.200}", + "hoverBackground": "{surface.300}", + "borderColor": "{surface.200}", + "color": "{text.color}", + "hoverColor": "{text.color}", + "checkedBackground": "{surface.900}", + "checkedColor": "{text.extend.colorInverted}", + "checkedBorderColor": "{surface.900}", + "disabledBackground": "{form.disabledBackground}", + "disabledBorderColor": "{form.disabledBackground}", + "disabledColor": "{form.disabledColor}", + "invalidBorderColor": "{form.invalidBorderColor}" + }, + "icon": { + "color": "{text.color}", + "hoverColor": "{text.color}", + "checkedColor": "{text.extend.colorInverted}", + "disabledColor": "{form.disabledColor}" + }, + "content": { + "checkedBackground": "{transparent}" + } + } + }, + "root": { + "padding": "{form.padding.200} {form.padding.400}", + "borderRadius": "{form.borderRadius.300}", + "gap": "{form.gap.200}", + "fontWeight": "{fonts.fontWeight.demibold}", + "focusRing": { + "width": "{form.focusRing.width}", + "style": "{form.focusRing.style}", + "color": "{form.focusRing.color}", + "offset": "{form.focusRing.offset}", + "shadow": "{focusRing.shadow}" + }, + "sm": { + "fontSize": "{fonts.fontSize.200}", + "padding": "{form.padding.100} {form.padding.300}" + }, + "lg": { + "fontSize": "{fonts.fontSize.500}", + "padding": "{form.padding.400} {form.padding.600}" + }, + "transitionDuration": "{form.transitionDuration}" + }, + "content": { + "checkedShadow": "none", + "padding": "0rem", + "borderRadius": "0rem", + "sm": { + "padding": "0rem" + }, + "lg": { + "padding": "0rem" + } + } + }, + "toggleswitch": { + "colorScheme": { + "light": { + "root": { + "background": "{surface.400}", + "hoverBackground": "{surface.500}", + "disabledBackground": "{form.disabledBackground}", + "checkedBackground": "{surface.900}", + "checkedHoverBackground": "{surface.800}" + }, + "handle": { + "background": "{form.backgroundHandler}", + "hoverBackground": "{form.backgroundHandler}", + "disabledBackground": "{form.disabledColor}", + "checkedBackground": "{surface.0}", + "checkedHoverBackground": "{surface.0}", + "color": "{text.color}", + "hoverColor": "{text.color}", + "checkedColor": "{text.color}", + "checkedHoverColor": "{text.color}" + } + } + }, + "root": { + "width": "{form.size.600}", + "height": "{form.size.400}", + "borderRadius": "{form.borderRadius.300}", + "gap": "{form.gap.100}", + "borderWidth": "{form.borderWidth}", + "shadow": "none", + "focusRing": { + "width": "{form.focusRing.width}", + "style": "{form.focusRing.style}", + "color": "{form.focusRing.color}", + "offset": "{form.focusRing.offset}", + "shadow": "0" + }, + "borderColor": "{transparent}", + "hoverBorderColor": "{transparent}", + "checkedBorderColor": "{transparent}", + "checkedHoverBorderColor": "{transparent}", + "invalidBorderColor": "{form.invalidBorderColor}", + "transitionDuration": "{form.transitionDuration}", + "slideDuration": "{form.transitionDuration}" + }, + "handle": { + "borderRadius": "{form.borderRadius.300}", + "size": "{form.size.300}" + } + }, + "tooltip": { + "colorScheme": { + "light": { + "root": { + "background": "{surface.900}", + "color": "{text.extend.colorInverted}" + } + } + }, + "root": { + "maxWidth": "{overlay.width}", + "gutter": "{feedback.gap.100}", + "shadow": "{overlay.popover.shadow}", + "padding": "{feedback.padding.100} {feedback.padding.200} ", + "borderRadius": "{overlay.popover.borderRadius}" + } + }, + "tree": { + "root": { + "background": "{content.background}", + "color": "{content.color}", + "padding": "{data.padding.400}", + "gap": "{data.gap.100}", + "indent": "{data.padding.400}" + }, + "node": { + "padding": "{data.padding.200} {data.padding.300}", + "color": "{text.color}", + "selectedColor": "{text.extend.colorInverted}", + "gap": "{data.gap.100}" + }, + "nodeIcon": { + "selectedColor": "{text.extend.colorInverted}" + }, + "nodeToggleButton": { + "borderRadius": "{data.borderRadius}", + "size": "{data.icon.size.400}", + "selectedHoverBackground": "{surface.900}" + }, + "loadingIcon": { + "size": "{data.icon.size.100}" + }, + "filter": { + "margin": "0 0 {data.padding.200} 0" + } + }, + "overlaybadge": { + "root": { + "outline": { + "width": "0rem", + "color": "{transparent}" + } + } + } + } +} diff --git a/scripts/tokens/build_tokens.py b/scripts/tokens/build_tokens.py new file mode 100644 index 00000000..7357d640 --- /dev/null +++ b/scripts/tokens/build_tokens.py @@ -0,0 +1,23 @@ +import json, re, copy +orig=json.load(open("src/lib/providers/prime-preset/tokens/tokens.json")) +canon=json.load(open("docs/superpowers/specs/prebuild-tokens.json")) +def strip_color(o): + if isinstance(o,str): return re.sub(r"\{color\.([^}]+)\}", r"{\1}", o) + if isinstance(o,dict): return {k:strip_color(v) for k,v in o.items()} + if isinstance(o,list): return [strip_color(x) for x in o] + return o +def merge(a,b): + out=copy.deepcopy(a) + for k,v in b.items(): + out[k]=merge(out[k],v) if (k in out and isinstance(out[k],dict) and isinstance(v,dict)) else copy.deepcopy(v) + return out +prim=copy.deepcopy(orig["primitive"]); prim["size"]=copy.deepcopy(canon["primitive"]["size"]) +sem=copy.deepcopy(orig["semantic"]) # сохраняем старый colorScheme + бакеты = backward-compat для Aura/CSS +sem["dimension"]=strip_color(canon["semantic"]["dimension"]) +sem["typography"]=strip_color(canon["semantic"]["typography"]) +sem["shadow"]=strip_color(canon["semantic"]["shadow"]) +sem["colorScheme"]["light"]=merge(sem["colorScheme"]["light"], strip_color(canon["semantic"]["color"]["light"])) +sem["colorScheme"]["dark"]=merge(sem["colorScheme"]["dark"], strip_color(canon["semantic"]["color"]["dark"])) +out={"primitive":prim,"semantic":sem,"components":strip_color(canon["components"])} +json.dump(out, open("src/lib/providers/prime-preset/tokens/tokens.migrated.json","w"), ensure_ascii=False, indent=2) +print("ok") diff --git a/scripts/tokens/repoint_primitive.py b/scripts/tokens/repoint_primitive.py new file mode 100644 index 00000000..e1c60ad0 --- /dev/null +++ b/scripts/tokens/repoint_primitive.py @@ -0,0 +1,14 @@ +import json +m=json.load(open("docs/superpowers/specs/2026-06-17-primitive-remap.json")) +f="src/lib/providers/prime-preset/tokens/tokens.json" +t=json.load(open(f)) +def fix(o): + if isinstance(o,str): + for old,new in m.items(): o=o.replace("{"+old+"}","{"+new+"}") + return o + if isinstance(o,dict): return {k:fix(v) for k,v in o.items()} + if isinstance(o,list): return [fix(x) for x in o] + return o +t=fix(t) +for k in ("spacing","sizing","borderWidth","borderRadius"): t["primitive"].pop(k,None) +json.dump(t,open(f,"w"),ensure_ascii=False,indent=2); print("ok, primitive keys:", list(t["primitive"].keys())) diff --git a/scripts/tokens/validate.py b/scripts/tokens/validate.py new file mode 100644 index 00000000..31b973ef --- /dev/null +++ b/scripts/tokens/validate.py @@ -0,0 +1,69 @@ +import json, re, sys +# Эталон значений = pre-migration снимок (фикстура). Можно переопределить argv[2]. +# Использование: python3 validate.py [] +DEFAULT_BASE="scripts/tokens/baseline.json" +def get(t,p): + c=t + for x in p.split("."): + c=c.get(x) if isinstance(c,dict) else None + if c is None: return None + return c +def leaves(d,p=""): + for k,v in d.items(): + pp=p+"."+k if p else k + if isinstance(v,dict): yield from leaves(v,pp) + elif isinstance(v,str): yield pp,v +def mkres(t,mode): + P=t["primitive"];S=t["semantic"];CS=get(S,"colorScheme.%s"%mode) or {};CL=get(S,"color.%s"%mode) or {} + def r(val,d=0): + if not isinstance(val,str) or d>30: return val + def rp(m): + ref=m.group(1);root=ref.split(".")[0] + node=get(CL,ref[6:]) if root=="color" else (get(P,ref) or get(S,ref) or get(CS,ref) or get(t["components"],ref)) + if node is None or isinstance(node,dict): return m.group(0) + return r(node,d+1) + return re.sub(r"\{([^}]+)\}",rp,val) + return r +def main(cand, base_path): + base=json.load(open(base_path)); new=json.load(open(cand)) + if base_path==cand: + print("WARN: baseline == candidate — EQUIV-проверка вырождена (сравнение файла с собой)") + # equivalence + for mode in ("light","dark"): + rb=mkres(base,mode); rn=mkres(new,mode) + ob=dict(leaves(base["components"])); on=dict(leaves(new["components"])) + same=diff=0 + for path in set(ob)&set(on): + a=rb(ob[path]).strip().lower(); b=rn(on[path]).strip().lower() + if "{" in a or "{" in b: continue + if a==b: same+=1 + elif "0.000" in a and "0.000" in b: same+=1 + else: diff+=1 + print(f"EQUIV {mode}: same={same} diffs={diff}") + if diff>0: globals()['FAIL']=True + # dangling + R11 + PRIM=set(new["primitive"].keys()); SEM=set(new["semantic"].keys()) + CL=get(new["semantic"],"color.light") or {} + CS=get(new["semantic"],"colorScheme.light") or {} + def resolves(r): + root=r.split(".")[0] + if root=="color": return get(CL,r[6:]) is not None + # любой формат: primitive | semantic top-level | colorScheme.light | color.light | component + return (get(new["primitive"],r) is not None or get(new["semantic"],r) is not None + or get(CS,r) is not None or get(CL,r) is not None or get(new["components"],r) is not None) + refs=[] + def walk(d): + for v in d.values(): + if isinstance(v,dict): walk(v) + elif isinstance(v,str): refs.extend(re.findall(r"\{([^}]+)\}",v)) + walk(new["components"]) + dang=[r for r in refs if not resolves(r)] + prim_refs=[r for r in refs if r.split(".")[0] in PRIM] + print(f"DANGLING={len(dang)} {dang[:5]}") + print(f"R11_PRIMITIVE_REFS={len(prim_refs)} {sorted(set(prim_refs))[:5]}") + if dang: globals()['FAIL']=True +if __name__=="__main__": + cand=sys.argv[1] + base=sys.argv[2] if len(sys.argv)>2 else DEFAULT_BASE + FAIL=False; main(cand, base) + sys.exit(1 if FAIL else 0) diff --git a/src/lib/components/accordion/accordion.figma.md b/src/lib/components/accordion/accordion.figma.md new file mode 100644 index 00000000..fb091e40 --- /dev/null +++ b/src/lib/components/accordion/accordion.figma.md @@ -0,0 +1,132 @@ +--- +component: ExtraAccordion +selector: extra-accordion +import: + symbol: ExtraAccordionComponent + from: '@cdek-it/angular-ui-kit' +figma: + fileKey: 'Khh7arsuXss3ncqy1Dz3OZ' + nodeId: '1153:3084' + componentKey: '6d041d9db66babf7fe442165f3ab97f9bea7710a' + name: '' +status: stable +updated: '2026-06-22' +--- + +## Overview + +`ExtraAccordionComponent` — компонент аккордеона, который группирует связанный контент в вертикальный набор раскрываемых/сворачиваемых секций. Экономит место при большом объёме информации и поддерживает прогрессивное раскрытие. Оборачивает PrimeNG `p-accordion` с под-элементами `p-accordion-panel`, `p-accordion-header` и `p-accordion-content`. + +Компонент соответствует Figma-компоненту `` (nodeId `1153:3084`, fileKey `Khh7arsuXss3ncqy1Dz3OZ`, библиотека «UI Kit (DS) v2.0»). В отличие от диалога, содержимое задаётся декларативно через массив `items`, а не через слоты проекции контента — каждая секция описывается объектом `ExtraAccordionItem`. + +## Props mapping + +| Свойство | Тип | По умолчанию | Описание | +|----------|-----|--------------|---------| +| `items` | `ExtraAccordionItem[]` | `[]` | Массив секций аккордеона; каждый элемент рендерится как отдельная панель с заголовком и содержимым | +| `multiple` | `boolean` | `false` | Разрешить одновременное раскрытие нескольких панелей — соответствует Figma-режиму single/multiple | +| `activeValue` | `string \| null` | `'0'` | Значение (`value`) изначально раскрытой панели; `null` — все панели свёрнуты | + +> `activeValueChange` — `@Output() EventEmitter`. Используйте синтаксис `[(activeValue)]` для двусторонней привязки активной секции. + +Структура одного элемента `ExtraAccordionItem`: + +| Поле | Тип | Описание | +|------|-----|---------| +| `value` | `string` | Уникальный идентификатор панели (ключ раскрытия и `track` в цикле) | +| `header` | `string` | Текст заголовка панели | +| `content` | `string` | Текстовое содержимое раскрываемой панели | +| `icon` | `string` (опц.) | CSS-класс иконки в заголовке; доступные иконки — [icons.md](../../figma-code-connect/icons.md) | +| `disabled` | `boolean` (опц.) | Заблокировать панель — она недоступна для раскрытия | + +## Variants + +### Одиночное раскрытие (single, по умолчанию) + +Figma: ``, режим single — раскрыта ровно одна панель. + +```html + +``` + +```ts +import { ExtraAccordionComponent, ExtraAccordionItem } from '@cdek-it/angular-ui-kit'; + +// В компоненте: +items: ExtraAccordionItem[] = [ + { value: '0', header: 'Данные отправления', content: 'Заказ №ЦД-00123456' }, + { value: '1', header: 'Маршрут доставки', content: 'Москва → Новосибирск' }, +]; +``` + +### Множественное раскрытие (multiple) + +Figma: ``, режим multiple — одновременно могут быть раскрыты несколько панелей. + +```html + +``` + +```ts +import { ExtraAccordionComponent, ExtraAccordionItem } from '@cdek-it/angular-ui-kit'; +``` + +### С заблокированной панелью (disabled) + +Заблокированная панель задаётся через `disabled: true` в соответствующем `ExtraAccordionItem` и недоступна для раскрытия. + +```html + +``` + +```ts +import { ExtraAccordionComponent, ExtraAccordionItem } from '@cdek-it/angular-ui-kit'; + +// В компоненте: +items: ExtraAccordionItem[] = [ + { value: '0', header: 'Данные отправления', content: 'Заказ №ЦД-00123456' }, + { value: '1', header: 'Документы (недоступно)', content: 'Недоступно', disabled: true }, +]; +``` + +## Slots + +Не используются. Аккордеон не применяет проекцию содержимого — структура секций задаётся декларативно через массив `items`. + +Внутренняя композиция каждой секции (рендерится компонентом автоматически по элементу `ExtraAccordionItem`): + +| Часть | PrimeNG-узел | Источник | +|-------|--------------|----------| +| Панель | `p-accordion-panel` | один элемент массива `items` (`value`, `disabled`) | +| Заголовок | `p-accordion-header` | `item.header` + опциональная `item.icon` | +| Содержимое | `p-accordion-content` | `item.content` | + +## Related + +- [Button](../button/button.figma.md) — кнопки действий внутри или рядом с панелями +- [Иконки](../../figma-code-connect/icons.md) — CSS-классы иконок для заголовков панелей +- [Токены](../../figma-code-connect/tokens.md) — цветовые токены поверхности и границ панелей +- [Conventions](../../figma-code-connect/conventions.md) — соглашения маппинга Figma → Angular + +## Do / Don't + +**Do:** +- Задавайте уникальный `value` для каждого элемента `items` — он используется как ключ раскрытия и `track`. +- Используйте `[(activeValue)]` для двусторонней синхронизации раскрытой секции с состоянием компонента. +- Включайте `[multiple]="true"`, когда пользователю полезно сравнивать содержимое нескольких секций одновременно. +- Помечайте недоступные секции через `disabled: true` в `ExtraAccordionItem`, а не скрывайте их полностью. + +**Don't:** +- Не используйте аккордеон для критичной информации, которая должна быть всегда видна. +- Не путайте с Tabs — вкладки показывают параллельные равноправные разделы, а аккордеон раскрывает секции контента. +- Не задавайте `activeValue`, не существующий среди `value` элементов `items` — ни одна панель не раскроется. diff --git a/src/lib/components/autocomplete/autocomplete.figma.md b/src/lib/components/autocomplete/autocomplete.figma.md new file mode 100644 index 00000000..257cdc11 --- /dev/null +++ b/src/lib/components/autocomplete/autocomplete.figma.md @@ -0,0 +1,255 @@ +--- +component: ExtraAutoComplete +selector: extra-auto-complete +import: + symbol: ExtraAutoCompleteComponent + from: '@cdek-it/angular-ui-kit' +figma: + fileKey: 'Khh7arsuXss3ncqy1Dz3OZ' + nodeId: '9370:42021' + componentKey: 'bfe33336c5b6261f311895a42da1f3a8a92ae4d4' + name: '' +status: stable +updated: '2026-06-22' +--- + +## Overview + +`ExtraAutoCompleteComponent` — текстовое поле с выпадающим списком подсказок, фильтруемым по мере ввода (паттерн combobox). Подходит для свободного ввода с автодополнением, длинных списков, асинхронной подгрузки опций по вводу и множественного выбора тегами. Оборачивает PrimeNG `p-autocomplete` и расширяет его размерами и режимом `fluid`. Реализует `ControlValueAccessor` и работает с `[(ngModel)]` и `[formControl]` «из коробки». + +Компонент соответствует Figma-компоненту `` (component set, nodeId `9370:42021`, fileKey `Khh7arsuXss3ncqy1Dz3OZ`, библиотека «UI Kit (DS) v2.0»). Варианты задаются Figma-свойствами `type` (`dropdown | group | multi-select`) и `state` (`default | opened`). Выпадающая панель, пункты и группы вынесены в отдельные Figma-узлы ``, `` и ``. + +В отличие от `' +status: stable +updated: '2026-06-22' +--- + +## Overview + +`ExtraSelectComponent` — выпадающий список для выбора одного значения из набора опций. Оборачивает PrimeNG `p-select` и расширяет его размерами, фильтрацией, группировкой, режимом плавающей метки и кастомными шаблонами пунктов. Реализует `ControlValueAccessor` и работает с `[(ngModel)]` и `[formControl]` «из коробки». + +Компонент соответствует Figma-компоненту ``, state=default, has-placeholder=true, has-floatlabel=false — nodeId `361:1603` + +```html + +``` + +### С привязкой значения (optionValue) + +Figma: ``, show-clear=true + +```html + +``` + +### С группировкой опций (group) + +Figma: `` — заголовок группы в панели + +```html + +``` + +### С плавающей меткой (has-floatlabel) + +Figma: ``, state=default + +```html + +``` + +### Readonly (только для чтения) + +Figma: ``, state=disabled, has-placeholder=true, has-floatlabel=false — nodeId `361:1562` + +```html + +``` + +```ts +// Управляется через FormControl: +disabledControl = new FormControl({ value: null, disabled: true }); +``` + +### Невалидное состояние (formControl + валидация) + +Figma: `