@edv4h/usketch-plugin-timter 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,122 @@
1
+ # @edv4h/usketch-plugin-timter
2
+
3
+ Shared timers as **canvas shapes** (single source of truth). A `timer` shape is
4
+ placeable/movable and syncs through the normal shapes map; timing runs against a
5
+ shared `ServerClock` so every user agrees on "now". The plugin also surfaces
6
+ every timer in the Debug HUD's Controls dock (group "Timter").
7
+
8
+ The domain model (`timer-model`) is pure, framework-free, and time-source
9
+ agnostic — every function takes an explicit `serverNow`.
10
+
11
+ ## Install
12
+
13
+ ```ts
14
+ import { createTimterPlugin } from "@edv4h/usketch-plugin-timter";
15
+
16
+ const timter = createTimterPlugin({
17
+ serverClock, // your shared ServerClock
18
+ userId, // optional, attribution (reserved)
19
+ });
20
+ ```
21
+
22
+ ## Customizing the shape's look — `renderShape`
23
+
24
+ By default the timer renders with a built-in visual. To match your own design
25
+ (hand-drawn theme, design tokens, custom controls), pass a `renderShape`
26
+ render-prop. It receives the shape, its live `TimerCore`, a fresh `serverNow`
27
+ (recomputed on every self-tick while running), and the timer `actions`. The
28
+ plugin owns the tick and the store writes — your renderer only draws and calls
29
+ actions.
30
+
31
+ ```tsx
32
+ import {
33
+ createTimterPlugin,
34
+ displayMs,
35
+ formatDuration,
36
+ isDone,
37
+ } from "@edv4h/usketch-plugin-timter";
38
+
39
+ createTimterPlugin({
40
+ serverClock,
41
+ renderShape: ({ shape, core, serverNow, actions }) => (
42
+ <div className="my-timer" data-done={isDone(core, serverNow)}>
43
+ <span className="my-timer__time">
44
+ {formatDuration(displayMs(core, serverNow))}
45
+ </span>
46
+ <button type="button" onClick={actions.toggle}>
47
+ {shape.running ? "pause" : "start"}
48
+ </button>
49
+ <button type="button" onClick={actions.reset}>reset</button>
50
+ </div>
51
+ ),
52
+ });
53
+ ```
54
+
55
+ `actions`:
56
+
57
+ | action | effect |
58
+ | --- | --- |
59
+ | `toggle()` | start if paused, pause if running |
60
+ | `reset()` | back to the configured, stopped state |
61
+ | `switchType()` | advance to the next registered kind (paused only) |
62
+ | `adjust(deltaMs)` | change the configured duration by `deltaMs` (duration-based kinds, paused only) |
63
+
64
+ > Buttons should call `e.stopPropagation()` on `onPointerDown` so the click
65
+ > doesn't start a canvas drag — see `defaultRenderTimerShape` for the pattern.
66
+
67
+ ### Extend, don't replace
68
+
69
+ `defaultRenderTimerShape` is exported, so you can wrap the built-in visual
70
+ instead of rewriting it:
71
+
72
+ ```tsx
73
+ import { defaultRenderTimerShape } from "@edv4h/usketch-plugin-timter";
74
+
75
+ createTimterPlugin({
76
+ serverClock,
77
+ renderShape: (ctx) => (
78
+ <div className="my-frame">{defaultRenderTimerShape(ctx)}</div>
79
+ ),
80
+ });
81
+ ```
82
+
83
+ ## Adding a timer type — `registerTimerKind`
84
+
85
+ `countdown` and `stopwatch` are built in. Register your own kind (e.g.
86
+ `pomodoro`) once at startup; the model transitions, the shape renderer, and the
87
+ Controls dock all treat it like a built-in. `switchType()` cycles through every
88
+ registered kind.
89
+
90
+ ```ts
91
+ import { registerTimerKind, TIMER_KINDS } from "@edv4h/usketch-plugin-timter";
92
+
93
+ registerTimerKind("pomodoro", {
94
+ ...TIMER_KINDS.countdown, // reuse countdown transitions
95
+ icon: "🍅",
96
+ // always a 25-minute work block
97
+ initial: () => ({ anchorAt: null, accumMs: 25 * 60_000, durationMs: 25 * 60_000 }),
98
+ });
99
+ ```
100
+
101
+ A `TimerKind` defines pure transitions over `TimerCore`:
102
+
103
+ ```ts
104
+ interface TimerKind {
105
+ icon?: string; // glyph used by the built-in renderer / Controls dock
106
+ displayMs(c, serverNow): number;
107
+ isDone(c, serverNow): boolean;
108
+ onStart(c, serverNow): Pick<TimerCore, "anchorAt" | "accumMs">;
109
+ onPause(c, serverNow): Pick<TimerCore, "anchorAt" | "accumMs">;
110
+ initial(durationMs): Pick<TimerCore, "anchorAt" | "accumMs" | "durationMs">;
111
+ }
112
+ ```
113
+
114
+ ## Model exports
115
+
116
+ `start` · `pause` · `reset` · `initialCore` · `displayMs` · `isDone` ·
117
+ `formatDuration` · `getTimerKind` · `timerTypes` · `registerTimerKind` ·
118
+ `TIMER_KINDS` — plus types `TimerCore` · `TimerType` · `TimerKind`.
119
+
120
+ Shape exports: `TIMER_SHAPE_TYPE` · `TimerShapeData` · `defaultRenderTimerShape`
121
+ · `makeTimerShape` · `dispatchTimerShapeAction` — plus types
122
+ `TimerShapeRenderer` · `TimerRenderContext` · `TimerShapeActions`.
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
1
  export { createTimterPlugin, type TimterPluginOptions } from "./plugin.js";
