@edv4h/usketch-plugin-timter 0.1.0 → 0.3.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,39 @@
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;
17
+ /**
18
+ * Minimum size the timer shape can be resized to. Defaults to `120×90`.
19
+ * Raise it when a custom {@link renderShape} needs more room (e.g. a row of
20
+ * controls that would otherwise wrap).
21
+ */
22
+ minSize?: {
23
+ width: number;
24
+ height: number;
25
+ };
26
+ /** Size of a newly created timer shape (`createDefault` / timer-draw). Defaults to `160×120`. */
27
+ defaultSize?: {
28
+ width: number;
29
+ height: number;
30
+ };
31
+ /**
32
+ * Lower bound (ms) for a countdown's configured duration, enforced by the
33
+ * `adjust` / `set-duration` actions. Defaults to `60_000` (1 min). Set e.g.
34
+ * `1_000` to allow sub-minute durations (0:01–).
35
+ */
36
+ minDurationMs?: number;
8
37
  }
9
38
  /**
10
39
  * 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,EAUN,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;IACjC;;;;OAIG;IACH,OAAO,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5C,iGAAiG;IACjG,WAAW,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAChD;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,mBAAmB,GAAG,aAAa,CA+I9E"}
package/dist/plugin.js CHANGED
@@ -1,7 +1,7 @@
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";
4
- import { coreOf, dispatchTimerShapeAction, makeTimerShape, registerTimerShape, TIMER_SHAPE_TYPE, } from "./timer-shape.js";
3
+ import { displayMs, formatDuration, isDone, resolveTimerKind, } from "./timer-model.js";
4
+ import { coreOf, DEFAULT_MIN_DURATION_MS, DEFAULT_TIMER_MIN_SIZE, DEFAULT_TIMER_SIZE, 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
7
7
  * (see `timer-shape`) is placeable/movable and syncs via the normal shapes map;
@@ -16,8 +16,11 @@ export function createTimterPlugin(options) {
16
16
  name: "タイマー",
17
17
  setup(ctx) {
18
18
  const now = () => options.serverClock.now();
19
+ const minSize = options.minSize ?? DEFAULT_TIMER_MIN_SIZE;
20
+ const defaultSize = options.defaultSize ?? DEFAULT_TIMER_SIZE;
21
+ const minDurationMs = options.minDurationMs ?? DEFAULT_MIN_DURATION_MS;
19
22
  // ── Timer shape (placeable, movable) — the source of truth ──
20
- const disposeShape = registerTimerShape(ctx, options.serverClock, options.userId ?? "local");
23
+ const disposeShape = registerTimerShape(ctx, options.serverClock, options.userId ?? "local", options.renderShape, { minSize, defaultSize, minDurationMs });
21
24
  const listTimers = () => [...ctx.store.getShapes().values()]
22
25
  .filter((s) => s.type === TIMER_SHAPE_TYPE)
23
26
  .sort((a, b) => (a.createdAt ?? 0) - (b.createdAt ?? 0) || a.id.localeCompare(b.id));
@@ -28,11 +31,12 @@ export function createTimterPlugin(options) {
28
31
  const cy = (window.innerHeight / 2 - vp.y) / vp.zoom;
29
32
  const shape = makeTimerShape({
30
33
  id: generateId(),
31
- x: cx - 80,
32
- y: cy - 60,
34
+ x: cx - defaultSize.width / 2,
35
+ y: cy - defaultSize.height / 2,
33
36
  timerType,
34
37
  durationMs,
35
38
  serverNow: now(),
39
+ size: defaultSize,
36
40
  });
37
41
  ctx.commands.execute(createAddShapeCommand(ctx.store, shape));
38
42
  ctx.store.setSelection([shape.id]);
@@ -80,8 +84,8 @@ export function createTimterPlugin(options) {
80
84
  const serverNow = now();
81
85
  timers.forEach((s, idx) => {
82
86
  const n = idx + 1;
83
- const icon = s.timerType === "countdown" ? "⏳" : "⏱";
84
- const done = s.timerType === "countdown" && isDone(coreOf(s), serverNow);
87
+ const icon = resolveTimerKind(s.timerType).icon ?? "⏱";
88
+ const done = isDone(coreOf(s), serverNow);
85
89
  const time = formatDuration(displayMs(coreOf(s), serverNow));
86
90
  perTimerOffs.push(ctx.actions.register({
87
91
  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,7 +1,30 @@
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";
6
+ /** Default shape sizing / duration floor — overridable via {@link TimterPluginOptions}. */
7
+ export declare const DEFAULT_TIMER_MIN_SIZE: {
8
+ width: number;
9
+ height: number;
10
+ };
11
+ export declare const DEFAULT_TIMER_SIZE: {
12
+ width: number;
13
+ height: number;
14
+ };
15
+ export declare const DEFAULT_MIN_DURATION_MS = 60000;
16
+ /** Host-tunable sizing / duration config threaded into the timer shape. */
17
+ export interface TimerShapeConfig {
18
+ minSize: {
19
+ width: number;
20
+ height: number;
21
+ };
22
+ defaultSize: {
23
+ width: number;
24
+ height: number;
25
+ };
26
+ minDurationMs: number;
27
+ }
5
28
  /** A timer as a placeable canvas shape. Timing state mirrors {@link TimerCore}. */
