document-tabular-section
Build an editable tabular section (табличну частину) of a document — controls that fill the table cell flush with the grid, decimal columns with live totals —…
Skill by IgorAIvanov
Chalk Labs
Need help deploying document-tabular-section?
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.
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-document-tabular-section
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.
About
Use cases: documents, frontend, marketing
Reviews
Write a reviewNo 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/document-tabular-section
What's inside
- Skill name
document-tabular-section- Description
- Build an editable tabular section (табличну частину) of a document — controls that fill the table cell flush with the grid, decimal columns with live totals — using the shared .table-tabular / .cell-control contract instead of ad-hoc Tailwind utilities.
- License
- MIT
- Metadata
- audience: app
- Instructions
- 388 lines in SKILL.md · view on GitHub
Files (1)
- SKILL.md
SKILL.md (first lines)
# Document Tabular Section Skill
Use this skill when:
- creating or refactoring the табличну частину of a `document` model
- a control inside a table cell still shows its own frame, rounded corners or gaps instead of merging with the grid
- rows look taller than the controls inside them
- adding decimal columns (quantity, price, amount) with live line/document totals
- a focus ring inside a cell does not line up with the cell borders
The CSS contract lives in the framework theme (`@client/styles/theme.css`, section
«Табличні частини документів») and ships with `@altera/client` — the application
never redefines those classes, it only uses them.
## Default path: the TabularSection primitive
Do NOT hand-write the table markup and row mechanics — use the primitive
(`@client/ui-kit/tabular/`). The form declares a typed section (columns, where
rows live, how a new row looks) and places two INDEPENDENT view components —
either can be replaced with custom markup, all actions are public on the section:
```ts
private lines = new TabularSection<InvoiceLine>(this, {
rows: () => this.$root.item.lines,
setRows: (lines) => { this.$root.item = { ...this.$root.item, lines }; },
createLine: () => ({ id: null, lineNo: 0, bankId: "", bank: null, qty: "0.000", price: "0.00" }),
columns: [
{ kind: "picker", key: "bankId", refKey: "bank", title: "invoice.bank", url: "catalog/bank" },
{ kind: "decimal", key: "qty", title: "invoice.qty", precision: 3, width: "7rem" },
{ kind: "decimal", key: "price", title: "invoice.price", precision: 2, width: "7rem" },
{ kind: "computed", title: "invoice.amount", width: "7rem", total: true,
value: (l) => dec(l.qty).mul(dec(l.price)).toFixed(2) },
],
});
// render():
// <ui-tabular-toolbar .section=${this.lines}></ui-tabular-toolbar>
// <ui-tabular-table .section=${this.lines}></ui-tabular-table>
```
What the primitive provides: add / copy (id is stripped — the save merge would
otherwise overwrite the original) / delete / move up-down with automatic
`lineNo` renumbering, current-row highlight, live totals in `<tfoot>`
(`total: true`), empty state, canonical decimal values on the way in and
`section.normalizedRows()` for the way out (see below), and keyboard
entry: Enter walks editable cells and appends a row at the end, ↑/↓ move
between rows, Insert adds, Ctrl+Delete removes. At the very last editable cell
Enter is two-step: if that Enter committed a typed value (the control fired
`value-changed` while handling it) it only finishes the edit; the next Enter
appends the row and puts the focus into its first cell. A `custom` cell gets the
same behaviour only if its control reports commits through `value-changed`.
Esc in a just-added row nobody has typed into removes that row and returns to
the last cell of the previous one (`section.discardNewLine()`); a row with any
value in it is never removed by Esc. A control that needs Esc itself (an open
list or calendar, reverting typed text) stops it, so one Esc does one thing. Column kinds: `text`,
`decimal`, `picker`, `date`, `checkbox`, `computed`, and the escape hatch
`custom` (`render(line, index)` returns the `<td>` CONTENT — never the `<td>`
itself). Conditional columns: `visible: () => boolean` (see currency columns
in `manualEntryEdit.ts`). Two-level headers: ADJACENT columns sharing the same
`group: "key"` get one spanning header cell above their own titles («Дебет»
over «Рахунок» + «Субконто»); columns without `group` span both rows.
Multi-row records (1С style): a column with `row: 2` renders as a SECOND `<tr>`
of the same record, laid left-to-right under the row-1 grid; `span: N` says how
many grid columns its cell covers (default 1, remainder is padded). The `#` and
delete cells rowspan the whole record; a sub-row header line appears only if a
`row: 2` column has a `title`; `total` on sub-row columns is ignored. The typical use
is subconto printed under its account in a manual journal entry. Dynamic per-line
controls (subconto pickers whose model depends on the line's account) stay in
`custom` cells.
The CSS knowledge below still applies to `custom` cells and to fully
hand-written tables (which remain legal — the primitive is a default, not a
requirement).
## Something of your own in the toolbar: `toolbarExtra`
A barcode scan field or a «Fill» button belongs in the section's toolbar, next to
«Add» — not above the tabs. Declare it on the section, not on the tab:
```ts
private readonly scanStatus = signal(""); // state of the extra lives in a signal
private goods = new TabularSection<Line>(this, {
…,
toolbarExtra: () => scanField({
disabled: this.goods.readonly,
status: this.scanStatus.get(),
onScan: (code) => this.scan(code),
}),
});
```
The toolbar draws it to the right of its buttons, wherever the section is shown —
inside `<ui-form-tabs>` as well, so the tab keeps its row count and error mark.
Three things the toolbar does NOT do for you:
- **disable it on a read-only form** — read `section.readonly` in your template;
- **redraw on the form's `@state`** — the toolbar redraws on section changes and on
signals it reads, and the form's re-render hands it the same section object; a
scan that finds nothing changes no row, so its message must sit in a signal;
- **swallow `Enter`** — a native input there is a form field for «Enter moves on»;
handle `Enter` on `keydown` and call `preventDefault()`.
## Rows are REPLACED, never edited in place
The table caches what it has already drawn and redraws only the records that
changed — that is what keeps a thousand-line inventory sheet typable (a
keystroke costs 23 ms instead of 78 ms; measured). It tells a changed record
from the rest by **object identity**, and every action of the section already
gives it one: `patch`, `addLine`, `copyLine`, `removeLine` and `move` all put a
NEW object in the row's place.
So one thing is now forbidden that merely "worked" before:
```ts
this.$root.item.lines[0].qty = "5"; // ✗ таблиця цього не побачить
this.lines.patch(0, { qty: "5" }); // ✓
```
Reactivity itself is untouched — the component still redraws on every change of
`$root`; what it no longer does is re-evaluate rows nobody touched.From IgorAIvanov/altera03, MIT.
More from IgorAIvanov/altera03
- 0.584score
typebox-model-schema
IgorAIvanov
Define the complete model schema using TypeBox as the single source of truth for backend validation, SQL contract documentation, and frontend form/list/picker…
SkillAFreshness: A★ 1Claude Code +9 - 0.584score
model-feature-architecture
IgorAIvanov
Design or refactor a model into a feature-centered structure where frontend UI files and database SQL source live together under app/<family>/<model>.
SkillAFreshness: A★ 1Claude Code +9 - 0.584score
model-form-root
IgorAIvanov
Build a model edit form (and understand the shared $root data contract behind every list, picker and form) by extending BaseUI, seeding state from the TypeBox…
SkillAFreshness: A★ 1Claude Code +9 - 0.575score
db-function-contract
IgorAIvanov
Define PostgreSQL function contracts for models that use List, Get, Save, Delete, and Lookup with JSONB payloads and JSONB results.
SkillAFreshness: A★ 1Claude Code +9 - 0.547score
lit
IgorAIvanov
Rules and patterns for writing Lit Web Components correctly in this project.
SkillBFreshness: B★ 1Claude Code +9 - 0.547score
model-command-access
IgorAIvanov
Declare the permission a model command requires in manifest.json (commands.access) so the runtime can enforce it.
SkillBFreshness: B★ 1Claude Code +9 - 0.547score
model-command-response
IgorAIvanov
Derive the exact shape of a model command's response before consuming it in a screen — never hand-write the interface from memory.
SkillBFreshness: B★ 1Claude Code +9 - 0.547score
daisyui
IgorAIvanov
Official daisyUI component library skill.
SkillBFreshness: B★ 1Claude Code +9 - 0.547score
screen-design-rules
IgorAIvanov
Visual and usability rules for drawing any application screen — density, colour tokens, disabled and read-only states, field widths, status marks, keyboard…
SkillBFreshness: B★ 1Claude Code +9 - 0.547score
altera-new-app
IgorAIvanov
Deploy a new application on the Altera framework into an empty directory — from scaffold to a working login screen — and verify that it actually runs.
SkillBFreshness: B★ 1Claude Code +9 - 0.547score
framework-ui-internals
IgorAIvanov
Внутрішні правила client/ui-kit — чому тема перебиває daisyUI, як не зламати граф чанків, пастки Lit і TypeScript у базових класах, де проходить межа між…
SkillBFreshness: B★ 1Claude Code +9 - 0.547score
app-run-and-deploy
IgorAIvanov
Run the application in development or production, fill in .env, publish the schema to a local or remote database, put several instances on one machine, and…
SkillBFreshness: B★ 1Claude Code +9
Signals
- Stars
- 1
- Forks
- 0
- Open issues
- 0
- Last commit (this folder)
- Sep 18, 2026 (1 month ago)
From GitHub (fetched Oct 24, 2026).
Details
- License
- MIT
- Repository
- github.com/IgorAIvanov/altera03
- First seen
- Oct 24, 2026
- Last checked
- Oct 24, 2026
- Source
- GitHubgithub-graphql
More from IgorAIvanov
- 0.584score
model-feature-architecture
IgorAIvanov
Design or refactor a model into a feature-centered structure where frontend UI files and database SQL source live together under app/<family>/<model>.
SkillAFreshness: A★ 1Claude Code +9 - 0.584score
typebox-model-schema
IgorAIvanov
Define the complete model schema using TypeBox as the single source of truth for backend validation, SQL contract documentation, and frontend form/list/picker…
SkillAFreshness: A★ 1Claude Code +9 - 0.584score
model-form-root
IgorAIvanov
Build a model edit form (and understand the shared $root data contract behind every list, picker and form) by extending BaseUI, seeding state from the TypeBox…
SkillAFreshness: A★ 1Claude Code +9 - 0.575score
db-function-contract
IgorAIvanov
Define PostgreSQL function contracts for models that use List, Get, Save, Delete, and Lookup with JSONB payloads and JSONB results.
SkillAFreshness: A★ 1Claude Code +9 - 0.547score
framework-ui-internals
IgorAIvanov
Внутрішні правила client/ui-kit — чому тема перебиває daisyUI, як не зламати граф чанків, пастки Lit і TypeScript у базових класах, де проходить межа між…
SkillBFreshness: B★ 1Claude Code +9 - 0.547score
altera-new-app
IgorAIvanov
Deploy a new application on the Altera framework into an empty directory — from scaffold to a working login screen — and verify that it actually runs.
SkillBFreshness: B★ 1Claude Code +9
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 document-tabular-section 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.
Cite this page
document-tabular-section skill. Agent Mart. https://agentmart.dev/skills/igoraivanov-document-tabular-section (last updated 2026-10-24)