@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.
Files changed (108) hide show
  1. package/README.md +730 -96
  2. package/dist/index.js +3726 -3713
  3. package/dist/index.js.map +1 -1
  4. package/dist/lib/components/input/select-position.d.ts +54 -0
  5. package/dist/monaco-setup.core.d.ts +4 -0
  6. package/dist/monaco-setup.d.ts +1 -4
  7. package/dist/monaco-setup.js +19 -19
  8. package/dist/monaco-setup.js.map +1 -1
  9. package/dist/style.css +1 -1
  10. package/package.json +20 -3
  11. package/dist/assets/DuiShowcase-BOtwgwbq.css +0 -1
  12. package/dist/assets/DuiShowcase-Bl4Oi2Vw.js +0 -74723
  13. package/dist/assets/abap-DLDM7-KI.js +0 -1
  14. package/dist/assets/apex-DNDY2TF8.js +0 -1
  15. package/dist/assets/azcli-Y6nb8tq_.js +0 -1
  16. package/dist/assets/bat-BwHxbl9M.js +0 -1
  17. package/dist/assets/bicep-CFznDFnq.js +0 -2
  18. package/dist/assets/cameligo-Bf6VGUru.js +0 -1
  19. package/dist/assets/clojure-Dnu-v4kV.js +0 -1
  20. package/dist/assets/codicon-ngg6Pgfi.ttf +0 -0
  21. package/dist/assets/coffee-Bd8akH9Z.js +0 -1
  22. package/dist/assets/cpp-BbWJElDN.js +0 -1
  23. package/dist/assets/csharp-Co3qMtFm.js +0 -1
  24. package/dist/assets/csp-D-4FJmMZ.js +0 -1
  25. package/dist/assets/css-DdJfP1eB.js +0 -3
  26. package/dist/assets/css.worker-B4z49cGk.js +0 -93
  27. package/dist/assets/cssMode-CZYOZ1AO.js +0 -1
  28. package/dist/assets/cypher-cTPe9QuQ.js +0 -1
  29. package/dist/assets/dart-BOtBlQCF.js +0 -1
  30. package/dist/assets/dockerfile-BG73LgW2.js +0 -1
  31. package/dist/assets/ecl-BEgZUVRK.js +0 -1
  32. package/dist/assets/elixir-BkW5O-1t.js +0 -1
  33. package/dist/assets/flow9-BeJ5waoc.js +0 -1
  34. package/dist/assets/freemarker2-CGSa1nHJ.js +0 -3
  35. package/dist/assets/fsharp-PahG7c26.js +0 -1
  36. package/dist/assets/go-acbASCJo.js +0 -1
  37. package/dist/assets/graphql-BxJiqAUM.js +0 -1
  38. package/dist/assets/handlebars-mB8dxbcs.js +0 -1
  39. package/dist/assets/hcl-DtV1sZF8.js +0 -1
  40. package/dist/assets/html-l7YRKuHI.js +0 -1
  41. package/dist/assets/html.worker-DtiGdgqp.js +0 -470
  42. package/dist/assets/htmlMode-CuoiFE2t.js +0 -1
  43. package/dist/assets/index-Dylj6yGs.css +0 -10
  44. package/dist/assets/index-ROymQLGX.js +0 -50
  45. package/dist/assets/ini-Kd9XrMLS.js +0 -1
  46. package/dist/assets/java-CXBNlu9o.js +0 -1
  47. package/dist/assets/javascript-9UYwmKgx.js +0 -1
  48. package/dist/assets/json.worker-leyajbqV.js +0 -58
  49. package/dist/assets/jsonMode-6uegdfHj.js +0 -7
  50. package/dist/assets/julia-cl7-CwDS.js +0 -1
  51. package/dist/assets/kotlin-s7OhZKlX.js +0 -1
  52. package/dist/assets/less-9HpZscsL.js +0 -2
  53. package/dist/assets/lexon-OrD6JF1K.js +0 -1
  54. package/dist/assets/liquid-C8P3CEDc.js +0 -1
  55. package/dist/assets/lspLanguageFeatures-Ju8ugRgx.js +0 -4
  56. package/dist/assets/lua-Cyyb5UIc.js +0 -1
  57. package/dist/assets/m3-B8OfTtLu.js +0 -1
  58. package/dist/assets/markdown-BFxVWTOG.js +0 -1
  59. package/dist/assets/mdx-D4_p5PzA.js +0 -1
  60. package/dist/assets/mips-CiqrrVzr.js +0 -1
  61. package/dist/assets/monaco-editor-CN2OOCze.js +0 -908
  62. package/dist/assets/monaco-editor-qiF_U8vl.css +0 -1
  63. package/dist/assets/msdax-DmeGPVcC.js +0 -1
  64. package/dist/assets/mysql-C_tMU-Nz.js +0 -1
  65. package/dist/assets/objective-c-BDtDVThU.js +0 -1
  66. package/dist/assets/pascal-vHIfCaH5.js +0 -1
  67. package/dist/assets/pascaligo-DtZ0uQbO.js +0 -1
  68. package/dist/assets/perl-Ub6l9XKa.js +0 -1
  69. package/dist/assets/pgsql-BlNEE0v7.js +0 -1
  70. package/dist/assets/php-BBUBE1dy.js +0 -1
  71. package/dist/assets/pla-DSh2-awV.js +0 -1
  72. package/dist/assets/postiats-CocnycG-.js +0 -1
  73. package/dist/assets/powerquery-tScXyioY.js +0 -1
  74. package/dist/assets/powershell-COWaemsV.js +0 -1
  75. package/dist/assets/protobuf-Brw8urJB.js +0 -2
  76. package/dist/assets/pug-8SOpv6rk.js +0 -1
  77. package/dist/assets/python-BDvE0baC.js +0 -1
  78. package/dist/assets/qsharp-Bw9ernYp.js +0 -1
  79. package/dist/assets/r-j7ic8hl3.js +0 -1
  80. package/dist/assets/razor-3AZt1jFw.js +0 -1
  81. package/dist/assets/redis-Bu5POkcn.js +0 -1
  82. package/dist/assets/redshift-Bs9aos_-.js +0 -1
  83. package/dist/assets/restructuredtext-CqXO7rUv.js +0 -1
  84. package/dist/assets/ruby-zBfavPgS.js +0 -1
  85. package/dist/assets/rust-BzKRNQWT.js +0 -1
  86. package/dist/assets/sb-BBc9UKZt.js +0 -1
  87. package/dist/assets/scala-D9hQfWCl.js +0 -1
  88. package/dist/assets/scheme-BPhDTwHR.js +0 -1
  89. package/dist/assets/scss-CBJaRo0y.js +0 -3
  90. package/dist/assets/shell-DiJ1NA_G.js +0 -1
  91. package/dist/assets/solidity-Db0IVjzk.js +0 -1
  92. package/dist/assets/sophia-CnS9iZB_.js +0 -1
  93. package/dist/assets/sparql-CJmd_6j2.js +0 -1
  94. package/dist/assets/sql-ClhHkBeG.js +0 -1
  95. package/dist/assets/st-CHwy0fLd.js +0 -1
  96. package/dist/assets/swift-Bqt4WxQ4.js +0 -3
  97. package/dist/assets/systemverilog-Bs9z6M-B.js +0 -1
  98. package/dist/assets/tcl-Dm6ycUr_.js +0 -1
  99. package/dist/assets/ts.worker-59MjiAqk.js +0 -67731
  100. package/dist/assets/tsMode-2fAJOXuF.js +0 -11
  101. package/dist/assets/twig-Csy3S7wG.js +0 -1
  102. package/dist/assets/typescript-Bv1W4NlY.js +0 -1
  103. package/dist/assets/typespec-Btyra-wh.js +0 -1
  104. package/dist/assets/vb-Db0cS2oM.js +0 -1
  105. package/dist/assets/wgsl-BTesnYfV.js +0 -298
  106. package/dist/assets/xml-CR03X85Q.js +0 -1
  107. package/dist/assets/yaml-Qi3RsNvX.js +0 -1
  108. 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 shared across
