@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.
Files changed (105) hide show
  1. package/README.md +686 -95
  2. package/dist/monaco-setup.core.d.ts +4 -0
  3. package/dist/monaco-setup.d.ts +1 -4
  4. package/dist/monaco-setup.js +19 -19
  5. package/dist/monaco-setup.js.map +1 -1
  6. package/dist/style.css +1 -1
  7. package/package.json +17 -2
  8. package/dist/assets/DuiShowcase-BOtwgwbq.css +0 -1
  9. package/dist/assets/DuiShowcase-Bl4Oi2Vw.js +0 -74723
  10. package/dist/assets/abap-DLDM7-KI.js +0 -1
  11. package/dist/assets/apex-DNDY2TF8.js +0 -1
  12. package/dist/assets/azcli-Y6nb8tq_.js +0 -1
  13. package/dist/assets/bat-BwHxbl9M.js +0 -1
  14. package/dist/assets/bicep-CFznDFnq.js +0 -2
  15. package/dist/assets/cameligo-Bf6VGUru.js +0 -1
  16. package/dist/assets/clojure-Dnu-v4kV.js +0 -1
  17. package/dist/assets/codicon-ngg6Pgfi.ttf +0 -0
  18. package/dist/assets/coffee-Bd8akH9Z.js +0 -1
  19. package/dist/assets/cpp-BbWJElDN.js +0 -1
  20. package/dist/assets/csharp-Co3qMtFm.js +0 -1
  21. package/dist/assets/csp-D-4FJmMZ.js +0 -1
  22. package/dist/assets/css-DdJfP1eB.js +0 -3
  23. package/dist/assets/css.worker-B4z49cGk.js +0 -93
  24. package/dist/assets/cssMode-CZYOZ1AO.js +0 -1
  25. package/dist/assets/cypher-cTPe9QuQ.js +0 -1
  26. package/dist/assets/dart-BOtBlQCF.js +0 -1
  27. package/dist/assets/dockerfile-BG73LgW2.js +0 -1
  28. package/dist/assets/ecl-BEgZUVRK.js +0 -1
  29. package/dist/assets/elixir-BkW5O-1t.js +0 -1
  30. package/dist/assets/flow9-BeJ5waoc.js +0 -1
  31. package/dist/assets/freemarker2-CGSa1nHJ.js +0 -3
  32. package/dist/assets/fsharp-PahG7c26.js +0 -1
  33. package/dist/assets/go-acbASCJo.js +0 -1
  34. package/dist/assets/graphql-BxJiqAUM.js +0 -1
  35. package/dist/assets/handlebars-mB8dxbcs.js +0 -1
  36. package/dist/assets/hcl-DtV1sZF8.js +0 -1
  37. package/dist/assets/html-l7YRKuHI.js +0 -1
  38. package/dist/assets/html.worker-DtiGdgqp.js +0 -470
  39. package/dist/assets/htmlMode-CuoiFE2t.js +0 -1
  40. package/dist/assets/index-Dylj6yGs.css +0 -10
  41. package/dist/assets/index-ROymQLGX.js +0 -50
  42. package/dist/assets/ini-Kd9XrMLS.js +0 -1
  43. package/dist/assets/java-CXBNlu9o.js +0 -1
  44. package/dist/assets/javascript-9UYwmKgx.js +0 -1
  45. package/dist/assets/json.worker-leyajbqV.js +0 -58
  46. package/dist/assets/jsonMode-6uegdfHj.js +0 -7
  47. package/dist/assets/julia-cl7-CwDS.js +0 -1
  48. package/dist/assets/kotlin-s7OhZKlX.js +0 -1
  49. package/dist/assets/less-9HpZscsL.js +0 -2
  50. package/dist/assets/lexon-OrD6JF1K.js +0 -1
  51. package/dist/assets/liquid-C8P3CEDc.js +0 -1
  52. package/dist/assets/lspLanguageFeatures-Ju8ugRgx.js +0 -4
  53. package/dist/assets/lua-Cyyb5UIc.js +0 -1
  54. package/dist/assets/m3-B8OfTtLu.js +0 -1
  55. package/dist/assets/markdown-BFxVWTOG.js +0 -1
  56. package/dist/assets/mdx-D4_p5PzA.js +0 -1
  57. package/dist/assets/mips-CiqrrVzr.js +0 -1
  58. package/dist/assets/monaco-editor-CN2OOCze.js +0 -908
  59. package/dist/assets/monaco-editor-qiF_U8vl.css +0 -1
  60. package/dist/assets/msdax-DmeGPVcC.js +0 -1
  61. package/dist/assets/mysql-C_tMU-Nz.js +0 -1
  62. package/dist/assets/objective-c-BDtDVThU.js +0 -1
  63. package/dist/assets/pascal-vHIfCaH5.js +0 -1
  64. package/dist/assets/pascaligo-DtZ0uQbO.js +0 -1
  65. package/dist/assets/perl-Ub6l9XKa.js +0 -1
  66. package/dist/assets/pgsql-BlNEE0v7.js +0 -1
  67. package/dist/assets/php-BBUBE1dy.js +0 -1
  68. package/dist/assets/pla-DSh2-awV.js +0 -1
  69. package/dist/assets/postiats-CocnycG-.js +0 -1
  70. package/dist/assets/powerquery-tScXyioY.js +0 -1
  71. package/dist/assets/powershell-COWaemsV.js +0 -1
  72. package/dist/assets/protobuf-Brw8urJB.js +0 -2
  73. package/dist/assets/pug-8SOpv6rk.js +0 -1
  74. package/dist/assets/python-BDvE0baC.js +0 -1
  75. package/dist/assets/qsharp-Bw9ernYp.js +0 -1
  76. package/dist/assets/r-j7ic8hl3.js +0 -1
  77. package/dist/assets/razor-3AZt1jFw.js +0 -1
  78. package/dist/assets/redis-Bu5POkcn.js +0 -1
  79. package/dist/assets/redshift-Bs9aos_-.js +0 -1
  80. package/dist/assets/restructuredtext-CqXO7rUv.js +0 -1
  81. package/dist/assets/ruby-zBfavPgS.js +0 -1
  82. package/dist/assets/rust-BzKRNQWT.js +0 -1
  83. package/dist/assets/sb-BBc9UKZt.js +0 -1
  84. package/dist/assets/scala-D9hQfWCl.js +0 -1
  85. package/dist/assets/scheme-BPhDTwHR.js +0 -1
  86. package/dist/assets/scss-CBJaRo0y.js +0 -3
  87. package/dist/assets/shell-DiJ1NA_G.js +0 -1
  88. package/dist/assets/solidity-Db0IVjzk.js +0 -1
  89. package/dist/assets/sophia-CnS9iZB_.js +0 -1
  90. package/dist/assets/sparql-CJmd_6j2.js +0 -1
  91. package/dist/assets/sql-ClhHkBeG.js +0 -1
  92. package/dist/assets/st-CHwy0fLd.js +0 -1
  93. package/dist/assets/swift-Bqt4WxQ4.js +0 -3
  94. package/dist/assets/systemverilog-Bs9z6M-B.js +0 -1
  95. package/dist/assets/tcl-Dm6ycUr_.js +0 -1
  96. package/dist/assets/ts.worker-59MjiAqk.js +0 -67731
  97. package/dist/assets/tsMode-2fAJOXuF.js +0 -11
  98. package/dist/assets/twig-Csy3S7wG.js +0 -1
  99. package/dist/assets/typescript-Bv1W4NlY.js +0 -1
  100. package/dist/assets/typespec-Btyra-wh.js +0 -1
  101. package/dist/assets/vb-Db0cS2oM.js +0 -1
  102. package/dist/assets/wgsl-BTesnYfV.js +0 -298
  103. package/dist/assets/xml-CR03X85Q.js +0 -1
  104. package/dist/assets/yaml-Qi3RsNvX.js +0 -1
  105. 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 **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
  [![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 — 238 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,559 @@ 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 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
+ ![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 238 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
+ **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
+ ![Inputs — 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
+ | [`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>Inputs</b> (14)</summary>
243
+ <summary><b>Date & Time</b> (5)</summary>
244
+
245
+ ![Date & Time — CalendarView, DateInputView, DateRangePickerView, TimeWheelView, CountdownRingView](https://raw.githubusercontent.com/salilvnair/dui/main/media/sheets/date-time.png)
83
246
 
84
- `TextInputView` · `MultilineInputView` · `SelectInputView` ·
85
- `SelectTextInputView` · `SegmentedControlView` · `TagInputView` ·
86
- `CheckboxView` · `ToggleSwitchView` · `SliderView` · `DurationInputView` ·
87
- `HighlightedInputView` · `SearchInputView` · `KeyValueTableView` ·
88
- `MergedInputView`
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>Editor / Debug toolkit</b></summary>
258
+ <summary><b>Form & Selection</b> (14)</summary>
259
+
260
+ ![Form & Selection — 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)
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
- `EditorView` · `DebugEditorView` · `DiffEditorView` · `DebugView` — see
96
- [Monaco is optional](#the-code-editor--monaco-is-optional) before adopting these.
279
+ </details>
280
+
281
+ <details>
282
+ <summary><b>Feedback & Status</b> (10)</summary>
283
+
284
+ ![Feedback & Status — SnackbarView, BannerView, ProgressRingView, ProgressBarView, SkeletonView, NotificationBadgeView, AvatarView, AvatarGroupView, PresenceDotView, ConfettiBurstView](https://raw.githubusercontent.com/salilvnair/dui/main/media/sheets/feedback-status.png)
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
- `ButtonView` · `IconButtonView` · `DropDownButtonView` · `SplitButtonView` ·
104
- `SegmentedView` · `AIButtonView`
304
+ ![Buttons — ButtonView, IconButtonView, DropDownButtonView, AIButtonView](https://raw.githubusercontent.com/salilvnair/dui/main/media/sheets/buttons.png)
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> (5)</summary>
110
-
111
- `TabView` · `TabBarView` · `PilledTabView` · `ContextMenuView` ·
112
- `SideNavView` · `SettingsNavView`
316
+ <summary><b>Navigation</b> (9)</summary>
317
+
318
+ ![Navigation — TabView, TabBarView, ContextMenuView, SideNavView, SettingsNavView, BreadcrumbView, PaginationView, DockView, FabView](https://raw.githubusercontent.com/salilvnair/dui/main/media/sheets/navigation.png)
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
- `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`
337
+ ![Display — ChipView, 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)
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
+ ![Overlays — ModalView, InfoPopupView, ToastView, PopoverView, TooltipView, DrawerView, ActionSheetView, BottomSheetView, SpotlightTourView](https://raw.githubusercontent.com/salilvnair/dui/main/media/sheets/overlays.png)
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
+ ![Layout — 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)
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
+ ![Data & Enterprise — 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)
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
+ ![Advanced Selection — 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)
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
+ ![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)
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
+ ![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)
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>Overlays</b> (3)</summary>
520
+ <summary><b>Media & Files</b> (12)</summary>
521
+
522
+ ![Media & Files — ImageGalleryView, ImageCropperView, VideoPlayerView, AudioWaveformView, AudioPlayerView, PdfViewerView, FileIconView, FileListView, DragHandleView, SignaturePadView, BarcodeView, ImageZoomView](https://raw.githubusercontent.com/salilvnair/dui/main/media/sheets/media-files.png)
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
- `ModalView` · `InfoPopupView` · `ToastView`
539
+ </details>
540
+
541
+ <details>
542
+ <summary><b>Data Display & Wow</b> (15)</summary>
543
+
544
+ ![Data Display & Wow — 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)
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>Layout</b> (8)</summary>
567
+ <summary><b>Fun & Micro-interactions</b> (10)</summary>
568
+
569
+ ![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)
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
- `ResizablePanelView` · `SplitPanelView` · `BottomPanelView` · `FolderView` ·
139
- `CollapsibleSectionView` · `SpacerView` · `SettingsNavView` · `SideNavView`
586
+ <details>
587
+ <summary><b>DUI Signature Series</b> (22)</summary>
588
+
589
+ ![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)
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></summary>
619
+ <summary><b>More</b> (6)</summary>
145
620
 
146
- `DuiProvider` (size/theme context) · `LiveColorCustomizer` ·
147
- `ThemeCardSelectorView` · `FormDataTableView` · `RearrangeView` ·
148
- `HiddenKeyValueItemView` · full icon set (`@salilvnair/dui` re-exports every
149
- icon used internally)
621
+ ![More — DuiProvider (Size), LiveColorCustomizer, Patterns, Icons Gallery, Theme Customization, Add Theme Variable](https://raw.githubusercontent.com/salilvnair/dui/main/media/sheets/more.png)
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, or browse `src/lib` in the
155
- [repo](https://github.com/salilvnair/dui).
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
- e.g. to theme one panel differently). Programmatic helpers live under the
173
- `theme/*` subpath exports:
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'; // token schema (group/key/cssVar/comment)
177
- import { generateYaml } from '@salilvnair/dui/theme/utils'; // export current theme as YAML
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
- 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.
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
- import has run; skip it and everything still works, just without Monaco.
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
- 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.
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
- does. This is checked as part of the release process, not just documented —
224
- see [Publishing](#publishing-to-npm).
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
- `react-dom`, and `zustand`; `@monaco-editor/react` and `monaco-editor` are
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 app at localhost:5173
744
+ npm run dev # the showcase at localhost:5173
254
745
  ```
255
746
 
256
- Open `http://localhost:5173/#dui` for the component showcase — every
257
- component has a live playground, examples, and prop docs.
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 (for deploying docs/demo)
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 # new feature: 1.0.0 -> 1.1.0
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** — this is the one thing worth manually
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 should
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
- must never ship.
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
- loader on its own — it only ever renders the plain-text fallback or the
364
- self-hosted Monaco registered by `monaco-setup`.
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