2
- export { displayMs, formatDuration, initialCore, isDone, pause, reset, start, type TimerCore, type TimerType, } from "./timer-model.js";
3
- export { TIMER_SHAPE_TYPE, type TimerShapeData } from "./timer-shape.js";
2
+ export { displayMs, formatDuration, getTimerKind, initialCore, isDone, pause, registerTimerKind, reset, resolveTimerKind, start, TIMER_KINDS, type TimerCore, type TimerKind, type TimerType, timerTypes, } from "./timer-model.js";
3
+ export { defaultRenderTimerShape, dispatchTimerShapeAction, makeTimerShape, TIMER_SHAPE_TYPE, type TimerRenderContext, type TimerShapeActions, type TimerShapeData, type TimerShapeRenderer, } from "./timer-shape.js";
4
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,KAAK,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAC3E,OAAO,EACN,SAAS,EACT,cAAc,EACd,WAAW,EACX,MAAM,EACN,KAAK,EACL,KAAK,EACL,KAAK,EACL,KAAK,SAAS,EACd,KAAK,SAAS,GACd,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,gBAAgB,EAAE,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,KAAK,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAC3E,OAAO,EACN,SAAS,EACT,cAAc,EACd,YAAY,EACZ,WAAW,EACX,MAAM,EACN,KAAK,EACL,iBAAiB,EACjB,KAAK,EACL,gBAAgB,EAChB,KAAK,EACL,WAAW,EACX,KAAK,SAAS,EACd,KAAK,SAAS,EACd,KAAK,SAAS,EACd,UAAU,GACV,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACN,uBAAuB,EACvB,wBAAwB,EACxB,cAAc,EACd,gBAAgB,EAChB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,KAAK,kBAAkB,GACvB,MAAM,kBAAkB,CAAC"}
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
1
  export { createTimterPlugin } from "./plugin.js";
2
- export { displayMs, formatDuration, initialCore, isDone, pause, reset, start, } from "./timer-model.js";
3
- export { TIMER_SHAPE_TYPE } from "./timer-shape.js";
2
+ export { displayMs, formatDuration, getTimerKind, initialCore, isDone, pause, registerTimerKind, reset, resolveTimerKind, start, TIMER_KINDS, timerTypes, } from "./timer-model.js";
3
+ export { defaultRenderTimerShape, dispatchTimerShapeAction, makeTimerShape, TIMER_SHAPE_TYPE, } from "./timer-shape.js";
4
4
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAA4B,MAAM,aAAa,CAAC;AAC3E,OAAO,EACN,SAAS,EACT,cAAc,EACd,WAAW,EACX,MAAM,EACN,KAAK,EACL,KAAK,EACL,KAAK,GAGL,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,gBAAgB,EAAuB,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAA4B,MAAM,aAAa,CAAC;AAC3E,OAAO,EACN,SAAS,EACT,cAAc,EACd,YAAY,EACZ,WAAW,EACX,MAAM,EACN,KAAK,EACL,iBAAiB,EACjB,KAAK,EACL,gBAAgB,EAChB,KAAK,EACL,WAAW,EAIX,UAAU,GACV,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACN,uBAAuB,EACvB,wBAAwB,EACxB,cAAc,EACd,gBAAgB,GAKhB,MAAM,kBAAkB,CAAC"}
package/dist/plugin.d.ts CHANGED
@@ -1,10 +1,19 @@
1
1
  import { type UsketchPlugin } from "@edv4h/usketch-shared";
2
2
  import type { ServerClock } from "@edv4h/usketch-sync";
3
+ import { type TimerShapeRenderer } from "./timer-shape.js";
3
4
  export interface TimterPluginOptions {
4
5
  /** Shared server clock so all users agree on "now". */
5
6
  serverClock: ServerClock;
6
7
  /** Attribution for created-by (reserved). Defaults to "local". */
7
8
  userId?: string;
9
+ /**
10
+ * Replace the built-in timer-shape visual with a host renderer (theme /
11
+ * hand-drawn look / design tokens). Receives the shape, its live
12
+ * {@link TimerCore}, a fresh `serverNow`, and toggle/reset/switchType/adjust
13
+ * actions. Omit to use the built-in renderer (`defaultRenderTimerShape`),
14
+ * which you can also import and wrap.
15
+ */
16
+ renderShape?: TimerShapeRenderer;
8
17
  }
9
18
  /**
10
19
  * Shared timers as **canvas shapes** (single source of truth). The `timer` shape
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAIN,KAAK,aAAa,EAClB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAWvD,MAAM,WAAW,mBAAmB;IACnC,uDAAuD;IACvD,WAAW,EAAE,WAAW,CAAC;IACzB,kEAAkE;IAClE,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,mBAAmB,GAAG,aAAa,CAqI9E"}
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAIN,KAAK,aAAa,EAClB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAQvD,OAAO,EAON,KAAK,kBAAkB,EACvB,MAAM,kBAAkB,CAAC;AAE1B,MAAM,WAAW,mBAAmB;IACnC,uDAAuD;IACvD,WAAW,EAAE,WAAW,CAAC;IACzB,kEAAkE;IAClE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,kBAAkB,CAAC;CACjC;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,mBAAmB,GAAG,aAAa,CA0I9E"}
package/dist/plugin.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { generateId, } from "@edv4h/usketch-shared";
2
2
  import { createAddShapeCommand } from "@edv4h/usketch-store";
3
- import { displayMs, formatDuration, isDone } from "./timer-model.js";
3
+ import { displayMs, formatDuration, isDone, resolveTimerKind, } from "./timer-model.js";
4
4
  import { coreOf, dispatchTimerShapeAction, makeTimerShape, registerTimerShape, TIMER_SHAPE_TYPE, } from "./timer-shape.js";
5
5
  /**
6
6
  * Shared timers as **canvas shapes** (single source of truth). The `timer` shape
@@ -17,7 +17,7 @@ export function createTimterPlugin(options) {
17
17
  setup(ctx) {
18
18
  const now = () => options.serverClock.now();
19
19
  // ── Timer shape (placeable, movable) — the source of truth ──
20
- const disposeShape = registerTimerShape(ctx, options.serverClock, options.userId ?? "local");
20
+ const disposeShape = registerTimerShape(ctx, options.serverClock, options.userId ?? "local", options.renderShape);
21
21
  const listTimers = () => [...ctx.store.getShapes().values()]
22
22
  .filter((s) => s.type === TIMER_SHAPE_TYPE)
23
23
  .sort((a, b) => (a.createdAt ?? 0) - (b.createdAt ?? 0) || a.id.localeCompare(b.id));
@@ -80,8 +80,8 @@ export function createTimterPlugin(options) {
80
80
  const serverNow = now();
81
81
  timers.forEach((s, idx) => {
82
82
  const n = idx + 1;
83
- const icon = s.timerType === "countdown" ? "⏳" : "⏱";
84
- const done = s.timerType === "countdown" && isDone(coreOf(s), serverNow);
83
+ const icon = resolveTimerKind(s.timerType).icon ?? "⏱";
84
+ const done = isDone(coreOf(s), serverNow);
85
85
  const time = formatDuration(displayMs(coreOf(s), serverNow));
86
86
  perTimerOffs.push(ctx.actions.register({
87
87
  id: `timter:${s.id}:toggle`,
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"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"}
@@ -3,11 +3,20 @@
3
3
  * function takes an explicit `serverNow` so the same logic runs against the
4
4
  * shared server clock). The core timing state ({@link TimerCore}) is deliberately
5
5
  * envelope-free so it can be embedded both in the collaborative `timters` map
6
- * (as {@link TimerEntry}) and in a canvas timer shape. New timer types are added
7
- * by extending {@link TimerType} + one {@link TIMER_KINDS} entry; the transitions
8
- * stay type-agnostic.
6
+ * (as {@link TimerEntry}) and in a canvas timer shape.
7
+ *
8
+ * New timer types are added by registering one {@link TimerKind} via
9
+ * {@link registerTimerKind} (hosts can add e.g. a `pomodoro` kind); the
10
+ * transitions ({@link start} / {@link pause} / {@link reset}) stay type-agnostic
11
+ * and dispatch through the kind registry. `"countdown"` and `"stopwatch"` are
12
+ * built in.
9
13
  */
