Skip to content
Agentmart
Submit a tool

framework-ui-internals

Внутрішні правила client/ui-kit — чому тема перебиває daisyUI, як не зламати граф чанків, пастки Lit і TypeScript у базових класах, де проходить межа між…

Skill by IgorAIvanov

IndexedMIT★ 1
Write a review

Chalk Labs

Need help deploying framework-ui-internals?

Chalk Labs sets up agents like this inside real teams: connected to your tools, tested on your data, with a human in the loop where it matters.

Book a call

Install

Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.

npx agentmarket install skill/igoraivanov-framework-ui-internals

Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.

Get the weekly diff

The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.

We use your email only for this newsletter. Privacy

About

Внутрішні правила client/ui-kit — чому тема перебиває daisyUI, як не зламати граф чанків, пастки Lit і TypeScript у базових класах, де проходить межа між основою та нащадком. Застосовуй щоразу, коли правиш theme.css, базові класи (BaseUI, QueryTableBase, ModelListBase, ModelPickerBase) або компоненти ui-kit.

Use cases: design, frontend

No reviews yet. Installed it? Reviews come from verified installers only. How reviews work

Permissions

What this skill can do and what it asks for, from its SKILL.md. Checked Oct 25, 2026.

Tools
No tools found
Secrets
None asked for
Install scripts
None found

Network hosts it talks to 1

  • codeload.github.com · found in install command

Files it touches

  • ~/.claude/skills/framework-ui-internals

What's inside

Skill name
framework-ui-internals
Description
Внутрішні правила client/ui-kit — чому тема перебиває daisyUI, як не зламати граф чанків, пастки Lit і TypeScript у базових класах, де проходить межа між основою та нащадком. Застосовуй щоразу, коли правиш theme.css, базові класи (BaseUI, QueryTableBase, ModelListBase, ModelPickerBase) або компоненти ui-kit.
License
MIT
Metadata
audience: framework
Instructions
226 lines in SKILL.md · view on GitHub

Files (1)

  • SKILL.md

SKILL.md (first lines)

# Внутрішнє життя client/ui-kit

Скіл про **цей репозиторій**, а не про застосунок на фреймворку. У пакет
`@altera/skills` не їде. Прикладні правила оформлення екранів — окремо, у
[screen-design-rules](../screen-design-rules/SKILL.md).

Тут зібране те, що вже одного разу коштувало пошуків.

## 1. Тема безшарова — вона перебиває все

`client/styles/theme.css` написана **поза `@layer`** і підключається після
Tailwind і daisyUI. Безшарове правило перебиває будь-який шар незалежно від
специфічності. Звідси три наслідки, і кожен уже спрацьовував:

**Пиши `background-color`, а не `background`.** Скорочення мовчки обнуляє
`background-image`, а ним daisyUI малює частину компонента — так зникла стрілка
в `.select`, і поле вибору стало не відрізнити від інпута.

**Структурні змінні daisyUI треба оголошувати.** Компоненти (`checkbox`, `radio`,
`toggle`) читають `--border`, `--size-selector` тощо **без фолбеків**:
невизначена змінна анулює всю декларацію рамки, і разом з `appearance: none`
контрол стає невидимим. Так зникали чекбокси.

**Стани не приходять самі.** `.btn` і `.input` у темі задають `background` і
`color` беззастережно — отже штатне оформлення `:disabled` з daisyUI до контрола
не доходить взагалі. Кожен стан, який має бути видно, тема мусить описати сама.
Це виявилося аж на скарзі «вимкнена кнопка не відрізняється від звичайної».

**Варіант, названий у розмітці, теж не приходить.** `btn-ghost` (шар компонентів)
і `text-error` (шар utilities) стояли на кнопці видалення рядка табличної частини
з самого початку — і не діяли: `.btn` теми задає `background`, `border` і `color`
беззастережно. Кнопка виглядала звичайною сірою, хоча код казав «без рамки,
червона». Лікується як `btn-square`: правилом у темі із селектором з двох класів
(`.btn.btn-ghost`), щоб виграти в самої `.btn`. Тобто **клас у розмітці — це
намір, а не результат**: якщо тема чіпає ту саму властивість, варіант треба
описати в темі.

Друга половина того ж випадку варта окремої уваги: `text-error` так і лишився
невиконаним — **навмисно**. Щойно його ввімкнули, у табличній частині вишикувалося
двадцять червоних значків підряд, і червоне перестало означати «обережно».
Мертвий клас у чужій розмітці — привід перевірити, чи його справді хотіли, а не
привід механічно оживити.

Правило: **усе, що має перебити тему, пиши в тому ж файлі нижче за неї**, а не
класами в розмітці.

І зворотний бік тієї ж сили — нею ж і користуються. Розмір іконок був
розсипаний атрибутами `width`/`height` по двох десятках файлів (12, 13, 14 —
хто як вирішив), тож «зробити іконки більшими» не виходило: правка одного місця
нічого не міняла. Лікується одним правилом теми — `.btn > svg`, `.input > svg`
з токеном `--icon-size`: **звичайна CSS-декларація сильніша за презентаційний
атрибут завжди**, незалежно від специфічності. Атрибут лишається значенням для
гліфа поза контролом (значок стану в колонці списку, іконка діалогу).
Коли те саме число мусить жити у двох місцях, назви його в обох: `--icon-size`
у темі й `ICON` в `icons.ts`.

