busybar-kit 0.1.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 (70) hide show
  1. package/README.md +124 -0
  2. package/configs/eslint.config.js +58 -0
  3. package/configs/prettier.json +5 -0
  4. package/configs/tsconfig.base.json +20 -0
  5. package/dist/colors.d.ts +18 -0
  6. package/dist/colors.d.ts.map +1 -0
  7. package/dist/colors.js +17 -0
  8. package/dist/colors.js.map +1 -0
  9. package/dist/config/bar.d.ts +51 -0
  10. package/dist/config/bar.d.ts.map +1 -0
  11. package/dist/config/bar.js +65 -0
  12. package/dist/config/bar.js.map +1 -0
  13. package/dist/config/env.d.ts +15 -0
  14. package/dist/config/env.d.ts.map +1 -0
  15. package/dist/config/env.js +36 -0
  16. package/dist/config/env.js.map +1 -0
  17. package/dist/config/index.d.ts +3 -0
  18. package/dist/config/index.d.ts.map +1 -0
  19. package/dist/config/index.js +3 -0
  20. package/dist/config/index.js.map +1 -0
  21. package/dist/device.d.ts +48 -0
  22. package/dist/device.d.ts.map +1 -0
  23. package/dist/device.js +67 -0
  24. package/dist/device.js.map +1 -0
  25. package/dist/elements.d.ts +14 -0
  26. package/dist/elements.d.ts.map +1 -0
  27. package/dist/elements.js +33 -0
  28. package/dist/elements.js.map +1 -0
  29. package/dist/errors.d.ts +11 -0
  30. package/dist/errors.d.ts.map +1 -0
  31. package/dist/errors.js +53 -0
  32. package/dist/errors.js.map +1 -0
  33. package/dist/format.d.ts +11 -0
  34. package/dist/format.d.ts.map +1 -0
  35. package/dist/format.js +66 -0
  36. package/dist/format.js.map +1 -0
  37. package/dist/index.d.ts +9 -0
  38. package/dist/index.d.ts.map +1 -0
  39. package/dist/index.js +9 -0
  40. package/dist/index.js.map +1 -0
  41. package/dist/preview/font.d.ts +7 -0
  42. package/dist/preview/font.d.ts.map +1 -0
  43. package/dist/preview/font.js +75 -0
  44. package/dist/preview/font.js.map +1 -0
  45. package/dist/preview/index.d.ts +4 -0
  46. package/dist/preview/index.d.ts.map +1 -0
  47. package/dist/preview/index.js +4 -0
  48. package/dist/preview/index.js.map +1 -0
  49. package/dist/preview/png.d.ts +18 -0
  50. package/dist/preview/png.d.ts.map +1 -0
  51. package/dist/preview/png.js +122 -0
  52. package/dist/preview/png.js.map +1 -0
  53. package/dist/preview/raster.d.ts +6 -0
  54. package/dist/preview/raster.d.ts.map +1 -0
  55. package/dist/preview/raster.js +97 -0
  56. package/dist/preview/raster.js.map +1 -0
  57. package/dist/ticker/index.d.ts +3 -0
  58. package/dist/ticker/index.d.ts.map +1 -0
  59. package/dist/ticker/index.js +3 -0
  60. package/dist/ticker/index.js.map +1 -0
  61. package/dist/ticker/text.d.ts +15 -0
  62. package/dist/ticker/text.d.ts.map +1 -0
  63. package/dist/ticker/text.js +97 -0
  64. package/dist/ticker/text.js.map +1 -0
  65. package/dist/ticker/ticker.d.ts +22 -0
  66. package/dist/ticker/ticker.d.ts.map +1 -0
  67. package/dist/ticker/ticker.js +33 -0
  68. package/dist/ticker/ticker.js.map +1 -0
  69. package/package.json +75 -0
  70. package/scripts/fix-esm-extensions.mjs +33 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../src/ticker/text.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,QAAQ,CAAC;AAI5C,eAAO,MAAM,OAAO,OAAO,CAAC;AAE5B,eAAO,MAAM,OAAO,OAAO,CAAC;AAE5B,eAAO,MAAM,OAAO,MAAM,CAAC;AAE3B,MAAM,MAAM,aAAa,GAAG;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,YA4CtD;AAgBD,wBAAgB,MAAM,CACpB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,aAAkB,UAU5B;AAED,wBAAgB,QAAQ,CACtB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,aAAkB,UAkB5B;AAED,wBAAgB,UAAU,CACxB,KAAK,EAAE,WAAW,EAClB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,aAAkB,UAK5B;AAED,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,WAAW,EAClB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,aAAkB,UAY5B"}
