@fiddle-digital/string-tune 1.1.54 → 1.1.55

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
@@ -407,6 +407,22 @@ declare class EventManager {
407
407
  clearAll(): void;
408
408
  }
409
409
 
410
+ type StringTokenModeSpec = {
411
+ kind: "default";
412
+ values: [];
413
+ } | {
414
+ kind: "all";
415
+ values: [];
416
+ } | {
417
+ kind: "include";
418
+ values: ScrollMode[];
419
+ };
420
+ interface StringToken {
421
+ raw: string;
422
+ key: string;
423
+ modeSpec: StringTokenModeSpec;
424
+ }
425
+
410
426
  type MirrorEasingFn = (value: number) => number;
411
427
  /**
412
428
  * Lightweight wrapper that mirrors a primary StringObject while keeping
@@ -448,6 +464,7 @@ declare class StringObject {
448
464
  * Space-separated list of all attribute keys associated with this object.
449
465
  */
450
466
  keys: string[];
467
+ tokens: StringToken[];
451
468
  /**
452
469
  * Mirror objects linked via `string-copy-from`.
453
470
  */
@@ -458,28 +475,6 @@ declare class StringObject {
458
475
  private properties;
459
476
  private eventNameCache;
460
477
  private eventNameSuffixCache;
461
- /**
462
- * Direct properties for extremely hot, per-frame accessed metrics
463
- * to avoid going through the Map and incurring overhead.
464
- */
465
- progress: number;
466
- progressRaw: number;
467
- startPosition: number;
468
- differencePosition: number;
469
- transformValue: {
470
- transform: string;
471
- } | null;
472
- eventProgressName: string | null;
473
- lerp: number;
474
- glide: number;
475
- isMagneting: boolean;
476
- magneticX: number;
477
- magneticY: number;
478
- magneticTargetX: number;
479
- magneticTargetY: number;
480
- eventLerpName: string | null;
481
- eventGlideName: string | null;
482
- eventMagneticName: string | null;
483
478
  /**
484
479
  * Modules currently connected to this object.
485
480
  */
@@ -540,6 +535,10 @@ declare class StringObject {
540
535
  * @param module - The module to connect
541
536
  */
542
537
  connect(module: IStringModule): boolean;
538
+ disconnect(module: IStringModule): boolean;
539
+ isConnectedTo(module: IStringModule): boolean;
540
+ setTokens(tokens: StringToken[]): void;
541
+ getToken(key: string): StringToken | null;
543
542
  addMirror(mirror: StringMirrorObject): void;
544
543
  removeMirror(id: string): void;
545
544
  get mirrorObjects(): StringMirrorObject[];
@@ -1265,23 +1264,28 @@ declare class StringModule implements IStringModule {
1265
1264
  * This map is used to manage and track `StringObject` instances on a page.
1266
1265
  */
1267
1266
  protected objectMapOnPage: Map<string, StringObject>;
1267
+ protected allObjectMapOnPage: Map<string, StringObject>;
1268
1268
  /**
1269
1269
  * A protected array that holds the collection of `StringObject` instances
1270
1270
  * currently present on the page.
1271
1271
  */
1272
1272
  protected objectsOnPage: StringObject[];
1273
+ protected allObjectsOnPage: StringObject[];
1273
1274
  /**
1274
1275
  * A map of all entered objects by their unique ID.
1275
1276
  */
1276
1277
  protected objectMap: Map<string, StringObject>;
1278
+ protected allObjectMap: Map<string, StringObject>;
1277
1279
  /**
1278
1280
  * A flat array of all connected objects.
1279
1281
  */
1280
1282
  protected objects: StringObject[];
1283
+ protected allObjects: StringObject[];
1281
1284
  /**
1282
1285
  * The HTML attribute key that identifies objects this module is responsible for.
1283
1286
  */
1284
1287
  protected htmlKey: string;
1288
+ protected defaultModeScope: "all" | ScrollMode[];
1285
1289
  /**
1286
1290
  * Module type ID used internally to categorize module behavior.
1287
1291
  */
@@ -1291,6 +1295,7 @@ declare class StringModule implements IStringModule {
1291
1295
  * Type 1 = core module, type 2 = UI module.
1292
1296
  */
1293
1297
  get type(): number;
1298
+ get key(): string;
1294
1299
  /**
1295
1300
  * Tools container providing utilities for attribute parsing, unit conversion, etc.
1296
1301
  * Acts as a dependency injection hub for core IStringTool implementations.
@@ -1379,6 +1384,9 @@ declare class StringModule implements IStringModule {
1379
1384
  * @returns `true` if the module can connect, `false` otherwise.
1380
1385
  */
1381
1386
  canConnect(object: StringObject): boolean;
1387
+ protected isTokenEnabledInCurrentMode(token: StringToken): boolean;
1388
+ protected isObjectEnabledInCurrentMode(object: StringObject): boolean;
1389
+ disconnectObject(object: StringObject): void;
1382
1390
  /**
1383
1391
  * Registers the module on a given object, adds the object to internal list,
1384
1392
  * and triggers connection logic.
@@ -1455,6 +1463,10 @@ declare class StringModule implements IStringModule {
1455
1463
  * Returns a cached per-object event name to avoid building strings in hot paths.
1456
1464
  */
1457
1465
  protected getObjectEventName(object: StringObject, prefix: string, suffix?: string): string;
1466
+ protected clearManagedStyles(object: StringObject): void;
1467
+ protected onObjectModeActivated(object: StringObject): void;
1468
+ protected onObjectModeDeactivated(object: StringObject): void;
1469
+ protected rebuildActiveObjectsForCurrentMode(): void;
1458
1470
  /**
1459
1471
  * Cleans up internal state and detaches the module from the system.
1460
1472
  */
@@ -1572,6 +1584,8 @@ declare class ObjectManager {
1572
1584
  add(el: HTMLElement): void;
1573
1585
  setDOMBatcherEnabled(enabled: boolean): void;
1574
1586
  setIntersectionObserverEnabled(enabled: boolean): void;
1587
+ attachModule(module: StringModule): void;
1588
+ refreshModuleConnectionsForCurrentMode(): void;
1575
1589
  invalidateInviewIndex(): void;
1576
1590
  refreshLayoutForRoot(root: HTMLElement): void;
1577
1591
  /**
@@ -1642,6 +1656,8 @@ declare class ObjectManager {
1642
1656
  private rebuildInviewIndex;
1643
1657
  private upperBound;
1644
1658
  private splitPipeAndTrim;
1659
+ private parseStringTokens;
1660
+ private splitTopLevelPipe;
1645
1661
  destroy(): void;
1646
1662
  }
1647
1663
 
@@ -1890,6 +1906,7 @@ declare class StringAnchor extends StringModule {
1890
1906
  * to create a smooth scrolling effect for objects.
1891
1907
  */
1892
1908
  declare class StringGlide extends StringModule {
1909
+ protected defaultModeScope: string[];
1893
1910
  private previousLerp;
1894
1911
  private displacement;
1895
1912
  private acceleration;
@@ -1902,9 +1919,8 @@ declare class StringGlide extends StringModule {
1902
1919
  constructor(context: StringContext);
1903
1920
  initializeObject(globalId: number, object: StringObject, element: HTMLElement, attributes: Record<string, any>): void;
1904
1921
  private setupItem;
1905
- private onUpdateDesktopEvent;
1906
- private onUpdateMobileEvent;
1907
- private onUpdateEvent;
1922
+ private updateTransforms;
1923
+ private resetObjectStyles;
1908
1924
  private calcExpanderFactor;
1909
1925
  onStart(): void;
1910
1926
  onResize(): void;
@@ -1912,7 +1928,9 @@ declare class StringGlide extends StringModule {
1912
1928
  onScrollStart(): void;
1913
1929
  onScrollStop(): void;
1914
1930
  onFrame(data: StringData): void;
1931
+ protected onObjectModeDeactivated(object: StringObject): void;
1915
1932
  onMutate(): void;
1933
+ private applyPendingGlideStylesForObject;
1916
1934
  private applyPendingGlideStyles;
1917
1935
  private flushPendingGlideStyles;
1918
1936
  }
@@ -1923,6 +1941,7 @@ declare class StringGlide extends StringModule {
1923
1941
  */
1924
1942
  declare class StringLerp extends StringModule {
1925
1943
  private hasInitializedCSS;
1944
+ protected defaultModeScope: string[];
1926
1945
  constructor(context: StringContext);
1927
1946
  /**
1928
1947
  * Initialize lerp value when object connects.
@@ -1986,6 +2005,7 @@ declare class StringProgress extends StringModule {
1986
2005
  * necessary transformations based on scroll progress and viewport size.
1987
2006
  */
1988
2007
  declare class StringParallax extends StringProgress {
2008
+ protected defaultModeScope: string[];
1989
2009
  private updateScheduledTransform;
1990
2010
  private calculateParallaxForObject;
1991
2011
  constructor(context: StringContext);
@@ -1995,11 +2015,9 @@ declare class StringParallax extends StringProgress {
1995
2015
  initializeObject(globalId: number, object: StringObject, element: HTMLElement, attributes: Record<string, any>): void;
1996
2016
  calculatePositions(object: StringObject, windowSize: number): void;
1997
2017
  onScroll(data: StringData): void;
1998
- onResize(): void;
1999
2018
  onScrollMeasure(data: StringData): void;
2000
2019
  onMutate(): void;
2001
- private calculateDesktopParallax;
2002
- private calculateMobileParallax;
2020
+ private calculateParallax;
2003
2021
  }
2004
2022
 
2005
2023
  declare class StringScrollbar extends StringModule {
@@ -2678,6 +2696,182 @@ declare class ScrollController {
2678
2696
  scrollTo(position: number, immediate?: boolean): void;
2679
2697
  }
2680
2698
 
2699
+ interface StringDevtoolState {
2700
+ active: boolean;
2701
+ }
2702
+ interface StringDevtoolDefinition {
2703
+ id: string;
2704
+ label: string;
2705
+ icon: string;
2706
+ order?: number;
2707
+ getState: () => StringDevtoolState;
2708
+ setActive: (active: boolean) => void;
2709
+ subscribe?: (listener: (state: StringDevtoolState) => void) => () => void;
2710
+ }
2711
+ interface StringDevtoolProvider {
2712
+ getDevtoolDefinition(): StringDevtoolDefinition | null;
2713
+ }
2714
+
2715
+ declare class StringDevViewportLayer {
2716
+ private readonly id;
2717
+ private readonly zIndex;
2718
+ private screenRoot;
2719
+ private world;
2720
+ private screen;
2721
+ private worldHost;
2722
+ private hostPositionWasPatched;
2723
+ private hostPositionInlineValue;
2724
+ constructor(id: string, zIndex: number);
2725
+ ensure(host?: HTMLElement | null): HTMLDivElement;
2726
+ getElement(): HTMLDivElement | null;
2727
+ getWorldElement(host?: HTMLElement | null): HTMLDivElement;
2728
+ getScreenElement(): HTMLDivElement;
2729
+ destroy(): void;
2730
+ private attachWorldToHost;
2731
+ private restoreHostPosition;
2732
+ }
2733
+
2734
+ declare class StringDevOverlayRegistry {
2735
+ private static instance;
2736
+ private readonly layers;
2737
+ static getInstance(): StringDevOverlayRegistry;
2738
+ acquire(id: string, zIndex: number): StringDevViewportLayer;
2739
+ release(id: string): void;
2740
+ }
2741
+
2742
+ interface StringDevModuleDefinitionConfig {
2743
+ id: string;
2744
+ label: string;
2745
+ icon: string;
2746
+ order?: number;
2747
+ }
2748
+ interface StringDevOverlayConfig {
2749
+ /** Unique layer name, e.g. "devtools-progress" */
2750
+ layerName: string;
2751
+ /** Z-index for the viewport layer */
2752
+ zIndex: number;
2753
+ /** Data-attribute added to the layer root, e.g. "data-string-progress-layer" */
2754
+ layerAttribute?: string;
2755
+ /** Overlay ID used for the anchor/collision system. Omit if not needed. */
2756
+ overlayId?: string;
2757
+ /** Whether the overlay starts enabled before dock preferences apply. Default: false */
2758
+ defaultEnabled?: boolean;
2759
+ /** For badge overlay modules: data-attribute placed on each badge element */
2760
+ badgeAttribute?: string;
2761
+ }
2762
+ interface StringDevModuleConfig extends StringDevModuleDefinitionConfig {
2763
+ /** Declare CSS styles to inject once. Can be a string or a lazy getter. */
2764
+ styles?: string | (() => string);
2765
+ /** Overlay layer configuration. Declare for any module that uses a viewport layer. */
2766
+ overlay?: StringDevOverlayConfig;
2767
+ }
2768
+ declare class StringDevModule extends StringModule implements StringDevtoolProvider {
2769
+ /** Declare module metadata statically. Subclasses override this. */
2770
+ static devtool: StringDevModuleConfig | null;
2771
+ protected readonly overlayRegistry: StringDevOverlayRegistry;
2772
+ private readonly acquiredViewportLayers;
2773
+ private readonly devtoolListeners;
2774
+ protected devtoolConfig: StringDevModuleDefinitionConfig | null;
2775
+ constructor(context: StringContext);
2776
+ protected getStyleScopeId(stylesText: string): string;
2777
+ protected getStyles(): string | null;
2778
+ getDevtoolDefinition(): StringDevtoolDefinition | null;
2779
+ protected configureDevtool(config: StringDevModuleDefinitionConfig): void;
2780
+ protected emitDevtoolState(active?: boolean): void;
2781
+ protected acquireViewportLayer(id: string, zIndex: number): StringDevViewportLayer;
2782
+ protected releaseViewportLayer(id: string): void;
2783
+ protected ensureStyle(styleId: string, cssText: string): HTMLStyleElement;
2784
+ protected getWorldHost(): HTMLElement;
2785
+ protected getDevtoolActiveState(): boolean;
2786
+ protected setDevtoolActiveState(_active: boolean): void;
2787
+ destroy(): void;
2788
+ }
2789
+
2790
+ declare function buildGridCSS(): string;
2791
+
2792
+ /**
2793
+ * StringDevLayout — developer utility module for layout overlays.
2794
+ *
2795
+ * Usage:
2796
+ * <div string="grid">...</div>
2797
+ *
2798
+ * No configuration attributes needed. All configuration happens
2799
+ * through the interactive HUD panel (hover top-right corner).
2800
+ *
2801
+ * Supports multiple grid types via the adapter pattern:
2802
+ * - Columns, Rows, Center
2803
+ * - Rule of Thirds, Phi Grid, Golden Rectangle, Harmonic Armature
2804
+ * - Extensible via `st.use(StringDevLayout, { adapters: [MyAdapter] })`
2805
+ */
2806
+ declare class StringDevLayout extends StringDevModule {
2807
+ private gridManager;
2808
+ private viewportLayer;
2809
+ private overlays;
2810
+ private huds;
2811
+ private elementMap;
2812
+ private triggerEntries;
2813
+ private triggerMeasurements;
2814
+ private enabled;
2815
+ private needsMeasure;
2816
+ private hasPendingMutate;
2817
+ static devtool: {
2818
+ id: string;
2819
+ label: string;
2820
+ icon: string;
2821
+ order: number;
2822
+ styles: typeof buildGridCSS;
2823
+ };
2824
+ constructor(context: StringContext);
2825
+ onInit(): void;
2826
+ onObjectConnected(object: StringObject): void;
2827
+ onObjectDisconnected(object: StringObject): void;
2828
+ onResize(): void;
2829
+ onScroll(): void;
2830
+ onScrollMeasure(): void;
2831
+ onMutate(): void;
2832
+ onDOMRebuild(): void;
2833
+ destroy(): void;
2834
+ setEnabled(enabled: boolean): void;
2835
+ isEnabled(): boolean;
2836
+ protected getDevtoolActiveState(): boolean;
2837
+ protected setDevtoolActiveState(active: boolean): void;
2838
+ private handleAdd;
2839
+ private handleRemove;
2840
+ private handleToggle;
2841
+ private handleSettingChange;
2842
+ private handleReorder;
2843
+ private handleMoveToEnd;
2844
+ private handleSelectLayout;
2845
+ private handleUpdateLayoutMinWidth;
2846
+ private handlePreviewResponsiveLayout;
2847
+ private handleCommitResponsiveLayout;
2848
+ private handleRenameInstance;
2849
+ private handleHUDOpen;
2850
+ private handleHUDClose;
2851
+ private handleLayoutPanelOpen;
2852
+ private handleLayoutPanelClose;
2853
+ private handleExport;
2854
+ private handleImport;
2855
+ private renderElement;
2856
+ private refreshHUD;
2857
+ private resolveActiveLayoutState;
2858
+ private syncSelectedLayoutToResolved;
2859
+ private destroyElement;
2860
+ private ensureTriggerLayer;
2861
+ private applyTriggerLayerState;
2862
+ private scheduleTriggerSync;
2863
+ private collectTriggerMeasurements;
2864
+ private measureTrigger;
2865
+ private applyTriggerMeasurement;
2866
+ protected getWorldHost(): HTMLElement;
2867
+ private getObjectDocY;
2868
+ private getViewportScrollLeft;
2869
+ private getViewportScrollTop;
2870
+ private resolveTriggerStackOffset;
2871
+ private registerBuiltInAdapters;
2872
+ private registerExternalAdapters;
2873
+ }
2874
+
2681
2875
  /**
2682
2876
  * Discriminated union of all UI field descriptors.
2683
2877
  * Each devtool module returns an array of these to describe its settings panel.
@@ -2804,6 +2998,364 @@ declare abstract class GridAdapter {
2804
2998
  protected createPath(d: string, stroke: string, opacity: number, strokeWidth?: number, fill?: string): SVGPathElement;
2805
2999
  }
2806
3000
 
3001
+ type StringDevtoolsOverlayId = string;
3002
+
3003
+ interface OverlayBaseMetrics {
3004
+ visible: boolean;
3005
+ contentX: number;
3006
+ contentY: number;
3007
+ width: number;
3008
+ height: number;
3009
+ isOffscreen: boolean;
3010
+ baseAnchorX: number;
3011
+ baseAnchorY: number;
3012
+ collisionOffset: number;
3013
+ }
3014
+ interface StringDevOverlayBadgeInit {
3015
+ targetId: string;
3016
+ selectorAttribute?: string;
3017
+ depth?: number;
3018
+ attributes?: Record<string, string | boolean | number | null | undefined>;
3019
+ }
3020
+ interface StringDevOverlayBadgeState {
3021
+ visible?: boolean;
3022
+ active?: boolean;
3023
+ disabled?: boolean;
3024
+ title?: string;
3025
+ html?: string;
3026
+ attributes?: Record<string, string | boolean | number | null | undefined>;
3027
+ }
3028
+ declare abstract class StringDevOverlayModule<TEntry = unknown, TMeasurement = unknown> extends StringDevModule {
3029
+ private _viewportLayer?;
3030
+ protected get viewportLayer(): StringDevViewportLayer;
3031
+ protected readonly entries: Map<string, TEntry>;
3032
+ protected readonly measurements: Map<string, TMeasurement>;
3033
+ protected enabled: boolean;
3034
+ protected needsMeasure: boolean;
3035
+ protected hasPendingMutate: boolean;
3036
+ private readonly onOverlayLayoutChangeBind;
3037
+ private get _overlayConfig();
3038
+ /** Override to provide the overlay ID for the anchor/collision system. */
3039
+ protected get overlayId(): StringDevtoolsOverlayId | null;
3040
+ /** Override to define your viewport layer name. Falls back to devtool.overlay.layerName. */
3041
+ protected get layerName(): string;
3042
+ /** Override to define your viewport layer z-index. Falls back to devtool.overlay.zIndex. */
3043
+ protected get layerZIndex(): number;
3044
+ /** Override to define the data-attribute added to the layer root. Falls back to devtool.overlay.layerAttribute. */
3045
+ protected get layerAttribute(): string;
3046
+ /** Override when an overlay module should start enabled before dock preferences apply. Falls back to devtool.overlay.defaultEnabled. */
3047
+ protected get defaultEnabled(): boolean;
3048
+ constructor(context: StringContext);
3049
+ onInit(): void;
3050
+ onObjectConnected(object: StringObject): void;
3051
+ onObjectDisconnected(object: StringObject): void;
3052
+ setEnabled(enabled: boolean): void;
3053
+ isEnabled(): boolean;
3054
+ protected getDevtoolActiveState(): boolean;
3055
+ protected setDevtoolActiveState(active: boolean): void;
3056
+ /** Create DOM and return state for the given element */
3057
+ protected abstract createOverlayEntry(object: StringObject): TEntry | null;
3058
+ /** Clean up DOM and listeners for the given element */
3059
+ protected abstract destroyOverlayEntry(entry: TEntry): void;
3060
+ /** Produce a custom measurement state utilizing the provided base metrics */
3061
+ protected abstract measureEntry(entry: TEntry, baseMetrics: OverlayBaseMetrics): TMeasurement;
3062
+ /** Render DOM efficiently utilizing `styleTxn` */
3063
+ protected abstract applyMeasurement(entry: TEntry, measurement: TMeasurement | undefined): void;
3064
+ /** Called when `setEnabled` state flips, allowing subclasses to show/hide specific entries */
3065
+ protected onEnabledChange(_enabled: boolean): void;
3066
+ onScroll(): void;
3067
+ onScrollMeasure(): void;
3068
+ onMutate(): void;
3069
+ onResize(): void;
3070
+ onDOMRebuild(): void;
3071
+ protected scheduleFullSync(): void;
3072
+ protected collectMeasurements(): void;
3073
+ protected flushMeasurements(): void;
3074
+ protected ensureLayer(): HTMLDivElement;
3075
+ protected applyEnabledState(): void;
3076
+ protected resolveOverlayTargetId(object: StringObject): string;
3077
+ protected resolveOverlayObjectDepth(element: HTMLElement): number;
3078
+ protected createOverlayBadge(init: StringDevOverlayBadgeInit): HTMLButtonElement;
3079
+ protected applyOverlayBadgeState(badge: HTMLElement, state: StringDevOverlayBadgeState): void;
3080
+ protected applyOverlayBadgePosition(badge: HTMLElement, measurement: {
3081
+ visible: boolean;
3082
+ docX: number;
3083
+ docY: number;
3084
+ } | undefined): void;
3085
+ protected computeBaseMetrics(entry: any): OverlayBaseMetrics;
3086
+ private getHiddenMetrics;
3087
+ protected getObjectDocY(object: StringObject): number;
3088
+ protected getViewportScrollLeft(): number;
3089
+ protected getViewportScrollTop(): number;
3090
+ destroy(): void;
3091
+ }
3092
+
3093
+ interface StringDevBadgeMeasurement {
3094
+ visible: boolean;
3095
+ docX: number;
3096
+ docY: number;
3097
+ }
3098
+ interface StringDevBadgeEntry<TExtra = undefined> {
3099
+ object: StringObject;
3100
+ targetId: string;
3101
+ badge: HTMLButtonElement;
3102
+ depth: number;
3103
+ extra: TExtra;
3104
+ cleanup: Array<() => void>;
3105
+ }
3106
+ 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
+ protected get badgeAttribute(): string;
3109
+ protected createOverlayEntry(object: StringObject): StringDevBadgeEntry<TExtra>;
3110
+ protected destroyOverlayEntry(entry: StringDevBadgeEntry<TExtra>): void;
3111
+ protected measureEntry(_entry: StringDevBadgeEntry<TExtra>, metrics: OverlayBaseMetrics): TMeasurement;
3112
+ protected applyMeasurement(entry: StringDevBadgeEntry<TExtra>, measurement: TMeasurement | undefined): void;
3113
+ protected onEnabledChange(_enabled: boolean): void;
3114
+ protected createBadgeExtra(_object: StringObject, _badge: HTMLButtonElement, _targetId: string, _depth: number): TExtra;
3115
+ protected destroyBadgeExtra(_entry: StringDevBadgeEntry<TExtra>): void;
3116
+ protected bindBadge(_entry: StringDevBadgeEntry<TExtra>): Array<() => void> | void;
3117
+ protected resolveBadgeDepth(object: StringObject): number;
3118
+ protected getInitialBadgeAttributes(_object: StringObject, _targetId: string, _depth: number): Record<string, string | boolean | number | null | undefined> | undefined;
3119
+ protected applyBadgeEnabledState(entry: StringDevBadgeEntry<TExtra>): void;
3120
+ protected renderBadge(entry: StringDevBadgeEntry<TExtra>): void;
3121
+ 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;
3235
+ overlayVisible: boolean;
3236
+ badgeVisible: boolean;
3237
+ 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> {
3263
+ static devtool: {
3264
+ id: string;
3265
+ label: string;
3266
+ icon: string;
3267
+ order: number;
3268
+ styles: string;
3269
+ overlay: {
3270
+ layerName: string;
3271
+ zIndex: number;
3272
+ layerAttribute: string;
3273
+ overlayId: string;
3274
+ };
3275
+ };
3276
+ 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;
3282
+ private hiddenMeasurement;
3283
+ private isEntryEnabled;
3284
+ private setEntryEnabled;
3285
+ private getViewportAnchorOffset;
3286
+ }
3287
+
3288
+ interface ProgressEntry {
3289
+ object: StringObject;
3290
+ chrome: HTMLDivElement;
3291
+ badge: HTMLButtonElement;
3292
+ panel: HTMLDivElement;
3293
+ title: HTMLSpanElement;
3294
+ slider: HTMLInputElement;
3295
+ easedValue: HTMLSpanElement;
3296
+ rawValue: HTMLSpanElement;
3297
+ rangeValue: HTMLSpanElement;
3298
+ onBadgeClick: (event: MouseEvent) => void;
3299
+ onSliderInput: () => void;
3300
+ }
3301
+ interface ProgressMeasurement {
3302
+ visible: boolean;
3303
+ docX: number;
3304
+ docY: number;
3305
+ targetLabel: string;
3306
+ progress: number;
3307
+ rawProgress: number;
3308
+ startPosition: number;
3309
+ endPosition: number;
3310
+ currentScroll: number;
3311
+ key: string;
3312
+ }
3313
+ declare class StringDevProgress extends StringDevOverlayModule<ProgressEntry, ProgressMeasurement> {
3314
+ static devtool: {
3315
+ id: string;
3316
+ label: string;
3317
+ icon: string;
3318
+ order: number;
3319
+ styles: string;
3320
+ overlay: {
3321
+ layerName: string;
3322
+ zIndex: number;
3323
+ layerAttribute: string;
3324
+ overlayId: string;
3325
+ };
3326
+ };
3327
+ private openEntryId;
3328
+ private readonly onDocumentPointerDownBind;
3329
+ constructor(context: any);
3330
+ onInit(): void;
3331
+ destroy(): void;
3332
+ protected createOverlayEntry(object: StringObject): ProgressEntry;
3333
+ protected destroyOverlayEntry(entry: ProgressEntry): void;
3334
+ protected measureEntry(entry: ProgressEntry, metrics: OverlayBaseMetrics): ProgressMeasurement;
3335
+ protected applyMeasurement(entry: ProgressEntry, measurement: ProgressMeasurement | undefined): void;
3336
+ protected onEnabledChange(enabled: boolean): void;
3337
+ private applyEntryEnabledState;
3338
+ private openPanel;
3339
+ private closePanel;
3340
+ private closeAllPanels;
3341
+ private onDocumentPointerDown;
3342
+ private resolveEntryRawProgress;
3343
+ private resolveEasedProgress;
3344
+ private setEntryProgressOverride;
3345
+ private clearEntryProgressOverride;
3346
+ private clearAllProgressOverrides;
3347
+ private applyObjectProgress;
3348
+ }
3349
+
3350
+ declare class StringDevIconRegistry {
3351
+ private static instance;
3352
+ private readonly icons;
3353
+ private constructor();
3354
+ static getInstance(): StringDevIconRegistry;
3355
+ register(id: string, svg: string): void;
3356
+ get(id: string): string | null;
3357
+ resolve(iconOrId: string): string;
3358
+ }
2807
3359
  declare function resolveDevtoolsIcon(iconOrId: string): string;
2808
3360
 
2809
3361
  type StringDevStyleTokens = Record<string, string>;
@@ -2911,22 +3463,6 @@ interface RowsLayoutGrid {
2911
3463
  }
2912
3464
  type RulersLayoutGrid = ColumnsLayoutGrid | RowsLayoutGrid;
2913
3465
 
2914
- interface StringDevtoolState {
2915
- active: boolean;
2916
- }
2917
- interface StringDevtoolDefinition {
2918
- id: string;
2919
- label: string;
2920
- icon: string;
2921
- order?: number;
2922
- getState: () => StringDevtoolState;
2923
- setActive: (active: boolean) => void;
2924
- subscribe?: (listener: (state: StringDevtoolState) => void) => () => void;
2925
- }
2926
- interface StringDevtoolProvider {
2927
- getDevtoolDefinition(): StringDevtoolDefinition | null;
2928
- }
2929
-
2930
3466
  interface ModuleBatchContext {
2931
3467
  module: StringModule;
2932
3468
  object: StringObject;
@@ -2959,12 +3495,16 @@ declare class DOMBatcher {
2959
3495
  }
2960
3496
 
2961
3497
  declare class StringTune {
3498
+ private static readonly DEVTOOLS_ACCESS_URL;
3499
+ private static readonly DEVTOOLS_LOG_PREFIX;
2962
3500
  /** Bound handler for the scroll start event */
2963
3501
  private onScrollStartBind;
2964
3502
  /** Bound handler for the scroll stop event */
2965
3503
  private onScrollStopBind;
2966
3504
  /** Bound handler for the scroll direction change event */
2967
3505
  private onDirectionChangeBind;
3506
+ /** Bound handler for scroll mode/config changes */
3507
+ private onScrollConfigChangeBind;
2968
3508
  /** Bound wheel event handler */
2969
3509
  private onWheelBind;
2970
3510
  /** Bound scroll event handler */
@@ -3019,6 +3559,12 @@ declare class StringTune {
3019
3559
  private devtoolsFpsLastSampleTime;
3020
3560
  private devtoolsFpsFrameCount;
3021
3561
  private observerContainerResize;
3562
+ private devtoolsAccessToken;
3563
+ private devtoolsAccessState;
3564
+ private devtoolsAccessRequestId;
3565
+ private pendingDevtoolUses;
3566
+ private hasStarted;
3567
+ private devtoolsAccessLastMessage;
3022
3568
  canRebuild: boolean;
3023
3569
  /**
3024
3570
  * Sets the scroll position manually.
@@ -3028,6 +3574,7 @@ declare class StringTune {
3028
3574
  * @param value The new scroll position in pixels.
3029
3575
  */
3030
3576
  set scrollPosition(value: number);
3577
+ set accessDevtoolToken(value: string);
3031
3578
  /**
3032
3579
  * Configures the container element(s) used for scroll tracking.
3033
3580
  * Accepts either the `Window` object or an `HTMLElement`.
@@ -3095,6 +3642,11 @@ declare class StringTune {
3095
3642
  * @param settings Optional settings specific to this module.
3096
3643
  */
3097
3644
  use(objectClass: typeof StringModule, settings?: any): void;
3645
+ private instantiateModule;
3646
+ private shouldDeferDevtoolModule;
3647
+ private validateDevtoolsAccess;
3648
+ private logDevtoolsAccess;
3649
+ private resolveDevtoolsAccessResponse;
3098
3650
  /**
3099
3651
  * Registers a new scroll mode (provider) to the system.
3100
3652
  * Allows integrating custom scroll implementations (e.g. Lenis, Locomotive).
@@ -3198,6 +3750,8 @@ declare class StringTune {
3198
3750
  * Triggers module scroll stop lifecycle hook.
3199
3751
  */
3200
3752
  private onDirectionChange;
3753
+ private onScrollConfigChange;
3754
+ private syncDebugScrollState;
3201
3755
  /**
3202
3756
  * Called when global or module settings are updated.
3203
3757
  * Notifies all managers and modules to re-read new settings.
@@ -3244,4 +3798,4 @@ declare class StringTune {
3244
3798
  destroy(): void;
3245
3799
  }
3246
3800
 
3247
- export { CursorReactiveModule, DOMBatcher, GridAdapter, type RulersLayoutGrid, type RulersTriggerAction, ScrollController, type ScrollMarkRule as ScrollTriggerRule, StringAnchor, type StringContext, StringCursor, StringData, StringDelayLerpTracker, 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 };
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 };