@smilodon/core 1.4.4 → 1.4.6

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.
@@ -30,6 +30,8 @@ export declare class EnhancedSelect extends HTMLElement {
30
30
  private _errorMessage;
31
31
  private _boundArrowClick;
32
32
  private _arrowContainer?;
33
+ private _clearControl?;
34
+ private _clearControlIcon?;
33
35
  private _pendingFirstRenderMark;
34
36
  private _pendingSearchRenderMark;
35
37
  private _rangeAnchorIndex;
@@ -56,6 +58,7 @@ export declare class EnhancedSelect extends HTMLElement {
56
58
  private _createOptionsContainer;
57
59
  private _createLiveRegion;
58
60
  private _createArrowContainer;
61
+ private _createClearControl;
59
62
  private _assembleDOM;
60
63
  private _initializeStyles;
61
64
  private _attachEventListeners;
@@ -125,6 +128,10 @@ export declare class EnhancedSelect extends HTMLElement {
125
128
  * Clear all selections
126
129
  */
127
130
  clear(): void;
131
+ /**
132
+ * Clear search query and restore full option list
133
+ */
134
+ clearSearch(): void;
128
135
  /**
129
136
  * Open dropdown
130
137
  */
@@ -137,6 +144,8 @@ export declare class EnhancedSelect extends HTMLElement {
137
144
  * Update component configuration
138
145
  */
139
146
  updateConfig(config: Partial<GlobalSelectConfig>): void;
147
+ private _handleClearControlClick;
148
+ private _syncClearControlState;
140
149
  /**
141
150
  * Set error state
142
151
  */
@@ -44,6 +44,20 @@ export interface ExpandableConfig {
44
44
  /** Label for the collapse button */
45
45
  collapseLabel?: string;
46
46
  }
47
+ export interface ClearControlConfig {
48
+ /** Enable clear control button inside input container */
49
+ enabled: boolean;
50
+ /** Clear selected values when button is clicked */
51
+ clearSelection?: boolean;
52
+ /** Clear search query when button is clicked */
53
+ clearSearch?: boolean;
54
+ /** Hide clear control when there is nothing to clear */
55
+ hideWhenEmpty?: boolean;
56
+ /** Accessible label for clear control */
57
+ ariaLabel?: string;
58
+ /** Text/icon content shown inside the clear control */
59
+ icon?: string;
60
+ }
47
61
  export interface SelectionConfig {
48
62
  /** Single or multi-select mode */
49
63
  mode: 'single' | 'multi';
@@ -134,6 +148,11 @@ export interface CallbackConfig {
134
148
  onLoadMore?: (page: number) => void;
135
149
  /** Called when selection changes */
136
150
  onChange?: (selectedItems: unknown[], selectedValues: unknown[]) => void;
151
+ /** Called when clear control is used */
152
+ onClear?: (detail: {
153
+ clearedSelection: boolean;
154
+ clearedSearch: boolean;
155
+ }) => void;
137
156
  /** Called on error */
138
157
  onError?: (error: Error) => void;
139
158
  }
@@ -154,6 +173,8 @@ export interface GlobalSelectConfig {
154
173
  infiniteScroll: InfiniteScrollConfig;
155
174
  /** Expandable dropdown configuration */
156
175
  expandable: ExpandableConfig;
176
+ /** Clear control button configuration */
177
+ clearControl: ClearControlConfig;
157
178
  /** Callbacks */
158
179
  callbacks: CallbackConfig;
159
180
  /** Enable/disable entire component */
@@ -1,5 +1,5 @@
1
1
  export * from './types.js';
2
- export type { SelectEventDetail, OpenEventDetail, CloseEventDetail, SearchEventDetail, ChangeEventDetail, LoadMoreEventDetail, RemoveEventDetail, ErrorEventDetail, PageLoadedEventDetail, GroupedItem, RemoteConfig, Placement, Strategy, NativeSelectOptions, RendererHelpers, SelectEventsDetailMap, SelectEventName } from './types.js';
2
+ export type { SelectEventDetail, OpenEventDetail, CloseEventDetail, SearchEventDetail, ChangeEventDetail, LoadMoreEventDetail, RemoveEventDetail, ClearEventDetail, ErrorEventDetail, PageLoadedEventDetail, GroupedItem, RemoteConfig, Placement, Strategy, NativeSelectOptions, RendererHelpers, SelectEventsDetailMap, SelectEventName } from './types.js';
3
3
  export type { CustomOptionContract, CustomOptionContext, CustomOptionFactory, ExtendedSelectItem, OptionRendererMode, CustomOptionConfig, CustomOptionEvents } from './types/custom-option.js';
4
4
  export * from './renderers/contracts.js';
5
5
  export * from './components/native-select.js';
@@ -55,6 +55,10 @@ export interface RemoveEventDetail {
55
55
  item: unknown;
56
56
  index: number;
57
57
  }
58
+ export interface ClearEventDetail {
59
+ clearedSelection: boolean;
60
+ clearedSearch: boolean;
61
+ }
58
62
  export interface SelectEventsDetailMap {
59
63
  select: SelectEventDetail;
60
64
  open: OpenEventDetail;
@@ -65,6 +69,7 @@ export interface SelectEventsDetailMap {
65
69
  change: ChangeEventDetail;
66
70
  loadMore: LoadMoreEventDetail;
67
71
  remove: RemoveEventDetail;
72
+ clear: ClearEventDetail;
68
73
  }
69
74
  export type SelectEventName = keyof SelectEventsDetailMap;
70
75
  export interface RendererHelpers {
@@ -58,7 +58,7 @@ export declare function applyDefaultTheme(element: HTMLElement): void;
58
58
  * This CSS is CSP-safe because it's defined at build time as a string constant,
59
59
  * not generated at runtime.
60
60
  */
61
- export declare const shadowDOMStyles = "\n:host {\n display: block;\n box-sizing: border-box;\n font-family: var(--ns-font-family, system-ui, -apple-system, sans-serif);\n font-size: var(--ns-font-size, 14px);\n}\n\n* {\n box-sizing: border-box;\n}\n\n.ns-list {\n position: relative;\n overflow: auto;\n max-height: var(--ns-max-height, 300px);\n border: 1px solid var(--ns-border-color, #ccc);\n border-radius: var(--ns-border-radius, 4px);\n background: var(--ns-bg, white);\n outline: none;\n}\n\n.ns-list:focus {\n outline: var(--ns-focus-outline, 2px solid #0066cc);\n outline-offset: -2px;\n}\n\n.ns-item {\n padding: var(--ns-item-padding, 8px 12px);\n min-height: var(--ns-item-height, 40px);\n color: var(--ns-item-color, inherit);\n background: var(--ns-item-bg, transparent);\n cursor: pointer;\n user-select: none;\n display: flex;\n align-items: center;\n transition: background-color 0.15s ease;\n}\n\n.ns-item:hover {\n background: var(--ns-item-hover-bg, rgba(0, 0, 0, 0.05));\n}\n\n.ns-item[aria-selected=\"true\"] {\n background: var(--ns-item-selected-bg, rgba(0, 102, 204, 0.1));\n color: var(--ns-item-selected-color, #0066cc);\n}\n\n.ns-item[data-active=\"true\"] {\n background: var(--ns-item-active-bg, rgba(0, 102, 204, 0.2));\n}\n\n.ns-item[aria-disabled=\"true\"] {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.ns-viewport {\n position: relative;\n overflow: auto;\n -webkit-overflow-scrolling: touch;\n}\n\n.ns-spacer {\n position: absolute;\n top: 0;\n left: 0;\n width: 1px;\n pointer-events: none;\n}\n\n/* Screen reader only */\n.ns-sr-only {\n position: absolute;\n left: -9999px;\n width: 1px;\n height: 1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n}\n\n/* Portal mode (teleported outside shadow DOM) */\n.ns-portal {\n position: fixed;\n z-index: var(--ns-portal-z-index, 9999);\n}\n\n/* CSP warning banner (only shown in development) */\n.ns-csp-warning {\n padding: 8px;\n background: #fff3cd;\n border: 1px solid #ffc107;\n border-radius: 4px;\n color: #856404;\n font-size: 12px;\n margin-bottom: 8px;\n}\n";
61
+ export declare const shadowDOMStyles = "\n:host {\n display: block;\n box-sizing: border-box;\n font-family: var(--ns-font-family, system-ui, -apple-system, sans-serif);\n font-size: var(--ns-font-size, 14px);\n}\n\n* {\n box-sizing: border-box;\n}\n\n.ns-list {\n position: relative;\n overflow: auto;\n max-height: var(--ns-max-height, 300px);\n border: 1px solid var(--ns-border-color, #ccc);\n border-radius: var(--ns-border-radius, 4px);\n background: var(--ns-bg, white);\n outline: none;\n}\n\n.ns-list:focus {\n outline: var(--ns-focus-outline, 2px solid #0066cc);\n outline-offset: -2px;\n}\n\n.ns-item {\n padding: var(--ns-item-padding, 8px 12px);\n min-height: var(--ns-item-height, 40px);\n color: var(--ns-item-color, inherit);\n background: var(--ns-item-bg, transparent);\n cursor: pointer;\n user-select: none;\n display: flex;\n align-items: center;\n transition: background-color 0.15s ease;\n}\n\n.ns-item:hover {\n background: var(--ns-item-hover-bg, rgba(0, 0, 0, 0.05));\n}\n\n.ns-item[aria-selected=\"true\"] {\n background: var(--ns-item-selected-bg, rgba(0, 102, 204, 0.1));\n color: var(--ns-item-selected-color, #0066cc);\n}\n\n.ns-item[data-active=\"true\"]:not([aria-selected=\"true\"]) {\n background: var(--ns-item-active-bg, rgba(0, 102, 204, 0.2));\n}\n\n.ns-item[aria-selected=\"true\"][data-active=\"true\"] {\n background: var(--ns-item-selected-active-bg, var(--ns-item-selected-bg, rgba(0, 102, 204, 0.1)));\n color: var(--ns-item-selected-active-color, var(--ns-item-selected-color, #0066cc));\n outline: var(--ns-item-selected-active-outline, 2px solid #0066cc);\n outline-offset: -2px;\n}\n\n.ns-item[aria-disabled=\"true\"] {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.ns-viewport {\n position: relative;\n overflow: auto;\n -webkit-overflow-scrolling: touch;\n}\n\n.ns-spacer {\n position: absolute;\n top: 0;\n left: 0;\n width: 1px;\n pointer-events: none;\n}\n\n/* Screen reader only */\n.ns-sr-only {\n position: absolute;\n left: -9999px;\n width: 1px;\n height: 1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n}\n\n/* Portal mode (teleported outside shadow DOM) */\n.ns-portal {\n position: fixed;\n z-index: var(--ns-portal-z-index, 9999);\n}\n\n/* CSP warning banner (only shown in development) */\n.ns-csp-warning {\n padding: 8px;\n background: #fff3cd;\n border: 1px solid #ffc107;\n border-radius: 4px;\n color: #856404;\n font-size: 12px;\n margin-bottom: 8px;\n}\n";
62
62
  /**
63
63
  * Inject static styles into shadow root (CSP-safe).
64
64
  * Only called once during component initialization.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@smilodon/core",
3
- "version": "1.4.4",
3
+ "version": "1.4.6",
4
4
  "description": "High-performance native select component with extreme-scale virtualization - React, Vue, Svelte, Vanilla JS",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",