## 2. Контраст рахують, а не дивляться

Приглушені тони, підібрані на око на хорошому моніторі, систематично не
дотягували: `text-base-content/50` — 2.82:1, `/40` — 2.22:1, рамка поля
`#b8c3cc` — 1.79:1 при потрібних 3:1.

Перед тим як міняти колір теми, порахуй пари «текст на фоні». Це десяток рядків
у `deno eval` (відносна яскравість + `(L1+0.05)/(L2+0.05)`), і воно ловить те,
чого око не бачить.

Пороги: **4.5:1** звичайний текст, **3:1** великий текст, межі контролів і
графіка (WCAG 1.4.11). Вимкнений контрол формально виведений з-під вимоги — але
підпис кнопки й ЗНАЧЕННЯ поля це різні речі: значення в режимі перегляду читають,
тож там усе одно 4.5.

Перевіряй на **всіх** фонах, де текст трапляється: білому, зебрі (`#fbfcfd`) і
рядку під курсором (`#dcebf8`) — останній найтемніший, і саме на ньому падає те,
що пройшло на білому.

## 3. Граф чанків: `import type` стирається, значення — ні

Найдорожча помилка цього розділу коштувала 36 kB на кожному відкритті діалога
підбору: `ModelPickerBase` імпортував `listRootSchema`, `alignClass`, `cellStyle`
**з `model-list-base.ts`** — значеннями. Через це чанк пікера тягнув чанк списку
разом із побічно підключеним `<ui-group-tree>` і статичним `xlsx`.

Правила:

- **спільним модулем робиться те, що НЕ тягне поведінки** — типи й чисті
  функції (`table-contract.ts`), не класи й не компоненти;
- **побічний імпорт (`import "./ui-component.ts"`) не вибивається tree-shaking
  ніколи** — він реєструє custom element, тобто має ефект;
- основа табличних форм **не має права знати про компоненти ui-kit**. Саме тому
  фільтри не мають декларативних видів: умій `QueryTableBase` малювати `period`,
  вона б статично імпортувала `<ui-period>`, і за нього платив би кожен список і
  кожен пікер. Розмітку дає екран.

Перевіряти — збіркою, а не міркуванням:

```bash
deno task build:front
grep -o 'from"[^"]*"' dist/assets/model-picker-base-*.js | sort -u
```

## 4. Пастки Lit і TypeScript у базових класах

**Ім'я protected-методу може зіткнутися з властивістю DOM.** `protected
ariaSort(col)` не компілюється взагалі: `ariaSort` — властивість `ARIAMixin` на
`HTMLElement`, і TS каже «defines instance member property, but extended class
defines it as instance member function». Лікується приватним `#ariaSort`. Те саме
чекає на будь-яке ім'я з `aria*`, `title`, `hidden`, `translate`.

**Поле не можна перекрити гетером і навпаки.** Якщо основа оголошує
`protected selectable = false` (полем — щоб екран міг написати `override
selectable = true`), нащадок не може зробити з нього гетер. Коли значення
залежить від властивості, що приходить пізніше (`multiple` у пікера) —
присвоюй у `willUpdate()`.

**Вміст `<svg>` будується тегом `svg`, а не `html`.** Тег `html` створює елементи
в HTML-просторі імен, тож інтерпольований усередину `<svg>` шаблон `html` дає
`<path>`, якого браузер не знає:

```ts

From IgorAIvanov/altera03, MIT.

More from IgorAIvanov/altera03

Signals

Stars
1
Forks
0
Open issues
0
Last commit (this folder)
Sep 17, 2026 (1 month ago)

From GitHub (fetched Oct 24, 2026).

Details

License
MIT
First seen
Oct 24, 2026
Last checked
Oct 24, 2026

More from IgorAIvanov

Done for you

Rather not set it up yourself?

Chalk Labs scopes, builds and runs agents for your team: the task audit, the eval harness, the integrations and the weekly ops report. Fixed scope, priced before we start.

See how we build AI agents →Read the case studies

Chalk Labs is a two-founder AI and growth studio. We build AI agents, CRMs and MVPs for Web3 and AI companies, and have shipped 50+ product and token launches.

launches shipped
50+
launches shipped
media placements
500+
media placements
founders on every account
2
founders on every account

Press we've placed: Forbes · CoinDesk · Decrypt · Cointelegraph · The Block

Rahil Jain, Co-founder, Chalk Labs. Ex-Goldman Sachs engineer. You talk to the person who builds it.

Get framework-ui-internals running in your business

Tell us what you want to automate. A founder replies within one working day with a plan, not a pitch deck.

Goes to the Chalk Labs founders, not the newsletter. Privacy

Need help deploying framework-ui-internals?

CallGet help
Cite this page

framework-ui-internals skill. Agent Mart. https://agentmart.dev/skills/igoraivanov-framework-ui-internals (last updated 2026-10-24)