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/observe.ts
DELETED
|
@@ -1,414 +0,0 @@
|
|
|
1
|
-
import { OBSERVERS, CLEANUP, IS_CONTROLLER_INSTANCE } from './symbols';
|
|
2
|
-
|
|
3
|
-
export interface ObserveOptions {
|
|
4
|
-
/** For IntersectionObserver: threshold of visibility */
|
|
5
|
-
threshold?: number | number[];
|
|
6
|
-
/** For IntersectionObserver: margin around root */
|
|
7
|
-
rootMargin?: string;
|
|
8
|
-
/** For IntersectionObserver: root element (defaults to viewport) */
|
|
9
|
-
root?: Element | null;
|
|
10
|
-
/** For ResizeObserver: which box model to observe */
|
|
11
|
-
box?: 'content-box' | 'border-box';
|
|
12
|
-
/** Throttle the callback by specified milliseconds */
|
|
13
|
-
throttle?: number;
|
|
14
|
-
/** For MutationObserver: observe subtree (use with caution) */
|
|
15
|
-
subtree?: boolean;
|
|
16
|
-
/** Maximum depth for subtree observation (safety limit) */
|
|
17
|
-
maxDepth?: number;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
interface ObserverMetadata {
|
|
21
|
-
type: string;
|
|
22
|
-
target: string;
|
|
23
|
-
selector?: string;
|
|
24
|
-
methodName: string;
|
|
25
|
-
method: Function;
|
|
26
|
-
options?: ObserveOptions;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
// Global cache for MediaQueryList objects
|
|
30
|
-
const mediaQueryCache = new Map<string, MediaQueryList>();
|
|
31
|
-
|
|
32
|
-
// Global WeakMap to track observer instances for reuse
|
|
33
|
-
const intersectionObservers = new WeakMap<object, IntersectionObserver>();
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* Decorator for observing external changes like viewport intersection, resize, media queries, and DOM mutations
|
|
37
|
-
*
|
|
38
|
-
* @param target - The observation target (e.g., 'intersection', 'resize', 'media:(min-width: 768px)', 'mutation:childList') or array of targets
|
|
39
|
-
* @param selectorOrOptions - CSS selector for element to observe OR options object
|
|
40
|
-
* @param options - Options object (when second parameter is a selector)
|
|
41
|
-
*/
|
|
42
|
-
export function observe(observeTarget: string | string[], selectorOrOptions?: string | ObserveOptions, options?: ObserveOptions) {
|
|
43
|
-
// Handle overloaded parameters
|
|
44
|
-
let selector: string | undefined;
|
|
45
|
-
let opts: ObserveOptions | undefined;
|
|
46
|
-
|
|
47
|
-
if (typeof selectorOrOptions === 'string') {
|
|
48
|
-
selector = selectorOrOptions;
|
|
49
|
-
opts = options;
|
|
50
|
-
} else {
|
|
51
|
-
selector = undefined;
|
|
52
|
-
opts = selectorOrOptions;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {
|
|
56
|
-
// Store observer metadata
|
|
57
|
-
if (!target[OBSERVERS]) {
|
|
58
|
-
target[OBSERVERS] = [];
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
// Normalize to array
|
|
62
|
-
const observeTargets = Array.isArray(observeTarget) ? observeTarget : [observeTarget];
|
|
63
|
-
|
|
64
|
-
// Create an observer entry for each target
|
|
65
|
-
for (const targetString of observeTargets) {
|
|
66
|
-
// Parse the observation type from the observeTarget string
|
|
67
|
-
const [type, ...modifiers] = targetString.split(':');
|
|
68
|
-
|
|
69
|
-
target[OBSERVERS].push({
|
|
70
|
-
type,
|
|
71
|
-
target: modifiers.join(':'), // Rejoin for media queries or mutation types
|
|
72
|
-
selector,
|
|
73
|
-
methodName: propertyKey,
|
|
74
|
-
method: descriptor.value,
|
|
75
|
-
options: opts
|
|
76
|
-
});
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
return descriptor;
|
|
80
|
-
};
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
// Helper to setup observers for elements
|
|
84
|
-
export function setupObservers(instance: any, element: HTMLElement) {
|
|
85
|
-
// Only check the prototype, not the instance itself to avoid property access issues
|
|
86
|
-
const observers = instance.constructor.prototype[OBSERVERS];
|
|
87
|
-
if (!observers || !Array.isArray(observers) || observers.length === 0) {
|
|
88
|
-
return;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
// Initialize cleanup object if needed
|
|
92
|
-
if (!instance[CLEANUP]) {
|
|
93
|
-
instance[CLEANUP] = { events: [], channels: [], observers: [] };
|
|
94
|
-
} else if (!instance[CLEANUP].observers) {
|
|
95
|
-
instance[CLEANUP].observers = [];
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
for (const observer of observers) {
|
|
99
|
-
const method = observer.method.bind(instance);
|
|
100
|
-
|
|
101
|
-
// Apply throttling if specified
|
|
102
|
-
const callback = observer.options?.throttle
|
|
103
|
-
? createThrottledCallback(method, observer.options.throttle)
|
|
104
|
-
: method;
|
|
105
|
-
|
|
106
|
-
switch (observer.type) {
|
|
107
|
-
case 'intersection':
|
|
108
|
-
setupIntersectionObserver(instance, element, observer, callback);
|
|
109
|
-
break;
|
|
110
|
-
case 'resize':
|
|
111
|
-
setupResizeObserver(instance, element, observer, callback);
|
|
112
|
-
break;
|
|
113
|
-
case 'media':
|
|
114
|
-
setupMediaQueryObserver(instance, element, observer, callback);
|
|
115
|
-
break;
|
|
116
|
-
case 'mutation':
|
|
117
|
-
setupMutationObserver(instance, element, observer, callback);
|
|
118
|
-
break;
|
|
119
|
-
default:
|
|
120
|
-
console.warn(`Unknown observer type: ${observer.type}`);
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
function setupIntersectionObserver(
|
|
126
|
-
instance: any,
|
|
127
|
-
element: HTMLElement,
|
|
128
|
-
observer: ObserverMetadata,
|
|
129
|
-
callback: Function
|
|
130
|
-
) {
|
|
131
|
-
const options: IntersectionObserverInit = {
|
|
132
|
-
threshold: observer.options?.threshold ?? 0,
|
|
133
|
-
rootMargin: observer.options?.rootMargin ?? '0px',
|
|
134
|
-
root: observer.options?.root ?? null
|
|
135
|
-
};
|
|
136
|
-
|
|
137
|
-
// Create a key for reusing observers with same options
|
|
138
|
-
const optionsKey = JSON.stringify(options);
|
|
139
|
-
|
|
140
|
-
// Wrap callback to handle return value
|
|
141
|
-
const wrappedCallback = (entries: IntersectionObserverEntry[]) => {
|
|
142
|
-
for (const entry of entries) {
|
|
143
|
-
try {
|
|
144
|
-
const result = callback(entry);
|
|
145
|
-
// If callback returns false, stop observing that element
|
|
146
|
-
if (result === false && io) {
|
|
147
|
-
io.unobserve(entry.target);
|
|
148
|
-
}
|
|
149
|
-
} catch (error) {
|
|
150
|
-
console.error(`Error in intersection observer ${observer.methodName}:`, error);
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
};
|
|
154
|
-
|
|
155
|
-
// Check if IntersectionObserver is available
|
|
156
|
-
if (typeof IntersectionObserver === 'undefined') {
|
|
157
|
-
console.warn('IntersectionObserver is not available in this environment');
|
|
158
|
-
return;
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
// Create or reuse IntersectionObserver
|
|
162
|
-
let io = intersectionObservers.get({ instance, options: optionsKey });
|
|
163
|
-
if (!io) {
|
|
164
|
-
io = new IntersectionObserver(wrappedCallback, options);
|
|
165
|
-
intersectionObservers.set({ instance, options: optionsKey }, io);
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
// Find target elements
|
|
169
|
-
const targets = observer.selector
|
|
170
|
-
? Array.from(element.shadowRoot?.querySelectorAll(observer.selector) || [])
|
|
171
|
-
: [element];
|
|
172
|
-
|
|
173
|
-
// Start observing
|
|
174
|
-
targets.forEach(target => io!.observe(target));
|
|
175
|
-
|
|
176
|
-
// Store cleanup
|
|
177
|
-
instance[CLEANUP].observers.push(() => {
|
|
178
|
-
targets.forEach(target => io!.unobserve(target));
|
|
179
|
-
// Only disconnect if no more targets
|
|
180
|
-
if (io!.takeRecords().length === 0) {
|
|
181
|
-
io!.disconnect();
|
|
182
|
-
}
|
|
183
|
-
});
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
function setupResizeObserver(
|
|
187
|
-
instance: any,
|
|
188
|
-
element: HTMLElement,
|
|
189
|
-
observer: ObserverMetadata,
|
|
190
|
-
callback: Function
|
|
191
|
-
) {
|
|
192
|
-
const box = observer.options?.box || 'content-box';
|
|
193
|
-
|
|
194
|
-
// Wrap callback with error handling
|
|
195
|
-
const wrappedCallback = (entries: ResizeObserverEntry[]) => {
|
|
196
|
-
for (const entry of entries) {
|
|
197
|
-
try {
|
|
198
|
-
callback(entry);
|
|
199
|
-
} catch (error) {
|
|
200
|
-
console.error(`Error in resize observer ${observer.methodName}:`, error);
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
};
|
|
204
|
-
|
|
205
|
-
// Check if ResizeObserver is available
|
|
206
|
-
if (typeof ResizeObserver === 'undefined') {
|
|
207
|
-
console.warn('ResizeObserver is not available in this environment');
|
|
208
|
-
return;
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
// Create ResizeObserver
|
|
212
|
-
const ro = new ResizeObserver(wrappedCallback);
|
|
213
|
-
|
|
214
|
-
// Find target elements
|
|
215
|
-
const targets = observer.selector
|
|
216
|
-
? Array.from(element.shadowRoot?.querySelectorAll(observer.selector) || [])
|
|
217
|
-
: [element];
|
|
218
|
-
|
|
219
|
-
// Start observing with options
|
|
220
|
-
targets.forEach(target => {
|
|
221
|
-
ro.observe(target, { box });
|
|
222
|
-
});
|
|
223
|
-
|
|
224
|
-
// Store cleanup
|
|
225
|
-
instance[CLEANUP].observers.push(() => {
|
|
226
|
-
ro.disconnect();
|
|
227
|
-
});
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
function setupMediaQueryObserver(
|
|
231
|
-
instance: any,
|
|
232
|
-
_element: HTMLElement,
|
|
233
|
-
observer: ObserverMetadata,
|
|
234
|
-
callback: Function
|
|
235
|
-
) {
|
|
236
|
-
// Extract media query from target (e.g., "media:(min-width: 768px)" -> "(min-width: 768px)")
|
|
237
|
-
const mediaQuery = observer.target;
|
|
238
|
-
|
|
239
|
-
if (!mediaQuery) {
|
|
240
|
-
console.warn('Media query observer requires a query string');
|
|
241
|
-
return;
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
// Get or create MediaQueryList (cached globally)
|
|
245
|
-
let mql = mediaQueryCache.get(mediaQuery);
|
|
246
|
-
if (!mql) {
|
|
247
|
-
try {
|
|
248
|
-
mql = window.matchMedia(mediaQuery);
|
|
249
|
-
mediaQueryCache.set(mediaQuery, mql);
|
|
250
|
-
} catch (error) {
|
|
251
|
-
console.error(`Invalid media query: ${mediaQuery}`, error);
|
|
252
|
-
return;
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
// Wrap callback with error handling
|
|
257
|
-
const wrappedCallback = (event: MediaQueryListEvent | MediaQueryList) => {
|
|
258
|
-
try {
|
|
259
|
-
callback('matches' in event ? event.matches : (event as MediaQueryListEvent).matches);
|
|
260
|
-
} catch (error) {
|
|
261
|
-
console.error(`Error in media query observer ${observer.methodName}:`, error);
|
|
262
|
-
}
|
|
263
|
-
};
|
|
264
|
-
|
|
265
|
-
// Call immediately with current state
|
|
266
|
-
wrappedCallback(mql);
|
|
267
|
-
|
|
268
|
-
// Listen for changes
|
|
269
|
-
const changeHandler = (e: MediaQueryListEvent) => wrappedCallback(e);
|
|
270
|
-
|
|
271
|
-
// Modern browsers use addEventListener
|
|
272
|
-
if (mql.addEventListener) {
|
|
273
|
-
mql.addEventListener('change', changeHandler);
|
|
274
|
-
instance[CLEANUP].observers.push(() => {
|
|
275
|
-
mql!.removeEventListener('change', changeHandler);
|
|
276
|
-
});
|
|
277
|
-
} else {
|
|
278
|
-
// Fallback for older browsers
|
|
279
|
-
mql.addListener(changeHandler);
|
|
280
|
-
instance[CLEANUP].observers.push(() => {
|
|
281
|
-
mql!.removeListener(changeHandler);
|
|
282
|
-
});
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
function setupMutationObserver(
|
|
287
|
-
instance: any,
|
|
288
|
-
element: HTMLElement,
|
|
289
|
-
observer: ObserverMetadata,
|
|
290
|
-
callback: Function
|
|
291
|
-
) {
|
|
292
|
-
// Parse mutation type and attribute from target
|
|
293
|
-
// e.g., "childList", "attributes:class", "attributes:data-state"
|
|
294
|
-
const parts = observer.target.split(':');
|
|
295
|
-
const mutationType = parts[0] || 'childList';
|
|
296
|
-
const attributeName = parts[1];
|
|
297
|
-
|
|
298
|
-
// Build MutationObserver options
|
|
299
|
-
const options: MutationObserverInit = {};
|
|
300
|
-
|
|
301
|
-
switch (mutationType) {
|
|
302
|
-
case 'childList':
|
|
303
|
-
options.childList = true;
|
|
304
|
-
break;
|
|
305
|
-
case 'attributes':
|
|
306
|
-
options.attributes = true;
|
|
307
|
-
if (attributeName) {
|
|
308
|
-
options.attributeFilter = [attributeName];
|
|
309
|
-
}
|
|
310
|
-
break;
|
|
311
|
-
default:
|
|
312
|
-
console.warn(`Unknown mutation type: ${mutationType}`);
|
|
313
|
-
return;
|
|
314
|
-
}
|
|
315
|
-
|
|
316
|
-
// Apply subtree with safety limits
|
|
317
|
-
if (observer.options?.subtree) {
|
|
318
|
-
options.subtree = true;
|
|
319
|
-
// Could implement maxDepth checking in the callback
|
|
320
|
-
if (observer.options.maxDepth) {
|
|
321
|
-
console.warn('maxDepth is set but requires custom implementation');
|
|
322
|
-
}
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
// Wrap callback with error handling
|
|
326
|
-
const wrappedCallback = (mutations: MutationRecord[]) => {
|
|
327
|
-
try {
|
|
328
|
-
// Filter mutations if maxDepth is specified (simplified version)
|
|
329
|
-
if (observer.options?.maxDepth && observer.options.subtree) {
|
|
330
|
-
const maxDepth = observer.options!.maxDepth!;
|
|
331
|
-
const filtered = mutations.filter(mutation => {
|
|
332
|
-
// Simple depth check (could be more sophisticated)
|
|
333
|
-
let depth = 0;
|
|
334
|
-
let current = mutation.target as Node;
|
|
335
|
-
const root = element.shadowRoot || element;
|
|
336
|
-
while (current && current !== root && depth < maxDepth) {
|
|
337
|
-
current = current.parentNode!;
|
|
338
|
-
depth++;
|
|
339
|
-
}
|
|
340
|
-
return depth < maxDepth;
|
|
341
|
-
});
|
|
342
|
-
if (filtered.length > 0) {
|
|
343
|
-
callback(filtered);
|
|
344
|
-
}
|
|
345
|
-
} else {
|
|
346
|
-
callback(mutations);
|
|
347
|
-
}
|
|
348
|
-
} catch (error) {
|
|
349
|
-
console.error(`Error in mutation observer ${observer.methodName}:`, error);
|
|
350
|
-
}
|
|
351
|
-
};
|
|
352
|
-
|
|
353
|
-
// Create MutationObserver
|
|
354
|
-
const mo = new MutationObserver(wrappedCallback);
|
|
355
|
-
|
|
356
|
-
// Find target elements
|
|
357
|
-
const isController = instance[IS_CONTROLLER_INSTANCE] === true;
|
|
358
|
-
|
|
359
|
-
// For mutation observers without selector:
|
|
360
|
-
// - Controllers: observe the shadow DOM of the element they're attached to (if it exists)
|
|
361
|
-
// - Elements: observe the element itself (light DOM) to avoid infinite loops
|
|
362
|
-
const targets = observer.selector
|
|
363
|
-
? Array.from(element.shadowRoot?.querySelectorAll(observer.selector) || [])
|
|
364
|
-
: isController && element.shadowRoot
|
|
365
|
-
? [element.shadowRoot]
|
|
366
|
-
: [element];
|
|
367
|
-
|
|
368
|
-
// Start observing
|
|
369
|
-
targets.forEach(target => {
|
|
370
|
-
mo.observe(target, options);
|
|
371
|
-
});
|
|
372
|
-
|
|
373
|
-
// Store cleanup
|
|
374
|
-
instance[CLEANUP].observers.push(() => {
|
|
375
|
-
mo.disconnect();
|
|
376
|
-
});
|
|
377
|
-
}
|
|
378
|
-
|
|
379
|
-
function createThrottledCallback(callback: Function, delay: number): Function {
|
|
380
|
-
let lastCall = 0;
|
|
381
|
-
let timeout: any = null;
|
|
382
|
-
|
|
383
|
-
return function(this: any, ...args: any[]) {
|
|
384
|
-
const now = Date.now();
|
|
385
|
-
const remaining = delay - (now - lastCall);
|
|
386
|
-
|
|
387
|
-
if (remaining <= 0) {
|
|
388
|
-
// Enough time has passed, execute immediately
|
|
389
|
-
if (timeout) {
|
|
390
|
-
clearTimeout(timeout);
|
|
391
|
-
timeout = null;
|
|
392
|
-
}
|
|
393
|
-
lastCall = now;
|
|
394
|
-
return callback.apply(this, args);
|
|
395
|
-
} else if (!timeout) {
|
|
396
|
-
// Schedule for later
|
|
397
|
-
timeout = setTimeout(() => {
|
|
398
|
-
lastCall = Date.now();
|
|
399
|
-
timeout = null;
|
|
400
|
-
callback.apply(this, args);
|
|
401
|
-
}, remaining);
|
|
402
|
-
}
|
|
403
|
-
};
|
|
404
|
-
}
|
|
405
|
-
|
|
406
|
-
// Helper to cleanup observers
|
|
407
|
-
export function cleanupObservers(instance: any) {
|
|
408
|
-
if (instance[CLEANUP]?.observers) {
|
|
409
|
-
for (const cleanup of instance[CLEANUP].observers) {
|
|
410
|
-
cleanup();
|
|
411
|
-
}
|
|
412
|
-
instance[CLEANUP].observers = [];
|
|
413
|
-
}
|
|
414
|
-
}
|