10
- export type TimerType = "countdown" | "stopwatch";
14
+ /**
15
+ * A timer kind's id. The two built-ins are named for autocomplete; the
16
+ * `(string & {})` arm keeps any host-registered kind assignable while still
17
+ * suggesting the built-ins. Register new ids with {@link registerTimerKind}.
18
+ */
19
+ export type TimerType = "countdown" | "stopwatch" | (string & {});
11
20
  /** The minimal timing state shared by every timer representation. */
12
21
  export interface TimerCore {
13
22
  type: TimerType;
@@ -19,14 +28,60 @@ export interface TimerCore {
19
28
  /** Configured length (countdown); 0 for stopwatch. */
20
29
  durationMs: number;
21
30
  }
22
- interface TimerKind {
31
+ /**
32
+ * The behavior of one timer kind. Register a custom kind (e.g. `pomodoro`) with
33
+ * {@link registerTimerKind}; the model's transitions and the shape renderer then
34
+ * treat it like a built-in. All methods are pure — timing flows through the
35
+ * explicit `serverNow`, never `Date.now()`.
36
+ */
37
+ export interface TimerKind {
38
+ /** Optional glyph used by the built-in shape renderer / Controls dock. */
39
+ icon?: string;
23
40
  displayMs(c: TimerCore, serverNow: number): number;
24
41
  isDone(c: TimerCore, serverNow: number): boolean;
25
42
  onStart(c: TimerCore, serverNow: number): Pick<TimerCore, "anchorAt" | "accumMs">;
26
43
  onPause(c: TimerCore, serverNow: number): Pick<TimerCore, "anchorAt" | "accumMs">;
27
44
  initial(durationMs: number): Pick<TimerCore, "anchorAt" | "accumMs" | "durationMs">;
28
45
  }
29
- export declare const TIMER_KINDS: Record<TimerType, TimerKind>;
46
+ /**
47
+ * The kind registry. Built-ins are seeded here; hosts extend it via
48
+ * {@link registerTimerKind}. Read via {@link getTimerKind} / {@link timerTypes}
49
+ * (this record is the live registry — treat it as read-only and mutate only
50
+ * through `registerTimerKind`).
51
+ */
52
+ export declare const TIMER_KINDS: Record<string, TimerKind>;
53
+ /**
54
+ * Register (or replace) a timer kind so custom types behave like the built-ins.
55
+ * Call once at startup, before any timer of that type is created. Example:
56
+ *
57
+ * ```ts
58
+ * registerTimerKind("pomodoro", {
59
+ * // 25-min work block — behaves like a countdown
60
+ * ...TIMER_KINDS.countdown,
61
+ * icon: "🍅",
62
+ * initial: () => ({ anchorAt: null, accumMs: 25 * 60_000, durationMs: 25 * 60_000 }),
63
+ * });
64
+ * ```
65
+ */
66
+ export declare function registerTimerKind(type: string, kind: TimerKind): void;
67
+ /**
68
+ * The registered kind for `type`. **Throws** if the kind was never registered —
69
+ * the strict getter, for callers that control the type and want to fail loudly
70
+ * on a typo. Rendering / display of *synced* shape data (whose `timerType` is
71
+ * untrusted — stale documents, remote updates for a kind this client never
72
+ * registered) must use {@link resolveTimerKind} instead so a bad value can't
73
+ * crash the render tree.
74
+ */
75
+ export declare function getTimerKind(type: TimerType): TimerKind;
76
+ /**
77
+ * Like {@link getTimerKind} but **never throws** — returns {@link FALLBACK_KIND}
78
+ * for an unregistered type. Use everywhere a timer's kind is resolved from
79
+ * synced/untrusted shape data (render, LOD, Controls rebuild, transitions) so an
80
+ * unknown kind degrades to an inert display instead of crashing the canvas.
81
+ */
82
+ export declare function resolveTimerKind(type: TimerType): TimerKind;
83
+ /** All registered timer-type ids, in registration order. */
84
+ export declare function timerTypes(): TimerType[];
30
85
  /** Fresh, stopped core for a type + configured duration. */
31
86
  export declare function initialCore(type: TimerType, durationMs: number): TimerCore;
32
87
  export declare function displayMs(c: TimerCore, serverNow: number): number;
@@ -39,5 +94,4 @@ export declare function pause(c: TimerCore, serverNow: number): TimerCore;
39
94
  export declare function reset(c: TimerCore): TimerCore;
40
95
  /** Format ms as `M:SS` (or `H:MM:SS` past an hour). Negative clamps to 0. */
41
96
  export declare function formatDuration(ms: number): string;
42
- export {};
43
97
  //# sourceMappingURL=timer-model.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"timer-model.d.ts","sourceRoot":"","sources":["../src/timer-model.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,MAAM,SAAS,GAAG,WAAW,GAAG,WAAW,CAAC;AAElD,qEAAqE;AACrE,MAAM,WAAW,SAAS;IACzB,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,gHAAgH;IAChH,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,yEAAyE;IACzE,OAAO,EAAE,MAAM,CAAC;IAChB,sDAAsD;IACtD,UAAU,EAAE,MAAM,CAAC;CACnB;AAED,UAAU,SAAS;IAClB,SAAS,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC;IACnD,MAAM,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;IACjD,OAAO,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,UAAU,GAAG,SAAS,CAAC,CAAC;IAClF,OAAO,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,UAAU,GAAG,SAAS,CAAC,CAAC;IAClF,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,UAAU,GAAG,SAAS,GAAG,YAAY,CAAC,CAAC;CACpF;AAED,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,SAAS,EAAE,SAAS,CAepD,CAAC;AAEF,4DAA4D;AAC5D,wBAAgB,WAAW,CAAC,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,GAAG,SAAS,CAE1E;AAED,wBAAgB,SAAS,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAEjE;AAED,wBAAgB,MAAM,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAE/D;AAED,yEAAyE;AACzE,wBAAgB,KAAK,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,SAAS,CAGhE;AAED,sEAAsE;AACtE,wBAAgB,KAAK,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,SAAS,CAGhE;AAED,wEAAwE;AACxE,wBAAgB,KAAK,CAAC,CAAC,EAAE,SAAS,GAAG,SAAS,CAE7C;AAED,6EAA6E;AAC7E,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAQjD"}
1
+ {"version":3,"file":"timer-model.d.ts","sourceRoot":"","sources":["../src/timer-model.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH;;;;GAIG;AACH,MAAM,MAAM,SAAS,GAAG,WAAW,GAAG,WAAW,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;AAElE,qEAAqE;AACrE,MAAM,WAAW,SAAS;IACzB,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,gHAAgH;IAChH,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,yEAAyE;IACzE,OAAO,EAAE,MAAM,CAAC;IAChB,sDAAsD;IACtD,UAAU,EAAE,MAAM,CAAC;CACnB;AAED;;;;;GAKG;AACH,MAAM,WAAW,SAAS;IACzB,0EAA0E;IAC1E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC;IACnD,MAAM,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;IACjD,OAAO,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,UAAU,GAAG,SAAS,CAAC,CAAC;IAClF,OAAO,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,UAAU,GAAG,SAAS,CAAC,CAAC;IAClF,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,UAAU,GAAG,SAAS,GAAG,YAAY,CAAC,CAAC;CACpF;AAED;;;;;GAKG;AACH,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAiBjD,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,GAAG,IAAI,CAErE;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,SAAS,GAAG,SAAS,CAKvD;AAiBD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,SAAS,GAAG,SAAS,CAE3D;AAED,4DAA4D;AAC5D,wBAAgB,UAAU,IAAI,SAAS,EAAE,CAExC;AAED,4DAA4D;AAC5D,wBAAgB,WAAW,CAAC,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,GAAG,SAAS,CAE1E;AAED,wBAAgB,SAAS,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAEjE;AAED,wBAAgB,MAAM,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAE/D;AAED,yEAAyE;AACzE,wBAAgB,KAAK,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,SAAS,CAGhE;AAED,sEAAsE;AACtE,wBAAgB,KAAK,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,SAAS,CAGhE;AAED,wEAAwE;AACxE,wBAAgB,KAAK,CAAC,CAAC,EAAE,SAAS,GAAG,SAAS,CAE7C;AAED,6EAA6E;AAC7E,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAQjD"}
@@ -3,12 +3,23 @@
3
3
  * function takes an explicit `serverNow` so the same logic runs against the
4
4
  * shared server clock). The core timing state ({@link TimerCore}) is deliberately
5
5
  * envelope-free so it can be embedded both in the collaborative `timters` map
6
- * (as {@link TimerEntry}) and in a canvas timer shape. New timer types are added
7
- * by extending {@link TimerType} + one {@link TIMER_KINDS} entry; the transitions
8
- * stay type-agnostic.
6
+ * (as {@link TimerEntry}) and in a canvas timer shape.
7
+ *
8
+ * New timer types are added by registering one {@link TimerKind} via
9
+ * {@link registerTimerKind} (hosts can add e.g. a `pomodoro` kind); the
10
+ * transitions ({@link start} / {@link pause} / {@link reset}) stay type-agnostic
11
+ * and dispatch through the kind registry. `"countdown"` and `"stopwatch"` are
12
+ * built in.
13
+ */
14
+ /**
15
+ * The kind registry. Built-ins are seeded here; hosts extend it via
16
+ * {@link registerTimerKind}. Read via {@link getTimerKind} / {@link timerTypes}
17
+ * (this record is the live registry — treat it as read-only and mutate only
18
+ * through `registerTimerKind`).
9
19
  */
10
20
  export const TIMER_KINDS = {
11
21
  countdown: {
22
+ icon: "⏳",
12
23
  displayMs: (c, now) => (c.running ? Math.max(0, (c.anchorAt ?? now) - now) : c.accumMs),
13
24
  isDone: (c, now) => (c.running ? (c.anchorAt ?? now) - now <= 0 : c.accumMs <= 0),
14
25
  onStart: (c, now) => ({ anchorAt: now + c.accumMs, accumMs: c.accumMs }),
@@ -16,6 +27,7 @@ export const TIMER_KINDS = {
16
27
  initial: (d) => ({ anchorAt: null, accumMs: d, durationMs: d }),
17
28
  },
18
29
  stopwatch: {
30
+ icon: "⏱",
19
31
  displayMs: (c, now) => (c.running ? now - (c.anchorAt ?? now) + c.accumMs : c.accumMs),
20
32
  isDone: () => false,
21
33
  onStart: (c, now) => ({ anchorAt: now, accumMs: c.accumMs }),
@@ -23,27 +35,84 @@ export const TIMER_KINDS = {
23
35
  initial: () => ({ anchorAt: null, accumMs: 0, durationMs: 0 }),
24
36
  },
25
37
  };
38
+ /**
39
+ * Register (or replace) a timer kind so custom types behave like the built-ins.
40
+ * Call once at startup, before any timer of that type is created. Example:
41
+ *
42
+ * ```ts
43
+ * registerTimerKind("pomodoro", {
44
+ * // 25-min work block — behaves like a countdown
45
+ * ...TIMER_KINDS.countdown,
46
+ * icon: "🍅",
47
+ * initial: () => ({ anchorAt: null, accumMs: 25 * 60_000, durationMs: 25 * 60_000 }),
48
+ * });
49
+ * ```
50
+ */
51
+ export function registerTimerKind(type, kind) {
52
+ TIMER_KINDS[type] = kind;
53
+ }
54
+ /**
55
+ * The registered kind for `type`. **Throws** if the kind was never registered —
56
+ * the strict getter, for callers that control the type and want to fail loudly
57
+ * on a typo. Rendering / display of *synced* shape data (whose `timerType` is
58
+ * untrusted — stale documents, remote updates for a kind this client never
59
+ * registered) must use {@link resolveTimerKind} instead so a bad value can't
60
+ * crash the render tree.
61
+ */
62
+ export function getTimerKind(type) {
63
+ const kind = TIMER_KINDS[type];
64
+ if (!kind)
65
+ throw new Error(`[timter] unknown timer type "${type}" (register it with registerTimerKind)`);
66
+ return kind;
67
+ }
68
+ /**
69
+ * A safe, inert kind used for unregistered types: the displayed time stays frozen
70
+ * at the stored `accumMs` and it is never "done" (start/pause still flip the
71
+ * `running` flag but leave `anchorAt`/`accumMs` untouched, so the reading doesn't
72
+ * move). Keeps a malformed or unknown `timerType` from throwing mid-render.
73
+ */
74
+ const FALLBACK_KIND = {
75
+ icon: "⏱",
76
+ displayMs: (c) => c.accumMs,
77
+ isDone: () => false,
78
+ onStart: (c) => ({ anchorAt: c.anchorAt, accumMs: c.accumMs }),
79
+ onPause: (c) => ({ anchorAt: c.anchorAt, accumMs: c.accumMs }),
80
+ initial: (d) => ({ anchorAt: null, accumMs: d, durationMs: d }),
81
+ };
82
+ /**
83
+ * Like {@link getTimerKind} but **never throws** — returns {@link FALLBACK_KIND}
84
+ * for an unregistered type. Use everywhere a timer's kind is resolved from
85
+ * synced/untrusted shape data (render, LOD, Controls rebuild, transitions) so an
86
+ * unknown kind degrades to an inert display instead of crashing the canvas.
87
+ */
88
+ export function resolveTimerKind(type) {
89
+ return TIMER_KINDS[type] ?? FALLBACK_KIND;
90
+ }
91
+ /** All registered timer-type ids, in registration order. */
92
+ export function timerTypes() {
93
+ return Object.keys(TIMER_KINDS);
94
+ }
26
95
  /** Fresh, stopped core for a type + configured duration. */
27
96
  export function initialCore(type, durationMs) {
28
- return { type, running: false, ...TIMER_KINDS[type].initial(durationMs) };
97
+ return { type, running: false, ...resolveTimerKind(type).initial(durationMs) };
29
98
  }
30
99
  export function displayMs(c, serverNow) {
31
- return TIMER_KINDS[c.type].displayMs(c, serverNow);
100
+ return resolveTimerKind(c.type).displayMs(c, serverNow);
32
101
  }
33
102
  export function isDone(c, serverNow) {
34
- return TIMER_KINDS[c.type].isDone(c, serverNow);
103
+ return resolveTimerKind(c.type).isDone(c, serverNow);
35
104
  }
36
105
  /** Start or resume. Returns the same core (no-op) if already running. */
37
106
  export function start(c, serverNow) {
38
107
  if (c.running)
39
108
  return c;
40
- return { ...c, ...TIMER_KINDS[c.type].onStart(c, serverNow), running: true };
109
+ return { ...c, ...resolveTimerKind(c.type).onStart(c, serverNow), running: true };
41
110
  }
42
111
  /** Pause, snapshotting remaining/elapsed. No-op if already paused. */
43
112
  export function pause(c, serverNow) {
44
113
  if (!c.running)
45
114
  return c;
46
- return { ...c, ...TIMER_KINDS[c.type].onPause(c, serverNow), running: false };
115
+ return { ...c, ...resolveTimerKind(c.type).onPause(c, serverNow), running: false };
47
116
  }
48
117
  /** Return to the stopped, initial state for the configured duration. */
49
118
  export function reset(c) {
@@ -1 +1 @@
1
- {"version":3,"file":"timer-model.js","sourceRoot":"","sources":["../src/timer-model.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"timer-model.js","sourceRoot":"","sources":["../src/timer-model.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import { type PluginContext, type ShapeData } from "@edv4h/usketch-shared";
2
2
  import type { ServerClock } from "@edv4h/usketch-sync";
3
+ import { type ReactElement } from "react";
3
4
  import { type TimerCore, type TimerType } from "./timer-model.js";
4
5
  export declare const TIMER_SHAPE_TYPE = "timer";
5
6
  /** A timer as a placeable canvas shape. Timing state mirrors {@link TimerCore}. */
@@ -14,7 +15,9 @@ export interface TimerShapeData extends ShapeData {
14
15
  export type ShapeAction = {
15
16
  id: string;
16
17
  action: "toggle" | "reset" | "switch-type";
17
- } | {
18
+ }
19
+ /** `value` is a delta in **milliseconds** applied to the configured duration. */
20
+ | {
18
21
  id: string;
19
22
  action: "adjust";
20
23
  value: number;
@@ -23,6 +26,40 @@ export declare const coreOf: (s: TimerShapeData) => TimerCore;
23
26
  declare function emit(detail: ShapeAction): void;
24
27
  /** Dispatch a timer-shape action (toggle/reset/…) — used by the Controls actions too. */
25
28
  export declare const dispatchTimerShapeAction: typeof emit;
29
+ /**
30
+ * Live actions handed to a timer-shape renderer. Each dispatches the same event
31
+ * the built-in buttons use, so a custom renderer stays in sync with the Controls
32
+ * dock and never touches the store directly.
33
+ */
34
+ export interface TimerShapeActions {
35
+ /** Start if paused, pause if running. */
36
+ toggle(): void;
37
+ /** Return to the configured, stopped state. */
38
+ reset(): void;
39
+ /** Advance to the next registered timer kind (only while paused). */
40
+ switchType(): void;
41
+ /** Change the configured duration by `deltaMs` (duration-based kinds, while paused). */
42
+ adjust(deltaMs: number): void;
43
+ }
44
+ /**
45
+ * Everything a timer-shape renderer needs. `core` / `serverNow` are recomputed on
46
+ * every self-tick while running, so a renderer can read `displayMs(core, serverNow)`
47
+ * / `isDone(core, serverNow)` straight from the model without its own clock.
48
+ */
49
+ export interface TimerRenderContext {
50
+ shape: TimerShapeData;
51
+ core: TimerCore;
52
+ serverNow: number;
53
+ actions: TimerShapeActions;
54
+ }
55
+ /**
56
+ * Replaces the built-in timer-shape visual. Supplied via
57
+ * `TimterPluginOptions.renderShape`; when omitted the plugin uses
58
+ * {@link defaultRenderTimerShape}. Wrap the default to extend rather than replace.
59
+ */
60
+ export type TimerShapeRenderer = (ctx: TimerRenderContext) => ReactElement;
61
+ /** The built-in timer-shape renderer. Exported so hosts can wrap/extend it. */
62
+ export declare function defaultRenderTimerShape({ shape, core, serverNow, actions, }: TimerRenderContext): ReactElement;
26
63
  /** Build a started timer shape of a given type/duration (used by Controls "add"). */
27
64
  export declare function makeTimerShape(params: {
28
65
  id: string;
@@ -35,8 +72,9 @@ export declare function makeTimerShape(params: {
35
72
  /**
36
73
  * Register the timer shape, its draw tool, and the button-action listener.
37
74
  * `serverClock` is closed over by the renderer so every client computes the
38
- * remaining/elapsed time against the shared server clock.
75
+ * remaining/elapsed time against the shared server clock. `renderShape`
76
+ * overrides the built-in visual (defaults to {@link defaultRenderTimerShape}).
39
77
  */
40
- export declare function registerTimerShape(ctx: PluginContext, serverClock: ServerClock, _userId: string): () => void;
78
+ export declare function registerTimerShape(ctx: PluginContext, serverClock: ServerClock, _userId: string, renderShape?: TimerShapeRenderer): () => void;
41
79
  export {};
42
80
  //# sourceMappingURL=timer-shape.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"timer-shape.d.ts","sourceRoot":"","sources":["../src/timer-shape.tsx"],"names":[],"mappings":"AAAA,OAAO,EAIN,KAAK,aAAa,EAGlB,KAAK,SAAS,EAEd,MAAM,uBAAuB,CAAC;AAE/B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD,OAAO,EAQN,KAAK,SAAS,EACd,KAAK,SAAS,EACd,MAAM,kBAAkB,CAAC;AAE1B,eAAO,MAAM,gBAAgB,UAAU,CAAC;AAIxC,mFAAmF;AACnF,MAAM,WAAW,cAAe,SAAQ,SAAS;IAChD,IAAI,EAAE,OAAO,gBAAgB,CAAC;IAC9B,SAAS,EAAE,SAAS,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,WAAW,GACpB;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,QAAQ,GAAG,OAAO,GAAG,aAAa,CAAA;CAAE,GAC1D;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnD,eAAO,MAAM,MAAM,MAAO,cAAc,KAAG,SAMzC,CAAC;AAUH,iBAAS,IAAI,CAAC,MAAM,EAAE,WAAW,QAEhC;AAED,yFAAyF;AACzF,eAAO,MAAM,wBAAwB,aAAO,CAAC;AAyP7C,qFAAqF;AACrF,wBAAgB,cAAc,CAAC,MAAM,EAAE;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,SAAS,EAAE,SAAS,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CAClB,GAAG,cAAc,CAMjB;AAYD;;;;GAIG;AACH,wBAAgB,kBAAkB,CACjC,GAAG,EAAE,aAAa,EAClB,WAAW,EAAE,WAAW,EACxB,OAAO,EAAE,MAAM,GACb,MAAM,IAAI,CAkGZ"}
1
+ {"version":3,"file":"timer-shape.d.ts","sourceRoot":"","sources":["../src/timer-shape.tsx"],"names":[],"mappings":"AAAA,OAAO,EAIN,KAAK,aAAa,EAGlB,KAAK,SAAS,EAEd,MAAM,uBAAuB,CAAC;AAE/B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,KAAK,YAAY,EAAyB,MAAM,OAAO,CAAC;AACjE,OAAO,EASN,KAAK,SAAS,EACd,KAAK,SAAS,EAEd,MAAM,kBAAkB,CAAC;AAE1B,eAAO,MAAM,gBAAgB,UAAU,CAAC;AAIxC,mFAAmF;AACnF,MAAM,WAAW,cAAe,SAAQ,SAAS;IAChD,IAAI,EAAE,OAAO,gBAAgB,CAAC;IAC9B,SAAS,EAAE,SAAS,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,WAAW,GACpB;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,QAAQ,GAAG,OAAO,GAAG,aAAa,CAAA;CAAE;AAC5D,iFAAiF;GAC/E;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnD,eAAO,MAAM,MAAM,MAAO,cAAc,KAAG,SAMzC,CAAC;AAUH,iBAAS,IAAI,CAAC,MAAM,EAAE,WAAW,QAEhC;AAED,yFAAyF;AACzF,eAAO,MAAM,wBAAwB,aAAO,CAAC;AAI7C;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IACjC,yCAAyC;IACzC,MAAM,IAAI,IAAI,CAAC;IACf,+CAA+C;IAC/C,KAAK,IAAI,IAAI,CAAC;IACd,qEAAqE;IACrE,UAAU,IAAI,IAAI,CAAC;IACnB,wFAAwF;IACxF,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED;;;;GAIG;AACH,MAAM,WAAW,kBAAkB;IAClC,KAAK,EAAE,cAAc,CAAC;IACtB,IAAI,EAAE,SAAS,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,iBAAiB,CAAC;CAC3B;AAED;;;;GAIG;AACH,MAAM,MAAM,kBAAkB,GAAG,CAAC,GAAG,EAAE,kBAAkB,KAAK,YAAY,CAAC;AAe3E,+EAA+E;AAC/E,wBAAgB,uBAAuB,CAAC,EACvC,KAAK,EACL,IAAI,EACJ,SAAS,EACT,OAAO,GACP,EAAE,kBAAkB,GAAG,YAAY,CA8GnC;AAmJD,qFAAqF;AACrF,wBAAgB,cAAc,CAAC,MAAM,EAAE;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,SAAS,EAAE,SAAS,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CAClB,GAAG,cAAc,CAOjB;AAYD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CACjC,GAAG,EAAE,aAAa,EAClB,WAAW,EAAE,WAAW,EACxB,OAAO,EAAE,MAAM,EACf,WAAW,GAAE,kBAA4C,GACvD,MAAM,IAAI,CAgHZ"}
@@ -2,7 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { generateId, } from "@edv4h/usketch-shared";
3
3
  import { createAddShapeCommand } from "@edv4h/usketch-store";
4
4
  import { useEffect, useReducer } from "react";
5
- import { displayMs, formatDuration, initialCore, isDone, pause, reset, start, } from "./timer-model.js";
5
+ import { displayMs, formatDuration, initialCore, isDone, pause, reset, resolveTimerKind, start, timerTypes, } from "./timer-model.js";
6
6
  export const TIMER_SHAPE_TYPE = "timer";
7
7
  const DEFAULT_MINUTES = 5;
8
8
  const ACTION_EVENT = "usketch:timter-shape-action";
@@ -25,7 +25,6 @@ function emit(detail) {
25
25
  }
26
26
  /** Dispatch a timer-shape action (toggle/reset/…) — used by the Controls actions too. */
27
27
  export const dispatchTimerShapeAction = emit;
28
- // ── View ──
29
28
  const btn = {
30
29
  border: "1px solid #d1d5db",
31
30
  borderRadius: 6,
@@ -36,21 +35,13 @@ const btn = {
36
35
  lineHeight: 1,
37
36
  padding: "4px 8px",
38
37
  };
39
- function TimerShapeView({ shape, serverClock, }) {
40
- const [, force] = useReducer((n) => n + 1, 0);
38
+ const stopEvent = (e) => e.stopPropagation();
39
+ /** The built-in timer-shape renderer. Exported so hosts can wrap/extend it. */
40
+ export function defaultRenderTimerShape({ shape, core, serverNow, actions, }) {
41
41
  const running = shape.running;
42
- // Self-tick while running so the display counts without writing to the store.
43
- useEffect(() => {
44
- if (!running)
45
- return;
46
- const id = setInterval(force, 250);
47
- return () => clearInterval(id);
48
- }, [running]);
49
- const core = coreOf(shape);
50
- const serverNow = serverClock.now();
51
- const done = shape.timerType === "countdown" && isDone(core, serverNow);
52
- const icon = shape.timerType === "countdown" ? "⏳" : "⏱";
53
- const stop = (e) => e.stopPropagation();
42
+ const done = isDone(core, serverNow);
43
+ const icon = resolveTimerKind(shape.timerType).icon ?? "⏱";
44
+ const durationBased = core.durationMs > 0;
54
45
  return (_jsxs("div", { style: {
55
46
  width: "100%",
56
47
  height: "100%",
@@ -66,28 +57,56 @@ function TimerShapeView({ shape, serverClock, }) {
66
57
  borderRadius: 10,
67
58
  fontFamily: "system-ui, sans-serif",
68
59
  userSelect: "none",
69
- }, children: [_jsxs("div", { style: { display: "flex", alignItems: "center", gap: 6 }, children: [!running && (_jsx("button", { type: "button", title: "\u7A2E\u5225\u3092\u5207\u66FF", style: btn, onPointerDown: stop, onClick: (e) => {
70
- stop(e);
71
- emit({ id: shape.id, action: "switch-type" });
60
+ }, children: [_jsxs("div", { style: { display: "flex", alignItems: "center", gap: 6 }, children: [!running && (_jsx("button", { type: "button", title: "\u7A2E\u5225\u3092\u5207\u66FF", style: btn, onPointerDown: stopEvent, onClick: (e) => {
61
+ stopEvent(e);
62
+ actions.switchType();
72
63
  }, children: icon })), running && _jsx("span", { style: { fontSize: 16 }, children: icon }), _jsx("span", { style: {
73
64
  fontVariantNumeric: "tabular-nums",
74
65
  fontSize: 30,
75
66
  fontWeight: 700,
76
67
  color: done ? "#b91c1c" : "#1e1e1e",
77
- }, children: formatDuration(displayMs(core, serverNow)) })] }), !running && shape.timerType === "countdown" && (_jsxs("div", { style: { display: "flex", alignItems: "center", gap: 6 }, children: [_jsx("button", { type: "button", title: "\u22121\u5206", style: btn, onPointerDown: stop, onClick: (e) => {
78
- stop(e);
79
- emit({ id: shape.id, action: "adjust", value: -1 });
80
- }, children: "\u2212" }), _jsx("button", { type: "button", title: "+1\u5206", style: btn, onPointerDown: stop, onClick: (e) => {
81
- stop(e);
82
- emit({ id: shape.id, action: "adjust", value: 1 });
83
- }, children: "\uFF0B" })] })), _jsxs("div", { style: { display: "flex", gap: 8 }, children: [_jsx("button", { type: "button", title: running ? "一時停止" : "開始", style: btn, onPointerDown: stop, onClick: (e) => {
84
- stop(e);
85
- emit({ id: shape.id, action: "toggle" });
86
- }, children: running ? "⏸" : "▶" }), _jsx("button", { type: "button", title: "\u30EA\u30BB\u30C3\u30C8", style: btn, onPointerDown: stop, onClick: (e) => {
87
- stop(e);
88
- emit({ id: shape.id, action: "reset" });
68
+ }, children: formatDuration(displayMs(core, serverNow)) })] }), !running && durationBased && (_jsxs("div", { style: { display: "flex", alignItems: "center", gap: 6 }, children: [_jsx("button", { type: "button", title: "\u22121\u5206", style: btn, onPointerDown: stopEvent, onClick: (e) => {
69
+ stopEvent(e);
70
+ actions.adjust(-60_000);
71
+ }, children: "\u2212" }), _jsx("button", { type: "button", title: "+1\u5206", style: btn, onPointerDown: stopEvent, onClick: (e) => {
72
+ stopEvent(e);
73
+ actions.adjust(60_000);
74
+ }, children: "\uFF0B" })] })), _jsxs("div", { style: { display: "flex", gap: 8 }, children: [_jsx("button", { type: "button", title: running ? "一時停止" : "開始", style: btn, onPointerDown: stopEvent, onClick: (e) => {
75
+ stopEvent(e);
76
+ actions.toggle();
77
+ }, children: running ? "⏸" : "▶" }), _jsx("button", { type: "button", title: "\u30EA\u30BB\u30C3\u30C8", style: btn, onPointerDown: stopEvent, onClick: (e) => {
78
+ stopEvent(e);
79
+ actions.reset();
89
80
  }, children: "\u21BA" })] })] }));
90
81
  }
82
+ // ── View ──
83
+ /**
84
+ * Host wrapper around a timer-shape renderer. Owns the self-tick (so the display
85
+ * counts down without writing to the store), recomputes `core`/`serverNow` each
86
+ * render, and builds the {@link TimerShapeActions} that emit the shared action
87
+ * event. Delegates the actual visual to `render` (a host `renderShape` or the
88
+ * built-in {@link defaultRenderTimerShape}).
89
+ */
90
+ function TimerShapeView({ shape, serverClock, render, }) {
91
+ const [, force] = useReducer((n) => n + 1, 0);
92
+ const running = shape.running;
93
+ // Self-tick while running so the display counts without writing to the store.
94
+ useEffect(() => {
95
+ if (!running)
96
+ return;
97
+ const id = setInterval(force, 250);
98
+ return () => clearInterval(id);
99
+ }, [running]);
100
+ const core = coreOf(shape);
101
+ const serverNow = serverClock.now();
102
+ const actions = {
103
+ toggle: () => emit({ id: shape.id, action: "toggle" }),
104
+ reset: () => emit({ id: shape.id, action: "reset" }),
105
+ switchType: () => emit({ id: shape.id, action: "switch-type" }),
106
+ adjust: (deltaMs) => emit({ id: shape.id, action: "adjust", value: deltaMs }),
107
+ };
108
+ return render({ shape, core, serverNow, actions });
109
+ }
91
110
  function SimplifiedTimer({ shape }) {
92
111
  // LOD: static time, no controls (LOD is non-interactive).
93
112
  const s = shape;
@@ -111,7 +130,7 @@ function SimplifiedTimer({ shape }) {
111
130
  overflow: "hidden",
112
131
  transform: rotation ? `rotate(${rotation}deg)` : undefined,
113
132
  transformOrigin: "center center",
114
- }, children: [s.timerType === "countdown" ? "⏳" : "⏱", " ", formatDuration(s.accumMs)] }));
133
+ }, children: [resolveTimerKind(s.timerType).icon ?? "⏱", " ", formatDuration(s.accumMs)] }));
115
134
  }
116
135
  // ── Geometry ──
117
136
  function getBounds(data) {
@@ -182,7 +201,9 @@ function createDefault(params) {
182
201
  /** Build a started timer shape of a given type/duration (used by Controls "add"). */
183
202
  export function makeTimerShape(params) {
184
203
  const base = createDefault({ id: params.id, x: params.x, y: params.y });
185
- const dur = params.timerType === "countdown" ? (params.durationMs ?? DEFAULT_MINUTES * 60_000) : 0;
204
+ // The kind's `initial` decides how (or whether) the duration is used —
205
+ // non-duration kinds like stopwatch ignore it.
206
+ const dur = params.durationMs ?? DEFAULT_MINUTES * 60_000;
186
207
  const core = start(initialCore(params.timerType, dur), params.serverNow);
187
208
  return { ...base, ...corePatch(core) };
188
209
  }
@@ -192,12 +213,13 @@ function TimerToolIcon() {
192
213
  /**
193
214
  * Register the timer shape, its draw tool, and the button-action listener.
194
215
  * `serverClock` is closed over by the renderer so every client computes the
195
- * remaining/elapsed time against the shared server clock.
216
+ * remaining/elapsed time against the shared server clock. `renderShape`
217
+ * overrides the built-in visual (defaults to {@link defaultRenderTimerShape}).
196
218
  */
197
- export function registerTimerShape(ctx, serverClock, _userId) {
219
+ export function registerTimerShape(ctx, serverClock, _userId, renderShape = defaultRenderTimerShape) {
198
220
  const now = () => serverClock.now();
199
221
  ctx.shapes.register(TIMER_SHAPE_TYPE, {
200
- render: (shape) => _jsx(TimerShapeView, { shape: shape, serverClock: serverClock }),
222
+ render: (shape) => (_jsx(TimerShapeView, { shape: shape, serverClock: serverClock, render: renderShape })),
201
223
  getBounds,
202
224
  hitTest,
203
225
  resize,
@@ -225,15 +247,24 @@ export function registerTimerShape(ctx, serverClock, _userId) {
225
247
  case "switch-type": {
226
248
  if (core.running)
227
249
  return;
228
- const nextType = core.type === "countdown" ? "stopwatch" : "countdown";
229
- const dur = nextType === "countdown" ? core.durationMs || DEFAULT_MINUTES * 60_000 : 0;
230
- next = initialCore(nextType, dur);
250
+ // Cycle through every registered kind (built-ins + host-registered).
251
+ const types = timerTypes();
252
+ const idx = types.indexOf(core.type);
253
+ // Unknown/removed kind: don't silently switch to the first kind — leave
254
+ // the shape untouched (the model treats unregistered types as an error).
255
+ if (idx < 0)
256
+ return;
257
+ const nextType = types[(idx + 1) % types.length] ?? core.type;
258
+ // Carry a sensible duration forward; non-duration kinds (e.g. stopwatch)
259
+ // ignore it via their own `initial`.
260
+ next = initialCore(nextType, core.durationMs || DEFAULT_MINUTES * 60_000);
231
261
  break;
232
262
  }
233
263
  case "adjust": {
234
- if (core.running || core.type !== "countdown")
264
+ // `value` is a millisecond delta; only duration-based kinds respond.
265
+ if (core.running || core.durationMs <= 0)
235
266
  return;
236
- next = initialCore("countdown", Math.max(60_000, core.durationMs + detail.value * 60_000));
267
+ next = initialCore(core.type, Math.max(60_000, core.durationMs + detail.value));
237
268
  break;
238
269
  }
239
270
  default:
@@ -1 +1 @@
1
- {"version":3,"file":"timer-shape.js","sourceRoot":"","sources":["../src/timer-shape.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"timer-shape.js","sourceRoot":"","sources":["../src/timer-shape.tsx"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@edv4h/usketch-plugin-timter",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",