gclass-anims 1.0.0-beta.22.1 → 1.0.0-beta.23

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/AnimToggle.js CHANGED
@@ -1,7 +1,8 @@
1
1
  import initListeners from './Listeners.js'
2
2
  import { defaults, animations } from './Config.js'
3
3
  import { gsap } from 'gsap'
4
-
4
+ import { GSDevTools } from 'gsap/all'
5
+ gsap.registerPlugin(GSDevTools)
5
6
  // localStorage key controlling whether the GSAP animation system is mounted.
6
7
  const STORAGE_KEY = 'gclass-animations-enabled'
7
8
  // localStorage key for a forced reduced-motion override (see
@@ -181,6 +182,43 @@ const readBootTime = (els, fallback) => {
181
182
  return max ?? fallback
182
183
  }
183
184
 
185
+ /**
186
+ * Create GSDevTools UI styled like doc/ (Header.jsx:8 slate-800/50 ring + layout.js:85 slate-950).
187
+ * Accepts: gclassDev() | gclassDev("width:50%; bottom:30px") | gclassDev({width:"50%"}) | gclassDev({css:{}, minimal:true, animation:tl})
188
+ */
189
+ export function gclassDev(cssOrOpts){
190
+ const docCss = {
191
+ backgroundColor: "rgba(15,23,42,0.96)", // slate-900 ~ doc bg-slate-950/900
192
+ border: "1px solid rgba(51,65,85,0.8)", // ring-slate-700 Header.jsx:8
193
+ borderRadius: "12px", // rounded-xl
194
+ boxShadow: "0 0 0 1px rgba(51,65,85,0.5), 0 8px 32px rgba(0,0,0,0.45)",
195
+ backdropFilter: "blur(8px)",
196
+ color: "#e2e8f0", // slate-200
197
+ bottom: "16px",
198
+ width: "92%",
199
+ maxWidth: "860px",
200
+ left: "50%",
201
+ transform: "translateX(-50%)",
202
+ }
203
+ let opts = {}
204
+ let css = docCss
205
+ if (typeof cssOrOpts === "string") {
206
+ css = cssOrOpts // verbatim string: "width:50%; bottom:30px"
207
+ } else if (cssOrOpts && typeof cssOrOpts === "object") {
208
+ // {width:"50%", bottom:"30px"} shorthand OR {css:{}, animation, minimal,...} full opts
209
+ const hasFullOpts = "css" in cssOrOpts || "animation" in cssOrOpts || "container" in cssOrOpts || "minimal" in cssOrOpts || "id" in cssOrOpts
210
+ if (hasFullOpts) {
211
+ const { css: userCss, ...rest } = cssOrOpts
212
+ opts = rest
213
+ if (typeof userCss === "string") css = userCss
214
+ else if (userCss && typeof userCss === "object") css = { ...docCss, ...userCss }
215
+ } else {
216
+ css = { ...docCss, ...cssOrOpts }
217
+ }
218
+ }
219
+ return GSDevTools.create({ css, ...opts })
220
+ }
221
+
184
222
  // Boots the GSAP animation system unless animations are disabled (stored "off"
185
223
  // or reduced-motion fallback with no explicit choice). Idempotent: calling it
186
224
  // again tears down any previous run first.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,12 @@
2
2
 
3
3
  All notable changes to `gclass-anims` will be documented in this file.
4
4
 