6
29
  export interface TimerShapeData extends ShapeData {
7
30
  type: typeof TIMER_SHAPE_TYPE;
@@ -14,15 +37,61 @@ export interface TimerShapeData extends ShapeData {
14
37
  export type ShapeAction = {
15
38
  id: string;
16
39
  action: "toggle" | "reset" | "switch-type";
17
- } | {
40
+ }
41
+ /** `value` is a delta in **milliseconds** applied to the configured duration. */
42
+ | {
18
43
  id: string;
19
44
  action: "adjust";
20
45
  value: number;
46
+ }
47
+ /** `value` is an **absolute** target duration in milliseconds (clamped to the
48
+ * configured `minDurationMs`). Lets a host UI set e.g. 0:30 directly. */
49
+ | {
50
+ id: string;
51
+ action: "set-duration";
52
+ value: number;
21
53
  };
22
54
  export declare const coreOf: (s: TimerShapeData) => TimerCore;
23
55
  declare function emit(detail: ShapeAction): void;
24
56
  /** Dispatch a timer-shape action (toggle/reset/…) — used by the Controls actions too. */
25
57
  export declare const dispatchTimerShapeAction: typeof emit;
58
+ /**
59
+ * Live actions handed to a timer-shape renderer. Each dispatches the same event
60
+ * the built-in buttons use, so a custom renderer stays in sync with the Controls
61
+ * dock and never touches the store directly.
62
+ */
63
+ export interface TimerShapeActions {
64
+ /** Start if paused, pause if running. */
65
+ toggle(): void;
66
+ /** Return to the configured, stopped state. */
67
+ reset(): void;
68
+ /** Advance to the next registered timer kind (only while paused). */
69
+ switchType(): void;
70
+ /** Change the configured duration by `deltaMs` (duration-based kinds, while paused). */
71
+ adjust(deltaMs: number): void;
72
+ /** Set the configured duration to an absolute `ms` (clamped to `minDurationMs`,
73
+ * while paused). Use for a host "分:秒" input. */
74
+ setDuration(ms: number): void;
75
+ }
76
+ /**
77
+ * Everything a timer-shape renderer needs. `core` / `serverNow` are recomputed on
78
+ * every self-tick while running, so a renderer can read `displayMs(core, serverNow)`
79
+ * / `isDone(core, serverNow)` straight from the model without its own clock.
80
+ */
81
+ export interface TimerRenderContext {
82
+ shape: TimerShapeData;
83
+ core: TimerCore;
84
+ serverNow: number;
85
+ actions: TimerShapeActions;
86
+ }
87
+ /**
88
+ * Replaces the built-in timer-shape visual. Supplied via
89
+ * `TimterPluginOptions.renderShape`; when omitted the plugin uses
90
+ * {@link defaultRenderTimerShape}. Wrap the default to extend rather than replace.
91
+ */
92
+ export type TimerShapeRenderer = (ctx: TimerRenderContext) => ReactElement;
93
+ /** The built-in timer-shape renderer. Exported so hosts can wrap/extend it. */
94
+ export declare function defaultRenderTimerShape({ shape, core, serverNow, actions, }: TimerRenderContext): ReactElement;
26
95
  /** Build a started timer shape of a given type/duration (used by Controls "add"). */
27
96
  export declare function makeTimerShape(params: {
28
97
  id: string;
@@ -31,12 +100,18 @@ export declare function makeTimerShape(params: {
31
100
  timerType: TimerType;
32
101
  durationMs?: number;
33
102
  serverNow: number;
103
+ /** Initial shape size. Defaults to {@link DEFAULT_TIMER_SIZE}. */
104
+ size?: {
105
+ width: number;
106
+ height: number;
107
+ };
34
108
  }): TimerShapeData;
35
109
  /**
36
110
  * Register the timer shape, its draw tool, and the button-action listener.
37
111
  * `serverClock` is closed over by the renderer so every client computes the
38
- * remaining/elapsed time against the shared server clock.
112
+ * remaining/elapsed time against the shared server clock. `renderShape`
113
+ * overrides the built-in visual (defaults to {@link defaultRenderTimerShape}).
39
114
  */
40
- export declare function registerTimerShape(ctx: PluginContext, serverClock: ServerClock, _userId: string): () => void;
115
+ export declare function registerTimerShape(ctx: PluginContext, serverClock: ServerClock, _userId: string, renderShape?: TimerShapeRenderer, config?: TimerShapeConfig): () => void;
41
116
  export {};
42
117
  //# 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":"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"}
@@ -2,10 +2,19 @@ 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";
9
+ /** Default shape sizing / duration floor — overridable via {@link TimterPluginOptions}. */
10
+ export const DEFAULT_TIMER_MIN_SIZE = { width: 120, height: 90 };
11
+ export const DEFAULT_TIMER_SIZE = { width: 160, height: 120 };
12
+ export const DEFAULT_MIN_DURATION_MS = 60_000;
13
+ const DEFAULT_TIMER_CONFIG = {
14
+ minSize: DEFAULT_TIMER_MIN_SIZE,
15
+ defaultSize: DEFAULT_TIMER_SIZE,
16
+ minDurationMs: DEFAULT_MIN_DURATION_MS,
17
+ };
9
18
  export const coreOf = (s) => ({
10
19
  type: s.timerType,
11
20
  running: s.running,
@@ -25,7 +34,6 @@ function emit(detail) {
25
34
  }
26
35
  /** Dispatch a timer-shape action (toggle/reset/…) — used by the Controls actions too. */
27
36
  export const dispatchTimerShapeAction = emit;
28
- // ── View ──
29
37
  const btn = {
30
38
  border: "1px solid #d1d5db",
31
39
  borderRadius: 6,
@@ -36,21 +44,13 @@ const btn = {
36
44
  lineHeight: 1,
37
45
  padding: "4px 8px",
38
46
  };
39
- function TimerShapeView({ shape, serverClock, }) {
40
- const [, force] = useReducer((n) => n + 1, 0);
47
+ const stopEvent = (e) => e.stopPropagation();
48
+ /** The built-in timer-shape renderer. Exported so hosts can wrap/extend it. */
49
+ export function defaultRenderTimerShape({ shape, core, serverNow, actions, }) {
41
50
  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();
51
+ const done = isDone(core, serverNow);
52
+ const icon = resolveTimerKind(shape.timerType).icon ?? "⏱";
53
+ const durationBased = core.durationMs > 0;
54
54
  return (_jsxs("div", { style: {
55
55
  width: "100%",
56
56
  height: "100%",
@@ -66,28 +66,57 @@ function TimerShapeView({ shape, serverClock, }) {
66
66
  borderRadius: 10,
67
67
  fontFamily: "system-ui, sans-serif",
68
68
  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" });
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: stopEvent, onClick: (e) => {
70
+ stopEvent(e);
71
+ actions.switchType();
72
72
  }, children: icon })), running && _jsx("span", { style: { fontSize: 16 }, children: icon }), _jsx("span", { style: {
73
73
  fontVariantNumeric: "tabular-nums",
74
74
  fontSize: 30,
75
75
  fontWeight: 700,
76
76
  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" });
77
+ }, 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) => {
78
+ stopEvent(e);
79
+ actions.adjust(-60_000);
80
+ }, children: "\u2212" }), _jsx("button", { type: "button", title: "+1\u5206", style: btn, onPointerDown: stopEvent, onClick: (e) => {
81
+ stopEvent(e);
82
+ actions.adjust(60_000);
83
+ }, children: "\uFF0B" })] })), _jsxs("div", { style: { display: "flex", gap: 8 }, children: [_jsx("button", { type: "button", title: running ? "一時停止" : "開始", style: btn, onPointerDown: stopEvent, onClick: (e) => {
84
+ stopEvent(e);
85
+ actions.toggle();
86
+ }, children: running ? "⏸" : "▶" }), _jsx("button", { type: "button", title: "\u30EA\u30BB\u30C3\u30C8", style: btn, onPointerDown: stopEvent, onClick: (e) => {
87
+ stopEvent(e);
88
+ actions.reset();
89
89
  }, children: "\u21BA" })] })] }));
90
90
  }
91
+ // ── View ──
92
+ /**
93
+ * Host wrapper around a timer-shape renderer. Owns the self-tick (so the display
94
+ * counts down without writing to the store), recomputes `core`/`serverNow` each
95
+ * render, and builds the {@link TimerShapeActions} that emit the shared action
96
+ * event. Delegates the actual visual to `render` (a host `renderShape` or the
97
+ * built-in {@link defaultRenderTimerShape}).
98
+ */
99
+ function TimerShapeView({ shape, serverClock, render, }) {
100
+ const [, force] = useReducer((n) => n + 1, 0);
101
+ const running = shape.running;
102
+ // Self-tick while running so the display counts without writing to the store.
103
+ useEffect(() => {
104
+ if (!running)
105
+ return;
106
+ const id = setInterval(force, 250);
107
+ return () => clearInterval(id);
108
+ }, [running]);
109
+ const core = coreOf(shape);
110
+ const serverNow = serverClock.now();
111
+ const actions = {
112
+ toggle: () => emit({ id: shape.id, action: "toggle" }),
113
+ reset: () => emit({ id: shape.id, action: "reset" }),
114
+ switchType: () => emit({ id: shape.id, action: "switch-type" }),
115
+ adjust: (deltaMs) => emit({ id: shape.id, action: "adjust", value: deltaMs }),
116
+ setDuration: (ms) => emit({ id: shape.id, action: "set-duration", value: ms }),
117
+ };
118
+ return render({ shape, core, serverNow, actions });
119
+ }
91
120
  function SimplifiedTimer({ shape }) {
92
121
  // LOD: static time, no controls (LOD is non-interactive).
93
122
  const s = shape;
@@ -111,7 +140,7 @@ function SimplifiedTimer({ shape }) {
111
140
  overflow: "hidden",
112
141
  transform: rotation ? `rotate(${rotation}deg)` : undefined,
113
142
  transformOrigin: "center center",
114
- }, children: [s.timerType === "countdown" ? "⏳" : "⏱", " ", formatDuration(s.accumMs)] }));
143
+ }, children: [resolveTimerKind(s.timerType).icon ?? "⏱", " ", formatDuration(s.accumMs)] }));
115
144
  }
