snice 5.0.0 → 5.2.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/adapters/react/SniceProvider.js +1 -1
- package/adapters/react/SniceRouter.js +1 -1
- package/adapters/react/matchRoute.js +1 -1
- package/adapters/react/useRequestHandler.js +1 -1
- package/bin/templates/default/package.json +1 -1
- package/bin/templates/react/package.json +1 -1
- package/dist/cdn/accordion/snice-accordion.js +1 -1
- package/dist/cdn/accordion/snice-accordion.min.js +1 -1
- package/dist/cdn/action-bar/snice-action-bar.js +1 -1
- package/dist/cdn/action-bar/snice-action-bar.min.js +1 -1
- package/dist/cdn/activity-feed/snice-activity-feed.js +1 -1
- package/dist/cdn/activity-feed/snice-activity-feed.min.js +1 -1
- package/dist/cdn/alert/snice-alert.js +1 -1
- package/dist/cdn/alert/snice-alert.min.js +1 -1
- package/dist/cdn/app-tiles/snice-app-tiles.js +1 -1
- package/dist/cdn/app-tiles/snice-app-tiles.min.js +1 -1
- package/dist/cdn/approval-flow/snice-approval-flow.js +1 -1
- package/dist/cdn/approval-flow/snice-approval-flow.min.js +1 -1
- package/dist/cdn/audio-recorder/snice-audio-recorder.js +1 -1
- package/dist/cdn/audio-recorder/snice-audio-recorder.min.js +1 -1
- package/dist/cdn/availability/snice-availability.js +1 -1
- package/dist/cdn/availability/snice-availability.min.js +1 -1
- package/dist/cdn/avatar/snice-avatar.js +1 -1
- package/dist/cdn/avatar/snice-avatar.min.js +1 -1
- package/dist/cdn/avatar-group/snice-avatar-group.js +1 -1
- package/dist/cdn/avatar-group/snice-avatar-group.min.js +1 -1
- package/dist/cdn/badge/snice-badge.js +1 -1
- package/dist/cdn/badge/snice-badge.min.js +1 -1
- package/dist/cdn/banner/snice-banner.js +1 -1
- package/dist/cdn/banner/snice-banner.min.js +1 -1
- package/dist/cdn/binpack/snice-binpack.js +1 -1
- package/dist/cdn/binpack/snice-binpack.min.js +1 -1
- package/dist/cdn/book/snice-book.js +1 -1
- package/dist/cdn/book/snice-book.min.js +1 -1
- package/dist/cdn/booking/snice-booking.js +1 -1
- package/dist/cdn/booking/snice-booking.min.js +1 -1
- package/dist/cdn/breadcrumbs/snice-breadcrumbs.js +1 -1
- package/dist/cdn/breadcrumbs/snice-breadcrumbs.min.js +1 -1
- package/dist/cdn/button/snice-button.js +1 -1
- package/dist/cdn/button/snice-button.min.js +1 -1
- package/dist/cdn/calendar/snice-calendar.js +1 -1
- package/dist/cdn/calendar/snice-calendar.min.js +1 -1
- package/dist/cdn/camera/snice-camera.js +1 -1
- package/dist/cdn/camera/snice-camera.min.js +1 -1
- package/dist/cdn/camera-annotate/snice-camera-annotate.js +1 -1
- package/dist/cdn/camera-annotate/snice-camera-annotate.min.js +1 -1
- package/dist/cdn/candlestick/snice-candlestick.js +1 -1
- package/dist/cdn/candlestick/snice-candlestick.min.js +1 -1
- package/dist/cdn/card/snice-card.js +1 -1
- package/dist/cdn/card/snice-card.min.js +1 -1
- package/dist/cdn/carousel/snice-carousel.js +1 -1
- package/dist/cdn/carousel/snice-carousel.min.js +1 -1
- package/dist/cdn/cart/snice-cart.js +1 -1
- package/dist/cdn/cart/snice-cart.min.js +1 -1
- package/dist/cdn/chart/snice-chart.js +1 -1
- package/dist/cdn/chart/snice-chart.min.js +1 -1
- package/dist/cdn/chat/snice-chat.js +1 -1
- package/dist/cdn/chat/snice-chat.min.js +1 -1
- package/dist/cdn/checkbox/snice-checkbox.js +1 -1
- package/dist/cdn/checkbox/snice-checkbox.min.js +1 -1
- package/dist/cdn/chip/snice-chip.js +1 -1
- package/dist/cdn/chip/snice-chip.min.js +1 -1
- package/dist/cdn/code-block/snice-code-block.js +1 -1
- package/dist/cdn/code-block/snice-code-block.min.js +1 -1
- package/dist/cdn/color-display/snice-color-display.js +1 -1
- package/dist/cdn/color-display/snice-color-display.min.js +1 -1
- package/dist/cdn/color-picker/snice-color-picker.js +1 -1
- package/dist/cdn/color-picker/snice-color-picker.min.js +1 -1
- package/dist/cdn/command-palette/snice-command-palette.js +1 -1
- package/dist/cdn/command-palette/snice-command-palette.min.js +1 -1
- package/dist/cdn/comments/snice-comments.js +1 -1
- package/dist/cdn/comments/snice-comments.min.js +1 -1
- package/dist/cdn/countdown/snice-countdown.js +1 -1
- package/dist/cdn/countdown/snice-countdown.min.js +1 -1
- package/dist/cdn/cropper/snice-cropper.js +1 -1
- package/dist/cdn/cropper/snice-cropper.min.js +1 -1
- package/dist/cdn/data-card/snice-data-card.js +1 -1
- package/dist/cdn/data-card/snice-data-card.min.js +1 -1
- package/dist/cdn/date-picker/snice-date-picker.js +1 -1
- package/dist/cdn/date-picker/snice-date-picker.min.js +1 -1
- package/dist/cdn/date-range-picker/snice-date-range-picker.js +1 -1
- package/dist/cdn/date-range-picker/snice-date-range-picker.min.js +1 -1
- package/dist/cdn/date-time-picker/snice-date-time-picker.js +1 -1
- package/dist/cdn/date-time-picker/snice-date-time-picker.min.js +1 -1
- package/dist/cdn/diff/snice-diff.js +1 -1
- package/dist/cdn/diff/snice-diff.min.js +1 -1
- package/dist/cdn/divider/snice-divider.js +1 -1
- package/dist/cdn/divider/snice-divider.min.js +1 -1
- package/dist/cdn/doc/snice-doc.js +1 -1
- package/dist/cdn/doc/snice-doc.min.js +1 -1
- package/dist/cdn/draw/snice-draw.js +1 -1
- package/dist/cdn/draw/snice-draw.min.js +1 -1
- package/dist/cdn/drawer/snice-drawer.js +1 -1
- package/dist/cdn/drawer/snice-drawer.min.js +1 -1
- package/dist/cdn/empty-state/snice-empty-state.js +1 -1
- package/dist/cdn/empty-state/snice-empty-state.min.js +1 -1
- package/dist/cdn/estimate/snice-estimate.js +1 -1
- package/dist/cdn/estimate/snice-estimate.min.js +1 -1
- package/dist/cdn/file-gallery/snice-file-gallery.js +1 -1
- package/dist/cdn/file-gallery/snice-file-gallery.min.js +1 -1
- package/dist/cdn/file-upload/snice-file-upload.js +1 -1
- package/dist/cdn/file-upload/snice-file-upload.min.js +1 -1
- package/dist/cdn/flip-card/snice-flip-card.js +1 -1
- package/dist/cdn/flip-card/snice-flip-card.min.js +1 -1
- package/dist/cdn/flow/snice-flow.js +1 -1
- package/dist/cdn/flow/snice-flow.min.js +1 -1
- package/dist/cdn/form-layout/snice-form-layout.js +1 -1
- package/dist/cdn/form-layout/snice-form-layout.min.js +1 -1
- package/dist/cdn/funnel/snice-funnel.js +1 -1
- package/dist/cdn/funnel/snice-funnel.min.js +1 -1
- package/dist/cdn/gantt/snice-gantt.js +1 -1
- package/dist/cdn/gantt/snice-gantt.min.js +1 -1
- package/dist/cdn/gauge/snice-gauge.js +1 -1
- package/dist/cdn/gauge/snice-gauge.min.js +1 -1
- package/dist/cdn/grid/snice-grid.js +1 -1
- package/dist/cdn/grid/snice-grid.min.js +1 -1
- package/dist/cdn/heatmap/snice-heatmap.js +1 -1
- package/dist/cdn/heatmap/snice-heatmap.min.js +1 -1
- package/dist/cdn/image/snice-image.js +1 -1
- package/dist/cdn/image/snice-image.min.js +1 -1
- package/dist/cdn/input/snice-input.js +1 -1
- package/dist/cdn/input/snice-input.min.js +1 -1
- package/dist/cdn/invoice/snice-invoice.js +1 -1
- package/dist/cdn/invoice/snice-invoice.min.js +1 -1
- package/dist/cdn/kanban/snice-kanban.js +1 -1
- package/dist/cdn/kanban/snice-kanban.min.js +1 -1
- package/dist/cdn/key-value/snice-key-value.js +1 -1
- package/dist/cdn/key-value/snice-key-value.min.js +1 -1
- package/dist/cdn/kpi/snice-kpi.js +1 -1
- package/dist/cdn/kpi/snice-kpi.min.js +1 -1
- package/dist/cdn/layout/snice-layout.js +1 -1
- package/dist/cdn/layout/snice-layout.min.js +1 -1
- package/dist/cdn/leaderboard/snice-leaderboard.js +1 -1
- package/dist/cdn/leaderboard/snice-leaderboard.min.js +1 -1
- package/dist/cdn/link/snice-link.js +1 -1
- package/dist/cdn/link/snice-link.min.js +1 -1
- package/dist/cdn/link-preview/snice-link-preview.js +1 -1
- package/dist/cdn/link-preview/snice-link-preview.min.js +1 -1
- package/dist/cdn/list/snice-list.js +1 -1
- package/dist/cdn/list/snice-list.min.js +1 -1
- package/dist/cdn/location/snice-location.js +1 -1
- package/dist/cdn/location/snice-location.min.js +1 -1
- package/dist/cdn/login/snice-login.js +1 -1
- package/dist/cdn/login/snice-login.min.js +1 -1
- package/dist/cdn/map/snice-map.js +1 -1
- package/dist/cdn/map/snice-map.min.js +1 -1
- package/dist/cdn/markdown/snice-markdown.js +1 -1
- package/dist/cdn/markdown/snice-markdown.min.js +1 -1
- package/dist/cdn/masonry/snice-masonry.js +1 -1
- package/dist/cdn/masonry/snice-masonry.min.js +1 -1
- package/dist/cdn/menu/snice-menu.js +1 -1
- package/dist/cdn/menu/snice-menu.min.js +1 -1
- package/dist/cdn/message-strip/snice-message-strip.js +1 -1
- package/dist/cdn/message-strip/snice-message-strip.min.js +1 -1
- package/dist/cdn/metric-table/snice-metric-table.js +1 -1
- package/dist/cdn/metric-table/snice-metric-table.min.js +1 -1
- package/dist/cdn/modal/snice-modal.js +1 -1
- package/dist/cdn/modal/snice-modal.min.js +1 -1
- package/dist/cdn/music-player/snice-music-player.js +1 -1
- package/dist/cdn/music-player/snice-music-player.min.js +1 -1
- package/dist/cdn/nav/snice-nav.js +1 -1
- package/dist/cdn/nav/snice-nav.min.js +1 -1
- package/dist/cdn/network-graph/snice-network-graph.js +1 -1
- package/dist/cdn/network-graph/snice-network-graph.min.js +1 -1
- package/dist/cdn/notification-center/snice-notification-center.js +1 -1
- package/dist/cdn/notification-center/snice-notification-center.min.js +1 -1
- package/dist/cdn/order-tracker/snice-order-tracker.js +1 -1
- package/dist/cdn/order-tracker/snice-order-tracker.min.js +1 -1
- package/dist/cdn/org-chart/snice-org-chart.js +1 -1
- package/dist/cdn/org-chart/snice-org-chart.min.js +1 -1
- package/dist/cdn/pagination/snice-pagination.js +1 -1
- package/dist/cdn/pagination/snice-pagination.min.js +1 -1
- package/dist/cdn/paint/snice-paint.js +1 -1
- package/dist/cdn/paint/snice-paint.min.js +1 -1
- package/dist/cdn/pdf-viewer/snice-pdf-viewer.js +1 -1
- package/dist/cdn/pdf-viewer/snice-pdf-viewer.min.js +1 -1
- package/dist/cdn/permission-matrix/snice-permission-matrix.js +1 -1
- package/dist/cdn/permission-matrix/snice-permission-matrix.min.js +1 -1
- package/dist/cdn/podcast-player/snice-podcast-player.js +1 -1
- package/dist/cdn/podcast-player/snice-podcast-player.min.js +1 -1
- package/dist/cdn/popover/snice-popover.js +1 -1
- package/dist/cdn/popover/snice-popover.min.js +1 -1
- package/dist/cdn/pricing-table/snice-pricing-table.js +1 -1
- package/dist/cdn/pricing-table/snice-pricing-table.min.js +1 -1
- package/dist/cdn/product-card/snice-product-card.js +1 -1
- package/dist/cdn/product-card/snice-product-card.min.js +1 -1
- package/dist/cdn/progress/snice-progress.js +1 -1
- package/dist/cdn/progress/snice-progress.min.js +1 -1
- package/dist/cdn/progress-ring/snice-progress-ring.js +1 -1
- package/dist/cdn/progress-ring/snice-progress-ring.min.js +1 -1
- package/dist/cdn/qr-code/snice-qr-code.js +1 -1
- package/dist/cdn/qr-code/snice-qr-code.min.js +1 -1
- package/dist/cdn/qr-reader/snice-qr-reader.js +1 -1
- package/dist/cdn/qr-reader/snice-qr-reader.min.js +1 -1
- package/dist/cdn/radio/snice-radio.js +1 -1
- package/dist/cdn/radio/snice-radio.min.js +1 -1
- package/dist/cdn/range-slider/snice-range-slider.js +1 -1
- package/dist/cdn/range-slider/snice-range-slider.min.js +1 -1
- package/dist/cdn/rating/snice-rating.js +1 -1
- package/dist/cdn/rating/snice-rating.min.js +1 -1
- package/dist/cdn/receipt/snice-receipt.js +1 -1
- package/dist/cdn/receipt/snice-receipt.min.js +1 -1
- package/dist/cdn/recipe/snice-recipe.js +1 -1
- package/dist/cdn/recipe/snice-recipe.min.js +1 -1
- package/dist/cdn/runtime/README.md +2 -2
- package/dist/cdn/runtime/snice-runtime.esm.js +236 -161
- package/dist/cdn/runtime/snice-runtime.esm.js.map +1 -1
- package/dist/cdn/runtime/snice-runtime.esm.min.js +8 -8
- package/dist/cdn/runtime/snice-runtime.esm.min.js.map +1 -1
- package/dist/cdn/runtime/snice-runtime.js +236 -161
- package/dist/cdn/runtime/snice-runtime.js.map +1 -1
- package/dist/cdn/runtime/snice-runtime.min.js +8 -8
- package/dist/cdn/runtime/snice-runtime.min.js.map +1 -1
- package/dist/cdn/sankey/snice-sankey.js +1 -1
- package/dist/cdn/sankey/snice-sankey.min.js +1 -1
- package/dist/cdn/segmented-control/snice-segmented-control.js +1 -1
- package/dist/cdn/segmented-control/snice-segmented-control.min.js +1 -1
- package/dist/cdn/select/snice-select.js +1 -1
- package/dist/cdn/select/snice-select.min.js +1 -1
- package/dist/cdn/skeleton/snice-skeleton.js +1 -1
- package/dist/cdn/skeleton/snice-skeleton.min.js +1 -1
- package/dist/cdn/slider/snice-slider.js +1 -1
- package/dist/cdn/slider/snice-slider.min.js +1 -1
- package/dist/cdn/sortable/snice-sortable.js +1 -1
- package/dist/cdn/sortable/snice-sortable.min.js +1 -1
- package/dist/cdn/sparkline/snice-sparkline.js +1 -1
- package/dist/cdn/sparkline/snice-sparkline.min.js +1 -1
- package/dist/cdn/spinner/snice-spinner.js +1 -1
- package/dist/cdn/spinner/snice-spinner.min.js +1 -1
- package/dist/cdn/split-button/snice-split-button.js +1 -1
- package/dist/cdn/split-button/snice-split-button.min.js +1 -1
- package/dist/cdn/split-pane/snice-split-pane.js +1 -1
- package/dist/cdn/split-pane/snice-split-pane.min.js +1 -1
- package/dist/cdn/spotlight/snice-spotlight.js +1 -1
- package/dist/cdn/spotlight/snice-spotlight.min.js +1 -1
- package/dist/cdn/stat-group/snice-stat-group.js +1 -1
- package/dist/cdn/stat-group/snice-stat-group.min.js +1 -1
- package/dist/cdn/step-input/snice-step-input.js +1 -1
- package/dist/cdn/step-input/snice-step-input.min.js +1 -1
- package/dist/cdn/stepper/snice-stepper.js +1 -1
- package/dist/cdn/stepper/snice-stepper.min.js +1 -1
- package/dist/cdn/switch/snice-switch.js +1 -1
- package/dist/cdn/switch/snice-switch.min.js +1 -1
- package/dist/cdn/table/snice-table.js +1 -1
- package/dist/cdn/table/snice-table.min.js +1 -1
- package/dist/cdn/tabs/snice-tabs.js +1 -1
- package/dist/cdn/tabs/snice-tabs.min.js +1 -1
- package/dist/cdn/tag/snice-tag.js +1 -1
- package/dist/cdn/tag/snice-tag.min.js +1 -1
- package/dist/cdn/tag-input/snice-tag-input.js +1 -1
- package/dist/cdn/tag-input/snice-tag-input.min.js +1 -1
- package/dist/cdn/terminal/snice-terminal.js +1 -1
- package/dist/cdn/terminal/snice-terminal.min.js +1 -1
- package/dist/cdn/testimonial/snice-testimonial.js +1 -1
- package/dist/cdn/testimonial/snice-testimonial.min.js +1 -1
- package/dist/cdn/textarea/snice-textarea.js +1 -1
- package/dist/cdn/textarea/snice-textarea.min.js +1 -1
- package/dist/cdn/time-picker/snice-time-picker.js +1 -1
- package/dist/cdn/time-picker/snice-time-picker.min.js +1 -1
- package/dist/cdn/time-range-picker/snice-time-range-picker.js +1 -1
- package/dist/cdn/time-range-picker/snice-time-range-picker.min.js +1 -1
- package/dist/cdn/timeline/snice-timeline.js +1 -1
- package/dist/cdn/timeline/snice-timeline.min.js +1 -1
- package/dist/cdn/timer/snice-timer.js +1 -1
- package/dist/cdn/timer/snice-timer.min.js +1 -1
- package/dist/cdn/toast/snice-toast.js +1 -1
- package/dist/cdn/toast/snice-toast.min.js +1 -1
- package/dist/cdn/tooltip/snice-tooltip.js +1 -1
- package/dist/cdn/tooltip/snice-tooltip.min.js +1 -1
- package/dist/cdn/tree/snice-tree.js +1 -1
- package/dist/cdn/tree/snice-tree.min.js +1 -1
- package/dist/cdn/treemap/snice-treemap.js +1 -1
- package/dist/cdn/treemap/snice-treemap.min.js +1 -1
- package/dist/cdn/user-card/snice-user-card.js +1 -1
- package/dist/cdn/user-card/snice-user-card.min.js +1 -1
- package/dist/cdn/video-player/snice-video-player.js +1 -1
- package/dist/cdn/video-player/snice-video-player.min.js +1 -1
- package/dist/cdn/virtual-scroller/snice-virtual-scroller.js +1 -1
- package/dist/cdn/virtual-scroller/snice-virtual-scroller.min.js +1 -1
- package/dist/cdn/waterfall/snice-waterfall.js +1 -1
- package/dist/cdn/waterfall/snice-waterfall.min.js +1 -1
- package/dist/cdn/weather/snice-weather.js +1 -1
- package/dist/cdn/weather/snice-weather.min.js +1 -1
- package/dist/cdn/work-order/snice-work-order.js +1 -1
- package/dist/cdn/work-order/snice-work-order.min.js +1 -1
- package/dist/context.d.ts +19 -9
- package/dist/index.cjs +233 -158
- package/dist/index.cjs.map +1 -1
- package/dist/index.esm.js +233 -158
- package/dist/index.esm.js.map +1 -1
- package/dist/index.iife.js +233 -158
- package/dist/index.iife.js.map +1 -1
- package/dist/react/SniceProvider.js +1 -1
- package/dist/react/SniceRouter.js +1 -1
- package/dist/react/index.js +1 -1
- package/dist/react/matchRoute.js +1 -1
- package/dist/react/useRequestHandler.js +1 -1
- package/dist/symbols.cjs +3 -1
- package/dist/symbols.cjs.map +1 -1
- package/dist/symbols.d.ts +1 -0
- package/dist/symbols.esm.js +3 -2
- package/dist/symbols.esm.js.map +1 -1
- package/dist/transitions.cjs +1 -1
- package/dist/transitions.esm.js +1 -1
- package/docs/STORYBOOK.md +1 -1
- package/docs/ai/api.md +10 -5
- package/docs/ai/architecture.md +3 -5
- package/docs/ai/decorators.md +6 -1
- package/docs/ai/patterns.md +7 -13
- package/docs/components/drawer.md +1 -1
- package/docs/elements.md +28 -21
- package/docs/routing.md +19 -10
- package/package.json +1 -1
package/dist/context.d.ts
CHANGED
|
@@ -15,30 +15,40 @@ export interface ContextOptions {
|
|
|
15
15
|
/**
|
|
16
16
|
* @context decorator for receiving router context updates
|
|
17
17
|
*
|
|
18
|
+
* Works on both methods and fields:
|
|
19
|
+
*
|
|
20
|
+
* - **Method form**: the method is invoked with the current Context on every
|
|
21
|
+
* update (and once at register time so the first render sees the context).
|
|
22
|
+
* - **Field form**: the field is overwritten with the current Context on
|
|
23
|
+
* every update (and once at register time). Pair with `@property` if you
|
|
24
|
+
* want assignment to also schedule a re-render.
|
|
25
|
+
*
|
|
18
26
|
* @example
|
|
19
27
|
* ```typescript
|
|
20
28
|
* @element('my-layout')
|
|
21
29
|
* class MyLayout extends HTMLElement {
|
|
22
|
-
*
|
|
30
|
+
* // Method form
|
|
31
|
+
* @context()
|
|
23
32
|
* handleContext(ctx: Context) {
|
|
24
|
-
* this.renderNav(ctx.placards, ctx.
|
|
33
|
+
* this.renderNav(ctx.navigation.placards, ctx.navigation.route);
|
|
25
34
|
* }
|
|
26
35
|
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
36
|
+
* // Field form — the field is populated before first render
|
|
37
|
+
* @context() ctx!: Context;
|
|
38
|
+
*
|
|
39
|
+
* // Field + @property — assignment also triggers re-render
|
|
40
|
+
* @property({ attribute: false }) @context() reactiveCtx!: Context;
|
|
31
41
|
* }
|
|
32
42
|
* ```
|
|
33
43
|
*/
|
|
34
|
-
export declare function context(options?: ContextOptions): (
|
|
44
|
+
export declare function context(options?: ContextOptions): (value: any, decoratorContext: ClassMethodDecoratorContext | ClassFieldDecoratorContext) => any;
|
|
35
45
|
/**
|
|
36
46
|
* Setup context handler for an element instance
|
|
37
47
|
* Called automatically during element connection
|
|
38
48
|
*/
|
|
39
|
-
export declare function setupContextHandler(element:
|
|
49
|
+
export declare function setupContextHandler(element: any): void;
|
|
40
50
|
/**
|
|
41
51
|
* Cleanup context handler for an element instance
|
|
42
52
|
* Called automatically during element disconnection
|
|
43
53
|
*/
|
|
44
|
-
export declare function cleanupContextHandler(element:
|
|
54
|
+
export declare function cleanupContextHandler(element: any): void;
|
package/dist/index.cjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* snice
|
|
2
|
+
* snice v5.1.0
|
|
3
3
|
* A decorator-driven web component library with differential rendering, routing, controllers, and 130+ ready-made UI components. Use as much or as little as you want. Zero dependencies, works anywhere.
|
|
4
4
|
* (c) 2024
|
|
5
5
|
* Released under the MIT License.
|
|
@@ -91,6 +91,7 @@ const CONTEXT_NOTIFY_ELEMENT = getSymbol('context-notify-element');
|
|
|
91
91
|
const CONTEXT_TIMER = getSymbol('context-timer');
|
|
92
92
|
const CONTEXT_CALLED = getSymbol('context-called');
|
|
93
93
|
const CONTEXT_UPDATE = getSymbol('context-update');
|
|
94
|
+
const WRAPPED_CONTEXT_HANDLERS = getSymbol('wrapped-context-handlers');
|
|
94
95
|
// Registration de-dup sets on the constructor — replace previous `__*Methods`
|
|
95
96
|
// expando strings that violated the no-double-underscore rule.
|
|
96
97
|
const CONTEXT_METHODS = getSymbol('context-methods');
|
|
@@ -266,13 +267,17 @@ class Context {
|
|
|
266
267
|
const names = elementsMap.get(element);
|
|
267
268
|
if (!names)
|
|
268
269
|
continue;
|
|
269
|
-
|
|
270
|
-
|
|
270
|
+
const wrapped = element[WRAPPED_CONTEXT_HANDLERS];
|
|
271
|
+
if (!wrapped)
|
|
272
|
+
continue;
|
|
273
|
+
for (const handlerName of names) {
|
|
274
|
+
const fn = wrapped.get(handlerName);
|
|
275
|
+
if (typeof fn === 'function') {
|
|
271
276
|
try {
|
|
272
|
-
|
|
277
|
+
fn(this);
|
|
273
278
|
}
|
|
274
279
|
catch (error) {
|
|
275
|
-
console.error(`Error calling @context
|
|
280
|
+
console.error(`Error calling @context handler ${handlerName}:`, error);
|
|
276
281
|
}
|
|
277
282
|
}
|
|
278
283
|
}
|
|
@@ -287,10 +292,13 @@ class Context {
|
|
|
287
292
|
const names = this[REGISTERED_ELEMENTS].get(element);
|
|
288
293
|
if (!names)
|
|
289
294
|
return;
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
295
|
+
const wrapped = element[WRAPPED_CONTEXT_HANDLERS];
|
|
296
|
+
if (!wrapped)
|
|
297
|
+
return;
|
|
298
|
+
for (const handlerName of names) {
|
|
299
|
+
const fn = wrapped.get(handlerName);
|
|
300
|
+
if (typeof fn === 'function')
|
|
301
|
+
fn(this);
|
|
294
302
|
}
|
|
295
303
|
}
|
|
296
304
|
}
|
|
@@ -2673,6 +2681,208 @@ function cleanupEventHandlers(instance) {
|
|
|
2673
2681
|
instance[CLEANUP].events = [];
|
|
2674
2682
|
}
|
|
2675
2683
|
|
|
2684
|
+
/**
|
|
2685
|
+
* @context decorator for receiving router context updates
|
|
2686
|
+
*/
|
|
2687
|
+
const CONTEXT_HANDLERS = getSymbol('context-handlers');
|
|
2688
|
+
/**
|
|
2689
|
+
* @context decorator for receiving router context updates
|
|
2690
|
+
*
|
|
2691
|
+
* Works on both methods and fields:
|
|
2692
|
+
*
|
|
2693
|
+
* - **Method form**: the method is invoked with the current Context on every
|
|
2694
|
+
* update (and once at register time so the first render sees the context).
|
|
2695
|
+
* - **Field form**: the field is overwritten with the current Context on
|
|
2696
|
+
* every update (and once at register time). Pair with `@property` if you
|
|
2697
|
+
* want assignment to also schedule a re-render.
|
|
2698
|
+
*
|
|
2699
|
+
* @example
|
|
2700
|
+
* ```typescript
|
|
2701
|
+
* @element('my-layout')
|
|
2702
|
+
* class MyLayout extends HTMLElement {
|
|
2703
|
+
* // Method form
|
|
2704
|
+
* @context()
|
|
2705
|
+
* handleContext(ctx: Context) {
|
|
2706
|
+
* this.renderNav(ctx.navigation.placards, ctx.navigation.route);
|
|
2707
|
+
* }
|
|
2708
|
+
*
|
|
2709
|
+
* // Field form — the field is populated before first render
|
|
2710
|
+
* @context() ctx!: Context;
|
|
2711
|
+
*
|
|
2712
|
+
* // Field + @property — assignment also triggers re-render
|
|
2713
|
+
* @property({ attribute: false }) @context() reactiveCtx!: Context;
|
|
2714
|
+
* }
|
|
2715
|
+
* ```
|
|
2716
|
+
*/
|
|
2717
|
+
function context$1(options = {}) {
|
|
2718
|
+
return function (value, decoratorContext) {
|
|
2719
|
+
const name = decoratorContext.name;
|
|
2720
|
+
const kind = decoratorContext.kind;
|
|
2721
|
+
const registerHandler = function () {
|
|
2722
|
+
const constructor = this.constructor;
|
|
2723
|
+
// De-dupe: methods identify by reference, fields identify by name.
|
|
2724
|
+
if (!Object.prototype.hasOwnProperty.call(constructor, CONTEXT_METHODS)) {
|
|
2725
|
+
constructor[CONTEXT_METHODS] = new Set();
|
|
2726
|
+
}
|
|
2727
|
+
const dedupeKey = kind === 'method' ? value : `field:${name}`;
|
|
2728
|
+
if (constructor[CONTEXT_METHODS].has(dedupeKey))
|
|
2729
|
+
return;
|
|
2730
|
+
constructor[CONTEXT_METHODS].add(dedupeKey);
|
|
2731
|
+
if (!Object.prototype.hasOwnProperty.call(constructor, CONTEXT_HANDLERS)) {
|
|
2732
|
+
const inherited = constructor[CONTEXT_HANDLERS];
|
|
2733
|
+
constructor[CONTEXT_HANDLERS] = inherited ? [...inherited] : [];
|
|
2734
|
+
}
|
|
2735
|
+
if (kind === 'method') {
|
|
2736
|
+
constructor[CONTEXT_HANDLERS].push({
|
|
2737
|
+
kind: 'method',
|
|
2738
|
+
methodName: name,
|
|
2739
|
+
method: value,
|
|
2740
|
+
options,
|
|
2741
|
+
});
|
|
2742
|
+
}
|
|
2743
|
+
else if (kind === 'field' || kind === 'accessor') {
|
|
2744
|
+
constructor[CONTEXT_HANDLERS].push({
|
|
2745
|
+
kind: 'field',
|
|
2746
|
+
fieldName: name,
|
|
2747
|
+
options,
|
|
2748
|
+
});
|
|
2749
|
+
}
|
|
2750
|
+
};
|
|
2751
|
+
if (kind === 'method') {
|
|
2752
|
+
decoratorContext.addInitializer(registerHandler);
|
|
2753
|
+
return value;
|
|
2754
|
+
}
|
|
2755
|
+
// Field decorators: do registration via the init function (fires per
|
|
2756
|
+
// instance during construction, with `this` bound). Returning the init
|
|
2757
|
+
// function is the canonical Stage 3 way for field decorators —
|
|
2758
|
+
// `addInitializer` for fields can be late or unreliable across runtimes.
|
|
2759
|
+
return function (initialValue) {
|
|
2760
|
+
registerHandler.call(this);
|
|
2761
|
+
return initialValue;
|
|
2762
|
+
};
|
|
2763
|
+
};
|
|
2764
|
+
}
|
|
2765
|
+
/**
|
|
2766
|
+
* Setup context handler for an element instance
|
|
2767
|
+
* Called automatically during element connection
|
|
2768
|
+
*/
|
|
2769
|
+
// Accepts an HTMLElement OR a controller instance — both are plain objects
|
|
2770
|
+
// that may carry CONTEXT_HANDLER and a constructor with CONTEXT_HANDLERS.
|
|
2771
|
+
function setupContextHandler(element) {
|
|
2772
|
+
const handlers = element.constructor[CONTEXT_HANDLERS];
|
|
2773
|
+
if (!handlers || !Array.isArray(handlers) || handlers.length === 0) {
|
|
2774
|
+
return;
|
|
2775
|
+
}
|
|
2776
|
+
// Get the Context instance from the router
|
|
2777
|
+
const ctx = element[CONTEXT_HANDLER];
|
|
2778
|
+
if (!ctx) {
|
|
2779
|
+
return;
|
|
2780
|
+
}
|
|
2781
|
+
// Store the Context instance for cleanup
|
|
2782
|
+
element[NAVIGATION_CONTEXT_INSTANCE] = ctx;
|
|
2783
|
+
// Per-element Map of handler-name → wrapped function. Symbol-keyed so it
|
|
2784
|
+
// doesn't pollute the element's public surface.
|
|
2785
|
+
let wrapped = element[WRAPPED_CONTEXT_HANDLERS];
|
|
2786
|
+
if (!wrapped) {
|
|
2787
|
+
wrapped = new Map();
|
|
2788
|
+
element[WRAPPED_CONTEXT_HANDLERS] = wrapped;
|
|
2789
|
+
}
|
|
2790
|
+
// Register each handler with the Context
|
|
2791
|
+
for (const handler of handlers) {
|
|
2792
|
+
const { kind, options } = handler;
|
|
2793
|
+
const handlerName = kind === 'field' ? handler.fieldName : handler.methodName;
|
|
2794
|
+
// Create wrapped method with timing controls
|
|
2795
|
+
const wrappedFn = function (context) {
|
|
2796
|
+
// Skip if already called once
|
|
2797
|
+
if (options.once && element[CONTEXT_CALLED]) {
|
|
2798
|
+
return;
|
|
2799
|
+
}
|
|
2800
|
+
const callMethod = () => {
|
|
2801
|
+
if (kind === 'field') {
|
|
2802
|
+
element[handler.fieldName] = context;
|
|
2803
|
+
}
|
|
2804
|
+
else {
|
|
2805
|
+
handler.method.call(element, context);
|
|
2806
|
+
}
|
|
2807
|
+
// Handle once option
|
|
2808
|
+
if (options.once) {
|
|
2809
|
+
element[CONTEXT_CALLED] = true;
|
|
2810
|
+
// Unregister after first call
|
|
2811
|
+
const ctx = element[NAVIGATION_CONTEXT_INSTANCE];
|
|
2812
|
+
if (ctx && typeof ctx[CONTEXT_UNREGISTER] === 'function') {
|
|
2813
|
+
ctx[CONTEXT_UNREGISTER](element);
|
|
2814
|
+
}
|
|
2815
|
+
}
|
|
2816
|
+
};
|
|
2817
|
+
// Per-handler timer slot to avoid debounce/throttle handlers on the same
|
|
2818
|
+
// element overwriting each other's state.
|
|
2819
|
+
const timerSlot = element[CONTEXT_TIMER] ||
|
|
2820
|
+
(element[CONTEXT_TIMER] = {});
|
|
2821
|
+
const timerKey = handlerName;
|
|
2822
|
+
if (options.debounce) {
|
|
2823
|
+
clearTimeout(timerSlot[timerKey]?.timeout);
|
|
2824
|
+
timerSlot[timerKey] = {
|
|
2825
|
+
timeout: setTimeout(callMethod, options.debounce),
|
|
2826
|
+
};
|
|
2827
|
+
return;
|
|
2828
|
+
}
|
|
2829
|
+
if (options.throttle) {
|
|
2830
|
+
const now = Date.now();
|
|
2831
|
+
const lastCall = timerSlot[timerKey]?.lastCall || 0;
|
|
2832
|
+
if (now - lastCall >= options.throttle) {
|
|
2833
|
+
timerSlot[timerKey] = { lastCall: now };
|
|
2834
|
+
callMethod();
|
|
2835
|
+
}
|
|
2836
|
+
return;
|
|
2837
|
+
}
|
|
2838
|
+
callMethod();
|
|
2839
|
+
};
|
|
2840
|
+
wrapped.set(handlerName, wrappedFn);
|
|
2841
|
+
// Register with the Context using the handler name (lookup goes through
|
|
2842
|
+
// the WRAPPED_CONTEXT_HANDLERS Map on the element).
|
|
2843
|
+
if (typeof ctx[CONTEXT_REGISTER] === 'function') {
|
|
2844
|
+
ctx[CONTEXT_REGISTER](element, handlerName);
|
|
2845
|
+
}
|
|
2846
|
+
// Synchronously emit current context to the just-registered handler so
|
|
2847
|
+
// field/method values are populated BEFORE the first render microtask
|
|
2848
|
+
// flushes — eliminates the cold-render flicker where ctx is undefined.
|
|
2849
|
+
try {
|
|
2850
|
+
wrappedFn(ctx);
|
|
2851
|
+
}
|
|
2852
|
+
catch (error) {
|
|
2853
|
+
console.error(`Error invoking @context handler at registration:`, error);
|
|
2854
|
+
}
|
|
2855
|
+
}
|
|
2856
|
+
}
|
|
2857
|
+
/**
|
|
2858
|
+
* Cleanup context handler for an element instance
|
|
2859
|
+
* Called automatically during element disconnection
|
|
2860
|
+
*/
|
|
2861
|
+
function cleanupContextHandler(element) {
|
|
2862
|
+
const handlers = element.constructor[CONTEXT_HANDLERS];
|
|
2863
|
+
if (!handlers || !Array.isArray(handlers) || handlers.length === 0) {
|
|
2864
|
+
return;
|
|
2865
|
+
}
|
|
2866
|
+
// Clear any pending debounce timers (per-handler slots)
|
|
2867
|
+
const timerSlot = element[CONTEXT_TIMER];
|
|
2868
|
+
if (timerSlot && typeof timerSlot === 'object') {
|
|
2869
|
+
for (const key of Object.keys(timerSlot)) {
|
|
2870
|
+
if (timerSlot[key]?.timeout)
|
|
2871
|
+
clearTimeout(timerSlot[key].timeout);
|
|
2872
|
+
}
|
|
2873
|
+
delete element[CONTEXT_TIMER];
|
|
2874
|
+
}
|
|
2875
|
+
// Drop the per-element wrapped-handlers Map.
|
|
2876
|
+
delete element[WRAPPED_CONTEXT_HANDLERS];
|
|
2877
|
+
// Unregister from Context if available
|
|
2878
|
+
const ctx = element[NAVIGATION_CONTEXT_INSTANCE];
|
|
2879
|
+
if (ctx && typeof ctx[CONTEXT_UNREGISTER] === 'function') {
|
|
2880
|
+
ctx[CONTEXT_UNREGISTER](element);
|
|
2881
|
+
}
|
|
2882
|
+
delete element[NAVIGATION_CONTEXT_INSTANCE];
|
|
2883
|
+
delete element[CONTEXT_CALLED];
|
|
2884
|
+
}
|
|
2885
|
+
|
|
2676
2886
|
// Controller-scoped cleanup registry
|
|
2677
2887
|
class ControllerScope {
|
|
2678
2888
|
constructor() {
|
|
@@ -2778,6 +2988,14 @@ async function attachController(element, controllerName) {
|
|
|
2778
2988
|
if (routerContext !== undefined) {
|
|
2779
2989
|
controllerInstance[ROUTER_CONTEXT] = routerContext;
|
|
2780
2990
|
}
|
|
2991
|
+
// Mirror the element's CONTEXT_HANDLER onto the controller so
|
|
2992
|
+
// setupContextHandler can wire @context() handlers declared on the
|
|
2993
|
+
// controller class. This makes @context() work identically on elements
|
|
2994
|
+
// and controllers.
|
|
2995
|
+
const ctxHandler = element[CONTEXT_HANDLER];
|
|
2996
|
+
if (ctxHandler !== undefined) {
|
|
2997
|
+
controllerInstance[CONTEXT_HANDLER] = ctxHandler;
|
|
2998
|
+
}
|
|
2781
2999
|
// Store references
|
|
2782
3000
|
element[CONTROLLER_KEY] = controllerInstance;
|
|
2783
3001
|
element[CONTROLLER_NAME_KEY] = controllerName;
|
|
@@ -2816,6 +3034,8 @@ async function attachController(element, controllerName) {
|
|
|
2816
3034
|
setupResponseHandlers(controllerInstance, element);
|
|
2817
3035
|
// Setup @on event handlers for controller
|
|
2818
3036
|
setupEventHandlers(controllerInstance, element);
|
|
3037
|
+
// Setup @context() handlers for controller (fires sync emit at register)
|
|
3038
|
+
setupContextHandler(controllerInstance);
|
|
2819
3039
|
element.dispatchEvent(new CustomEvent('controller-attached', {
|
|
2820
3040
|
detail: { name: controllerName, controller: controllerInstance }
|
|
2821
3041
|
}));
|
|
@@ -2852,12 +3072,15 @@ async function detachController(element) {
|
|
|
2852
3072
|
cleanupResponseHandlers(controllerInstance);
|
|
2853
3073
|
// Cleanup @on event handlers for controller
|
|
2854
3074
|
cleanupEventHandlers(controllerInstance);
|
|
3075
|
+
// Cleanup @context() handlers for controller
|
|
3076
|
+
cleanupContextHandler(controllerInstance);
|
|
2855
3077
|
// Cleanup the controller scope
|
|
2856
3078
|
if (scope) {
|
|
2857
3079
|
await scope.cleanup();
|
|
2858
3080
|
}
|
|
2859
|
-
// Clean up router
|
|
3081
|
+
// Clean up router/context references
|
|
2860
3082
|
delete controllerInstance[ROUTER_CONTEXT];
|
|
3083
|
+
delete controllerInstance[CONTEXT_HANDLER];
|
|
2861
3084
|
delete element[CONTROLLER_KEY];
|
|
2862
3085
|
delete element[CONTROLLER_NAME_KEY];
|
|
2863
3086
|
delete element[CONTROLLER_OPERATIONS];
|
|
@@ -2952,154 +3175,6 @@ function useNativeElementControllers() {
|
|
|
2952
3175
|
globalThis.sniceNativeControllerObserver = observer;
|
|
2953
3176
|
}
|
|
2954
3177
|
|
|
2955
|
-
/**
|
|
2956
|
-
* @context decorator for receiving router context updates
|
|
2957
|
-
*/
|
|
2958
|
-
const CONTEXT_HANDLERS = getSymbol('context-handlers');
|
|
2959
|
-
/**
|
|
2960
|
-
* @context decorator for receiving router context updates
|
|
2961
|
-
*
|
|
2962
|
-
* @example
|
|
2963
|
-
* ```typescript
|
|
2964
|
-
* @element('my-layout')
|
|
2965
|
-
* class MyLayout extends HTMLElement {
|
|
2966
|
-
* @context
|
|
2967
|
-
* handleContext(ctx: Context) {
|
|
2968
|
-
* this.renderNav(ctx.placards, ctx.currentRoute);
|
|
2969
|
-
* }
|
|
2970
|
-
*
|
|
2971
|
-
* @context({ debounce: 300 })
|
|
2972
|
-
* handleContextDebounced(ctx: Context) {
|
|
2973
|
-
* // Called after 300ms of no updates
|
|
2974
|
-
* }
|
|
2975
|
-
* }
|
|
2976
|
-
* ```
|
|
2977
|
-
*/
|
|
2978
|
-
function context$1(options = {}) {
|
|
2979
|
-
return function (originalMethod, context) {
|
|
2980
|
-
const methodName = context.name;
|
|
2981
|
-
context.addInitializer(function () {
|
|
2982
|
-
const constructor = this.constructor;
|
|
2983
|
-
// hasOwnProperty guards so subclasses don't mutate parent state via
|
|
2984
|
-
// the prototype chain.
|
|
2985
|
-
if (!Object.prototype.hasOwnProperty.call(constructor, CONTEXT_METHODS)) {
|
|
2986
|
-
constructor[CONTEXT_METHODS] = new Set();
|
|
2987
|
-
}
|
|
2988
|
-
if (constructor[CONTEXT_METHODS].has(originalMethod))
|
|
2989
|
-
return;
|
|
2990
|
-
constructor[CONTEXT_METHODS].add(originalMethod);
|
|
2991
|
-
if (!Object.prototype.hasOwnProperty.call(constructor, CONTEXT_HANDLERS)) {
|
|
2992
|
-
const inherited = constructor[CONTEXT_HANDLERS];
|
|
2993
|
-
constructor[CONTEXT_HANDLERS] = inherited ? [...inherited] : [];
|
|
2994
|
-
}
|
|
2995
|
-
constructor[CONTEXT_HANDLERS].push({
|
|
2996
|
-
methodName,
|
|
2997
|
-
method: originalMethod,
|
|
2998
|
-
options,
|
|
2999
|
-
});
|
|
3000
|
-
});
|
|
3001
|
-
return originalMethod;
|
|
3002
|
-
};
|
|
3003
|
-
}
|
|
3004
|
-
/**
|
|
3005
|
-
* Setup context handler for an element instance
|
|
3006
|
-
* Called automatically during element connection
|
|
3007
|
-
*/
|
|
3008
|
-
function setupContextHandler(element) {
|
|
3009
|
-
const handlers = element.constructor[CONTEXT_HANDLERS];
|
|
3010
|
-
if (!handlers || !Array.isArray(handlers) || handlers.length === 0) {
|
|
3011
|
-
return;
|
|
3012
|
-
}
|
|
3013
|
-
// Get the Context instance from the router
|
|
3014
|
-
const ctx = element[CONTEXT_HANDLER];
|
|
3015
|
-
if (!ctx) {
|
|
3016
|
-
return;
|
|
3017
|
-
}
|
|
3018
|
-
// Store the Context instance for cleanup
|
|
3019
|
-
element[NAVIGATION_CONTEXT_INSTANCE] = ctx;
|
|
3020
|
-
// Register each handler with the Context
|
|
3021
|
-
for (const handler of handlers) {
|
|
3022
|
-
const { methodName, method, options } = handler;
|
|
3023
|
-
const wrappedMethodName = `__wrapped_${methodName}`;
|
|
3024
|
-
// Create wrapped method with timing controls
|
|
3025
|
-
element[wrappedMethodName] = function (context) {
|
|
3026
|
-
// Skip if already called once
|
|
3027
|
-
if (options.once && element[CONTEXT_CALLED]) {
|
|
3028
|
-
return;
|
|
3029
|
-
}
|
|
3030
|
-
const callMethod = () => {
|
|
3031
|
-
method.call(element, context);
|
|
3032
|
-
// Handle once option
|
|
3033
|
-
if (options.once) {
|
|
3034
|
-
element[CONTEXT_CALLED] = true;
|
|
3035
|
-
// Unregister after first call
|
|
3036
|
-
const ctx = element[NAVIGATION_CONTEXT_INSTANCE];
|
|
3037
|
-
if (ctx && typeof ctx[CONTEXT_UNREGISTER] === 'function') {
|
|
3038
|
-
ctx[CONTEXT_UNREGISTER](element);
|
|
3039
|
-
}
|
|
3040
|
-
}
|
|
3041
|
-
};
|
|
3042
|
-
// Per-handler timer slot to avoid debounce/throttle handlers on the same
|
|
3043
|
-
// element overwriting each other's state.
|
|
3044
|
-
const timerSlot = element[CONTEXT_TIMER] ||
|
|
3045
|
-
(element[CONTEXT_TIMER] = {});
|
|
3046
|
-
const timerKey = methodName;
|
|
3047
|
-
if (options.debounce) {
|
|
3048
|
-
clearTimeout(timerSlot[timerKey]?.timeout);
|
|
3049
|
-
timerSlot[timerKey] = {
|
|
3050
|
-
timeout: setTimeout(callMethod, options.debounce),
|
|
3051
|
-
};
|
|
3052
|
-
return;
|
|
3053
|
-
}
|
|
3054
|
-
if (options.throttle) {
|
|
3055
|
-
const now = Date.now();
|
|
3056
|
-
const lastCall = timerSlot[timerKey]?.lastCall || 0;
|
|
3057
|
-
if (now - lastCall >= options.throttle) {
|
|
3058
|
-
timerSlot[timerKey] = { lastCall: now };
|
|
3059
|
-
callMethod();
|
|
3060
|
-
}
|
|
3061
|
-
return;
|
|
3062
|
-
}
|
|
3063
|
-
callMethod();
|
|
3064
|
-
};
|
|
3065
|
-
// Register with the Context using the wrapped method name
|
|
3066
|
-
if (typeof ctx[CONTEXT_REGISTER] === 'function') {
|
|
3067
|
-
ctx[CONTEXT_REGISTER](element, wrappedMethodName);
|
|
3068
|
-
}
|
|
3069
|
-
}
|
|
3070
|
-
}
|
|
3071
|
-
/**
|
|
3072
|
-
* Cleanup context handler for an element instance
|
|
3073
|
-
* Called automatically during element disconnection
|
|
3074
|
-
*/
|
|
3075
|
-
function cleanupContextHandler(element) {
|
|
3076
|
-
const handlers = element.constructor[CONTEXT_HANDLERS];
|
|
3077
|
-
if (!handlers || !Array.isArray(handlers) || handlers.length === 0) {
|
|
3078
|
-
return;
|
|
3079
|
-
}
|
|
3080
|
-
// Clear any pending debounce timers (per-handler slots)
|
|
3081
|
-
const timerSlot = element[CONTEXT_TIMER];
|
|
3082
|
-
if (timerSlot && typeof timerSlot === 'object') {
|
|
3083
|
-
for (const key of Object.keys(timerSlot)) {
|
|
3084
|
-
if (timerSlot[key]?.timeout)
|
|
3085
|
-
clearTimeout(timerSlot[key].timeout);
|
|
3086
|
-
}
|
|
3087
|
-
delete element[CONTEXT_TIMER];
|
|
3088
|
-
}
|
|
3089
|
-
for (const handler of handlers) {
|
|
3090
|
-
// Clean up wrapped method
|
|
3091
|
-
const wrappedMethodName = `__wrapped_${handler.methodName}`;
|
|
3092
|
-
delete element[wrappedMethodName];
|
|
3093
|
-
}
|
|
3094
|
-
// Unregister from Context if available
|
|
3095
|
-
const ctx = element[NAVIGATION_CONTEXT_INSTANCE];
|
|
3096
|
-
if (ctx && typeof ctx[CONTEXT_UNREGISTER] === 'function') {
|
|
3097
|
-
ctx[CONTEXT_UNREGISTER](element);
|
|
3098
|
-
}
|
|
3099
|
-
delete element[NAVIGATION_CONTEXT_INSTANCE];
|
|
3100
|
-
delete element[CONTEXT_CALLED];
|
|
3101
|
-
}
|
|
3102
|
-
|
|
3103
3178
|
/**
|
|
3104
3179
|
* @render and @styles decorators for Snice v3.0.0
|
|
3105
3180
|
* Provides automatic differential rendering on property changes
|