5
+ ## [1.0.0-beta.23] - 2026-09-09
6
+ - Added `gclassDev()` helper — `AnimToggle.js:185` `gclassDev(cssOrOpts)` wraps `GSDevTools.create()` with doc-styled defaults (`slate-900` `rgba(15,23,42,0.96)`, `slate-700` border, `rounded-xl`, `backdrop-blur`). Accepts `gclassDev()` (defaults), `gclassDev("width:50%; bottom:30px")` (CSS string), `gclassDev({width:"50%"})` (style object shorthand), or `gclassDev({css, animation, minimal, ...})` (full `GSDevTools` opts). Registers `GSDevTools` via `gsap.registerPlugin(GSDevTools)` (`AnimToggle.js:4`), re-exported from `index.js:1` and typed in `index.d.ts:35`.
7
+
8
+ ## [1.0.0-beta.22.2] - 2026-09-06
9
+ - Fixed `m:order` (and any `bp:order` / `bp:priority-*` / `bp:ease-*` / `bp:time-*`) disabling the entire `scroll` animation on smaller screens — `Listeners.js:1200,1232,1262` previously wrapped `setupScroll` / `playText` scroll variants in generic `runWithBreakpoint(el, ...)` which gated on *any* `bp:*` class on the element (so `m:order` gated `scroll`). Now uses per-animation `qAllAllVariants` + `runWithBreakpointForSel` (`".scroll"`, `".scroll-progress"`, `tSel`) so only a true `m:scroll` / `m:spawn-*` gates its own animation; unrelated modifiers like `m:order` only affect `hasGClass("order")` / `readTiming` (stagger) and `spawn-*` + `scroll` still play on all sizes (without stagger on <m). Keeps live `gsap.matchMedia` handling for true breakpoint-gated scroll. Reverts `HowWorkSection.jsx` workaround from `m:order` back to plain `order` for the default staggered landing.
10
+
5
11
  ## [1.0.0-beta.22.1] - 2026-09-06
6
12
  - Fixed `.order` stagger grouping bug — `Listeners.js:76` `wrapQAll` now preserves DOM order via `body *` filter + `elementMatchesSel` (was `Set([...spawn-up], [...spawn-down])` grouping by type, now top-to-bottom as `qAll` does). Fixes `doc` `spawn` and landing `order` appearing all over.
7
13
  - No API change from `beta.22`.
package/Listeners.js CHANGED
@@ -1197,7 +1197,18 @@ export default function initListeners(root = document, throttlePerFrame) {
1197
1197
  })
1198
1198
  scrollTriggers.push(st)
1199
1199
  }
1200
- qAll("body *").filter(el => hasGClass(el, "scroll") || hasGClass(el, "scroll-progress")).forEach(el => runWithBreakpoint(el, () => setupScroll(el)))
1200
+ // scroll / scroll-progress are breakpoint-gated per-animation, not per-element generic
1201
+ // (m:order must not disable a plain `scroll` + `spawn-*` on <m)
1202
+ const scrollSel = ".scroll"
1203
+ const progressSel = ".scroll-progress"
1204
+ qAllAllVariants(scrollSel).forEach(el => runWithBreakpointForSel(el, scrollSel, () => {
1205
+ if (!hasGClass(el, "scroll")) return
1206
+ setupScroll(el)
1207
+ }))
1208
+ qAllAllVariants(progressSel).forEach(el => runWithBreakpointForSel(el, progressSel, () => {
1209
+ if (!hasGClass(el, "scroll-progress")) return
1210
+ setupScroll(el)
1211
+ }))
1201
1212
 
1202
1213
  // SplitText scroll variants: `.spawn-text-<spawn>.scroll` plays the per-part
1203
1214
  // tween when the element enters the viewport and reverses on exit.
@@ -1205,8 +1216,9 @@ export default function initListeners(root = document, throttlePerFrame) {
1205
1216
  if (isTypewriter || text === false) return
1206
1217
  const tSel = "." + TEXT_PREFIX + sel.slice(1)
1207
1218
 
1208
- qAll("body *").filter(el => elementMatchesSel(el, tSel) && hasGClass(el, "scroll") && !hasGClass(el, "scroll-progress")).forEach((el) => {
1219
+ qAllAllVariants(tSel).filter(el => hasGClass(el, "scroll") && !hasGClass(el, "scroll-progress")).forEach((el) => {
1209
1220
  const run = () => {
1221
+ if (!elementMatchesSel(el, tSel)) return
1210
1222
  if (isReduced(el)) return
1211
1223
  const { delay, duration } = readTiming(el)
1212
1224
  const ease = getEase(el)
@@ -1229,10 +1241,10 @@ export default function initListeners(root = document, throttlePerFrame) {
1229
1241
  onLeave: reverseToStart,
1230
1242
  onLeaveBack: reverseToStart,
1231
1243
  }))
1232
- }; runWithBreakpoint(el, run)
1244
+ }; runWithBreakpointForSel(el, tSel, run)
1233
1245
  })
