@kgdiff/viewer 0.5.0 → 0.6.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.
Files changed (232) hide show
  1. package/README.md +43 -16
  2. package/custom-elements.json +2347 -0
  3. package/dist/bind.d.ts +41 -0
  4. package/dist/bind.d.ts.map +1 -0
  5. package/dist/bind.js +47 -0
  6. package/dist/bind.js.map +1 -0
  7. package/dist/controller.d.ts +22 -74
  8. package/dist/controller.d.ts.map +1 -1
  9. package/dist/controller.js +35 -376
  10. package/dist/controller.js.map +1 -1
  11. package/dist/dom.d.ts +10 -0
  12. package/dist/dom.d.ts.map +1 -1
  13. package/dist/dom.js +29 -0
  14. package/dist/dom.js.map +1 -1
  15. package/dist/element.d.ts +52 -46
  16. package/dist/element.d.ts.map +1 -1
  17. package/dist/element.js +362 -403
  18. package/dist/element.js.map +1 -1
  19. package/dist/elements/actions.d.ts +27 -0
  20. package/dist/elements/actions.d.ts.map +1 -0
  21. package/dist/elements/actions.js +81 -0
  22. package/dist/elements/actions.js.map +1 -0
  23. package/dist/elements/bound.d.ts +63 -0
  24. package/dist/elements/bound.d.ts.map +1 -0
  25. package/dist/elements/bound.js +213 -0
  26. package/dist/elements/bound.js.map +1 -0
  27. package/dist/elements/change-detail.d.ts +25 -0
  28. package/dist/elements/change-detail.d.ts.map +1 -0
  29. package/dist/elements/change-detail.js +19 -0
  30. package/dist/elements/change-detail.js.map +1 -0
  31. package/dist/elements/change-list.d.ts +27 -0
  32. package/dist/elements/change-list.d.ts.map +1 -0
  33. package/dist/elements/change-list.js +29 -0
  34. package/dist/elements/change-list.js.map +1 -0
  35. package/dist/elements/filters.d.ts +25 -0
  36. package/dist/elements/filters.d.ts.map +1 -0
  37. package/dist/elements/filters.js +19 -0
  38. package/dist/elements/filters.js.map +1 -0
  39. package/dist/elements/legend.d.ts +40 -0
  40. package/dist/elements/legend.d.ts.map +1 -0
  41. package/dist/elements/legend.js +87 -0
  42. package/dist/elements/legend.js.map +1 -0
  43. package/dist/elements/minimap.d.ts +38 -0
  44. package/dist/elements/minimap.d.ts.map +1 -0
  45. package/dist/elements/minimap.js +59 -0
  46. package/dist/elements/minimap.js.map +1 -0
  47. package/dist/elements/root.d.ts +40 -0
  48. package/dist/elements/root.d.ts.map +1 -0
  49. package/dist/elements/root.js +67 -0
  50. package/dist/elements/root.js.map +1 -0
  51. package/dist/elements/search.d.ts +29 -0
  52. package/dist/elements/search.d.ts.map +1 -0
  53. package/dist/elements/search.js +23 -0
  54. package/dist/elements/search.js.map +1 -0
  55. package/dist/elements/stage-context.d.ts +31 -0
  56. package/dist/elements/stage-context.d.ts.map +1 -0
  57. package/dist/elements/stage-context.js +4 -0
  58. package/dist/elements/stage-context.js.map +1 -0
  59. package/dist/elements/stage.d.ts +65 -0
  60. package/dist/elements/stage.d.ts.map +1 -0
  61. package/dist/elements/stage.js +259 -0
  62. package/dist/elements/stage.js.map +1 -0
  63. package/dist/elements/title.d.ts +25 -0
  64. package/dist/elements/title.d.ts.map +1 -0
  65. package/dist/elements/title.js +19 -0
  66. package/dist/elements/title.js.map +1 -0
  67. package/dist/elements/transport.d.ts +29 -0
  68. package/dist/elements/transport.d.ts.map +1 -0
  69. package/dist/elements/transport.js +24 -0
  70. package/dist/elements/transport.js.map +1 -0
  71. package/dist/elements/view-bound.d.ts +39 -0
  72. package/dist/elements/view-bound.d.ts.map +1 -0
  73. package/dist/elements/view-bound.js +88 -0
  74. package/dist/elements/view-bound.js.map +1 -0
  75. package/dist/elements/view-dock.d.ts +28 -0
  76. package/dist/elements/view-dock.d.ts.map +1 -0
  77. package/dist/elements/view-dock.js +28 -0
  78. package/dist/elements/view-dock.js.map +1 -0
  79. package/dist/elements/zoom.d.ts +28 -0
  80. package/dist/elements/zoom.d.ts.map +1 -0
  81. package/dist/elements/zoom.js +22 -0
  82. package/dist/elements/zoom.js.map +1 -0
  83. package/dist/i18n.d.ts +10 -0
  84. package/dist/i18n.d.ts.map +1 -1
  85. package/dist/i18n.js +20 -0
  86. package/dist/i18n.js.map +1 -1
  87. package/dist/icons.d.ts +1 -0
  88. package/dist/icons.d.ts.map +1 -1
  89. package/dist/icons.js +1 -0
  90. package/dist/icons.js.map +1 -1
  91. package/dist/index.d.ts +328 -34
  92. package/dist/index.d.ts.map +1 -1
  93. package/dist/index.js +13 -0
  94. package/dist/index.js.map +1 -1
  95. package/dist/keyboard.d.ts +39 -2
  96. package/dist/keyboard.d.ts.map +1 -1
  97. package/dist/keyboard.js +145 -62
  98. package/dist/keyboard.js.map +1 -1
  99. package/dist/layout-store.d.ts +26 -0
  100. package/dist/layout-store.d.ts.map +1 -0
  101. package/dist/layout-store.js +46 -0
  102. package/dist/layout-store.js.map +1 -0
  103. package/dist/panel-levels.d.ts +18 -0
  104. package/dist/panel-levels.d.ts.map +1 -0
  105. package/dist/panel-levels.js +41 -0
  106. package/dist/panel-levels.js.map +1 -0
  107. package/dist/panels.d.ts +28 -0
  108. package/dist/panels.d.ts.map +1 -0
  109. package/dist/panels.js +73 -0
  110. package/dist/panels.js.map +1 -0
  111. package/dist/prefs.d.ts +5 -2
  112. package/dist/prefs.d.ts.map +1 -1
  113. package/dist/prefs.js +12 -3
  114. package/dist/prefs.js.map +1 -1
  115. package/dist/react.d.ts +460 -0
  116. package/dist/react.d.ts.map +1 -0
  117. package/dist/react.js +2 -0
  118. package/dist/react.js.map +1 -0
  119. package/dist/root-element.d.ts +122 -0
  120. package/dist/root-element.d.ts.map +1 -0
  121. package/dist/root-element.js +541 -0
  122. package/dist/root-element.js.map +1 -0
  123. package/dist/root.d.ts +30 -30
  124. package/dist/root.d.ts.map +1 -1
  125. package/dist/root.js +65 -42
  126. package/dist/root.js.map +1 -1
  127. package/dist/session.d.ts +19 -3
  128. package/dist/session.d.ts.map +1 -1
  129. package/dist/session.js +15 -17
  130. package/dist/session.js.map +1 -1
  131. package/dist/standalone/kgdiff-viewer.js +4 -4
  132. package/dist/styles.d.ts +4 -0
  133. package/dist/styles.d.ts.map +1 -1
  134. package/dist/styles.js +224 -84
  135. package/dist/styles.js.map +1 -1
  136. package/dist/theme.d.ts +7 -0
  137. package/dist/theme.d.ts.map +1 -1
  138. package/dist/theme.js +10 -7
  139. package/dist/theme.js.map +1 -1
  140. package/dist/topics.d.ts +8 -0
  141. package/dist/topics.d.ts.map +1 -0
  142. package/dist/topics.js +18 -0
  143. package/dist/topics.js.map +1 -0
  144. package/dist/ui/change-list.d.ts.map +1 -1
  145. package/dist/ui/change-list.js +2 -2
  146. package/dist/ui/change-list.js.map +1 -1
  147. package/dist/ui/context.d.ts +20 -7
  148. package/dist/ui/context.d.ts.map +1 -1
  149. package/dist/ui/context.js.map +1 -1
  150. package/dist/ui/header.d.ts +41 -3
  151. package/dist/ui/header.d.ts.map +1 -1
  152. package/dist/ui/header.js +99 -34
  153. package/dist/ui/header.js.map +1 -1
  154. package/dist/ui/legend.d.ts +15 -0
  155. package/dist/ui/legend.d.ts.map +1 -0
  156. package/dist/ui/legend.js +68 -0
  157. package/dist/ui/legend.js.map +1 -0
  158. package/dist/ui/popovers.d.ts +3 -1
  159. package/dist/ui/popovers.d.ts.map +1 -1
  160. package/dist/ui/popovers.js +62 -23
  161. package/dist/ui/popovers.js.map +1 -1
  162. package/dist/ui/search.d.ts.map +1 -1
  163. package/dist/ui/search.js +3 -2
  164. package/dist/ui/search.js.map +1 -1
  165. package/dist/ui/sidebar.d.ts +26 -3
  166. package/dist/ui/sidebar.d.ts.map +1 -1
  167. package/dist/ui/sidebar.js +344 -12
  168. package/dist/ui/sidebar.js.map +1 -1
  169. package/dist/ui/stage.d.ts +56 -1
  170. package/dist/ui/stage.d.ts.map +1 -1
  171. package/dist/ui/stage.js +244 -256
  172. package/dist/ui/stage.js.map +1 -1
  173. package/dist/ui/transport.d.ts +12 -0
  174. package/dist/ui/transport.d.ts.map +1 -0
  175. package/dist/ui/transport.js +198 -0
  176. package/dist/ui/transport.js.map +1 -0
  177. package/dist/ui/zoom.d.ts +15 -0
  178. package/dist/ui/zoom.d.ts.map +1 -0
  179. package/dist/ui/zoom.js +30 -0
  180. package/dist/ui/zoom.js.map +1 -0
  181. package/dist/view.d.ts +94 -0
  182. package/dist/view.d.ts.map +1 -0
  183. package/dist/view.js +441 -0
  184. package/dist/view.js.map +1 -0
  185. package/package.json +95 -12
  186. package/src/bind.ts +80 -0
  187. package/src/controller.ts +51 -442
  188. package/src/dom.ts +30 -0
  189. package/src/element.ts +364 -406
  190. package/src/elements/actions.ts +94 -0
  191. package/src/elements/bound.ts +247 -0
  192. package/src/elements/change-detail.ts +34 -0
  193. package/src/elements/change-list.ts +51 -0
  194. package/src/elements/filters.ts +34 -0
  195. package/src/elements/legend.ts +103 -0
  196. package/src/elements/minimap.ts +75 -0
  197. package/src/elements/root.ts +86 -0
  198. package/src/elements/search.ts +38 -0
  199. package/src/elements/stage-context.ts +34 -0
  200. package/src/elements/stage.ts +285 -0
  201. package/src/elements/title.ts +34 -0
  202. package/src/elements/transport.ts +39 -0
  203. package/src/elements/view-bound.ts +118 -0
  204. package/src/elements/view-dock.ts +43 -0
  205. package/src/elements/zoom.ts +38 -0
  206. package/src/i18n.ts +20 -0
  207. package/src/icons.ts +1 -0
  208. package/src/index.ts +347 -34
  209. package/src/keyboard.ts +188 -61
  210. package/src/layout-store.ts +71 -0
  211. package/src/panel-levels.ts +53 -0
  212. package/src/panels.ts +81 -0
  213. package/src/prefs.ts +12 -4
  214. package/src/react.ts +459 -0
  215. package/src/root-element.ts +624 -0
  216. package/src/root.ts +92 -65
  217. package/src/session.ts +22 -33
  218. package/src/styles.ts +245 -84
  219. package/src/theme.ts +10 -7
  220. package/src/topics.ts +37 -0
  221. package/src/ui/change-list.ts +6 -2
  222. package/src/ui/context.ts +20 -7
  223. package/src/ui/header.ts +127 -56
  224. package/src/ui/legend.ts +112 -0
  225. package/src/ui/popovers.ts +68 -25
  226. package/src/ui/search.ts +10 -5
  227. package/src/ui/sidebar.ts +386 -23
  228. package/src/ui/stage.ts +267 -331
  229. package/src/ui/transport.ts +240 -0
  230. package/src/ui/zoom.ts +45 -0
  231. package/src/view.ts +516 -0
  232. package/vscode.html-custom-data.json +726 -0
