@fiddle-digital/string-tune 1.1.55 → 1.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/dist/index.d.mts CHANGED
@@ -469,12 +469,13 @@ declare class StringObject {
469
469
  * Mirror objects linked via `string-copy-from`.
470
470
  */
471
471
  private mirrors;
472
+ private _cachedMirrorObjects;
473
+ private _cachedConnects;
474
+ private _mirrorsDirty;
472
475
  /**
473
476
  * Internal key-value store of dynamic object properties (like offsets, progress, etc.).
474
477
  */
475
478
  private properties;
476
- private eventNameCache;
477
- private eventNameSuffixCache;
478
479
  /**
479
480
  * Modules currently connected to this object.
480
481
  */
@@ -484,6 +485,8 @@ declare class StringObject {
484
485
  * Provides functionality to register, trigger, and manage event listeners.
485
486
  */
486
487
  events: EventManager;
488
+ private eventNameCache;
489
+ private eventNameSuffixCache;
487
490
  constructor(id: string, element: HTMLElement);
488
491
  /**
489
492
  * Returns a cached event name in one of these forms:
@@ -521,6 +524,8 @@ declare class StringObject {
521
524
  remove(): void;
522
525
  setInviewAutoBlocked(blocked: boolean): void;
523
526
  isInviewAutoBlocked(): boolean;
527
+ setInviewManualActive(active: boolean): void;
528
+ isInviewManualActive(): boolean;
524
529
  syncInviewClass(): void;
525
530
  /**
526
531
  * Shows the object, applies visual class and notifies connected modules.
@@ -539,6 +544,7 @@ declare class StringObject {
539
544
  isConnectedTo(module: IStringModule): boolean;
540
545
  setTokens(tokens: StringToken[]): void;
541
546
  getToken(key: string): StringToken | null;
547
+ private updateMirrorsCache;
542
548
  addMirror(mirror: StringMirrorObject): void;
543
549
  removeMirror(id: string): void;
544
550
  get mirrorObjects(): StringMirrorObject[];
@@ -1061,6 +1067,7 @@ interface ISplitOptionItem {
1061
1067
  */
1062
1068
  interface ISplitOptions {
1063
1069
  fit?: boolean;
1070
+ trimInlineGaps?: boolean;
1064
1071
  line?: ISplitOptionItem[];
1065
1072
  word?: ISplitOptionItem[];
1066
1073
  char?: ISplitOptionItem[];
@@ -1237,6 +1244,12 @@ type AttributeMapping = {
1237
1244
  transform?: (value: any) => any;
1238
1245
  };
1239
1246
 
1247
+ interface ParseContext {
1248
+ element?: HTMLElement;
1249
+ boundingRect?: DOMRect;
1250
+ viewportHeight?: number;
1251
+ baseRem?: number;
1252
+ }
1240
1253
  /**
1241
1254
  * Base class for a module used in the string-tune system.
1242
1255
  * Extend this class to create custom modules that respond to scroll, resize, input, etc.
@@ -1370,12 +1383,7 @@ declare class StringModule implements IStringModule {
1370
1383
  * @param context Optional helper values like element or viewport size.
1371
1384
  * @returns The parsed and transformed value.
1372
1385
  */
1373
- protected parseAttribute(value: string | null, type: AttributeType, context?: {
1374
- element?: HTMLElement;
1375
- boundingRect?: DOMRect;
1376
- viewportHeight?: number;
1377
- baseRem?: number;
1378
- }): any;
1386
+ protected parseAttribute(value: string | null, type: AttributeType, context?: ParseContext): any;
1379
1387
  /**
1380
1388
  * Determines whether the module should attach to a given object,
1381
1389
  * based on the presence of the module's `htmlKey` in the object keys.
@@ -1398,6 +1406,7 @@ declare class StringModule implements IStringModule {
1398
1406
  * Registers the object internally when it enters the module’s scope.
1399
1407
  */
1400
1408
  enterObject(id: string, object: StringObject): void;
1409
+ protected fastRemoveFromArray<T>(array: T[], index: number): void;
1401
1410
  /**
1402
1411
  * Unregisters the object when it leaves the module’s scope.
1403
1412
  */
@@ -1436,6 +1445,8 @@ declare class StringModule implements IStringModule {
1436
1445
  * @param object The disconnected object.
1437
1446
  */
1438
1447
  onObjectDisconnected(object: StringObject): void;
1448
+ protected get respectSelfDisable(): boolean;
1449
+ protected isPrimaryElementEnabled(object: StringObject): boolean;
1439
1450
  /**
1440
1451
  * Applies a style or callback to both the main element and all its connected elements.
1441
1452
  *
@@ -2053,11 +2064,31 @@ declare class StringScrollbar extends StringModule {
2053
2064
  * computes alignment/random values, and applies CSS vars.
2054
2065
  */
2055
2066
  declare class StringSplit extends StringModule {
2067
+ /** Last content-width (px) at which each element was split. Keyed by element itself. */
2068
+ private lastSplitWidth;
2056
2069
  constructor(context: StringContext);
2057
2070
  onInit(): void;
2071
+ onObjectDisconnected(object: StringObject): void;
2058
2072
  onResizeWidth(): void;
2059
2073
  onObjectConnected(object: StringObject): void;
2060
- split(element: HTMLElement, options: ISplitOptions): {
2074
+ private extractTextContent;
2075
+ private getSplitOptions;
2076
+ private hasLineDrivenSplit;
2077
+ private needsWidthRebuild;
2078
+ private needsForcedRebuildOnFontLoad;
2079
+ private getDebugStoreKey;
2080
+ private writeDebugRecord;
2081
+ private isDebugEnabled;
2082
+ private getDebugLabel;
2083
+ private logConnectionStart;
2084
+ private captureBaselineSnapshot;
2085
+ private logSplitAnalysis;
2086
+ private getTokenDebugText;
2087
+ private logRenderedState;
2088
+ private applyFlexLineBreaks;
2089
+ private getBlockContainerContentWidth;
2090
+ private getElementContentWidth;
2091
+ split(element: HTMLElement, options: ISplitOptions, debugEnabled?: boolean): {
2061
2092
  fragment: DocumentFragment;
2062
2093
  result: DocumentFragment;
2063
2094
  extraProps: Map<string, string>;
@@ -2591,104 +2622,36 @@ declare class StringRandom extends StringModule {
2591
2622
  onObjectConnected(object: StringObject): void;
2592
2623
  }
2593
2624
 
2594
- /**
2595
- * Base class for managing scroll behavior in the system.
2596
- * Handles abstract scroll state and updates, intended for extension.
2597
- */
2598
2625
  declare class ScrollController {
2599
- /** Shared context containing data and tools */
2600
2626
  protected context: StringContext;
2601
- /** Reference to the document object */
2602
2627
  protected document: Document;
2603
- /** Name of the scroll mode (e.g. 'default', 'smooth', etc.) */
2604
2628
  name: string;
2605
- /** Whether the system is in programmatic scroll mode */
2606
2629
  isProg: boolean;
2607
- /** Whether parallax-related logic should be active */
2608
2630
  isParallaxEnabled: boolean;
2609
- /** Scroll direction: vertical or horizontal */
2610
- protected _scrollDirection: "vertical" | "horizontal";
2611
- /**
2612
- * Current scroll direction.
2613
- * - `true` — scrolling down
2614
- * - `false` — scrolling up
2615
- * - `null` — unknown (initial state)
2616
- */
2617
- protected isBottomScrollDirection: boolean | null;
2631
+ protected _isVertical: boolean;
2632
+ protected _scrollDirState: number;
2633
+ protected _lastAppliedDirState: number;
2618
2634
  protected isLastBottomScrollDirection: boolean;
2619
2635
  protected scrollTriggerRules: Array<ScrollMarkRule>;
2620
- /** Tracks whether this controller is currently active */
2621
2636
  protected isActive: boolean;
2622
- /** Last direction applied to DOM classes (for global-class toggles) */
2623
- protected lastAppliedDirection: boolean | null;
2624
- /**
2625
- * Sets scroll direction and updates internal scroll logic.
2626
- * @param scrollDirection Either 'vertical' or 'horizontal'.
2627
- */
2628
- set scrollDirection(scrollDirection: "vertical" | "horizontal");
2629
- /**
2630
- * Creates a new ScrollController instance.
2631
- * @param context Shared context containing data and settings.
2632
- */
2637
+ set scrollDirection(dir: "vertical" | "horizontal");
2633
2638
  constructor(context: StringContext);
2634
- /**
2635
- * Called when scroll direction changes (up ↔ down).
2636
- * Override this callback in subclasses or instances.
2637
- */
2638
2639
  onChangeDirection: () => void;
2639
- /**
2640
- * Called when scroll starts (user input).
2641
- * Override this callback in subclasses or instances.
2642
- */
2643
2640
  onScrollStart: () => void;
2644
- /**
2645
- * Called when scroll ends.
2646
- * Override this callback in subclasses or instances.
2647
- */
2648
2641
  onScrollStop: () => void;
2649
- /**
2650
- * Scroll-to function called on each frame.
2651
- * This will be reassigned depending on scroll direction.
2652
- */
2653
- onCalcUpdate: () => void;
2654
- /**
2655
- * Called every animation frame.
2656
- * Intended to be overridden in subclasses.
2657
- */
2642
+ onCalcUpdate(): void;
2658
2643
  onFrame(): void;
2659
- /**
2660
- * Called when wheel event is fired.
2661
- * Override to implement custom scroll interaction.
2662
- * @param e Wheel event.
2663
- */
2664
2644
  onWheel(e: any): void;
2665
- /**
2666
- * Called when native scroll event is fired.
2667
- * Override to track native scroll position.
2668
- * @param e Scroll event.
2669
- */
2670
2645
  onScroll(e: any): void;
2646
+ onTouchStart(e: TouchEvent): void;
2647
+ onTouchMove(e: TouchEvent): void;
2648
+ onTouchEnd(e: TouchEvent): void;
2671
2649
  disableScrollEvents(): void;
2672
2650
  enableScrollEvents(): void;
2673
- /**
2674
- * Called when this controller becomes the active scroll engine.
2675
- * Ensures event bindings are attached only once.
2676
- */
2677
2651
  activate(): void;
2678
- /**
2679
- * Called when this controller is deactivated.
2680
- * Ensures event bindings are detached only once.
2681
- */
2682
2652
  deactivate(): void;
2683
- /**
2684
- * Allows controllers to clean up resources on global destroy.
2685
- */
2686
2653
  destroy(): void;
2687
- /**
2688
- * Updates scroll direction state, emits events, and toggles global classes.
2689
- * Intended for reuse by custom scroll adapters.
2690
- */
2691
- protected updateScrollDirection(newDirection: boolean): void;
2654
+ protected updateScrollDirection(isDown: boolean): void;
2692
2655
  protected clearScrollingClasses(): void;
2693
2656
  protected triggerScrollRules(): void;
2694
2657
  addScrollMark(rule: ScrollMarkRule): void;
@@ -2699,11 +2662,31 @@ declare class ScrollController {
2699
2662
  interface StringDevtoolState {
2700
2663
  active: boolean;
2701
2664
  }
2665
+ interface StringDevtoolHotkey {
2666
+ key: string;
2667
+ shiftKey?: boolean;
2668
+ ctrlKey?: boolean;
2669
+ altKey?: boolean;
2670
+ metaKey?: boolean;
2671
+ }
2672
+ interface StringDevtoolSubBadge {
2673
+ id: string;
2674
+ icon: string;
2675
+ label: string;
2676
+ /** Extra attribute used as a CSS selector hook (e.g. "data-string-grid-global-toggle"). */
2677
+ selectorAttribute?: string;
2678
+ /** Additional data-* attributes applied to the badge button. */
2679
+ attributes?: Record<string, string | boolean | number | null | undefined>;
2680
+ onClick: (anchorElement?: HTMLElement) => void;
2681
+ }
2702
2682
  interface StringDevtoolDefinition {
2703
2683
  id: string;
2704
2684
  label: string;
2705
2685
  icon: string;
2706
2686
  order?: number;
2687
+ group?: number;
2688
+ hotkey?: StringDevtoolHotkey;
2689
+ subBadges?: StringDevtoolSubBadge[];
2707
2690
  getState: () => StringDevtoolState;
2708
2691
  setActive: (active: boolean) => void;
2709
2692
  subscribe?: (listener: (state: StringDevtoolState) => void) => () => void;
@@ -2744,6 +2727,16 @@ interface StringDevModuleDefinitionConfig {
2744
2727
  label: string;
2745
2728
  icon: string;
2746
2729
  order?: number;
2730
+ group?: number;
2731
+ hotkey?: StringDevtoolHotkey;
2732
+ }
2733
+ interface StringDevConnectsConfig {
2734
+ /** If true, connects to every StringObject (overlay default). If false, only explicit matches below + dev-inspect fallback. */
2735
+ global?: boolean;
2736
+ /** Connect to objects whose string="…" token list includes any of these keys. */
2737
+ keys?: string[];
2738
+ /** Connect to objects whose DOM element has any of these attributes present. */
2739
+ attributes?: string[];
2747
2740
  }
2748
2741
  interface StringDevOverlayConfig {
2749
2742
  /** Unique layer name, e.g. "devtools-progress" */
@@ -2764,6 +2757,8 @@ interface StringDevModuleConfig extends StringDevModuleDefinitionConfig {
2764
2757
  styles?: string | (() => string);
2765
2758
  /** Overlay layer configuration. Declare for any module that uses a viewport layer. */
2766
2759
  overlay?: StringDevOverlayConfig;
2760
+ /** Declare which StringObjects this module connects to. Replaces htmlKey assignment in constructor. */
2761
+ connects?: StringDevConnectsConfig;
2767
2762
  }
2768
2763
  declare class StringDevModule extends StringModule implements StringDevtoolProvider {
2769
2764
  /** Declare module metadata statically. Subclasses override this. */
@@ -2771,12 +2766,18 @@ declare class StringDevModule extends StringModule implements StringDevtoolProvi
2771
2766
  protected readonly overlayRegistry: StringDevOverlayRegistry;
2772
2767
  private readonly acquiredViewportLayers;
2773
2768
  private readonly devtoolListeners;
2769
+ private hotkeyHandler;
2774
2770
  protected devtoolConfig: StringDevModuleDefinitionConfig | null;
2775
2771
  constructor(context: StringContext);
2772
+ protected get respectSelfDisable(): boolean;
2773
+ protected get connectsConfig(): StringDevConnectsConfig | undefined;
2774
+ canConnect(object: StringObject): boolean;
2776
2775
  protected getStyleScopeId(stylesText: string): string;
2777
2776
  protected getStyles(): string | null;
2778
2777
  getDevtoolDefinition(): StringDevtoolDefinition | null;
2778
+ protected getDevtoolSubBadges(): StringDevtoolSubBadge[];
2779
2779
  protected configureDevtool(config: StringDevModuleDefinitionConfig): void;
2780
+ protected bindDevtoolHotkey(hotkey?: StringDevtoolHotkey): void;
2780
2781
  protected emitDevtoolState(active?: boolean): void;
2781
2782
  protected acquireViewportLayer(id: string, zIndex: number): StringDevViewportLayer;
2782
2783
  protected releaseViewportLayer(id: string): void;
@@ -2793,7 +2794,7 @@ declare function buildGridCSS(): string;
2793
2794
  * StringDevLayout — developer utility module for layout overlays.
2794
2795
  *
2795
2796
  * Usage:
2796
- * <div string="grid">...</div>
2797
+ * <div string="layout">...</div>
2797
2798
  *
2798
2799
  * No configuration attributes needed. All configuration happens
2799
2800
  * through the interactive HUD panel (hover top-right corner).
@@ -2806,6 +2807,7 @@ declare function buildGridCSS(): string;
2806
2807
  declare class StringDevLayout extends StringDevModule {
2807
2808
  private gridManager;
2808
2809
  private viewportLayer;
2810
+ private overlayLayer;
2809
2811
  private overlays;
2810
2812
  private huds;
2811
2813
  private elementMap;
@@ -2814,15 +2816,29 @@ declare class StringDevLayout extends StringDevModule {
2814
2816
  private enabled;
2815
2817
  private needsMeasure;
2816
2818
  private hasPendingMutate;
2819
+ private globalHost;
2820
+ private globalOverlay;
2821
+ private globalHUD;
2822
+ private globalSubBadge;
2817
2823
  static devtool: {
2818
2824
  id: string;
2819
2825
  label: string;
2820
2826
  icon: string;
2821
2827
  order: number;
2828
+ group: number;
2829
+ hotkey: {
2830
+ key: string;
2831
+ shiftKey: boolean;
2832
+ };
2822
2833
  styles: typeof buildGridCSS;
2834
+ connects: {
2835
+ global: boolean;
2836
+ keys: string[];
2837
+ };
2823
2838
  };
2824
2839
  constructor(context: StringContext);
2825
2840
  onInit(): void;
2841
+ protected getDevtoolSubBadges(): StringDevtoolSubBadge[];
2826
2842
  onObjectConnected(object: StringObject): void;
2827
2843
  onObjectDisconnected(object: StringObject): void;
2828
2844
  onResize(): void;
@@ -2843,9 +2859,10 @@ declare class StringDevLayout extends StringDevModule {
2843
2859
  private handleMoveToEnd;
2844
2860
  private handleSelectLayout;
2845
2861
  private handleUpdateLayoutMinWidth;
2846
- private handlePreviewResponsiveLayout;
2847
- private handleCommitResponsiveLayout;
2862
+ private handleAddLayout;
2863
+ private handleRemoveLayout;
2848
2864
  private handleRenameInstance;
2865
+ private handleRenamePanelTitle;
2849
2866
  private handleHUDOpen;
2850
2867
  private handleHUDClose;
2851
2868
  private handleLayoutPanelOpen;
@@ -2853,9 +2870,17 @@ declare class StringDevLayout extends StringDevModule {
2853
2870
  private handleExport;
2854
2871
  private handleImport;
2855
2872
  private renderElement;
2873
+ private syncToResolved;
2874
+ private syncSelectedLayoutToViewport;
2856
2875
  private refreshHUD;
2857
- private resolveActiveLayoutState;
2858
- private syncSelectedLayoutToResolved;
2876
+ private ensureGlobalGrid;
2877
+ private syncGlobalHostSize;
2878
+ private renderGlobal;
2879
+ private refreshGlobalHUD;
2880
+ private toggleGlobalPanel;
2881
+ private syncGlobalSubBadgeState;
2882
+ private positionGlobalHudAtAnchor;
2883
+ private destroyGlobalGrid;
2859
2884
  private destroyElement;
2860
2885
  private ensureTriggerLayer;
2861
2886
  private applyTriggerLayerState;
@@ -2877,7 +2902,14 @@ declare class StringDevLayout extends StringDevModule {
2877
2902
  * Each devtool module returns an array of these to describe its settings panel.
2878
2903
  */
2879
2904
  type StringDevUIFieldDescriptor = StringDevUIFieldNumber | StringDevUIFieldRange | StringDevUIFieldColor | StringDevUIFieldSelect | StringDevUIFieldToggle | StringDevUIFieldDivider;
2880
- interface StringDevUIFieldNumber {
2905
+ interface StringDevUIFieldDisabledWhen {
2906
+ readonly key: string;
2907
+ readonly equals: string | number | boolean;
2908
+ }
2909
+ interface StringDevUIFieldBase {
2910
+ readonly disabledWhen?: StringDevUIFieldDisabledWhen;
2911
+ }
2912
+ interface StringDevUIFieldNumber extends StringDevUIFieldBase {
2881
2913
  readonly type: "number";
2882
2914
  readonly key: string;
2883
2915
  readonly label: string;
@@ -2886,7 +2918,7 @@ interface StringDevUIFieldNumber {
2886
2918
  readonly max?: number;
2887
2919
  readonly step?: number;
2888
2920
  }
2889
- interface StringDevUIFieldRange {
2921
+ interface StringDevUIFieldRange extends StringDevUIFieldBase {
2890
2922
  readonly type: "range";
2891
2923
  readonly key: string;
2892
2924
  readonly label: string;
@@ -2894,6 +2926,12 @@ interface StringDevUIFieldRange {
2894
2926
  readonly min: number;
2895
2927
  readonly max: number;
2896
2928
  readonly step?: number;
2929
+ /** Multiplies the stored value for display/editing in the UI. */
2930
+ readonly displayMultiplier?: number;
2931
+ /** Optional UI step in display-space (e.g. 10 for 0..100 opacity UX). */
2932
+ readonly displayStep?: number;
2933
+ /** Optional display-only suffix rendered next to the numeric value. */
2934
+ readonly suffix?: string;
2897
2935
  /** When provided, a compact unit dropdown is shown next to the value input. */
2898
2936
  readonly units?: ReadonlyArray<{
2899
2937
  value: string;
@@ -2902,13 +2940,13 @@ interface StringDevUIFieldRange {
2902
2940
  /** Default unit value (used when no persisted unit exists). */
2903
2941
  readonly defaultUnit?: string;
2904
2942
  }
2905
- interface StringDevUIFieldColor {
2943
+ interface StringDevUIFieldColor extends StringDevUIFieldBase {
2906
2944
  readonly type: "color";
2907
2945
  readonly key: string;
2908
2946
  readonly label: string;
2909
2947
  readonly default: string;
2910
2948
  }
2911
- interface StringDevUIFieldSelect {
2949
+ interface StringDevUIFieldSelect extends StringDevUIFieldBase {
2912
2950
  readonly type: "select";
2913
2951
  readonly key: string;
2914
2952
  readonly label: string;
@@ -2918,7 +2956,7 @@ interface StringDevUIFieldSelect {
2918
2956
  label: string;
2919
2957
  }>;
2920
2958
  }
2921
- interface StringDevUIFieldToggle {
2959
+ interface StringDevUIFieldToggle extends StringDevUIFieldBase {
2922
2960
  readonly type: "toggle";
2923
2961
  readonly key: string;
2924
2962
  readonly label: string;
@@ -2998,8 +3036,94 @@ declare abstract class GridAdapter {
2998
3036
  protected createPath(d: string, stroke: string, opacity: number, strokeWidth?: number, fill?: string): SVGPathElement;
2999
3037
  }
3000
3038
 
3039
+ /**
3040
+ * StringDevRulers — developer utility module for guide-line rulers.
3041
+ *
3042
+ * Usage:
3043
+ * st.use(StringDevRulers)
3044
+ * st.use(StringDevRulers, { triggers: [...], grid: { type: "columns", count: 12, ... } })
3045
+ *
3046
+ * Default trigger: Shift + R
3047
+ *
3048
+ * Settings:
3049
+ * triggers — array of trigger descriptors (keyboard / element / event)
3050
+ * rulers-snap — grid step in px (0 = off)
3051
+ * rulers-snap-elements — snap to [string] element edges (default: true)
3052
+ * rulers-snap-threshold — snap pull radius in px (default: 8)
3053
+ * rulers-snap-selector — CSS selector for snap targets
3054
+ * grid — RulersLayoutGrid | RulersLayoutGrid[]
3055
+ *
3056
+ * Snap visual feedback:
3057
+ * amber → snapping to a DOM element edge / center
3058
+ * green → snapping to a layout-grid line
3059
+ */
3060
+ declare class StringDevRulers extends StringDevModule {
3061
+ private manager;
3062
+ private overlay;
3063
+ private visible;
3064
+ private dockDisabled;
3065
+ private currentModeId;
3066
+ private readonly modeStore;
3067
+ private readonly viewportLayer;
3068
+ private _kbHandlers;
3069
+ private _elHandlers;
3070
+ private _evHandlers;
3071
+ static devtool: {
3072
+ id: string;
3073
+ label: string;
3074
+ icon: string;
3075
+ order: number;
3076
+ group: number;
3077
+ hotkey: {
3078
+ key: string;
3079
+ shiftKey: boolean;
3080
+ };
3081
+ styles: string;
3082
+ connects: {
3083
+ global: boolean;
3084
+ keys: string[];
3085
+ };
3086
+ };
3087
+ constructor(context: StringContext);
3088
+ onInit(): void;
3089
+ onSettingsChange(): void;
3090
+ onSubscribe(): void;
3091
+ onUnsubscribe(): void;
3092
+ onFrame(data: StringData): void;
3093
+ onResize(): void;
3094
+ destroy(): void;
3095
+ toggle(): void;
3096
+ show(): void;
3097
+ hide(): void;
3098
+ clear(): void;
3099
+ isVisible(): boolean;
3100
+ protected getDevtoolActiveState(): boolean;
3101
+ protected setDevtoolActiveState(active: boolean): void;
3102
+ protected getDevtoolSubBadges(): StringDevtoolSubBadge[];
3103
+ private _bindTriggers;
3104
+ private _unbindTriggers;
3105
+ private _applyAction;
3106
+ private setVisible;
3107
+ private setDockActive;
3108
+ private mountOverlay;
3109
+ private cycleMode;
3110
+ private switchMode;
3111
+ private applyStyleSettings;
3112
+ private clearStyleSettings;
3113
+ /** Normalises the `grid` setting to RulersLayoutGrid[] (or undefined). */
3114
+ private _resolveGrids;
3115
+ private syncOverlayMetrics;
3116
+ private pushScrollToOverlay;
3117
+ }
3118
+
3001
3119
  type StringDevtoolsOverlayId = string;
3120
+ interface AnchorPoint {
3121
+ docX: number;
3122
+ docY: number;
3123
+ }
3002
3124
 
3125
+ type OverlayAxis = "y" | "x";
3126
+ type OverlayAnchor = "start" | "end";
3003
3127
  interface OverlayBaseMetrics {
3004
3128
  visible: boolean;
3005
3129
  contentX: number;
@@ -3010,6 +3134,17 @@ interface OverlayBaseMetrics {
3010
3134
  baseAnchorX: number;
3011
3135
  baseAnchorY: number;
3012
3136
  collisionOffset: number;
3137
+ axis: OverlayAxis;
3138
+ primarySize: number;
3139
+ crossSize: number;
3140
+ primaryContentOffset: number;
3141
+ viewportPrimarySize: number;
3142
+ }
3143
+ interface OverlayObjectGeometry {
3144
+ contentX: number;
3145
+ contentY: number;
3146
+ width: number;
3147
+ height: number;
3013
3148
  }
3014
3149
  interface StringDevOverlayBadgeInit {
3015
3150
  targetId: string;
@@ -3023,20 +3158,29 @@ interface StringDevOverlayBadgeState {
3023
3158
  disabled?: boolean;
3024
3159
  title?: string;
3025
3160
  html?: string;
3161
+ label?: string;
3026
3162
  attributes?: Record<string, string | boolean | number | null | undefined>;
3027
3163
  }
3028
3164
  declare abstract class StringDevOverlayModule<TEntry = unknown, TMeasurement = unknown> extends StringDevModule {
3029
3165
  private _viewportLayer?;
3166
+ private _badgeLayer?;
3167
+ private _hudLayer?;
3030
3168
  protected get viewportLayer(): StringDevViewportLayer;
3169
+ protected get badgeLayer(): StringDevViewportLayer;
3170
+ protected get hudLayer(): StringDevViewportLayer;
3031
3171
  protected readonly entries: Map<string, TEntry>;
3032
3172
  protected readonly measurements: Map<string, TMeasurement>;
3033
3173
  protected enabled: boolean;
3034
3174
  protected needsMeasure: boolean;
3035
3175
  protected hasPendingMutate: boolean;
3176
+ private _rafId;
3177
+ private _pendingSingleIds;
3036
3178
  private readonly onOverlayLayoutChangeBind;
3037
3179
  private get _overlayConfig();
3038
3180
  /** Override to provide the overlay ID for the anchor/collision system. */
3039
3181
  protected get overlayId(): StringDevtoolsOverlayId | null;
3182
+ /** Override to declare how many badge slots this overlay occupies. */
3183
+ protected get overlayBadgeCount(): number;
3040
3184
  /** Override to define your viewport layer name. Falls back to devtool.overlay.layerName. */
3041
3185
  protected get layerName(): string;
3042
3186
  /** Override to define your viewport layer z-index. Falls back to devtool.overlay.zIndex. */
@@ -3068,11 +3212,29 @@ declare abstract class StringDevOverlayModule<TEntry = unknown, TMeasurement = u
3068
3212
  onMutate(): void;
3069
3213
  onResize(): void;
3070
3214
  onDOMRebuild(): void;
3215
+ /**
3216
+ * Immediate synchronous full sync — use only when instant visual response
3217
+ * is required (e.g. setEnabled). For everything else prefer scheduleSync().
3218
+ */
3071
3219
  protected scheduleFullSync(): void;
3220
+ /**
3221
+ * Deferred full sync — batches multiple calls within the same animation
3222
+ * frame into a single measure+flush pass. Use for resize, layout changes,
3223
+ * object connected, and any other non-immediate triggers.
3224
+ */
3225
+ protected scheduleSync(): void;
3226
+ /**
3227
+ * Deferred single-entry sync — measures and flushes only the given entry.
3228
+ * Multiple calls for different entries within the same frame are batched
3229
+ * together into one styleTxn flush. Use for per-object events like
3230
+ * object:inview or slider input where only one entry changes.
3231
+ */
3232
+ protected scheduleSingleSync(entry: TEntry): void;
3072
3233
  protected collectMeasurements(): void;
3073
3234
  protected flushMeasurements(): void;
3074
3235
  protected ensureLayer(): HTMLDivElement;
3075
3236
  protected applyEnabledState(): void;
3237
+ private syncSlotRegistration;
3076
3238
  protected resolveOverlayTargetId(object: StringObject): string;
3077
3239
  protected resolveOverlayObjectDepth(element: HTMLElement): number;
3078
3240
  protected createOverlayBadge(init: StringDevOverlayBadgeInit): HTMLButtonElement;
@@ -3081,19 +3243,66 @@ declare abstract class StringDevOverlayModule<TEntry = unknown, TMeasurement = u
3081
3243
  visible: boolean;
3082
3244
  docX: number;
3083
3245
  docY: number;
3246
+ translate?: string;
3084
3247
  } | undefined): void;
3248
+ protected getOverlayTargetLabel(object: StringObject): string;
3249
+ protected getViewportAnchorOffset(anchor: OverlayAnchor, metrics: OverlayBaseMetrics): number;
3250
+ protected getOverlayAnchorAdjustment(_object: StringObject, _anchor: AnchorPoint, _metrics?: {
3251
+ contentX: number;
3252
+ contentY: number;
3253
+ width: number;
3254
+ height: number;
3255
+ }): AnchorPoint;
3256
+ protected resolveRulerPanelOffset(contentX: number, contentY: number): {
3257
+ x: number;
3258
+ y: number;
3259
+ };
3085
3260
  protected computeBaseMetrics(entry: any): OverlayBaseMetrics;
3086
- private getHiddenMetrics;
3261
+ protected getHiddenMetrics(): OverlayBaseMetrics;
3087
3262
  protected getObjectDocY(object: StringObject): number;
3263
+ protected resolveOverlayObjectGeometry(object: StringObject, element?: HTMLElement): OverlayObjectGeometry;
3088
3264
  protected getViewportScrollLeft(): number;
3089
3265
  protected getViewportScrollTop(): number;
3266
+ protected resolveLiveElementMetrics(element: HTMLElement, rect: DOMRect): {
3267
+ docLeft?: number;
3268
+ docTop?: number;
3269
+ width: number;
3270
+ height: number;
3271
+ };
3090
3272
  destroy(): void;
3091
3273
  }
3092
3274
 
3093
- interface StringDevBadgeMeasurement {
3275
+ type StringDevBadgeSlot = "top-left" | "top-right" | "bottom-right" | "bottom-left";
3276
+ interface StringDevBadgeSlotConfig {
3277
+ gap?: number;
3278
+ offsetX?: number;
3279
+ offsetY?: number;
3280
+ }
3281
+ interface StringDevBadgeDescriptor {
3282
+ id: string;
3283
+ slot?: StringDevBadgeSlot;
3284
+ group?: string;
3285
+ selectorAttribute?: string;
3286
+ depth?: number;
3287
+ attributes?: Record<string, string | boolean | number | null | undefined>;
3288
+ gap?: number;
3289
+ offsetX?: number;
3290
+ offsetY?: number;
3291
+ }
3292
+ interface StringDevManagedBadge {
3293
+ id: string;
3294
+ descriptor: StringDevBadgeDescriptor;
3295
+ element: HTMLButtonElement;
3296
+ }
3297
+ interface StringDevBadgePositionMeasurement {
3094
3298
  visible: boolean;
3095
3299
  docX: number;
3096
3300
  docY: number;
3301
+ translate?: string;
3302
+ }
3303
+ interface StringDevBadgeMeasurement {
3304
+ visible: boolean;
3305
+ badges: Record<string, StringDevBadgePositionMeasurement>;
3097
3306
  }
3098
3307
  interface StringDevBadgeEntry<TExtra = undefined> {
3099
3308
  object: StringObject;
@@ -3102,207 +3311,139 @@ interface StringDevBadgeEntry<TExtra = undefined> {
3102
3311
  depth: number;
3103
3312
  extra: TExtra;
3104
3313
  cleanup: Array<() => void>;
3314
+ badges: Map<string, StringDevManagedBadge>;
3315
+ groups: Map<string, HTMLDivElement>;
3105
3316
  }
3106
3317
  declare abstract class StringDevBadgeOverlayModule<TExtra = undefined, TMeasurement extends StringDevBadgeMeasurement = StringDevBadgeMeasurement> extends StringDevOverlayModule<StringDevBadgeEntry<TExtra>, TMeasurement> {
3107
- /** Override to define the data-attribute on the badge element. Falls back to devtool.overlay.badgeAttribute. */
3108
3318
  protected get badgeAttribute(): string;
3109
3319
  protected createOverlayEntry(object: StringObject): StringDevBadgeEntry<TExtra>;
3110
3320
  protected destroyOverlayEntry(entry: StringDevBadgeEntry<TExtra>): void;
3111
- protected measureEntry(_entry: StringDevBadgeEntry<TExtra>, metrics: OverlayBaseMetrics): TMeasurement;
3321
+ protected measureEntry(entry: StringDevBadgeEntry<TExtra>, metrics: OverlayBaseMetrics): TMeasurement;
3112
3322
  protected applyMeasurement(entry: StringDevBadgeEntry<TExtra>, measurement: TMeasurement | undefined): void;
3113
3323
  protected onEnabledChange(_enabled: boolean): void;
3114
3324
  protected createBadgeExtra(_object: StringObject, _badge: HTMLButtonElement, _targetId: string, _depth: number): TExtra;
3115
3325
  protected destroyBadgeExtra(_entry: StringDevBadgeEntry<TExtra>): void;
3116
3326
  protected bindBadge(_entry: StringDevBadgeEntry<TExtra>): Array<() => void> | void;
3117
3327
  protected resolveBadgeDepth(object: StringObject): number;
3328
+ protected getBadgeSlotConfig(): Partial<Record<StringDevBadgeSlot, StringDevBadgeSlotConfig>>;
3329
+ protected getBadgeDescriptors(object: StringObject, targetId: string, depth: number): Array<StringDevBadgeDescriptor>;
3118
3330
  protected getInitialBadgeAttributes(_object: StringObject, _targetId: string, _depth: number): Record<string, string | boolean | number | null | undefined> | undefined;
3119
3331
  protected applyBadgeEnabledState(entry: StringDevBadgeEntry<TExtra>): void;
3120
3332
  protected renderBadge(entry: StringDevBadgeEntry<TExtra>): void;
3121
3333
  protected afterBadgeMeasurement(_entry: StringDevBadgeEntry<TExtra>, _measurement: TMeasurement | undefined): void;
3122
- protected abstract onBadgeClick(entry: StringDevBadgeEntry<TExtra>, event: MouseEvent): void;
3123
- protected abstract getBadgeState(entry: StringDevBadgeEntry<TExtra>): StringDevOverlayBadgeState;
3124
- }
3125
-
3126
- interface InviewToggleExtra {
3127
- onInviewChange: () => void;
3128
- }
3129
- declare class StringDevInviewToggle extends StringDevBadgeOverlayModule<InviewToggleExtra> {
3130
- static devtool: {
3131
- id: string;
3132
- label: string;
3133
- icon: string;
3134
- order: number;
3135
- styles: string;
3136
- overlay: {
3137
- layerName: string;
3138
- zIndex: number;
3139
- layerAttribute: string;
3140
- overlayId: string;
3141
- badgeAttribute: string;
3142
- defaultEnabled: boolean;
3143
- };
3144
- };
3145
- canConnect(_object: StringObject): boolean;
3146
- protected createBadgeExtra(object: StringObject): InviewToggleExtra;
3147
- protected bindBadge(entry: StringDevBadgeEntry<InviewToggleExtra>): Array<() => void>;
3148
- protected onBadgeClick(entry: StringDevBadgeEntry<InviewToggleExtra>, _event: MouseEvent): void;
3149
- protected getBadgeState(entry: StringDevBadgeEntry<InviewToggleExtra>): StringDevOverlayBadgeState;
3150
- }
3151
-
3152
- /**
3153
- * StringDevRulers — developer utility module for guide-line rulers.
3154
- *
3155
- * Usage:
3156
- * st.use(StringDevRulers)
3157
- * st.use(StringDevRulers, { triggers: [...], grid: { type: "columns", count: 12, ... } })
3158
- *
3159
- * Default trigger: Shift + R
3160
- *
3161
- * Settings:
3162
- * triggers — array of trigger descriptors (keyboard / element / event)
3163
- * rulers-snap — grid step in px (0 = off)
3164
- * rulers-snap-elements — snap to [string] element edges (default: true)
3165
- * rulers-snap-threshold — snap pull radius in px (default: 8)
3166
- * rulers-snap-selector — CSS selector for snap targets
3167
- * grid — RulersLayoutGrid | RulersLayoutGrid[]
3168
- *
3169
- * Snap visual feedback:
3170
- * amber → snapping to a DOM element edge / center
3171
- * green → snapping to a layout-grid line
3172
- */
3173
- declare class StringDevRulers extends StringDevModule {
3174
- private manager;
3175
- private overlay;
3176
- private visible;
3177
- private dockDisabled;
3178
- private currentModeId;
3179
- private readonly viewportLayer;
3180
- private _kbHandlers;
3181
- private _elHandlers;
3182
- private _evHandlers;
3183
- static devtool: {
3184
- id: string;
3185
- label: string;
3186
- icon: string;
3187
- order: number;
3188
- styles: string;
3189
- };
3190
- constructor(context: StringContext);
3191
- onInit(): void;
3192
- onSettingsChange(): void;
3193
- onSubscribe(): void;
3194
- onUnsubscribe(): void;
3195
- onFrame(data: StringData): void;
3196
- onResize(): void;
3197
- destroy(): void;
3198
- toggle(): void;
3199
- show(): void;
3200
- hide(): void;
3201
- isVisible(): boolean;
3202
- protected getDevtoolActiveState(): boolean;
3203
- protected setDevtoolActiveState(active: boolean): void;
3204
- private _bindTriggers;
3205
- private _unbindTriggers;
3206
- private _applyAction;
3207
- private setVisible;
3208
- private setDockActive;
3209
- private mountOverlay;
3210
- private cycleMode;
3211
- private switchMode;
3212
- private applyStyleSettings;
3213
- private clearStyleSettings;
3214
- /** Normalises the `grid` setting to RulersLayoutGrid[] (or undefined). */
3215
- private _resolveGrids;
3216
- private syncOverlayMetrics;
3217
- }
3218
-
3219
- interface OffsetOverlayEntry {
3220
- object: StringObject;
3221
- root: HTMLDivElement;
3222
- box: HTMLDivElement;
3223
- topZone: HTMLDivElement;
3224
- bottomZone: HTMLDivElement;
3225
- topMarker: HTMLDivElement;
3226
- bottomMarker: HTMLDivElement;
3227
- topMarkerValue: HTMLSpanElement;
3228
- bottomMarkerValue: HTMLSpanElement;
3229
- badge: HTMLButtonElement;
3230
- badgeDepth: number;
3231
- onBadgeClick: (event: MouseEvent) => void;
3232
- }
3233
- interface OffsetOverlayMeasurement {
3234
- visible: boolean;
3334
+ protected abstract onBadgeClick(entry: StringDevBadgeEntry<TExtra>, event: MouseEvent, badge: StringDevManagedBadge): void;
3335
+ protected abstract getBadgeState(entry: StringDevBadgeEntry<TExtra>, badge?: StringDevManagedBadge): StringDevOverlayBadgeState;
3336
+ private resolveBadgeSlotConfig;
3337
+ private resolveBadgePosition;
3338
+ }
3339
+
3340
+ interface InviewExtra {
3341
+ outline: HTMLDivElement;
3342
+ enterConnector: HTMLDivElement;
3343
+ exitConnector: HTMLDivElement;
3344
+ enterMarker: HTMLDivElement;
3345
+ exitMarker: HTMLDivElement;
3346
+ enterMarkerLabel: HTMLSpanElement;
3347
+ exitMarkerLabel: HTMLSpanElement;
3348
+ }
3349
+ interface InviewMeasurement extends StringDevBadgeMeasurement {
3235
3350
  overlayVisible: boolean;
3236
3351
  badgeVisible: boolean;
3352
+ markersVisible: boolean;
3237
3353
  inview: boolean;
3238
- boxDocX: number;
3239
- boxDocY: number;
3240
- width: number;
3241
- height: number;
3242
- borderRadius: string;
3243
- topZoneDocX: number;
3244
- topZoneDocY: number;
3245
- topZoneWidth: number;
3246
- topZoneHeight: number;
3247
- topZoneEmpty: boolean;
3248
- bottomZoneDocX: number;
3249
- bottomZoneDocY: number;
3250
- bottomZoneWidth: number;
3251
- bottomZoneHeight: number;
3252
- bottomZoneEmpty: boolean;
3253
- topMarkerDocX: number;
3254
- topMarkerDocY: number;
3255
- topMarkerValue: string;
3256
- bottomMarkerDocX: number;
3257
- bottomMarkerDocY: number;
3258
- bottomMarkerValue: string;
3259
- badgeDocX: number;
3260
- badgeDocY: number;
3261
- }
3262
- declare class StringDevOffsets extends StringDevOverlayModule<OffsetOverlayEntry, OffsetOverlayMeasurement> {
3354
+ outlineDocX: number;
3355
+ outlineDocY: number;
3356
+ outlineWidth: number;
3357
+ outlineHeight: number;
3358
+ enterConnectorDocX: number;
3359
+ enterConnectorDocY: number;
3360
+ enterConnectorWidth: number;
3361
+ enterConnectorHeight: number;
3362
+ exitConnectorDocX: number;
3363
+ exitConnectorDocY: number;
3364
+ exitConnectorWidth: number;
3365
+ exitConnectorHeight: number;
3366
+ enterMarkerDocX: number;
3367
+ enterMarkerDocY: number;
3368
+ enterMarkerFlippedY: boolean;
3369
+ exitMarkerDocX: number;
3370
+ exitMarkerDocY: number;
3371
+ exitMarkerFlippedY: boolean;
3372
+ }
3373
+ declare class StringDevInview extends StringDevBadgeOverlayModule<InviewExtra, InviewMeasurement> {
3263
3374
  static devtool: {
3264
3375
  id: string;
3265
3376
  label: string;
3266
3377
  icon: string;
3267
3378
  order: number;
3379
+ group: number;
3380
+ hotkey: {
3381
+ key: string;
3382
+ shiftKey: boolean;
3383
+ };
3268
3384
  styles: string;
3269
3385
  overlay: {
3270
3386
  layerName: string;
3271
3387
  zIndex: number;
3272
3388
  layerAttribute: string;
3273
3389
  overlayId: string;
3390
+ defaultEnabled: boolean;
3391
+ };
3392
+ connects: {
3393
+ global: boolean;
3274
3394
  };
3275
3395
  };
3396
+ protected get overlayBadgeCount(): number;
3397
+ protected getDevtoolSubBadges(): StringDevtoolSubBadge[];
3276
3398
  private entryEnabled;
3277
- canConnect(_object: StringObject): boolean;
3278
- protected createOverlayEntry(object: StringObject): OffsetOverlayEntry;
3279
- protected destroyOverlayEntry(entry: OffsetOverlayEntry): void;
3280
- protected measureEntry(entry: OffsetOverlayEntry, metrics: OverlayBaseMetrics): OffsetOverlayMeasurement;
3281
- protected applyMeasurement(entry: OffsetOverlayEntry, measurement: OffsetOverlayMeasurement | undefined): void;
3399
+ private markerSizeCache;
3400
+ private readonly disabledStore;
3401
+ private readonly markerStore;
3402
+ private disabledTargetIds;
3403
+ private markerOffsets;
3404
+ private stableCoarseViewportWidth;
3405
+ private stableCoarseViewportHeight;
3406
+ protected getBadgeDescriptors(_object: StringObject, _targetId: string, _depth: number): Array<StringDevBadgeDescriptor>;
3407
+ protected createBadgeExtra(object: StringObject, _badge: HTMLButtonElement, targetId: string, _depth: number): InviewExtra;
3408
+ protected destroyBadgeExtra(entry: StringDevBadgeEntry<InviewExtra>): void;
3409
+ protected bindBadge(entry: StringDevBadgeEntry<InviewExtra>): Array<() => void>;
3410
+ protected measureEntry(entry: StringDevBadgeEntry<InviewExtra>, metrics: OverlayBaseMetrics): InviewMeasurement;
3411
+ protected afterBadgeMeasurement(entry: StringDevBadgeEntry<InviewExtra>, measurement: InviewMeasurement | undefined): void;
3412
+ protected onBadgeClick(entry: StringDevBadgeEntry<InviewExtra>, _event: MouseEvent, badge: StringDevManagedBadge): void;
3413
+ protected getBadgeState(entry: StringDevBadgeEntry<InviewExtra>, badge?: StringDevManagedBadge): StringDevOverlayBadgeState;
3282
3414
  private hiddenMeasurement;
3415
+ private getInviewBadgeState;
3416
+ private toggleInview;
3417
+ private isInviewBadgeActive;
3283
3418
  private isEntryEnabled;
3284
3419
  private setEntryEnabled;
3285
- private getViewportAnchorOffset;
3420
+ private disableAllOffsets;
3421
+ private bindMarkerDrag;
3422
+ private getMarkerOffset;
3423
+ private setMarkerOffset;
3424
+ private syncMarkerContent;
3425
+ private getViewportMarkerLabel;
3426
+ private measureMarkerSize;
3427
+ private resolveLiveStickyGeometry;
3428
+ private clampMarkerPercentInViewport;
3429
+ private clampMarkerPercentInClientViewport;
3430
+ private syncCompactMode;
3431
+ private syncCompactModeForExtra;
3432
+ private setAttributeIfChanged;
3433
+ private getStableViewportHeight;
3286
3434
  }
3287
3435
 
3288
3436
  interface ProgressEntry {
3289
3437
  object: StringObject;
3290
- chrome: HTMLDivElement;
3438
+ hud: HTMLDivElement;
3291
3439
  badge: HTMLButtonElement;
3292
- panel: HTMLDivElement;
3293
- title: HTMLSpanElement;
3294
- slider: HTMLInputElement;
3295
- easedValue: HTMLSpanElement;
3296
- rawValue: HTMLSpanElement;
3297
- rangeValue: HTMLSpanElement;
3298
3440
  onBadgeClick: (event: MouseEvent) => void;
3299
- onSliderInput: () => void;
3300
3441
  }
3301
3442
  interface ProgressMeasurement {
3302
3443
  visible: boolean;
3303
3444
  docX: number;
3304
3445
  docY: number;
3305
- targetLabel: string;
3446
+ targetId: string;
3306
3447
  progress: number;
3307
3448
  rawProgress: number;
3308
3449
  startPosition: number;
@@ -3316,6 +3457,11 @@ declare class StringDevProgress extends StringDevOverlayModule<ProgressEntry, Pr
3316
3457
  label: string;
3317
3458
  icon: string;
3318
3459
  order: number;
3460
+ group: number;
3461
+ hotkey: {
3462
+ key: string;
3463
+ shiftKey: boolean;
3464
+ };
3319
3465
  styles: string;
3320
3466
  overlay: {
3321
3467
  layerName: string;
@@ -3323,10 +3469,24 @@ declare class StringDevProgress extends StringDevOverlayModule<ProgressEntry, Pr
3323
3469
  layerAttribute: string;
3324
3470
  overlayId: string;
3325
3471
  };
3472
+ connects: {
3473
+ keys: string[];
3474
+ };
3326
3475
  };
3327
- private openEntryId;
3328
- private readonly onDocumentPointerDownBind;
3329
- constructor(context: any);
3476
+ private openTargetLabel;
3477
+ private panelRoot;
3478
+ private panelTitle;
3479
+ private panelSlider;
3480
+ private panelValue;
3481
+ private panelEasedValue;
3482
+ private panelPlayForwardButton;
3483
+ private panelPlayBackwardButton;
3484
+ private autoplayRaf;
3485
+ private autoplayDirection;
3486
+ private autoplayProgress;
3487
+ private readonly onPanelSliderInputBind;
3488
+ private unbindOutsideClick;
3489
+ constructor(context: StringContext);
3330
3490
  onInit(): void;
3331
3491
  destroy(): void;
3332
3492
  protected createOverlayEntry(object: StringObject): ProgressEntry;
@@ -3338,25 +3498,40 @@ declare class StringDevProgress extends StringDevOverlayModule<ProgressEntry, Pr
3338
3498
  private openPanel;
3339
3499
  private closePanel;
3340
3500
  private closeAllPanels;
3341
- private onDocumentPointerDown;
3501
+ private collectEntryHuds;
3502
+ private startAutoplay;
3503
+ private stopAutoplay;
3504
+ private syncPlayButtonState;
3505
+ private getEntryRange;
3342
3506
  private resolveEntryRawProgress;
3343
3507
  private resolveEasedProgress;
3344
3508
  private setEntryProgressOverride;
3345
3509
  private clearEntryProgressOverride;
3346
3510
  private clearAllProgressOverrides;
3347
3511
  private applyObjectProgress;
3512
+ private ensurePanel;
3513
+ private onPanelSliderInput;
3514
+ private renderPanel;
3515
+ private findEntryByTargetLabel;
3516
+ }
3517
+
3518
+ interface DevtoolsIconDef {
3519
+ id: string;
3520
+ viewBox: string;
3521
+ content: string;
3348
3522
  }
3349
3523
 
3524
+ type DevtoolsIconSize = 12 | 16 | 20;
3350
3525
  declare class StringDevIconRegistry {
3351
3526
  private static instance;
3352
- private readonly icons;
3527
+ private spriteRoot;
3353
3528
  private constructor();
3354
3529
  static getInstance(): StringDevIconRegistry;
3355
- register(id: string, svg: string): void;
3356
- get(id: string): string | null;
3357
- resolve(iconOrId: string): string;
3530
+ register(icon: DevtoolsIconDef): void;
3531
+ resolve(size: DevtoolsIconSize, name: string, ...modifiers: string[]): string;
3532
+ private ensureSprite;
3358
3533
  }
3359
- declare function resolveDevtoolsIcon(iconOrId: string): string;
3534
+ declare function resolveDevtoolsIcon(size: DevtoolsIconSize, name: string, ...modifiers: string[]): string;
3360
3535
 
3361
3536
  type StringDevStyleTokens = Record<string, string>;
3362
3537
  declare function buildDevtoolsThemeBlock(selectors: string | string[], overrides?: StringDevStyleTokens): string;
@@ -3497,6 +3672,7 @@ declare class DOMBatcher {
3497
3672
  declare class StringTune {
3498
3673
  private static readonly DEVTOOLS_ACCESS_URL;
3499
3674
  private static readonly DEVTOOLS_LOG_PREFIX;
3675
+ private static readonly DEVTOOLS_ARTIFACT_SELECTORS;
3500
3676
  /** Bound handler for the scroll start event */
3501
3677
  private onScrollStartBind;
3502
3678
  /** Bound handler for the scroll stop event */
@@ -3642,6 +3818,7 @@ declare class StringTune {
3642
3818
  * @param settings Optional settings specific to this module.
3643
3819
  */
3644
3820
  use(objectClass: typeof StringModule, settings?: any): void;
3821
+ private cleanupExistingDevtoolsArtifacts;
3645
3822
  private instantiateModule;
3646
3823
  private shouldDeferDevtoolModule;
3647
3824
  private validateDevtoolsAccess;
@@ -3798,4 +3975,4 @@ declare class StringTune {
3798
3975
  destroy(): void;
3799
3976
  }
3800
3977
 
3801
- export { CursorReactiveModule, DOMBatcher, GridAdapter, type RulersLayoutGrid, type RulersTriggerAction, ScrollController, type ScrollMarkRule as ScrollTriggerRule, StringAnchor, type StringContext, StringCursor, StringData, StringDelayLerpTracker, StringDevIconRegistry, StringDevInviewToggle, StringDevLayout, StringDevModule, StringDevOffsets, StringDevOverlayRegistry, StringDevProgress, StringDevRulers, type StringDevStyleTokens, type StringDevtoolDefinition, type StringDevtoolProvider, type StringDevtoolState, StringFPSTracker, StringForm, StringGlide, StringImpulse, StringLazy, StringLerp, StringLerpTracker, StringLoading, StringMagnetic, StringMasonry, StringModule, StringObject, StringParallax, StringPositionTracker, StringProgress, StringProgressPart, StringRandom, StringResponsive, type StringRulersTrigger, StringScrollContainer, StringScrollbar, StringScroller, StringSequence, StringSplit, StringSpotlight, StringTune, StringVideoAutoplay, buildDevtoolsThemeBlock, StringTune as default, ensureStringDevtoolsSharedStyles, frameDOM, resolveDevtoolsIcon, styleTxn };
3978
+ export { CursorReactiveModule, DOMBatcher, GridAdapter, type RulersLayoutGrid, type RulersTriggerAction, ScrollController, type ScrollMarkRule as ScrollTriggerRule, StringAnchor, type StringContext, StringCursor, StringData, StringDelayLerpTracker, StringDevIconRegistry, StringDevInview, StringDevLayout, StringDevModule, StringDevOverlayRegistry, StringDevProgress, StringDevRulers, type StringDevStyleTokens, type StringDevtoolDefinition, type StringDevtoolProvider, type StringDevtoolState, StringFPSTracker, StringForm, StringGlide, StringImpulse, StringLazy, StringLerp, StringLerpTracker, StringLoading, StringMagnetic, StringMasonry, StringModule, StringObject, StringParallax, StringPositionTracker, StringProgress, StringProgressPart, StringRandom, StringResponsive, type StringRulersTrigger, StringScrollContainer, StringScrollbar, StringScroller, StringSequence, StringSplit, StringSpotlight, StringTune, StringVideoAutoplay, buildDevtoolsThemeBlock, StringTune as default, ensureStringDevtoolsSharedStyles, frameDOM, resolveDevtoolsIcon, styleTxn };