react-native-roster 0.4.8 → 0.4.10

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 CHANGED
@@ -76,6 +76,12 @@ Without Expo, follow the [Reanimated install guide](https://docs.swmansion.com/r
76
76
  for 3.19 or newer. On React Native older than 0.79, turn on
77
77
  `resolver.unstable_enablePackageExports` in Metro.
78
78
 
79
+ The workspace demo routes the root, `/core`, `/rrule`, and `/nativewind` imports through each
80
+ export's `react-native` condition on web, iOS, and Android. Metro therefore compiles TypeScript
81
+ source edits without rebuilding `dist`; the resolver still uses the package export map rather than
82
+ an alias, and leaves peer and unrelated-package resolution unchanged. Restart the demo server if a
83
+ source edit is not detected.
84
+
79
85
  ### Roster
80
86
 
81
87
  The smallest useful roster: Alex works 09:00 to 17:00 UTC on Monday, and a table
@@ -262,9 +268,9 @@ datasets then cannot collide when they reuse lane IDs and versions. Omitting the
262
268
  core-owned default, while deliberately reusing one identity shares target-warm coverage across
263
269
  projections.
264
270
 
265
- `Roster` and `useRoster` each own an isolated identity by default. Pass a stable `cacheIdentity`
266
- prop when multiple Roster surfaces show the same dataset and should deliberately share target-warm
267
- geometry and coverage.
271
+ Every mounted `Roster`, `Schedule`, `useRoster`, and `useSchedule` surface owns an isolated
272
+ identity by default. Pass a stable `cacheIdentity` only when several surfaces render the same
273
+ dataset and should deliberately share target-warm geometry and coverage.
268
274
 
269
275
  Minified, with peers external: `/core` is 13.6 kB and the root entry is 51.2 kB.
270
276
  `/rrule` adds 12.9 kB of its own code plus its two dependencies, `rrule-temporal`
@@ -1,6 +1,6 @@
1
1
  import type { ComponentType } from 'react';
2
2
  import type { StyleProp, ViewStyle } from 'react-native';
3
- import type { DayColumn, Lane, LaneGeometry, Projection, Rect, Source, Transition, Window, WindowSpec } from '../../core';
3
+ import type { DayColumn, Lane, LaneGeometry, Projection, Rect, ScopedCacheIdentity, Source, Transition, Window, WindowSpec } from '../../core';
4
4
  import type { GapInput, IntervalInput } from '../layers/layers.types';
5
5
  export type ScheduleWindowSpec = WindowSpec & {
6
6
  span: 'day' | 'week';
@@ -11,6 +11,8 @@ export type ScheduleProjection = Extract<Projection, {
11
11
  export type ScheduleInput = {
12
12
  lane: Lane;
13
13
  windowSpec: ScheduleWindowSpec;
14
+ /** Stable cache identity for deliberate reuse across surfaces rendering one dataset. */
15
+ cacheIdentity?: ScopedCacheIdentity;
14
16
  minuteStep?: number;
15
17
  /** Positive finite pixels per wall-clock hour; defaults to 48. */
16
18
  pxPerHour?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"schedule.types.d.ts","sourceRoot":"","sources":["../../../../src/components/schedule/schedule.types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"schedule.types.d.ts","sourceRoot":"","sources":["../../../../src/components/schedule/schedule.types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-schedule.d.ts","sourceRoot":"","sources":["../../../../src/components/schedule/use-schedule.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAsB,MAAM,kBAAkB,CAAC;AAGzF,wBAAgB,WAAW,CAAC,KAAK,EAAE,aAAa,GAAG,aAAa,CAoE/D"}
1
+ {"version":3,"file":"use-schedule.d.ts","sourceRoot":"","sources":["../../../../src/components/schedule/use-schedule.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAsB,MAAM,kBAAkB,CAAC;AAGzF,wBAAgB,WAAW,CAAC,KAAK,EAAE,aAAa,GAAG,aAAa,CAsE/D"}
@@ -8,6 +8,8 @@ const use_schedule_viewport_1 = require("./use-schedule-viewport");
8
8
  function useSchedule(input) {
9
9
  const { lane, windowSpec, minuteStep = 60, pxPerHour = 48 } = input;
10
10
  const width = (0, react_1.useContext)(use_schedule_viewport_1.ScheduleWidth);
11
+ const [ownedCacheIdentity] = (0, react_1.useState)(() => ({}));
12
+ const cacheIdentity = input.cacheIdentity ?? ownedCacheIdentity;
11
13
  const [clock, setClock] = (0, react_1.useState)(Date.now);
12
14
  // The current-time indicator follows the wall clock for the mounted surface's lifetime.
13
15
  (0, react_1.useEffect)(() => {
@@ -27,7 +29,7 @@ function useSchedule(input) {
27
29
  columnWidth: width / Math.max(1, days.length),
28
30
  days,
29
31
  };
30
- const geometry = (0, core_1.layoutLane)(lane, window, projection);
32
+ const geometry = (0, core_1.layoutLane)(lane, window, projection, cacheIdentity);
31
33
  const currentPress = { input, window, projection, geometry };
32
34
  const pressInput = (0, react_1.useRef)(currentPress);
33
35
  pressInput.current = currentPress;
@@ -1 +1 @@
1
- {"version":3,"file":"use-schedule.js","sourceRoot":"","sources":["../../../../src/components/schedule/use-schedule.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"use-schedule.js","sourceRoot":"","sources":["../../../../src/components/schedule/use-schedule.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function touch<K, V>(cache: Map<K, V>, key: K, value: V): V;
2
+ export declare function trim<K, V>(cache: Map<K, V>, limit: number): void;
3
+ //# sourceMappingURL=lru.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lru.d.ts","sourceRoot":"","sources":["../../../src/core/lru.ts"],"names":[],"mappings":"AAAA,wBAAgB,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAIjE;AAED,wBAAgB,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAMhE"}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.touch = touch;
4
+ exports.trim = trim;
5
+ function touch(cache, key, value) {
6
+ cache.delete(key);
7
+ cache.set(key, value);
8
+ return value;
9
+ }
10
+ function trim(cache, limit) {
11
+ while (cache.size > limit) {
12
+ const oldest = cache.keys().next();
13
+ if (oldest.done)
14
+ return;
15
+ cache.delete(oldest.value);
16
+ }
17
+ }
18
+ //# sourceMappingURL=lru.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lru.js","sourceRoot":"","sources":["../../../src/core/lru.ts"],"names":[],"mappings":";;;;AAAA,eAA4B,KAAgB,EAAE,GAAM,EAAE,KAAQ;IAC5D,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAClB,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACtB,OAAO,KAAK,CAAC;AACf,CAAC;AAED,cAA2B,KAAgB,EAAE,KAAa;IACxD,OAAO,KAAK,CAAC,IAAI,GAAG,KAAK,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;QACnC,IAAI,MAAM,CAAC,IAAI;YAAE,OAAO;QACxB,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;AACH,CAAC"}
package/llms.txt CHANGED
@@ -170,11 +170,14 @@ core types. Core imports standard JS and Intl only. Only /rrule imports
170
170
  rrule-temporal 1.6.0 and @js-temporal/polyfill 0.5.1. Those are installed runtime
171
171
  dependencies but cannot enter root/core bundles through library imports.
172
172
 
173
- Metro selects TS source via exports' react-native condition. Keep package exports
174
- enabled and one React copy in a workspace. Other resolvers load built CommonJS
175
- from dist/src; declarations use the types condition. Build before Node export
176
- tests. Root needs a native renderer or web bundler; direct Node use of root is
177
- not a substitute for a React Native app. Core and /rrule work in Node/Bun.
173
+ The workspace demo selects TS source for the root, /core, /rrule, and /nativewind
174
+ through each export's react-native condition on web, iOS, and Android. It does not
175
+ alias around the package export map or change conditions for peers and unrelated
176
+ packages. Source edits therefore need no dist rebuild; restart the demo server if
177
+ Metro does not detect one. Other resolvers load built CommonJS from dist/src;
178
+ declarations use the types condition. Build before Node export tests. Root needs a
179
+ native renderer or web bundler; direct Node use of root is not a substitute for a
180
+ React Native app. Core and /rrule work in Node/Bun.
178
181
 
179
182
  ## 0.1.0 slot prop rename
180
183
 
@@ -221,7 +224,7 @@ windows use their exact elapsed duration, including sub-minute spans. Cell times
221
224
  are clamped up to window.start and rejected at or beyond window.end.
222
225
 
223
226
  Schedule required props: lane: Lane, windowSpec: WindowSpec & {span:'day'|'week'}.
224
- Optional: minuteStep (60), pxPerHour (48, positive finite), highlightSource,
227
+ Optional: cacheIdentity (stable ScopedCacheIdentity), minuteStep (60), pxPerHour (48, positive finite), highlightSource,
225
228
  onNavigate, onIntervalPress, onGapPress, onCellPress, style, headerStyle,
226
229
  gutterStyle, daysStyle, incompleteLabel, and zones below. Class twins are
227
230
  className, headerClassName, gutterClassName, and daysClassName. No month/custom
@@ -232,6 +235,8 @@ press(columnIndex,x,y), and status:'ready'. The standalone hook uses a 280 px gr
232
235
  The chassis measures width, reserves a 48 px gutter, and fits all actual day
233
236
  columns without horizontal scrolling; the body scrolls vertically. now updates
234
237
  every minute and is null outside the selected window.
238
+ Each mounted Schedule or useSchedule surface owns an isolated cache identity by default.
239
+ Reuse one explicit cacheIdentity only across surfaces that render the same dataset.
235
240
 
236
241
  Props ending in Component accept ComponentType<Input>, mounted as React elements.
237
242
  Props ending in Zone accept ReactNode; pass null to suppress a singleton default.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-roster",
3
- "version": "0.4.8",
3
+ "version": "0.4.10",
4
4
  "description": "Resource timeline and schedule components for React Native and web, with layered intervals, coverage, provenance, and explicit daylight-saving handling.",
5
5
  "keywords": [
6
6
  "react-native",
@@ -21,3 +21,7 @@ The chassis binds default component types once; ScheduleDay mounts components
21
21
  with day data and passes nodes into ScheduleDayLayout. There is no black-box day
22
22
  list to split: days, transitions, and rects already map in their owning parts.
23
23
  Schedule has ten input-bearing component slots and no zero-argument singleton slots.
24
+
25
+ Each mounted `Schedule` or `useSchedule` surface owns an isolated `ScopedCacheIdentity` by default.
26
+ Pass one stable `cacheIdentity` to multiple surfaces only when they render the same dataset and
27
+ should share target-warm geometry and coverage.
@@ -6,6 +6,7 @@ import type {
6
6
  LaneGeometry,
7
7
  Projection,
8
8
  Rect,
9
+ ScopedCacheIdentity,
9
10
  Source,
10
11
  Transition,
11
12
  Window,
@@ -18,6 +19,8 @@ export type ScheduleProjection = Extract<Projection, { orientation: 'columns' }>
18
19
  export type ScheduleInput = {
19
20
  lane: Lane;
20
21
  windowSpec: ScheduleWindowSpec;
22
+ /** Stable cache identity for deliberate reuse across surfaces rendering one dataset. */
23
+ cacheIdentity?: ScopedCacheIdentity;
21
24
  minuteStep?: number;
22
25
  /** Positive finite pixels per wall-clock hour; defaults to 48. */
23
26
  pxPerHour?: number;
@@ -1,4 +1,5 @@
1
1
  import { useContext, useEffect, useRef, useState } from 'react';
2
+ import type { ScopedCacheIdentity } from '../../core';
2
3
  import { dayColumnsFor, layoutLane, snapToStep, timeAtY, windowFor } from '../../core';
3
4
  import { hitTest } from '../../core/hit-test';
4
5
  import type { ScheduleInput, ScheduleModel, ScheduleProjection } from './schedule.types';
@@ -7,6 +8,8 @@ import { ScheduleWidth } from './use-schedule-viewport';
7
8
  export function useSchedule(input: ScheduleInput): ScheduleModel {
8
9
  const { lane, windowSpec, minuteStep = 60, pxPerHour = 48 } = input;
9
10
  const width = useContext(ScheduleWidth);
11
+ const [ownedCacheIdentity] = useState<ScopedCacheIdentity>(() => ({}));
12
+ const cacheIdentity = input.cacheIdentity ?? ownedCacheIdentity;
10
13
  const [clock, setClock] = useState(Date.now);
11
14
  // The current-time indicator follows the wall clock for the mounted surface's lifetime.
12
15
  useEffect(() => {
@@ -26,7 +29,7 @@ export function useSchedule(input: ScheduleInput): ScheduleModel {
26
29
  columnWidth: width / Math.max(1, days.length),
27
30
  days,
28
31
  };
29
- const geometry = layoutLane(lane, window, projection);
32
+ const geometry = layoutLane(lane, window, projection, cacheIdentity);
30
33
  const currentPress = { input, window, projection, geometry };
31
34
  const pressInput = useRef(currentPress);
32
35
  pressInput.current = currentPress;
@@ -0,0 +1,13 @@
1
+ export function touch<K, V>(cache: Map<K, V>, key: K, value: V): V {
2
+ cache.delete(key);
3
+ cache.set(key, value);
4
+ return value;
5
+ }
6
+
7
+ export function trim<K, V>(cache: Map<K, V>, limit: number): void {
8
+ while (cache.size > limit) {
9
+ const oldest = cache.keys().next();
10
+ if (oldest.done) return;
11
+ cache.delete(oldest.value);
12
+ }
13
+ }