@salilvnair/dui 1.0.11 → 1.0.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +730 -96
- package/dist/index.js +3726 -3713
- package/dist/index.js.map +1 -1
- package/dist/lib/components/input/select-position.d.ts +54 -0
- package/dist/monaco-setup.core.d.ts +4 -0
- package/dist/monaco-setup.d.ts +1 -4
- package/dist/monaco-setup.js +19 -19
- package/dist/monaco-setup.js.map +1 -1
- package/dist/style.css +1 -1
- package/package.json +20 -3
- package/dist/assets/DuiShowcase-BOtwgwbq.css +0 -1
- package/dist/assets/DuiShowcase-Bl4Oi2Vw.js +0 -74723
- package/dist/assets/abap-DLDM7-KI.js +0 -1
- package/dist/assets/apex-DNDY2TF8.js +0 -1
- package/dist/assets/azcli-Y6nb8tq_.js +0 -1
- package/dist/assets/bat-BwHxbl9M.js +0 -1
- package/dist/assets/bicep-CFznDFnq.js +0 -2
- package/dist/assets/cameligo-Bf6VGUru.js +0 -1
- package/dist/assets/clojure-Dnu-v4kV.js +0 -1
- package/dist/assets/codicon-ngg6Pgfi.ttf +0 -0
- package/dist/assets/coffee-Bd8akH9Z.js +0 -1
- package/dist/assets/cpp-BbWJElDN.js +0 -1
- package/dist/assets/csharp-Co3qMtFm.js +0 -1
- package/dist/assets/csp-D-4FJmMZ.js +0 -1
- package/dist/assets/css-DdJfP1eB.js +0 -3
- package/dist/assets/css.worker-B4z49cGk.js +0 -93
- package/dist/assets/cssMode-CZYOZ1AO.js +0 -1
- package/dist/assets/cypher-cTPe9QuQ.js +0 -1
- package/dist/assets/dart-BOtBlQCF.js +0 -1
- package/dist/assets/dockerfile-BG73LgW2.js +0 -1
- package/dist/assets/ecl-BEgZUVRK.js +0 -1
- package/dist/assets/elixir-BkW5O-1t.js +0 -1
- package/dist/assets/flow9-BeJ5waoc.js +0 -1
- package/dist/assets/freemarker2-CGSa1nHJ.js +0 -3
- package/dist/assets/fsharp-PahG7c26.js +0 -1
- package/dist/assets/go-acbASCJo.js +0 -1
- package/dist/assets/graphql-BxJiqAUM.js +0 -1
- package/dist/assets/handlebars-mB8dxbcs.js +0 -1
- package/dist/assets/hcl-DtV1sZF8.js +0 -1
- package/dist/assets/html-l7YRKuHI.js +0 -1
- package/dist/assets/html.worker-DtiGdgqp.js +0 -470
- package/dist/assets/htmlMode-CuoiFE2t.js +0 -1
- package/dist/assets/index-Dylj6yGs.css +0 -10
- package/dist/assets/index-ROymQLGX.js +0 -50
- package/dist/assets/ini-Kd9XrMLS.js +0 -1
- package/dist/assets/java-CXBNlu9o.js +0 -1
- package/dist/assets/javascript-9UYwmKgx.js +0 -1
- package/dist/assets/json.worker-leyajbqV.js +0 -58
- package/dist/assets/jsonMode-6uegdfHj.js +0 -7
- package/dist/assets/julia-cl7-CwDS.js +0 -1
- package/dist/assets/kotlin-s7OhZKlX.js +0 -1
- package/dist/assets/less-9HpZscsL.js +0 -2
- package/dist/assets/lexon-OrD6JF1K.js +0 -1
- package/dist/assets/liquid-C8P3CEDc.js +0 -1
- package/dist/assets/lspLanguageFeatures-Ju8ugRgx.js +0 -4
- package/dist/assets/lua-Cyyb5UIc.js +0 -1
- package/dist/assets/m3-B8OfTtLu.js +0 -1
- package/dist/assets/markdown-BFxVWTOG.js +0 -1
- package/dist/assets/mdx-D4_p5PzA.js +0 -1
- package/dist/assets/mips-CiqrrVzr.js +0 -1
- package/dist/assets/monaco-editor-CN2OOCze.js +0 -908
- package/dist/assets/monaco-editor-qiF_U8vl.css +0 -1
- package/dist/assets/msdax-DmeGPVcC.js +0 -1
- package/dist/assets/mysql-C_tMU-Nz.js +0 -1
- package/dist/assets/objective-c-BDtDVThU.js +0 -1
- package/dist/assets/pascal-vHIfCaH5.js +0 -1
- package/dist/assets/pascaligo-DtZ0uQbO.js +0 -1
- package/dist/assets/perl-Ub6l9XKa.js +0 -1
- package/dist/assets/pgsql-BlNEE0v7.js +0 -1
- package/dist/assets/php-BBUBE1dy.js +0 -1
- package/dist/assets/pla-DSh2-awV.js +0 -1
- package/dist/assets/postiats-CocnycG-.js +0 -1
- package/dist/assets/powerquery-tScXyioY.js +0 -1
- package/dist/assets/powershell-COWaemsV.js +0 -1
- package/dist/assets/protobuf-Brw8urJB.js +0 -2
- package/dist/assets/pug-8SOpv6rk.js +0 -1
- package/dist/assets/python-BDvE0baC.js +0 -1
- package/dist/assets/qsharp-Bw9ernYp.js +0 -1
- package/dist/assets/r-j7ic8hl3.js +0 -1
- package/dist/assets/razor-3AZt1jFw.js +0 -1
- package/dist/assets/redis-Bu5POkcn.js +0 -1
- package/dist/assets/redshift-Bs9aos_-.js +0 -1
- package/dist/assets/restructuredtext-CqXO7rUv.js +0 -1
- package/dist/assets/ruby-zBfavPgS.js +0 -1
- package/dist/assets/rust-BzKRNQWT.js +0 -1
- package/dist/assets/sb-BBc9UKZt.js +0 -1
- package/dist/assets/scala-D9hQfWCl.js +0 -1
- package/dist/assets/scheme-BPhDTwHR.js +0 -1
- package/dist/assets/scss-CBJaRo0y.js +0 -3
- package/dist/assets/shell-DiJ1NA_G.js +0 -1
- package/dist/assets/solidity-Db0IVjzk.js +0 -1
- package/dist/assets/sophia-CnS9iZB_.js +0 -1
- package/dist/assets/sparql-CJmd_6j2.js +0 -1
- package/dist/assets/sql-ClhHkBeG.js +0 -1
- package/dist/assets/st-CHwy0fLd.js +0 -1
- package/dist/assets/swift-Bqt4WxQ4.js +0 -3
- package/dist/assets/systemverilog-Bs9z6M-B.js +0 -1
- package/dist/assets/tcl-Dm6ycUr_.js +0 -1
- package/dist/assets/ts.worker-59MjiAqk.js +0 -67731
- package/dist/assets/tsMode-2fAJOXuF.js +0 -11
- package/dist/assets/twig-Csy3S7wG.js +0 -1
- package/dist/assets/typescript-Bv1W4NlY.js +0 -1
- package/dist/assets/typespec-Btyra-wh.js +0 -1
- package/dist/assets/vb-Db0cS2oM.js +0 -1
- package/dist/assets/wgsl-BTesnYfV.js +0 -298
- package/dist/assets/xml-CR03X85Q.js +0 -1
- package/dist/assets/yaml-Qi3RsNvX.js +0 -1
- package/dist/index.html +0 -15
package/README.md
CHANGED
|
@@ -1,48 +1,74 @@
|
|
|
1
|
+
<div align="center">
|
|
2
|
+
|
|
1
3
|
# @salilvnair/dui
|
|
2
4
|
|
|
3
|
-
**Daakia UI** — a React 19 + TypeScript component library
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
optional — install it only if you use it.
|
|
5
|
+
**Daakia UI** — a React 19 + TypeScript component library of **281 components**,
|
|
6
|
+
every colour a CSS variable, and a Monaco-backed editor you only pay for if you
|
|
7
|
+
use it.
|
|
7
8
|
|
|
8
9
|
[](https://www.npmjs.com/package/@salilvnair/dui)
|
|
10
|
+
[](https://www.npmjs.com/package/@salilvnair/dui)
|
|
9
11
|
[](https://github.com/salilvnair/dui/blob/main/LICENSE)
|
|
12
|
+
[](#typescript)
|
|
13
|
+
|
|
14
|
+
**[Live demo](https://salilvnair.com/framework/dui/)** ·
|
|
15
|
+
[Component catalog](#component-catalog) ·
|
|
16
|
+
[Theming](#theming) ·
|
|
17
|
+
[Changelog](./CHANGELOG.md)
|
|
18
|
+
|
|
19
|
+
</div>
|
|
20
|
+
|
|
21
|
+

|
|
10
22
|
|
|
11
|
-
|
|
23
|
+
<sub>Ninety seconds of it. The full walkthrough is
|
|
24
|
+
[here as an mp4](https://raw.githubusercontent.com/salilvnair/dui/main/media/dui-showcase.mp4),
|
|
25
|
+
and the thing itself is [live](https://salilvnair.com/framework/dui/) — every
|
|
26
|
+
component has a playground, examples you can copy, and a props table.</sub>
|
|
12
27
|
|
|
13
28
|
---
|
|
14
29
|
|
|
15
30
|
## Table of contents
|
|
16
31
|
|
|
17
|
-
- [
|
|
32
|
+
- [Why this exists](#why-this-exists)
|
|
18
33
|
- [Install](#install)
|
|
19
34
|
- [Quick start](#quick-start)
|
|
35
|
+
- [What you get](#what-you-get)
|
|
36
|
+
- [A playground on every component](#a-playground-on-every-component)
|
|
37
|
+
- [Every colour is a variable](#every-colour-is-a-variable)
|
|
38
|
+
- [Light and dark, both first-class](#light-and-dark-both-first-class)
|
|
39
|
+
- [Every prop documented, in the app](#every-prop-documented-in-the-app)
|
|
20
40
|
- [Component catalog](#component-catalog)
|
|
21
41
|
- [Theming](#theming)
|
|
22
42
|
- [The code editor — Monaco is optional](#the-code-editor--monaco-is-optional)
|
|
23
43
|
- [Extending MarkdownView's language support](#extending-markdownviews-language-support)
|
|
24
44
|
- [TypeScript](#typescript)
|
|
25
45
|
- [Local development](#local-development)
|
|
46
|
+
- [Screenshots, video and the demo site](#screenshots-video-and-the-demo-site)
|
|
26
47
|
- [Publishing to npm](#publishing-to-npm)
|
|
27
48
|
- [License](#license)
|
|
28
49
|
|
|
29
50
|
---
|
|
30
51
|
|
|
31
|
-
##
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
the
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
52
|
+
## Why this exists
|
|
53
|
+
|
|
54
|
+
DUI was extracted from [daakia](https://github.com/salilvnair/daakia) and ck8t
|
|
55
|
+
so the two could stop maintaining the same forty components twice. That origin
|
|
56
|
+
is visible in what it is good at — dense, professional, tool-shaped UI: tables
|
|
57
|
+
that sort, panels that split, an editor that takes breakpoints, a file browser,
|
|
58
|
+
a props table, a request flow. It is not a marketing-site kit.
|
|
59
|
+
|
|
60
|
+
Three things follow from being a library two real apps depend on:
|
|
61
|
+
|
|
62
|
+
- **Nothing is a hard dependency that does not have to be.** Monaco,
|
|
63
|
+
vis-network and the rest are optional peers. `dist/index.js` contains zero
|
|
64
|
+
references to any of them, and that is
|
|
65
|
+
[checked at release](#publishing-to-npm), not just claimed.
|
|
66
|
+
- **Retheming is a colour change, not a fork.** Every token is a
|
|
67
|
+
`--color-*` custom property. Override a variable on `:root`, or on one
|
|
68
|
+
container to theme a single panel differently.
|
|
69
|
+
- **One size prop, threaded through everything.** `xxs`–`xxxl` set once on
|
|
70
|
+
`<DuiProvider>`, overridable per instance, consistent between a button and
|
|
71
|
+
the select next to it.
|
|
46
72
|
|
|
47
73
|
## Install
|
|
48
74
|
|
|
@@ -59,100 +85,602 @@ import '@salilvnair/dui/style.css';
|
|
|
59
85
|
## Quick start
|
|
60
86
|
|
|
61
87
|
```tsx
|
|
62
|
-
import { DuiProvider, ButtonView, TextInputView
|
|
88
|
+
import { DuiProvider, ButtonView, TextInputView } from '@salilvnair/dui';
|
|
63
89
|
import '@salilvnair/dui/style.css';
|
|
64
90
|
|
|
65
91
|
export function App() {
|
|
92
|
+
const [value, setValue] = useState('');
|
|
66
93
|
return (
|
|
67
94
|
<DuiProvider size="md">
|
|
68
95
|
<TextInputView placeholder="Search…" value={value} onChange={setValue} />
|
|
69
|
-
<ButtonView onClick={handleSubmit}>Submit</ButtonView>
|
|
96
|
+
<ButtonView variant="primary" onClick={handleSubmit}>Submit</ButtonView>
|
|
70
97
|
</DuiProvider>
|
|
71
98
|
);
|
|
72
99
|
}
|
|
73
100
|
```
|
|
74
101
|
|
|
75
102
|
`DuiProvider` is optional — every component works standalone with sensible
|
|
76
|
-
defaults. Wrap your app in it when you want
|
|
77
|
-
|
|
103
|
+
defaults. Wrap your app in it when you want one place to set the default size
|
|
104
|
+
or accent colour for the whole tree.
|
|
105
|
+
|
|
106
|
+
---
|
|
107
|
+
|
|
108
|
+
## What you get
|
|
109
|
+
|
|
110
|
+
### A playground on every component
|
|
111
|
+
|
|
112
|
+
Every one of the 281 components opens on an editable JSX snippet with a live
|
|
113
|
+
preview under it. Change a prop, see it, copy the line out.
|
|
114
|
+
|
|
115
|
+

|
|
116
|
+
|
|
117
|
+
### Every colour is a variable
|
|
118
|
+
|
|
119
|
+
Theming is not a config file you rebuild — it is a CSS custom property. The
|
|
120
|
+
showcase exposes the variables each component reads, so you can drag one and
|
|
121
|
+
watch what it touches before writing a line.
|
|
122
|
+
|
|
123
|
+

|
|
124
|
+
|
|
125
|
+
### Light and dark, both first-class
|
|
126
|
+
|
|
127
|
+
Not a dark theme with a light afterthought. Every token is defined for both
|
|
128
|
+
grounds, and the switch is a `data-theme` attribute.
|
|
129
|
+
|
|
130
|
+

|
|
131
|
+
|
|
132
|
+
<details>
|
|
133
|
+
<summary>The catalog on the light ground</summary>
|
|
134
|
+
|
|
135
|
+
Every group has a light contact sheet too, in
|
|
136
|
+
[`media/sheets-light/`](https://github.com/salilvnair/dui/tree/main/media/sheets-light) —
|
|
137
|
+
the same components, the same captures, the other theme. Two of them:
|
|
138
|
+
|
|
139
|
+

|
|
140
|
+
|
|
141
|
+

|
|
142
|
+
|
|
143
|
+
Or add `?theme=light` to any component's address in the
|
|
144
|
+
[live demo](https://salilvnair.com/framework/dui/#/chips?theme=light).
|
|
145
|
+
|
|
146
|
+
</details>
|
|
147
|
+
|
|
148
|
+
### Every prop documented, in the app
|
|
149
|
+
|
|
150
|
+
Each component carries its own props table — name, type, default, and what it
|
|
151
|
+
does — beside the examples rather than in a separate site that drifts.
|
|
152
|
+
|
|
153
|
+

|
|
154
|
+
|
|
155
|
+
### And the rest of it
|
|
156
|
+
|
|
157
|
+
<table>
|
|
158
|
+
<tr>
|
|
159
|
+
<td width="50%">
|
|
160
|
+
|
|
161
|
+
**Tables and data grids** — sorting, sticky headers, editable cells, column
|
|
162
|
+
visibility, pagination, virtualisation.
|
|
163
|
+
|
|
164
|
+

|
|
165
|
+
|
|
166
|
+
</td>
|
|
167
|
+
<td width="50%">
|
|
168
|
+
|
|
169
|
+
**Dashboards** — stat cards, sparklines, heatmap calendars, a kanban board.
|
|
170
|
+
|
|
171
|
+

|
|
172
|
+
|
|
173
|
+
</td>
|
|
174
|
+
</tr>
|
|
175
|
+
<tr>
|
|
176
|
+
<td width="50%">
|
|
177
|
+
|
|
178
|
+
**Overlays** — modals that stack themselves, drawers off any edge, popovers,
|
|
179
|
+
tooltips, action sheets, a spotlight tour.
|
|
180
|
+
|
|
181
|
+

|
|
182
|
+
|
|
183
|
+
</td>
|
|
184
|
+
<td width="50%">
|
|
185
|
+
|
|
186
|
+
**Motion** — loaders, streaming text, a command orb, and the signature series.
|
|
187
|
+
|
|
188
|
+

|
|
189
|
+
|
|
190
|
+
</td>
|
|
191
|
+
</tr>
|
|
192
|
+
</table>
|
|
193
|
+
|
|
194
|
+
**The editor**, with Monaco installed or without it — see
|
|
195
|
+
[Monaco is optional](#the-code-editor--monaco-is-optional).
|
|
196
|
+
|
|
197
|
+

|
|
198
|
+
|
|
199
|
+
**All 281 of them, searchable** — the showcase's sidebar is the fastest way to
|
|
200
|
+
find the component you half-remember.
|
|
201
|
+
|
|
202
|
+

|
|
203
|
+
|
|
204
|
+
---
|
|
78
205
|
|
|
79
206
|
## Component catalog
|
|
80
207
|
|
|
208
|
+
<!-- catalog:start -->
|
|
209
|
+
|
|
210
|
+
<!-- Generated by `npm run catalog` from media/components.dark.json — do not edit by hand. -->
|
|
211
|
+
|
|
212
|
+
**281 components** across 18 groups.
|
|
213
|
+
Every name links to that component running in the live demo; every group opens to a
|
|
214
|
+
contact sheet and a table of what is in it.
|
|
215
|
+
|
|
81
216
|
<details>
|
|
82
|
-
<summary><b>Inputs</b> (
|
|
217
|
+
<summary><b>Inputs</b> (23)</summary>
|
|
218
|
+
|
|
219
|
+

|
|
220
|
+
|
|
221
|
+
| Component | What it is |
|
|
222
|
+
| --- | --- |
|
|
223
|
+
| [`KeyValueTableRowView`](https://salilvnair.com/framework/dui/#/keyvaluerow) | The row KeyValueTableView is built from, exported on its own — and HiddenKeyValueItemView, the same pair when it cann… |
|
|
224
|
+
| [`DiffEditorView`](https://salilvnair.com/framework/dui/#/diffeditor) | The diff twin of EditorView — a line diff out of the box, upgrading itself to Monaco the moment a consumer opts in. |
|
|
225
|
+
| [`MarkdownEditorView`](https://salilvnair.com/framework/dui/#/markdowneditor) | A rich editor over one Markdown document — rich text and raw source over the same value, and dialogs the host cannot… |
|
|
226
|
+
| [`MultilineInputView`](https://salilvnair.com/framework/dui/#/multilineinput) | The textarea wearing the same clothes as the rest of the input family — same heights, border and focus ring. |
|
|
227
|
+
| [`InlineEditTextView`](https://salilvnair.com/framework/dui/#/inlineedittext) | A field that does not look like one — reads as text until double-clicked, and its onSave may be async. |
|
|
228
|
+
| [`SearchFieldView`](https://salilvnair.com/framework/dui/#/searchfield) | The filter box's sibling that runs something — Enter acts, and it offers what you searched before. |
|
|
229
|
+
| [`FilterInputView`](https://salilvnair.com/framework/dui/#/filterinput) | The box above a list that narrows it — acts on every keystroke, and keeps saying it is a filter rather than a search. |
|
|
230
|
+
| [`TextInputView`](https://salilvnair.com/framework/dui/#/textinput) | Standard text input — sizes match ButtonView and SelectInputView exactly. |
|
|
231
|
+
| [`SelectInputView`](https://salilvnair.com/framework/dui/#/selectinput) | Portal dropdown with keyboard nav — replaces all StyledDropdown usages. |
|
|
232
|
+
| [`SelectTextInputView`](https://salilvnair.com/framework/dui/#/selecttextinput) | Combined method selector + URL input in one bordered pill — URL bar pattern. |
|
|
233
|
+
| [`TagInputView`](https://salilvnair.com/framework/dui/#/taginput) | Multi-value tag input — Enter or comma to add, Backspace to remove. |
|
|
234
|
+
| [`CheckboxView`](https://salilvnair.com/framework/dui/#/checkbox) | Checkbox — checked / unchecked / indeterminate / disabled — with accent colors. |
|
|
235
|
+
| [`ToggleSwitchView`](https://salilvnair.com/framework/dui/#/toggle) | On/off toggle with sm/md/lg sizes, accent color, label positions, disabled state. |
|
|
236
|
+
| [`ThemeCardSelectorView`](https://salilvnair.com/framework/dui/#/themecardselector) | Card-based theme picker with color swatch previews and checkmark selection. |
|
|
237
|
+
| [`EditorView`](https://salilvnair.com/framework/dui/#/editor) | Monaco editor wrapper — simplified props — JSON / GQL / XML / YAML etc. |
|
|
238
|
+
| [`DebugEditorView`](https://salilvnair.com/framework/dui/#/debugeditor) | Monaco editor with breakpoint gutter, paused-line highlight, and variable-hover tooltips. |
|
|
239
|
+
| [`SearchInputView`](https://salilvnair.com/framework/dui/#/searchinput) | URL-bar style search input with optional prefix icon and suffix clear button. |
|
|
240
|
+
| [`DurationInputView`](https://salilvnair.com/framework/dui/#/durationinput) | Number input with ms / s / m / hr unit selector dropdown. |
|
|
241
|
+
| [`HighlightedInputView`](https://salilvnair.com/framework/dui/#/highlightedinput) | {{variable}} highlighted URL input with autocomplete dropdown — the Daakia URL bar. |
|
|
242
|
+
| [`KeyValueTableView`](https://salilvnair.com/framework/dui/#/keyvaluetable) | KV table — toolbar · add/delete/bulk-clear · enable toggle · maskSensitive · autocompleteKeys · showDescription · pin… |
|
|
243
|
+
| [`MergedInputView`](https://salilvnair.com/framework/dui/#/mergedinput) | Unified single-border input bar — merge select dropdowns, text inputs, inline buttons, and dividers into one pill. |
|
|
244
|
+
| [`PickerView`](https://salilvnair.com/framework/dui/#/picker) | Scrollable wheel picker — single column or multi-column (hour/min/AM-PM) — momentum scroll, snap, and depth-fade anim… |
|
|
245
|
+
| [`SegmentedControlView`](https://salilvnair.com/framework/dui/#/segmentedcontrol) | Pill-shaped segmented control — solid sliding indicator with a springy bounce transition — pill / rounded / pointy sh… |
|
|
83
246
|
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
247
|
+
</details>
|
|
248
|
+
|
|
249
|
+
<details>
|
|
250
|
+
<summary><b>Date & Time</b> (7)</summary>
|
|
251
|
+
|
|
252
|
+

|
|
253
|
+
|
|
254
|
+
| Component | What it is |
|
|
255
|
+
| --- | --- |
|
|
256
|
+
| [`TimeZoneSelectView`](https://salilvnair.com/framework/dui/#/timezoneselect) | Every zone the platform knows, searchable — from the platform rather than a bundled table, so it does not go stale. |
|
|
257
|
+
| [`DateTimeInputView`](https://salilvnair.com/framework/dui/#/datetimeinput) | A date and a time in one field, returning one ISO string — with null as a real state rather than an empty one. |
|
|
258
|
+
| [`CalendarView`](https://salilvnair.com/framework/dui/#/calendar) | Month grid calendar — single / range / multi select, min/max bounds, animated month transitions. |
|
|
259
|
+
| [`DateInputView`](https://salilvnair.com/framework/dui/#/dateinput) | Text field trigger + CalendarView popover — the standard date field pattern. |
|
|
260
|
+
| [`DateRangePickerView`](https://salilvnair.com/framework/dui/#/daterangepicker) | Range calendar + quick presets (Today / Last 7 days / Last 30 days / This month). |
|
|
261
|
+
| [`TimeWheelView`](https://salilvnair.com/framework/dui/#/timewheel) | Prop-driven wrapper over PickerView columns for hour/minute/AM-PM — 12h or 24h mode, configurable minute step. |
|
|
262
|
+
| [`CountdownRingView`](https://salilvnair.com/framework/dui/#/countdownring) | Circular countdown ring + digit readout — target Date or durationSeconds, onComplete callback. |
|
|
89
263
|
|
|
90
264
|
</details>
|
|
91
265
|
|
|
92
266
|
<details>
|
|
93
|
-
<summary><b>
|
|
267
|
+
<summary><b>Form & Selection</b> (16)</summary>
|
|
268
|
+
|
|
269
|
+

|
|
270
|
+
|
|
271
|
+
| Component | What it is |
|
|
272
|
+
| --- | --- |
|
|
273
|
+
| [`SwatchPickerView`](https://salilvnair.com/framework/dui/#/swatchpicker) | Choosing between things identified by colour. |
|
|
274
|
+
| [`TogglePillView`](https://salilvnair.com/framework/dui/#/togglepill) | A chip that is a control — the pill above a list that switches one facet on and off, with an optional count inside it. |
|
|
275
|
+
| [`RadioGroupView`](https://salilvnair.com/framework/dui/#/radiogroup) | Radio list with optional descriptions — vertical or horizontal layout. |
|
|
276
|
+
| [`RadioCardView`](https://salilvnair.com/framework/dui/#/radiocard) | Big selectable cards — plan pickers, mode selectors — grid layout via `columns`. |
|
|
277
|
+
| [`RatingView`](https://salilvnair.com/framework/dui/#/rating) | Star or heart rating input — half-step precision, hover preview, read-only mode. |
|
|
278
|
+
| [`OtpInputView`](https://salilvnair.com/framework/dui/#/otpinput) | Auto-advance OTP/PIN boxes — paste splits across cells, onComplete callback. |
|
|
279
|
+
| [`PhoneInputView`](https://salilvnair.com/framework/dui/#/phoneinput) | Country-code select + number field in one bordered pill. |
|
|
280
|
+
| [`ColorPickerView`](https://salilvnair.com/framework/dui/#/colorpicker) | Swatch grid + native hue canvas + hex input, popover trigger. |
|
|
281
|
+
| [`IconPickerView`](https://salilvnair.com/framework/dui/#/iconpicker) | Searchable grid over every DUI icon — popover trigger. |
|
|
282
|
+
| [`EmojiPickerView`](https://salilvnair.com/framework/dui/#/emojipicker) | Categorized emoji grid with search — popover trigger. |
|
|
283
|
+
| [`FileDropzoneView`](https://salilvnair.com/framework/dui/#/filedropzone) | Drag-drop upload zone — per-file progress bars, remove action. |
|
|
284
|
+
| [`AvatarUploadView`](https://salilvnair.com/framework/dui/#/avatarupload) | Circular avatar preview with a camera-overlay upload button. |
|
|
285
|
+
| [`MaskedInputView`](https://salilvnair.com/framework/dui/#/maskedinput) | Pattern-masked text input — `9`=digit, `A`=letter, `*`=any, literal separators auto-insert. |
|
|
286
|
+
| [`TransferListView`](https://salilvnair.com/framework/dui/#/transferlist) | Dual listbox — available ↔ selected — move one or move-all controls. |
|
|
287
|
+
| [`StepperInputView`](https://salilvnair.com/framework/dui/#/stepperinput) | Numeric +/- stepper — iOS UIStepper pattern — min/max/step. |
|
|
288
|
+
| [`SwitchGroupView`](https://salilvnair.com/framework/dui/#/switchgroup) | Settings.app-style grouped toggle rows — section header, per-row description, disabled state. |
|
|
94
289
|
|
|
95
|
-
|
|
96
|
-
|
|
290
|
+
</details>
|
|
291
|
+
|
|
292
|
+
<details>
|
|
293
|
+
<summary><b>Feedback & Status</b> (14)</summary>
|
|
294
|
+
|
|
295
|
+

|
|
296
|
+
|
|
297
|
+
| Component | What it is |
|
|
298
|
+
| --- | --- |
|
|
299
|
+
| [`TableSkeletonView`](https://salilvnair.com/framework/dui/#/tableskeleton) | The placeholder a table shows while its rows load — declared with the same column widths, so nothing jumps when the d… |
|
|
300
|
+
| [`LoadingStateView`](https://salilvnair.com/framework/dui/#/loadingstate) | The screen shown while something is fetched — the subject drawn large, and a component that says so itself once the w… |
|
|
301
|
+
| [`InfoView`](https://salilvnair.com/framework/dui/#/infoview) | An explanatory block for settings and empty states — what this is, and where on disk it lives, with paths as pills ra… |
|
|
302
|
+
| [`CalloutView`](https://salilvnair.com/framework/dui/#/callout) | The titled block that interrupts a page to say something the reader needs — info, tip, warning, danger. |
|
|
303
|
+
| [`SnackbarView`](https://salilvnair.com/framework/dui/#/snackbar) | Single-line bottom bar + action, auto-dismiss timer pauses on hover — distinct from the stacked-corner ToastView. |
|
|
304
|
+
| [`BannerView`](https://salilvnair.com/framework/dui/#/banner) | Persistent dismissible top strip — info / success / warning / danger variants. |
|
|
305
|
+
| [`ProgressRingView`](https://salilvnair.com/framework/dui/#/progressring) | Circular determinate/indeterminate progress — distinct from GaugeView (metric gauge). |
|
|
306
|
+
| [`ProgressBarView`](https://salilvnair.com/framework/dui/#/progressbar) | Linear progress — buffer fill and striped-indeterminate variants. |
|
|
307
|
+
| [`SkeletonView`](https://salilvnair.com/framework/dui/#/skeleton) | Composable shimmer primitives — text / block / avatar / row — for custom loading layouts. |
|
|
308
|
+
| [`NotificationBadgeView`](https://salilvnair.com/framework/dui/#/notificationbadge) | Dot/count badge overlay anchor for icons and avatars. |
|
|
309
|
+
| [`AvatarView`](https://salilvnair.com/framework/dui/#/avatar) | Image or initials fallback, with an optional presence-status dot. |
|
|
310
|
+
| [`AvatarGroupView`](https://salilvnair.com/framework/dui/#/avatargroup) | Stacked overlapping avatars with a "+N" overflow bubble. |
|
|
311
|
+
| [`PresenceDotView`](https://salilvnair.com/framework/dui/#/presencedot) | Tiny online/away/busy/offline status primitive. |
|
|
312
|
+
| [`ConfettiBurstView`](https://salilvnair.com/framework/dui/#/confettiburst) | Canvas confetti burst triggered imperatively via ref — fire() from any event handler. |
|
|
97
313
|
|
|
98
314
|
</details>
|
|
99
315
|
|
|
100
316
|
<details>
|
|
101
|
-
<summary><b>Buttons</b> (
|
|
317
|
+
<summary><b>Buttons</b> (8)</summary>
|
|
318
|
+
|
|
319
|
+

|
|
102
320
|
|
|
103
|
-
|
|
104
|
-
|
|
321
|
+
| Component | What it is |
|
|
322
|
+
| --- | --- |
|
|
323
|
+
| [`ThemeToggleView`](https://salilvnair.com/framework/dui/#/themetoggle) | One button, two states — the sun and the moon tinted independently, for a header with no room for three segments. |
|
|
324
|
+
| [`SegmentedView`](https://salilvnair.com/framework/dui/#/segmented) | The flat cousin of SegmentedControlView — no track, no sliding indicator, for switching a view rather than operating… |
|
|
325
|
+
| [`SplitButtonView`](https://salilvnair.com/framework/dui/#/splitbutton) | A default action and its close relatives in one control — Save, with Save As and Export behind the chevron. |
|
|
326
|
+
| [`ActionButtonView`](https://salilvnair.com/framework/dui/#/actionbutton) | The toolbar button — quieter than ButtonView, louder than IconButtonView, and sized on the same scale as both. |
|
|
327
|
+
| [`ButtonView`](https://salilvnair.com/framework/dui/#/button) | Standard button — primary / secondary / ghost / danger — all sizes. |
|
|
328
|
+
| [`IconButtonView`](https://salilvnair.com/framework/dui/#/iconbutton) | Square icon-only buttons — ghost / filled — toggle support — all sizes. |
|
|
329
|
+
| [`DropDownButtonView`](https://salilvnair.com/framework/dui/#/dropdownbutton) | Split button — primary action + chevron dropdown — Save as, Export as, etc. |
|
|
330
|
+
| [`AIButtonView`](https://salilvnair.com/framework/dui/#/aibutton) | AI action button — generate · fuzz · explain · fix · ask · suggest — loading state. |
|
|
105
331
|
|
|
106
332
|
</details>
|
|
107
333
|
|
|
108
334
|
<details>
|
|
109
|
-
<summary><b>Navigation</b> (
|
|
335
|
+
<summary><b>Navigation</b> (11)</summary>
|
|
336
|
+
|
|
337
|
+

|
|
338
|
+
|
|
339
|
+
| Component | What it is |
|
|
340
|
+
| --- | --- |
|
|
341
|
+
| [`UnderlineTabsView`](https://salilvnair.com/framework/dui/#/underlinetabs) | The page-level tab row — active marked by a rule rather than a box, with counts beside the labels. |
|
|
342
|
+
| [`PilledTabView`](https://salilvnair.com/framework/dui/#/pilledtab) | A compact tab row for inside a panel — a filled pill marks the active one, rounded or fully pilled. |
|
|
343
|
+
| [`TabView`](https://salilvnair.com/framework/dui/#/tabs) | pill · underline variants — sliding indicator, badges, dots — all with accentColor. |
|
|
344
|
+
| [`TabBarView`](https://salilvnair.com/framework/dui/#/tabbar) | Editor-style protocol tab bar — store-free, drag-free, scroll arrows, dirty dot. |
|
|
345
|
+
| [`ContextMenuView`](https://salilvnair.com/framework/dui/#/contextmenu) | Recursive context menu with submenus — portal rendered — collection tree style. |
|
|
346
|
+
| [`SideNavView`](https://salilvnair.com/framework/dui/#/sidenav) | Collapsible left sidebar nav with nested items and icon-only collapse mode. |
|
|
347
|
+
| [`SettingsNavView`](https://salilvnair.com/framework/dui/#/settingsnav) | Settings-style grouped nav with badges, descriptions, active state. |
|
|
348
|
+
| [`BreadcrumbView`](https://salilvnair.com/framework/dui/#/breadcrumb) | Path breadcrumb trail with overflow-collapse into a "…" for long paths. |
|
|
349
|
+
| [`PaginationView`](https://salilvnair.com/framework/dui/#/pagination) | Page number control with ellipsis collapse for long ranges. |
|
|
350
|
+
| [`DockView`](https://salilvnair.com/framework/dui/#/dock) | Floating icon dock — icons magnify as the cursor approaches. |
|
|
351
|
+
| [`FabView`](https://salilvnair.com/framework/dui/#/fab) | Floating action button — standard, extended (with label), or speed-dial with sub-actions. |
|
|
110
352
|
|
|
111
|
-
|
|
112
|
-
|
|
353
|
+
</details>
|
|
354
|
+
|
|
355
|
+
<details>
|
|
356
|
+
<summary><b>Display</b> (26)</summary>
|
|
357
|
+
|
|
358
|
+

|
|
359
|
+
|
|
360
|
+
| Component | What it is |
|
|
361
|
+
| --- | --- |
|
|
362
|
+
| [`LineDiffView`](https://salilvnair.com/framework/dui/#/linediff) | Two texts side by side with the changed lines marked — and no Monaco anywhere near it. |
|
|
363
|
+
| [`SetupOptionView`](https://salilvnair.com/framework/dui/#/setupoption) | One card per route to getting installed — winget, Homebrew, apt — turning a wall of platform instructions into a list… |
|
|
364
|
+
| [`PriorityMarkView`](https://salilvnair.com/framework/dui/#/prioritymark) | The priority marker on an issue row — the ring is the signal, the word is a courtesy that a dense table can drop. |
|
|
365
|
+
| [`GroupHeaderView`](https://salilvnair.com/framework/dui/#/groupheader) | The row above a group in a grouped list or a board column — set as a label, not a heading, so eight of them do not re… |
|
|
366
|
+
| [`TerminalBlockView`](https://salilvnair.com/framework/dui/#/terminalblock) | Commands and their output on a terminal ground — a terminal, whether it holds what you type or what came back. |
|
|
367
|
+
| [`CommandChipView`](https://salilvnair.com/framework/dui/#/commandchip) | A command rendered inline that copies itself when clicked — for the places a reader is about to retype something they… |
|
|
368
|
+
| [`ChipView`](https://salilvnair.com/framework/dui/#/chips) | Colored badge chips for methods, protocols, status codes, filter tags. |
|
|
369
|
+
| [`BadgeChipView`](https://salilvnair.com/framework/dui/#/badgechip) | The pill that labels a thing — fifty skins, chosen by `variant` or set for the whole product by DuiProvider. |
|
|
370
|
+
| [`StatusIndicatorView`](https://salilvnair.com/framework/dui/#/statusindicator) | Connection status dot — idle · connecting · connected · disconnected · error. |
|
|
371
|
+
| [`LoaderView`](https://salilvnair.com/framework/dui/#/loader) | Loading states — spinner · dots · skeleton · pulse · progress-bar. |
|
|
372
|
+
| [`EmptyStateView`](https://salilvnair.com/framework/dui/#/emptystate) | Empty state placeholder with icon, title, message, and optional CTA button. |
|
|
373
|
+
| [`ColoredTextView`](https://salilvnair.com/framework/dui/#/coloredtext) | Token-colored text — HTTP status lines, gRPC codes, SOAP faults. |
|
|
374
|
+
| [`StatsCardView`](https://salilvnair.com/framework/dui/#/statscard) | Colorful metric card — value, unit, trend (up/down/neutral), subValue. |
|
|
375
|
+
| [`DottedCardView`](https://salilvnair.com/framework/dui/#/dottedcard) | Dotted-border expandable card — useful for optional config sections. |
|
|
376
|
+
| [`DataTableView`](https://salilvnair.com/framework/dui/#/datatable) | Generic sortable table — columns, striped rows, empty state, row click. |
|
|
377
|
+
| [`CodeBlockView`](https://salilvnair.com/framework/dui/#/codeblock) | Read-only code block — language label, copy button, optional line numbers. |
|
|
378
|
+
| [`PromptCardView`](https://salilvnair.com/framework/dui/#/promptcard) | Single prompt library row card — colored avatar initials, title, description, protocol badge, CUSTOM badge, hover act… |
|
|
379
|
+
| [`PromptLibraryView`](https://salilvnair.com/framework/dui/#/promptlibrary) | Full Prompt Library panel — list (search + sections + categories) + editor (avatar header + tabs + preview/edit toggl… |
|
|
380
|
+
| [`StageCheck/Spin/Pulse`](https://salilvnair.com/framework/dui/#/stageview) | Step-level status indicators — completed (check), active (spin), pending (pulse) — for multi-step pipelines and reque… |
|
|
381
|
+
| [`HudView`](https://salilvnair.com/framework/dui/#/hudview) | Generic floating draggable toolbar — store-free counterpart of DebugHud. |
|
|
382
|
+
| [`JsonTreeView`](https://salilvnair.com/framework/dui/#/jsontree) | Recursive JSON / object / array value tree with editor-style token colors. |
|
|
383
|
+
| [`ExpandableLogEntryView`](https://salilvnair.com/framework/dui/#/logentry) | Expandable log row with icon, title, colored badge, timestamp chip, and chevron. |
|
|
384
|
+
| [`CopyButtonView`](https://salilvnair.com/framework/dui/#/copybutton) | Icon-only button that copies text to clipboard. |
|
|
385
|
+
| [`MarkdownView`](https://salilvnair.com/framework/dui/#/markdownview) | Renders Markdown (GFM) with syntax-highlighted code blocks, inline code, tables, task lists, blockquotes, and copy-bu… |
|
|
386
|
+
| [`FormDataTableView`](https://salilvnair.com/framework/dui/#/formdatatable) | Multipart/form-data key-value table with file upload support. |
|
|
387
|
+
| [`YamlKeyChip`](https://salilvnair.com/framework/dui/#/yamlkeychip) | Compact type-labeled chip for YAML/JSON keys. |
|
|
388
|
+
|
|
389
|
+
</details>
|
|
390
|
+
|
|
391
|
+
<details>
|
|
392
|
+
<summary><b>Overlays</b> (11)</summary>
|
|
393
|
+
|
|
394
|
+

|
|
395
|
+
|
|
396
|
+
| Component | What it is |
|
|
397
|
+
| --- | --- |
|
|
398
|
+
| [`SheetView`](https://salilvnair.com/framework/dui/#/sheet) | A panel that slides in from any edge — for content that is a sidebar on a wide screen and a bottom sheet on a narrow… |
|
|
399
|
+
| [`CommandPaletteView`](https://salilvnair.com/framework/dui/#/commandpalette) | The Ctrl+K box. |
|
|
400
|
+
| [`ModalView`](https://salilvnair.com/framework/dui/#/modal) | Configurable modal — sm/md/lg/xl — never closes on backdrop click. |
|
|
401
|
+
| [`InfoPopupView`](https://salilvnair.com/framework/dui/#/infopopup) | Help popup anchored near a ? |
|
|
402
|
+
| [`ToastView`](https://salilvnair.com/framework/dui/#/toast) | Toast notification stack — success · error · warning · info — auto-dismiss. |
|
|
403
|
+
| [`PopoverView`](https://salilvnair.com/framework/dui/#/popover) | Generic anchored floating-content primitive — the positioning engine behind SelectInputView/InfoPopupView, exposed st… |
|
|
404
|
+
| [`TooltipView`](https://salilvnair.com/framework/dui/#/tooltip) | Hover/focus tooltip primitive — top/bottom/left/right placement, configurable delay. |
|
|
405
|
+
| [`DrawerView`](https://salilvnair.com/framework/dui/#/drawer) | Slide-in overlay panel from any edge, with backdrop — navigation-drawer pattern. |
|
|
406
|
+
| [`ActionSheetView`](https://salilvnair.com/framework/dui/#/actionsheet) | Bottom list of actions + destructive styling + cancel. |
|
|
407
|
+
| [`BottomSheetView`](https://salilvnair.com/framework/dui/#/bottomsheet) | Drag-to-dismiss mobile sheet — distinct from the persistent, resizable BottomPanelView. |
|
|
408
|
+
| [`SpotlightTourView`](https://salilvnair.com/framework/dui/#/spotlighttour) | Coach-mark onboarding — spotlight cutout around a target selector + step tooltip + progress dots. |
|
|
113
409
|
|
|
114
410
|
</details>
|
|
115
411
|
|
|
116
412
|
<details>
|
|
117
|
-
<summary><b>
|
|
413
|
+
<summary><b>Layout</b> (24)</summary>
|
|
414
|
+
|
|
415
|
+

|
|
416
|
+
|
|
417
|
+
| Component | What it is |
|
|
418
|
+
| --- | --- |
|
|
419
|
+
| [`InspectorPanelView`](https://salilvnair.com/framework/dui/#/inspectorpanel) | The detail panel beside a list — an overlay on a narrow screen and a permanent third column on a wide one, from one p… |
|
|
420
|
+
| [`FanStackView`](https://salilvnair.com/framework/dui/#/fanstack) | A small set of actions that spring out of a floating anchor — straight up, or swept into an arc. |
|
|
421
|
+
| [`ResizablePanelView`](https://salilvnair.com/framework/dui/#/resizablepanel) | Single-pane panel with bottom-edge drag handle to resize height — no store dependency. |
|
|
422
|
+
| [`SplitPanelView`](https://salilvnair.com/framework/dui/#/splitpanel) | Split-pane container — horizontal or vertical — drag pill, double-click to reset. |
|
|
423
|
+
| [`BottomPanelView`](https://salilvnair.com/framework/dui/#/bottompanel) | DevTools-style resizable bottom panel with tab bar and collapse toggle. |
|
|
424
|
+
| [`FeatureCategoryView`](https://salilvnair.com/framework/dui/#/featurecategory) | Expandable feature category with toggle switches and enabled count badge. |
|
|
425
|
+
| [`CollapsibleSectionView`](https://salilvnair.com/framework/dui/#/collapsiblesection) | Expandable section with chevron toggle, colored chip title, count badge, and a right-side action slot. |
|
|
426
|
+
| [`SpacerView`](https://salilvnair.com/framework/dui/#/spacerview) | Thin divider line for separating groups in icon rails, toolbars, or any flex container. |
|
|
427
|
+
| [`FolderView`](https://salilvnair.com/framework/dui/#/folderview) | Generic folder tree component with expand/collapse, hover action buttons, DUI ContextMenuView on 3-dot, and DUI Modal… |
|
|
428
|
+
| [`DebugView`](https://salilvnair.com/framework/dui/#/debugview) | Editor-style Run & Debug sidebar panel — Variables (scoped tree), Watch expressions, Call Stack, Breakpoints. |
|
|
429
|
+
| [`HeroView`](https://salilvnair.com/framework/dui/#/hero) | Banner section — title/subtitle/CTA, size-driven min-height. |
|
|
430
|
+
| [`LevelView`](https://salilvnair.com/framework/dui/#/level) | Space-between horizontal toolbar row primitive. |
|
|
431
|
+
| [`MediaObjectView`](https://salilvnair.com/framework/dui/#/mediaobject) | Avatar/icon + content + actions row. |
|
|
432
|
+
| [`TileGridView`](https://salilvnair.com/framework/dui/#/tilegrid) | Nested ancestor/parent/child tile grid. |
|
|
433
|
+
| [`PanelListView`](https://salilvnair.com/framework/dui/#/panellist) | Heading + tabs + filterable block list. |
|
|
434
|
+
| [`NavbarView`](https://salilvnair.com/framework/dui/#/navbar) | Top app bar — brand, link menu, burger collapse on narrow widths. |
|
|
435
|
+
| [`AffixView`](https://salilvnair.com/framework/dui/#/affix) | Sticky-on-scroll wrapper — pins once it reaches offsetTop. |
|
|
436
|
+
| [`AnchorView`](https://salilvnair.com/framework/dui/#/anchor) | Scroll-spy in-page navigation — highlights the section in view, click to jump. |
|
|
437
|
+
| [`StickyHeaderView`](https://salilvnair.com/framework/dui/#/stickyheader) | Sticky section header that grows a shadow once pinned. |
|
|
438
|
+
| [`AspectRatioView`](https://salilvnair.com/framework/dui/#/aspectratio) | Fixed aspect-ratio box for image/video containers. |
|
|
439
|
+
| [`MasonryGridView`](https://salilvnair.com/framework/dui/#/masonrygrid) | Pinterest-style column-balanced layout — pure CSS columns, no JS measurement. |
|
|
440
|
+
| [`ScrollAreaView`](https://salilvnair.com/framework/dui/#/scrollarea) | Custom accent-tinted scrollbar container primitive. |
|
|
441
|
+
| [`BackToTopView`](https://salilvnair.com/framework/dui/#/backtotop) | Floating scroll-to-top button — fades in past a scroll threshold. |
|
|
442
|
+
| [`WatermarkView`](https://salilvnair.com/framework/dui/#/watermark) | Repeated diagonal text/logo overlay. |
|
|
443
|
+
|
|
444
|
+
</details>
|
|
445
|
+
|
|
446
|
+
<details>
|
|
447
|
+
<summary><b>Data & Enterprise</b> (16)</summary>
|
|
448
|
+
|
|
449
|
+

|
|
450
|
+
|
|
451
|
+
| Component | What it is |
|
|
452
|
+
| --- | --- |
|
|
453
|
+
| [`IssueCardView`](https://salilvnair.com/framework/dui/#/issuecard) | The card a tracker board is built from — everything but the title is a slot, with a matching skeleton so the board ne… |
|
|
454
|
+
| [`FindingCardView`](https://salilvnair.com/framework/dui/#/findingcard) | One finding from an analysis — with remediation kept apart from the detail, because what was found and what to do are… |
|
|
455
|
+
| [`DescriptionsView`](https://salilvnair.com/framework/dui/#/descriptions) | Read-only label/value grid for entity detail views. |
|
|
456
|
+
| [`StatisticView`](https://salilvnair.com/framework/dui/#/statistic) | Inline animated big-number stat with prefix/suffix. |
|
|
457
|
+
| [`ResultView`](https://salilvnair.com/framework/dui/#/result) | Full-page outcome state — success / error / 404 / 403 / warning / info. |
|
|
458
|
+
| [`CascaderView`](https://salilvnair.com/framework/dui/#/cascader) | Multi-level cascading select — region/category trees. |
|
|
459
|
+
| [`ComboBoxView`](https://salilvnair.com/framework/dui/#/combobox) | Free-text input + filtered dropdown suggestions — autocomplete pattern. |
|
|
460
|
+
| [`ListView`](https://salilvnair.com/framework/dui/#/listview) | Generic avatar/title/subtitle/action list primitive. |
|
|
461
|
+
| [`VirtualizedListView`](https://salilvnair.com/framework/dui/#/virtualizedlist) | Windowed rendering for large lists — only mounts rows in (or near) the viewport. |
|
|
462
|
+
| [`StickyTableHeaderView`](https://salilvnair.com/framework/dui/#/stickytableheader) | Sticky header + optional frozen first column for wide/tall tables. |
|
|
463
|
+
| [`TablePaginationView`](https://salilvnair.com/framework/dui/#/tablepagination) | Rows-per-page selector + page-number footer. |
|
|
464
|
+
| [`FilterBarView`](https://salilvnair.com/framework/dui/#/filterbar) | Chip-based row of active filters with a clear-all action. |
|
|
465
|
+
| [`SortableHeaderView`](https://salilvnair.com/framework/dui/#/sortableheader) | Clickable table column header with a sort-direction arrow indicator. |
|
|
466
|
+
| [`EditableCellView`](https://salilvnair.com/framework/dui/#/editablecell) | Click-to-edit table cell — Enter commits, Escape cancels. |
|
|
467
|
+
| [`DataGridToolbarView`](https://salilvnair.com/framework/dui/#/datagridtoolbar) | Table toolbar — search + column-visibility + density cycle + export. |
|
|
468
|
+
| [`ColumnVisibilityMenuView`](https://salilvnair.com/framework/dui/#/columnvisibility) | Checkbox menu to toggle table column visibility. |
|
|
469
|
+
|
|
470
|
+
</details>
|
|
471
|
+
|
|
472
|
+
<details>
|
|
473
|
+
<summary><b>Advanced Selection</b> (15)</summary>
|
|
474
|
+
|
|
475
|
+

|
|
476
|
+
|
|
477
|
+
| Component | What it is |
|
|
478
|
+
| --- | --- |
|
|
479
|
+
| [`SortableView`](https://salilvnair.com/framework/dui/#/sortable) | Reordering for rows you draw yourself — it supplies the handle, the drop indicator and the indices, nothing else. |
|
|
480
|
+
| [`RearrangeView`](https://salilvnair.com/framework/dui/#/rearrange) | The column-picker shape — which fields to show and in what order, both questions in one list. |
|
|
481
|
+
| [`KbdView`](https://salilvnair.com/framework/dui/#/kbd) | Hotkey hint chip, composes multiple keys with a "+" separator. |
|
|
482
|
+
| [`WizardStepperView`](https://salilvnair.com/framework/dui/#/wizardstepper) | Multi-step form wizard progress header. |
|
|
483
|
+
| [`AccordionGroupView`](https://salilvnair.com/framework/dui/#/accordiongroup) | Managed single/multi-open accordion group, built on CollapsibleSectionView. |
|
|
484
|
+
| [`SegmentedProgressBarView`](https://salilvnair.com/framework/dui/#/segmentedprogressbar) | Multi-segment progress — e.g. |
|
|
485
|
+
| [`ChecklistView`](https://salilvnair.com/framework/dui/#/checklist) | Todo-style checklist — strikethrough + faded once complete. |
|
|
486
|
+
| [`PriorityPickerView`](https://salilvnair.com/framework/dui/#/prioritypicker) | Low/medium/high/urgent selector with color-coded dots. |
|
|
487
|
+
| [`TagCloudView`](https://salilvnair.com/framework/dui/#/tagcloud) | Weighted tag cloud — font size scales with relative weight. |
|
|
488
|
+
| [`RangeSliderView`](https://salilvnair.com/framework/dui/#/rangeslider) | Dual-handle min/max range — distinct from the single-handle SliderView. |
|
|
489
|
+
| [`VoteWidgetView`](https://salilvnair.com/framework/dui/#/votewidget) | Upvote/downvote counter control. |
|
|
490
|
+
| [`LikeButtonView`](https://salilvnair.com/framework/dui/#/likebutton) | Animated heart/like toggle button — pop animation on like. |
|
|
491
|
+
| [`BookmarkButtonView`](https://salilvnair.com/framework/dui/#/bookmarkbutton) | Animated bookmark/save toggle button. |
|
|
492
|
+
| [`FollowButtonView`](https://salilvnair.com/framework/dui/#/followbutton) | Follow/following state-toggle button — reveals "Unfollow" on hover. |
|
|
493
|
+
| [`ShortcutRecorderView`](https://salilvnair.com/framework/dui/#/shortcutrecorder) | Captures a keybinding — click to record, press keys, renders via KbdView. |
|
|
494
|
+
|
|
495
|
+
</details>
|
|
496
|
+
|
|
497
|
+
<details>
|
|
498
|
+
<summary><b>Communication & Content</b> (14)</summary>
|
|
499
|
+
|
|
500
|
+

|
|
501
|
+
|
|
502
|
+
| Component | What it is |
|
|
503
|
+
| --- | --- |
|
|
504
|
+
| [`MessageBubbleView`](https://salilvnair.com/framework/dui/#/messagebubble) | Chat message bubble — sent (right, filled) / received (left, neutral). |
|
|
505
|
+
| [`ChatInputView`](https://salilvnair.com/framework/dui/#/chatinput) | Message composer — auto-growing textarea + attach + send. |
|
|
506
|
+
| [`TypingIndicatorView`](https://salilvnair.com/framework/dui/#/typingindicator) | Animated "…is typing" dots. |
|
|
507
|
+
| [`CommentThreadView`](https://salilvnair.com/framework/dui/#/commentthread) | Nested comment thread with reply action — GitHub/PR-style. |
|
|
508
|
+
| [`NotificationCenterView`](https://salilvnair.com/framework/dui/#/notificationcenter) | Bell icon + dropdown notification list, unread-count badge. |
|
|
509
|
+
| [`AlertDialogView`](https://salilvnair.com/framework/dui/#/alertdialog) | Pre-built confirm/cancel dialog with danger styling — the standard "Are you sure?" pattern. |
|
|
510
|
+
| [`FeedbackWidgetView`](https://salilvnair.com/framework/dui/#/feedbackwidget) | Thumbs up/down + optional comment micro-survey. |
|
|
511
|
+
| [`NpsSurveyView`](https://salilvnair.com/framework/dui/#/npssurvey) | 0-10 Net Promoter Score picker with an optional follow-up text field. |
|
|
512
|
+
| [`ShareSheetView`](https://salilvnair.com/framework/dui/#/sharesheet) | Social share row + copy-link field. |
|
|
513
|
+
| [`ContactCardView`](https://salilvnair.com/framework/dui/#/contactcard) | Avatar + name + role + contact-icon row card. |
|
|
514
|
+
| [`ArticleCardView`](https://salilvnair.com/framework/dui/#/articlecard) | Image + title + excerpt + meta preview card — blog/article listing. |
|
|
515
|
+
| [`FaqAccordionView`](https://salilvnair.com/framework/dui/#/faqaccordion) | Pre-styled Q&A accordion, built directly on AccordionGroupView. |
|
|
516
|
+
| [`MessageBannerView`](https://salilvnair.com/framework/dui/#/messagebanner) | Inline success/error/info/warning message strip. |
|
|
517
|
+
| [`QuoteBlockView`](https://salilvnair.com/framework/dui/#/quoteblock) | Styled blockquote with an optional avatar + attribution line. |
|
|
518
|
+
|
|
519
|
+
</details>
|
|
118
520
|
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
521
|
+
<details>
|
|
522
|
+
<summary><b>Enterprise & Settings</b> (24)</summary>
|
|
523
|
+
|
|
524
|
+

|
|
525
|
+
|
|
526
|
+
| Component | What it is |
|
|
527
|
+
| --- | --- |
|
|
528
|
+
| [`SettingsRowView`](https://salilvnair.com/framework/dui/#/settingsrow) | Label + description + control row — the standard settings-page primitive. |
|
|
529
|
+
| [`SettingsSectionView`](https://salilvnair.com/framework/dui/#/settingssection) | Grouped settings card with a header — pairs with SettingsRowView. |
|
|
530
|
+
| [`OnboardingChecklistView`](https://salilvnair.com/framework/dui/#/onboardingchecklist) | Collapsible "getting started" progress checklist. |
|
|
531
|
+
| [`KeyValueListView`](https://salilvnair.com/framework/dui/#/keyvaluelist) | Lightweight label:value stacked list — no edit, no toolbar. |
|
|
532
|
+
| [`EnvironmentBadgeView`](https://salilvnair.com/framework/dui/#/environmentbadge) | Colored environment chip with an optional pulsing live indicator. |
|
|
533
|
+
| [`VersionBadgeView`](https://salilvnair.com/framework/dui/#/versionbadge) | Version number chip with an "update available" dot indicator. |
|
|
534
|
+
| [`LicenseBadgeView`](https://salilvnair.com/framework/dui/#/licensebadge) | Plan/tier ribbon badge — Free / Pro / Enterprise. |
|
|
535
|
+
| [`UsageMeterView`](https://salilvnair.com/framework/dui/#/usagemeter) | Quota bar (used/limit) with warning-color thresholds. |
|
|
536
|
+
| [`PermissionMatrixView`](https://salilvnair.com/framework/dui/#/permissionmatrix) | Role x permission checkbox grid. |
|
|
537
|
+
| [`AuditLogRowView`](https://salilvnair.com/framework/dui/#/auditlogrow) | Timestamped actor+action+target log row — audit trail primitive. |
|
|
538
|
+
| [`WebhookStatusView`](https://salilvnair.com/framework/dui/#/webhookstatus) | Webhook endpoint health row — last delivery, status code, retry action. |
|
|
539
|
+
| [`ApiKeyRowView`](https://salilvnair.com/framework/dui/#/apikeyrow) | Masked API key row with reveal/copy/revoke actions. |
|
|
540
|
+
| [`RateLimitMeterView`](https://salilvnair.com/framework/dui/#/ratelimitmeter) | Requests-remaining ring gauge with a reset countdown label. |
|
|
541
|
+
| [`EmptyInboxView`](https://salilvnair.com/framework/dui/#/emptyinbox) | Zero-notifications empty state — pre-styled variant of EmptyStateView. |
|
|
542
|
+
| [`FeatureSpotlightBadgeView`](https://salilvnair.com/framework/dui/#/featurespotlightbadge) | Pulsing "New" badge for recently shipped features. |
|
|
543
|
+
| [`CookieConsentBannerView`](https://salilvnair.com/framework/dui/#/cookieconsentbanner) | Fixed bottom cookie-consent bar with accept/customize actions. |
|
|
544
|
+
| [`MaintenanceBannerView`](https://salilvnair.com/framework/dui/#/maintenancebanner) | Scheduled-downtime notice strip. |
|
|
545
|
+
| [`TrialCountdownBannerView`](https://salilvnair.com/framework/dui/#/trialcountdownbanner) | "N days left in trial" strip with an upgrade CTA. |
|
|
546
|
+
| [`TeamMemberRowView`](https://salilvnair.com/framework/dui/#/teammemberrow) | Avatar + name + role + remove-action row — team management list item. |
|
|
547
|
+
| [`InviteInputView`](https://salilvnair.com/framework/dui/#/inviteinput) | Email-chip input specialized for multi-invite forms. |
|
|
548
|
+
| [`RoleSelectView`](https://salilvnair.com/framework/dui/#/roleselect) | Role dropdown with a per-option description shown beneath the label. |
|
|
549
|
+
| [`IntegrationCardView`](https://salilvnair.com/framework/dui/#/integrationcard) | Logo + name + connect/disconnect card — integrations/marketplace listing. |
|
|
550
|
+
| [`StatusPageRowView`](https://salilvnair.com/framework/dui/#/statuspagerow) | Service + uptime% + status-dot row — status page primitive. |
|
|
551
|
+
| [`ChangelogEntryView`](https://salilvnair.com/framework/dui/#/changelogentry) | Version + date + change-type badges + description block. |
|
|
125
552
|
|
|
126
553
|
</details>
|
|
127
554
|
|
|
128
555
|
<details>
|
|
129
|
-
<summary><b>
|
|
556
|
+
<summary><b>Media & Files</b> (14)</summary>
|
|
557
|
+
|
|
558
|
+

|
|
559
|
+
|
|
560
|
+
| Component | What it is |
|
|
561
|
+
| --- | --- |
|
|
562
|
+
| [`PathBreadcrumbView`](https://salilvnair.com/framework/dui/#/pathbreadcrumb) | The path bar above a file listing — every segment a link back, and a double-click turns the whole thing into a text box. |
|
|
563
|
+
| [`FileBrowserView`](https://salilvnair.com/framework/dui/#/filebrowser) | A directory listing — files, folders and symlinks, with selection and arrival as two separate states in two separate… |
|
|
564
|
+
| [`ImageGalleryView`](https://salilvnair.com/framework/dui/#/imagegallery) | Grid gallery with a click-to-open lightbox — prev/next navigation, Escape to close. |
|
|
565
|
+
| [`ImageCropperView`](https://salilvnair.com/framework/dui/#/imagecropper) | Drag-crop + zoom image editor — fixed crop frame, pannable/zoomable image. |
|
|
566
|
+
| [`VideoPlayerView`](https://salilvnair.com/framework/dui/#/videoplayer) | Custom video controls wrapper — play/pause, seek, volume. |
|
|
567
|
+
| [`AudioWaveformView`](https://salilvnair.com/framework/dui/#/audiowaveform) | Static or animated waveform visualization primitive. |
|
|
568
|
+
| [`AudioPlayerView`](https://salilvnair.com/framework/dui/#/audioplayer) | Waveform + play/pause/seek audio player. |
|
|
569
|
+
| [`PdfViewerView`](https://salilvnair.com/framework/dui/#/pdfviewer) | Paginated PDF preview wrapper — browser native iframe renderer (needs a real PDF URL in production). |
|
|
570
|
+
| [`FileIconView`](https://salilvnair.com/framework/dui/#/fileicon) | Extension-based file-type icon + name + size row. |
|
|
571
|
+
| [`FileListView`](https://salilvnair.com/framework/dui/#/filelist) | Uploaded-files list with per-row progress and remove action. |
|
|
572
|
+
| [`DragHandleView`](https://salilvnair.com/framework/dui/#/draghandle) | Grab-handle primitive for reorderable lists — six-dot grip icon. |
|
|
573
|
+
| [`SignaturePadView`](https://salilvnair.com/framework/dui/#/signaturepad) | Canvas signature capture — draw with mouse/touch/pen, exports a PNG data URL. |
|
|
574
|
+
| [`BarcodeView`](https://salilvnair.com/framework/dui/#/barcode) | Deterministic bar-pattern generator, visually representative — not a scannable encoder. |
|
|
575
|
+
| [`ImageZoomView`](https://salilvnair.com/framework/dui/#/imagezoom) | Click-to-zoom lightbox for a single image. |
|
|
130
576
|
|
|
131
|
-
|
|
577
|
+
</details>
|
|
578
|
+
|
|
579
|
+
<details>
|
|
580
|
+
<summary><b>Data Display & Wow</b> (20)</summary>
|
|
581
|
+
|
|
582
|
+

|
|
583
|
+
|
|
584
|
+
| Component | What it is |
|
|
585
|
+
| --- | --- |
|
|
586
|
+
| [`SwimlaneChartView`](https://salilvnair.com/framework/dui/#/swimlanechart) | What each of several things was doing over a period — threads by state, pods by phase — each stretch coloured by the… |
|
|
587
|
+
| [`LaneChartView`](https://salilvnair.com/framework/dui/#/lanechart) | Several metrics over the same period, each in its own lane with its own scale — so a small signal is not flattened by… |
|
|
588
|
+
| [`FlameGraphView`](https://salilvnair.com/framework/dui/#/flamegraph) | The profiler flame graph — a frame is as wide as it is expensive, and clicking one makes it the new root. |
|
|
589
|
+
| [`SunburstView`](https://salilvnair.com/framework/dui/#/sunburst) | Where a total went, one level at a time — a ring per level, drawn outward. |
|
|
590
|
+
| [`DonutView`](https://salilvnair.com/framework/dui/#/donut) | A share-of-total ring, with maxSlices to roll the unreadable tail into one named remainder. |
|
|
591
|
+
| [`TimelineView`](https://salilvnair.com/framework/dui/#/timeline) | Event trail with icon nodes — vertical (default) or horizontal. |
|
|
592
|
+
| [`ActivityFeedView`](https://salilvnair.com/framework/dui/#/activityfeed) | Chronological activity feed, entries grouped by day. |
|
|
593
|
+
| [`KanbanBoardView`](https://salilvnair.com/framework/dui/#/kanbanboard) | Draggable columns + cards board, native HTML5 drag-and-drop. |
|
|
594
|
+
| [`SparklineView`](https://salilvnair.com/framework/dui/#/sparkline) | Tiny inline SVG trend line, no axes — for table cells / stat cards. |
|
|
595
|
+
| [`HeatmapCalendarView`](https://salilvnair.com/framework/dui/#/heatmapcalendar) | GitHub-style contribution heatmap — day cells shaded by count, tooltip on hover. |
|
|
596
|
+
| [`ComparisonSliderView`](https://salilvnair.com/framework/dui/#/comparisonslider) | Before/after drag slider for image comparison. |
|
|
597
|
+
| [`CarouselView`](https://salilvnair.com/framework/dui/#/carousel) | Swipeable card carousel with dot indicators — autoplay pauses on hover. |
|
|
598
|
+
| [`QRCodeView`](https://salilvnair.com/framework/dui/#/qrcode) | QR-style module grid with finder-pattern corners — visual, not spec-compliant/scannable. |
|
|
599
|
+
| [`StatTrendCardView`](https://salilvnair.com/framework/dui/#/stattrendcard) | Animated count-up number + sparkline trend — distinct from the static StatsCardView. |
|
|
600
|
+
| [`PricingCardView`](https://salilvnair.com/framework/dui/#/pricingcard) | Plan comparison card with a "popular" ribbon. |
|
|
601
|
+
| [`TestimonialCardView`](https://salilvnair.com/framework/dui/#/testimonialcard) | Quote + avatar testimonial card. |
|
|
602
|
+
| [`RatingBreakdownView`](https://salilvnair.com/framework/dui/#/ratingbreakdown) | 5-star rating distribution bars — App Store-style rating breakdown. |
|
|
603
|
+
| [`TreeSelectView`](https://salilvnair.com/framework/dui/#/treeselect) | Checkbox-driven hierarchical select — tri-state parent checkboxes over a folder-style tree. |
|
|
604
|
+
| [`RichTextToolbarView`](https://salilvnair.com/framework/dui/#/richtexttoolbar) | Formatting toolbar primitive — bold/italic/underline/link/list/code. |
|
|
605
|
+
| [`MentionInputView`](https://salilvnair.com/framework/dui/#/mentioninput) | @mention autocomplete textarea. |
|
|
132
606
|
|
|
133
607
|
</details>
|
|
134
608
|
|
|
135
609
|
<details>
|
|
136
|
-
<summary><b>
|
|
610
|
+
<summary><b>Fun & Micro-interactions</b> (10)</summary>
|
|
611
|
+
|
|
612
|
+

|
|
613
|
+
|
|
614
|
+
| Component | What it is |
|
|
615
|
+
| --- | --- |
|
|
616
|
+
| [`GradientTextView`](https://salilvnair.com/framework/dui/#/gradienttext) | Animated gradient-shifting text. |
|
|
617
|
+
| [`TypewriterTextView`](https://salilvnair.com/framework/dui/#/typewritertext) | Animated typing-effect text. |
|
|
618
|
+
| [`CountUpNumberView`](https://salilvnair.com/framework/dui/#/countupnumber) | Standalone animated number count-up primitive. |
|
|
619
|
+
| [`MagneticButtonView`](https://salilvnair.com/framework/dui/#/magneticbutton) | Cursor-attraction hover button effect. |
|
|
620
|
+
| [`TiltCardView`](https://salilvnair.com/framework/dui/#/tiltcard) | 3D perspective tilt-on-hover card. |
|
|
621
|
+
| [`ParticleBackgroundView`](https://salilvnair.com/framework/dui/#/particlebackground) | Subtle animated particle/dot background. |
|
|
622
|
+
| [`GlowBorderView`](https://salilvnair.com/framework/dui/#/glowborder) | Animated gradient glowing-border wrapper. |
|
|
623
|
+
| [`RevealOnScrollView`](https://salilvnair.com/framework/dui/#/revealonscroll) | Fade/slide-in-on-scroll wrapper. |
|
|
624
|
+
| [`FloatingLabelInputView`](https://salilvnair.com/framework/dui/#/floatinglabelinput) | Floating-label input, distinct from TextInputView's static placeholder. |
|
|
625
|
+
| [`PulseDotView`](https://salilvnair.com/framework/dui/#/pulsedot) | Attention-grabbing pulsing dot primitive — complements StatusIndicatorView. |
|
|
626
|
+
|
|
627
|
+
</details>
|
|
137
628
|
|
|
138
|
-
|
|
139
|
-
|
|
629
|
+
<details>
|
|
630
|
+
<summary><b>DUI Signature Series</b> (22)</summary>
|
|
631
|
+
|
|
632
|
+

|
|
633
|
+
|
|
634
|
+
| Component | What it is |
|
|
635
|
+
| --- | --- |
|
|
636
|
+
| [`RequestFlowView`](https://salilvnair.com/framework/dui/#/requestflow) | Animated network waterfall — particles travel a DNS→TCP→TLS→Request→Response pipe, speed/color mapped to real phase t… |
|
|
637
|
+
| [`LatencyPulseView`](https://salilvnair.com/framework/dui/#/latencypulse) | EKG/vitals-monitor style live pulse line for request latency — a metric that visually "beats" instead of a static lin… |
|
|
638
|
+
| [`AIStreamingTextView`](https://salilvnair.com/framework/dui/#/aistreamingtext) | Token-by-token LLM output renderer — per-token fade-in, thinking shimmer, soft blink cursor. |
|
|
639
|
+
| [`CommandOrbView`](https://salilvnair.com/framework/dui/#/commandorb) | Floating, breathing circular AI-assistant orb — idle pulse → thinking ripple → speaking waveform, expands into a chat… |
|
|
640
|
+
| [`TimeTravelSliderView`](https://salilvnair.com/framework/dui/#/timetravelslider) | Scrub a draggable playhead across a sparkline of past states — a time-travel state scrubber, generalized into a reusa… |
|
|
641
|
+
| [`DiffMorphView`](https://salilvnair.com/framework/dui/#/diffmorph) | Old→new text FLIP-animates unchanged words into their new position while changed words fade/strike — an edit visually… |
|
|
642
|
+
| [`SchemaBlueprintView`](https://salilvnair.com/framework/dui/#/schemablueprint) | JSON Schema / OpenAPI spec rendered as an architectural blueprint — graph-paper background, dashed right-angle connec… |
|
|
643
|
+
| [`LiveCursorPresenceView`](https://salilvnair.com/framework/dui/#/livecursorpresence) | Collaborative cursors with name tags, overlaid on arbitrary content. |
|
|
644
|
+
| [`UndoRedoTimelineView`](https://salilvnair.com/framework/dui/#/undoredotimeline) | History rendered as a branching git-log graph — jump to any node, diverging edits show as visible branches instead of… |
|
|
645
|
+
| [`DialKnobInputView`](https://salilvnair.com/framework/dui/#/dialknobinput) | Rotary analog knob (drag in a circle) with snap-ticks and a haptic-style micro-bounce at each notch — for tactile num… |
|
|
646
|
+
| [`HoldToConfirmView`](https://salilvnair.com/framework/dui/#/holdtoconfirm) | Press-and-hold with a radial fill that must complete before the destructive action fires — replaces "type DELETE to c… |
|
|
647
|
+
| [`MorphingIconButtonView`](https://salilvnair.com/framework/dui/#/morphingiconbutton) | The icon itself SVG-path-morphs between two states (play↔pause, menu↔close, sun↔moon) instead of a crossfade/swap. |
|
|
648
|
+
| [`StackedSwipeCardView`](https://salilvnair.com/framework/dui/#/stackedswipecard) | Swipeable card stack for one-at-a-time approve/reject flows. |
|
|
649
|
+
| [`NetworkWeatherView`](https://salilvnair.com/framework/dui/#/networkweather) | System health/error-rate expressed as literal weather (sunny → cloudy → stormy) instead of a number or status dot. |
|
|
650
|
+
| [`ConstellationLoaderView`](https://salilvnair.com/framework/dui/#/constellationloader) | Loading dots drift and connect into shifting constellation lines — ties back to NetworkGraphView's node-link visual i… |
|
|
651
|
+
| [`HoloCardView`](https://salilvnair.com/framework/dui/#/holocard) | A card with a mouse-position-reactive holographic/iridescent sheen — pure premium-feel "wow" for pricing/feature call… |
|
|
652
|
+
| [`GhostTypingPlaceholderView`](https://salilvnair.com/framework/dui/#/ghosttypingplaceholder) | An input placeholder that types out rotating example queries, pauses, then backspaces into the next one. |
|
|
653
|
+
| [`ConnectionPulseLineView`](https://salilvnair.com/framework/dui/#/connectionpulseline) | A dashed/gradient SVG line connecting two arbitrary DOM elements, with a traveling pulse dot — visually links spatial… |
|
|
654
|
+
| [`StackedToastDeckView`](https://salilvnair.com/framework/dui/#/stackedtoastdeck) | Toasts don't stack vertically — older ones shrink and recede behind the newest like a physical card deck; click the d… |
|
|
655
|
+
| [`PathRevealView`](https://salilvnair.com/framework/dui/#/pathreveal) | Generic SVG stroke-draw reveal primitive — any path/diagram/signature "draws itself" on mount instead of just fading in. |
|
|
656
|
+
| [`SpectrumSliderView`](https://salilvnair.com/framework/dui/#/spectrumslider) | The slider track itself is a live rendered gradient spectrum, and the handle shows a magnified live-color preview bub… |
|
|
657
|
+
| [`BreathingLoaderView`](https://salilvnair.com/framework/dui/#/breathingloader) | An ultra-minimal loading state — a single circle slowly scales/fades in a breathing rhythm — a calmer alternative to… |
|
|
140
658
|
|
|
141
659
|
</details>
|
|
142
660
|
|
|
143
661
|
<details>
|
|
144
|
-
<summary><b>More</b
|
|
662
|
+
<summary><b>More</b> (6)</summary>
|
|
663
|
+
|
|
664
|
+

|
|
145
665
|
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
`
|
|
149
|
-
|
|
666
|
+
| Component | What it is |
|
|
667
|
+
| --- | --- |
|
|
668
|
+
| [`DuiProvider (Size)`](https://salilvnair.com/framework/dui/#/duiprovider) | Wrap any subtree with <DuiProvider size="sm\|md\|lg\|xl"> and ALL nested DUI components inherit that size — no prop dril… |
|
|
669
|
+
| [`LiveColorCustomizer`](https://salilvnair.com/framework/dui/#/livecolorpanel) | Interactive color editor that applies CSS custom property changes directly to the document root in real time. |
|
|
670
|
+
| [`Patterns`](https://salilvnair.com/framework/dui/#/patterns) | How DUI components assemble into actual Daakia UI — URL bar · tabs · tree. |
|
|
671
|
+
| [`Icons Gallery`](https://salilvnair.com/framework/dui/#/iconsgallery) | All Daakia icons — searchable by name — click to copy icon name. |
|
|
672
|
+
| [`Theme Customization`](https://salilvnair.com/framework/dui/#/themeconfig) | Export / upload YAML theme files — all 63 CSS color vars, live hot-swap, no rebuild. |
|
|
673
|
+
| [`Add Theme Variable`](https://salilvnair.com/framework/dui/#/themeaddvar) | Step-by-step guide: register a new CSS color variable in SCHEMA, declare it in index.css, use it in any DUI component… |
|
|
150
674
|
|
|
151
675
|
</details>
|
|
152
676
|
|
|
677
|
+
<!-- catalog:end -->
|
|
678
|
+
|
|
153
679
|
Every component ships full TypeScript prop types — explore them via your
|
|
154
|
-
editor's autocomplete,
|
|
155
|
-
|
|
680
|
+
editor's autocomplete, in the [live demo](https://salilvnair.com/framework/dui/),
|
|
681
|
+
or by browsing `src/lib` in this repo.
|
|
682
|
+
|
|
683
|
+
---
|
|
156
684
|
|
|
157
685
|
## Theming
|
|
158
686
|
|
|
@@ -168,23 +696,26 @@ CSS-first `@theme` syntax and shipped in `dist/style.css`:
|
|
|
168
696
|
}
|
|
169
697
|
```
|
|
170
698
|
|
|
171
|
-
Override any subset on `:root` (global) or on a wrapping element (scoped —
|
|
172
|
-
|
|
173
|
-
|
|
699
|
+
Override any subset on `:root` (global) or on a wrapping element (scoped — e.g.
|
|
700
|
+
to theme one panel differently). Programmatic helpers live under the `theme/*`
|
|
701
|
+
subpath exports:
|
|
174
702
|
|
|
175
703
|
```ts
|
|
176
|
-
import { SCHEMA } from '@salilvnair/dui/theme/core';
|
|
177
|
-
import { generateYaml } from '@salilvnair/dui/theme/utils';
|
|
704
|
+
import { SCHEMA } from '@salilvnair/dui/theme/core'; // token schema (group/key/cssVar/comment)
|
|
705
|
+
import { generateYaml } from '@salilvnair/dui/theme/utils'; // export the current theme as YAML
|
|
178
706
|
import { ThemeVarEditor } from '@salilvnair/dui/theme/editor'; // UI for adding a new theme variable
|
|
179
707
|
```
|
|
180
708
|
|
|
709
|
+
Light and dark are the same mechanism: `dist/style.css` defines both sets and
|
|
710
|
+
`document.documentElement`'s `data-theme` attribute chooses between them.
|
|
711
|
+
|
|
181
712
|
## The code editor — Monaco is optional
|
|
182
713
|
|
|
183
714
|
`EditorView`, `DiffEditorView`, and `DebugEditorView` do **not** require
|
|
184
|
-
`@monaco-editor/react` or `monaco-editor` to be installed. Without them,
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
715
|
+
`@monaco-editor/react` or `monaco-editor` to be installed. Without them, these
|
|
716
|
+
components render a lightweight plain-text fallback (a styled `<textarea>` and
|
|
717
|
+
a small line-diff view) — fully functional for basic editing, just without
|
|
718
|
+
IntelliSense, breakpoints, or Monaco's diff engine.
|
|
188
719
|
|
|
189
720
|
```tsx
|
|
190
721
|
import { EditorView } from '@salilvnair/dui';
|
|
@@ -207,21 +738,21 @@ import '@salilvnair/dui/monaco-setup';
|
|
|
207
738
|
That import self-hosts Monaco: inline workers (no CDN — works under a strict
|
|
208
739
|
CSP, e.g. inside a VS Code extension webview), a VS Code–accurate dark/light
|
|
209
740
|
theme, and registration of the real editor implementation. `EditorView`
|
|
210
|
-
automatically starts rendering the Monaco-backed version the moment this
|
|
211
|
-
|
|
741
|
+
automatically starts rendering the Monaco-backed version the moment this import
|
|
742
|
+
has run; skip it and everything still works, just without Monaco.
|
|
212
743
|
|
|
213
744
|
**Why not auto-install Monaco, or fall back to a CDN?** `@monaco-editor/react`
|
|
214
745
|
defaults to lazy-loading Monaco assets from a public CDN when you don't
|
|
215
746
|
self-host — a reasonable default for a plain public web page, but wrong for
|
|
216
|
-
CSP-restricted environments (webviews, offline apps, intranets) where that
|
|
217
|
-
|
|
218
|
-
|
|
747
|
+
CSP-restricted environments (webviews, offline apps, intranets) where that CDN
|
|
748
|
+
is unreachable. Rather than silently guess, this library requires an explicit
|
|
749
|
+
opt-in (`monaco-setup`) and never attempts the CDN path at all.
|
|
219
750
|
|
|
220
751
|
**Bundle boundary, verified, not assumed:** `dist/index.js` (the main entry —
|
|
221
752
|
everything except `EditorView` internals) contains zero references to
|
|
222
|
-
`@monaco-editor/react` or `monaco-editor`. Only `dist/monaco-setup.js`
|
|
223
|
-
|
|
224
|
-
|
|
753
|
+
`@monaco-editor/react` or `monaco-editor`. Only `dist/monaco-setup.js` does.
|
|
754
|
+
This is checked as part of the release process, not just documented — see
|
|
755
|
+
[Publishing](#publishing-to-npm).
|
|
225
756
|
|
|
226
757
|
## Extending MarkdownView's language support
|
|
227
758
|
|
|
@@ -237,12 +768,15 @@ import lua from 'highlight.js/lib/languages/lua';
|
|
|
237
768
|
registerMarkdownLanguage('lua', lua); // once, at app startup
|
|
238
769
|
```
|
|
239
770
|
|
|
771
|
+
It registers on its own highlight.js instance, so it will not reconfigure a
|
|
772
|
+
parser your app is already using elsewhere.
|
|
773
|
+
|
|
240
774
|
## TypeScript
|
|
241
775
|
|
|
242
776
|
Full type declarations ship in `dist/`, generated from source — no
|
|
243
|
-
`@types/@salilvnair__dui` needed. `peerDependencies` cover `react`,
|
|
244
|
-
|
|
245
|
-
`peerDependenciesMeta.optional` peers (see above).
|
|
777
|
+
`@types/@salilvnair__dui` needed. `peerDependencies` cover `react`, `react-dom`,
|
|
778
|
+
and `zustand`; `@monaco-editor/react`, `monaco-editor`, `vis-data` and
|
|
779
|
+
`vis-network` are `peerDependenciesMeta.optional` peers (see above).
|
|
246
780
|
|
|
247
781
|
## Local development
|
|
248
782
|
|
|
@@ -250,17 +784,98 @@ Full type declarations ship in `dist/`, generated from source — no
|
|
|
250
784
|
git clone https://github.com/salilvnair/dui.git
|
|
251
785
|
cd dui
|
|
252
786
|
npm install
|
|
253
|
-
npm run dev # showcase
|
|
787
|
+
npm run dev # the showcase at localhost:5173
|
|
254
788
|
```
|
|
255
789
|
|
|
256
|
-
|
|
257
|
-
|
|
790
|
+
Every panel has an address, so you can go straight to one:
|
|
791
|
+
|
|
792
|
+
| URL | What it opens |
|
|
793
|
+
| --- | --- |
|
|
794
|
+
| `#/chips` | ChipView, on the Live tab |
|
|
795
|
+
| `#/chips/examples` | …its examples |
|
|
796
|
+
| `#/chips/docs` | …its props table |
|
|
797
|
+
| `#/chips?theme=light` | …on the light ground |
|
|
798
|
+
| `#/chips?capture=1` | the component alone, no chrome — what the catalog images are of, and what the demo site embeds |
|
|
258
799
|
|
|
259
800
|
```bash
|
|
260
|
-
npm run build # builds the showcase app
|
|
801
|
+
npm run build # builds the showcase app
|
|
802
|
+
npm run build:demo # the same, into demo-dist/ — this is what the demo site serves
|
|
261
803
|
npm run build:lib # builds the publishable library into dist/
|
|
804
|
+
npm test # vitest
|
|
262
805
|
```
|
|
263
806
|
|
|
807
|
+
### How the showcase is split
|
|
808
|
+
|
|
809
|
+
Worth knowing before adding a component, because two things here are easy to
|
|
810
|
+
undo by accident.
|
|
811
|
+
|
|
812
|
+
**Panels are lazily imported.** Each component's live view, examples and props
|
|
813
|
+
table load the first time somebody opens that panel, and Rollup groups the
|
|
814
|
+
three into one chunk per component — 236 of them, a median of 7 KB each. Adding
|
|
815
|
+
a panel means adding a `slot(() => import('…'))` entry to `PANELS`, not an
|
|
816
|
+
import at the top of the file. The eager version cost 11.4 MB before anything
|
|
817
|
+
could render.
|
|
818
|
+
|
|
819
|
+
**Monaco's workers are fetched, not inlined, in the showcase.** The published
|
|
820
|
+
`monaco-setup` builds them into the bundle as blobs, because a consumer inside
|
|
821
|
+
a VS Code webview cannot fetch a worker past the CSP. A web page can, and
|
|
822
|
+
should: inlining put `ts.worker` — the whole TypeScript compiler — base64'd
|
|
823
|
+
into the chunk that has to arrive first, about 8 MB of it. The showcase
|
|
824
|
+
therefore imports `showcase/monacoSetup`, which pairs the same
|
|
825
|
+
`monaco-setup.core` with ordinary `?worker` imports. **Do not point the
|
|
826
|
+
showcase back at `@/monaco-setup`.**
|
|
827
|
+
|
|
828
|
+
**Monaco itself is fetched in the background**, started at module scope in
|
|
829
|
+
`main.tsx` so it downloads in parallel and blocks nothing. The rule that makes
|
|
830
|
+
this safe: `@monaco-editor/react` lazy-loads Monaco *from a public CDN* unless
|
|
831
|
+
`loader.config({ monaco })` has run first, and this package's position is that
|
|
832
|
+
the CDN path is never taken — it is unreachable under a webview CSP, on an
|
|
833
|
+
intranet, or offline. So nothing mounts an editor until the library's own
|
|
834
|
+
readiness gate flips. `EditorView` and `DiffEditorView` already waited on it;
|
|
835
|
+
the playground waits on it too. **If you add a component that renders
|
|
836
|
+
`@monaco-editor/react` directly, gate it on `useMonacoRuntimeStatus()` — do not
|
|
837
|
+
render it unconditionally.**
|
|
838
|
+
|
|
839
|
+
Together these took the render path from 3.75 MB gzipped to **430 KB**, in
|
|
840
|
+
seven files. Monaco's 2.6 MB still arrives, just alongside the app instead of
|
|
841
|
+
in front of it, and only the readers who open a code panel wait on it.
|
|
842
|
+
|
|
843
|
+
## Screenshots, video and the demo site
|
|
844
|
+
|
|
845
|
+
Everything under `media/` is generated. Nothing in it is edited by hand, and
|
|
846
|
+
the scripts that make it live in `scripts/`.
|
|
847
|
+
|
|
848
|
+
| Command | What it does |
|
|
849
|
+
| --- | --- |
|
|
850
|
+
| `npm run shots` | Photographs all 281 components into `media/components/` and writes `media/components.dark.json` |
|
|
851
|
+
| `npm run shots:light` | The same on the light ground (gitignored — an intermediate for the light sheets) |
|
|
852
|
+
| `npm run sheets` | One contact sheet per group into `media/sheets/` — what the catalog above embeds |
|
|
853
|
+
| `npm run catalog` | Rewrites the catalog block in this README from the manifest |
|
|
854
|
+
| `npm run demo-video` | Records each segment against the running showcase and stitches the mp4 |
|
|
855
|
+
| `npm run demo-video:gif:short` | The short loop at the top of this file |
|
|
856
|
+
| `npm run demo-video:publish` | Copies the finished video and per-section GIFs into `media/` |
|
|
857
|
+
| `npm run showcase` | All of the video steps, in order |
|
|
858
|
+
|
|
859
|
+
The capture and video scripts drive the **running** showcase, so start it first:
|
|
860
|
+
|
|
861
|
+
```bash
|
|
862
|
+
npm run dev -- --port 5180
|
|
863
|
+
```
|
|
864
|
+
|
|
865
|
+
Two rules the scripts enforce, both learned the hard way:
|
|
866
|
+
|
|
867
|
+
- **The component list comes from the app, not from the script.** The showcase
|
|
868
|
+
publishes its sidebar as `window.__DUI_SHOWCASE__`; a hand-maintained copy of
|
|
869
|
+
281 ids goes stale silently, and the failure mode is a new component that
|
|
870
|
+
simply never gets photographed.
|
|
871
|
+
- **No unverified footage survives.** Every video segment asserts something is
|
|
872
|
+
on screen before its clip is kept. A step that quietly did nothing still
|
|
873
|
+
records perfectly good video of the app in the wrong state, and nothing
|
|
874
|
+
downstream can tell.
|
|
875
|
+
|
|
876
|
+
`npm run catalog -- --check` fails if the README's catalog no longer matches the
|
|
877
|
+
manifest, which is the version worth running in CI.
|
|
878
|
+
|
|
264
879
|
## Publishing to npm
|
|
265
880
|
|
|
266
881
|
> This section is for library maintainers.
|
|
@@ -270,14 +885,17 @@ npm run build:lib # builds the publishable library into dist/
|
|
|
270
885
|
1. Node.js 18+ and npm 9+
|
|
271
886
|
2. Publish access to the `@salilvnair` scope: `npm login`
|
|
272
887
|
|
|
273
|
-
### Step 1 — Bump the version
|
|
888
|
+
### Step 1 — Bump the version and write the changelog
|
|
274
889
|
|
|
275
890
|
```bash
|
|
276
891
|
npm version patch # bug fix: 1.0.0 -> 1.0.1
|
|
277
|
-
npm version minor
|
|
892
|
+
npm version minor # new feature: 1.0.0 -> 1.1.0
|
|
278
893
|
npm version major # breaking: 1.0.0 -> 2.0.0
|
|
279
894
|
```
|
|
280
895
|
|
|
896
|
+
Move the `Unreleased` entries in [CHANGELOG.md](./CHANGELOG.md) under the new
|
|
897
|
+
version before tagging, so the tag and the notes agree.
|
|
898
|
+
|
|
281
899
|
### Step 2 — Build
|
|
282
900
|
|
|
283
901
|
`prepublishOnly` runs this automatically on `npm publish`, but build first to
|
|
@@ -290,7 +908,7 @@ npm run build:lib
|
|
|
290
908
|
Verify `dist/` contains (at minimum): `index.js`, `index.d.ts`,
|
|
291
909
|
`monaco-setup.js`, `monaco-setup.d.ts`, `style.css`, `theme/*.js`.
|
|
292
910
|
|
|
293
|
-
**Sanity-check the Monaco boundary** —
|
|
911
|
+
**Sanity-check the Monaco boundary** — the one thing worth manually
|
|
294
912
|
re-verifying after any build config change: `dist/index.js` must contain no
|
|
295
913
|
`@monaco-editor/react` or `monaco-editor` import. Only `dist/monaco-setup.js`
|
|
296
914
|
(and its `dist/chunks/*` dependency) should reference them:
|
|
@@ -307,7 +925,7 @@ npm pack --dry-run
|
|
|
307
925
|
```
|
|
308
926
|
|
|
309
927
|
Only `dist/`, `README.md`, `LICENSE`, and `package.json` should appear — no
|
|
310
|
-
`src/`.
|
|
928
|
+
`src/`, and no `media/`.
|
|
311
929
|
|
|
312
930
|
### Step 4 — Test the tarball locally
|
|
313
931
|
|
|
@@ -319,8 +937,8 @@ npm pack
|
|
|
319
937
|
npm install /path/to/salilvnair-dui-X.Y.Z.tgz
|
|
320
938
|
```
|
|
321
939
|
|
|
322
|
-
Confirm both paths work: a component that never imports Monaco (build
|
|
323
|
-
succeed with `@monaco-editor/react`/`monaco-editor` absent from
|
|
940
|
+
Confirm both paths work: a component that never imports Monaco (the build
|
|
941
|
+
should succeed with `@monaco-editor/react`/`monaco-editor` absent from
|
|
324
942
|
node_modules), and — with those installed plus `@salilvnair/dui/monaco-setup`
|
|
325
943
|
imported — a real Monaco-backed `EditorView`.
|
|
326
944
|
|
|
@@ -334,34 +952,50 @@ npm publish --access public
|
|
|
334
952
|
npm publish --dry-run --access public
|
|
335
953
|
```
|
|
336
954
|
|
|
337
|
-
### Step 6 — Push tags
|
|
955
|
+
### Step 6 — Push tags, and refresh the demo site
|
|
338
956
|
|
|
339
957
|
```bash
|
|
340
958
|
git push && git push --tags
|
|
341
959
|
```
|
|
342
960
|
|
|
961
|
+
The demo at <https://salilvnair.com/framework/dui/> is a static build of the
|
|
962
|
+
showcase living in the
|
|
963
|
+
[salilvnair.github.io](https://github.com/salilvnair/salilvnair.github.io)
|
|
964
|
+
repo. Refresh it from there:
|
|
965
|
+
|
|
966
|
+
```bash
|
|
967
|
+
npm run sync-dui-demo # in salilvnair.github.io
|
|
968
|
+
```
|
|
969
|
+
|
|
343
970
|
### Release checklist
|
|
344
971
|
|
|
345
|
-
- [ ] `npm version` bumped
|
|
972
|
+
- [ ] `npm version` bumped, and `CHANGELOG.md` updated
|
|
346
973
|
- [ ] `npm run build:lib` succeeds
|
|
347
974
|
- [ ] `npm pack --dry-run` shows only `dist/`, `README.md`, `LICENSE`
|
|
348
975
|
- [ ] Monaco boundary check: `@monaco-editor/react`/`monaco-editor` only referenced from `monaco-setup.js` + its chunk, never `index.js`
|
|
349
976
|
- [ ] Tarball tested in a consumer app, both without and with Monaco installed
|
|
977
|
+
- [ ] `npm run shots && npm run sheets && npm run catalog` if components were added
|
|
350
978
|
- [ ] `npm publish --access public` completed
|
|
351
979
|
- [ ] `git push && git push --tags`
|
|
980
|
+
- [ ] Demo site re-synced
|
|
352
981
|
|
|
353
982
|
### Troubleshooting
|
|
354
983
|
|
|
355
984
|
**Consumer's build fails resolving `@monaco-editor/react` even though they never use `EditorView`**
|
|
356
985
|
→ Something reintroduced a static import of it into `index.js`. Re-run the
|
|
357
|
-
Monaco boundary grep in Step 2 — this is the one regression this package
|
|
358
|
-
|
|
986
|
+
Monaco boundary grep in Step 2 — this is the one regression this package must
|
|
987
|
+
never ship.
|
|
359
988
|
|
|
360
989
|
**Consumer's Monaco editor works in dev but hits a blocked CDN in production**
|
|
361
990
|
→ They installed the Monaco packages but never imported
|
|
362
|
-
`@salilvnair/dui/monaco-setup`. `EditorView` never falls back to the CDN
|
|
363
|
-
|
|
364
|
-
|
|
991
|
+
`@salilvnair/dui/monaco-setup`. `EditorView` never falls back to the CDN loader
|
|
992
|
+
on its own — it only ever renders the plain-text fallback or the self-hosted
|
|
993
|
+
Monaco registered by `monaco-setup`.
|
|
994
|
+
|
|
995
|
+
**`npm run shots` says the showcase is not answering**
|
|
996
|
+
→ The capture scripts drive the running app rather than rendering components in
|
|
997
|
+
isolation. Start `npm run dev -- --port 5180` first, or pass
|
|
998
|
+
`DUI_SHOWCASE_URL` if it is somewhere else.
|
|
365
999
|
|
|
366
1000
|
## License
|
|
367
1001
|
|