1234
1246
 
1235
- qAll("body *").filter(el => elementMatchesSel(el, tSel) && hasGClass(el, "scroll-progress")).forEach((el) => {
1247
+ qAllAllVariants(tSel).filter(el => hasGClass(el, "scroll-progress")).forEach((el) => {
1236
1248
  const run = () => {
1237
1249
  if (isReduced(el)) return
1238
1250
  const ease = getEase(el)
@@ -1259,7 +1271,7 @@ export default function initListeners(root = document, throttlePerFrame) {
1259
1271
  tl.fromTo(parts, { ...(reverse ? to : from), ...rnd },
1260
1272
  { ...(rnd ? randomEnds(Object.keys(rnd)) : null), ...(reverse ? from : to), ease })
1261
1273
  scrollTriggers.push(tl.scrollTrigger)
1262
- }; runWithBreakpoint(el, run)
1274
+ }; runWithBreakpointForSel(el, tSel, run)
1263
1275
  })
1264
1276
  })
1265
1277
  ScrollTrigger.refresh()
package/dist/gclass.cjs CHANGED
@@ -1402,23 +1402,6 @@ function initListeners(root = document, throttlePerFrame) {
1402
1402
  for (const bp of bpNames) if (el.classList.contains(`${bp}:${base}`)) return bp;
1403
1403
  return null;
1404
1404
  };
1405
- const getElGateBp = (el) => {
1406
- for (const c of el.classList) {
1407
- const m = c.match(bpPrefixRE);
1408
- if (m) return m[1];
1409
- }
1410
- return null;
1411
- };
1412
- const runWithBreakpoint = (el, fn) => {
1413
- const bp = getElGateBp(el);
1414
- if (!bp) {
1415
- fn();
1416
- return;
1417
- }
1418
- const mq = mqForBp(bp);
1419
- const ret = mm.add(mq, fn);
1420
- breakpointContexts.push(ret);
1421
- };
1422
1405
  const runWithBreakpointForSel = (el, sel, fn) => {
1423
1406
  const bp = getGateBpForSel(el, sel);
1424
1407
  if (!bp) {
@@ -2196,12 +2179,22 @@ function initListeners(root = document, throttlePerFrame) {
2196
2179
  });
2197
2180
  scrollTriggers.push(st);
2198
2181
  };
