hmr-serve 0.1.6 → 0.1.7

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/bin/hmr-serve.js CHANGED
@@ -7,9 +7,19 @@
7
7
  // includes module load — same approach as Vite's own bin.
8
8
  globalThis.__hmr_serve_start = performance.now();
9
9
 
10
+ const argv = process.argv.slice(2);
11
+ // `--help` prints and exits from arg parsing. Don't leave a spinner over it.
12
+ const wantsHelp = argv.includes('-h') || argv.includes('--help');
13
+ if (!wantsHelp) {
14
+ // Status is a tiny module. Start the line before the CLI pulls in Vite.
15
+ const { getStartup } = await import('../dist/cli/status.js');
16
+ getStartup().set('Starting');
17
+ }
18
+
10
19
  const { run } = await import('../dist/cli/index.js');
11
20
 
12
- run(process.argv.slice(2)).catch((error) => {
21
+ run(argv).catch((error) => {
22
+ globalThis.__hmr_serve_status?.stop?.();
13
23
  console.error(`\n ${error instanceof Error ? error.message : String(error)}\n`);
14
24
  process.exitCode = 1;
15
25
  });
package/dist/cli/index.js CHANGED
@@ -2,7 +2,7 @@ import { statSync } from 'node:fs';
2
2
  import { resolve } from 'node:path';
3
3
  import { cac } from 'cac';
4
4
  import { printLaunchBanner } from './banner.js';
5
- import { createServer } from '../server/createServer.js';
5
+ import { getStartup } from './status.js';
6
6
  /** Pure arg parsing, split out so it can be unit-tested without a live server.
7
7
  * Throws `Error` with a user-facing message on invalid input. */
8
8
  export function parseArgs(argv) {
@@ -44,17 +44,35 @@ export function assertDirectory(targetDir) {
44
44
  }
45
45
  export async function run(argv) {
46
46
  const started = globalThis.__hmr_serve_start ?? performance.now();
47
- const args = parseArgs(argv);
48
- assertDirectory(args.targetDir);
49
- const server = await createServer({
50
- targetDir: args.targetDir,
51
- port: args.port,
52
- open: args.open,
53
- noNav: args.noNav,
54
- });
55
- await server.listen();
56
- const info = server.resolvedUrls?.local[0] ?? `http://localhost:${args.port}/`;
57
- printLaunchBanner(args.targetDir, info, performance.now() - started);
47
+ const startup = getStartup();
48
+ try {
49
+ const args = parseArgs(argv);
50
+ assertDirectory(args.targetDir);
51
+ // Before the Vite import and the folder scan — both can sit silent for a
52
+ // long time on a large directory.
53
+ startup.set('Starting');
54
+ const { createServer } = await import('../server/createServer.js');
55
+ const server = await createServer({
56
+ targetDir: args.targetDir,
57
+ port: args.port,
58
+ open: args.open,
59
+ noNav: args.noNav,
60
+ onStatus: (step, detail) => {
61
+ startup.set(step);
62
+ if (detail)
63
+ startup.progress(detail);
64
+ },
65
+ });
66
+ startup.set('Starting server');
67
+ await server.listen();
68
+ startup.stop();
69
+ const info = server.resolvedUrls?.local[0] ?? `http://localhost:${args.port}/`;
70
+ printLaunchBanner(args.targetDir, info, performance.now() - started);
71
+ }
72
+ catch (error) {
73
+ startup.stop();
74
+ throw error;
75
+ }
58
76
  }
59
77
  // Self-execute only when this module is the directly-run script (e.g.
60
78
  // `tsx src/cli/index.ts` in dev/e2e, or `node dist/cli/index.js`). The published
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /** A writable the startup line can render to. Tests pass a fake; the CLI uses stdout. */
2
+ export interface StatusStream {
3
+ isTTY?: boolean;
4
+ write(chunk: string): void;
5
+ }
6
+ export interface StartupStatus {
7
+ /** Current step. A repeat of the same step does not log again. */
8
+ set(step: string): void;
9
+ /** TTY-only suffix, e.g. "120 of 4381". Ignored when stdout is not a terminal. */
10
+ progress(detail: string): void;
11
+ /** Erase the spinner line. Safe to call more than once. */
12
+ stop(): void;
13
+ }
14
+ /** Visible text for one frame. `tick` 0, 1, 2 → one, two, three dots. */
15
+ export declare function statusFrame(step: string, detail: string | undefined, tick: number): string;
16
+ /**
17
+ * One-line startup feedback. On a TTY the dots cycle in place (`Starting.`
18
+ * `Starting..` `Starting...`). When stdout is piped, each step is printed once.
19
+ */
20
+ export declare function createStartupStatus(stream?: StatusStream): StartupStatus;
21
+ /** Process-wide status line so the bin can start it before the rest of the CLI loads. */
22
+ export declare function getStartup(): StartupStatus;
@@ -0,0 +1,93 @@
1
+ const DOT_MS = 200;
2
+ function useColor(stream) {
3
+ if (process.env.NO_COLOR != null && process.env.NO_COLOR !== '')
4
+ return false;
5
+ if (process.env.FORCE_COLOR != null && process.env.FORCE_COLOR !== '0')
6
+ return true;
7
+ return Boolean(stream.isTTY);
8
+ }
9
+ /** Visible text for one frame. `tick` 0, 1, 2 → one, two, three dots. */
10
+ export function statusFrame(step, detail, tick) {
11
+ const dots = '.'.repeat((tick % 3) + 1);
12
+ const extra = detail ? ` (${detail})` : '';
13
+ return ` ${step}${extra}${dots}`;
14
+ }
15
+ /**
16
+ * One-line startup feedback. On a TTY the dots cycle in place (`Starting.`
17
+ * `Starting..` `Starting...`). When stdout is piped, each step is printed once.
18
+ */
19
+ export function createStartupStatus(stream = process.stdout) {
20
+ const tty = Boolean(stream.isTTY);
21
+ const color = useColor(stream);
22
+ // Only the real terminal should claim Ctrl-C. Tests pass a fake stream.
23
+ const signals = stream === process.stdout;
24
+ let step = '';
25
+ let detail;
26
+ let tick = 0;
27
+ let timer;
28
+ let listening = false;
29
+ const onSigint = () => {
30
+ stop();
31
+ process.exit(130);
32
+ };
33
+ const paint = (text) => (color ? `\x1b[2m${text}\x1b[0m` : text);
34
+ const render = () => {
35
+ stream.write(`\r${paint(statusFrame(step, detail, tick))}\x1b[K`);
36
+ };
37
+ const ensureSpinning = () => {
38
+ if (!tty || timer)
39
+ return;
40
+ timer = setInterval(() => {
41
+ tick += 1;
42
+ render();
43
+ }, DOT_MS);
44
+ timer.unref?.();
45
+ if (signals && !listening) {
46
+ listening = true;
47
+ process.once('SIGINT', onSigint);
48
+ }
49
+ };
50
+ const stop = () => {
51
+ if (timer) {
52
+ clearInterval(timer);
53
+ timer = undefined;
54
+ }
55
+ if (listening) {
56
+ process.removeListener('SIGINT', onSigint);
57
+ listening = false;
58
+ }
59
+ if (tty && step)
60
+ stream.write('\r\x1b[K');
61
+ step = '';
62
+ detail = undefined;
63
+ };
64
+ return {
65
+ set(next) {
66
+ if (next === step)
67
+ return;
68
+ step = next;
69
+ detail = undefined;
70
+ tick = 0;
71
+ if (!tty) {
72
+ stream.write(`${paint(statusFrame(step, undefined, 2))}\n`);
73
+ return;
74
+ }
75
+ ensureSpinning();
76
+ render();
77
+ },
78
+ progress(next) {
79
+ if (!tty || !step)
80
+ return;
81
+ detail = next;
82
+ render();
83
+ },
84
+ stop,
85
+ };
86
+ }
87
+ /** Process-wide status line so the bin can start it before the rest of the CLI loads. */
88
+ export function getStartup() {
89
+ const g = globalThis;
90
+ g.__hmr_serve_status ??= createStartupStatus();
91
+ return g.__hmr_serve_status;
92
+ }
93
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/cli/status.ts"],"names":[],"mappings":"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"}
@@ -8,6 +8,8 @@ export interface CreateServerOptions {
8
8
  host?: string;
9
9
  /** Skip the Vue nav shell and serve files like `serve` (with HMR + MD/CSV/TSV). */
10
10
  noNav?: boolean;
11
+ /** Startup steps (indexing, and so on) for the CLI status line. */
12
+ onStatus?: (step: string, detail?: string) => void;
11
13
  }
12
14
  /**
13
15
  * Build (but do not start) a Vite dev server whose root is our app shell, with
@@ -36,7 +36,10 @@ export async function createServer(options) {
36
36
  // URLs — an unmatched path (e.g. a stray absolute link) should 404, not render
37
37
  // the whole app inside the content iframe.
38
38
  appType: 'mpa',
39
- plugins: [...(noNav ? [] : [vue()]), hmrServePlugin({ targetDir, noNav })],
39
+ plugins: [
40
+ ...(noNav ? [] : [vue()]),
41
+ hmrServePlugin({ targetDir, noNav, onStatus: options.onStatus }),
42
+ ],
40
43
  server: {
41
44
  port: options.port ?? 5183,
42
45
  host: options.host,
@@ -1 +1 @@
1
- {"version":3,"file":"createServer.js","sourceRoot":"","sources":["../../src/server/createServer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,YAAY,IAAI,gBAAgB,EAAsB,MAAM,MAAM,CAAC;AAC5E,OAAO,GAAG,MAAM,oBAAoB,CAAC;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAa7C;mFACmF;AACnF,SAAS,iBAAiB;IACxB,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACrD,0FAA0F;IAC1F,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAC;IACnD,OAAO,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC;AAClD,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAA4B;IAC7D,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;IAC5D,MAAM,UAAU,GAAG,iBAAiB,EAAE,CAAC;IACvC,8EAA8E;IAC9E,2EAA2E;IAC3E,MAAM,WAAW,GAAG,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IACjD,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAErC,OAAO,gBAAgB,CAAC;QACtB,IAAI,EAAE,UAAU;QAChB,UAAU,EAAE,KAAK;QACjB,+EAA+E;QAC/E,0EAA0E;QAC1E,+EAA+E;QAC/E,2CAA2C;QAC3C,OAAO,EAAE,KAAK;QACd,OAAO,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,cAAc,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;QAC1E,MAAM,EAAE;YACN,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,IAAI;YAC1B,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,KAAK;YAC3B,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,WAAW,EAAE,SAAS,CAAC,EAAE;SACxC;QACD,2EAA2E;QAC3E,OAAO,EAAE,KAAK;KACf,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"createServer.js","sourceRoot":"","sources":["../../src/server/createServer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,YAAY,IAAI,gBAAgB,EAAsB,MAAM,MAAM,CAAC;AAC5E,OAAO,GAAG,MAAM,oBAAoB,CAAC;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAe7C;mFACmF;AACnF,SAAS,iBAAiB;IACxB,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACrD,0FAA0F;IAC1F,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAC;IACnD,OAAO,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC;AAClD,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAA4B;IAC7D,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;IAC5D,MAAM,UAAU,GAAG,iBAAiB,EAAE,CAAC;IACvC,8EAA8E;IAC9E,2EAA2E;IAC3E,MAAM,WAAW,GAAG,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IACjD,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAErC,OAAO,gBAAgB,CAAC;QACtB,IAAI,EAAE,UAAU;QAChB,UAAU,EAAE,KAAK;QACjB,+EAA+E;QAC/E,0EAA0E;QAC1E,+EAA+E;QAC/E,2CAA2C;QAC3C,OAAO,EAAE,KAAK;QACd,OAAO,EAAE;YACP,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;YACzB,cAAc,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC;SACjE;QACD,MAAM,EAAE;YACN,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,IAAI;YAC1B,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,KAAK;YAC3B,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,WAAW,EAAE,SAAS,CAAC,EAAE;SACxC;QACD,2EAA2E;QAC3E,OAAO,EAAE,KAAK;KACf,CAAC,CAAC;AACL,CAAC"}
@@ -95,6 +95,39 @@ const PREVIEW_STYLES = `
95
95
  .markdown-body th, .markdown-body td { border-color: #d0d7de; }
96
96
  }
97
97
  .markdown-body th { font-weight: 600; background: rgba(255,255,255,0.04); }
98
+ .csv-preview [hidden] { display: none !important; }
99
+ .csv-pager {
100
+ position: sticky;
101
+ top: 0;
102
+ z-index: 2;
103
+ display: flex;
104
+ align-items: center;
105
+ gap: 8px;
106
+ margin: 0 0 12px;
107
+ padding: 8px 0;
108
+ background: #0d1117;
109
+ font-size: 13px;
110
+ line-height: 1.4;
111
+ }
112
+ .csv-pager button, .csv-pager select {
113
+ font: inherit;
114
+ color: #e6edf3;
115
+ background: #21262d;
116
+ border: 1px solid #30363d;
117
+ border-radius: 6px;
118
+ padding: 2px 8px;
119
+ }
120
+ .csv-pager button { cursor: pointer; }
121
+ .csv-pager button:disabled { opacity: 0.45; cursor: default; }
122
+ .csv-page-size { display: inline-flex; align-items: center; gap: 6px; margin-left: auto; }
123
+ @media (prefers-color-scheme: light) {
124
+ .csv-pager { background: #ffffff; }
125
+ .csv-pager button, .csv-pager select {
126
+ color: #1f2328;
127
+ background: #f6f8fa;
128
+ border-color: #d0d7de;
129
+ }
130
+ }
98
131
  .markdown-body pre {
99
132
  padding: 16px;
100
133
  overflow: auto;
@@ -142,8 +175,13 @@ const HIGHLIGHT_STYLES = `
142
175
  `;
143
176
  /** Wrap rendered markdown/csv/tsv HTML in a full document with live reload. */
144
177
  export function wrapPreviewHtml(title, bodyHtml) {
178
+ // Long CSV/TSV tables ship a pager. The module (Vite-served from the client
179
+ // root) applies the saved page size; markdown pages don't load it.
180
+ const csvPage = bodyHtml.includes('class="csv-pager"');
181
+ const csvAttr = csvPage ? ' data-csv-page="1"' : '';
182
+ const csvScript = csvPage ? '<script type="module" src="/csvPage.ts"></script>' : '';
145
183
  return `<!DOCTYPE html>
146
- <html lang="en">
184
+ <html lang="en"${csvAttr}>
147
185
  <head>
148
186
  <meta charset="utf-8" />
149
187
  <meta name="viewport" content="width=device-width, initial-scale=1" />
@@ -153,6 +191,7 @@ export function wrapPreviewHtml(title, bodyHtml) {
153
191
  </head>
154
192
  <body>
155
193
  <main class="markdown-body">${bodyHtml}</main>
194
+ ${csvScript}
156
195
  </body>
157
196
  </html>
158
197
  `;
@@ -1 +1 @@
1
- {"version":3,"file":"noNav.js","sourceRoot":"","sources":["../../src/server/noNav.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE3C;oEACoE;AACpE,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,YAAY,EAAE,WAAW,CAAU,CAAC;AAEhE;mEACmE;AACnE,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;AAE5E,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC;AAQxF,8EAA8E;AAC9E,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,MAAc;IAChD,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAC/B,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACrC,IAAI,CAAC;YACH,IAAI,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,EAAE;gBAAE,OAAO,SAAS,CAAC;QACzD,CAAC;QAAC,MAAM,CAAC;YACP,WAAW;QACb,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,iFAAiF;AACjF,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,MAAc,EAAE,OAAe;IACjE,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/D,MAAM,KAAK,GAAmB,EAAE,CAAC;IAEjC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;YAAE,SAAS;QAC5E,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,KAAK,CAAC,IAAI,CAAC;gBACT,IAAI,EAAE,GAAG,KAAK,CAAC,IAAI,GAAG;gBACtB,IAAI,EAAE,GAAG,KAAK,CAAC,IAAI,GAAG;gBACtB,IAAI,EAAE,WAAW;aAClB,CAAC,CAAC;QACL,CAAC;aAAM,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YAC1B,KAAK,CAAC,IAAI,CAAC;gBACT,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,IAAI,EAAE,MAAM;aACb,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAClB,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI;YAAE,OAAO,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9D,OAAO,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,MAAM,UAAU,GAAG,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACxE,IAAI,UAAU,KAAK,GAAG,EAAE,CAAC;QACvB,KAAK,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;IACjE,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAa;IACtC,OAAO,KAAK;SACT,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC7B,CAAC;AAED,iFAAiF;AACjF,MAAM,eAAe,GAAG,qDAAqD,CAAC;AAE9E,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0CtB,CAAC;AAEF;;;;;GAKG;AACH,MAAM,gBAAgB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2BxB,CAAC;AAEF,+EAA+E;AAC/E,MAAM,UAAU,eAAe,CAAC,KAAa,EAAE,QAAgB;IAC7D,OAAO;;;;;WAKE,UAAU,CAAC,KAAK,CAAC;IACxB,eAAe;WACR,cAAc,GAAG,gBAAgB;;;gCAGZ,QAAQ;;;CAGvC,CAAC;AACF,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,IAAI,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC;QAAE,OAAO,IAAI,CAAC;IAChD,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,SAAS,eAAe,EAAE,CAAC,CAAC;IAC7E,CAAC;IACD,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,aAAa,eAAe,SAAS,CAAC,CAAC;IACxF,CAAC;IACD,OAAO,GAAG,eAAe,KAAK,IAAI,EAAE,CAAC;AACvC,CAAC;AAED,0CAA0C;AAC1C,MAAM,UAAU,sBAAsB,CAAC,OAAe,EAAE,OAAuB;IAC7E,MAAM,WAAW,GAAG,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACzE,MAAM,KAAK,GAAG,YAAY,WAAW,EAAE,CAAC;IACxC,MAAM,QAAQ,GAAG,QAAQ,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,IAAI,GAAG,CAAC;IAE3E,MAAM,IAAI,GAAG,OAAO;SACjB,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACb,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACrC,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;QACzD,OAAO,kBAAkB,IAAI,cAAc,IAAI,KAAK,KAAK,WAAW,CAAC;IACvE,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,OAAO;;;;;WAKE,UAAU,CAAC,KAAK,CAAC;IACxB,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UAgCT,UAAU,CAAC,KAAK,CAAC;;EAEzB,IAAI;;kCAE4B,UAAU,CAAC,QAAQ,CAAC;;;;CAIrD,CAAC;AACF,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,GAAW;IAC5C,OAAO,kBAAkB,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;AACnD,CAAC"}
1
+ {"version":3,"file":"noNav.js","sourceRoot":"","sources":["../../src/server/noNav.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE3C;oEACoE;AACpE,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,YAAY,EAAE,WAAW,CAAU,CAAC;AAEhE;mEACmE;AACnE,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;AAE5E,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC;AAQxF,8EAA8E;AAC9E,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,MAAc;IAChD,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAC/B,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACrC,IAAI,CAAC;YACH,IAAI,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,EAAE;gBAAE,OAAO,SAAS,CAAC;QACzD,CAAC;QAAC,MAAM,CAAC;YACP,WAAW;QACb,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,iFAAiF;AACjF,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,MAAc,EAAE,OAAe;IACjE,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/D,MAAM,KAAK,GAAmB,EAAE,CAAC;IAEjC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;YAAE,SAAS;QAC5E,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,KAAK,CAAC,IAAI,CAAC;gBACT,IAAI,EAAE,GAAG,KAAK,CAAC,IAAI,GAAG;gBACtB,IAAI,EAAE,GAAG,KAAK,CAAC,IAAI,GAAG;gBACtB,IAAI,EAAE,WAAW;aAClB,CAAC,CAAC;QACL,CAAC;aAAM,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YAC1B,KAAK,CAAC,IAAI,CAAC;gBACT,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,IAAI,EAAE,MAAM;aACb,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAClB,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI;YAAE,OAAO,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9D,OAAO,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,MAAM,UAAU,GAAG,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACxE,IAAI,UAAU,KAAK,GAAG,EAAE,CAAC;QACvB,KAAK,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;IACjE,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAa;IACtC,OAAO,KAAK;SACT,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC7B,CAAC;AAED,iFAAiF;AACjF,MAAM,eAAe,GAAG,qDAAqD,CAAC;AAE9E,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2EtB,CAAC;AAEF;;;;;GAKG;AACH,MAAM,gBAAgB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2BxB,CAAC;AAEF,+EAA+E;AAC/E,MAAM,UAAU,eAAe,CAAC,KAAa,EAAE,QAAgB;IAC7D,4EAA4E;IAC5E,mEAAmE;IACnE,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC;IACvD,MAAM,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,EAAE,CAAC;IACpD,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,mDAAmD,CAAC,CAAC,CAAC,EAAE,CAAC;IACrF,OAAO;iBACQ,OAAO;;;;WAIb,UAAU,CAAC,KAAK,CAAC;IACxB,eAAe;WACR,cAAc,GAAG,gBAAgB;;;gCAGZ,QAAQ;IACpC,SAAS;;;CAGZ,CAAC;AACF,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,IAAI,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC;QAAE,OAAO,IAAI,CAAC;IAChD,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,SAAS,eAAe,EAAE,CAAC,CAAC;IAC7E,CAAC;IACD,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,aAAa,eAAe,SAAS,CAAC,CAAC;IACxF,CAAC;IACD,OAAO,GAAG,eAAe,KAAK,IAAI,EAAE,CAAC;AACvC,CAAC;AAED,0CAA0C;AAC1C,MAAM,UAAU,sBAAsB,CAAC,OAAe,EAAE,OAAuB;IAC7E,MAAM,WAAW,GAAG,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACzE,MAAM,KAAK,GAAG,YAAY,WAAW,EAAE,CAAC;IACxC,MAAM,QAAQ,GAAG,QAAQ,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,IAAI,GAAG,CAAC;IAE3E,MAAM,IAAI,GAAG,OAAO;SACjB,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACb,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACrC,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;QACzD,OAAO,kBAAkB,IAAI,cAAc,IAAI,KAAK,KAAK,WAAW,CAAC;IACvE,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,OAAO;;;;;WAKE,UAAU,CAAC,KAAK,CAAC;IACxB,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UAgCT,UAAU,CAAC,KAAK,CAAC;;EAEzB,IAAI;;kCAE4B,UAAU,CAAC,QAAQ,CAAC;;;;CAIrD,CAAC;AACF,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,GAAW;IAC5C,OAAO,kBAAkB,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;AACnD,CAAC"}
@@ -8,6 +8,8 @@ export interface HmrServePluginOptions {
8
8
  registry?: RendererRegistry;
9
9
  /** Serve files directly (like `serve`) instead of the Vue nav shell. */
10
10
  noNav?: boolean;
11
+ /** Reports slow startup steps (the initial search-index scan) to the CLI. */
12
+ onStatus?: (step: string, detail?: string) => void;
11
13
  }
12
14
  /**
13
15
  * The hmr-serve Vite plugin. Owns the search index + file watcher and exposes
@@ -67,6 +67,7 @@ export function hmrServePlugin(options) {
67
67
  const targetDir = options.targetDir;
68
68
  const registry = options.registry ?? new RendererRegistry();
69
69
  const noNav = Boolean(options.noNav);
70
+ const onStatus = options.onStatus;
70
71
  const index = new SearchIndex();
71
72
  // Content is routed under this prefix (the folder's name) so bookmarkable URLs
72
73
  // like /aurora-notes/docs/intro.md never collide with the shell's root assets.
@@ -121,13 +122,25 @@ export function hmrServePlugin(options) {
121
122
  }
122
123
  // —— Nav mode (default): Vue shell + JSON APIs ————————————————————————
123
124
  // 1. Initial index scan. Binary files (image/video) are indexed by name
124
- // only — never read as text.
125
+ // only — never read as text. This walk is the long silent stretch on a
126
+ // big folder, so report it on the CLI status line.
127
+ onStatus?.('Indexing files');
125
128
  const files = await listSupportedFiles(targetDir, registry);
126
- await Promise.all(files.map(async (rel) => {
127
- const ext = extOf(rel);
128
- const raw = registry.isText(ext) ? await readFileText(resolve(targetDir, rel)) : '';
129
- index.add(rel, ext, raw);
130
- }));
129
+ const total = files.length;
130
+ if (total > 0) {
131
+ const count = (n) => n.toLocaleString('en-US');
132
+ onStatus?.('Indexing files', `0 of ${count(total)}`);
133
+ let done = 0;
134
+ await Promise.all(files.map(async (rel) => {
135
+ const ext = extOf(rel);
136
+ const raw = registry.isText(ext) ? await readFileText(resolve(targetDir, rel)) : '';
137
+ index.add(rel, ext, raw);
138
+ done += 1;
139
+ if (done === total || done % 50 === 0) {
140
+ onStatus?.('Indexing files', `${count(done)} of ${count(total)}`);
141
+ }
142
+ }));
143
+ }
131
144
  // 2. Reuse Vite's chokidar watcher (single source of truth) for the target.
132
145
  const emit = (update) => {
133
146
  server.ws.send({ type: 'custom', event: HMR_UPDATE_EVENT, data: update });
@@ -268,7 +281,9 @@ async function handleNoNavRequest(req, res, next, ctx) {
268
281
  if (pathname.startsWith('/@') ||
269
282
  pathname.startsWith('/node_modules/') ||
270
283
  pathname.startsWith('/__vite') ||
271
- pathname.startsWith(API_BASE)) {
284
+ pathname.startsWith(API_BASE) ||
285
+ // CSV preview pages load this from the Vite client root to paginate tables.
286
+ pathname === '/csvPage.ts') {
272
287
  return next();
273
288
  }
274
289
  const rel = pathname === '/' ? '' : pathname.replace(/^\/+/, '');
@@ -316,7 +331,10 @@ async function serveNoNavFile(res, ctx, abs) {
316
331
  const ext = extOf(rel);
317
332
  if (isPreviewExtension(ext) && ctx.registry.supports(ext)) {
318
333
  const raw = await readFileText(abs);
319
- const result = ctx.registry.render({ path: rel, ext, raw });
334
+ // The preview page is served at the markdown file's own URL, so relative
335
+ // image paths already resolve. Rewriting them to /__hmrserve/raw/ (which
336
+ // this mode does not mount) would 404 every image.
337
+ const result = ctx.registry.render({ path: rel, ext, raw, rewriteAssets: false });
320
338
  const body = result.html ?? '';
321
339
  sendHtml(res, 200, wrapPreviewHtml(result.title || basenameFallback(rel), body));
322
340
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/server/plugin.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/server/plugin.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { basename } from 'node:path';
2
+ import { CSV_PAGE_SIZE_ALL, CSV_PAGE_SIZE_DEFAULT, CSV_PAGE_SIZES, csvPageWindow, csvPagerVisible, } from '../../shared/csvPage.js';
2
3
  function escapeHtml(value) {
3
4
  return value.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
4
5
  }
@@ -51,6 +52,24 @@ export function parseDelimited(raw, delimiter) {
51
52
  rows.push(row);
52
53
  return rows;
53
54
  }
55
+ /** Pager markup. The client shows one page and reads the saved rows-per-page preference. */
56
+ function renderPager(rowCount) {
57
+ const { start, end, pageCount } = csvPageWindow(rowCount, 1, CSV_PAGE_SIZE_DEFAULT);
58
+ const options = [
59
+ ...CSV_PAGE_SIZES.map((size) => {
60
+ const selected = size === CSV_PAGE_SIZE_DEFAULT ? ' selected' : '';
61
+ return `<option value="${size}"${selected}>${size}</option>`;
62
+ }),
63
+ `<option value="${CSV_PAGE_SIZE_ALL}">All</option>`,
64
+ ].join('');
65
+ const nextDisabled = pageCount <= 1 ? ' disabled' : '';
66
+ return (`<nav class="csv-pager" data-testid="csv-pager" aria-label="Pagination">` +
67
+ `<button type="button" data-csv-prev aria-label="Previous page" disabled>Prev</button>` +
68
+ `<span data-csv-status aria-live="polite">${start + 1}–${end} of ${rowCount}</span>` +
69
+ `<button type="button" data-csv-next aria-label="Next page"${nextDisabled}>Next</button>` +
70
+ `<label class="csv-page-size">Rows <select data-csv-size data-testid="csv-pager-size" aria-label="Rows per page">${options}</select></label>` +
71
+ `</nav>`);
72
+ }
54
73
  function renderTable(rows) {
55
74
  if (rows.length === 0)
56
75
  return '<p><em>(empty file)</em></p>';
@@ -63,11 +82,20 @@ function renderTable(rows) {
63
82
  });
64
83
  const header = normalized[0];
65
84
  const body = normalized.slice(1);
85
+ const paginate = csvPagerVisible(body.length);
66
86
  const thead = `<thead><tr>${header.map((c) => `<th>${escapeHtml(c)}</th>`).join('')}</tr></thead>`;
67
87
  const tbody = body.length > 0
68
- ? `<tbody>${body.map((r) => `<tr>${r.map((c) => `<td>${escapeHtml(c)}</td>`).join('')}</tr>`).join('')}</tbody>`
88
+ ? `<tbody>${body
89
+ .map((r, index) => {
90
+ // Past the default page, start hidden so a long file doesn't flash every row
91
+ // before the client applies the saved page size.
92
+ const hidden = paginate && index >= CSV_PAGE_SIZE_DEFAULT ? ' hidden' : '';
93
+ return `<tr${hidden}>${r.map((c) => `<td>${escapeHtml(c)}</td>`).join('')}</tr>`;
94
+ })
95
+ .join('')}</tbody>`
69
96
  : '';
70
- return `<table>${thead}${tbody}</table>`;
97
+ const pager = paginate ? renderPager(body.length) : '';
98
+ return `<div class="csv-preview" data-csv-page="1" data-csv-page-size="${CSV_PAGE_SIZE_DEFAULT}">${pager}<table>${thead}${tbody}</table></div>`;
71
99
  }
72
100
  export const csvRenderer = {
73
101
  extensions: ['csv', 'tsv'],
@@ -1 +1 @@
1
- {"version":3,"file":"csv.js","sourceRoot":"","sources":["../../../src/server/renderers/csv.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"csv.js","sourceRoot":"","sources":["../../../src/server/renderers/csv.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,24 @@ import { createRequire } from 'node:module';
4
4
  import { basename, posix } from 'node:path';
5
5
  /** Where the server streams raw file bytes (mirror of the plugin's raw route). */
6
6
  const RAW_BASE = '/__hmrserve/raw/';
7
+ /**
8
+ * markdown-it percent-encodes link destinations (spaces, non-ASCII) before they
9
+ * land in `src`. Decode each segment first so a later encodeURIComponent does
10
+ * not turn `%20` into `%2520` — the browser would then 404.
11
+ */
12
+ function decodePath(path) {
13
+ return path
14
+ .split('/')
15
+ .map((segment) => {
16
+ try {
17
+ return decodeURIComponent(segment);
18
+ }
19
+ catch {
20
+ return segment;
21
+ }
22
+ })
23
+ .join('/');
24
+ }
7
25
  /**
8
26
  * Rendered markdown is injected into the app-shell DOM (not an iframe), so a
9
27
  * relative `<img src="pic.png">` would resolve against the shell URL and 404.
@@ -21,7 +39,7 @@ function resolveAssetUrl(mdDir, value) {
21
39
  const cut = v.search(/[?#]/);
22
40
  const pathPart = cut >= 0 ? v.slice(0, cut) : v;
23
41
  const suffix = cut >= 0 ? v.slice(cut) : '';
24
- const resolved = posix.normalize(posix.join(mdDir, pathPart));
42
+ const resolved = posix.normalize(posix.join(mdDir, decodePath(pathPart)));
25
43
  // Never point outside the served root.
26
44
  if (resolved.startsWith('..'))
27
45
  return value;
@@ -67,11 +85,12 @@ function deriveTitle(raw, path) {
67
85
  export const markdownRenderer = {
68
86
  extensions: ['md', 'markdown'],
69
87
  category: 'markdown',
70
- render({ raw, path }) {
88
+ render({ raw, path, rewriteAssets = true }) {
71
89
  const mdDir = posix.dirname(path); // '.' at the root
90
+ const html = md.render(raw);
72
91
  return {
73
92
  kind: 'html',
74
- html: rewriteRelativeAssets(md.render(raw), mdDir === '.' ? '' : mdDir),
93
+ html: rewriteAssets ? rewriteRelativeAssets(html, mdDir === '.' ? '' : mdDir) : html,
75
94
  title: deriveTitle(raw, path),
76
95
  };
77
96
  },
@@ -1 +1 @@
1
- {"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../../src/server/renderers/markdown.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../../src/server/renderers/markdown.ts"],"names":[],"mappings":"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"}
@@ -6,6 +6,13 @@ export interface RenderInput {
6
6
  ext: string;
7
7
  /** Raw file contents. */
8
8
  raw: string;
9
+ /**
10
+ * When false, relative asset URLs in rendered markdown are left as written.
11
+ * The nav shell rewrites them (default) because the HTML is injected into the
12
+ * app page; `--no-nav` serves the page at the file's own URL, so relatives
13
+ * already resolve.
14
+ */
15
+ rewriteAssets?: boolean;
9
16
  }
10
17
  export interface RenderResult {
11
18
  kind: RenderKind;
@@ -0,0 +1,21 @@
1
+ /** Rows-per-page choices for CSV/TSV previews. `0` means show every row. */
2
+ export declare const CSV_PAGE_SIZES: readonly [25, 50, 100, 250];
3
+ export declare const CSV_PAGE_SIZE_DEFAULT = 50;
4
+ export declare const CSV_PAGE_SIZE_ALL = 0;
5
+ /** Smallest selectable page. Tables at or under this stay a single unpaged table. */
6
+ export declare function csvPageSizeMin(): number;
7
+ /** True when a table is long enough that the pager (and its page-size control) is useful. */
8
+ export declare function csvPagerVisible(rowCount: number): boolean;
9
+ /** Coerce a stored or selected value to a known page size. Anything else falls back to the default. */
10
+ export declare function normalizeCsvPageSize(value: unknown): number;
11
+ export interface CsvPageWindow {
12
+ /** 1-based page, clamped into range. */
13
+ page: number;
14
+ /** Inclusive row index. */
15
+ start: number;
16
+ /** Exclusive row index. */
17
+ end: number;
18
+ pageCount: number;
19
+ }
20
+ /** Slice a body-row count into one page. `pageSize <= 0` shows every row. */
21
+ export declare function csvPageWindow(rowCount: number, page: number, pageSize: number): CsvPageWindow;
@@ -0,0 +1,33 @@
1
+ /** Rows-per-page choices for CSV/TSV previews. `0` means show every row. */
2
+ export const CSV_PAGE_SIZES = [25, 50, 100, 250];
3
+ export const CSV_PAGE_SIZE_DEFAULT = 50;
4
+ export const CSV_PAGE_SIZE_ALL = 0;
5
+ const PAGE_SIZES = CSV_PAGE_SIZES;
6
+ /** Smallest selectable page. Tables at or under this stay a single unpaged table. */
7
+ export function csvPageSizeMin() {
8
+ return Math.min(...CSV_PAGE_SIZES);
9
+ }
10
+ /** True when a table is long enough that the pager (and its page-size control) is useful. */
11
+ export function csvPagerVisible(rowCount) {
12
+ return rowCount > csvPageSizeMin();
13
+ }
14
+ /** Coerce a stored or selected value to a known page size. Anything else falls back to the default. */
15
+ export function normalizeCsvPageSize(value) {
16
+ if (value === CSV_PAGE_SIZE_ALL || value === '0')
17
+ return CSV_PAGE_SIZE_ALL;
18
+ const n = typeof value === 'number' ? value : typeof value === 'string' ? Number(value) : NaN;
19
+ if (PAGE_SIZES.includes(n))
20
+ return n;
21
+ return CSV_PAGE_SIZE_DEFAULT;
22
+ }
23
+ /** Slice a body-row count into one page. `pageSize <= 0` shows every row. */
24
+ export function csvPageWindow(rowCount, page, pageSize) {
25
+ if (rowCount <= 0)
26
+ return { page: 1, start: 0, end: 0, pageCount: 1 };
27
+ const size = pageSize > 0 ? pageSize : rowCount;
28
+ const pageCount = Math.max(1, Math.ceil(rowCount / size));
29
+ const current = Math.min(Math.max(1, Math.floor(page) || 1), pageCount);
30
+ const start = (current - 1) * size;
31
+ return { page: current, start, end: Math.min(start + size, rowCount), pageCount };
32
+ }
33
+ //# sourceMappingURL=csvPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"csvPage.js","sourceRoot":"","sources":["../../src/shared/csvPage.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,CAAU,CAAC;AAC1D,MAAM,CAAC,MAAM,qBAAqB,GAAG,EAAE,CAAC;AACxC,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAEnC,MAAM,UAAU,GAAsB,cAAc,CAAC;AAErD,qFAAqF;AACrF,MAAM,UAAU,cAAc;IAC5B,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC,CAAC;AACrC,CAAC;AAED,6FAA6F;AAC7F,MAAM,UAAU,eAAe,CAAC,QAAgB;IAC9C,OAAO,QAAQ,GAAG,cAAc,EAAE,CAAC;AACrC,CAAC;AAED,uGAAuG;AACvG,MAAM,UAAU,oBAAoB,CAAC,KAAc;IACjD,IAAI,KAAK,KAAK,iBAAiB,IAAI,KAAK,KAAK,GAAG;QAAE,OAAO,iBAAiB,CAAC;IAC3E,MAAM,CAAC,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IAC9F,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IACrC,OAAO,qBAAqB,CAAC;AAC/B,CAAC;AAYD,6EAA6E;AAC7E,MAAM,UAAU,aAAa,CAAC,QAAgB,EAAE,IAAY,EAAE,QAAgB;IAC5E,IAAI,QAAQ,IAAI,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;IACtE,MAAM,IAAI,GAAG,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;IAChD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC;IAC1D,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IACxE,MAAM,KAAK,GAAG,CAAC,OAAO,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC;IACnC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,IAAI,EAAE,QAAQ,CAAC,EAAE,SAAS,EAAE,CAAC;AACpF,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hmr-serve",
3
- "version": "0.1.6",
3
+ "version": "0.1.7",
4
4
  "description": "Point at any folder and review it live in the browser — VSCode-style file tree + content pane, powered by Vite's dev server and HMR client.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -15,9 +15,11 @@
15
15
  :visible="visibleCategories"
16
16
  :show-other-files="showOtherFiles"
17
17
  :theme="theme"
18
+ :csv-page-size="csvPageSize"
18
19
  @change="onCategoriesChange"
19
20
  @update:show-other-files="onShowOtherFilesChange"
20
21
  @update:theme="onThemeChange"
22
+ @update:csv-page-size="onCsvPageSize"
21
23
  />
22
24
  <button
23
25
  type="button"
@@ -113,7 +115,9 @@
113
115
  :path="selectedPath"
114
116
  :selectable-extensions="allowedExtensions"
115
117
  :supported-extensions="supportedExtensions"
118
+ :csv-page-size="csvPageSize"
116
119
  @navigate="onFrameNavigate"
120
+ @update:csv-page-size="onCsvPageSize"
117
121
  />
118
122
  </main>
119
123
  </div>
@@ -121,10 +125,12 @@
121
125
 
122
126
  <script lang="ts">
123
127
  import { defineComponent } from 'vue';
128
+ import { normalizeCsvPageSize } from '../shared/csvPage';
124
129
  import type { CategoryInfo, FileCategory, FileNode, SearchHit } from '../shared/types';
125
130
  import { fetchConfig, fetchTree, search } from './api';
126
131
  import { onFileUpdate } from './hmr';
127
132
  import { hrefFor, isPlainNavClick, readPath, writePath } from './router';
133
+ import { loadCsvPageSize, saveCsvPageSize } from './csvPage';
128
134
  import {
129
135
  SIDEBAR_DEFAULT_WIDTH,
130
136
  clampSidebarWidth,
@@ -151,6 +157,7 @@ interface AppData {
151
157
  categories: CategoryInfo[];
152
158
  visibleCategories: FileCategory[];
153
159
  showOtherFiles: boolean;
160
+ csvPageSize: number;
154
161
  theme: Theme;
155
162
  sidebarCollapsed: boolean;
156
163
  sidebarWidth: number;
@@ -203,6 +210,7 @@ export default defineComponent({
203
210
  categories: [],
204
211
  visibleCategories: [],
205
212
  showOtherFiles: false,
213
+ csvPageSize: loadCsvPageSize(),
206
214
  theme: loadTheme(),
207
215
  sidebarCollapsed: false,
208
216
  sidebarWidth: SIDEBAR_DEFAULT_WIDTH,
@@ -310,6 +318,10 @@ export default defineComponent({
310
318
  saveTheme(theme);
311
319
  applyTheme(theme);
312
320
  },
321
+ onCsvPageSize(size: number): void {
322
+ this.csvPageSize = normalizeCsvPageSize(size);
323
+ saveCsvPageSize(this.csvPageSize);
324
+ },
313
325
  toggleSidebar(): void {
314
326
  this.sidebarCollapsed = !this.sidebarCollapsed;
315
327
  saveSidebarCollapsed(this.mount, this.sidebarCollapsed);
@@ -162,8 +162,10 @@
162
162
 
163
163
  <script lang="ts">
164
164
  import { defineComponent, type PropType, nextTick } from 'vue';
165
+ import { CSV_PAGE_SIZE_DEFAULT } from '../../shared/csvPage';
165
166
  import type { RenderedFile } from '../../shared/types';
166
167
  import { fetchFile, fetchRawText } from '../api';
168
+ import { bindCsvPreview } from '../csvPage';
167
169
  import { onFileUpdate } from '../hmr';
168
170
 
169
171
  const RAW_PREFIX = '/__hmrserve/raw/';
@@ -249,11 +251,14 @@ export default defineComponent({
249
251
  selectableExtensions: { type: Array as PropType<string[]>, default: () => [] },
250
252
  // Extensions with a renderer — anything else shows a not-supported message.
251
253
  supportedExtensions: { type: Array as PropType<string[]>, default: () => [] },
254
+ /** Saved CSV/TSV rows per page. The table's own control updates this too. */
255
+ csvPageSize: { type: Number, default: CSV_PAGE_SIZE_DEFAULT },
252
256
  },
253
257
  emits: {
254
258
  // Raised when the iframe navigates itself (a user clicked a link inside a
255
259
  // framed doc) so the app can update its selection + URL.
256
260
  navigate: (path: string) => typeof path === 'string',
261
+ 'update:csvPageSize': (value: number) => typeof value === 'number',
257
262
  },
258
263
  data(): ContentPaneData {
259
264
  return {
@@ -316,6 +321,9 @@ export default defineComponent({
316
321
  supportedExtensions(): void {
317
322
  if (this.path) void this.load(this.path);
318
323
  },
324
+ csvPageSize(): void {
325
+ this.mountCsvPager();
326
+ },
319
327
  },
320
328
  mounted(): void {
321
329
  document.addEventListener('keydown', this.onKeyDown);
@@ -387,12 +395,23 @@ export default defineComponent({
387
395
  setMode(mode: PaneMode): void {
388
396
  this.mode = mode;
389
397
  if (mode === 'code' && this.path) void this.loadSource(this.path);
390
- if (mode === 'view' && this.file?.kind === 'iframe' && this.file.src) {
398
+ if (mode === 'view') {
391
399
  void nextTick().then(() => {
392
- if (this.file?.src) this.navigateFrame(this.withVersion(this.file.src));
400
+ this.mountCsvPager();
401
+ if (this.file?.kind === 'iframe' && this.file.src) {
402
+ this.navigateFrame(this.withVersion(this.file.src));
403
+ }
393
404
  });
394
405
  }
395
406
  },
407
+ /** Page a rendered CSV/TSV table to the current rows-per-page setting. */
408
+ mountCsvPager(): void {
409
+ const root = this.$el as HTMLElement | undefined;
410
+ if (!root || this.mode !== 'view') return;
411
+ bindCsvPreview(root, this.csvPageSize, (size) => {
412
+ this.$emit('update:csvPageSize', size);
413
+ });
414
+ },
396
415
  toggleFullscreen(): void {
397
416
  this.fullscreen = !this.fullscreen;
398
417
  },
@@ -455,6 +474,8 @@ export default defineComponent({
455
474
  this.file = file;
456
475
  // Gate the PDF viewer behind a placeholder until its iframe fires `load`.
457
476
  this.setPdfLoading(file.kind === 'pdf');
477
+ await nextTick();
478
+ this.mountCsvPager();
458
479
  if (this.mode === 'code') {
459
480
  void this.loadSource(path);
460
481
  this.framedPath = null;
@@ -51,6 +51,20 @@
51
51
  <button type="button" @click="setAll(false)">None</button>
52
52
  </div>
53
53
  <div class="settings-divider" role="separator"></div>
54
+ <div class="settings-title">Tables</div>
55
+ <label class="settings-row settings-page-size">
56
+ <span>Rows per page</span>
57
+ <select
58
+ :value="csvPageSize"
59
+ data-testid="csv-page-size"
60
+ aria-label="CSV rows per page"
61
+ @change="onCsvPageSizeChange"
62
+ >
63
+ <option v-for="size in pageSizes" :key="size" :value="size">{{ size }}</option>
64
+ <option :value="pageSizeAll">All</option>
65
+ </select>
66
+ </label>
67
+ <div class="settings-divider" role="separator"></div>
54
68
  <div class="settings-title">Appearance</div>
55
69
  <div class="settings-actions theme-actions">
56
70
  <button
@@ -109,6 +123,7 @@
109
123
 
110
124
  <script lang="ts">
111
125
  import { defineComponent, type PropType } from 'vue';
126
+ import { CSV_PAGE_SIZE_ALL, CSV_PAGE_SIZES, normalizeCsvPageSize } from '../../shared/csvPage';
112
127
  import type { CategoryInfo, FileCategory } from '../../shared/types';
113
128
  import type { Theme } from '../theme';
114
129
 
@@ -119,14 +134,16 @@ export default defineComponent({
119
134
  visible: { type: Array as PropType<FileCategory[]>, required: true },
120
135
  showOtherFiles: { type: Boolean, default: false },
121
136
  theme: { type: String as PropType<Theme>, default: 'dark' },
137
+ csvPageSize: { type: Number, default: 50 },
122
138
  },
123
139
  emits: {
124
140
  change: (value: FileCategory[]) => Array.isArray(value),
125
141
  'update:showOtherFiles': (value: boolean) => typeof value === 'boolean',
126
142
  'update:theme': (value: Theme) => value === 'dark' || value === 'light',
143
+ 'update:csvPageSize': (value: number) => typeof value === 'number',
127
144
  },
128
145
  data() {
129
- return { open: false };
146
+ return { open: false, pageSizes: CSV_PAGE_SIZES, pageSizeAll: CSV_PAGE_SIZE_ALL };
130
147
  },
131
148
  beforeUnmount(): void {
132
149
  document.removeEventListener('mousedown', this.onDocMouseDown);
@@ -151,6 +168,11 @@ export default defineComponent({
151
168
  setTheme(theme: Theme): void {
152
169
  this.$emit('update:theme', theme);
153
170
  },
171
+ onCsvPageSizeChange(event: Event): void {
172
+ const select = event.target;
173
+ if (!(select instanceof HTMLSelectElement)) return;
174
+ this.$emit('update:csvPageSize', normalizeCsvPageSize(select.value));
175
+ },
154
176
  toggleOpen(): void {
155
177
  this.open = !this.open;
156
178
  if (this.open) document.addEventListener('mousedown', this.onDocMouseDown);
@@ -0,0 +1,125 @@
1
+ import {
2
+ CSV_PAGE_SIZE_DEFAULT,
3
+ csvPageWindow,
4
+ csvPagerVisible,
5
+ normalizeCsvPageSize,
6
+ } from '../shared/csvPage';
7
+
8
+ /** Global (like theme): one rows-per-page preference for every CSV/TSV preview. */
9
+ const CSV_PAGE_SIZE_KEY = 'hmr-serve:csv-page-size';
10
+
11
+ /** Saved CSV/TSV rows per page. Unset, corrupt, or unknown values use the default. */
12
+ export function loadCsvPageSize(): number {
13
+ try {
14
+ const raw = localStorage.getItem(CSV_PAGE_SIZE_KEY);
15
+ if (raw == null) return CSV_PAGE_SIZE_DEFAULT;
16
+ return normalizeCsvPageSize(raw);
17
+ } catch {
18
+ return CSV_PAGE_SIZE_DEFAULT;
19
+ }
20
+ }
21
+
22
+ export function saveCsvPageSize(size: number): void {
23
+ try {
24
+ localStorage.setItem(CSV_PAGE_SIZE_KEY, String(normalizeCsvPageSize(size)));
25
+ } catch {
26
+ // Ignore storage failures — the choice still applies in-session.
27
+ }
28
+ }
29
+
30
+ /**
31
+ * Show one page of a rendered CSV/TSV table. The server emits every row (rows
32
+ * past the default page start hidden); this adjusts that window to the saved
33
+ * page size and wires Prev/Next plus the rows-per-page control.
34
+ *
35
+ * Safe to call again after a re-render or a settings change: listeners attach
36
+ * once, and a changed page size returns to page 1.
37
+ */
38
+ export function bindCsvPreview(
39
+ root: ParentNode,
40
+ pageSize: number,
41
+ onPageSizeChange?: (size: number) => void,
42
+ ): void {
43
+ const preview = root.querySelector('.csv-preview');
44
+ if (!(preview instanceof HTMLElement)) return;
45
+ const pager = preview.querySelector('.csv-pager');
46
+ if (!(pager instanceof HTMLElement)) return;
47
+
48
+ const nextSize = String(normalizeCsvPageSize(pageSize));
49
+ const previousSize = preview.dataset.csvPageSize;
50
+ if (previousSize != null && previousSize !== nextSize) preview.dataset.csvPage = '1';
51
+ preview.dataset.csvPageSize = nextSize;
52
+
53
+ const select = preview.querySelector('[data-csv-size]');
54
+ if (select instanceof HTMLSelectElement && select.value !== nextSize) select.value = nextSize;
55
+
56
+ if (preview.dataset.csvBound !== '1') {
57
+ preview.dataset.csvBound = '1';
58
+ preview.querySelector('[data-csv-prev]')?.addEventListener('click', () => {
59
+ preview.dataset.csvPage = String(readPage(preview) - 1);
60
+ applyCsvPage(preview);
61
+ });
62
+ preview.querySelector('[data-csv-next]')?.addEventListener('click', () => {
63
+ preview.dataset.csvPage = String(readPage(preview) + 1);
64
+ applyCsvPage(preview);
65
+ });
66
+ select?.addEventListener('change', () => {
67
+ if (!(select instanceof HTMLSelectElement)) return;
68
+ const size = normalizeCsvPageSize(select.value);
69
+ saveCsvPageSize(size);
70
+ preview.dataset.csvPageSize = String(size);
71
+ preview.dataset.csvPage = '1';
72
+ applyCsvPage(preview);
73
+ onPageSizeChange?.(size);
74
+ });
75
+ }
76
+
77
+ applyCsvPage(preview);
78
+ }
79
+
80
+ function readPage(preview: HTMLElement): number {
81
+ const page = Number(preview.dataset.csvPage);
82
+ return Number.isInteger(page) && page >= 1 ? page : 1;
83
+ }
84
+
85
+ function applyCsvPage(preview: HTMLElement): void {
86
+ const rows = Array.from(preview.querySelectorAll('tbody tr'));
87
+ const pager = preview.querySelector('.csv-pager');
88
+ const pageSize = normalizeCsvPageSize(preview.dataset.csvPageSize);
89
+
90
+ if (!(pager instanceof HTMLElement) || !csvPagerVisible(rows.length)) {
91
+ if (pager instanceof HTMLElement) pager.hidden = true;
92
+ for (const row of rows) if (row instanceof HTMLElement) row.hidden = false;
93
+ return;
94
+ }
95
+
96
+ pager.hidden = false;
97
+ const span = csvPageWindow(rows.length, readPage(preview), pageSize);
98
+ preview.dataset.csvPage = String(span.page);
99
+
100
+ rows.forEach((row, index) => {
101
+ if (row instanceof HTMLElement) row.hidden = index < span.start || index >= span.end;
102
+ });
103
+
104
+ const status = preview.querySelector('[data-csv-status]');
105
+ if (status) {
106
+ const from = span.end === 0 ? 0 : span.start + 1;
107
+ status.textContent = `${from}–${span.end} of ${rows.length}`;
108
+ }
109
+
110
+ const prev = preview.querySelector('[data-csv-prev]');
111
+ const next = preview.querySelector('[data-csv-next]');
112
+ if (prev instanceof HTMLButtonElement) prev.disabled = span.page <= 1;
113
+ if (next instanceof HTMLButtonElement) next.disabled = span.page >= span.pageCount;
114
+ }
115
+
116
+ /** `--no-nav` preview pages set `data-csv-page` and load this module directly. */
117
+ function bootStandaloneCsvPage(): void {
118
+ if (typeof document === 'undefined') return;
119
+ if (document.documentElement.dataset.csvPage !== '1') return;
120
+ const start = (): void => bindCsvPreview(document, loadCsvPageSize());
121
+ if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', start);
122
+ else start();
123
+ }
124
+
125
+ bootStandaloneCsvPage();
@@ -460,6 +460,63 @@ body.is-resizing {
460
460
  }
461
461
  }
462
462
 
463
+ /* CSV/TSV pager. Sits above the table and sticks while the pane scrolls.
464
+ * Background matches github-markdown-css so rows don't show through. */
465
+ .markdown-body .csv-pager {
466
+ position: sticky;
467
+ top: 0;
468
+ z-index: 2;
469
+ display: flex;
470
+ align-items: center;
471
+ gap: 8px;
472
+ margin: 0 0 12px;
473
+ padding: 8px 0;
474
+ background: #0d1117;
475
+ font-size: 13px;
476
+ line-height: 1.4;
477
+ }
478
+
479
+ [data-theme='light'] .markdown-body .csv-pager {
480
+ background: #ffffff;
481
+ }
482
+
483
+ .markdown-body .csv-pager button,
484
+ .markdown-body .csv-pager select {
485
+ font: inherit;
486
+ color: #f0f6fc;
487
+ background: #21262d;
488
+ border: 1px solid #30363d;
489
+ border-radius: 6px;
490
+ padding: 2px 8px;
491
+ }
492
+
493
+ [data-theme='light'] .markdown-body .csv-pager button,
494
+ [data-theme='light'] .markdown-body .csv-pager select {
495
+ color: #1f2328;
496
+ background: #f6f8fa;
497
+ border-color: #d0d7de;
498
+ }
499
+
500
+ .markdown-body .csv-pager button {
501
+ cursor: pointer;
502
+ }
503
+
504
+ .markdown-body .csv-pager button:disabled {
505
+ opacity: 0.45;
506
+ cursor: default;
507
+ }
508
+
509
+ .markdown-body .csv-page-size {
510
+ display: inline-flex;
511
+ align-items: center;
512
+ gap: 6px;
513
+ margin-left: auto;
514
+ }
515
+
516
+ .markdown-body .csv-preview [hidden] {
517
+ display: none !important;
518
+ }
519
+
463
520
  /* Source / code files: stay in the editor-adjacent mono pane. */
464
521
  .rendered.code-content {
465
522
  padding: 24px 32px;
@@ -656,7 +713,7 @@ body.is-resizing {
656
713
  top: calc(100% + 6px);
657
714
  right: 0;
658
715
  z-index: 20;
659
- min-width: 160px;
716
+ min-width: 200px;
660
717
  padding: 8px;
661
718
  background: var(--bg-side);
662
719
  border: 1px solid var(--border);
@@ -736,6 +793,20 @@ body.is-resizing {
736
793
  display: block;
737
794
  }
738
795
 
796
+ .settings-page-size {
797
+ justify-content: space-between;
798
+ gap: 12px;
799
+ }
800
+
801
+ .settings-page-size select {
802
+ font: inherit;
803
+ color: var(--fg);
804
+ background: var(--bg);
805
+ border: 1px solid var(--border);
806
+ border-radius: 4px;
807
+ padding: 2px 4px;
808
+ }
809
+
739
810
  /* Image / video preview */
740
811
  .media-wrap {
741
812
  display: flex;
@@ -0,0 +1,44 @@
1
+ /** Rows-per-page choices for CSV/TSV previews. `0` means show every row. */
2
+ export const CSV_PAGE_SIZES = [25, 50, 100, 250] as const;
3
+ export const CSV_PAGE_SIZE_DEFAULT = 50;
4
+ export const CSV_PAGE_SIZE_ALL = 0;
5
+
6
+ const PAGE_SIZES: readonly number[] = CSV_PAGE_SIZES;
7
+
8
+ /** Smallest selectable page. Tables at or under this stay a single unpaged table. */
9
+ export function csvPageSizeMin(): number {
10
+ return Math.min(...CSV_PAGE_SIZES);
11
+ }
12
+
13
+ /** True when a table is long enough that the pager (and its page-size control) is useful. */
14
+ export function csvPagerVisible(rowCount: number): boolean {
15
+ return rowCount > csvPageSizeMin();
16
+ }
17
+
18
+ /** Coerce a stored or selected value to a known page size. Anything else falls back to the default. */
19
+ export function normalizeCsvPageSize(value: unknown): number {
20
+ if (value === CSV_PAGE_SIZE_ALL || value === '0') return CSV_PAGE_SIZE_ALL;
21
+ const n = typeof value === 'number' ? value : typeof value === 'string' ? Number(value) : NaN;
22
+ if (PAGE_SIZES.includes(n)) return n;
23
+ return CSV_PAGE_SIZE_DEFAULT;
24
+ }
25
+
26
+ export interface CsvPageWindow {
27
+ /** 1-based page, clamped into range. */
28
+ page: number;
29
+ /** Inclusive row index. */
30
+ start: number;
31
+ /** Exclusive row index. */
32
+ end: number;
33
+ pageCount: number;
34
+ }
35
+
36
+ /** Slice a body-row count into one page. `pageSize <= 0` shows every row. */
37
+ export function csvPageWindow(rowCount: number, page: number, pageSize: number): CsvPageWindow {
38
+ if (rowCount <= 0) return { page: 1, start: 0, end: 0, pageCount: 1 };
39
+ const size = pageSize > 0 ? pageSize : rowCount;
40
+ const pageCount = Math.max(1, Math.ceil(rowCount / size));
41
+ const current = Math.min(Math.max(1, Math.floor(page) || 1), pageCount);
42
+ const start = (current - 1) * size;
43
+ return { page: current, start, end: Math.min(start + size, rowCount), pageCount };
44
+ }