@keenmate/web-multiselect 2.0.0 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +201 -208
- package/component-variables.manifest.json +4 -30
- package/custom-elements.json +0 -100
- package/dist/multiselect.js +10 -5
- package/dist/multiselect.umd.js +4 -4
- package/dist/style.css +1 -1
- package/docs/theming.md +7 -7
- package/package.json +5 -3
- package/src/css/options.css +8 -4
- package/src/css/variables.css +964 -964
- package/vscode.css-custom-data.json +0 -125
- package/vscode.html-custom-data.json +1 -1
- package/web-types.json +2 -84
package/README.md
CHANGED
|
@@ -1,208 +1,201 @@
|
|
|
1
|
-
# @keenmate/web-multiselect
|
|
2
|
-
|
|
3
|
-
[](LICENSE)
|
|
4
|
-
[](https://www.npmjs.com/package/@keenmate/web-multiselect)
|
|
5
|
-
|
|
6
|
-
> A lightweight, themeable multi-select web component with typeahead search, RTL support, rich content, and full keyboard navigation.
|
|
7
|
-
|
|
8
|
-
## What is it
|
|
9
|
-
|
|
10
|
-
`@keenmate/web-multiselect` is a custom element (`<web-multiselect>`) that turns a list of options into a searchable, themeable multi-select dropdown. Framework-agnostic — works in React, Vue, Svelte, Blazor, plain HTML.
|
|
11
|
-
|
|
12
|
-
Reads `--base-*` variables from the page if [`@keenmate/theme-designer`](https://theme-designer.keenmate.dev) is present, falls back to sensible OS-aware defaults otherwise, and ships with first-class dark-mode and per-instance theming.
|
|
13
|
-
|
|
14
|
-
**Headline features:**
|
|
15
|
-
|
|
16
|
-
- Declarative `<option>` / `<optgroup>` markup — no JavaScript required for simple cases.
|
|
17
|
-
- Virtual scrolling for 10,000+ option datasets (25× faster opening, 99.8% memory reduction).
|
|
18
|
-
- Filter or navigate search modes; async / hybrid search.
|
|
19
|
-
- Five badge display modes (pills, count, compact, partial, none) with positioning on any side.
|
|
20
|
-
- Full keyboard navigation, RTL language support, badge tooltips.
|
|
21
|
-
- Custom rendering callbacks for options, badges, and group headers.
|
|
22
|
-
- Form integration via standard hidden inputs (FormData-compatible).
|
|
23
|
-
|
|
24
|
-
## What's New in v2.0.
|
|
25
|
-
|
|
26
|
-
- **
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
`
|
|
37
|
-
`
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
-
|
|
69
|
-
|
|
70
|
-
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
<
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
#
|
|
171
|
-
npm run
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
## Built with BlissFramework
|
|
203
|
-
|
|
204
|
-
Follows the [BlissFramework component guidelines](https://blissframework.dev/) for structure, theming, color-scheme, and accessibility. Per-check verifications run via `/validate-web-component`.
|
|
205
|
-
|
|
206
|
-
## Credits
|
|
207
|
-
|
|
208
|
-
Created by [Keenmate](https://github.com/keenmate) as part of the Pure Admin design system.
|
|
1
|
+
# @keenmate/web-multiselect
|
|
2
|
+
|
|
3
|
+
[](LICENSE)
|
|
4
|
+
[](https://www.npmjs.com/package/@keenmate/web-multiselect)
|
|
5
|
+
|
|
6
|
+
> A lightweight, themeable multi-select web component with typeahead search, RTL support, rich content, and full keyboard navigation.
|
|
7
|
+
|
|
8
|
+
## What is it
|
|
9
|
+
|
|
10
|
+
`@keenmate/web-multiselect` is a custom element (`<web-multiselect>`) that turns a list of options into a searchable, themeable multi-select dropdown. Framework-agnostic — works in React, Vue, Svelte, Blazor, plain HTML.
|
|
11
|
+
|
|
12
|
+
Reads `--base-*` variables from the page if [`@keenmate/theme-designer`](https://theme-designer.keenmate.dev) is present, falls back to sensible OS-aware defaults otherwise, and ships with first-class dark-mode and per-instance theming.
|
|
13
|
+
|
|
14
|
+
**Headline features:**
|
|
15
|
+
|
|
16
|
+
- Declarative `<option>` / `<optgroup>` markup — no JavaScript required for simple cases.
|
|
17
|
+
- Virtual scrolling for 10,000+ option datasets (25× faster opening, 99.8% memory reduction).
|
|
18
|
+
- Filter or navigate search modes; async / hybrid search.
|
|
19
|
+
- Five badge display modes (pills, count, compact, partial, none) with positioning on any side.
|
|
20
|
+
- Full keyboard navigation, RTL language support, badge tooltips.
|
|
21
|
+
- Custom rendering callbacks for options, badges, and group headers.
|
|
22
|
+
- Form integration via standard hidden inputs (FormData-compatible).
|
|
23
|
+
|
|
24
|
+
## What's New in v2.0.1
|
|
25
|
+
|
|
26
|
+
- **Single-select — re-clicking the selected option no longer clears the field** — In a `multiple="false"` picker, clicking or pressing Enter on the option that's already selected used to toggle it off and empty the control. Because a single-select row shows no checkbox, there was no cue you were un-picking, so a confirming click read as an accidental wipe. It's now a no-op that simply closes the dropdown, keeping the value selected; clearing stays the dedicated ✕ button's job (`show-clear`). Multi-select toggle-off and single-select replacement are untouched.
|
|
27
|
+
- **Checkbox tick now sizes from the shared `--base-icon-check-size` token** — The selected-row checkmark was masked at `contain` (≈100% of the box), which only looked right when the glyph carried its own viewBox padding; a theme swapping `--base-icon-check` for an edge-to-edge glyph (e.g. a star) rendered it oversized, and it didn't match pure-admin's `.pa-checkbox`. It now reads `var(--base-icon-check-size, 68%)` — the exact knob pure-admin uses — so the mark renders identically in both and a theme can rescale it once for every component. The indeterminate dash inherits the same mask box. The default Lucide check shrinks slightly (≈100% → 68%) to match; that's intended.
|
|
28
|
+
- **Build-time variable-manifest validator** — A new `scripts/check-variable-manifest.mjs` step (wired into `npm run build` as `check:vars`) diffs the `--ms-*` declared and `--base-*` consumed across `src/css/**` against `component-variables.manifest.json` and fails the build on dead or missing entries. This closes the silent-drift gap behind the generated IDE autocomplete and theme-designer surfaces, which are all derived from that manifest.
|
|
29
|
+
- **Manifest drift cleanup** — Removed 24 inert entries the manifest still advertised (the commented-out `--ms-input-size-*` size-preset surface and five positioning vars dropped in the rc11 field-shell rework) and added the missing `--base-icon-plus` / `--base-icon-add` glyphs, so autocomplete no longer offers non-functional knobs and now covers the "add new" prompt icons.
|
|
30
|
+
|
|
31
|
+
## What's New in v2.0.0
|
|
32
|
+
|
|
33
|
+
- **"Add new" creation mode — the picker doubles as a creation tool.** Turn on `allow-add-new`
|
|
34
|
+
and a search with no matches shows a clickable "Add new …" prompt (label via `add-new-text` /
|
|
35
|
+
`getAddNewTextCallback`). Choosing it (click, Enter, or arrow-to-focus) fires a new bubbling
|
|
36
|
+
`add` event; `addNewCallback` creates the option and is **async and cancelable** (return
|
|
37
|
+
`null`/`undefined` to abort after a confirm dialog or server round-trip) and may return a
|
|
38
|
+
**rich option** that renders like any other. While it runs the prompt shows a spinner +
|
|
39
|
+
`add-new-pending-text`. Creation also works with no callback — handle it entirely off the `add`
|
|
40
|
+
event. See `examples-events-callbacks.html` §EV4b/EV4c.
|
|
41
|
+
|
|
42
|
+
- **Scroll-to imperative API — jump to any option or group.** New `scrollToIndex()` /
|
|
43
|
+
`scrollToValue()` / `scrollToGroup()` on the element and picker bring a row into view — pair with
|
|
44
|
+
`open()` for an "open + jump" gesture. Mode-aware (virtual scroll, tree, mobile fullscreen sheet),
|
|
45
|
+
they align to the top by default (`{ block: 'center' }` to center) and return `false` when the
|
|
46
|
+
target isn't in the current filtered list. A companion public `clearSearch()` reveals a
|
|
47
|
+
filtered-out option so you can then scroll to it, plus a `searchText` getter and a `search(term)`
|
|
48
|
+
method to read and programmatically drive the query. See §BU06b, §VS03, §TR09b.
|
|
49
|
+
|
|
50
|
+
- **Checkbox check/dash + filter funnel now flow from the shared `--base-icon-*` contract.** The
|
|
51
|
+
checkmark and indeterminate dash are now `currentColor` mask glyphs (not CSS-border shapes) reading
|
|
52
|
+
`--base-icon-check` / `--base-icon-indeterminate`, and the search-mode funnel reads
|
|
53
|
+
`--base-icon-filter` — so one base override reskins them across every Keenmate component. Inline
|
|
54
|
+
Lucide fallbacks keep the default look unchanged.
|
|
55
|
+
|
|
56
|
+
- **`--ms-rem` now bridges to the shared `--base-rem` knob.** The global sizing unit resolves
|
|
57
|
+
`var(--base-rem, 10px)`, so a theme that sets `--base-rem` rescales the whole component from one
|
|
58
|
+
variable (the `10px` fallback and per-instance overrides still work with no base layer loaded).
|
|
59
|
+
|
|
60
|
+
- **Fixed: the count-chip clear ✕ and popover close ✕ vanished on hover.** Both derived their hover
|
|
61
|
+
background *and* glyph colour from the same accent, so the ✕ melted into its own hover state
|
|
62
|
+
(fully invisible on near-white accents like Minimal dark). They now fill with a solid accent
|
|
63
|
+
background and flip the glyph to the on-accent colour, matching the badge remove button.
|
|
64
|
+
|
|
65
|
+
## Demos & docs
|
|
66
|
+
|
|
67
|
+
- 🚀 [Live demo](https://web-multiselect.keenmate.dev)
|
|
68
|
+
- 📘 [Usage / API reference](./docs/usage.md) — attributes, properties, methods, events.
|
|
69
|
+
- 🎨 [Theming](./docs/theming.md) — `--ms-*` variables, dark mode, cascade layers, Theme Designer integration.
|
|
70
|
+
- 📚 [Examples / cookbook](./docs/examples.md) — rich content, async search, virtual scroll, custom rendering, forms.
|
|
71
|
+
- ♿ [Accessibility](./docs/accessibility.md) — keyboard model, ARIA labels, focus behavior.
|
|
72
|
+
|
|
73
|
+
## Install
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
npm install @keenmate/web-multiselect
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
## Quick start
|
|
80
|
+
|
|
81
|
+
**Declarative — no JavaScript required:**
|
|
82
|
+
|
|
83
|
+
```html
|
|
84
|
+
<script type="module">
|
|
85
|
+
import '@keenmate/web-multiselect';
|
|
86
|
+
</script>
|
|
87
|
+
|
|
88
|
+
<web-multiselect placeholder="Pick a country">
|
|
89
|
+
<option value="cz">Czech Republic</option>
|
|
90
|
+
<option value="sk">Slovakia</option>
|
|
91
|
+
<option value="at">Austria</option>
|
|
92
|
+
</web-multiselect>
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
**Programmatic — dynamic data + events:**
|
|
96
|
+
|
|
97
|
+
```html
|
|
98
|
+
<web-multiselect id="picker" search-placeholder="Search…"></web-multiselect>
|
|
99
|
+
|
|
100
|
+
<script type="module">
|
|
101
|
+
import '@keenmate/web-multiselect';
|
|
102
|
+
|
|
103
|
+
const picker = document.getElementById('picker');
|
|
104
|
+
picker.options = [
|
|
105
|
+
{ value: 'js', label: 'JavaScript', icon: '🟨' },
|
|
106
|
+
{ value: 'ts', label: 'TypeScript', icon: '🔷' },
|
|
107
|
+
{ value: 'py', label: 'Python', icon: '🐍' }
|
|
108
|
+
];
|
|
109
|
+
|
|
110
|
+
picker.addEventListener('change', (e) => {
|
|
111
|
+
console.log('Selected:', e.detail.selectedValues);
|
|
112
|
+
});
|
|
113
|
+
</script>
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
See [docs/usage.md](./docs/usage.md) for the full API and [docs/examples.md](./docs/examples.md) for advanced patterns (async data, virtual scrolling, custom rendering, form integration).
|
|
117
|
+
|
|
118
|
+
## Editor IntelliSense
|
|
119
|
+
|
|
120
|
+
The package ships editor metadata so you get autocomplete and hover docs for the
|
|
121
|
+
element's attributes, events, and all `--ms-*` CSS custom properties. All of it is
|
|
122
|
+
generated from the component's source on every build, so it never drifts.
|
|
123
|
+
|
|
124
|
+
- **JetBrains** (WebStorm / IntelliJ) — works automatically. The IDE discovers
|
|
125
|
+
`web-types.json` via the `web-types` field in `package.json`; no setup needed.
|
|
126
|
+
- **VS Code** — the data files ship but VS Code doesn't auto-discover them from a
|
|
127
|
+
dependency, so point your workspace at them once in `.vscode/settings.json`:
|
|
128
|
+
|
|
129
|
+
```json
|
|
130
|
+
{
|
|
131
|
+
"html.customData": [
|
|
132
|
+
"./node_modules/@keenmate/web-multiselect/vscode.html-custom-data.json"
|
|
133
|
+
],
|
|
134
|
+
"css.customData": [
|
|
135
|
+
"./node_modules/@keenmate/web-multiselect/vscode.css-custom-data.json"
|
|
136
|
+
]
|
|
137
|
+
}
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
`html.customData` powers tag/attribute completion on `<web-multiselect>`;
|
|
141
|
+
`css.customData` powers completion for the `--ms-*` theming variables. Reload
|
|
142
|
+
the window after adding them.
|
|
143
|
+
|
|
144
|
+
## Browser support
|
|
145
|
+
|
|
146
|
+
Modern evergreen browsers — anything with native `customElements`, Shadow DOM, and CSS `@layer` support:
|
|
147
|
+
|
|
148
|
+
- Chrome / Edge 99+
|
|
149
|
+
- Firefox 97+
|
|
150
|
+
- Safari 15.4+
|
|
151
|
+
|
|
152
|
+
No polyfills are shipped. SSR-safe: the module imports without crashing in Node, but renders only after hydration in the browser.
|
|
153
|
+
|
|
154
|
+
## Development
|
|
155
|
+
|
|
156
|
+
```bash
|
|
157
|
+
# Install dependencies
|
|
158
|
+
npm install
|
|
159
|
+
|
|
160
|
+
# Start dev server (HMR)
|
|
161
|
+
npm run dev
|
|
162
|
+
|
|
163
|
+
# Build for production
|
|
164
|
+
npm run build
|
|
165
|
+
|
|
166
|
+
# Create package tarball
|
|
167
|
+
npm run package
|
|
168
|
+
|
|
169
|
+
# Run tests
|
|
170
|
+
npm run test:unit # Vitest (happy-dom) — fast logic checks
|
|
171
|
+
npm run test:e2e # Playwright (browser) — interaction/visual
|
|
172
|
+
npm test # both
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
## Code structure
|
|
176
|
+
|
|
177
|
+
Follows the BlissFramework four-layer web-component layout:
|
|
178
|
+
|
|
179
|
+
| Layer | File | Role |
|
|
180
|
+
|-------|------|------|
|
|
181
|
+
| Element | `src/web-component.ts` | `MultiSelectElement` — custom-element I/O wrapper, `ATTRIBUTE_TABLE`-driven |
|
|
182
|
+
| Logic | `src/multiselect.ts` | `WebMultiSelect<T>` — framework-agnostic core |
|
|
183
|
+
| Service | `src/tooltip.ts`, `src/virtual-scroll.ts` | single-purpose helpers (`Tooltip`, `VirtualScroll`) |
|
|
184
|
+
| Side | `src/types.ts`, `src/logger.ts`, `src/vendor/` | types, logging, vendored deps |
|
|
185
|
+
|
|
186
|
+
Two deviations from the canonical shape, both intentional:
|
|
187
|
+
|
|
188
|
+
- **`MultiSelectElement extends BaseElement`, not `HTMLElement` directly.** `BaseElement` is a local `const` resolving to `HTMLElement` in the browser and to a stub class under SSR (`typeof HTMLElement === 'undefined'`), so importing the module in Node doesn't throw. A literal `grep "extends HTMLElement"` structure check will not match here by design.
|
|
189
|
+
- **`src/vite-env.d.ts`** is a standard Vite ambient-types file, not part of the four-layer model.
|
|
190
|
+
|
|
191
|
+
## License
|
|
192
|
+
|
|
193
|
+
MIT — see [LICENSE](./LICENSE).
|
|
194
|
+
|
|
195
|
+
## Built with BlissFramework
|
|
196
|
+
|
|
197
|
+
Follows the [BlissFramework component guidelines](https://blissframework.dev/) for structure, theming, color-scheme, and accessibility. Per-check verifications run via `/validate-web-component`.
|
|
198
|
+
|
|
199
|
+
## Credits
|
|
200
|
+
|
|
201
|
+
Created by [Keenmate](https://github.com/keenmate) as part of the Pure Admin design system.
|
|
@@ -49,11 +49,7 @@
|
|
|
49
49
|
{ "name": "base-border-radius-sm", "required": false, "usage": "Small radius (badges, buttons)" },
|
|
50
50
|
{ "name": "base-border-radius-md", "required": false, "usage": "Medium radius (input)" },
|
|
51
51
|
{ "name": "base-border-radius-lg", "required": false, "usage": "Large radius (dropdown)" },
|
|
52
|
-
{ "name": "base-input-size-
|
|
53
|
-
{ "name": "base-input-size-sm-height", "required": false, "usage": "Small input height (multiplier)" },
|
|
54
|
-
{ "name": "base-input-size-md-height", "required": false, "usage": "Medium input height (multiplier)" },
|
|
55
|
-
{ "name": "base-input-size-lg-height", "required": false, "usage": "Large input height (multiplier)" },
|
|
56
|
-
{ "name": "base-input-size-xl-height", "required": false, "usage": "Extra large input height (multiplier)" },
|
|
52
|
+
{ "name": "base-input-size-md-height", "required": false, "usage": "Medium input height multiplier (consumed by --ms-input-height)" },
|
|
57
53
|
{ "name": "base-rem", "required": false, "usage": "Global sizing unit — drives --ms-rem (falls back to 10px); scales the whole component" },
|
|
58
54
|
{ "name": "base-ease-standard", "required": false, "usage": "Standard easing curve (drives --ms-easing-snappy)" },
|
|
59
55
|
{ "name": "base-checkbox-border-color", "required": false, "usage": "Option checkbox border color" },
|
|
@@ -65,7 +61,10 @@
|
|
|
65
61
|
{ "name": "base-icon-close", "required": false, "usage": "Generic close glyph (fallback for badge-remove)" },
|
|
66
62
|
{ "name": "base-icon-search", "required": false, "usage": "Search glyph; inline Lucide SVG fallback" },
|
|
67
63
|
{ "name": "base-icon-filter", "required": false, "usage": "Funnel/filter glyph (fullscreen search-mode toggle); chained by --ms-icon-filter; inline Lucide SVG fallback" },
|
|
64
|
+
{ "name": "base-icon-plus", "required": false, "usage": "Plus glyph for the \"add new\" empty-state prompt; chained by --ms-icon-add-new; falls back to base-icon-add then inline Lucide SVG" },
|
|
65
|
+
{ "name": "base-icon-add", "required": false, "usage": "Alternate add glyph (fallback for base-icon-plus in the \"add new\" prompt)" },
|
|
68
66
|
{ "name": "base-icon-check", "required": false, "usage": "Checkbox/option checkmark glyph; chained by --ms-icon-check; inline Lucide SVG fallback" },
|
|
67
|
+
{ "name": "base-icon-check-size", "required": false, "usage": "mask-size for the checkbox glyph inside its box (shared with pure-admin's .pa-checkbox); default 68%. Also sizes the indeterminate dash (shares the mask box)" },
|
|
69
68
|
{ "name": "base-icon-indeterminate", "required": false, "usage": "Tri-state (partial) checkbox dash glyph; chained by --ms-icon-indeterminate; inline Lucide SVG fallback" },
|
|
70
69
|
{ "name": "base-danger-bg", "required": false, "usage": "Error message background" },
|
|
71
70
|
{ "name": "base-danger-color", "required": false, "usage": "Error message text color" },
|
|
@@ -104,41 +103,17 @@
|
|
|
104
103
|
{ "name": "ms-input-border-focus", "category": "input", "usage": "Input border when focused" },
|
|
105
104
|
{ "name": "ms-input-placeholder-color", "category": "input", "usage": "Placeholder text color" },
|
|
106
105
|
{ "name": "ms-input-bg-disabled", "category": "input", "usage": "Disabled input background" },
|
|
107
|
-
{ "name": "ms-input-padding", "category": "input", "usage": "Input padding" },
|
|
108
|
-
{ "name": "ms-input-padding-right", "category": "input", "usage": "Input right padding (for toggle)" },
|
|
109
106
|
{ "name": "ms-input-height", "category": "input", "usage": "Input height" },
|
|
110
107
|
{ "name": "ms-input-font-size", "category": "input", "usage": "Input font size" },
|
|
111
108
|
{ "name": "ms-input-border-width", "category": "input", "usage": "Input border width" },
|
|
112
109
|
{ "name": "ms-input-border-radius", "category": "input", "usage": "Input border radius" },
|
|
113
110
|
{ "name": "ms-input-text", "category": "input", "usage": "Input text color" },
|
|
114
111
|
|
|
115
|
-
{ "name": "ms-input-size-xs-font", "category": "input-size", "usage": "XS size font" },
|
|
116
|
-
{ "name": "ms-input-size-xs-padding-v", "category": "input-size", "usage": "XS vertical padding" },
|
|
117
|
-
{ "name": "ms-input-size-xs-padding-h", "category": "input-size", "usage": "XS horizontal padding" },
|
|
118
|
-
{ "name": "ms-input-size-xs-height", "category": "input-size", "usage": "XS input height" },
|
|
119
|
-
{ "name": "ms-input-size-sm-font", "category": "input-size", "usage": "SM size font" },
|
|
120
|
-
{ "name": "ms-input-size-sm-padding-v", "category": "input-size", "usage": "SM vertical padding" },
|
|
121
|
-
{ "name": "ms-input-size-sm-padding-h", "category": "input-size", "usage": "SM horizontal padding" },
|
|
122
|
-
{ "name": "ms-input-size-sm-height", "category": "input-size", "usage": "SM input height" },
|
|
123
|
-
{ "name": "ms-input-size-md-font", "category": "input-size", "usage": "MD size font" },
|
|
124
|
-
{ "name": "ms-input-size-md-padding-v", "category": "input-size", "usage": "MD vertical padding" },
|
|
125
|
-
{ "name": "ms-input-size-md-padding-h", "category": "input-size", "usage": "MD horizontal padding" },
|
|
126
|
-
{ "name": "ms-input-size-md-height", "category": "input-size", "usage": "MD input height" },
|
|
127
|
-
{ "name": "ms-input-size-lg-font", "category": "input-size", "usage": "LG size font" },
|
|
128
|
-
{ "name": "ms-input-size-lg-padding-v", "category": "input-size", "usage": "LG vertical padding" },
|
|
129
|
-
{ "name": "ms-input-size-lg-padding-h", "category": "input-size", "usage": "LG horizontal padding" },
|
|
130
|
-
{ "name": "ms-input-size-lg-height", "category": "input-size", "usage": "LG input height" },
|
|
131
|
-
{ "name": "ms-input-size-xl-font", "category": "input-size", "usage": "XL size font" },
|
|
132
|
-
{ "name": "ms-input-size-xl-padding-v", "category": "input-size", "usage": "XL vertical padding" },
|
|
133
|
-
{ "name": "ms-input-size-xl-padding-h", "category": "input-size", "usage": "XL horizontal padding" },
|
|
134
|
-
{ "name": "ms-input-size-xl-height", "category": "input-size", "usage": "XL input height" },
|
|
135
112
|
|
|
136
|
-
{ "name": "ms-toggle-right", "category": "toggle", "usage": "Toggle icon right position" },
|
|
137
113
|
{ "name": "ms-toggle-color", "category": "toggle", "usage": "Toggle icon color" },
|
|
138
114
|
{ "name": "ms-toggle-icon-color", "category": "toggle", "usage": "Toggle icon color (semantic)" },
|
|
139
115
|
{ "name": "ms-toggle-icon-color-open", "category": "toggle", "usage": "Toggle icon color when open" },
|
|
140
116
|
|
|
141
|
-
{ "name": "ms-counter-offset", "category": "counter", "usage": "Counter badge offset" },
|
|
142
117
|
{ "name": "ms-counter-padding", "category": "counter", "usage": "Counter badge padding" },
|
|
143
118
|
{ "name": "ms-counter-bg", "category": "counter", "usage": "Counter badge background" },
|
|
144
119
|
{ "name": "ms-counter-color", "category": "counter", "usage": "Counter badge text color" },
|
|
@@ -426,7 +401,6 @@
|
|
|
426
401
|
{ "name": "ms-debug-stats-border-radius", "category": "debug", "usage": "Debug stats nested panel corner radius" },
|
|
427
402
|
{ "name": "ms-debug-bullet-color", "category": "debug", "usage": "Debug stat bullet marker color" },
|
|
428
403
|
|
|
429
|
-
{ "name": "ms-transform-center-y", "category": "transform", "usage": "Center Y transform" },
|
|
430
404
|
{ "name": "ms-transform-rotate-180", "category": "transform", "usage": "180 degree rotation" },
|
|
431
405
|
{ "name": "ms-transform-scale-hover", "category": "transform", "usage": "Hover scale transform" },
|
|
432
406
|
{ "name": "ms-transform-scale-active", "category": "transform", "usage": "Active scale transform" },
|