Parsewise UI library

01FOR DEVELOPERS · UI LIBRARY

The component library

A skill interface is assembled from ready-made blocks. Cards, switches, galleries and forms — right inside the chat. Every block is a data attribute: mark it up in drawer.html and the widget assembles the component itself.

01

Components
cards, selection, input, media

02

Events
on the drawer host

03

Lines of CSS
only Tailwind and data attributes

04

Observer
MutationObserver catches dynamic markup

02CATALOGUE · COMPONENTS

Components out of the box

Mark it up and the widget assembles it. Components are declared with data attributes and processed through a MutationObserver: they work in static markup and when created from JS. User events arrive on the drawer host.

COMPONENT

Cards

Vertical with a photo on top, or horizontal in the app-store style: a heading, text and a round or rounded icon.

data-card · data-card-horizontal
EVENT · radio-change

Radio switch

A pill with an animated marker across N options. Disabled with the radio-switch--disabled class.

data-radio-switch
EVENT · grid-select

Selection grid

Clickable cells in two or three columns: a label, a value and a caption. One active at a time.

data-select-grid
EVENT · select-list-change

Selection list

Rows with a heading and a description — for mutually exclusive options in a single column.

data-select-list
EVENT · suggest-select

Autosuggest

A field with dropdown suggestions through the backend suggest proxy. The list sits in the flow and pushes the content down.

data-suggest-input
COMPONENT

Input and table

Ready-made input classes and a Tailwind results grid — the gap creates the visual separators.

input-wrapper · input-field
EVENT · emoji-rate-change

Emoji rating

Three animated faces — poor, fine, great. For quick feedback and reviews.

data-emoji-rate
EVENT · action

Action buttons

A link with an automatic brand icon (Telegram, WhatsApp, a call) or a callback with an icon from the Heroicons set.

data-action
COMPONENT

Gallery

A grid of previews with a Fancybox lightbox. Links are direct or through the bundle assets {{asset:…}}.

data-gallery
COMPONENT

Detail list

A summary card: “label → value” rows with separators. For confirming a request before it is sent.

data-detail-list
EVENT · file-upload-complete

File upload

A dropzone for photos and video that uploads to object storage over a presigned URL.

data-file-upload
03LIBRARY · IN NUMBERS

Aligned across the system

The styles are isolated in the Shadow DOM. You write only Tailwind, the brand colour arrives through the skill-primary utilities, and the heights of fields and switches are already tuned to match each other.

01

skill-primary utilities
text, bg, ring, border, fill

02

Control height
input and selection are aligned

03

Asset limit
PNG, JPG, WebP, SVG, GIF

04

Files in a bundle
uploaded to storage automatically

Control height · px
Components · by group
05SANDBOX · RULES

Skills live in a sandbox

Isolation
Styles in the Shadow DOM
Tailwind only
No CSS of your own
Drawer arguments
DOM, data, parameters
API helpers
Languages, submissions, e-mail
Unsafe JS
Rejected by the validator
Outbound calls
Through the widget proxy
06SKILL CREATOR AND MODEL

Two routes to a skill

The visual creator is the no-code route. And the components plus the .skill format are a ready specification for a model: hand it to an LLM and it assembles an interactive skill for the task.

/01

Assemble the drawer from components in a visual builder — by dragging, without a single line of code.

/02

The body of the manifest is a prompt for the model: “ALWAYS open the skill when the customer asks about X. Do not answer with text”.

/03

The phrases from the manifest become embeddings — the router finds the skill by the meaning of the request and adds it to the prompt.

/04

The LLM emits an ACTION with the skill name and parameters — the widget loads the bundle and renders the cards and the drawer.

07FAQ · FOR DEVELOPERS

Developer questions

With a data attribute in drawer.html: <div data-radio-switch data-options="…">. The widget processes it through a MutationObserver — it works both in static markup and when created from JS.

REQUEST

Tell us your task

PORTFOLIO BY TYPEBY YEAR

Projects by type grow year over year

MVPRedesignAISupportTotal

MVP, redesign, AI and support — cumulative

STRENGTHSPROFILE

The studio profile across key axes

Speed, quality, transparency, engineering

PROJECT PHASESOVER TIME

Research, design and build overlap

Parallel streams — not a waterfall