@salilvnair/dui 1.0.11 → 1.0.12
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 +686 -95
- 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 +17 -2
- 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 **238 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,559 @@ 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 238 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 238 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
|
+
**238 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
|
+
|
|
216
|
+
<details>
|
|
217
|
+
<summary><b>Inputs</b> (16)</summary>
|
|
218
|
+
|
|
219
|
+

|
|
220
|
+
|
|
221
|
+
| Component | What it is |
|
|
222
|
+
| --- | --- |
|
|
223
|
+
| [`TextInputView`](https://salilvnair.com/framework/dui/#/textinput) | Standard text input — sizes match ButtonView and SelectInputView exactly. |
|
|
224
|
+
| [`SelectInputView`](https://salilvnair.com/framework/dui/#/selectinput) | Portal dropdown with keyboard nav — replaces all StyledDropdown usages. |
|
|
225
|
+
| [`SelectTextInputView`](https://salilvnair.com/framework/dui/#/selecttextinput) | Combined method selector + URL input in one bordered pill — URL bar pattern. |
|
|
226
|
+
| [`TagInputView`](https://salilvnair.com/framework/dui/#/taginput) | Multi-value tag input — Enter or comma to add, Backspace to remove. |
|
|
227
|
+
| [`CheckboxView`](https://salilvnair.com/framework/dui/#/checkbox) | Checkbox — checked / unchecked / indeterminate / disabled — with accent colors. |
|
|
228
|
+
| [`ToggleSwitchView`](https://salilvnair.com/framework/dui/#/toggle) | On/off toggle with sm/md/lg sizes, accent color, label positions, disabled state. |
|
|
229
|
+
| [`ThemeCardSelectorView`](https://salilvnair.com/framework/dui/#/themecardselector) | Card-based theme picker with color swatch previews and checkmark selection. |
|
|
230
|
+
| [`EditorView`](https://salilvnair.com/framework/dui/#/editor) | Monaco editor wrapper — simplified props — JSON / GQL / XML / YAML etc. |
|
|
231
|
+
| [`DebugEditorView`](https://salilvnair.com/framework/dui/#/debugeditor) | Monaco editor with breakpoint gutter, paused-line highlight, and variable-hover tooltips. |
|
|
232
|
+
| [`SearchInputView`](https://salilvnair.com/framework/dui/#/searchinput) | URL-bar style search input with optional prefix icon and suffix clear button. |
|
|
233
|
+
| [`DurationInputView`](https://salilvnair.com/framework/dui/#/durationinput) | Number input with ms / s / m / hr unit selector dropdown. |
|
|
234
|
+
| [`HighlightedInputView`](https://salilvnair.com/framework/dui/#/highlightedinput) | {{variable}} highlighted URL input with autocomplete dropdown — the Daakia URL bar. |
|
|
235
|
+
| [`KeyValueTableView`](https://salilvnair.com/framework/dui/#/keyvaluetable) | KV table — toolbar · add/delete/bulk-clear · enable toggle · maskSensitive · autocompleteKeys · showDescription · pin… |
|
|
236
|
+
| [`MergedInputView`](https://salilvnair.com/framework/dui/#/mergedinput) | Unified single-border input bar — merge select dropdowns, text inputs, inline buttons, and dividers into one pill. |
|
|
237
|
+
| [`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… |
|
|
238
|
+
| [`SegmentedControlView`](https://salilvnair.com/framework/dui/#/segmentedcontrol) | Pill-shaped segmented control — solid sliding indicator with a springy bounce transition — pill / rounded / pointy sh… |
|
|
239
|
+
|
|
240
|
+
</details>
|
|
241
|
+
|
|
81
242
|
<details>
|
|
82
|
-
<summary><b>
|
|
243
|
+
<summary><b>Date & Time</b> (5)</summary>
|
|
244
|
+
|
|
245
|
+

|
|
83
246
|
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
`
|
|
87
|
-
`
|
|
88
|
-
`
|
|
247
|
+
| Component | What it is |
|
|
248
|
+
| --- | --- |
|
|
249
|
+
| [`CalendarView`](https://salilvnair.com/framework/dui/#/calendar) | Month grid calendar — single / range / multi select, min/max bounds, animated month transitions. |
|
|
250
|
+
| [`DateInputView`](https://salilvnair.com/framework/dui/#/dateinput) | Text field trigger + CalendarView popover — the standard date field pattern. |
|
|
251
|
+
| [`DateRangePickerView`](https://salilvnair.com/framework/dui/#/daterangepicker) | Range calendar + quick presets (Today / Last 7 days / Last 30 days / This month). |
|
|
252
|
+
| [`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. |
|
|
253
|
+
| [`CountdownRingView`](https://salilvnair.com/framework/dui/#/countdownring) | Circular countdown ring + digit readout — target Date or durationSeconds, onComplete callback. |
|
|
89
254
|
|
|
90
255
|
</details>
|
|
91
256
|
|
|
92
257
|
<details>
|
|
93
|
-
<summary><b>
|
|
258
|
+
<summary><b>Form & Selection</b> (14)</summary>
|
|
259
|
+
|
|
260
|
+

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

|
|
285
|
+
|
|
286
|
+
| Component | What it is |
|
|
287
|
+
| --- | --- |
|
|
288
|
+
| [`SnackbarView`](https://salilvnair.com/framework/dui/#/snackbar) | Single-line bottom bar + action, auto-dismiss timer pauses on hover — distinct from the stacked-corner ToastView. |
|
|
289
|
+
| [`BannerView`](https://salilvnair.com/framework/dui/#/banner) | Persistent dismissible top strip — info / success / warning / danger variants. |
|
|
290
|
+
| [`ProgressRingView`](https://salilvnair.com/framework/dui/#/progressring) | Circular determinate/indeterminate progress — distinct from GaugeView (metric gauge). |
|
|
291
|
+
| [`ProgressBarView`](https://salilvnair.com/framework/dui/#/progressbar) | Linear progress — buffer fill and striped-indeterminate variants. |
|
|
292
|
+
| [`SkeletonView`](https://salilvnair.com/framework/dui/#/skeleton) | Composable shimmer primitives — text / block / avatar / row — for custom loading layouts. |
|
|
293
|
+
| [`NotificationBadgeView`](https://salilvnair.com/framework/dui/#/notificationbadge) | Dot/count badge overlay anchor for icons and avatars. |
|
|
294
|
+
| [`AvatarView`](https://salilvnair.com/framework/dui/#/avatar) | Image or initials fallback, with an optional presence-status dot. |
|
|
295
|
+
| [`AvatarGroupView`](https://salilvnair.com/framework/dui/#/avatargroup) | Stacked overlapping avatars with a "+N" overflow bubble. |
|
|
296
|
+
| [`PresenceDotView`](https://salilvnair.com/framework/dui/#/presencedot) | Tiny online/away/busy/offline status primitive. |
|
|
297
|
+
| [`ConfettiBurstView`](https://salilvnair.com/framework/dui/#/confettiburst) | Canvas confetti burst triggered imperatively via ref — fire() from any event handler. |
|
|
97
298
|
|
|
98
299
|
</details>
|
|
99
300
|
|
|
100
301
|
<details>
|
|
101
302
|
<summary><b>Buttons</b> (4)</summary>
|
|
102
303
|
|
|
103
|
-
|
|
104
|
-
|
|
304
|
+

|
|
305
|
+
|
|
306
|
+
| Component | What it is |
|
|
307
|
+
| --- | --- |
|
|
308
|
+
| [`ButtonView`](https://salilvnair.com/framework/dui/#/button) | Standard button — primary / secondary / ghost / danger — all sizes. |
|
|
309
|
+
| [`IconButtonView`](https://salilvnair.com/framework/dui/#/iconbutton) | Square icon-only buttons — ghost / filled — toggle support — all sizes. |
|
|
310
|
+
| [`DropDownButtonView`](https://salilvnair.com/framework/dui/#/dropdownbutton) | Split button — primary action + chevron dropdown — Save as, Export as, etc. |
|
|
311
|
+
| [`AIButtonView`](https://salilvnair.com/framework/dui/#/aibutton) | AI action button — generate · fuzz · explain · fix · ask · suggest — loading state. |
|
|
105
312
|
|
|
106
313
|
</details>
|
|
107
314
|
|
|
108
315
|
<details>
|
|
109
|
-
<summary><b>Navigation</b> (
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
316
|
+
<summary><b>Navigation</b> (9)</summary>
|
|
317
|
+
|
|
318
|
+

|
|
319
|
+
|
|
320
|
+
| Component | What it is |
|
|
321
|
+
| --- | --- |
|
|
322
|
+
| [`TabView`](https://salilvnair.com/framework/dui/#/tabs) | pill · underline variants — sliding indicator, badges, dots — all with accentColor. |
|
|
323
|
+
| [`TabBarView`](https://salilvnair.com/framework/dui/#/tabbar) | Editor-style protocol tab bar — store-free, drag-free, scroll arrows, dirty dot. |
|
|
324
|
+
| [`ContextMenuView`](https://salilvnair.com/framework/dui/#/contextmenu) | Recursive context menu with submenus — portal rendered — collection tree style. |
|
|
325
|
+
| [`SideNavView`](https://salilvnair.com/framework/dui/#/sidenav) | Collapsible left sidebar nav with nested items and icon-only collapse mode. |
|
|
326
|
+
| [`SettingsNavView`](https://salilvnair.com/framework/dui/#/settingsnav) | Settings-style grouped nav with badges, descriptions, active state. |
|
|
327
|
+
| [`BreadcrumbView`](https://salilvnair.com/framework/dui/#/breadcrumb) | Path breadcrumb trail with overflow-collapse into a "…" for long paths. |
|
|
328
|
+
| [`PaginationView`](https://salilvnair.com/framework/dui/#/pagination) | Page number control with ellipsis collapse for long ranges. |
|
|
329
|
+
| [`DockView`](https://salilvnair.com/framework/dui/#/dock) | Floating icon dock — icons magnify as the cursor approaches. |
|
|
330
|
+
| [`FabView`](https://salilvnair.com/framework/dui/#/fab) | Floating action button — standard, extended (with label), or speed-dial with sub-actions. |
|
|
113
331
|
|
|
114
332
|
</details>
|
|
115
333
|
|
|
116
334
|
<details>
|
|
117
335
|
<summary><b>Display</b> (19)</summary>
|
|
118
336
|
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
`
|
|
124
|
-
`
|
|
337
|
+

|
|
338
|
+
|
|
339
|
+
| Component | What it is |
|
|
340
|
+
| --- | --- |
|
|
341
|
+
| [`ChipView`](https://salilvnair.com/framework/dui/#/chips) | Colored badge chips for methods, protocols, status codes, filter tags. |
|
|
342
|
+
| [`StatusIndicatorView`](https://salilvnair.com/framework/dui/#/statusindicator) | Connection status dot — idle · connecting · connected · disconnected · error. |
|
|
343
|
+
| [`LoaderView`](https://salilvnair.com/framework/dui/#/loader) | Loading states — spinner · dots · skeleton · pulse · progress-bar. |
|
|
344
|
+
| [`EmptyStateView`](https://salilvnair.com/framework/dui/#/emptystate) | Empty state placeholder with icon, title, message, and optional CTA button. |
|
|
345
|
+
| [`ColoredTextView`](https://salilvnair.com/framework/dui/#/coloredtext) | Token-colored text — HTTP status lines, gRPC codes, SOAP faults. |
|
|
346
|
+
| [`StatsCardView`](https://salilvnair.com/framework/dui/#/statscard) | Colorful metric card — value, unit, trend (up/down/neutral), subValue. |
|
|
347
|
+
| [`DottedCardView`](https://salilvnair.com/framework/dui/#/dottedcard) | Dotted-border expandable card — useful for optional config sections. |
|
|
348
|
+
| [`DataTableView`](https://salilvnair.com/framework/dui/#/datatable) | Generic sortable table — columns, striped rows, empty state, row click. |
|
|
349
|
+
| [`CodeBlockView`](https://salilvnair.com/framework/dui/#/codeblock) | Read-only code block — language label, copy button, optional line numbers. |
|
|
350
|
+
| [`PromptCardView`](https://salilvnair.com/framework/dui/#/promptcard) | Single prompt library row card — colored avatar initials, title, description, protocol badge, CUSTOM badge, hover act… |
|
|
351
|
+
| [`PromptLibraryView`](https://salilvnair.com/framework/dui/#/promptlibrary) | Full Prompt Library panel — list (search + sections + categories) + editor (avatar header + tabs + preview/edit toggl… |
|
|
352
|
+
| [`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… |
|
|
353
|
+
| [`HudView`](https://salilvnair.com/framework/dui/#/hudview) | Generic floating draggable toolbar — store-free counterpart of DebugHud. |
|
|
354
|
+
| [`JsonTreeView`](https://salilvnair.com/framework/dui/#/jsontree) | Recursive JSON / object / array value tree with editor-style token colors. |
|
|
355
|
+
| [`ExpandableLogEntryView`](https://salilvnair.com/framework/dui/#/logentry) | Expandable log row with icon, title, colored badge, timestamp chip, and chevron. |
|
|
356
|
+
| [`CopyButtonView`](https://salilvnair.com/framework/dui/#/copybutton) | Icon-only button that copies text to clipboard. |
|
|
357
|
+
| [`MarkdownView`](https://salilvnair.com/framework/dui/#/markdownview) | Renders Markdown (GFM) with syntax-highlighted code blocks, inline code, tables, task lists, blockquotes, and copy-bu… |
|
|
358
|
+
| [`FormDataTableView`](https://salilvnair.com/framework/dui/#/formdatatable) | Multipart/form-data key-value table with file upload support. |
|
|
359
|
+
| [`YamlKeyChip`](https://salilvnair.com/framework/dui/#/yamlkeychip) | Compact type-labeled chip for YAML/JSON keys. |
|
|
360
|
+
|
|
361
|
+
</details>
|
|
362
|
+
|
|
363
|
+
<details>
|
|
364
|
+
<summary><b>Overlays</b> (9)</summary>
|
|
365
|
+
|
|
366
|
+

|
|
367
|
+
|
|
368
|
+
| Component | What it is |
|
|
369
|
+
| --- | --- |
|
|
370
|
+
| [`ModalView`](https://salilvnair.com/framework/dui/#/modal) | Configurable modal — sm/md/lg/xl — never closes on backdrop click. |
|
|
371
|
+
| [`InfoPopupView`](https://salilvnair.com/framework/dui/#/infopopup) | Help popup anchored near a ? |
|
|
372
|
+
| [`ToastView`](https://salilvnair.com/framework/dui/#/toast) | Toast notification stack — success · error · warning · info — auto-dismiss. |
|
|
373
|
+
| [`PopoverView`](https://salilvnair.com/framework/dui/#/popover) | Generic anchored floating-content primitive — the positioning engine behind SelectInputView/InfoPopupView, exposed st… |
|
|
374
|
+
| [`TooltipView`](https://salilvnair.com/framework/dui/#/tooltip) | Hover/focus tooltip primitive — top/bottom/left/right placement, configurable delay. |
|
|
375
|
+
| [`DrawerView`](https://salilvnair.com/framework/dui/#/drawer) | Slide-in overlay panel from any edge, with backdrop — navigation-drawer pattern. |
|
|
376
|
+
| [`ActionSheetView`](https://salilvnair.com/framework/dui/#/actionsheet) | Bottom list of actions + destructive styling + cancel. |
|
|
377
|
+
| [`BottomSheetView`](https://salilvnair.com/framework/dui/#/bottomsheet) | Drag-to-dismiss mobile sheet — distinct from the persistent, resizable BottomPanelView. |
|
|
378
|
+
| [`SpotlightTourView`](https://salilvnair.com/framework/dui/#/spotlighttour) | Coach-mark onboarding — spotlight cutout around a target selector + step tooltip + progress dots. |
|
|
379
|
+
|
|
380
|
+
</details>
|
|
381
|
+
|
|
382
|
+
<details>
|
|
383
|
+
<summary><b>Layout</b> (22)</summary>
|
|
384
|
+
|
|
385
|
+

|
|
386
|
+
|
|
387
|
+
| Component | What it is |
|
|
388
|
+
| --- | --- |
|
|
389
|
+
| [`ResizablePanelView`](https://salilvnair.com/framework/dui/#/resizablepanel) | Single-pane panel with bottom-edge drag handle to resize height — no store dependency. |
|
|
390
|
+
| [`SplitPanelView`](https://salilvnair.com/framework/dui/#/splitpanel) | Split-pane container — horizontal or vertical — drag pill, double-click to reset. |
|
|
391
|
+
| [`BottomPanelView`](https://salilvnair.com/framework/dui/#/bottompanel) | DevTools-style resizable bottom panel with tab bar and collapse toggle. |
|
|
392
|
+
| [`FeatureCategoryView`](https://salilvnair.com/framework/dui/#/featurecategory) | Expandable feature category with toggle switches and enabled count badge. |
|
|
393
|
+
| [`CollapsibleSectionView`](https://salilvnair.com/framework/dui/#/collapsiblesection) | Expandable section with chevron toggle, colored chip title, count badge, and a right-side action slot. |
|
|
394
|
+
| [`SpacerView`](https://salilvnair.com/framework/dui/#/spacerview) | Thin divider line for separating groups in icon rails, toolbars, or any flex container. |
|
|
395
|
+
| [`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… |
|
|
396
|
+
| [`DebugView`](https://salilvnair.com/framework/dui/#/debugview) | Editor-style Run & Debug sidebar panel — Variables (scoped tree), Watch expressions, Call Stack, Breakpoints. |
|
|
397
|
+
| [`HeroView`](https://salilvnair.com/framework/dui/#/hero) | Banner section — title/subtitle/CTA, size-driven min-height. |
|
|
398
|
+
| [`LevelView`](https://salilvnair.com/framework/dui/#/level) | Space-between horizontal toolbar row primitive. |
|
|
399
|
+
| [`MediaObjectView`](https://salilvnair.com/framework/dui/#/mediaobject) | Avatar/icon + content + actions row. |
|
|
400
|
+
| [`TileGridView`](https://salilvnair.com/framework/dui/#/tilegrid) | Nested ancestor/parent/child tile grid. |
|
|
401
|
+
| [`PanelListView`](https://salilvnair.com/framework/dui/#/panellist) | Heading + tabs + filterable block list. |
|
|
402
|
+
| [`NavbarView`](https://salilvnair.com/framework/dui/#/navbar) | Top app bar — brand, link menu, burger collapse on narrow widths. |
|
|
403
|
+
| [`AffixView`](https://salilvnair.com/framework/dui/#/affix) | Sticky-on-scroll wrapper — pins once it reaches offsetTop. |
|
|
404
|
+
| [`AnchorView`](https://salilvnair.com/framework/dui/#/anchor) | Scroll-spy in-page navigation — highlights the section in view, click to jump. |
|
|
405
|
+
| [`StickyHeaderView`](https://salilvnair.com/framework/dui/#/stickyheader) | Sticky section header that grows a shadow once pinned. |
|
|
406
|
+
| [`AspectRatioView`](https://salilvnair.com/framework/dui/#/aspectratio) | Fixed aspect-ratio box for image/video containers. |
|
|
407
|
+
| [`MasonryGridView`](https://salilvnair.com/framework/dui/#/masonrygrid) | Pinterest-style column-balanced layout — pure CSS columns, no JS measurement. |
|
|
408
|
+
| [`ScrollAreaView`](https://salilvnair.com/framework/dui/#/scrollarea) | Custom accent-tinted scrollbar container primitive. |
|
|
409
|
+
| [`BackToTopView`](https://salilvnair.com/framework/dui/#/backtotop) | Floating scroll-to-top button — fades in past a scroll threshold. |
|
|
410
|
+
| [`WatermarkView`](https://salilvnair.com/framework/dui/#/watermark) | Repeated diagonal text/logo overlay. |
|
|
411
|
+
|
|
412
|
+
</details>
|
|
413
|
+
|
|
414
|
+
<details>
|
|
415
|
+
<summary><b>Data & Enterprise</b> (14)</summary>
|
|
416
|
+
|
|
417
|
+

|
|
418
|
+
|
|
419
|
+
| Component | What it is |
|
|
420
|
+
| --- | --- |
|
|
421
|
+
| [`DescriptionsView`](https://salilvnair.com/framework/dui/#/descriptions) | Read-only label/value grid for entity detail views. |
|
|
422
|
+
| [`StatisticView`](https://salilvnair.com/framework/dui/#/statistic) | Inline animated big-number stat with prefix/suffix. |
|
|
423
|
+
| [`ResultView`](https://salilvnair.com/framework/dui/#/result) | Full-page outcome state — success / error / 404 / 403 / warning / info. |
|
|
424
|
+
| [`CascaderView`](https://salilvnair.com/framework/dui/#/cascader) | Multi-level cascading select — region/category trees. |
|
|
425
|
+
| [`ComboBoxView`](https://salilvnair.com/framework/dui/#/combobox) | Free-text input + filtered dropdown suggestions — autocomplete pattern. |
|
|
426
|
+
| [`ListView`](https://salilvnair.com/framework/dui/#/listview) | Generic avatar/title/subtitle/action list primitive. |
|
|
427
|
+
| [`VirtualizedListView`](https://salilvnair.com/framework/dui/#/virtualizedlist) | Windowed rendering for large lists — only mounts rows in (or near) the viewport. |
|
|
428
|
+
| [`StickyTableHeaderView`](https://salilvnair.com/framework/dui/#/stickytableheader) | Sticky header + optional frozen first column for wide/tall tables. |
|
|
429
|
+
| [`TablePaginationView`](https://salilvnair.com/framework/dui/#/tablepagination) | Rows-per-page selector + page-number footer. |
|
|
430
|
+
| [`FilterBarView`](https://salilvnair.com/framework/dui/#/filterbar) | Chip-based row of active filters with a clear-all action. |
|
|
431
|
+
| [`SortableHeaderView`](https://salilvnair.com/framework/dui/#/sortableheader) | Clickable table column header with a sort-direction arrow indicator. |
|
|
432
|
+
| [`EditableCellView`](https://salilvnair.com/framework/dui/#/editablecell) | Click-to-edit table cell — Enter commits, Escape cancels. |
|
|
433
|
+
| [`DataGridToolbarView`](https://salilvnair.com/framework/dui/#/datagridtoolbar) | Table toolbar — search + column-visibility + density cycle + export. |
|
|
434
|
+
| [`ColumnVisibilityMenuView`](https://salilvnair.com/framework/dui/#/columnvisibility) | Checkbox menu to toggle table column visibility. |
|
|
435
|
+
|
|
436
|
+
</details>
|
|
437
|
+
|
|
438
|
+
<details>
|
|
439
|
+
<summary><b>Advanced Selection</b> (13)</summary>
|
|
440
|
+
|
|
441
|
+

|
|
442
|
+
|
|
443
|
+
| Component | What it is |
|
|
444
|
+
| --- | --- |
|
|
445
|
+
| [`KbdView`](https://salilvnair.com/framework/dui/#/kbd) | Hotkey hint chip, composes multiple keys with a "+" separator. |
|
|
446
|
+
| [`WizardStepperView`](https://salilvnair.com/framework/dui/#/wizardstepper) | Multi-step form wizard progress header. |
|
|
447
|
+
| [`AccordionGroupView`](https://salilvnair.com/framework/dui/#/accordiongroup) | Managed single/multi-open accordion group, built on CollapsibleSectionView. |
|
|
448
|
+
| [`SegmentedProgressBarView`](https://salilvnair.com/framework/dui/#/segmentedprogressbar) | Multi-segment progress — e.g. |
|
|
449
|
+
| [`ChecklistView`](https://salilvnair.com/framework/dui/#/checklist) | Todo-style checklist — strikethrough + faded once complete. |
|
|
450
|
+
| [`PriorityPickerView`](https://salilvnair.com/framework/dui/#/prioritypicker) | Low/medium/high/urgent selector with color-coded dots. |
|
|
451
|
+
| [`TagCloudView`](https://salilvnair.com/framework/dui/#/tagcloud) | Weighted tag cloud — font size scales with relative weight. |
|
|
452
|
+
| [`RangeSliderView`](https://salilvnair.com/framework/dui/#/rangeslider) | Dual-handle min/max range — distinct from the single-handle SliderView. |
|
|
453
|
+
| [`VoteWidgetView`](https://salilvnair.com/framework/dui/#/votewidget) | Upvote/downvote counter control. |
|
|
454
|
+
| [`LikeButtonView`](https://salilvnair.com/framework/dui/#/likebutton) | Animated heart/like toggle button — pop animation on like. |
|
|
455
|
+
| [`BookmarkButtonView`](https://salilvnair.com/framework/dui/#/bookmarkbutton) | Animated bookmark/save toggle button. |
|
|
456
|
+
| [`FollowButtonView`](https://salilvnair.com/framework/dui/#/followbutton) | Follow/following state-toggle button — reveals "Unfollow" on hover. |
|
|
457
|
+
| [`ShortcutRecorderView`](https://salilvnair.com/framework/dui/#/shortcutrecorder) | Captures a keybinding — click to record, press keys, renders via KbdView. |
|
|
458
|
+
|
|
459
|
+
</details>
|
|
460
|
+
|
|
461
|
+
<details>
|
|
462
|
+
<summary><b>Communication & Content</b> (14)</summary>
|
|
463
|
+
|
|
464
|
+

|
|
465
|
+
|
|
466
|
+
| Component | What it is |
|
|
467
|
+
| --- | --- |
|
|
468
|
+
| [`MessageBubbleView`](https://salilvnair.com/framework/dui/#/messagebubble) | Chat message bubble — sent (right, filled) / received (left, neutral). |
|
|
469
|
+
| [`ChatInputView`](https://salilvnair.com/framework/dui/#/chatinput) | Message composer — auto-growing textarea + attach + send. |
|
|
470
|
+
| [`TypingIndicatorView`](https://salilvnair.com/framework/dui/#/typingindicator) | Animated "…is typing" dots. |
|
|
471
|
+
| [`CommentThreadView`](https://salilvnair.com/framework/dui/#/commentthread) | Nested comment thread with reply action — GitHub/PR-style. |
|
|
472
|
+
| [`NotificationCenterView`](https://salilvnair.com/framework/dui/#/notificationcenter) | Bell icon + dropdown notification list, unread-count badge. |
|
|
473
|
+
| [`AlertDialogView`](https://salilvnair.com/framework/dui/#/alertdialog) | Pre-built confirm/cancel dialog with danger styling — the standard "Are you sure?" pattern. |
|
|
474
|
+
| [`FeedbackWidgetView`](https://salilvnair.com/framework/dui/#/feedbackwidget) | Thumbs up/down + optional comment micro-survey. |
|
|
475
|
+
| [`NpsSurveyView`](https://salilvnair.com/framework/dui/#/npssurvey) | 0-10 Net Promoter Score picker with an optional follow-up text field. |
|
|
476
|
+
| [`ShareSheetView`](https://salilvnair.com/framework/dui/#/sharesheet) | Social share row + copy-link field. |
|
|
477
|
+
| [`ContactCardView`](https://salilvnair.com/framework/dui/#/contactcard) | Avatar + name + role + contact-icon row card. |
|
|
478
|
+
| [`ArticleCardView`](https://salilvnair.com/framework/dui/#/articlecard) | Image + title + excerpt + meta preview card — blog/article listing. |
|
|
479
|
+
| [`FaqAccordionView`](https://salilvnair.com/framework/dui/#/faqaccordion) | Pre-styled Q&A accordion, built directly on AccordionGroupView. |
|
|
480
|
+
| [`MessageBannerView`](https://salilvnair.com/framework/dui/#/messagebanner) | Inline success/error/info/warning message strip. |
|
|
481
|
+
| [`QuoteBlockView`](https://salilvnair.com/framework/dui/#/quoteblock) | Styled blockquote with an optional avatar + attribution line. |
|
|
482
|
+
|
|
483
|
+
</details>
|
|
484
|
+
|
|
485
|
+
<details>
|
|
486
|
+
<summary><b>Enterprise & Settings</b> (24)</summary>
|
|
487
|
+
|
|
488
|
+

|
|
489
|
+
|
|
490
|
+
| Component | What it is |
|
|
491
|
+
| --- | --- |
|
|
492
|
+
| [`SettingsRowView`](https://salilvnair.com/framework/dui/#/settingsrow) | Label + description + control row — the standard settings-page primitive. |
|
|
493
|
+
| [`SettingsSectionView`](https://salilvnair.com/framework/dui/#/settingssection) | Grouped settings card with a header — pairs with SettingsRowView. |
|
|
494
|
+
| [`OnboardingChecklistView`](https://salilvnair.com/framework/dui/#/onboardingchecklist) | Collapsible "getting started" progress checklist. |
|
|
495
|
+
| [`KeyValueListView`](https://salilvnair.com/framework/dui/#/keyvaluelist) | Lightweight label:value stacked list — no edit, no toolbar. |
|
|
496
|
+
| [`EnvironmentBadgeView`](https://salilvnair.com/framework/dui/#/environmentbadge) | Colored environment chip with an optional pulsing live indicator. |
|
|
497
|
+
| [`VersionBadgeView`](https://salilvnair.com/framework/dui/#/versionbadge) | Version number chip with an "update available" dot indicator. |
|
|
498
|
+
| [`LicenseBadgeView`](https://salilvnair.com/framework/dui/#/licensebadge) | Plan/tier ribbon badge — Free / Pro / Enterprise. |
|
|
499
|
+
| [`UsageMeterView`](https://salilvnair.com/framework/dui/#/usagemeter) | Quota bar (used/limit) with warning-color thresholds. |
|
|
500
|
+
| [`PermissionMatrixView`](https://salilvnair.com/framework/dui/#/permissionmatrix) | Role x permission checkbox grid. |
|
|
501
|
+
| [`AuditLogRowView`](https://salilvnair.com/framework/dui/#/auditlogrow) | Timestamped actor+action+target log row — audit trail primitive. |
|
|
502
|
+
| [`WebhookStatusView`](https://salilvnair.com/framework/dui/#/webhookstatus) | Webhook endpoint health row — last delivery, status code, retry action. |
|
|
503
|
+
| [`ApiKeyRowView`](https://salilvnair.com/framework/dui/#/apikeyrow) | Masked API key row with reveal/copy/revoke actions. |
|
|
504
|
+
| [`RateLimitMeterView`](https://salilvnair.com/framework/dui/#/ratelimitmeter) | Requests-remaining ring gauge with a reset countdown label. |
|
|
505
|
+
| [`EmptyInboxView`](https://salilvnair.com/framework/dui/#/emptyinbox) | Zero-notifications empty state — pre-styled variant of EmptyStateView. |
|
|
506
|
+
| [`FeatureSpotlightBadgeView`](https://salilvnair.com/framework/dui/#/featurespotlightbadge) | Pulsing "New" badge for recently shipped features. |
|
|
507
|
+
| [`CookieConsentBannerView`](https://salilvnair.com/framework/dui/#/cookieconsentbanner) | Fixed bottom cookie-consent bar with accept/customize actions. |
|
|
508
|
+
| [`MaintenanceBannerView`](https://salilvnair.com/framework/dui/#/maintenancebanner) | Scheduled-downtime notice strip. |
|
|
509
|
+
| [`TrialCountdownBannerView`](https://salilvnair.com/framework/dui/#/trialcountdownbanner) | "N days left in trial" strip with an upgrade CTA. |
|
|
510
|
+
| [`TeamMemberRowView`](https://salilvnair.com/framework/dui/#/teammemberrow) | Avatar + name + role + remove-action row — team management list item. |
|
|
511
|
+
| [`InviteInputView`](https://salilvnair.com/framework/dui/#/inviteinput) | Email-chip input specialized for multi-invite forms. |
|
|
512
|
+
| [`RoleSelectView`](https://salilvnair.com/framework/dui/#/roleselect) | Role dropdown with a per-option description shown beneath the label. |
|
|
513
|
+
| [`IntegrationCardView`](https://salilvnair.com/framework/dui/#/integrationcard) | Logo + name + connect/disconnect card — integrations/marketplace listing. |
|
|
514
|
+
| [`StatusPageRowView`](https://salilvnair.com/framework/dui/#/statuspagerow) | Service + uptime% + status-dot row — status page primitive. |
|
|
515
|
+
| [`ChangelogEntryView`](https://salilvnair.com/framework/dui/#/changelogentry) | Version + date + change-type badges + description block. |
|
|
125
516
|
|
|
126
517
|
</details>
|
|
127
518
|
|
|
128
519
|
<details>
|
|
129
|
-
<summary><b>
|
|
520
|
+
<summary><b>Media & Files</b> (12)</summary>
|
|
521
|
+
|
|
522
|
+

|
|
523
|
+
|
|
524
|
+
| Component | What it is |
|
|
525
|
+
| --- | --- |
|
|
526
|
+
| [`ImageGalleryView`](https://salilvnair.com/framework/dui/#/imagegallery) | Grid gallery with a click-to-open lightbox — prev/next navigation, Escape to close. |
|
|
527
|
+
| [`ImageCropperView`](https://salilvnair.com/framework/dui/#/imagecropper) | Drag-crop + zoom image editor — fixed crop frame, pannable/zoomable image. |
|
|
528
|
+
| [`VideoPlayerView`](https://salilvnair.com/framework/dui/#/videoplayer) | Custom video controls wrapper — play/pause, seek, volume. |
|
|
529
|
+
| [`AudioWaveformView`](https://salilvnair.com/framework/dui/#/audiowaveform) | Static or animated waveform visualization primitive. |
|
|
530
|
+
| [`AudioPlayerView`](https://salilvnair.com/framework/dui/#/audioplayer) | Waveform + play/pause/seek audio player. |
|
|
531
|
+
| [`PdfViewerView`](https://salilvnair.com/framework/dui/#/pdfviewer) | Paginated PDF preview wrapper — browser native iframe renderer (needs a real PDF URL in production). |
|
|
532
|
+
| [`FileIconView`](https://salilvnair.com/framework/dui/#/fileicon) | Extension-based file-type icon + name + size row. |
|
|
533
|
+
| [`FileListView`](https://salilvnair.com/framework/dui/#/filelist) | Uploaded-files list with per-row progress and remove action. |
|
|
534
|
+
| [`DragHandleView`](https://salilvnair.com/framework/dui/#/draghandle) | Grab-handle primitive for reorderable lists — six-dot grip icon. |
|
|
535
|
+
| [`SignaturePadView`](https://salilvnair.com/framework/dui/#/signaturepad) | Canvas signature capture — draw with mouse/touch/pen, exports a PNG data URL. |
|
|
536
|
+
| [`BarcodeView`](https://salilvnair.com/framework/dui/#/barcode) | Deterministic bar-pattern generator, visually representative — not a scannable encoder. |
|
|
537
|
+
| [`ImageZoomView`](https://salilvnair.com/framework/dui/#/imagezoom) | Click-to-zoom lightbox for a single image. |
|
|
130
538
|
|
|
131
|
-
|
|
539
|
+
</details>
|
|
540
|
+
|
|
541
|
+
<details>
|
|
542
|
+
<summary><b>Data Display & Wow</b> (15)</summary>
|
|
543
|
+
|
|
544
|
+

|
|
545
|
+
|
|
546
|
+
| Component | What it is |
|
|
547
|
+
| --- | --- |
|
|
548
|
+
| [`TimelineView`](https://salilvnair.com/framework/dui/#/timeline) | Event trail with icon nodes — vertical (default) or horizontal. |
|
|
549
|
+
| [`ActivityFeedView`](https://salilvnair.com/framework/dui/#/activityfeed) | Chronological activity feed, entries grouped by day. |
|
|
550
|
+
| [`KanbanBoardView`](https://salilvnair.com/framework/dui/#/kanbanboard) | Draggable columns + cards board, native HTML5 drag-and-drop. |
|
|
551
|
+
| [`SparklineView`](https://salilvnair.com/framework/dui/#/sparkline) | Tiny inline SVG trend line, no axes — for table cells / stat cards. |
|
|
552
|
+
| [`HeatmapCalendarView`](https://salilvnair.com/framework/dui/#/heatmapcalendar) | GitHub-style contribution heatmap — day cells shaded by count, tooltip on hover. |
|
|
553
|
+
| [`ComparisonSliderView`](https://salilvnair.com/framework/dui/#/comparisonslider) | Before/after drag slider for image comparison. |
|
|
554
|
+
| [`CarouselView`](https://salilvnair.com/framework/dui/#/carousel) | Swipeable card carousel with dot indicators — autoplay pauses on hover. |
|
|
555
|
+
| [`QRCodeView`](https://salilvnair.com/framework/dui/#/qrcode) | QR-style module grid with finder-pattern corners — visual, not spec-compliant/scannable. |
|
|
556
|
+
| [`StatTrendCardView`](https://salilvnair.com/framework/dui/#/stattrendcard) | Animated count-up number + sparkline trend — distinct from the static StatsCardView. |
|
|
557
|
+
| [`PricingCardView`](https://salilvnair.com/framework/dui/#/pricingcard) | Plan comparison card with a "popular" ribbon. |
|
|
558
|
+
| [`TestimonialCardView`](https://salilvnair.com/framework/dui/#/testimonialcard) | Quote + avatar testimonial card. |
|
|
559
|
+
| [`RatingBreakdownView`](https://salilvnair.com/framework/dui/#/ratingbreakdown) | 5-star rating distribution bars — App Store-style rating breakdown. |
|
|
560
|
+
| [`TreeSelectView`](https://salilvnair.com/framework/dui/#/treeselect) | Checkbox-driven hierarchical select — tri-state parent checkboxes over a folder-style tree. |
|
|
561
|
+
| [`RichTextToolbarView`](https://salilvnair.com/framework/dui/#/richtexttoolbar) | Formatting toolbar primitive — bold/italic/underline/link/list/code. |
|
|
562
|
+
| [`MentionInputView`](https://salilvnair.com/framework/dui/#/mentioninput) | @mention autocomplete textarea. |
|
|
132
563
|
|
|
133
564
|
</details>
|
|
134
565
|
|
|
135
566
|
<details>
|
|
136
|
-
<summary><b>
|
|
567
|
+
<summary><b>Fun & Micro-interactions</b> (10)</summary>
|
|
568
|
+
|
|
569
|
+

|
|
570
|
+
|
|
571
|
+
| Component | What it is |
|
|
572
|
+
| --- | --- |
|
|
573
|
+
| [`GradientTextView`](https://salilvnair.com/framework/dui/#/gradienttext) | Animated gradient-shifting text. |
|
|
574
|
+
| [`TypewriterTextView`](https://salilvnair.com/framework/dui/#/typewritertext) | Animated typing-effect text. |
|
|
575
|
+
| [`CountUpNumberView`](https://salilvnair.com/framework/dui/#/countupnumber) | Standalone animated number count-up primitive. |
|
|
576
|
+
| [`MagneticButtonView`](https://salilvnair.com/framework/dui/#/magneticbutton) | Cursor-attraction hover button effect. |
|
|
577
|
+
| [`TiltCardView`](https://salilvnair.com/framework/dui/#/tiltcard) | 3D perspective tilt-on-hover card. |
|
|
578
|
+
| [`ParticleBackgroundView`](https://salilvnair.com/framework/dui/#/particlebackground) | Subtle animated particle/dot background. |
|
|
579
|
+
| [`GlowBorderView`](https://salilvnair.com/framework/dui/#/glowborder) | Animated gradient glowing-border wrapper. |
|
|
580
|
+
| [`RevealOnScrollView`](https://salilvnair.com/framework/dui/#/revealonscroll) | Fade/slide-in-on-scroll wrapper. |
|
|
581
|
+
| [`FloatingLabelInputView`](https://salilvnair.com/framework/dui/#/floatinglabelinput) | Floating-label input, distinct from TextInputView's static placeholder. |
|
|
582
|
+
| [`PulseDotView`](https://salilvnair.com/framework/dui/#/pulsedot) | Attention-grabbing pulsing dot primitive — complements StatusIndicatorView. |
|
|
583
|
+
|
|
584
|
+
</details>
|
|
137
585
|
|
|
138
|
-
|
|
139
|
-
|
|
586
|
+
<details>
|
|
587
|
+
<summary><b>DUI Signature Series</b> (22)</summary>
|
|
588
|
+
|
|
589
|
+

|
|
590
|
+
|
|
591
|
+
| Component | What it is |
|
|
592
|
+
| --- | --- |
|
|
593
|
+
| [`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… |
|
|
594
|
+
| [`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… |
|
|
595
|
+
| [`AIStreamingTextView`](https://salilvnair.com/framework/dui/#/aistreamingtext) | Token-by-token LLM output renderer — per-token fade-in, thinking shimmer, soft blink cursor. |
|
|
596
|
+
| [`CommandOrbView`](https://salilvnair.com/framework/dui/#/commandorb) | Floating, breathing circular AI-assistant orb — idle pulse → thinking ripple → speaking waveform, expands into a chat… |
|
|
597
|
+
| [`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… |
|
|
598
|
+
| [`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… |
|
|
599
|
+
| [`SchemaBlueprintView`](https://salilvnair.com/framework/dui/#/schemablueprint) | JSON Schema / OpenAPI spec rendered as an architectural blueprint — graph-paper background, dashed right-angle connec… |
|
|
600
|
+
| [`LiveCursorPresenceView`](https://salilvnair.com/framework/dui/#/livecursorpresence) | Collaborative cursors with name tags, overlaid on arbitrary content. |
|
|
601
|
+
| [`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… |
|
|
602
|
+
| [`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… |
|
|
603
|
+
| [`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… |
|
|
604
|
+
| [`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. |
|
|
605
|
+
| [`StackedSwipeCardView`](https://salilvnair.com/framework/dui/#/stackedswipecard) | Swipeable card stack for one-at-a-time approve/reject flows. |
|
|
606
|
+
| [`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. |
|
|
607
|
+
| [`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… |
|
|
608
|
+
| [`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… |
|
|
609
|
+
| [`GhostTypingPlaceholderView`](https://salilvnair.com/framework/dui/#/ghosttypingplaceholder) | An input placeholder that types out rotating example queries, pauses, then backspaces into the next one. |
|
|
610
|
+
| [`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… |
|
|
611
|
+
| [`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… |
|
|
612
|
+
| [`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. |
|
|
613
|
+
| [`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… |
|
|
614
|
+
| [`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
615
|
|
|
141
616
|
</details>
|
|
142
617
|
|
|
143
618
|
<details>
|
|
144
|
-
<summary><b>More</b
|
|
619
|
+
<summary><b>More</b> (6)</summary>
|
|
145
620
|
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
621
|
+

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