package/dist/keyboard.js CHANGED
@@ -1,45 +1,55 @@
1
- const MODE_KEYS = {
1
+ /** Divider steps for swipe, as a fraction of the width. */
2
+ export const DIVIDER_STEP = 0.02;
3
+ export const DIVIDER_STEP_LARGE = 0.1;
4
+ /** The default keyboard map (docs/interaction.md §Keyboard map); each letter once. */
5
+ export const DEFAULT_KEYMAP = {
2
6
  '1': 'overlay',
3
7
  '2': 'swipe',
4
8
  '3': 'replay',
9
+ '4': 'scope',
10
+ j: 'next',
11
+ ArrowDown: 'next',
12
+ k: 'prev',
13
+ ArrowUp: 'prev',
14
+ Home: 'first',
15
+ End: 'last',
16
+ Enter: 'fly',
17
+ Escape: 'escape',
18
+ ' ': 'play-pause',
19
+ Spacebar: 'play-pause',
20
+ ArrowLeft: 'left',
21
+ ArrowRight: 'right',
22
+ f: 'fit',
23
+ '+': 'zoom-in',
24
+ '=': 'zoom-in',
25
+ '-': 'zoom-out',
26
+ _: 'zoom-out',
27
+ '−': 'zoom-out',
28
+ '/': 'search',
29
+ x: 'review',
30
+ '\\': 'sidebar',
31
+ t: 'theme',
32
+ e: 'expand',
33
+ '?': 'help',
5
34
  };
6
- /** Divider steps for swipe, as a fraction of the width. */
7
- export const DIVIDER_STEP = 0.02;
8
- export const DIVIDER_STEP_LARGE = 0.1;
9
- /**
10
- * Map a key press to an action in `mode` and `scope`, or null when the key means nothing here.
11
- * Chords with Ctrl / Meta / Alt are never handled (they belong to the browser and the host page).
12
- */
13
- export function keyAction(e, mode, scope = 'all') {
14
- if (e.ctrlKey || e.metaKey || e.altKey)
15
- return null;
16
- const key = e.key;
17
- const mapped = MODE_KEYS[key];
18
- if (mapped !== undefined)
19
- return { type: 'mode', mode: mapped };
20
- switch (key) {
21
- case '4':
35
+ /** Every shortcut (each is bound to a key by default). */
36
+ export const SHORTCUT_NAMES = new Set(Object.values(DEFAULT_KEYMAP).filter((name) => name !== null));
37
+ /** What `name` does in `mode` and `scope`, or null when it does nothing there. */
38
+ function resolve(name, e, mode, scope) {
39
+ switch (name) {
40
+ case 'overlay':
41
+ case 'swipe':
42
+ case 'replay':
43
+ return { type: 'mode', mode: name };
44
+ case 'scope':
22
45
  return { type: 'scope' };
23
- case 'j':
24
- case 'ArrowDown':
25
- return { type: 'next' };
26
- case 'k':
27
- case 'ArrowUp':
28
- return { type: 'prev' };
29
- case 'Home':
30
- return { type: 'first' };
31
- case 'End':
32
- return { type: 'last' };
33
- case 'Enter':
34
- return { type: 'fly' };
35
- case 'Escape':
36
- return { type: 'escape' };
37
- case ' ':
38
- case 'Spacebar':
46
+ case 'expand':
47
+ return scope === 'changes' ? { type: 'expand' } : null;
48
+ case 'play-pause':
39
49
  return mode === 'replay' ? { type: 'play-pause' } : null;
40
- case 'ArrowLeft':
41
- case 'ArrowRight': {
42
- const direction = key === 'ArrowRight' ? 1 : -1;
50
+ case 'left':
51
+ case 'right': {
52
+ const direction = name === 'right' ? 1 : -1;
43
53
  if (mode === 'replay')
44
54
  return { type: 'step', direction };
45
55
  if (mode === 'swipe') {
@@ -50,34 +60,107 @@ export function keyAction(e, mode, scope = 'all') {
50
60
  }
51
61
  return null;
52
62
  }
53
- case 'f':
54
- case 'F':
55
- return { type: 'fit' };
56
- case '+':
57
- case '=':
58
- return { type: 'zoom', direction: 1 };
59
- case '-':
60
- case '_':
61
- case '−':
62
- return { type: 'zoom', direction: -1 };
63
- case '/':
64
- return { type: 'search' };
65
- case 'x':
66
- case 'X':
67
- return { type: 'review' };
68
- case '\\':
69
- return { type: 'sidebar' };
70
- case 't':
71
- case 'T':
72
- return { type: 'theme' };
73
- case 'e':
74
- case 'E':
75
- return scope === 'changes' ? { type: 'expand' } : null;
76
- case '?':
77
- return { type: 'help' };
63
+ case 'zoom-in':
64
+ case 'zoom-out':
65
+ return { type: 'zoom', direction: name === 'zoom-in' ? 1 : -1 };
78
66
  default:
79
- return null;
67
+ return { type: name };
68
+ }
69
+ }
70
+ /**
71
+ * What `map` binds `key` to: the key itself, else the other case of a letter; undefined when
72
+ * `map` names neither.
73
+ */
74
+ function lookup(map, key) {
75
+ if (Object.hasOwn(map, key))
76
+ return map[key];
77
+ const lower = key.toLowerCase();
78
+ const other = key === lower ? key.toUpperCase() : lower;
79
+ return key.length === 1 && other !== key && Object.hasOwn(map, other) ? map[other] : undefined;
80
+ }
81
+ /**
82
+ * Map a key press to an action in `mode` and `scope`, or null when the key means nothing here.
83
+ * `keymap` overrides single keys of the default map (null unbinds one); a letter in either map
84
+ * stands for both its cases unless the other case is named too. Chords with Ctrl / Meta / Alt
85
+ * are never handled (they belong to the browser and the host page).
86
+ */
87
+ export function keyAction(e, mode, scope = 'all', keymap = null) {
88
+ if (e.ctrlKey || e.metaKey || e.altKey)
89
+ return null;
90
+ const custom = keymap === null ? undefined : lookup(keymap, e.key);
91
+ const name = custom === undefined ? lookup(DEFAULT_KEYMAP, e.key) : custom;
92
+ return name ? resolve(name, e, mode, scope) : null;
93
+ }
94
+ /**
95
+ * Keys the default map binds for another key's sake: listed only when they do something else
96
+ * (the `+` key unshifted, `-` with Shift, the minus sign, the legacy name of the space bar).
97
+ */
98
+ const ALIASES = { '=': '+', _: '-', '−': '-', Spacebar: ' ' };
99
+ /**
100
+ * The keys bound to each shortcut with `keymap` over the default map, in the default map's
101
+ * order then `keymap`'s (what the shortcuts dialog lists). A letter is listed once for both its
102
+ * cases; a shortcut no key is bound to is absent.
103
+ */
104
+ export function shortcutKeys(keymap) {
105
+ const candidates = new Set([...Object.keys(DEFAULT_KEYMAP), ...Object.keys(keymap ?? {})]);
106
+ const bound = (key) => {
107
+ const custom = keymap === null ? undefined : lookup(keymap, key);
108
+ return custom === undefined ? lookup(DEFAULT_KEYMAP, key) : custom;
109
+ };
110
+ const out = new Map();
111
+ for (const key of candidates) {
112
+ const name = bound(key);
113
+ if (!name)
114
+ continue;
115
+ const lower = key.toLowerCase();
116
+ if (key.length === 1 && key !== lower && candidates.has(lower) && bound(lower) === name) {
117
+ continue;
118
+ }
119
+ const alias = ALIASES[key];
120
+ if (alias !== undefined && bound(alias) === name)
121
+ continue;
122
+ const keys = out.get(name) ?? [];
123
+ keys.push(key);
124
+ out.set(name, keys);
125
+ }
126
+ return out;
127
+ }
128
+ /** `Space` names the space bar in a `keymap` attribute. */
129
+ const KEY_NAMES = { Space: ' ' };
130
+ /**
131
+ * A keymap from an attribute (`"x:none r:review"`: `key:shortcut` pairs separated by spaces,
132
+ * `none` unbinds a key, `Space` is the space bar) or a property (an object of the same pairs).
133
+ * Pairs that name no shortcut are left out and returned in `invalid`.
134
+ */
135
+ export function toKeymap(value) {
136
+ const invalid = [];
137
+ const out = {};
138
+ const add = (key, name, raw) => {
139
+ const k = KEY_NAMES[key] ?? key;
140
+ if (k === '' || !(name === null || name === 'none' || SHORTCUT_NAMES.has(name))) {
141
+ invalid.push(raw);
142
+ }
143
+ else
144
+ out[k] = name === null || name === 'none' ? null : name;
145
+ };
146
+ if (typeof value === 'string') {
147
+ for (const token of value.split(/\s+/)) {
148
+ if (token === '')
149
+ continue;
150
+ const at = token.lastIndexOf(':');
151
+ if (at <= 0)
152
+ invalid.push(token);
153
+ else
154
+ add(token.slice(0, at), token.slice(at + 1), token);
155
+ }
156
+ }
157
+ else if (typeof value === 'object' && value !== null) {
158
+ for (const [key, name] of Object.entries(value))
159
+ add(key, name, `${key}:${String(name)}`);
80
160
  }
161
+ else
162
+ return { keymap: null, invalid };
163
+ return { keymap: Object.keys(out).length > 0 ? out : null, invalid };
81
164
  }
82
165
  /** Whether a key event comes from a place where the user types (shortcuts must not fire). */
83
166
  export function isTypingTarget(target) {
@@ -1 +1 @@
1
- {"version":3,"file":"keyboard.js","sourceRoot":"","sources":["../src/keyboard.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"keyboard.js","sourceRoot":"","sources":["../src/keyboard.ts"],"names":[],"mappings":"AAmCA,2DAA2D;AAC3D,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,CAAC;AACjC,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,CAAC;AA0CtC,sFAAsF;AACtF,MAAM,CAAC,MAAM,cAAc,GAAW;IACpC,GAAG,EAAE,SAAS;IACd,GAAG,EAAE,OAAO;IACZ,GAAG,EAAE,QAAQ;IACb,GAAG,EAAE,OAAO;IACZ,CAAC,EAAE,MAAM;IACT,SAAS,EAAE,MAAM;IACjB,CAAC,EAAE,MAAM;IACT,OAAO,EAAE,MAAM;IACf,IAAI,EAAE,OAAO;IACb,GAAG,EAAE,MAAM;IACX,KAAK,EAAE,KAAK;IACZ,MAAM,EAAE,QAAQ;IAChB,GAAG,EAAE,YAAY;IACjB,QAAQ,EAAE,YAAY;IACtB,SAAS,EAAE,MAAM;IACjB,UAAU,EAAE,OAAO;IACnB,CAAC,EAAE,KAAK;IACR,GAAG,EAAE,SAAS;IACd,GAAG,EAAE,SAAS;IACd,GAAG,EAAE,UAAU;IACf,CAAC,EAAE,UAAU;IACb,GAAG,EAAE,UAAU;IACf,GAAG,EAAE,QAAQ;IACb,CAAC,EAAE,QAAQ;IACX,IAAI,EAAE,SAAS;IACf,CAAC,EAAE,OAAO;IACV,CAAC,EAAE,QAAQ;IACX,GAAG,EAAE,MAAM;CACZ,CAAC;AAEF,0DAA0D;AAC1D,MAAM,CAAC,MAAM,cAAc,GAAwB,IAAI,GAAG,CACxD,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC,CAC9D,CAAC;AAEF,kFAAkF;AAClF,SAAS,OAAO,CACd,IAAkB,EAClB,CAAU,EACV,IAAgB,EAChB,KAAkB;IAElB,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,SAAS,CAAC;QACf,KAAK,OAAO,CAAC;QACb,KAAK,QAAQ;YACX,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACtC,KAAK,OAAO;YACV,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QAC3B,KAAK,QAAQ;YACX,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QACzD,KAAK,YAAY;YACf,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAC3D,KAAK,MAAM,CAAC;QACZ,KAAK,OAAO,EAAE,CAAC;YACb,MAAM,SAAS,GAAG,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5C,IAAI,IAAI,KAAK,QAAQ;gBAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;YAC1D,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;gBACrB,OAAO;oBACL,IAAI,EAAE,SAAS;oBACf,KAAK,EAAE,SAAS,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,YAAY,CAAC;iBACpE,CAAC;YACJ,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,KAAK,SAAS,CAAC;QACf,KAAK,UAAU;YACb,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAClE;YACE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAC1B,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,MAAM,CAAC,GAAW,EAAE,GAAW;IACtC,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7C,MAAM,KAAK,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;IAChC,MAAM,KAAK,GAAG,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;IACxD,OAAO,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,KAAK,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACjG,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,SAAS,CACvB,CAAU,EACV,IAAgB,EAChB,KAAK,GAAgB,KAAK,EAC1B,MAAM,GAAkB,IAAI;IAE5B,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACpD,MAAM,MAAM,GAAG,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;IACnE,MAAM,IAAI,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAC3E,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACrD,CAAC;AAED;;;GAGG;AACH,MAAM,OAAO,GAAqC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;AAEhG;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,MAAqB;IAChD,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC3F,MAAM,KAAK,GAAG,CAAC,GAAW,EAAmC,EAAE;QAC7D,MAAM,MAAM,GAAG,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QACjE,OAAO,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IACrE,CAAC,CAAC;IACF,MAAM,GAAG,GAAG,IAAI,GAAG,EAA0B,CAAC;IAC9C,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI;YAAE,SAAS;QACpB,MAAM,KAAK,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;QAChC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,GAAG,KAAK,KAAK,IAAI,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC;YACxF,SAAS;QACX,CAAC;QACD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAC3B,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,IAAI;YAAE,SAAS;QAC3D,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACjC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACtB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,2DAA2D;AAC3D,MAAM,SAAS,GAAqC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;AAEnE;;;;GAIG;AACH,MAAM,UAAU,QAAQ,CAAC,KAAc;IACrC,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,GAAG,GAAwC,EAAE,CAAC;IACpD,MAAM,GAAG,GAAG,CAAC,GAAW,EAAE,IAAa,EAAE,GAAW,EAAQ,EAAE;QAC5D,MAAM,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC;QAChC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,MAAM,IAAI,cAAc,CAAC,GAAG,CAAC,IAAc,CAAC,CAAC,EAAE,CAAC;YAC1F,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACpB,CAAC;;YAAM,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAE,IAAqB,CAAC;IACnF,CAAC,CAAC;IACF,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;YACvC,IAAI,KAAK,KAAK,EAAE;gBAAE,SAAS;YAC3B,MAAM,EAAE,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;YAClC,IAAI,EAAE,IAAI,CAAC;gBAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;;gBAC5B,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;SAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACvD,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;YAAE,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC5F,CAAC;;QAAM,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IACxC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC;AACvE,CAAC;AAED,6FAA6F;AAC7F,MAAM,UAAU,cAAc,CAAC,MAA0B;IACvD,IAAI,MAAM,KAAK,IAAI,IAAI,OAAQ,MAAkB,CAAC,OAAO,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACrF,MAAM,EAAE,GAAG,MAAqB,CAAC;IACjC,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;IACrC,IAAI,GAAG,KAAK,UAAU,IAAI,GAAG,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACxD,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;QACpB,MAAM,IAAI,GAAG,CAAE,EAAuB,CAAC,IAAI,IAAI,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;QACrE,OAAO,CAAC,CAAC,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,QAAQ,CAC3F,IAAI,CACL,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,CAAC,iBAAiB,KAAK,IAAI,IAAI,EAAE,CAAC,YAAY,EAAE,CAAC,iBAAiB,CAAC,KAAK,MAAM,CAAC;AAC1F,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * What the default layout remembers of the user's choices (RFC 0001 §4, decision 3): panel
3
+ * states, the sidebar's width, the split between the change list and the detail panel, theme,
4
+ * palette and language. One `localStorage` entry (`kgdiff:viewer`, or the viewer's
5
+ * `persist-key`), shared by the viewers of the origin that use the same key. Like review progress (`review-store.ts`), storage failures
6
+ * (private mode, quota, sandboxed iframes) never break the viewer: nothing is remembered then.
7
+ * Values are validated when read; an entry from another version is read as far as it is valid.
8
+ */
9
+ import type { Locale } from '@kgdiff/core';
10
+ import type { PaletteName } from '@kgdiff/scene';
11
+ import type { ThemePreference, ViewerPanels } from './index.js';
12
+ import type { StorageLike } from './review-store.js';
13
+ /** The default storage key (`persist-key`). */
14
+ export declare const LAYOUT_KEY = "kgdiff:viewer";
15
+ export interface Remembered {
16
+ readonly panels: ViewerPanels;
17
+ readonly sidebarWidth?: number;
18
+ /** Null: the user reset the split (the detail panel takes its content's height). */
19
+ readonly detailShare?: number | null;
20
+ readonly theme?: ThemePreference;
21
+ readonly palette?: PaletteName;
22
+ readonly locale?: Locale;
23
+ }
24
+ export declare function readRemembered(storage: StorageLike | null, key?: string): Remembered;
25
+ export declare function writeRemembered(storage: StorageLike | null, value: Remembered, key?: string): void;
26
+ //# sourceMappingURL=layout-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout-store.d.ts","sourceRoot":"","sources":["../src/layout-store.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAGhE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,+CAA+C;AAC/C,eAAO,MAAM,UAAU,kBAAkB,CAAC;AAE1C,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,oFAAoF;IACpF,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,KAAK,CAAC,EAAE,eAAe,CAAC;IACjC,QAAQ,CAAC,OAAO,CAAC,EAAE,WAAW,CAAC;IAC/B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAOD,wBAAgB,cAAc,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,EAAE,GAAG,SAAa,GAAG,UAAU,CAwBxF;AAED,wBAAgB,eAAe,CAC7B,OAAO,EAAE,WAAW,GAAG,IAAI,EAC3B,KAAK,EAAE,UAAU,EACjB,GAAG,SAAa,GACf,IAAI,CAON"}
@@ -0,0 +1,46 @@
1
+ import { toPanels } from './panels.js';
2
+ import { toLocale, toPalette, toTheme } from './prefs.js';
3
+ /** The default storage key (`persist-key`). */
4
+ export const LAYOUT_KEY = 'kgdiff:viewer';
5
+ const NOTHING = { panels: {} };
6
+ const finite = (x, min, max) => typeof x === 'number' && Number.isFinite(x) && x >= min && x <= max ? x : undefined;
7
+ export function readRemembered(storage, key = LAYOUT_KEY) {
8
+ if (!storage)
9
+ return NOTHING;
10
+ try {
11
+ const raw = storage.getItem(key);
12
+ if (!raw)
13
+ return NOTHING;
14
+ const v = JSON.parse(raw);
15
+ if (typeof v !== 'object' || v === null)
16
+ return NOTHING;
17
+ const o = v;
18
+ const sidebarWidth = finite(o.sidebarWidth, 0, 10_000);
19
+ const detailShare = finite(o.detailShare, 0, 1);
20
+ const theme = toTheme(o.theme);
21
+ const palette = toPalette(o.palette);
22
+ const locale = toLocale(o.locale);
23
+ return {
24
+ panels: toPanels(o.panels).panels,
25
+ ...(sidebarWidth !== undefined ? { sidebarWidth } : {}),
26
+ ...(detailShare !== undefined ? { detailShare } : {}),
27
+ ...(theme ? { theme } : {}),
28
+ ...(palette ? { palette } : {}),
29
+ ...(locale ? { locale } : {}),
30
+ };
31
+ }
32
+ catch {
33
+ return NOTHING;
34
+ }
35
+ }
36
+ export function writeRemembered(storage, value, key = LAYOUT_KEY) {
37
+ if (!storage)
38
+ return;
39
+ try {
40
+ storage.setItem(key, JSON.stringify({ v: 1, ...value }));
41
+ }
42
+ catch {
43
+ // Quota exceeded or storage blocked: the choice holds for this page only.
44
+ }
45
+ }
46
+ //# sourceMappingURL=layout-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout-store.js","sourceRoot":"","sources":["../src/layout-store.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAG1D,+CAA+C;AAC/C,MAAM,CAAC,MAAM,UAAU,GAAG,eAAe,CAAC;AAY1C,MAAM,OAAO,GAAe,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;AAE3C,MAAM,MAAM,GAAG,CAAC,CAAU,EAAE,GAAW,EAAE,GAAW,EAAsB,EAAE,CAC1E,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAEtF,MAAM,UAAU,cAAc,CAAC,OAA2B,EAAE,GAAG,GAAG,UAAU;IAC1E,IAAI,CAAC,OAAO;QAAE,OAAO,OAAO,CAAC;IAC7B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,CAAC,GAAG;YAAE,OAAO,OAAO,CAAC;QACzB,MAAM,CAAC,GAAY,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI;YAAE,OAAO,OAAO,CAAC;QACxD,MAAM,CAAC,GAAG,CAA4B,CAAC;QACvC,MAAM,YAAY,GAAG,MAAM,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;QACvD,MAAM,WAAW,GAAG,MAAM,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAChD,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAC/B,MAAM,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QACrC,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAClC,OAAO;YACL,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM;YACjC,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACvD,GAAG,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACrD,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3B,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/B,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC9B,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC;IACjB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,OAA2B,EAC3B,KAAiB,EACjB,GAAG,GAAG,UAAU;IAEhB,IAAI,CAAC,OAAO;QAAE,OAAO;IACrB,IAAI,CAAC;QACH,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC;IAC3D,CAAC;IAAC,MAAM,CAAC;QACP,0EAA0E;IAC5E,CAAC;AACH,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Which level decides a panel's state in the default layout: the first of these that names the
3
+ * region. What the user changed in this page, the host (`panels`, then the presets `sidebar`,
4
+ * `header` and `chrome`), what the user changed before (remembered, `layout-store.ts`), the
5
+ * report's `view.panels`, the default.
6
+ */
7
+ import type { PanelRegion, PanelStates, ViewerPanels } from './index.js';
8
+ /** The regions of the sidebar (the bottom sheet below 760 px). */
9
+ export declare const SIDEBAR_REGIONS: readonly PanelRegion[];
10
+ /**
11
+ * What the existing switches stand for: `sidebar="closed"` (and `open`), `header="compact"`,
12
+ * `chrome="none"` (everything but the stage hidden; the legend stays, as one line).
13
+ */
14
+ export declare function presetPanels(sidebar: string | null, header: string | null, chrome: string | null): ViewerPanels;
15
+ /** Every region's state: the first of `levels` that names it, else the default. */
16
+ export declare function resolvePanels(levels: readonly ViewerPanels[]): PanelStates;
17
+ export declare function samePanels(a: PanelStates, b: PanelStates): boolean;
18
+ //# sourceMappingURL=panel-levels.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"panel-levels.d.ts","sourceRoot":"","sources":["../src/panel-levels.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAKzE,kEAAkE;AAClE,eAAO,MAAM,eAAe,EAAE,SAAS,WAAW,EAA4C,CAAC;AAE/F;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,MAAM,GAAG,IAAI,EACtB,MAAM,EAAE,MAAM,GAAG,IAAI,EACrB,MAAM,EAAE,MAAM,GAAG,IAAI,GACpB,YAAY,CAWd;AAED,mFAAmF;AACnF,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,GAAG,WAAW,CAY1E;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,WAAW,GAAG,OAAO,CAElE"}
@@ -0,0 +1,41 @@
1
+ import { DEFAULT_PANELS, PANEL_REGIONS } from './panels.js';
2
+ /** The regions of the sidebar (the bottom sheet below 760 px). */
3
+ export const SIDEBAR_REGIONS = ['list', 'detail', 'search', 'filters'];
4
+ /**
5
+ * What the existing switches stand for: `sidebar="closed"` (and `open`), `header="compact"`,
6
+ * `chrome="none"` (everything but the stage hidden; the legend stays, as one line).
7
+ */
8
+ export function presetPanels(sidebar, header, chrome) {
9
+ const out = {};
10
+ if (chrome === 'none') {
11
+ for (const r of PANEL_REGIONS)
12
+ if (r !== 'legend')
13
+ out[r] = 'hidden';
14
+ return out;
15
+ }
16
+ if (sidebar === 'closed' || sidebar === 'open') {
17
+ for (const r of SIDEBAR_REGIONS)
18
+ out[r] = sidebar === 'open' ? 'open' : 'collapsed';
19
+ }
20
+ if (header === 'compact')
21
+ out.title = 'hidden';
22
+ return out;
23
+ }
24
+ /** Every region's state: the first of `levels` that names it, else the default. */
25
+ export function resolvePanels(levels) {
26
+ const out = { ...DEFAULT_PANELS };
27
+ for (const r of PANEL_REGIONS) {
28
+ for (const level of levels) {
29
+ const state = level[r];
30
+ if (state !== undefined) {
31
+ out[r] = state;
32
+ break;
33
+ }
34
+ }
35
+ }
36
+ return out;
37
+ }
38
+ export function samePanels(a, b) {
39
+ return PANEL_REGIONS.every((r) => a[r] === b[r]);
40
+ }
41
+ //# sourceMappingURL=panel-levels.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"panel-levels.js","sourceRoot":"","sources":["../src/panel-levels.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAI5D,kEAAkE;AAClE,MAAM,CAAC,MAAM,eAAe,GAA2B,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;AAE/F;;;GAGG;AACH,MAAM,UAAU,YAAY,CAC1B,OAAsB,EACtB,MAAqB,EACrB,MAAqB;IAErB,MAAM,GAAG,GAAkB,EAAE,CAAC;IAC9B,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,KAAK,MAAM,CAAC,IAAI,aAAa;YAAE,IAAI,CAAC,KAAK,QAAQ;gBAAE,GAAG,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC;QACrE,OAAO,GAAG,CAAC;IACb,CAAC;IACD,IAAI,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QAC/C,KAAK,MAAM,CAAC,IAAI,eAAe;YAAE,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC;IACtF,CAAC;IACD,IAAI,MAAM,KAAK,SAAS;QAAE,GAAG,CAAC,KAAK,GAAG,QAAQ,CAAC;IAC/C,OAAO,GAAG,CAAC;AACb,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,aAAa,CAAC,MAA+B;IAC3D,MAAM,GAAG,GAAG,EAAE,GAAG,cAAc,EAAE,CAAC;IAClC,KAAK,MAAM,CAAC,IAAI,aAAa,EAAE,CAAC;QAC9B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACvB,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;gBACf,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,CAAc,EAAE,CAAc;IACvD,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACnD,CAAC"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * `@kgdiff/viewer/panels`: the syntax of the default layout's panel states (RFC 0001 §4), every
3
+ * region `open`, `collapsed` or `hidden`. The `panels` attribute
4
+ * (`"detail:collapsed minimap:hidden"`), its object property, a report's `view.panels` and the
5
+ * CLI's `--panels` all go through `parsePanels` / `toPanels`. No DOM: the CLI imports it.
6
+ * Which level decides a region's state is `panel-levels.ts`.
7
+ */
8
+ import type { PanelRegion, PanelState, PanelStates, ViewerPanels } from './index.js';
9
+ export declare const PANEL_REGIONS: readonly PanelRegion[];
10
+ export declare const PANEL_STATES: readonly PanelState[];
11
+ /** Today's layout. The legend card starts folded to its head. */
12
+ export declare const DEFAULT_PANELS: PanelStates;
13
+ /**
14
+ * Read `"region:state …"` (pairs separated by spaces or commas). Pairs that name no region or
15
+ * no state are left out and returned in `invalid`; a region named twice takes the last state.
16
+ */
17
+ export declare function parsePanels(text: string): {
18
+ panels: ViewerPanels;
19
+ invalid: string[];
20
+ };
21
+ /** Panels from an attribute, a property or a report (a string or an object), as `parsePanels`. */
22
+ export declare function toPanels(value: unknown): {
23
+ panels: ViewerPanels;
24
+ invalid: string[];
25
+ };
26
+ /** The attribute form of `panels`, in region order. */
27
+ export declare function formatPanels(panels: ViewerPanels): string;
28
+ //# sourceMappingURL=panels.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"panels.d.ts","sourceRoot":"","sources":["../src/panels.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAErF,eAAO,MAAM,aAAa,EAAE,SAAS,WAAW,EAY/C,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,SAAS,UAAU,EAAoC,CAAC;AAEnF,iEAAiE;AACjE,eAAO,MAAM,cAAc,EAAE,WAY5B,CAAC;AAOF;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,YAAY,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAUrF;AAED,kGAAkG;AAClG,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG;IAAE,MAAM,EAAE,YAAY,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAWpF;AAED,uDAAuD;AACvD,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAIzD"}
package/dist/panels.js ADDED
@@ -0,0 +1,73 @@
1
+ export const PANEL_REGIONS = [
2
+ 'list',
3
+ 'detail',
4
+ 'search',
5
+ 'filters',
6
+ 'dock',
7
+ 'transport',
8
+ 'legend',
9
+ 'zoom',
10
+ 'minimap',
11
+ 'title',
12
+ 'actions',
13
+ ];
14
+ export const PANEL_STATES = ['open', 'collapsed', 'hidden'];
15
+ /** Today's layout. The legend card starts folded to its head. */
16
+ export const DEFAULT_PANELS = {
17
+ list: 'open',
18
+ detail: 'open',
19
+ search: 'open',
20
+ filters: 'open',
21
+ dock: 'open',
22
+ transport: 'open',
23
+ legend: 'collapsed',
24
+ zoom: 'open',
25
+ minimap: 'open',
26
+ title: 'open',
27
+ actions: 'open',
28
+ };
29
+ const isRegion = (r) => PANEL_REGIONS.includes(r);
30
+ const isState = (s) => PANEL_STATES.includes(s);
31
+ /**
32
+ * Read `"region:state …"` (pairs separated by spaces or commas). Pairs that name no region or
33
+ * no state are left out and returned in `invalid`; a region named twice takes the last state.
34
+ */
35
+ export function parsePanels(text) {
36
+ const panels = {};
37
+ const invalid = [];
38
+ for (const token of text.split(/[\s,]+/)) {
39
+ if (token === '')
40
+ continue;
41
+ const [region, state, ...rest] = token.split(':');
42
+ if (rest.length === 0 && isRegion(region) && isState(state))
43
+ panels[region] = state;
44
+ else
45
+ invalid.push(token);
46
+ }
47
+ return { panels, invalid };
48
+ }
49
+ /** Panels from an attribute, a property or a report (a string or an object), as `parsePanels`. */
50
+ export function toPanels(value) {
51
+ if (typeof value === 'string')
52
+ return parsePanels(value);
53
+ const panels = {};
54
+ const invalid = [];
55
+ if (typeof value === 'object' && value !== null) {
56
+ for (const [region, state] of Object.entries(value)) {
57
+ if (isRegion(region) && isState(state))
58
+ panels[region] = state;
59
+ else
60
+ invalid.push(`${region}:${String(state)}`);
61
+ }
62
+ }
63
+ else if (value !== null && value !== undefined)
64
+ invalid.push(String(value));
65
+ return { panels, invalid };
66
+ }
67
+ /** The attribute form of `panels`, in region order. */
68
+ export function formatPanels(panels) {
69
+ return PANEL_REGIONS.filter((r) => panels[r] !== undefined)
70
+ .map((r) => `${r}:${panels[r]}`)
71
+ .join(' ');
72
+ }
73
+ //# sourceMappingURL=panels.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"panels.js","sourceRoot":"","sources":["../src/panels.ts"],"names":[],"mappings":"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"}
package/dist/prefs.d.ts CHANGED
@@ -24,7 +24,10 @@ export declare function toLegend(value: unknown): ViewerLegend | null;
24
24
  /** A delay in ms (number or numeric string), at least 0. */
25
25
  export declare function toDelay(value: unknown): number | null;
26
26
  type View = NonNullable<ReportPayload['view']>;
27
- /** Keep only the valid fields of a report's `view` (warning about the rest). */
28
- export declare function sanitizeView(view: unknown): View | undefined;
27
+ /**
28
+ * Keep only the valid fields of a report's `view`, warning about the rest (once per payload:
29
+ * `quiet` for a second read of the same view).
30
+ */
31
+ export declare function sanitizeView(view: unknown, quiet?: boolean): View | undefined;
29
32
  export {};
30
33
  //# sourceMappingURL=prefs.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"prefs.d.ts","sourceRoot":"","sources":["../src/prefs.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEjD,OAAO,KAAK,EACV,aAAa,EACb,eAAe,EACf,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,WAAW,EACZ,MAAM,YAAY,CAAC;AASpB,wEAAwE;AACxE,eAAO,MAAM,kBAAkB,OAAO,CAAC;AAEvC,eAAO,MAAM,iBAAiB,4BAAS,CAAC;AAExC,wBAAgB,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,UAAU,GAAG,IAAI,CAExD;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,GAAG,IAAI,CAE1D;AAED;;;GAGG;AACH,eAAO,MAAM,mBAAmB,YAAY,CAAC;AAE7C,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,eAAe,GAAG,IAAI,CAE9D;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,GAAG,IAAI,CAE5D;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAEtD;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,YAAY,GAAG,IAAI,CAE5D;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,YAAY,GAAG,IAAI,CAE5D;AAED,4DAA4D;AAC5D,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAGrD;AAED,KAAK,IAAI,GAAG,WAAW,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;AAE/C,gFAAgF;AAChF,wBAAgB,YAAY,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,GAAG,SAAS,CAsB5D"}
1
+ {"version":3,"file":"prefs.d.ts","sourceRoot":"","sources":["../src/prefs.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEjD,OAAO,KAAK,EACV,aAAa,EACb,eAAe,EACf,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,WAAW,EACZ,MAAM,YAAY,CAAC;AAUpB,wEAAwE;AACxE,eAAO,MAAM,kBAAkB,OAAO,CAAC;AAEvC,eAAO,MAAM,iBAAiB,4BAAS,CAAC;AAExC,wBAAgB,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,UAAU,GAAG,IAAI,CAExD;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,GAAG,IAAI,CAE1D;AAED;;;GAGG;AACH,eAAO,MAAM,mBAAmB,YAAY,CAAC;AAE7C,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,eAAe,GAAG,IAAI,CAE9D;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,GAAG,IAAI,CAE5D;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAEtD;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,YAAY,GAAG,IAAI,CAE5D;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,YAAY,GAAG,IAAI,CAE5D;AAED,4DAA4D;AAC5D,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAGrD;AAED,KAAK,IAAI,GAAG,WAAW,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;AAE/C;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,UAAQ,GAAG,IAAI,GAAG,SAAS,CA0B3E"}
package/dist/prefs.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import { normalizeLocale } from './i18n.js';
2
+ import { toPanels } from './panels.js';
2
3
  const MODES = ['overlay', 'swipe', 'replay'];
3
4
  const SCOPES = ['all', 'changes'];
4
5
  const THEMES = ['auto', 'light', 'dark'];
@@ -39,8 +40,11 @@ export function toDelay(value) {
39
40
  const n = typeof value === 'string' && value.trim() !== '' ? Number(value) : value;
40
41
  return typeof n === 'number' && Number.isFinite(n) && n >= 0 ? n : null;
41
42
  }
42
- /** Keep only the valid fields of a report's `view` (warning about the rest). */
43
- export function sanitizeView(view) {
43
+ /**
44
+ * Keep only the valid fields of a report's `view`, warning about the rest (once per payload:
45
+ * `quiet` for a second read of the same view).
46
+ */
47
+ export function sanitizeView(view, quiet = false) {
44
48
  if (typeof view !== 'object' || view === null)
45
49
  return undefined;
46
50
  const v = view;
@@ -50,8 +54,12 @@ export function sanitizeView(view) {
50
54
  const theme = toTheme(v.theme);
51
55
  const palette = toPalette(v.palette);
52
56
  const locale = toLocale(v.locale);
57
+ const read = v.panels === undefined ? null : toPanels(v.panels);
58
+ const panels = read && Object.keys(read.panels).length > 0 ? read.panels : null;
53
59
  const dropped = ['mode', 'scope', 'theme', 'palette', 'locale'].filter((k) => v[k] !== undefined && { mode, scope, theme, palette, locale }[k] === null);
54
- if (dropped.length > 0 && typeof console !== 'undefined') {
60
+ if (read && read.invalid.length > 0)
61
+ dropped.push(`panels (${read.invalid.join(' ')})`);
62
+ if (dropped.length > 0 && !quiet && typeof console !== 'undefined') {
55
63
  console.warn(`[kgdiff] ignoring invalid report view preferences: ${dropped.join(', ')}`);
56
64
  }
57
65
  return {
@@ -60,6 +68,7 @@ export function sanitizeView(view) {
60
68
  ...(theme ? { theme } : {}),
61
69
  ...(palette ? { palette } : {}),
62
70
  ...(locale ? { locale } : {}),
71
+ ...(panels ? { panels } : {}),
63
72
  };
64
73
  }
65
74
  //# sourceMappingURL=prefs.js.map
package/dist/prefs.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"prefs.js","sourceRoot":"","sources":["../src/prefs.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"prefs.js","sourceRoot":"","sources":["../src/prefs.ts"],"names":[],"mappings":"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"}