@foldkit/devtools 0.124.0 → 0.126.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/overlay.d.ts CHANGED
@@ -31,10 +31,11 @@ export declare const LockScroll: Command.CommandDefinitionNoArgs<"LockScroll", E
31
31
  export declare const UnlockScroll: Command.CommandDefinitionNoArgs<"UnlockScroll", Effect.Effect<{
32
32
  readonly _tag: "UnlockedScroll";
33
33
  }, never, never>>;
34
- export declare const PersistFlatten: Command.CommandDefinitionWithArgs<"PersistFlatten", {
34
+ export declare const PersistDevToolsState: Command.CommandDefinitionWithArgs<"PersistDevToolsState", {
35
+ isOpen: S.Boolean;
35
36
  isFlattened: S.Boolean;
36
37
  }, Effect.Effect<{
37
- readonly _tag: "CompletedPersistFlatten";
38
+ readonly _tag: "CompletedPersistDevToolsState";
38
39
  }, never, never>>;
39
40
  export declare const JumpToAndInspect: Command.CommandDefinitionWithArgs<"JumpToAndInspect", {
40
41
  index: S.Number;
@@ -1 +1 @@
1
- {"version":3,"file":"overlay.d.ts","sourceRoot":"","sources":["../src/overlay.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,OAAO,EACP,MAAM,EAEN,OAAO,EAGP,MAAM,EAKN,MAAM,IAAI,CAAC,EAGX,eAAe,EAEhB,MAAM,QAAQ,CAAA;AAEf,OAAO,KAAK,OAAO,MAAM,iBAAiB,CAAA;AAC1C,OAAO,EACL,KAAK,aAAa,EAElB,KAAK,aAAa,EAGlB,KAAK,WAAW,EAChB,KAAK,UAAU,EAKhB,MAAM,uBAAuB,CAAA;AAW9B,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;;oFAyDnC,CAAC;;;;;;;;;;;;;;;;;AAyQnC,cAAM,YAAa,SAAQ,iBAE1B;CAAG;;AAEJ,cAAM,iBAAkB,SAAQ,sBAGC;CAAG;AAEpC,eAAO,MAAM,UAAU;;iBAGsB,CAAA;AAE7C,eAAO,MAAM,YAAY;;iBAGwB,CAAA;AAajD,eAAO,MAAM,cAAc;;;;iBAc1B,CAAA;AAuBD,eAAO,MAAM,gBAAgB;;;;;;;;wBAU5B,CAAA;AAED,eAAO,MAAM,YAAY;;;;;;;;wBAIqB,CAAA;AAE9C,eAAO,MAAM,aAAa;;;;;;wBASzB,CAAA;AAED,eAAO,MAAM,MAAM;;wBASlB,CAAA;AAED,eAAO,MAAM,KAAK;;wBASjB,CAAA;AAED,eAAO,MAAM,WAAW;;6BAYvB,CAAA;AAy6DD,eAAO,MAAM,aAAa,GACxB,OAAO,aAAa,EACpB,UAAU,gBAAgB,EAC1B,MAAM,YAAY,EAClB,aAAa,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,6DAgFhC,CAAA"}
1
+ {"version":3,"file":"overlay.d.ts","sourceRoot":"","sources":["../src/overlay.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,OAAO,EACP,MAAM,EAEN,OAAO,EAGP,MAAM,EAKN,MAAM,IAAI,CAAC,EAGX,eAAe,EAEhB,MAAM,QAAQ,CAAA;AAEf,OAAO,KAAK,OAAO,MAAM,iBAAiB,CAAA;AAC1C,OAAO,EACL,KAAK,aAAa,EAElB,KAAK,aAAa,EAGlB,KAAK,WAAW,EAChB,KAAK,UAAU,EAKhB,MAAM,uBAAuB,CAAA;AAW9B,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;;oFAyDnC,CAAC;;;;;;;;;;;;;;;;;AAyQnC,cAAM,YAAa,SAAQ,iBAE1B;CAAG;;AAEJ,cAAM,iBAAkB,SAAQ,sBAGC;CAAG;AAEpC,eAAO,MAAM,UAAU;;iBAGsB,CAAA;AAE7C,eAAO,MAAM,YAAY;;iBAGwB,CAAA;AAgCjD,eAAO,MAAM,oBAAoB;;;;;iBAiBhC,CAAA;AAuBD,eAAO,MAAM,gBAAgB;;;;;;;;wBAU5B,CAAA;AAED,eAAO,MAAM,YAAY;;;;;;;;wBAIqB,CAAA;AAE9C,eAAO,MAAM,aAAa;;;;;;wBASzB,CAAA;AAED,eAAO,MAAM,MAAM;;wBASlB,CAAA;AAED,eAAO,MAAM,KAAK;;wBASjB,CAAA;AAED,eAAO,MAAM,WAAW;;6BAYvB,CAAA;AA66DD,eAAO,MAAM,aAAa,GACxB,OAAO,aAAa,EACpB,UAAU,gBAAgB,EAC1B,MAAM,YAAY,EAClB,aAAa,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,6DAgFhC,CAAA"}
package/dist/overlay.js CHANGED
@@ -101,6 +101,7 @@ const Model = S.Struct({
101
101
  scrubberSlider: S.suspend(() => Slider.Model),
102
102
  });
103
103
  const Flags = S.Struct({
104
+ isOpen: S.Boolean,
104
105
  isMobile: S.Boolean,
105
106
  isFlattened: S.Boolean,
106
107
  entries: S.Array(DisplayEntry),
@@ -116,7 +117,7 @@ const ClickedSettingsToggle = m('ClickedSettingsToggle');
116
117
  const GotFlattenSwitchMessage = m('GotFlattenSwitchMessage', {
117
118
  message: Switch.Message,
118
119
  });
119
- const CompletedPersistFlatten = m('CompletedPersistFlatten');
120
+ const CompletedPersistDevToolsState = m('CompletedPersistDevToolsState');
120
121
  const ClickedRow = m('ClickedRow', { index: S.Number });
121
122
  const ClickedResume = m('ClickedResume');
122
123
  const ClickedClear = m('ClickedClear');
@@ -161,7 +162,7 @@ const Message = S.Union([
161
162
  ClickedToggle,
162
163
  ClickedSettingsToggle,
163
164
  GotFlattenSwitchMessage,
164
- CompletedPersistFlatten,
165
+ CompletedPersistDevToolsState,
165
166
  ClickedRow,
166
167
  ClickedResume,
167
168
  ClickedClear,
@@ -189,8 +190,7 @@ const MOBILE_BREAKPOINT_QUERY = `(max-width: ${MOBILE_BREAKPOINT}px)`;
189
190
  const TREE_INDENT_PX = 12;
190
191
  const MAX_PREVIEW_KEYS = 3;
191
192
  const ALL_MESSAGES_VALUE = '';
192
- const FLATTEN_STORAGE_KEY = 'foldkit-devtools-flatten';
193
- const BooleanJsonString = S.fromJsonString(S.Boolean);
193
+ const DEVTOOLS_STORAGE_KEY = 'foldkit-devtools';
194
194
  const NO_COMMANDS = [];
195
195
  const NO_MOUNTS = [];
196
196
  const formatTimeDelta = (deltaMs) => M.value(deltaMs).pipe(M.when(0, () => '0ms'), M.when(Number_.isLessThan(MILLIS_PER_SECOND), ms => `+${Math.round(ms)}ms`), M.orElse(ms => `+${(ms / MILLIS_PER_SECOND).toFixed(1)}s`));
@@ -251,17 +251,31 @@ class ShadowRootService extends Context.Service()('foldkit/DevToolsShadowRoot')
251
251
  }
252
252
  export const LockScroll = Command.define('LockScroll', LockedScroll)(lockScroll.pipe(Effect.as(LockedScroll())));
253
253
  export const UnlockScroll = Command.define('UnlockScroll', UnlockedScroll)(unlockScroll.pipe(Effect.as(UnlockedScroll())));
254
- const readPersistedFlatten = Effect.gen(function* () {
254
+ const maybeToggleScrollLock = (isEnabled, shouldLock) => OptionExt.when(isEnabled, shouldLock ? LockScroll() : UnlockScroll());
255
+ const maybeLockScroll = (isOpen, isMobile) => OptionExt.when(isOpen && isMobile, LockScroll());
256
+ const DevToolsPersistedState = S.Struct({
257
+ isOpen: S.Boolean.pipe(S.withDecodingDefault(Effect.succeed(false))),
258
+ isFlattened: S.Boolean.pipe(S.withDecodingDefault(Effect.succeed(false))),
259
+ });
260
+ const DevToolsPersistedStateJson = S.fromJsonString(DevToolsPersistedState);
261
+ const DEFAULT_PERSISTED_STATE = {
262
+ isOpen: false,
263
+ isFlattened: false,
264
+ };
265
+ const readPersistedState = Effect.gen(function* () {
255
266
  const store = yield* KeyValueStore.KeyValueStore;
256
- const json = yield* Effect.fromOption(Option.fromNullishOr(yield* store.get(FLATTEN_STORAGE_KEY)));
257
- return yield* S.decodeEffect(BooleanJsonString)(json);
258
- }).pipe(Effect.catch(() => Effect.succeed(false)), Effect.provide(BrowserKeyValueStore.layerLocalStorage));
259
- export const PersistFlatten = Command.define('PersistFlatten', { isFlattened: S.Boolean }, CompletedPersistFlatten)(({ isFlattened }) => Effect.gen(function* () {
267
+ const json = yield* Effect.fromOption(Option.fromNullishOr(yield* store.get(DEVTOOLS_STORAGE_KEY)));
268
+ return yield* S.decodeEffect(DevToolsPersistedStateJson)(json);
269
+ }).pipe(Effect.catch(() => Effect.succeed(DEFAULT_PERSISTED_STATE)), Effect.provide(BrowserKeyValueStore.layerLocalStorage));
270
+ export const PersistDevToolsState = Command.define('PersistDevToolsState', { isOpen: S.Boolean, isFlattened: S.Boolean }, CompletedPersistDevToolsState)(({ isOpen, isFlattened }) => Effect.gen(function* () {
260
271
  const store = yield* KeyValueStore.KeyValueStore;
261
- const json = yield* S.encodeEffect(BooleanJsonString)(isFlattened);
262
- yield* store.set(FLATTEN_STORAGE_KEY, json);
263
- return CompletedPersistFlatten();
264
- }).pipe(Effect.catch(() => Effect.succeed(CompletedPersistFlatten())), Effect.provide(BrowserKeyValueStore.layerLocalStorage)));
272
+ const json = yield* S.encodeEffect(DevToolsPersistedStateJson)({
273
+ isOpen,
274
+ isFlattened,
275
+ });
276
+ yield* store.set(DEVTOOLS_STORAGE_KEY, json);
277
+ return CompletedPersistDevToolsState();
278
+ }).pipe(Effect.catch(() => Effect.succeed(CompletedPersistDevToolsState())), Effect.provide(BrowserKeyValueStore.layerLocalStorage)));
265
279
  const buildInspectionFromModel = (index, model) => Effect.gen(function* () {
266
280
  const store = yield* StoreService;
267
281
  const maybeMessage = yield* store.getMessageAtIndex(index);
@@ -316,13 +330,18 @@ const makeUpdate = (store, shadow, mode) => {
316
330
  const scrollToTop = Command.mapEffect(ScrollToTop(), provideContext);
317
331
  const jumpToAndInspect = (index) => Command.mapEffect(JumpToAndInspect({ index }), provideContext);
318
332
  const inspectState = (index) => Command.mapEffect(InspectState({ index }), provideContext);
319
- const toggleScrollLock = (shouldLock) => shouldLock ? LockScroll() : UnlockScroll();
320
333
  return (model, message) => M.value(message).pipe(M.withReturnType(), M.tags({
321
334
  ClickedToggle: () => {
322
335
  const nextIsOpen = !model.isOpen;
323
336
  return [
324
337
  evo(model, { isOpen: () => nextIsOpen }),
325
- OptionExt.when(model.isMobile, toggleScrollLock(nextIsOpen)).pipe(Option.toArray),
338
+ [
339
+ ...Option.toArray(maybeToggleScrollLock(model.isMobile, nextIsOpen)),
340
+ PersistDevToolsState({
341
+ isOpen: nextIsOpen,
342
+ isFlattened: model.flattenSwitch.isChecked,
343
+ }),
344
+ ],
326
345
  ];
327
346
  },
328
347
  ClickedSettingsToggle: () => [
@@ -344,7 +363,10 @@ const makeUpdate = (store, shadow, mode) => {
344
363
  evo(model, { flattenSwitch: () => nextFlattenSwitch }),
345
364
  [
346
365
  ...mappedCommands,
347
- PersistFlatten({ isFlattened: isChecked }),
366
+ PersistDevToolsState({
367
+ isOpen: model.isOpen,
368
+ isFlattened: isChecked,
369
+ }),
348
370
  ],
349
371
  ],
350
372
  })),
@@ -352,7 +374,7 @@ const makeUpdate = (store, shadow, mode) => {
352
374
  },
353
375
  CrossedMobileBreakpoint: ({ isMobile }) => [
354
376
  evo(model, { isMobile: () => isMobile }),
355
- OptionExt.when(model.isOpen, toggleScrollLock(isMobile)).pipe(Option.toArray),
377
+ Option.toArray(maybeToggleScrollLock(model.isOpen, isMobile)),
356
378
  ],
357
379
  ClickedRow: ({ index }) => M.value(mode).pipe(M.withReturnType(), M.when('TimeTravel', () => [model, [jumpToAndInspect(index)]]), M.when('Inspect', () => [
358
380
  evo(model, {
@@ -525,7 +547,7 @@ const makeUpdate = (store, shadow, mode) => {
525
547
  [jumpToAndInspect(hostIndex)],
526
548
  ],
527
549
  }),
528
- }), M.tag('CompletedResume', 'CompletedClear', 'CompletedPersistFlatten', 'LockedScroll', 'UnlockedScroll', 'ScrolledToTop', () => [model, []]), M.exhaustive);
550
+ }), M.tag('CompletedResume', 'CompletedClear', 'CompletedPersistDevToolsState', 'LockedScroll', 'UnlockedScroll', 'ScrolledToTop', () => [model, []]), M.exhaustive);
529
551
  };
530
552
  // SUBSCRIPTION
531
553
  const makeOverlaySubscriptions = (store, shadow) => {
@@ -1360,8 +1382,9 @@ export const createOverlay = (store, position, mode, maybeBanner) => Effect.gen(
1360
1382
  container.id = '__foldkit_devtools_overlay__';
1361
1383
  const flags = Effect.gen(function* () {
1362
1384
  const storeState = yield* SubscriptionRef.get(store.stateRef);
1363
- const isFlattened = yield* readPersistedFlatten;
1385
+ const { isOpen, isFlattened } = yield* readPersistedState;
1364
1386
  return {
1387
+ isOpen,
1365
1388
  isMobile: window.matchMedia(MOBILE_BREAKPOINT_QUERY).matches,
1366
1389
  isFlattened,
1367
1390
  ...toDisplayState(storeState),
@@ -1375,7 +1398,6 @@ export const createOverlay = (store, position, mode, maybeBanner) => Effect.gen(
1375
1398
  : sliderMax;
1376
1399
  return [
1377
1400
  {
1378
- isOpen: false,
1379
1401
  screen: 'Messages',
1380
1402
  ...displayFlags,
1381
1403
  flattenSwitch: Switch.init({
@@ -1406,7 +1428,7 @@ export const createOverlay = (store, position, mode, maybeBanner) => Effect.gen(
1406
1428
  initialValue: initialSliderValue,
1407
1429
  }),
1408
1430
  },
1409
- [],
1431
+ Option.toArray(maybeLockScroll(flags.isOpen, flags.isMobile)),
1410
1432
  ];
1411
1433
  };
1412
1434
  const overlayRuntime = makeElement({
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@foldkit/devtools",
3
- "version": "0.124.0",
3
+ "version": "0.126.0",
4
4
  "description": "In-browser DevTools overlay for Foldkit applications",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -30,8 +30,8 @@
30
30
  "effect": "4.0.0-beta.88",
31
31
  "rimraf": "^6.1.3",
32
32
  "typescript": "^6.0.3",
33
- "@foldkit/ui": "0.124.0",
34
- "foldkit": "0.124.0"
33
+ "@foldkit/ui": "0.126.0",
34
+ "foldkit": "0.126.0"
35
35
  },
36
36
  "keywords": [
37
37
  "foldkit",