@@ -0,0 +1,97 @@
1
+ const GAP = ' ';
2
+ export const PAGE_MS = 2200;
3
+ export const HOLD_MS = 1200;
4
+ export const STEP_MS = 400;
5
+ export function paginate(text, maxChars) {
6
+ if (maxChars <= 0) {
7
+ return [];
8
+ }
9
+ const trimmed = text.trim();
10
+ if (trimmed.length <= maxChars) {
11
+ return [trimmed];
12
+ }
13
+ const pages = [];
14
+ let line = '';
15
+ const words = joinNumbers(trimmed.split(/\s+/));
16
+ const flush = () => {
17
+ if (line) {
18
+ pages.push(line);
19
+ line = '';
20
+ }
21
+ };
22
+ for (const word of words) {
23
+ let rest = word;
24
+ while (rest.length > maxChars) {
25
+ flush();
26
+ pages.push(rest.slice(0, maxChars));
27
+ rest = rest.slice(maxChars);
28
+ }
29
+ if (!rest) {
30
+ continue;
31
+ }
32
+ if (!line) {
33
+ line = rest;
34
+ }
35
+ else if (line.length + 1 + rest.length <= maxChars) {
36
+ line = `${line} ${rest}`;
37
+ }
38
+ else {
39
+ flush();
40
+ line = rest;
41
+ }
42
+ }
43
+ flush();
44
+ return pages.length > 0 ? pages : [''];
45
+ }
46
+ function joinNumbers(words) {
47
+ const joined = [];
48
+ for (const word of words) {
49
+ const previous = joined.at(-1);
50
+ if (previous !== undefined && /^\d+[.,:;]?$/.test(word)) {
51
+ joined[joined.length - 1] = `${previous} ${word}`;
52
+ continue;
53
+ }
54
+ joined.push(word);
55
+ }
56
+ return joined;
57
+ }
58
+ export function pageAt(text, maxChars, elapsedMs, options = {}) {
59
+ const pages = paginate(text, maxChars);
60
+ if (pages.length <= 1) {
61
+ return pages[0] ?? '';
62
+ }
63
+ const pageMs = options.pageMs ?? PAGE_MS;
64
+ const index = Math.floor(Math.max(0, elapsedMs) / pageMs) % pages.length;
65
+ return pages[index] ?? '';
66
+ }
67
+ export function scrollAt(text, maxChars, elapsedMs, options = {}) {
68
+ if (maxChars <= 0) {
69
+ return '';
70
+ }
71
+ if (text.length <= maxChars) {
72
+ return text;
73
+ }
74
+ const holdMs = options.holdMs ?? HOLD_MS;
75
+ const stepMs = options.stepMs ?? STEP_MS;
76
+ const moving = Math.max(0, elapsedMs - holdMs);
77
+ const loop = text + GAP;
78
+ const offset = Math.floor(moving / stepMs) % loop.length;
79
+ // Wrap by reading past the end of a doubled string rather than stitching slices.
80
+ return (loop + loop).slice(offset, offset + maxChars);
81
+ }
82
+ export function tickerLine(style, text, maxChars, elapsedMs, options = {}) {
83
+ return style === 'scroll'
84
+ ? scrollAt(text, maxChars, elapsedMs, options)
85
+ : pageAt(text, maxChars, elapsedMs, options);
86
+ }
87
+ export function tickerLineLooping(style, text, maxChars, nowMs, options = {}) {
88
+ if (text.length <= maxChars) {
89
+ return text;
90
+ }
91
+ const cycleMs = style === 'scroll'
92
+ ? (options.holdMs ?? HOLD_MS) +
93
+ (text.length + GAP.length) * (options.stepMs ?? STEP_MS)
94
+ : paginate(text, maxChars).length * (options.pageMs ?? PAGE_MS);
95
+ return tickerLine(style, text, maxChars, nowMs % cycleMs, options);
96
+ }
97
+ //# sourceMappingURL=text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text.js","sourceRoot":"","sources":["../../src/ticker/text.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ export declare const TICKER_MS = 7000;
2
+ /** The only thing the ticker needs to know about an app's events. */
3
+ export type Prioritised = {
4
+ priority: number;
5
+ };
6
+ export type ActiveTicker<TEvent extends Prioritised> = {
7
+ event: TEvent;
8
+ elapsedMs: number;
9
+ };
10
+ /**
11
+ * Holds one event on screen for a while, and lets a more important one cut in.
12
+ */
13
+ export declare class EventTicker<TEvent extends Prioritised> {
14
+ private readonly durationMs;
15
+ private event;
16
+ private startedAt;
17
+ private until;
18
+ constructor(durationMs?: number);
19
+ push(event: TEvent | null, nowMs: number): boolean;
20
+ active(nowMs: number): ActiveTicker<TEvent> | null;
21
+ }
22
+ //# sourceMappingURL=ticker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ticker.d.ts","sourceRoot":"","sources":["../../src/ticker/ticker.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,SAAS,OAAO,CAAC;AAE9B,qEAAqE;AACrE,MAAM,MAAM,WAAW,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/C,MAAM,MAAM,YAAY,CAAC,MAAM,SAAS,WAAW,IAAI;IACrD,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF;;GAEG;AACH,qBAAa,WAAW,CAAC,MAAM,SAAS,WAAW;IAKrC,OAAO,CAAC,QAAQ,CAAC,UAAU;IAJvC,OAAO,CAAC,KAAK,CAAuB;IACpC,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,KAAK,CAAK;gBAEW,UAAU,SAAY;IAEnD,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,EAAE,MAAM;IAcxC,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,GAAG,IAAI;CAOnD"}
@@ -0,0 +1,33 @@
1
+ export const TICKER_MS = 7000;
2
+ /**
3
+ * Holds one event on screen for a while, and lets a more important one cut in.
4
+ */
5
+ export class EventTicker {
6
+ durationMs;
7
+ event = null;
8
+ startedAt = 0;
9
+ until = 0;
10
+ constructor(durationMs = TICKER_MS) {
11
+ this.durationMs = durationMs;
12
+ }
13
+ push(event, nowMs) {
14
+ if (!event) {
15
+ return false;
16
+ }
17
+ const showing = this.active(nowMs);
18
+ if (showing && event.priority <= showing.event.priority) {
19
+ return false;
20
+ }
21
+ this.event = event;
22
+ this.startedAt = nowMs;
23
+ this.until = nowMs + this.durationMs;
24
+ return true;
25
+ }
26
+ active(nowMs) {
27
+ if (nowMs >= this.until || !this.event) {
28
+ return null;
29
+ }
30
+ return { event: this.event, elapsedMs: nowMs - this.startedAt };
31
+ }
32
+ }
33
+ //# sourceMappingURL=ticker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ticker.js","sourceRoot":"","sources":["../../src/ticker/ticker.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,CAAC;AAU9B;;GAEG;AACH,MAAM,OAAO,WAAW;IAKO;IAJrB,KAAK,GAAkB,IAAI,CAAC;IAC5B,SAAS,GAAG,CAAC,CAAC;IACd,KAAK,GAAG,CAAC,CAAC;IAElB,YAA6B,aAAa,SAAS;QAAtB,eAAU,GAAV,UAAU,CAAY;IAAG,CAAC;IAEvD,IAAI,CAAC,KAAoB,EAAE,KAAa;QACtC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACnC,IAAI,OAAO,IAAI,KAAK,CAAC,QAAQ,IAAI,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;YACxD,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACvB,IAAI,CAAC,KAAK,GAAG,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC;QACrC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,CAAC,KAAa;QAClB,IAAI,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YACvC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;IAClE,CAAC;CACF"}
package/package.json ADDED
@@ -0,0 +1,75 @@
1
+ {
2
+ "name": "busybar-kit",
3
+ "version": "0.1.0",
4
+ "description": "Shared building blocks for BUSY Bar apps: device geometry, colours, formatters, ticker text, error taxonomy and an offline PNG preview renderer",
5
+ "author": "viirtualp1",
6
+ "license": "MIT",
7
+ "type": "module",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git+https://github.com/viirtualp1/busybar-kit.git"
11
+ },
12
+ "main": "./dist/index.js",
13
+ "types": "./dist/index.d.ts",
14
+ "exports": {
15
+ ".": "./dist/index.js",
16
+ "./colors": "./dist/colors.js",
17
+ "./config": "./dist/config/index.js",
18
+ "./device": "./dist/device.js",
19
+ "./elements": "./dist/elements.js",
20
+ "./errors": "./dist/errors.js",
21
+ "./format": "./dist/format.js",
22
+ "./preview": "./dist/preview/index.js",
23
+ "./ticker": "./dist/ticker/index.js",
24
+ "./tsconfig.json": "./configs/tsconfig.base.json",
25
+ "./eslint": "./configs/eslint.config.js",
26
+ "./prettier": "./configs/prettier.json",
27
+ "./package.json": "./package.json"
28
+ },
29
+ "bin": {
30
+ "busybar-fix-esm": "scripts/fix-esm-extensions.mjs"
31
+ },
32
+ "files": [
33
+ "dist",
34
+ "configs",
35
+ "scripts",
36
+ "README.md"
37
+ ],
38
+ "keywords": [
39
+ "busy-bar",
40
+ "busybar",
41
+ "led",
42
+ "pixel",
43
+ "preview"
44
+ ],
45
+ "engines": {
46
+ "node": ">=22"
47
+ },
48
+ "scripts": {
49
+ "clean": "node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\"",
50
+ "build": "npm run clean && tsc -p tsconfig.build.json && node scripts/fix-esm-extensions.mjs",
51
+ "typecheck": "tsc -p tsconfig.json",
52
+ "lint": "eslint .",
53
+ "lint:fix": "eslint . --fix",
54
+ "format": "prettier --write .",
55
+ "format:check": "prettier --check .",
56
+ "test": "node --import tsx --test \"test/**/*.test.ts\"",
57
+ "check": "npm run lint && npm run typecheck && npm test",
58
+ "prepare": "npm run build",
59
+ "prepublishOnly": "npm run check && npm run build"
60
+ },
61
+ "peerDependencies": {
62
+ "@busy-app/busy-lib": "^0.18.0"
63
+ },
64
+ "devDependencies": {
65
+ "@busy-app/busy-lib": "^0.18.0",
66
+ "@eslint/js": "^10.0.1",
67
+ "@types/node": "^24.13.3",
68
+ "eslint": "^10.8.1",
69
+ "eslint-config-prettier": "^10.1.8",
70
+ "prettier": "^3.9.6",
71
+ "tsx": "^4.23.12",
72
+ "typescript": "^5.9.3",
73
+ "typescript-eslint": "^8.67.0"
74
+ }
75
+ }
@@ -0,0 +1,33 @@
1
+ #!/usr/bin/env node
2
+ import { readdirSync, readFileSync, statSync, writeFileSync } from 'node:fs';
3
+ import { isAbsolute, join, resolve } from 'node:path';
4
+
5
+ // Node's ESM loader wants a real file name; tsc leaves extensionless specifiers.
6
+ const argument = process.argv[2] ?? 'dist';
7
+ const dist = isAbsolute(argument) ? argument : resolve(process.cwd(), argument);
8
+ const EXTENSIONS = /\.(?:js|json|mjs|cjs|node)$/;
9
+
10
+ function walk(dir) {
11
+ for (const name of readdirSync(dir)) {
12
+ const path = join(dir, name);
13
+ if (statSync(path).isDirectory()) {
14
+ walk(path);
15
+ continue;
16
+ }
17
+ if (!/\.(?:js|d\.ts)$/.test(name)) {
18
+ continue;
19
+ }
20
+
21
+ const source = readFileSync(path, 'utf8');
22
+ const next = source.replace(
23
+ /(from\s+|import\s*\()(['"])(\.[^'"]+)\2/g,
24
+ (match, prefix, quote, spec) =>
25
+ EXTENSIONS.test(spec) ? match : `${prefix}${quote}${spec}.js${quote}`,
26
+ );
27
+ if (next !== source) {
28
+ writeFileSync(path, next);
29
+ }
30
+ }
31
+ }
32
+
33
+ walk(dist);