2199
- qAll("body *").filter((el) => hasGClass(el, "scroll") || hasGClass(el, "scroll-progress")).forEach((el) => runWithBreakpoint(el, () => setupScroll(el)));
2182
+ const scrollSel = ".scroll";
2183
+ const progressSel = ".scroll-progress";
2184
+ qAllAllVariants(scrollSel).forEach((el) => runWithBreakpointForSel(el, scrollSel, () => {
2185
+ if (!hasGClass(el, "scroll")) return;
2186
+ setupScroll(el);
2187
+ }));
2188
+ qAllAllVariants(progressSel).forEach((el) => runWithBreakpointForSel(el, progressSel, () => {
2189
+ if (!hasGClass(el, "scroll-progress")) return;
2190
+ setupScroll(el);
2191
+ }));
2200
2192
  spawnConfigs.forEach(({ sel, from, typewriter: isTypewriter, text }) => {
2201
2193
  if (isTypewriter || text === false) return;
2202
2194
  const tSel = ".spawn-text-" + sel.slice(1);
2203
- qAll("body *").filter((el) => elementMatchesSel(el, tSel) && hasGClass(el, "scroll") && !hasGClass(el, "scroll-progress")).forEach((el) => {
2195
+ qAllAllVariants(tSel).filter((el) => hasGClass(el, "scroll") && !hasGClass(el, "scroll-progress")).forEach((el) => {
2204
2196
  const run = () => {
2197
+ if (!elementMatchesSel(el, tSel)) return;
2205
2198
  if (isReduced(el)) return;
2206
2199
  const { delay, duration } = readTiming(el);
2207
2200
  const ease = getEase(el);
@@ -2229,9 +2222,9 @@ function initListeners(root = document, throttlePerFrame) {
2229
2222
  onLeaveBack: reverseToStart
2230
2223
  }));
2231
2224
  };
2232
- runWithBreakpoint(el, run);
2225
+ runWithBreakpointForSel(el, tSel, run);
2233
2226
  });
2234
- qAll("body *").filter((el) => elementMatchesSel(el, tSel) && hasGClass(el, "scroll-progress")).forEach((el) => {
2227
+ qAllAllVariants(tSel).filter((el) => hasGClass(el, "scroll-progress")).forEach((el) => {
2235
2228
  const run = () => {
2236
2229
  if (isReduced(el)) return;
2237
2230
  const ease = getEase(el);
@@ -2260,7 +2253,7 @@ function initListeners(root = document, throttlePerFrame) {
2260
2253
  });
2261
2254
  scrollTriggers.push(tl.scrollTrigger);
2262
2255
  };
2263
- runWithBreakpoint(el, run);
2256
+ runWithBreakpointForSel(el, tSel, run);
2264
2257
  });
2265
2258
  });
2266
2259
  gsap_all.ScrollTrigger.refresh();
@@ -2954,6 +2947,7 @@ function initListeners(root = document, throttlePerFrame) {
2954
2947
  }
2955
2948
  //#endregion
2956
2949
  //#region AnimToggle.js
2950
+ gsap.gsap.registerPlugin(gsap_all.GSDevTools);
2957
2951
  var STORAGE_KEY = "gclass-animations-enabled";
2958
2952
  var REDUCED_KEY = "gclass-reduced-motion";
2959
2953
  var reducedMotionQuery = typeof window !== "undefined" ? window.matchMedia("(prefers-reduced-motion: reduce)") : null;
@@ -3086,6 +3080,46 @@ var readBootTime = (els, fallback) => {
3086
3080
  }
3087
3081
  return max ?? fallback;
3088
3082
  };