116
145
  // ── Geometry ──
117
146
  function getBounds(data) {
@@ -123,7 +152,7 @@ function hitTest(data, point) {
123
152
  point.y >= data.y &&
124
153
  point.y <= data.y + data.height);
125
154
  }
126
- function resize(data, handle, delta) {
155
+ function resize(data, handle, delta, minSize = DEFAULT_TIMER_MIN_SIZE) {
127
156
  let { x, y, width, height } = data;
128
157
  switch (handle) {
129
158
  case "se":
@@ -161,16 +190,22 @@ function resize(data, handle, delta) {
161
190
  height += delta.y;
162
191
  break;
163
192
  }
164
- return { ...data, x, y, width: Math.max(120, width), height: Math.max(90, height) };
193
+ return {
194
+ ...data,
195
+ x,
196
+ y,
197
+ width: Math.max(minSize.width, width),
198
+ height: Math.max(minSize.height, height),
199
+ };
165
200
  }
166
- function createDefault(params) {
201
+ function createDefault(params, size = DEFAULT_TIMER_SIZE) {
167
202
  return {
168
203
  id: params.id,
169
204
  type: TIMER_SHAPE_TYPE,
170
205
  x: params.x,
171
206
  y: params.y,
172
- width: 160,
173
- height: 120,
207
+ width: size.width,
208
+ height: size.height,
174
209
  style: { fill: "#ffffff", stroke: "#1e1e1e", strokeWidth: 2, opacity: 1 },
175
210
  timerType: "countdown",
176
211
  running: false,
@@ -181,8 +216,10 @@ function createDefault(params) {
181
216
  }
182
217
  /** Build a started timer shape of a given type/duration (used by Controls "add"). */
183
218
  export function makeTimerShape(params) {
184
- 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;
219
+ const base = createDefault({ id: params.id, x: params.x, y: params.y }, params.size);
220
+ // The kind's `initial` decides how (or whether) the duration is used —
221
+ // non-duration kinds like stopwatch ignore it.
222
+ const dur = params.durationMs ?? DEFAULT_MINUTES * 60_000;
186
223
  const core = start(initialCore(params.timerType, dur), params.serverNow);
187
224
  return { ...base, ...corePatch(core) };
188
225
  }
@@ -192,18 +229,20 @@ function TimerToolIcon() {
192
229
  /**
193
230
  * Register the timer shape, its draw tool, and the button-action listener.
194
231
  * `serverClock` is closed over by the renderer so every client computes the
195
- * remaining/elapsed time against the shared server clock.
232
+ * remaining/elapsed time against the shared server clock. `renderShape`
233
+ * overrides the built-in visual (defaults to {@link defaultRenderTimerShape}).
196
234
  */
197
- export function registerTimerShape(ctx, serverClock, _userId) {
235
+ export function registerTimerShape(ctx, serverClock, _userId, renderShape = defaultRenderTimerShape, config = DEFAULT_TIMER_CONFIG) {
198
236
  const now = () => serverClock.now();
237
+ const { minSize, defaultSize, minDurationMs } = config;
199
238
  ctx.shapes.register(TIMER_SHAPE_TYPE, {
200
- render: (shape) => _jsx(TimerShapeView, { shape: shape, serverClock: serverClock }),
239
+ render: (shape) => (_jsx(TimerShapeView, { shape: shape, serverClock: serverClock, render: renderShape })),
201
240
  getBounds,
202
241
  hitTest,
203
- resize,
204
- createDefault,
242
+ resize: (data, handle, delta) => resize(data, handle, delta, minSize),
243
+ createDefault: (params) => createDefault(params, defaultSize),
205
244
  renderTarget: "html",
206
- minSize: { width: 120, height: 90 },
245
+ minSize,
207
246
  simplifiedComponent: SimplifiedTimer,
208
247
  });
209
248
  // Button actions from the rendered shape mutate the shape via updateShape
@@ -225,15 +264,31 @@ export function registerTimerShape(ctx, serverClock, _userId) {
225
264
  case "switch-type": {
226
265
  if (core.running)
227
266
  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);
267
+ // Cycle through every registered kind (built-ins + host-registered).
268
+ const types = timerTypes();
269
+ const idx = types.indexOf(core.type);
270
+ // Unknown/removed kind: don't silently switch to the first kind — leave
271
+ // the shape untouched (the model treats unregistered types as an error).
272
+ if (idx < 0)
273
+ return;
274
+ const nextType = types[(idx + 1) % types.length] ?? core.type;
275
+ // Carry a sensible duration forward; non-duration kinds (e.g. stopwatch)
276
+ // ignore it via their own `initial`.
277
+ next = initialCore(nextType, core.durationMs || DEFAULT_MINUTES * 60_000);
231
278
  break;
232
279
  }
233
280
  case "adjust": {
234
- if (core.running || core.type !== "countdown")
281
+ // `value` is a millisecond delta; only duration-based kinds respond.
282
+ if (core.running || core.durationMs <= 0)
283
+ return;
284
+ next = initialCore(core.type, Math.max(minDurationMs, core.durationMs + detail.value));
285
+ break;
286
+ }
287
+ case "set-duration": {
288
+ // `value` is an absolute target duration; only duration-based kinds respond.
289
+ if (core.running || core.durationMs <= 0)
235
290
  return;
236
- next = initialCore("countdown", Math.max(60_000, core.durationMs + detail.value * 60_000));
291
+ next = initialCore(core.type, Math.max(minDurationMs, detail.value));
237
292
  break;
238
293
  }
239
294
  default:
@@ -251,7 +306,7 @@ export function registerTimerShape(ctx, serverClock, _userId) {
251
306
  onPointerDown(_toolCtx, event) {
252
307
  const id = generateId();
253
308
  drawState = { startX: event.worldPoint.x, startY: event.worldPoint.y, shapeId: id };
254
- const shape = createDefault({ id, x: event.worldPoint.x, y: event.worldPoint.y });
309
+ const shape = createDefault({ id, x: event.worldPoint.x, y: event.worldPoint.y }, defaultSize);
255
310
  shape.width = 0;
256
311
  shape.height = 0;
257
312
  _toolCtx.store.addShape(shape);
@@ -277,9 +332,9 @@ export function registerTimerShape(ctx, serverClock, _userId) {
277
332
  else {
278
333
  const def = createDefault({
279
334
  id: drawState.shapeId,
280
- x: drawState.startX - 80,
281
- y: drawState.startY - 60,
282
- });
335
+ x: drawState.startX - defaultSize.width / 2,
336
+ y: drawState.startY - defaultSize.height / 2,
337
+ }, defaultSize);
283
338
  toolCtx.commands.execute(createAddShapeCommand(toolCtx.store, def));
284
339
  toolCtx.store.setSelection([def.id]);
285
340
  }
@@ -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.3.0",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -12,9 +12,9 @@
12
12
  }
13
13
  },
14
14
  "dependencies": {
15
- "@edv4h/usketch-shared": "4.5.0",
16
- "@edv4h/usketch-store": "3.3.1",
17
- "@edv4h/usketch-sync": "1.1.0"
15
+ "@edv4h/usketch-shared": "4.6.0",
16
+ "@edv4h/usketch-sync": "1.1.0",
17
+ "@edv4h/usketch-store": "3.4.0"
18
18
  },
19
19
  "peerDependencies": {
20
20
  "react": ">=19"