vlist 2.2.0 → 2.3.0
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.github.md +31 -12
- package/README.md +12 -11
- package/dist/index.d.ts +2 -0
- package/dist/index.js +1 -1
- package/dist/plugins/a11y/plugin.d.ts +10 -1
- package/dist/plugins/search/index.d.ts +8 -0
- package/dist/plugins/search/match.d.ts +34 -0
- package/dist/plugins/search/plugin.d.ts +84 -0
- package/dist/plugins/search/searchbar.d.ts +57 -0
- package/dist/plugins/selection/plugin.d.ts +7 -0
- package/dist/size.json +1 -1
- package/dist/types.d.ts +29 -0
- package/dist/vlist-search.css +1 -0
- package/package.json +2 -1
|
@@ -9,5 +9,14 @@
|
|
|
9
9
|
*/
|
|
10
10
|
import type { VListItem } from "../../types";
|
|
11
11
|
import type { VListPlugin } from "../../core/types";
|
|
12
|
-
export
|
|
12
|
+
export interface A11yPluginConfig {
|
|
13
|
+
/**
|
|
14
|
+
* Whether this plugin handles arrow/Home/End/PageUp-Down/Enter/Space
|
|
15
|
+
* keyboard navigation. Default true. Set false to keep click-selection,
|
|
16
|
+
* focus management, and ARIA while letting an outer system own keyboard
|
|
17
|
+
* navigation (e.g. a global, focus-independent hotkey layer).
|
|
18
|
+
*/
|
|
19
|
+
keyboard?: boolean;
|
|
20
|
+
}
|
|
21
|
+
export declare function a11y<T extends VListItem = VListItem>(config?: A11yPluginConfig): VListPlugin<T>;
|
|
13
22
|
//# sourceMappingURL=plugin.d.ts.map
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* vlist - Search Domain
|
|
3
|
+
* Ready-to-use search bar with client-side filtering, match navigation,
|
|
4
|
+
* and `<mark>` highlighting.
|
|
5
|
+
*/
|
|
6
|
+
export { search, DEFAULT_SEARCH_TEXT, type SearchPluginConfig, type SearchPluginInstance, type SearchText, } from "./plugin";
|
|
7
|
+
export { makeGetText, type FieldAccessor } from "./match";
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* vlist/search — Matching & highlighting helpers
|
|
3
|
+
*
|
|
4
|
+
* Pure, DOM-light utilities used by the search plugin:
|
|
5
|
+
* - text extraction from items (field accessor or all string values)
|
|
6
|
+
* - substring matching
|
|
7
|
+
* - idempotent `<mark>` highlighting of a rendered element
|
|
8
|
+
*/
|
|
9
|
+
import type { VListItem } from "../../types";
|
|
10
|
+
/** Field(s) to search — a property key or a custom accessor. */
|
|
11
|
+
export type FieldAccessor<T> = string | ((item: T) => string);
|
|
12
|
+
/**
|
|
13
|
+
* Build a text accessor for an item.
|
|
14
|
+
* - function: used as-is
|
|
15
|
+
* - string: reads `item[field]`
|
|
16
|
+
* - undefined: concatenates all string-valued properties
|
|
17
|
+
*/
|
|
18
|
+
export declare const makeGetText: <T extends VListItem>(field?: FieldAccessor<T>) => ((item: T) => string);
|
|
19
|
+
/** Whether `text` contains `query` (query already normalized to the right case). */
|
|
20
|
+
export declare const textMatches: (text: string, query: string, caseSensitive: boolean) => boolean;
|
|
21
|
+
/**
|
|
22
|
+
* Remove all `<mark>` elements with `matchClass` inside `root`, replacing
|
|
23
|
+
* each with its text content. Adjacent text nodes are merged so the DOM
|
|
24
|
+
* returns to its pre-highlight state.
|
|
25
|
+
*/
|
|
26
|
+
export declare const clearHighlights: (root: HTMLElement, matchClass: string) => void;
|
|
27
|
+
/**
|
|
28
|
+
* Wrap every occurrence of `query` inside `root`'s text nodes in
|
|
29
|
+
* `<mark class="${matchClass}">`. Existing marks are cleared first so
|
|
30
|
+
* the function is safe to call on every render commit — stale marks from
|
|
31
|
+
* a previous query are replaced, not accumulated.
|
|
32
|
+
*/
|
|
33
|
+
export declare const highlightElement: (root: HTMLElement, query: string, caseSensitive: boolean, matchClass: string) => void;
|
|
34
|
+
//# sourceMappingURL=match.d.ts.map
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* vlist — Search Plugin (RFC-008, Phase 1)
|
|
3
|
+
*
|
|
4
|
+
* A ready-to-use search bar with client-side filtering, match navigation, and
|
|
5
|
+
* `<mark>` highlighting. Operates at the data layer (no `setRenderFn`), so it
|
|
6
|
+
* composes with any layout.
|
|
7
|
+
*
|
|
8
|
+
* - **filter** mode (default): virtually hides non-matching items via
|
|
9
|
+
* `setGetItemFn` + `setVirtualTotalFn` (non-destructive — clear restores).
|
|
10
|
+
* - **navigate** mode: keeps all items, scrolls between matches, highlights
|
|
11
|
+
* the current one.
|
|
12
|
+
*
|
|
13
|
+
* Phase 2 (server-side search via `data()`, column-aware, fuzzy, query syntax)
|
|
14
|
+
* is out of scope here.
|
|
15
|
+
*/
|
|
16
|
+
import type { VListItem } from "../../types";
|
|
17
|
+
import type { VListPlugin } from "../../core/types";
|
|
18
|
+
import { type FieldAccessor } from "./match";
|
|
19
|
+
/**
|
|
20
|
+
* Consumer-facing UI text for the search bar (RFC-010 — Externalized UI Text).
|
|
21
|
+
* This is the plugin's entire human-language surface: static accessible names
|
|
22
|
+
* plus the dynamic counter formatters. All fields are optional; unset fields
|
|
23
|
+
* fall back to {@link DEFAULT_SEARCH_TEXT} (English). Consumers localizing for a
|
|
24
|
+
* non-English document should override these *and* set `lang` on the page.
|
|
25
|
+
*/
|
|
26
|
+
export interface SearchText {
|
|
27
|
+
/** Input placeholder + accessible name. */
|
|
28
|
+
placeholder?: string;
|
|
29
|
+
/** Accessible name for the clear (×) button. */
|
|
30
|
+
clear?: string;
|
|
31
|
+
/** Accessible name for the previous-match button (navigate mode). */
|
|
32
|
+
previous?: string;
|
|
33
|
+
/** Accessible name for the next-match button (navigate mode). */
|
|
34
|
+
next?: string;
|
|
35
|
+
/** Counter text when there are no matches. */
|
|
36
|
+
noResults?: string;
|
|
37
|
+
/** Counter text in filter mode — total match count. */
|
|
38
|
+
results?: (count: number) => string;
|
|
39
|
+
/** Counter text in navigate mode — current position within matches. */
|
|
40
|
+
position?: (current: number, total: number) => string;
|
|
41
|
+
/** Accessible name for the `role="search"` landmark. Unnamed when omitted. */
|
|
42
|
+
region?: string;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Default English UI text for the search plugin. The single, documented,
|
|
46
|
+
* fully-overridable language surface (RFC-010): the only place human-readable
|
|
47
|
+
* strings live in the library.
|
|
48
|
+
*/
|
|
49
|
+
export declare const DEFAULT_SEARCH_TEXT: Required<SearchText>;
|
|
50
|
+
export interface SearchPluginConfig<T extends VListItem = VListItem> {
|
|
51
|
+
/** Hide non-matching items ("filter") or jump between matches ("navigate"). Default "filter". */
|
|
52
|
+
mode?: "filter" | "navigate";
|
|
53
|
+
/** Where to place the search bar. "none" = invisible, keyboard-only. Default "top". */
|
|
54
|
+
position?: "top" | "bottom" | "none";
|
|
55
|
+
/** Field(s) to search — a property key, accessor, or (default) all string values. */
|
|
56
|
+
field?: FieldAccessor<T>;
|
|
57
|
+
/** Case-sensitive matching. Default false. */
|
|
58
|
+
caseSensitive?: boolean;
|
|
59
|
+
/**
|
|
60
|
+
* Highlight matched substrings in rendered rows by wrapping them in
|
|
61
|
+
* `<mark class="{prefix}-search-match">`. Default `true`.
|
|
62
|
+
*
|
|
63
|
+
* - `false` — disable highlighting.
|
|
64
|
+
* - `{ within }` — restrict highlighting to descendants matching the CSS
|
|
65
|
+
* selector (e.g. `".person__name"`) instead of the whole row. Useful when
|
|
66
|
+
* the query can coincidentally appear in fields you didn't search.
|
|
67
|
+
*/
|
|
68
|
+
highlight?: boolean | {
|
|
69
|
+
within?: string;
|
|
70
|
+
};
|
|
71
|
+
/** Minimum query length to trigger search. Default 1. */
|
|
72
|
+
minLength?: number;
|
|
73
|
+
/** Auto-close the search bar after N ms of inactivity (0 = never). Default 0. */
|
|
74
|
+
cancelTimeout?: number;
|
|
75
|
+
/** Visual style of the search bar. `"md3"` applies a Material Design 3 pill
|
|
76
|
+
* (requires the search stylesheet). Default `"default"`. */
|
|
77
|
+
variant?: "default" | "md3";
|
|
78
|
+
/** Consumer-supplied UI text / localization. Falls back to {@link DEFAULT_SEARCH_TEXT}. */
|
|
79
|
+
text?: SearchText;
|
|
80
|
+
}
|
|
81
|
+
export interface SearchPluginInstance<T extends VListItem = VListItem> extends VListPlugin<T> {
|
|
82
|
+
}
|
|
83
|
+
export declare function search<T extends VListItem = VListItem>(config?: SearchPluginConfig<T>): SearchPluginInstance<T>;
|
|
84
|
+
//# sourceMappingURL=plugin.d.ts.map
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* vlist/search — Search bar DOM
|
|
3
|
+
*
|
|
4
|
+
* A modular, MD3-aligned structure (mirrors mtrl `_search.scss`):
|
|
5
|
+
*
|
|
6
|
+
* .{p}-search .{p}-search--bar .{p}-search--{top|bottom} (role="search")
|
|
7
|
+
* └── .{p}-search__container
|
|
8
|
+
* ├── span.{p}-search__leading-icon (magnifier — decorative)
|
|
9
|
+
* ├── .{p}-search__input-wrapper
|
|
10
|
+
* │ └── input.{p}-search__input
|
|
11
|
+
* ├── span.{p}-search__counter (match count — empty when idle)
|
|
12
|
+
* ├── button.{p}-search__nav-prev (navigate mode only)
|
|
13
|
+
* ├── button.{p}-search__nav-next (navigate mode only)
|
|
14
|
+
* └── button.{p}-search__clear-button (--hidden when empty)
|
|
15
|
+
*
|
|
16
|
+
* Per RFC-010, the bar carries no inline human-language text: all accessible
|
|
17
|
+
* names come from the `text` parameter (consumer-supplied, with English
|
|
18
|
+
* defaults resolved in the plugin). The leading magnifier is decorative
|
|
19
|
+
* (`aria-hidden`, not focusable, no accessible name) — the input is the
|
|
20
|
+
* meaningful control. The `role="search"` landmark is unnamed unless the
|
|
21
|
+
* consumer passes `text.region`.
|
|
22
|
+
*
|
|
23
|
+
* Invisible mode (`position: "none"`) renders no bar — the plugin drives the
|
|
24
|
+
* query from keystrokes only.
|
|
25
|
+
*/
|
|
26
|
+
export interface SearchBarCallbacks {
|
|
27
|
+
onInput(value: string): void;
|
|
28
|
+
onClear(): void;
|
|
29
|
+
onPrev(): void;
|
|
30
|
+
onNext(): void;
|
|
31
|
+
/** Forwarded keydown from the input (Enter / Escape / arrows). */
|
|
32
|
+
onKeydown(event: KeyboardEvent): void;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Resolved accessible names for the bar (consumer-supplied via the plugin's
|
|
36
|
+
* `text` config; the plugin fills English defaults). `region` is `""` when the
|
|
37
|
+
* search landmark should stay unnamed (the default).
|
|
38
|
+
*/
|
|
39
|
+
export interface SearchBarText {
|
|
40
|
+
placeholder: string;
|
|
41
|
+
clear: string;
|
|
42
|
+
previous: string;
|
|
43
|
+
next: string;
|
|
44
|
+
region: string;
|
|
45
|
+
}
|
|
46
|
+
export interface SearchBar {
|
|
47
|
+
readonly root: HTMLElement;
|
|
48
|
+
readonly input: HTMLInputElement;
|
|
49
|
+
setCounter(text: string): void;
|
|
50
|
+
/** Show/hide the prev/next buttons (navigate mode only). */
|
|
51
|
+
showNav(show: boolean): void;
|
|
52
|
+
focus(): void;
|
|
53
|
+
setValue(value: string): void;
|
|
54
|
+
destroy(): void;
|
|
55
|
+
}
|
|
56
|
+
export declare const createSearchBar: (parent: HTMLElement, before: HTMLElement | null, classPrefix: string, position: "top" | "bottom", text: SearchBarText, listId: string | undefined, cb: SearchBarCallbacks) => SearchBar;
|
|
57
|
+
//# sourceMappingURL=searchbar.d.ts.map
|
|
@@ -11,6 +11,13 @@ export interface SelectionPluginConfig {
|
|
|
11
11
|
initial?: Array<string | number>;
|
|
12
12
|
followFocus?: boolean;
|
|
13
13
|
focusOnClick?: boolean;
|
|
14
|
+
/**
|
|
15
|
+
* Whether this plugin handles arrow/Home/End/PageUp-Down/Enter/Space
|
|
16
|
+
* keyboard navigation. Default true. Set false to keep click-selection and
|
|
17
|
+
* the selection model while letting an outer system own keyboard navigation
|
|
18
|
+
* (e.g. a global, focus-independent hotkey layer).
|
|
19
|
+
*/
|
|
20
|
+
keyboard?: boolean;
|
|
14
21
|
}
|
|
15
22
|
export declare function selection<T extends VListItem = VListItem>(config?: SelectionPluginConfig): VListPlugin<T>;
|
|
16
23
|
//# sourceMappingURL=plugin.d.ts.map
|
package/dist/size.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"base":{"minified":"22.
|
|
1
|
+
{"base":{"minified":"22.5","gzipped":"8.3","minBytes":22998,"gzBytes":8485},"a11y":{"minified":"25.5","gzipped":"9.4","minBytes":26152,"gzBytes":9632},"selection":{"minified":"31.2","gzipped":"10.8","minBytes":31986,"gzBytes":11110},"data":{"minified":"36.2","gzipped":"13.1","minBytes":37020,"gzBytes":13429},"scrollbar":{"minified":"29.6","gzipped":"10.3","minBytes":30313,"gzBytes":10547},"sortable":{"minified":"31.8","gzipped":"11.2","minBytes":32604,"gzBytes":11439},"groups":{"minified":"38.3","gzipped":"13.6","minBytes":39267,"gzBytes":13901},"scale":{"minified":"36.5","gzipped":"12.5","minBytes":37365,"gzBytes":12768},"page":{"minified":"24.9","gzipped":"9.1","minBytes":25484,"gzBytes":9269},"snapshots":{"minified":"26.1","gzipped":"9.6","minBytes":26759,"gzBytes":9789},"transition":{"minified":"29.2","gzipped":"10.1","minBytes":29935,"gzBytes":10365},"autosize":{"minified":"24.9","gzipped":"9.1","minBytes":25481,"gzBytes":9367},"grid":{"minified":"31.0","gzipped":"11.3","minBytes":31754,"gzBytes":11532},"table":{"minified":"42.0","gzipped":"14.5","minBytes":42997,"gzBytes":14880},"masonry":{"minified":"33.4","gzipped":"12.2","minBytes":34165,"gzBytes":12538},"tree":{"minified":"38.5","gzipped":"13.6","minBytes":39386,"gzBytes":13975},"search":{"minified":"31.6","gzipped":"11.5","minBytes":32314,"gzBytes":11745}}
|
package/dist/types.d.ts
CHANGED
|
@@ -370,11 +370,23 @@ export interface TreeState {
|
|
|
370
370
|
isLastChild: boolean;
|
|
371
371
|
loading: boolean;
|
|
372
372
|
}
|
|
373
|
+
/** Search-specific state available in templates when the search plugin is active */
|
|
374
|
+
export interface SearchState {
|
|
375
|
+
/** Whether this item matches the current query */
|
|
376
|
+
matched: boolean;
|
|
377
|
+
/** Current search query (empty string when no search is active) */
|
|
378
|
+
query: string;
|
|
379
|
+
/** This item's position in the match list (-1 if not matched) */
|
|
380
|
+
matchIndex: number;
|
|
381
|
+
/** Whether this is the currently focused match (navigate mode) */
|
|
382
|
+
isCurrent: boolean;
|
|
383
|
+
}
|
|
373
384
|
/** State passed to template */
|
|
374
385
|
export interface ItemState {
|
|
375
386
|
selected: boolean;
|
|
376
387
|
focused: boolean;
|
|
377
388
|
tree?: TreeState;
|
|
389
|
+
search?: SearchState;
|
|
378
390
|
}
|
|
379
391
|
/** Selection mode */
|
|
380
392
|
export type SelectionMode = "none" | "single" | "multiple";
|
|
@@ -601,6 +613,23 @@ export interface VListEvents<T extends VListItem = VListItem> extends EventMap {
|
|
|
601
613
|
item: T;
|
|
602
614
|
error: unknown;
|
|
603
615
|
};
|
|
616
|
+
/** Search bar opened / focused */
|
|
617
|
+
"search:open": undefined;
|
|
618
|
+
/** Search bar closed and query cleared */
|
|
619
|
+
"search:close": undefined;
|
|
620
|
+
/** Query or results changed */
|
|
621
|
+
"search:change": {
|
|
622
|
+
query: string;
|
|
623
|
+
matches: number;
|
|
624
|
+
total: number;
|
|
625
|
+
};
|
|
626
|
+
/** Navigated to a match (navigate mode) */
|
|
627
|
+
"search:match": {
|
|
628
|
+
index: number;
|
|
629
|
+
item: T | undefined;
|
|
630
|
+
matchIndex: number;
|
|
631
|
+
matches: number;
|
|
632
|
+
};
|
|
604
633
|
/** Destroy — fired just before the instance is torn down */
|
|
605
634
|
destroy: undefined;
|
|
606
635
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
:root{--vlist-search-match-bg:#fde047;--vlist-search-match-current-bg:#f59e0b;--vlist-search-md3-surface:#ececf1;--vlist-search-md3-state:rgba(0,0,0,0.08)}[data-theme-mode="dark"]{--vlist-search-match-bg:#92710b;--vlist-search-match-current-bg:#b45309;--vlist-search-md3-surface:#2b3039;--vlist-search-md3-state:rgba(255,255,255,0.08)}@media (prefers-color-scheme:dark){:root:not([data-theme-mode="light"]):not([data-theme-mode="dark"]){--vlist-search-match-bg:#92710b;--vlist-search-match-current-bg:#b45309;--vlist-search-md3-surface:#2b3039;--vlist-search-md3-state:rgba(255,255,255,0.08)}}.dark{--vlist-search-match-bg:#92710b;--vlist-search-match-current-bg:#b45309;--vlist-search-md3-surface:#2b3039;--vlist-search-md3-state:rgba(255,255,255,0.08)}.vlist--has-search{display:flex;flex-direction:column}.vlist--has-search .vlist-viewport{flex:1 1 auto;min-height:0}.vlist-search{flex:0 0 auto;box-sizing:border-box;display:flex}.vlist-search__container{display:flex;align-items:center;gap:6px;width:100%;box-sizing:border-box;padding:6px 8px;background-color:var(--vlist-bg);border-bottom:1px solid var(--vlist-border)}.vlist-search--bottom .vlist-search__container{border-bottom:none;border-top:1px solid var(--vlist-border)}.vlist-search__leading-icon,.vlist-search__nav-prev,.vlist-search__nav-next,.vlist-search__clear-button{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;padding:0;border:none;border-radius:4px;background:transparent;color:var(--vlist-text-muted);cursor:pointer}.vlist-search__leading-icon svg,.vlist-search__nav-prev svg,.vlist-search__nav-next svg,.vlist-search__clear-button svg{width:18px;height:18px;fill:currentColor}.vlist-search__leading-icon:hover,.vlist-search__nav-prev:hover,.vlist-search__nav-next:hover,.vlist-search__clear-button:hover{color:var(--vlist-text);background-color:var(--vlist-bg-hover)}.vlist-search__clear-button--hidden,.vlist-search__nav-prev--hidden,.vlist-search__nav-next--hidden{display:none}.vlist-search__input-wrapper{flex:1 1 auto;min-width:0;display:flex;align-items:center}.vlist-search__input{width:100%;min-width:0;padding:4px 8px;font:inherit;color:var(--vlist-text);background-color:var(--vlist-bg);border:1px solid var(--vlist-border);border-radius:4px;outline:none;box-sizing:border-box}.vlist-search__input:focus{border-color:var(--vlist-focus-ring)}.vlist-search__input:focus,.vlist-search__input:focus-visible{outline:none}.vlist-search__counter{flex:0 0 auto;font-size:0.75rem;color:var(--vlist-text-muted);white-space:nowrap}.vlist-search__counter:empty{display:none}.vlist-search-match{color:inherit;background-color:var(--vlist-search-match-bg);border-radius:2px}.vlist-search-match--current{background-color:var(--vlist-search-match-current-bg)}.vlist-search--md3{display:flex;align-items:center;box-sizing:border-box;height:56px;padding:0 12px;border-bottom:1px solid var(--vlist-border)}.vlist-search--md3 .vlist-search__container{flex:1 1 auto;height:40px;padding:0 16px;gap:0;border:none;border-radius:20px;overflow:hidden;background-color:var(--vlist-search-md3-surface);transition:background-color 200ms cubic-bezier(0.2,0,0,1)}.vlist-search--md3 .vlist-search__leading-icon{width:24px;height:24px;margin-right:16px;border-radius:50%;color:var(--vlist-text)}.vlist-search--md3 .vlist-search__leading-icon svg{width:24px;height:24px}.vlist-search--md3 .vlist-search__input{width:100%;height:100%;padding:8px 0;border:none;background:transparent;font:inherit;font-size:16px;line-height:24px;color:var(--vlist-text);caret-color:var(--vlist-focus-ring)}.vlist-search--md3 .vlist-search__input::placeholder{color:var(--vlist-text-muted)}.vlist-search--md3 .vlist-search__counter{margin-left:16px;font-size:12px;color:var(--vlist-text-muted)}.vlist-search--md3 .vlist-search__nav-prev,.vlist-search--md3 .vlist-search__nav-next,.vlist-search--md3 .vlist-search__clear-button{width:24px;height:24px;margin-left:16px;border-radius:50%;color:var(--vlist-text-muted);transition:background-color 200ms cubic-bezier(0.2,0,0,1)}.vlist-search--md3 .vlist-search__nav-prev svg,.vlist-search--md3 .vlist-search__nav-next svg,.vlist-search--md3 .vlist-search__clear-button svg{width:20px;height:20px}.vlist-search--md3 .vlist-search__leading-icon:hover,.vlist-search--md3 .vlist-search__nav-prev:hover,.vlist-search--md3 .vlist-search__nav-next:hover,.vlist-search--md3 .vlist-search__clear-button:hover{background-color:var(--vlist-search-md3-state)}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "vlist",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.3.0",
|
|
4
4
|
"description": "Lightweight, high-performance virtual list with zero dependencies",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Floor IO",
|
|
@@ -45,6 +45,7 @@
|
|
|
45
45
|
"./styles/table": "./dist/vlist-table.css",
|
|
46
46
|
"./styles/extras": "./dist/vlist-extras.css",
|
|
47
47
|
"./styles/tree": "./dist/vlist-tree.css",
|
|
48
|
+
"./styles/search": "./dist/vlist-search.css",
|
|
48
49
|
"./package.json": "./package.json"
|
|
49
50
|
},
|
|
50
51
|
"files": [
|