3083
+ /**
3084
+ * Create GSDevTools UI styled like doc/ (Header.jsx:8 slate-800/50 ring + layout.js:85 slate-950).
3085
+ * Accepts: gclassDev() | gclassDev("width:50%; bottom:30px") | gclassDev({width:"50%"}) | gclassDev({css:{}, minimal:true, animation:tl})
3086
+ */
3087
+ function gclassDev(cssOrOpts) {
3088
+ const docCss = {
3089
+ backgroundColor: "rgba(15,23,42,0.96)",
3090
+ border: "1px solid rgba(51,65,85,0.8)",
3091
+ borderRadius: "12px",
3092
+ boxShadow: "0 0 0 1px rgba(51,65,85,0.5), 0 8px 32px rgba(0,0,0,0.45)",
3093
+ backdropFilter: "blur(8px)",
3094
+ color: "#e2e8f0",
3095
+ bottom: "16px",
3096
+ width: "92%",
3097
+ maxWidth: "860px",
3098
+ left: "50%",
3099
+ transform: "translateX(-50%)"
3100
+ };
3101
+ let opts = {};
3102
+ let css = docCss;
3103
+ if (typeof cssOrOpts === "string") css = cssOrOpts;
3104
+ else if (cssOrOpts && typeof cssOrOpts === "object") {
3105
+ if ("css" in cssOrOpts || "animation" in cssOrOpts || "container" in cssOrOpts || "minimal" in cssOrOpts || "id" in cssOrOpts) {
3106
+ const { css: userCss, ...rest } = cssOrOpts;
3107
+ opts = rest;
3108
+ if (typeof userCss === "string") css = userCss;
3109
+ else if (userCss && typeof userCss === "object") css = {
3110
+ ...docCss,
3111
+ ...userCss
3112
+ };
3113
+ } else css = {
3114
+ ...docCss,
3115
+ ...cssOrOpts
3116
+ };
3117
+ }
3118
+ return gsap_all.GSDevTools.create({
3119
+ css,
3120
+ ...opts
3121
+ });
3122
+ }
3089
3123
  function initAnimations(throttlePerFrame, fps) {
3090
3124
  let effThrottle = currentThrottle;
3091
3125
  let effFps = currentFps;
@@ -3223,6 +3257,7 @@ exports.expandV = expandV;
3223
3257
  exports.expandmove = expandmove;
3224
3258
  exports.finalOpacity = finalOpacity;
3225
3259
  exports.flip = flip;
3260
+ exports.gclassDev = gclassDev;
3226
3261
  exports.gclassOpts = gclassOpts;
3227
3262
  exports.getGClassConfig = getGClassConfig;
3228
3263
  exports.hover = hover;
@@ -1,5 +1,5 @@
1
1
  import { gsap } from "gsap";
2
- import { DrawSVGPlugin, Flip, MotionPathPlugin, ScrambleTextPlugin, ScrollTrigger, SplitText, TextPlugin } from "gsap/all";
2
+ import { DrawSVGPlugin, Flip, GSDevTools, MotionPathPlugin, ScrambleTextPlugin, ScrollTrigger, SplitText, TextPlugin } from "gsap/all";
3
3
  //#region Config.js
4
4
  var defaults = {
5
5
  orderDivide: 5,
@@ -1401,23 +1401,6 @@ function initListeners(root = document, throttlePerFrame) {
1401
1401
  for (const bp of bpNames) if (el.classList.contains(`${bp}:${base}`)) return bp;
1402
1402
  return null;
1403
1403
  };
1404
- const getElGateBp = (el) => {
1405
- for (const c of el.classList) {
1406
- const m = c.match(bpPrefixRE);
1407
- if (m) return m[1];
1408
- }
1409
- return null;
1410
- };
1411
- const runWithBreakpoint = (el, fn) => {
1412
- const bp = getElGateBp(el);
1413
- if (!bp) {
1414
- fn();
1415
- return;
1416
- }
1417
- const mq = mqForBp(bp);
1418
- const ret = mm.add(mq, fn);
1419
- breakpointContexts.push(ret);
1420
- };
1421
1404
  const runWithBreakpointForSel = (el, sel, fn) => {
1422
1405
  const bp = getGateBpForSel(el, sel);
1423
1406
  if (!bp) {
@@ -2195,12 +2178,22 @@ function initListeners(root = document, throttlePerFrame) {
2195
2178
  });
2196
2179
  scrollTriggers.push(st);
2197
2180
  };
2198
- qAll("body *").filter((el) => hasGClass(el, "scroll") || hasGClass(el, "scroll-progress")).forEach((el) => runWithBreakpoint(el, () => setupScroll(el)));
2181
+ const scrollSel = ".scroll";
2182
+ const progressSel = ".scroll-progress";
2183
+ qAllAllVariants(scrollSel).forEach((el) => runWithBreakpointForSel(el, scrollSel, () => {
2184
+ if (!hasGClass(el, "scroll")) return;
2185
+ setupScroll(el);
2186
+ }));
2187
+ qAllAllVariants(progressSel).forEach((el) => runWithBreakpointForSel(el, progressSel, () => {
2188
+ if (!hasGClass(el, "scroll-progress")) return;
2189
+ setupScroll(el);
2190
+ }));
2199
2191
  spawnConfigs.forEach(({ sel, from, typewriter: isTypewriter, text }) => {
2200
2192
  if (isTypewriter || text === false) return;
2201
2193
  const tSel = ".spawn-text-" + sel.slice(1);
2202
- qAll("body *").filter((el) => elementMatchesSel(el, tSel) && hasGClass(el, "scroll") && !hasGClass(el, "scroll-progress")).forEach((el) => {
2194
+ qAllAllVariants(tSel).filter((el) => hasGClass(el, "scroll") && !hasGClass(el, "scroll-progress")).forEach((el) => {
2203
2195
  const run = () => {
2196
+ if (!elementMatchesSel(el, tSel)) return;
2204
2197
  if (isReduced(el)) return;
2205
2198
  const { delay, duration } = readTiming(el);
2206
2199
  const ease = getEase(el);
@@ -2228,9 +2221,9 @@ function initListeners(root = document, throttlePerFrame) {
2228
2221
  onLeaveBack: reverseToStart
2229
2222
  }));
2230
2223
  };
2231
- runWithBreakpoint(el, run);
2224
+ runWithBreakpointForSel(el, tSel, run);
2232
2225
  });
2233
- qAll("body *").filter((el) => elementMatchesSel(el, tSel) && hasGClass(el, "scroll-progress")).forEach((el) => {
2226
+ qAllAllVariants(tSel).filter((el) => hasGClass(el, "scroll-progress")).forEach((el) => {
2234
2227
  const run = () => {
2235
2228
  if (isReduced(el)) return;
2236
2229
  const ease = getEase(el);
@@ -2259,7 +2252,7 @@ function initListeners(root = document, throttlePerFrame) {
2259
2252
  });
2260
2253
  scrollTriggers.push(tl.scrollTrigger);
2261
2254
  };
2262
- runWithBreakpoint(el, run);
2255
+ runWithBreakpointForSel(el, tSel, run);
2263
2256
  });
2264
2257
  });
2265
2258
  ScrollTrigger.refresh();
@@ -2953,6 +2946,7 @@ function initListeners(root = document, throttlePerFrame) {
2953
2946
  }
2954
2947
  //#endregion
2955
2948
  //#region AnimToggle.js
2949
+ gsap.registerPlugin(GSDevTools);
2956
2950
  var STORAGE_KEY = "gclass-animations-enabled";
2957
2951
  var REDUCED_KEY = "gclass-reduced-motion";
2958
2952
  var reducedMotionQuery = typeof window !== "undefined" ? window.matchMedia("(prefers-reduced-motion: reduce)") : null;
@@ -3085,6 +3079,46 @@ var readBootTime = (els, fallback) => {
3085
3079
  }
3086
3080
  return max ?? fallback;
3087
3081
  };
3082
+ /**
3083
+ * Create GSDevTools UI styled like doc/ (Header.jsx:8 slate-800/50 ring + layout.js:85 slate-950).
3084
+ * Accepts: gclassDev() | gclassDev("width:50%; bottom:30px") | gclassDev({width:"50%"}) | gclassDev({css:{}, minimal:true, animation:tl})
3085
+ */
3086
+ function gclassDev(cssOrOpts) {
3087
+ const docCss = {
3088
+ backgroundColor: "rgba(15,23,42,0.96)",
3089
+ border: "1px solid rgba(51,65,85,0.8)",
3090
+ borderRadius: "12px",
3091
+ boxShadow: "0 0 0 1px rgba(51,65,85,0.5), 0 8px 32px rgba(0,0,0,0.45)",
3092
+ backdropFilter: "blur(8px)",
3093
+ color: "#e2e8f0",
3094
+ bottom: "16px",
3095
+ width: "92%",
3096
+ maxWidth: "860px",
3097
+ left: "50%",
3098
+ transform: "translateX(-50%)"
3099
+ };
3100
+ let opts = {};
3101
+ let css = docCss;
3102
+ if (typeof cssOrOpts === "string") css = cssOrOpts;
3103
+ else if (cssOrOpts && typeof cssOrOpts === "object") {
3104
+ if ("css" in cssOrOpts || "animation" in cssOrOpts || "container" in cssOrOpts || "minimal" in cssOrOpts || "id" in cssOrOpts) {
3105
+ const { css: userCss, ...rest } = cssOrOpts;
3106
+ opts = rest;
3107
+ if (typeof userCss === "string") css = userCss;
3108
+ else if (userCss && typeof userCss === "object") css = {
3109
+ ...docCss,
3110
+ ...userCss
3111
+ };
3112
+ } else css = {
3113
+ ...docCss,
3114
+ ...cssOrOpts
3115
+ };
3116
+ }
3117
+ return GSDevTools.create({
3118
+ css,
3119
+ ...opts
3120
+ });
3121
+ }
3088
3122
  function initAnimations(throttlePerFrame, fps) {
3089
3123
  let effThrottle = currentThrottle;
3090
3124
  let effFps = currentFps;
@@ -3196,4 +3230,4 @@ function initAnimations(throttlePerFrame, fps) {
3196
3230
  cleanup = initListeners(document, effThrottle);
3197
3231
  }
3198
3232
  //#endregion
3199
- export { SpawnH, SpawnV, animatecss, animations, bell, bounce, countTargetVars, countUp, curtainHorizontal, curtainVertical, customAnims, defaults, disableReducedMotion, drawsvg, drawsvgSplit, enableReducedMotion, expandA, expandDown, expandH, expandLeft, expandRight, expandUp, expandV, expandmove, finalOpacity, flip, gclassOpts, getGClassConfig, hover, initAnimations, initListeners, magnet, magnet3d, marquee, normalize, pulse, radiate, registerComplete, reset, scramble, scrambleSegments, scrambleVars, shake, spawnBlur, spawnClipReveal, spawnFade, spawnSpinCCW, spawnSpinCW, spawnXDown, spawnXUp, spawnYLeft, spawnYRight, spinCCW, spinCW, splitPaths, stashText, subscribeGClassConfig, toggleAnimations, typewriter, verticalmove };
3233
+ export { SpawnH, SpawnV, animatecss, animations, bell, bounce, countTargetVars, countUp, curtainHorizontal, curtainVertical, customAnims, defaults, disableReducedMotion, drawsvg, drawsvgSplit, enableReducedMotion, expandA, expandDown, expandH, expandLeft, expandRight, expandUp, expandV, expandmove, finalOpacity, flip, gclassDev, gclassOpts, getGClassConfig, hover, initAnimations, initListeners, magnet, magnet3d, marquee, normalize, pulse, radiate, registerComplete, reset, scramble, scrambleSegments, scrambleVars, shake, spawnBlur, spawnClipReveal, spawnFade, spawnSpinCCW, spawnSpinCW, spawnXDown, spawnXUp, spawnYLeft, spawnYRight, spinCCW, spinCW, splitPaths, stashText, subscribeGClassConfig, toggleAnimations, typewriter, verticalmove };
package/index.d.ts CHANGED
@@ -32,6 +32,11 @@ export function toggleAnimations(): void
32
32
  export function enableReducedMotion(): void
33
33
  /** Clear the forced reduced-motion override and reload. */
34
34
  export function disableReducedMotion(): void
35
+ /**
36
+ * Create GSDevTools UI styled like doc/ (slate-900 / slate-800 ring).
37
+ * Accepts: gclassDev() | gclassDev("width:50%; bottom:30px") | gclassDev({width:"50%"}) | gclassDev({css, animation, minimal, ...GSDevTools opts})
38
+ */
39
+ export function gclassDev(cssOrOpts?: string | Record<string, string> | Record<string, any>): any
35
40
 
36
41
  // --- Listeners -------------------------------------------------------------
37
42
 
package/index.js CHANGED
@@ -1,4 +1,4 @@
1
- export { initAnimations, gclassOpts, getGClassConfig, subscribeGClassConfig, toggleAnimations, enableReducedMotion, disableReducedMotion } from './AnimToggle.js'
1
+ export { initAnimations, gclassOpts, getGClassConfig, subscribeGClassConfig, toggleAnimations, enableReducedMotion, disableReducedMotion , gclassDev} from './AnimToggle.js'
2
2
  export { default as initListeners, registerComplete } from './Listeners.js'
3
3
  export { customAnims } from './CustomAnims.js'
4
4
  export { defaults, animations, normalize } from './Config.js'
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gclass-anims",
3
- "version": "1.0.0-beta.22.1",
3
+ "version": "1.0.0-beta.23",
4
4
  "description": "A Tailwind-style utility layer on top of GSAP. Framework-agnostic - works in vanilla JS, React, Vue, Svelte, or any bundler.",
5
5
  "type": "module",
6
6
  "main": "./dist/gclass.cjs",