snice 1.13.2 → 1.13.4
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/bin/templates/base/README.md +1 -1
- package/dist/components/accordion/snice-accordion-item.d.ts +25 -0
- package/dist/components/accordion/snice-accordion-item.js +260 -0
- package/dist/components/accordion/snice-accordion-item.js.map +1 -0
- package/dist/components/accordion/snice-accordion.d.ts +28 -0
- package/dist/components/accordion/snice-accordion.js +221 -0
- package/dist/components/accordion/snice-accordion.js.map +1 -0
- package/dist/components/accordion/snice-accordion.types.d.ts +29 -0
- package/dist/components/accordion/snice-accordion.types.js +2 -0
- package/dist/components/accordion/snice-accordion.types.js.map +1 -0
- package/dist/components/alert/snice-alert.d.ts +26 -0
- package/dist/components/alert/snice-alert.js +191 -0
- package/dist/components/alert/snice-alert.js.map +1 -0
- package/dist/components/alert/snice-alert.types.d.ts +11 -0
- package/dist/components/alert/snice-alert.types.js +2 -0
- package/dist/components/alert/snice-alert.types.js.map +1 -0
- package/dist/components/avatar/snice-avatar.d.ts +24 -0
- package/dist/components/avatar/snice-avatar.js +177 -0
- package/dist/components/avatar/snice-avatar.js.map +1 -0
- package/dist/components/avatar/snice-avatar.types.d.ts +12 -0
- package/dist/components/avatar/snice-avatar.types.js +2 -0
- package/dist/components/avatar/snice-avatar.types.js.map +1 -0
- package/dist/components/badge/snice-badge.d.ts +25 -0
- package/dist/components/badge/snice-badge.js +157 -0
- package/dist/components/badge/snice-badge.js.map +1 -0
- package/dist/components/badge/snice-badge.types.d.ts +15 -0
- package/dist/components/badge/snice-badge.types.js +2 -0
- package/dist/components/badge/snice-badge.types.js.map +1 -0
- package/dist/components/breadcrumbs/snice-breadcrumbs.d.ts +27 -0
- package/dist/components/breadcrumbs/snice-breadcrumbs.js +212 -0
- package/dist/components/breadcrumbs/snice-breadcrumbs.js.map +1 -0
- package/dist/components/breadcrumbs/snice-breadcrumbs.types.d.ts +23 -0
- package/dist/components/breadcrumbs/snice-breadcrumbs.types.js +2 -0
- package/dist/components/breadcrumbs/snice-breadcrumbs.types.js.map +1 -0
- package/dist/components/breadcrumbs/snice-crumb.d.ts +9 -0
- package/dist/components/breadcrumbs/snice-crumb.js +50 -0
- package/dist/components/breadcrumbs/snice-crumb.js.map +1 -0
- package/dist/components/button/snice-button.d.ts +32 -0
- package/dist/components/button/snice-button.js +212 -0
- package/dist/components/button/snice-button.js.map +1 -0
- package/dist/components/button/snice-button.types.d.ts +23 -0
- package/dist/components/button/snice-button.types.js +2 -0
- package/dist/components/button/snice-button.types.js.map +1 -0
- package/dist/components/card/snice-card.d.ts +19 -0
- package/dist/components/card/snice-card.js +132 -0
- package/dist/components/card/snice-card.js.map +1 -0
- package/dist/components/card/snice-card.types.d.ts +9 -0
- package/dist/components/card/snice-card.types.js +2 -0
- package/dist/components/card/snice-card.types.js.map +1 -0
- package/dist/components/checkbox/snice-checkbox.d.ts +34 -0
- package/dist/components/checkbox/snice-checkbox.js +289 -0
- package/dist/components/checkbox/snice-checkbox.js.map +1 -0
- package/dist/components/checkbox/snice-checkbox.types.d.ts +20 -0
- package/dist/components/checkbox/snice-checkbox.types.js +2 -0
- package/dist/components/checkbox/snice-checkbox.types.js.map +1 -0
- package/dist/components/chip/snice-chip.d.ts +28 -0
- package/dist/components/chip/snice-chip.js +203 -0
- package/dist/components/chip/snice-chip.js.map +1 -0
- package/dist/components/chip/snice-chip.types.d.ts +14 -0
- package/dist/components/chip/snice-chip.types.js +2 -0
- package/dist/components/chip/snice-chip.types.js.map +1 -0
- package/dist/components/date-picker/snice-date-picker.d.ts +82 -0
- package/dist/components/date-picker/snice-date-picker.js +880 -0
- package/dist/components/date-picker/snice-date-picker.js.map +1 -0
- package/dist/components/date-picker/snice-date-picker.types.d.ts +71 -0
- package/dist/components/date-picker/snice-date-picker.types.js +2 -0
- package/dist/components/date-picker/snice-date-picker.types.js.map +1 -0
- package/dist/components/divider/snice-divider.d.ts +17 -0
- package/dist/components/divider/snice-divider.js +111 -0
- package/dist/components/divider/snice-divider.js.map +1 -0
- package/dist/components/divider/snice-divider.types.d.ts +14 -0
- package/dist/components/divider/snice-divider.types.js +2 -0
- package/dist/components/divider/snice-divider.types.js.map +1 -0
- package/dist/components/drawer/snice-drawer.d.ts +37 -0
- package/dist/components/drawer/snice-drawer.js +335 -0
- package/dist/components/drawer/snice-drawer.js.map +1 -0
- package/dist/components/drawer/snice-drawer.types.d.ts +16 -0
- package/dist/components/drawer/snice-drawer.types.js +2 -0
- package/dist/components/drawer/snice-drawer.types.js.map +1 -0
- package/dist/components/input/snice-input.d.ts +65 -0
- package/dist/components/input/snice-input.js +603 -0
- package/dist/components/input/snice-input.js.map +1 -0
- package/dist/components/input/snice-input.types.d.ts +53 -0
- package/dist/components/input/snice-input.types.js +2 -0
- package/dist/components/input/snice-input.types.js.map +1 -0
- package/dist/components/layout/snice-layout-blog.d.ts +4 -0
- package/dist/components/layout/snice-layout-blog.js +56 -0
- package/dist/components/layout/snice-layout-blog.js.map +1 -0
- package/dist/components/layout/snice-layout-card.d.ts +6 -0
- package/dist/components/layout/snice-layout-card.js +53 -0
- package/dist/components/layout/snice-layout-card.js.map +1 -0
- package/dist/components/layout/snice-layout-centered.d.ts +5 -0
- package/dist/components/layout/snice-layout-centered.js +38 -0
- package/dist/components/layout/snice-layout-centered.js.map +1 -0
- package/dist/components/layout/snice-layout-dashboard.d.ts +4 -0
- package/dist/components/layout/snice-layout-dashboard.js +53 -0
- package/dist/components/layout/snice-layout-dashboard.js.map +1 -0
- package/dist/components/layout/snice-layout-fullscreen.d.ts +5 -0
- package/dist/components/layout/snice-layout-fullscreen.js +50 -0
- package/dist/components/layout/snice-layout-fullscreen.js.map +1 -0
- package/dist/components/layout/snice-layout-landing.d.ts +4 -0
- package/dist/components/layout/snice-layout-landing.js +55 -0
- package/dist/components/layout/snice-layout-landing.js.map +1 -0
- package/dist/components/layout/snice-layout-minimal.d.ts +4 -0
- package/dist/components/layout/snice-layout-minimal.js +27 -0
- package/dist/components/layout/snice-layout-minimal.js.map +1 -0
- package/dist/components/layout/snice-layout-sidebar.d.ts +5 -0
- package/dist/components/layout/snice-layout-sidebar.js +64 -0
- package/dist/components/layout/snice-layout-sidebar.js.map +1 -0
- package/dist/components/layout/snice-layout-split.d.ts +6 -0
- package/dist/components/layout/snice-layout-split.js +47 -0
- package/dist/components/layout/snice-layout-split.js.map +1 -0
- package/dist/components/layout/snice-layout.d.ts +4 -0
- package/dist/components/layout/snice-layout.js +43 -0
- package/dist/components/layout/snice-layout.js.map +1 -0
- package/dist/components/layout/snice-layout.types.d.ts +3 -0
- package/dist/components/layout/snice-layout.types.js +2 -0
- package/dist/components/layout/snice-layout.types.js.map +1 -0
- package/dist/components/login/snice-login.d.ts +45 -0
- package/dist/components/login/snice-login.js +385 -0
- package/dist/components/login/snice-login.js.map +1 -0
- package/dist/components/login/snice-login.types.d.ts +31 -0
- package/dist/components/login/snice-login.types.js +2 -0
- package/dist/components/login/snice-login.types.js.map +1 -0
- package/dist/components/modal/snice-modal.d.ts +32 -0
- package/dist/components/modal/snice-modal.js +288 -0
- package/dist/components/modal/snice-modal.js.map +1 -0
- package/dist/components/modal/snice-modal.types.d.ts +18 -0
- package/dist/components/modal/snice-modal.types.js +2 -0
- package/dist/components/modal/snice-modal.types.js.map +1 -0
- package/dist/components/pagination/snice-pagination.d.ts +26 -0
- package/dist/components/pagination/snice-pagination.js +373 -0
- package/dist/components/pagination/snice-pagination.js.map +1 -0
- package/dist/components/pagination/snice-pagination.types.d.ts +18 -0
- package/dist/components/pagination/snice-pagination.types.js +2 -0
- package/dist/components/pagination/snice-pagination.types.js.map +1 -0
- package/dist/components/progress/snice-progress.d.ts +35 -0
- package/dist/components/progress/snice-progress.js +295 -0
- package/dist/components/progress/snice-progress.js.map +1 -0
- package/dist/components/progress/snice-progress.types.d.ts +18 -0
- package/dist/components/progress/snice-progress.types.js +2 -0
- package/dist/components/progress/snice-progress.types.js.map +1 -0
- package/dist/components/radio/snice-radio.d.ts +33 -0
- package/dist/components/radio/snice-radio.js +286 -0
- package/dist/components/radio/snice-radio.js.map +1 -0
- package/dist/components/radio/snice-radio.types.d.ts +19 -0
- package/dist/components/radio/snice-radio.types.js +2 -0
- package/dist/components/radio/snice-radio.types.js.map +1 -0
- package/dist/components/select/snice-option.d.ts +17 -0
- package/dist/components/select/snice-option.js +77 -0
- package/dist/components/select/snice-option.js.map +1 -0
- package/dist/components/select/snice-option.types.d.ts +14 -0
- package/dist/components/select/snice-option.types.js +2 -0
- package/dist/components/select/snice-option.types.js.map +1 -0
- package/dist/components/select/snice-select.d.ts +89 -0
- package/dist/components/select/snice-select.js +900 -0
- package/dist/components/select/snice-select.js.map +1 -0
- package/dist/components/select/snice-select.types.d.ts +49 -0
- package/dist/components/select/snice-select.types.js +2 -0
- package/dist/components/select/snice-select.types.js.map +1 -0
- package/dist/components/skeleton/snice-skeleton.d.ts +16 -0
- package/dist/components/skeleton/snice-skeleton.js +159 -0
- package/dist/components/skeleton/snice-skeleton.js.map +1 -0
- package/dist/components/skeleton/snice-skeleton.types.d.ts +10 -0
- package/dist/components/skeleton/snice-skeleton.types.js +2 -0
- package/dist/components/skeleton/snice-skeleton.types.js.map +1 -0
- package/dist/components/switch/snice-switch.d.ts +38 -0
- package/dist/components/switch/snice-switch.js +309 -0
- package/dist/components/switch/snice-switch.js.map +1 -0
- package/dist/components/switch/snice-switch.types.d.ts +21 -0
- package/dist/components/switch/snice-switch.types.js +2 -0
- package/dist/components/switch/snice-switch.types.js.map +1 -0
- package/dist/components/symbols.d.ts +1 -0
- package/dist/components/symbols.js +20 -0
- package/dist/components/symbols.js.map +1 -0
- package/dist/components/table/snice-cell-boolean.d.ts +21 -0
- package/dist/components/table/snice-cell-boolean.js +152 -0
- package/dist/components/table/snice-cell-boolean.js.map +1 -0
- package/dist/components/table/snice-cell-date.d.ts +24 -0
- package/dist/components/table/snice-cell-date.js +240 -0
- package/dist/components/table/snice-cell-date.js.map +1 -0
- package/dist/components/table/snice-cell-duration.d.ts +16 -0
- package/dist/components/table/snice-cell-duration.js +123 -0
- package/dist/components/table/snice-cell-duration.js.map +1 -0
- package/dist/components/table/snice-cell-filesize.d.ts +16 -0
- package/dist/components/table/snice-cell-filesize.js +119 -0
- package/dist/components/table/snice-cell-filesize.js.map +1 -0
- package/dist/components/table/snice-cell-number.d.ts +23 -0
- package/dist/components/table/snice-cell-number.js +202 -0
- package/dist/components/table/snice-cell-number.js.map +1 -0
- package/dist/components/table/snice-cell-progress.d.ts +17 -0
- package/dist/components/table/snice-cell-progress.js +114 -0
- package/dist/components/table/snice-cell-progress.js.map +1 -0
- package/dist/components/table/snice-cell-rating.d.ts +17 -0
- package/dist/components/table/snice-cell-rating.js +113 -0
- package/dist/components/table/snice-cell-rating.js.map +1 -0
- package/dist/components/table/snice-cell-sparkline.d.ts +29 -0
- package/dist/components/table/snice-cell-sparkline.js +290 -0
- package/dist/components/table/snice-cell-sparkline.js.map +1 -0
- package/dist/components/table/snice-cell-text.d.ts +19 -0
- package/dist/components/table/snice-cell-text.js +153 -0
- package/dist/components/table/snice-cell-text.js.map +1 -0
- package/dist/components/table/snice-cell.d.ts +32 -0
- package/dist/components/table/snice-cell.js +451 -0
- package/dist/components/table/snice-cell.js.map +1 -0
- package/dist/components/table/snice-column.d.ts +62 -0
- package/dist/components/table/snice-column.js +440 -0
- package/dist/components/table/snice-column.js.map +1 -0
- package/dist/components/table/snice-header.d.ts +33 -0
- package/dist/components/table/snice-header.js +303 -0
- package/dist/components/table/snice-header.js.map +1 -0
- package/dist/components/table/snice-progress.d.ts +10 -0
- package/dist/components/table/snice-progress.js +91 -0
- package/dist/components/table/snice-progress.js.map +1 -0
- package/dist/components/table/snice-rating.d.ts +9 -0
- package/dist/components/table/snice-rating.js +68 -0
- package/dist/components/table/snice-rating.js.map +1 -0
- package/dist/components/table/snice-row.d.ts +43 -0
- package/dist/components/table/snice-row.js +365 -0
- package/dist/components/table/snice-row.js.map +1 -0
- package/dist/components/table/snice-table.d.ts +69 -0
- package/dist/components/table/snice-table.js +814 -0
- package/dist/components/table/snice-table.js.map +1 -0
- package/dist/components/table/snice-table.types.d.ts +137 -0
- package/dist/components/table/snice-table.types.js +2 -0
- package/dist/components/table/snice-table.types.js.map +1 -0
- package/dist/components/tabs/snice-tab-panel.d.ts +12 -0
- package/dist/components/tabs/snice-tab-panel.js +78 -0
- package/dist/components/tabs/snice-tab-panel.js.map +1 -0
- package/dist/components/tabs/snice-tab.d.ts +13 -0
- package/dist/components/tabs/snice-tab.js +90 -0
- package/dist/components/tabs/snice-tab.js.map +1 -0
- package/dist/components/tabs/snice-tabs.d.ts +34 -0
- package/dist/components/tabs/snice-tabs.js +367 -0
- package/dist/components/tabs/snice-tabs.js.map +1 -0
- package/dist/components/tabs/snice-tabs.types.d.ts +23 -0
- package/dist/components/tabs/snice-tabs.types.js +2 -0
- package/dist/components/tabs/snice-tabs.types.js.map +1 -0
- package/dist/components/toast/snice-toast-container.d.ts +25 -0
- package/dist/components/toast/snice-toast-container.js +251 -0
- package/dist/components/toast/snice-toast-container.js.map +1 -0
- package/dist/components/toast/snice-toast.d.ts +23 -0
- package/dist/components/toast/snice-toast.js +316 -0
- package/dist/components/toast/snice-toast.js.map +1 -0
- package/dist/components/toast/snice-toast.types.d.ts +30 -0
- package/dist/components/toast/snice-toast.types.js +2 -0
- package/dist/components/toast/snice-toast.types.js.map +1 -0
- package/dist/components/tooltip/snice-tooltip.d.ts +50 -0
- package/dist/components/tooltip/snice-tooltip.js +656 -0
- package/dist/components/tooltip/snice-tooltip.js.map +1 -0
- package/dist/components/tooltip/snice-tooltip.types.d.ts +18 -0
- package/dist/components/tooltip/snice-tooltip.types.js +2 -0
- package/dist/components/tooltip/snice-tooltip.types.js.map +1 -0
- package/dist/components/transitions.d.ts +11 -0
- package/dist/components/transitions.js +69 -0
- package/dist/components/transitions.js.map +1 -0
- package/dist/src/controller.d.ts +61 -0
- package/dist/src/controller.js +297 -0
- package/dist/src/controller.js.map +1 -0
- package/dist/src/element.d.ts +77 -0
- package/dist/src/element.js +805 -0
- package/dist/src/element.js.map +1 -0
- package/dist/src/events.d.ts +37 -0
- package/dist/src/events.js +289 -0
- package/dist/src/events.js.map +1 -0
- package/dist/src/global.d.ts +7 -0
- package/dist/src/global.js +23 -0
- package/dist/src/global.js.map +1 -0
- package/{src/index.ts → dist/src/index.d.ts} +1 -1
- package/dist/src/index.js +8 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/observe.d.ts +26 -0
- package/dist/src/observe.js +329 -0
- package/dist/src/observe.js.map +1 -0
- package/dist/src/request-response.d.ts +46 -0
- package/dist/src/request-response.js +267 -0
- package/dist/src/request-response.js.map +1 -0
- package/dist/src/router.d.ts +87 -0
- package/dist/src/router.js +375 -0
- package/dist/src/router.js.map +1 -0
- package/dist/src/symbols.d.ts +29 -0
- package/{src/symbols.ts → dist/src/symbols.js} +2 -12
- package/dist/src/symbols.js.map +1 -0
- package/dist/src/transitions.d.ts +50 -0
- package/dist/src/transitions.js +199 -0
- package/dist/src/transitions.js.map +1 -0
- package/package.json +6 -8
- package/src/controller.ts +0 -347
- package/src/element.ts +0 -897
- package/src/events.ts +0 -349
- package/src/global.ts +0 -31
- package/src/observe.ts +0 -414
- package/src/request-response.ts +0 -336
- package/src/router.ts +0 -552
- package/src/transitions.ts +0 -264
package/src/events.ts
DELETED
|
@@ -1,349 +0,0 @@
|
|
|
1
|
-
import { ON_HANDLERS, CLEANUP } from './symbols';
|
|
2
|
-
|
|
3
|
-
export interface OnOptions {
|
|
4
|
-
/** Use capture phase instead of bubble phase */
|
|
5
|
-
capture?: boolean;
|
|
6
|
-
/** Remove listener after first trigger */
|
|
7
|
-
once?: boolean;
|
|
8
|
-
/** Passive listener (can't preventDefault) */
|
|
9
|
-
passive?: boolean;
|
|
10
|
-
/** Automatically call preventDefault on the event */
|
|
11
|
-
preventDefault?: boolean;
|
|
12
|
-
/** Automatically call stopPropagation on the event */
|
|
13
|
-
stopPropagation?: boolean;
|
|
14
|
-
/** Debounce the handler by specified milliseconds */
|
|
15
|
-
debounce?: number;
|
|
16
|
-
/** Throttle the handler by specified milliseconds */
|
|
17
|
-
throttle?: number;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export function on(eventName: string | string[], selectorOrOptions?: string | OnOptions, options?: OnOptions) {
|
|
21
|
-
// Handle overloaded parameters
|
|
22
|
-
let selector: string | undefined;
|
|
23
|
-
let opts: OnOptions | undefined;
|
|
24
|
-
|
|
25
|
-
if (typeof selectorOrOptions === 'string') {
|
|
26
|
-
selector = selectorOrOptions;
|
|
27
|
-
opts = options;
|
|
28
|
-
} else {
|
|
29
|
-
selector = undefined;
|
|
30
|
-
opts = selectorOrOptions;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {
|
|
34
|
-
// Store event handler metadata
|
|
35
|
-
if (!target[ON_HANDLERS]) {
|
|
36
|
-
target[ON_HANDLERS] = [];
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
// Normalize to array and expand at decoration time
|
|
40
|
-
const eventNames = Array.isArray(eventName) ? eventName : [eventName];
|
|
41
|
-
|
|
42
|
-
// Create a handler entry for each event
|
|
43
|
-
for (const event of eventNames) {
|
|
44
|
-
target[ON_HANDLERS].push({
|
|
45
|
-
eventName: event,
|
|
46
|
-
selector,
|
|
47
|
-
methodName: propertyKey,
|
|
48
|
-
method: descriptor.value,
|
|
49
|
-
options: opts
|
|
50
|
-
});
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
return descriptor;
|
|
54
|
-
};
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
// Helper to setup event handlers for elements
|
|
58
|
-
export function setupEventHandlers(instance: any, element: HTMLElement) {
|
|
59
|
-
const handlers = instance.constructor.prototype[ON_HANDLERS];
|
|
60
|
-
if (!handlers) return;
|
|
61
|
-
|
|
62
|
-
// Initialize cleanup object if needed
|
|
63
|
-
if (!instance[CLEANUP]) {
|
|
64
|
-
instance[CLEANUP] = { events: [], channels: [] };
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
for (const handler of handlers) {
|
|
68
|
-
const originalMethod = handler.method.bind(instance);
|
|
69
|
-
const handlerOptions = handler.options || {};
|
|
70
|
-
|
|
71
|
-
// Parse event name for key modifiers
|
|
72
|
-
const [baseEventName, keyModifier] = handler.eventName.split(':');
|
|
73
|
-
|
|
74
|
-
// Create debounced/throttled wrapper if needed
|
|
75
|
-
const createTimedWrapper = (method: Function): Function => {
|
|
76
|
-
if (handlerOptions.debounce) {
|
|
77
|
-
let timeoutId: any;
|
|
78
|
-
return function(this: any, ...args: any[]) {
|
|
79
|
-
clearTimeout(timeoutId);
|
|
80
|
-
timeoutId = setTimeout(() => method.apply(this, args), handlerOptions.debounce);
|
|
81
|
-
};
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
if (handlerOptions.throttle) {
|
|
85
|
-
let lastCall = 0;
|
|
86
|
-
let timeoutId: any;
|
|
87
|
-
return function(this: any, ...args: any[]) {
|
|
88
|
-
const now = Date.now();
|
|
89
|
-
const remaining = handlerOptions.throttle! - (now - lastCall);
|
|
90
|
-
|
|
91
|
-
if (remaining <= 0) {
|
|
92
|
-
clearTimeout(timeoutId);
|
|
93
|
-
lastCall = now;
|
|
94
|
-
method.apply(this, args);
|
|
95
|
-
} else if (!timeoutId) {
|
|
96
|
-
timeoutId = setTimeout(() => {
|
|
97
|
-
lastCall = Date.now();
|
|
98
|
-
timeoutId = null;
|
|
99
|
-
method.apply(this, args);
|
|
100
|
-
}, remaining);
|
|
101
|
-
}
|
|
102
|
-
};
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
return method;
|
|
106
|
-
};
|
|
107
|
-
|
|
108
|
-
// Create the event handler with key modifier support
|
|
109
|
-
const createEventHandler = (method: Function) => {
|
|
110
|
-
if (keyModifier && (baseEventName === 'keydown' || baseEventName === 'keyup' || baseEventName === 'keypress')) {
|
|
111
|
-
return (event: Event) => {
|
|
112
|
-
const keyEvent = event as KeyboardEvent;
|
|
113
|
-
|
|
114
|
-
// Helper to normalize key names (e.g., "Space" -> " ")
|
|
115
|
-
const normalizeKey = (key: string): string => {
|
|
116
|
-
if (key === 'Space') return ' ';
|
|
117
|
-
return key;
|
|
118
|
-
};
|
|
119
|
-
|
|
120
|
-
// Check for "any modifiers" match with ~ prefix
|
|
121
|
-
if (keyModifier.startsWith('~')) {
|
|
122
|
-
const key = normalizeKey(keyModifier.slice(1)); // Remove the ~ and normalize
|
|
123
|
-
// Match if key matches, regardless of modifiers
|
|
124
|
-
if (keyEvent.key === key) {
|
|
125
|
-
method(event);
|
|
126
|
-
}
|
|
127
|
-
return;
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
// Check for modifier combinations using +
|
|
131
|
-
if (keyModifier.includes('+')) {
|
|
132
|
-
const parts = keyModifier.split('+');
|
|
133
|
-
const key = normalizeKey(parts[parts.length - 1]); // Last part is the actual key
|
|
134
|
-
const modifiers = parts.slice(0, -1); // Everything else is modifiers
|
|
135
|
-
|
|
136
|
-
// Check the actual key
|
|
137
|
-
if (keyEvent.key !== key) return;
|
|
138
|
-
|
|
139
|
-
// Create a set of expected modifiers
|
|
140
|
-
const expectedModifiers = new Set(modifiers.map((m: string) => m.toLowerCase()));
|
|
141
|
-
const hasCtrl = expectedModifiers.has('ctrl');
|
|
142
|
-
const hasShift = expectedModifiers.has('shift');
|
|
143
|
-
const hasAlt = expectedModifiers.has('alt');
|
|
144
|
-
const hasMeta = expectedModifiers.has('meta') || expectedModifiers.has('cmd');
|
|
145
|
-
|
|
146
|
-
// Check that expected modifiers are pressed and unexpected ones are not
|
|
147
|
-
const modifiersMatch =
|
|
148
|
-
keyEvent.ctrlKey === hasCtrl &&
|
|
149
|
-
keyEvent.shiftKey === hasShift &&
|
|
150
|
-
keyEvent.altKey === hasAlt &&
|
|
151
|
-
keyEvent.metaKey === hasMeta;
|
|
152
|
-
|
|
153
|
-
if (modifiersMatch) {
|
|
154
|
-
method(event);
|
|
155
|
-
}
|
|
156
|
-
} else {
|
|
157
|
-
// Default: exact match (no modifiers allowed)
|
|
158
|
-
const key = normalizeKey(keyModifier);
|
|
159
|
-
// Only match if key matches AND no modifiers are pressed
|
|
160
|
-
if (keyEvent.key === key &&
|
|
161
|
-
!keyEvent.ctrlKey &&
|
|
162
|
-
!keyEvent.shiftKey &&
|
|
163
|
-
!keyEvent.altKey &&
|
|
164
|
-
!keyEvent.metaKey) {
|
|
165
|
-
method(event);
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
};
|
|
169
|
-
}
|
|
170
|
-
return method;
|
|
171
|
-
};
|
|
172
|
-
|
|
173
|
-
// Apply timing wrapper (debounce/throttle)
|
|
174
|
-
const timedMethod = createTimedWrapper(originalMethod);
|
|
175
|
-
|
|
176
|
-
// Wrap boundMethod in try-catch for error isolation
|
|
177
|
-
const wrappedMethod = createEventHandler((event: Event) => {
|
|
178
|
-
try {
|
|
179
|
-
// Apply automatic preventDefault/stopPropagation if configured
|
|
180
|
-
if (handlerOptions.preventDefault) {
|
|
181
|
-
event.preventDefault();
|
|
182
|
-
}
|
|
183
|
-
if (handlerOptions.stopPropagation) {
|
|
184
|
-
event.stopPropagation();
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
return timedMethod(event);
|
|
188
|
-
} catch (error) {
|
|
189
|
-
console.error(`Error in event handler ${handler.methodName}:`, error);
|
|
190
|
-
// Don't rethrow - allow other handlers to continue
|
|
191
|
-
}
|
|
192
|
-
});
|
|
193
|
-
|
|
194
|
-
if (handler.selector) {
|
|
195
|
-
// Delegated event handling - use shadow root if available
|
|
196
|
-
const eventRoot = element.shadowRoot || element;
|
|
197
|
-
const delegatedHandler = (event: Event) => {
|
|
198
|
-
const target = event.target as HTMLElement;
|
|
199
|
-
let shouldHandle = false;
|
|
200
|
-
|
|
201
|
-
if (target.matches && target.matches(handler.selector)) {
|
|
202
|
-
shouldHandle = true;
|
|
203
|
-
} else if (target.closest) {
|
|
204
|
-
const closest = target.closest(handler.selector);
|
|
205
|
-
if (closest) {
|
|
206
|
-
shouldHandle = true;
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
if (shouldHandle) {
|
|
211
|
-
// Apply automatic preventDefault/stopPropagation only if we're handling this event
|
|
212
|
-
if (handlerOptions.preventDefault) {
|
|
213
|
-
event.preventDefault();
|
|
214
|
-
}
|
|
215
|
-
if (handlerOptions.stopPropagation) {
|
|
216
|
-
event.stopPropagation();
|
|
217
|
-
event.stopImmediatePropagation(); // Also stop other handlers on same element
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
wrappedMethod(event);
|
|
221
|
-
}
|
|
222
|
-
};
|
|
223
|
-
|
|
224
|
-
const listenerOptions: AddEventListenerOptions = {
|
|
225
|
-
capture: handlerOptions.capture || false,
|
|
226
|
-
once: handlerOptions.once || false,
|
|
227
|
-
passive: handlerOptions.passive || false
|
|
228
|
-
};
|
|
229
|
-
|
|
230
|
-
eventRoot.addEventListener(baseEventName, delegatedHandler, listenerOptions);
|
|
231
|
-
instance[CLEANUP].events.push(() => {
|
|
232
|
-
eventRoot.removeEventListener(baseEventName, delegatedHandler, listenerOptions);
|
|
233
|
-
});
|
|
234
|
-
} else {
|
|
235
|
-
// Direct event handling - always on the element itself
|
|
236
|
-
const listenerOptions: AddEventListenerOptions = {
|
|
237
|
-
capture: handlerOptions.capture || false,
|
|
238
|
-
once: handlerOptions.once || false,
|
|
239
|
-
passive: handlerOptions.passive || false
|
|
240
|
-
};
|
|
241
|
-
|
|
242
|
-
element.addEventListener(baseEventName, wrappedMethod as EventListener, listenerOptions);
|
|
243
|
-
instance[CLEANUP].events.push(() => {
|
|
244
|
-
element.removeEventListener(baseEventName, wrappedMethod as EventListener, listenerOptions);
|
|
245
|
-
});
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
// Helper to cleanup event handlers
|
|
251
|
-
export function cleanupEventHandlers(instance: any) {
|
|
252
|
-
if (instance[CLEANUP]?.events) {
|
|
253
|
-
for (const cleanup of instance[CLEANUP].events) {
|
|
254
|
-
cleanup();
|
|
255
|
-
}
|
|
256
|
-
instance[CLEANUP].events = [];
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
export interface DispatchOptions extends EventInit {
|
|
261
|
-
/**
|
|
262
|
-
* Whether to dispatch even if the method returns undefined (default: true)
|
|
263
|
-
*/
|
|
264
|
-
dispatchOnUndefined?: boolean;
|
|
265
|
-
/** Debounce the dispatch by specified milliseconds */
|
|
266
|
-
debounce?: number;
|
|
267
|
-
/** Throttle the dispatch by specified milliseconds */
|
|
268
|
-
throttle?: number;
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
/**
|
|
272
|
-
* Decorator that automatically dispatches a custom event after a method is called.
|
|
273
|
-
* The return value of the method becomes the event detail.
|
|
274
|
-
*
|
|
275
|
-
* @param eventName The name of the event to dispatch
|
|
276
|
-
* @param options Optional configuration extending EventInit
|
|
277
|
-
*/
|
|
278
|
-
export function dispatch(eventName: string, options?: DispatchOptions) {
|
|
279
|
-
return function (_target: any, _propertyKey: string, descriptor: PropertyDescriptor) {
|
|
280
|
-
const originalMethod = descriptor.value;
|
|
281
|
-
|
|
282
|
-
// Create timing wrappers for dispatch
|
|
283
|
-
let debounceTimeout: any;
|
|
284
|
-
let throttleLastCall = 0;
|
|
285
|
-
let throttleTimeout: any;
|
|
286
|
-
|
|
287
|
-
descriptor.value = function (this: HTMLElement, ...args: any[]) {
|
|
288
|
-
// Call the original method
|
|
289
|
-
const result = originalMethod.apply(this, args);
|
|
290
|
-
|
|
291
|
-
// Helper to dispatch the event
|
|
292
|
-
const doDispatch = (detail: any) => {
|
|
293
|
-
// Skip dispatch if result is undefined and dispatchOnUndefined is false
|
|
294
|
-
if (detail === undefined && options?.dispatchOnUndefined === false) {
|
|
295
|
-
return;
|
|
296
|
-
}
|
|
297
|
-
|
|
298
|
-
// Create event with spread operator for options
|
|
299
|
-
const event = new CustomEvent(eventName, {
|
|
300
|
-
bubbles: true, // Default to true for component events
|
|
301
|
-
composed: true, // Allow crossing shadow DOM boundaries
|
|
302
|
-
...options, // Spread all EventInit options
|
|
303
|
-
detail
|
|
304
|
-
});
|
|
305
|
-
|
|
306
|
-
this.dispatchEvent(event);
|
|
307
|
-
};
|
|
308
|
-
|
|
309
|
-
// Helper to handle timed dispatch
|
|
310
|
-
const timedDispatch = (detail: any) => {
|
|
311
|
-
if (options?.debounce) {
|
|
312
|
-
clearTimeout(debounceTimeout);
|
|
313
|
-
debounceTimeout = setTimeout(() => doDispatch(detail), options.debounce);
|
|
314
|
-
} else if (options?.throttle) {
|
|
315
|
-
const now = Date.now();
|
|
316
|
-
const remaining = options.throttle - (now - throttleLastCall);
|
|
317
|
-
|
|
318
|
-
if (remaining <= 0) {
|
|
319
|
-
clearTimeout(throttleTimeout);
|
|
320
|
-
throttleLastCall = now;
|
|
321
|
-
doDispatch(detail);
|
|
322
|
-
} else if (!throttleTimeout) {
|
|
323
|
-
throttleTimeout = setTimeout(() => {
|
|
324
|
-
throttleLastCall = Date.now();
|
|
325
|
-
throttleTimeout = null;
|
|
326
|
-
doDispatch(detail);
|
|
327
|
-
}, remaining);
|
|
328
|
-
}
|
|
329
|
-
} else {
|
|
330
|
-
doDispatch(detail);
|
|
331
|
-
}
|
|
332
|
-
};
|
|
333
|
-
|
|
334
|
-
// Handle async methods
|
|
335
|
-
if (result instanceof Promise) {
|
|
336
|
-
return result.then((resolvedResult: any) => {
|
|
337
|
-
timedDispatch(resolvedResult);
|
|
338
|
-
return resolvedResult;
|
|
339
|
-
});
|
|
340
|
-
}
|
|
341
|
-
|
|
342
|
-
// Sync method
|
|
343
|
-
timedDispatch(result);
|
|
344
|
-
return result;
|
|
345
|
-
};
|
|
346
|
-
|
|
347
|
-
return descriptor;
|
|
348
|
-
};
|
|
349
|
-
}
|
package/src/global.ts
DELETED
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
// Global namespace for Snice framework
|
|
2
|
-
// Ensures all registries and symbols are shared across different JS files/modules
|
|
3
|
-
|
|
4
|
-
export interface SniceGlobal {
|
|
5
|
-
controllerRegistry: Map<string, any>;
|
|
6
|
-
controllerIdCounter: number;
|
|
7
|
-
symbols: Map<string, symbol>;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
// Initialize or get the global Snice namespace
|
|
11
|
-
function initGlobalNamespace(): SniceGlobal {
|
|
12
|
-
if (!(globalThis as any).snice) {
|
|
13
|
-
(globalThis as any).snice = {
|
|
14
|
-
controllerRegistry: new Map(),
|
|
15
|
-
controllerIdCounter: 0,
|
|
16
|
-
symbols: new Map()
|
|
17
|
-
};
|
|
18
|
-
}
|
|
19
|
-
return (globalThis as any).snice;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
// Export the global namespace
|
|
23
|
-
export const snice = initGlobalNamespace();
|
|
24
|
-
|
|
25
|
-
// Helper function to get or create a global symbol
|
|
26
|
-
export function getSymbol(name: string): symbol {
|
|
27
|
-
if (!snice.symbols.has(name)) {
|
|
28
|
-
snice.symbols.set(name, Symbol(name));
|
|
29
|
-
}
|
|
30
|
-
return snice.symbols.get(name)!;
|
|
31
|
-
}
|