4
- [daakia](https://github.com/salilvnair) and ck8t. 65+ components, a
5
- CSS-variable theme system, and a Monaco-backed code editor that's entirely
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
  [![npm version](https://img.shields.io/npm/v/@salilvnair/dui.svg)](https://www.npmjs.com/package/@salilvnair/dui)
10
+ [![npm downloads](https://img.shields.io/npm/dm/@salilvnair/dui.svg)](https://www.npmjs.com/package/@salilvnair/dui)
9
11
  [![license](https://img.shields.io/npm/l/@salilvnair/dui.svg)](https://github.com/salilvnair/dui/blob/main/LICENSE)
12
+ [![types](https://img.shields.io/badge/types-included-3178c6.svg)](#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
+ ![DUI — 281 components, a live playground, live retheming, light and dark](https://raw.githubusercontent.com/salilvnair/dui/main/media/dui-showcase.gif)
10
22
 
11
- Repository: **https://github.com/salilvnair/dui**
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
- - [Features](#features)
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
- ## Features
32
-
33
- - **65+ components** — inputs, buttons, navigation, display, overlays,
34
- layout, and a full debug/editor toolkit (see [catalog](#component-catalog))
35
- - **CSS-variable theming** — every color is a `--color-*` custom property;
36
- retheme by overriding variables on `:root` or any container, no rebuild
37
- - **Size system** — one `size` prop (`xxs`–`xxxl`) threaded through every
38
- component via `<DuiProvider>`, or override per-instance
39
- - **Optional Monaco editor** — `EditorView`/`DiffEditorView`/`DebugEditorView`
40
- render a plain-text fallback out of the box; Monaco is a genuinely optional
41
- peer dependency, not a hard requirement (see below — this is the part of
42
- the library most worth understanding before you adopt it)
43
- - **Tree-shakeable ESM** — compiled output, real `.d.ts` types, multi-entry
44
- build so `import '@salilvnair/dui/monaco-setup'` is the *only* way Monaco
45
- code ever enters your bundle
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, TabView } from '@salilvnair/dui';
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 a single place to set the
77
- default `size` or accent color for the whole tree.
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
+ ![Editing the JSX for ButtonView and the preview updating live](https://raw.githubusercontent.com/salilvnair/dui/main/media/sections/playground.gif)
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
+ ![Dragging the accent variable and the chips repainting as it moves](https://raw.githubusercontent.com/salilvnair/dui/main/media/sections/theming.gif)
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
+ ![The same panel on the light ground and back to dark](https://raw.githubusercontent.com/salilvnair/dui/main/media/sections/themes.gif)
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
+ ![Inputs, on the light ground](https://raw.githubusercontent.com/salilvnair/dui/main/media/sheets-light/inputs.png)
140
+
141
+ ![Display, on the light ground](https://raw.githubusercontent.com/salilvnair/dui/main/media/sheets-light/display.png)
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
+ ![Scrolling the props table for TextInputView](https://raw.githubusercontent.com/salilvnair/dui/main/media/sections/docs.gif)
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
+ ![A data table sorting, with the source shown under it](https://raw.githubusercontent.com/salilvnair/dui/main/media/sections/data.gif)
165
+
166
+ </td>
167
+ <td width="50%">
168
+
169
+ **Dashboards** — stat cards, sparklines, heatmap calendars, a kanban board.
170
+
171
+ ![Stat cards, a sparkline, a heatmap calendar and a kanban board](https://raw.githubusercontent.com/salilvnair/dui/main/media/sections/dashboards.gif)
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
+ ![A modal opening over the examples and closing on Escape](https://raw.githubusercontent.com/salilvnair/dui/main/media/sections/overlays.gif)
182
+
183
+ </td>
184
+ <td width="50%">
185
+
186
+ **Motion** — loaders, streaming text, a command orb, and the signature series.
187
+
188
+ ![A constellation loader, a breathing loader, streaming text and a command orb](https://raw.githubusercontent.com/salilvnair/dui/main/media/sections/motion.gif)
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
+ ![EditorView with Monaco, and the plain-text fallback beside it](https://raw.githubusercontent.com/salilvnair/dui/main/media/sections/editor.gif)
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
+ ![Searching the sidebar for "table", then for "picker"](https://raw.githubusercontent.com/salilvnair/dui/main/media/sections/catalog.gif)
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> (14)</summary>
217
+ <summary><b>Inputs</b> (23)</summary>
218
+
219
+ ![Inputs — KeyValueTableRowView, DiffEditorView, MarkdownEditorView, MultilineInputView, InlineEditTextView, SearchFieldView, FilterInputView, TextInputView, SelectInputView, SelectTextInputView, TagInputView, CheckboxView, ToggleSwitchView, ThemeCardSelectorView, EditorView, DebugEditorView, SearchInputView, DurationInputView, HighlightedInputView, KeyValueTableView, MergedInputView, PickerView, SegmentedControlView](https://raw.githubusercontent.com/salilvnair/dui/main/media/sheets/inputs.png)
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
- `TextInputView` · `MultilineInputView` · `SelectInputView` ·
85
- `SelectTextInputView` · `SegmentedControlView` · `TagInputView` ·
86
- `CheckboxView` · `ToggleSwitchView` · `SliderView` · `DurationInputView` ·
87
- `HighlightedInputView` · `SearchInputView` · `KeyValueTableView` ·
88
- `MergedInputView`
247
+ </details>
248
+
249
+ <details>
250
+ <summary><b>Date & Time</b> (7)</summary>
251
+
252
+ ![Date & Time — TimeZoneSelectView, DateTimeInputView, CalendarView, DateInputView, DateRangePickerView, TimeWheelView, CountdownRingView](https://raw.githubusercontent.com/salilvnair/dui/main/media/sheets/date-time.png)
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>Editor / Debug toolkit</b></summary>
267
+ <summary><b>Form & Selection</b> (16)</summary>
268
+
269
+ ![Form & Selection — SwatchPickerView, TogglePillView, RadioGroupView, RadioCardView, RatingView, OtpInputView, PhoneInputView, ColorPickerView, IconPickerView, EmojiPickerView, FileDropzoneView, AvatarUploadView, MaskedInputView, TransferListView, StepperInputView, SwitchGroupView](https://raw.githubusercontent.com/salilvnair/dui/main/media/sheets/form-selection.png)
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
- `EditorView` · `DebugEditorView` · `DiffEditorView` · `DebugView` — see
96
- [Monaco is optional](#the-code-editor--monaco-is-optional) before adopting these.
290
+ </details>
291
+
292
+ <details>
293
+ <summary><b>Feedback & Status</b> (14)</summary>
294
+
295
+ ![Feedback & Status — TableSkeletonView, LoadingStateView, InfoView, CalloutView, SnackbarView, BannerView, ProgressRingView, ProgressBarView, SkeletonView, NotificationBadgeView, AvatarView, AvatarGroupView, PresenceDotView, ConfettiBurstView](https://raw.githubusercontent.com/salilvnair/dui/main/media/sheets/feedback-status.png)
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> (4)</summary>
317
+ <summary><b>Buttons</b> (8)</summary>
318
+
319
+ ![Buttons — ThemeToggleView, SegmentedView, SplitButtonView, ActionButtonView, ButtonView, IconButtonView, DropDownButtonView, AIButtonView](https://raw.githubusercontent.com/salilvnair/dui/main/media/sheets/buttons.png)
102
320
 
103
- `ButtonView` · `IconButtonView` · `DropDownButtonView` · `SplitButtonView` ·
104
- `SegmentedView` · `AIButtonView`
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> (5)</summary>
335
+ <summary><b>Navigation</b> (11)</summary>
336
+
337
+ ![Navigation — UnderlineTabsView, PilledTabView, TabView, TabBarView, ContextMenuView, SideNavView, SettingsNavView, BreadcrumbView, PaginationView, DockView, FabView](https://raw.githubusercontent.com/salilvnair/dui/main/media/sheets/navigation.png)
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
- `TabView` · `TabBarView` · `PilledTabView` · `ContextMenuView` ·
112
- `SideNavView` · `SettingsNavView`
353
+ </details>
354
+
355
+ <details>
356
+ <summary><b>Display</b> (26)</summary>
357
+
358
+ ![Display — LineDiffView, SetupOptionView, PriorityMarkView, GroupHeaderView, TerminalBlockView, CommandChipView, ChipView, BadgeChipView, StatusIndicatorView, LoaderView, EmptyStateView, ColoredTextView, StatsCardView, DottedCardView, DataTableView, CodeBlockView, PromptCardView, PromptLibraryView, StageCheck/Spin/Pulse, HudView, JsonTreeView, ExpandableLogEntryView, CopyButtonView, MarkdownView, FormDataTableView, YamlKeyChip](https://raw.githubusercontent.com/salilvnair/dui/main/media/sheets/display.png)
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
+ ![Overlays — SheetView, CommandPaletteView, ModalView, InfoPopupView, ToastView, PopoverView, TooltipView, DrawerView, ActionSheetView, BottomSheetView, SpotlightTourView](https://raw.githubusercontent.com/salilvnair/dui/main/media/sheets/overlays.png)
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>Display</b> (19)</summary>
413
+ <summary><b>Layout</b> (24)</summary>
414
+
415
+ ![Layout — InspectorPanelView, FanStackView, ResizablePanelView, SplitPanelView, BottomPanelView, FeatureCategoryView, CollapsibleSectionView, SpacerView, FolderView, DebugView, HeroView, LevelView, MediaObjectView, TileGridView, PanelListView, NavbarView, AffixView, AnchorView, StickyHeaderView, AspectRatioView, MasonryGridView, ScrollAreaView, BackToTopView, WatermarkView](https://raw.githubusercontent.com/salilvnair/dui/main/media/sheets/layout.png)
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
+ ![Data & Enterprise — IssueCardView, FindingCardView, DescriptionsView, StatisticView, ResultView, CascaderView, ComboBoxView, ListView, VirtualizedListView, StickyTableHeaderView, TablePaginationView, FilterBarView, SortableHeaderView, EditableCellView, DataGridToolbarView, ColumnVisibilityMenuView](https://raw.githubusercontent.com/salilvnair/dui/main/media/sheets/data-enterprise.png)
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
+ ![Advanced Selection — SortableView, RearrangeView, KbdView, WizardStepperView, AccordionGroupView, SegmentedProgressBarView, ChecklistView, PriorityPickerView, TagCloudView, RangeSliderView, VoteWidgetView, LikeButtonView, BookmarkButtonView, FollowButtonView, ShortcutRecorderView](https://raw.githubusercontent.com/salilvnair/dui/main/media/sheets/advanced-selection.png)
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
+ ![Communication & Content — MessageBubbleView, ChatInputView, TypingIndicatorView, CommentThreadView, NotificationCenterView, AlertDialogView, FeedbackWidgetView, NpsSurveyView, ShareSheetView, ContactCardView, ArticleCardView, FaqAccordionView, MessageBannerView, QuoteBlockView](https://raw.githubusercontent.com/salilvnair/dui/main/media/sheets/communication-content.png)
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
- `ChipView` · `StatusIndicatorView` · `LoaderView` · `EmptyStateView` ·
120
- `ColoredTextView` · `StatsCardView` · `DottedCardView` · `DataTableView` ·
121
- `CodeBlockView` · `MarkdownView` · `PromptCardView` · `PromptLibraryListView` ·
122
- `PromptLibraryEditorView` · `StageView` · `HudView` · `JsonTreeView` ·
123
- `ExpandableLogEntryView` · `CopyButtonView` · `YamlKeyChip` ·
124
- `FeatureCategoryView`
521
+ <details>
522
+ <summary><b>Enterprise & Settings</b> (24)</summary>
523
+
524
+ ![Enterprise & Settings — SettingsRowView, SettingsSectionView, OnboardingChecklistView, KeyValueListView, EnvironmentBadgeView, VersionBadgeView, LicenseBadgeView, UsageMeterView, PermissionMatrixView, AuditLogRowView, WebhookStatusView, ApiKeyRowView, RateLimitMeterView, EmptyInboxView, FeatureSpotlightBadgeView, CookieConsentBannerView, MaintenanceBannerView, TrialCountdownBannerView, TeamMemberRowView, InviteInputView, RoleSelectView, IntegrationCardView, StatusPageRowView, ChangelogEntryView](https://raw.githubusercontent.com/salilvnair/dui/main/media/sheets/enterprise-settings.png)
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>Overlays</b> (3)</summary>
556
+ <summary><b>Media & Files</b> (14)</summary>
557
+
558
+ ![Media & Files — PathBreadcrumbView, FileBrowserView, ImageGalleryView, ImageCropperView, VideoPlayerView, AudioWaveformView, AudioPlayerView, PdfViewerView, FileIconView, FileListView, DragHandleView, SignaturePadView, BarcodeView, ImageZoomView](https://raw.githubusercontent.com/salilvnair/dui/main/media/sheets/media-files.png)
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
- `ModalView` · `InfoPopupView` · `ToastView`
577
+ </details>
578
+
579
+ <details>
580
+ <summary><b>Data Display & Wow</b> (20)</summary>
581
+
582
+ ![Data Display & Wow — SwimlaneChartView, LaneChartView, FlameGraphView, SunburstView, DonutView, TimelineView, ActivityFeedView, KanbanBoardView, SparklineView, HeatmapCalendarView, ComparisonSliderView, CarouselView, QRCodeView, StatTrendCardView, PricingCardView, TestimonialCardView, RatingBreakdownView, TreeSelectView, RichTextToolbarView, MentionInputView](https://raw.githubusercontent.com/salilvnair/dui/main/media/sheets/data-display-wow.png)
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>Layout</b> (8)</summary>
610
+ <summary><b>Fun & Micro-interactions</b> (10)</summary>
611
+
612
+ ![Fun & Micro-interactions — GradientTextView, TypewriterTextView, CountUpNumberView, MagneticButtonView, TiltCardView, ParticleBackgroundView, GlowBorderView, RevealOnScrollView, FloatingLabelInputView, PulseDotView](https://raw.githubusercontent.com/salilvnair/dui/main/media/sheets/fun-micro-interactions.png)
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
- `ResizablePanelView` · `SplitPanelView` · `BottomPanelView` · `FolderView` ·
139
- `CollapsibleSectionView` · `SpacerView` · `SettingsNavView` · `SideNavView`
629
+ <details>
630
+ <summary><b>DUI Signature Series</b> (22)</summary>
631
+
632
+ ![DUI Signature Series — RequestFlowView, LatencyPulseView, AIStreamingTextView, CommandOrbView, TimeTravelSliderView, DiffMorphView, SchemaBlueprintView, LiveCursorPresenceView, UndoRedoTimelineView, DialKnobInputView, HoldToConfirmView, MorphingIconButtonView, StackedSwipeCardView, NetworkWeatherView, ConstellationLoaderView, HoloCardView, GhostTypingPlaceholderView, ConnectionPulseLineView, StackedToastDeckView, PathRevealView, SpectrumSliderView, BreathingLoaderView](https://raw.githubusercontent.com/salilvnair/dui/main/media/sheets/dui-signature-series.png)
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></summary>
662
+ <summary><b>More</b> (6)</summary>
663
+
664
+ ![More — DuiProvider (Size), LiveColorCustomizer, Patterns, Icons Gallery, Theme Customization, Add Theme Variable](https://raw.githubusercontent.com/salilvnair/dui/main/media/sheets/more.png)
145
665
 
146
- `DuiProvider` (size/theme context) · `LiveColorCustomizer` ·
147
- `ThemeCardSelectorView` · `FormDataTableView` · `RearrangeView` ·
148
- `HiddenKeyValueItemView` · full icon set (`@salilvnair/dui` re-exports every
149
- icon used internally)
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, or browse `src/lib` in the
155
- [repo](https://github.com/salilvnair/dui).
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
- e.g. to theme one panel differently). Programmatic helpers live under the
173
- `theme/*` subpath exports:
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'; // token schema (group/key/cssVar/comment)
177
- import { generateYaml } from '@salilvnair/dui/theme/utils'; // export current theme as YAML
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
- these components render a lightweight plain-text fallback (a styled
186
- `<textarea>` and a small line-diff view) — fully functional for basic
187
- editing, just without IntelliSense, breakpoints, or Monaco's diff engine.
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
- import has run; skip it and everything still works, just without Monaco.
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
- CDN is unreachable. Rather than silently guess, this library requires an
218
- explicit opt-in (`monaco-setup`) and never attempts the CDN path at all.
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
- does. This is checked as part of the release process, not just documented —
224
- see [Publishing](#publishing-to-npm).
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
- `react-dom`, and `zustand`; `@monaco-editor/react` and `monaco-editor` are
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 app at localhost:5173
787
+ npm run dev # the showcase at localhost:5173
254
788
  ```
255
789
 
256
- Open `http://localhost:5173/#dui` for the component showcase — every
257
- component has a live playground, examples, and prop docs.
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 (for deploying docs/demo)
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 # new feature: 1.0.0 -> 1.1.0
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** — this is the one thing worth manually
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 should
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
- must never ship.
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
- loader on its own — it only ever renders the plain-text fallback or the
364
- self-hosted Monaco registered by `monaco-setup`.
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