react-native-roster 0.0.1 → 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.
Files changed (122) hide show
  1. package/README.md +209 -32
  2. package/dist/src/components/primitives/portal.d.ts +12 -0
  3. package/dist/src/components/primitives/portal.d.ts.map +1 -0
  4. package/dist/src/components/primitives/portal.js +41 -0
  5. package/dist/src/components/primitives/portal.js.map +1 -0
  6. package/dist/src/components/roster/body-layout.d.ts +9 -0
  7. package/dist/src/components/roster/body-layout.d.ts.map +1 -0
  8. package/dist/src/components/roster/body-layout.js +15 -0
  9. package/dist/src/components/roster/body-layout.js.map +1 -0
  10. package/dist/src/components/roster/index.d.ts +2 -1
  11. package/dist/src/components/roster/index.d.ts.map +1 -1
  12. package/dist/src/components/roster/index.js +34 -27
  13. package/dist/src/components/roster/index.js.map +1 -1
  14. package/dist/src/components/roster/lanes/lane.d.ts +2 -2
  15. package/dist/src/components/roster/lanes/lane.d.ts.map +1 -1
  16. package/dist/src/components/roster/lanes/lane.js +4 -8
  17. package/dist/src/components/roster/lanes/lane.js.map +1 -1
  18. package/dist/src/components/roster/parts/body.d.ts +3 -3
  19. package/dist/src/components/roster/parts/body.d.ts.map +1 -1
  20. package/dist/src/components/roster/parts/body.js +5 -20
  21. package/dist/src/components/roster/parts/body.js.map +1 -1
  22. package/dist/src/components/roster/parts/header-cell.d.ts +2 -4
  23. package/dist/src/components/roster/parts/header-cell.d.ts.map +1 -1
  24. package/dist/src/components/roster/parts/header-cell.js.map +1 -1
  25. package/dist/src/components/roster/parts/header.d.ts +1 -1
  26. package/dist/src/components/roster/parts/header.d.ts.map +1 -1
  27. package/dist/src/components/roster/parts/header.js +2 -2
  28. package/dist/src/components/roster/parts/header.js.map +1 -1
  29. package/dist/src/components/roster/parts/lane-label-column.d.ts +1 -1
  30. package/dist/src/components/roster/parts/lane-label-column.d.ts.map +1 -1
  31. package/dist/src/components/roster/parts/lane-label-column.js +2 -2
  32. package/dist/src/components/roster/parts/lane-label-column.js.map +1 -1
  33. package/dist/src/components/roster/parts/lane-list.d.ts +7 -0
  34. package/dist/src/components/roster/parts/lane-list.d.ts.map +1 -0
  35. package/dist/src/components/roster/parts/lane-list.js +26 -0
  36. package/dist/src/components/roster/parts/lane-list.js.map +1 -0
  37. package/dist/src/components/roster/roster.types.d.ts +48 -21
  38. package/dist/src/components/roster/roster.types.d.ts.map +1 -1
  39. package/dist/src/components/roster/selection/selection-layout.d.ts +4 -0
  40. package/dist/src/components/roster/selection/selection-layout.d.ts.map +1 -0
  41. package/dist/src/components/roster/selection/selection-layout.js +82 -0
  42. package/dist/src/components/roster/selection/selection-layout.js.map +1 -0
  43. package/dist/src/components/roster/selection/selection-layout.types.d.ts +25 -0
  44. package/dist/src/components/roster/selection/selection-layout.types.d.ts.map +1 -0
  45. package/dist/src/components/roster/selection/selection-layout.types.js +3 -0
  46. package/dist/src/components/roster/selection/selection-layout.types.js.map +1 -0
  47. package/dist/src/components/roster/selection/selection-layout.web.d.ts +4 -0
  48. package/dist/src/components/roster/selection/selection-layout.web.d.ts.map +1 -0
  49. package/dist/src/components/roster/selection/selection-layout.web.js +52 -0
  50. package/dist/src/components/roster/selection/selection-layout.web.js.map +1 -0
  51. package/dist/src/components/roster/use-roster-press.d.ts +6 -0
  52. package/dist/src/components/roster/use-roster-press.d.ts.map +1 -0
  53. package/dist/src/components/roster/use-roster-press.js +61 -0
  54. package/dist/src/components/roster/use-roster-press.js.map +1 -0
  55. package/dist/src/components/roster/use-roster.d.ts.map +1 -1
  56. package/dist/src/components/roster/use-roster.js +40 -30
  57. package/dist/src/components/roster/use-roster.js.map +1 -1
  58. package/dist/src/components/roster/utils/body-content-key.d.ts +1 -1
  59. package/dist/src/components/roster/utils/body-content-key.d.ts.map +1 -1
  60. package/dist/src/components/roster/utils/body-content-key.js +10 -10
  61. package/dist/src/components/roster/utils/body-content-key.js.map +1 -1
  62. package/dist/src/components/schedule/days/day.d.ts +2 -2
  63. package/dist/src/components/schedule/days/day.d.ts.map +1 -1
  64. package/dist/src/components/schedule/days/day.js +2 -11
  65. package/dist/src/components/schedule/days/day.js.map +1 -1
  66. package/dist/src/components/schedule/days/header-layout.d.ts +1 -1
  67. package/dist/src/components/schedule/days/header-layout.d.ts.map +1 -1
  68. package/dist/src/components/schedule/days/parts/column.d.ts +1 -1
  69. package/dist/src/components/schedule/days/parts/column.d.ts.map +1 -1
  70. package/dist/src/components/schedule/days/parts/column.js +4 -8
  71. package/dist/src/components/schedule/days/parts/column.js.map +1 -1
  72. package/dist/src/components/schedule/index.d.ts.map +1 -1
  73. package/dist/src/components/schedule/index.js +7 -8
  74. package/dist/src/components/schedule/index.js.map +1 -1
  75. package/dist/src/components/schedule/schedule.types.d.ts +17 -17
  76. package/dist/src/components/schedule/schedule.types.d.ts.map +1 -1
  77. package/dist/src/core/index.d.ts +1 -0
  78. package/dist/src/core/index.d.ts.map +1 -1
  79. package/dist/src/core/index.js +3 -1
  80. package/dist/src/core/index.js.map +1 -1
  81. package/dist/src/core/source.d.ts +4 -0
  82. package/dist/src/core/source.d.ts.map +1 -0
  83. package/dist/src/core/source.js +9 -0
  84. package/dist/src/core/source.js.map +1 -0
  85. package/dist/src/index.d.ts +6 -1
  86. package/dist/src/index.d.ts.map +1 -1
  87. package/dist/src/index.js +10 -1
  88. package/dist/src/index.js.map +1 -1
  89. package/dist/src/nativewind/index.d.ts +28 -27
  90. package/dist/src/nativewind/index.d.ts.map +1 -1
  91. package/docs/migrations.md +61 -0
  92. package/llms.txt +112 -30
  93. package/package.json +12 -5
  94. package/src/components/layers/README.md +7 -3
  95. package/src/components/primitives/README.md +13 -2
  96. package/src/components/primitives/portal.tsx +48 -0
  97. package/src/components/roster/README.md +62 -5
  98. package/src/components/roster/body-layout.tsx +38 -0
  99. package/src/components/roster/index.tsx +109 -46
  100. package/src/components/roster/lanes/lane.tsx +16 -13
  101. package/src/components/roster/parts/body.tsx +17 -84
  102. package/src/components/roster/parts/header-cell.tsx +2 -2
  103. package/src/components/roster/parts/header.tsx +7 -2
  104. package/src/components/roster/parts/lane-label-column.tsx +2 -2
  105. package/src/components/roster/parts/lane-list.tsx +76 -0
  106. package/src/components/roster/roster.types.ts +47 -17
  107. package/src/components/roster/selection/selection-layout.tsx +90 -0
  108. package/src/components/roster/selection/selection-layout.types.ts +20 -0
  109. package/src/components/roster/selection/selection-layout.web.tsx +88 -0
  110. package/src/components/roster/use-roster-press.ts +74 -0
  111. package/src/components/roster/use-roster.ts +57 -44
  112. package/src/components/roster/utils/body-content-key.ts +13 -13
  113. package/src/components/schedule/README.md +8 -3
  114. package/src/components/schedule/days/day.tsx +31 -18
  115. package/src/components/schedule/days/header-layout.tsx +1 -1
  116. package/src/components/schedule/days/parts/column.tsx +10 -12
  117. package/src/components/schedule/index.tsx +20 -21
  118. package/src/components/schedule/schedule.types.ts +13 -13
  119. package/src/core/README.md +4 -0
  120. package/src/core/index.ts +1 -0
  121. package/src/core/source.ts +9 -0
  122. package/src/index.ts +7 -0
@@ -7,7 +7,14 @@ import { transitionBounds } from '../utils/days';
7
7
  import { ScheduleDayLayout } from './layout';
8
8
 
9
9
  type ScheduleDayZones = Required<
10
- Pick<ScheduleProps, 'gridZone' | 'columnZone' | 'transitionZone' | 'intervalZone' | 'gapZone'>
10
+ Pick<
11
+ ScheduleProps,
12
+ | 'gridComponent'
13
+ | 'columnComponent'
14
+ | 'transitionComponent'
15
+ | 'intervalComponent'
16
+ | 'gapComponent'
17
+ >
11
18
  >;
12
19
 
13
20
  type ScheduleDayProps = ScheduleDayZones & {
@@ -33,11 +40,11 @@ export function ScheduleDay({
33
40
  highlightSource,
34
41
  hours,
35
42
  press,
36
- gridZone,
37
- columnZone,
38
- transitionZone,
39
- intervalZone,
40
- gapZone,
43
+ gridComponent: GridComponent,
44
+ columnComponent: ColumnComponent,
45
+ transitionComponent: TransitionComponent,
46
+ intervalComponent,
47
+ gapComponent,
41
48
  nowLineZone,
42
49
  }: ScheduleDayProps) {
43
50
  return (
@@ -53,20 +60,26 @@ export function ScheduleDay({
53
60
  width={projection.columnWidth}
54
61
  height={24 * projection.pxPerHour}
55
62
  chromeZ={Math.max(0, ...lane.layers.map((layer) => layer.z)) + 1}
56
- gridZone={gridZone({ hours, pxPerHour: projection.pxPerHour })}
57
- columnZone={columnZone({
58
- day,
59
- lane,
60
- rects: geometry.rects.filter((rect) => rect.column === column),
61
- gapRects: geometry.gapRects.filter((rect) => rect.column === column),
62
- highlightSource,
63
- intervalZone,
64
- gapZone,
65
- press,
66
- })}
63
+ gridZone={<GridComponent hours={hours} pxPerHour={projection.pxPerHour} />}
64
+ columnZone={
65
+ <ColumnComponent
66
+ day={day}
67
+ lane={lane}
68
+ rects={geometry.rects.filter((rect) => rect.column === column)}
69
+ gapRects={geometry.gapRects.filter((rect) => rect.column === column)}
70
+ highlightSource={highlightSource}
71
+ intervalComponent={intervalComponent}
72
+ gapComponent={gapComponent}
73
+ press={press}
74
+ />
75
+ }
67
76
  transitionZone={day.transitions.map((transition) => (
68
77
  <Fragment key={transition.at}>
69
- {transitionZone({ day, transition, ...transitionBounds(day, transition, projection) })}
78
+ <TransitionComponent
79
+ day={day}
80
+ transition={transition}
81
+ {...transitionBounds(day, transition, projection)}
82
+ />
70
83
  </Fragment>
71
84
  ))}
72
85
  nowLineZone={nowLineZone}
@@ -3,7 +3,7 @@ import { View } from 'react-native';
3
3
 
4
4
  type ScheduleDayHeaderLayoutProps = {
5
5
  width: number;
6
- /** Day heading supplied by dayHeaderZone, aligned with its column. */
6
+ /** Day heading supplied by dayHeaderComponent, aligned with its column. */
7
7
  headerZone: ReactNode;
8
8
  };
9
9
 
@@ -1,5 +1,6 @@
1
1
  import { Fragment } from 'react';
2
2
  import { Pressable } from 'react-native';
3
+ import { hasSource } from '../../../../core';
3
4
  import { pressPoint } from '../../../primitives/press-point';
4
5
  import type { ScheduleColumnInput } from '../../schedule.types';
5
6
 
@@ -8,8 +9,8 @@ export function ScheduleColumn({
8
9
  rects,
9
10
  gapRects,
10
11
  press,
11
- intervalZone,
12
- gapZone,
12
+ intervalComponent: IntervalComponent,
13
+ gapComponent: GapComponent,
13
14
  highlightSource,
14
15
  }: ScheduleColumnInput) {
15
16
  return [...lane.layers]
@@ -20,15 +21,12 @@ export function ScheduleColumn({
20
21
  .filter((rect) => rect.layerId === layer.id)
21
22
  .map((rect) => (
22
23
  <Fragment key={`interval-${rect.y}:${rect.height}`}>
23
- {intervalZone({
24
- rect,
25
- layer,
26
- lane,
27
- highlighted: rect.sources.some(
28
- (source) =>
29
- source.kind === highlightSource?.kind && source.id === highlightSource.id,
30
- ),
31
- })}
24
+ <IntervalComponent
25
+ rect={rect}
26
+ layer={layer}
27
+ lane={lane}
28
+ highlighted={hasSource(rect.sources, highlightSource)}
29
+ />
32
30
  </Fragment>
33
31
  ))}
34
32
  {gapRects
@@ -51,7 +49,7 @@ export function ScheduleColumn({
51
49
  zIndex: rect.z,
52
50
  }}
53
51
  >
54
- {gapZone({ rect, layer, lane })}
52
+ <GapComponent rect={rect} layer={layer} lane={lane} />
55
53
  </Pressable>
56
54
  ))}
57
55
  </Fragment>
@@ -1,4 +1,3 @@
1
- import { Fragment } from 'react';
2
1
  import { View } from 'react-native';
3
2
  import { RosterGap } from '../layers/parts/gap';
4
3
  import { RosterInterval } from '../layers/parts/interval';
@@ -50,40 +49,40 @@ function ScheduleContent(props: ScheduleProps) {
50
49
  lane,
51
50
  windowSpec,
52
51
  highlightSource,
53
- gutterZone = ScheduleGutter,
54
- dayHeaderZone = ScheduleDayHeader,
55
- skippedDateZone = ScheduleSkippedDate,
56
- columnZone = ScheduleColumn,
57
- gridZone = ScheduleGrid,
58
- transitionZone = ScheduleTransition,
59
- nowLineZone = ScheduleNowLine,
60
- intervalZone = RosterInterval,
61
- gapZone = RosterGap,
62
- incompleteZone = ScheduleIncomplete,
52
+ gutterComponent: GutterComponent = ScheduleGutter,
53
+ dayHeaderComponent: DayHeaderComponent = ScheduleDayHeader,
54
+ skippedDateComponent: SkippedDateComponent = ScheduleSkippedDate,
55
+ columnComponent = ScheduleColumn,
56
+ gridComponent = ScheduleGrid,
57
+ transitionComponent = ScheduleTransition,
58
+ nowLineComponent: NowLineComponent = ScheduleNowLine,
59
+ intervalComponent = RosterInterval,
60
+ gapComponent = RosterGap,
61
+ incompleteComponent: IncompleteComponent = ScheduleIncomplete,
63
62
  incompleteLabel = 'Availability may be incomplete',
64
63
  } = props;
65
64
  const position = nowPosition(projection, now);
66
65
  const incomplete =
67
- lane.complete === false ? incompleteZone({ lane, label: incompleteLabel }) : null;
66
+ lane.complete === false ? <IncompleteComponent lane={lane} label={incompleteLabel} /> : null;
68
67
  return (
69
68
  <ScheduleLayout
70
69
  headerStyle={props.headerStyle}
71
70
  gutterStyle={props.gutterStyle}
72
71
  daysStyle={props.daysStyle}
73
72
  incompleteZone={incomplete}
74
- gutterZone={gutterZone({ hours, pxPerHour: projection.pxPerHour })}
73
+ gutterZone={<GutterComponent hours={hours} pxPerHour={projection.pxPerHour} />}
75
74
  dayHeaderZone={headerDates(windowSpec, days).map(({ localDate, day }) => {
76
- if (!day) return <Fragment key={localDate}>{skippedDateZone({ localDate })}</Fragment>;
75
+ if (!day) return <SkippedDateComponent key={localDate} localDate={localDate} />;
77
76
  return (
78
77
  <ScheduleDayHeaderLayout
79
78
  key={localDate}
80
79
  width={projection.columnWidth}
81
- headerZone={dayHeaderZone({ day })}
80
+ headerZone={<DayHeaderComponent day={day} />}
82
81
  />
83
82
  );
84
83
  })}
85
84
  daysZone={days.map((day, column) => {
86
- const nowLine = position?.column === column ? nowLineZone(position) : null;
85
+ const nowLine = position?.column === column ? <NowLineComponent {...position} /> : null;
87
86
  return (
88
87
  <ScheduleDay
89
88
  key={day.localDate}
@@ -95,11 +94,11 @@ function ScheduleContent(props: ScheduleProps) {
95
94
  highlightSource={highlightSource}
96
95
  hours={hours}
97
96
  press={(x, y) => press(column, x, y)}
98
- gridZone={gridZone}
99
- columnZone={columnZone}
100
- transitionZone={transitionZone}
101
- intervalZone={intervalZone}
102
- gapZone={gapZone}
97
+ gridComponent={gridComponent}
98
+ columnComponent={columnComponent}
99
+ transitionComponent={transitionComponent}
100
+ intervalComponent={intervalComponent}
101
+ gapComponent={gapComponent}
103
102
  nowLineZone={nowLine}
104
103
  />
105
104
  );
@@ -1,4 +1,4 @@
1
- import type { ReactNode } from 'react';
1
+ import type { ComponentType } from 'react';
2
2
  import type { StyleProp, ViewStyle } from 'react-native';
3
3
  import type {
4
4
  DayColumn,
@@ -53,9 +53,9 @@ export type ScheduleColumnInput = {
53
53
  highlightSource?: Source;
54
54
  press: (x: number, y: number) => void;
55
55
  /** Covered rect filler shared with Roster; final bounds and stacking belong to the rect. */
56
- intervalZone: (input: IntervalInput) => ReactNode;
56
+ intervalComponent: ComponentType<IntervalInput>;
57
57
  /** Removed rect content shared with Roster; the column supplies its pressable bounds. */
58
- gapZone: (input: GapInput) => ReactNode;
58
+ gapComponent: ComponentType<GapInput>;
59
59
  };
60
60
  export type ScheduleHoursInput = { hours: number[]; pxPerHour: number };
61
61
  /**
@@ -81,23 +81,23 @@ export type ScheduleProps = ScheduleInput &
81
81
  ScheduleStyleProps & {
82
82
  incompleteLabel?: string;
83
83
  /** Frozen left hour labels; ScheduleGutter receives hours 0 through 23 and their scale. */
84
- gutterZone?: (input: ScheduleHoursInput) => ReactNode;
84
+ gutterComponent?: ComponentType<ScheduleHoursInput>;
85
85
  /** Hour bands behind each day's rects; ScheduleGrid draws 24 bordered bands. */
86
- gridZone?: (input: ScheduleHoursInput) => ReactNode;
86
+ gridComponent?: ComponentType<ScheduleHoursInput>;
87
87
  /** Frozen day heading; ScheduleDayHeader shows weekday, localDate, and a transition badge. */
88
- dayHeaderZone?: (input: { day: DayColumn }) => ReactNode;
88
+ dayHeaderComponent?: ComponentType<{ day: DayColumn }>;
89
89
  /** Wholly skipped local date marker; ScheduleSkippedDate labels its zero-width header gap. */
90
- skippedDateZone?: (input: { localDate: string }) => ReactNode;
90
+ skippedDateComponent?: ComponentType<{ localDate: string }>;
91
91
  /** The day's covered and removed rects; ScheduleColumn draws final bounds in layer order. */
92
- columnZone?: (input: ScheduleColumnInput) => ReactNode;
92
+ columnComponent?: ComponentType<ScheduleColumnInput>;
93
93
  /** Transition chrome only; ScheduleTransition hatches skips and divides repeats with again. */
94
- transitionZone?: (input: ScheduleTransitionInput) => ReactNode;
94
+ transitionComponent?: ComponentType<ScheduleTransitionInput>;
95
95
  /** Current day's line at y; ScheduleNowLine spans the containing column. */
96
- nowLineZone?: (input: { y: number; column: number }) => ReactNode;
96
+ nowLineComponent?: ComponentType<{ y: number; column: number }>;
97
97
  /** Covered rect filler shared with Roster; position using rect bounds and use pointerEvents="none". */
98
- intervalZone?: (input: IntervalInput) => ReactNode;
98
+ intervalComponent?: ComponentType<IntervalInput>;
99
99
  /** Removed rect content shared with Roster; ScheduleColumn supplies the invisible pressable. */
100
- gapZone?: (input: GapInput) => ReactNode;
100
+ gapComponent?: ComponentType<GapInput>;
101
101
  /** Completeness notice in reserved empty space above the day grid; receives the lane and localized label. */
102
- incompleteZone?: (input: { lane: Lane; label: string }) => ReactNode;
102
+ incompleteComponent?: ComponentType<{ lane: Lane; label: string }>;
103
103
  };
@@ -13,6 +13,7 @@ no React Native, no dependencies.
13
13
  | `axis.ts` | window specs, spans, and navigation (`windowFor`, `next`, `prev`, `today`) |
14
14
  | `layout.ts` | rect geometry for one lane in either projection |
15
15
  | `coverage.ts` | covered and removed minutes per lane |
16
+ | `source.ts` | `hasSource(sources, source)` matches kind and id, ignoring labels |
16
17
  | `spans.ts` | the provenance sweep: exact sources per merged span |
17
18
  | `columns.ts` | day columns, transitions, and skipped dates for the columns projection |
18
19
  | `zone.ts` | Intl-only timezone math (offsets, first instants, transitions) |
@@ -23,3 +24,6 @@ no React Native, no dependencies.
23
24
 
24
25
  Reference: [design](../../docs/design.md), [timezones](../../docs/timezones.md),
25
26
  [caches](../../docs/caches.md). Tests: `test/core`.
27
+
28
+ The public entry binds immutable function aliases directly to preserve implementation
29
+ identity while avoiding repeated CommonJS getter wrappers in consumer bundles.
package/src/core/index.ts CHANGED
@@ -14,6 +14,7 @@ export { layoutLane } from './layout';
14
14
  export type { LaneComparator } from './order';
15
15
  export { byCoverage, byLabel } from './order';
16
16
  export { snapToStep, timeAtX, timeAtY } from './snap';
17
+ export { hasSource } from './source';
17
18
  export type {
18
19
  Coverage,
19
20
  DayColumn,
@@ -0,0 +1,9 @@
1
+ import type { Source } from './types';
2
+
3
+ /** Match source identity by kind and id, ignoring display metadata. */
4
+ export function hasSource(sources: readonly Source[], source: Source | undefined): boolean {
5
+ return (
6
+ source !== undefined &&
7
+ sources.some((item) => item.kind === source.kind && item.id === source.id)
8
+ );
9
+ }
package/src/index.ts CHANGED
@@ -1,7 +1,9 @@
1
1
  export type { GapInput, IntervalInput } from './components/layers/layers.types';
2
2
  export { RosterGap } from './components/layers/parts/gap';
3
3
  export { RosterInterval } from './components/layers/parts/interval';
4
+ export { Portal, PortalHost } from './components/primitives/portal';
4
5
  export { Roster } from './components/roster';
6
+ export { RosterBodyLayout } from './components/roster/body-layout';
5
7
  export { RosterLaneLabel } from './components/roster/lanes/parts/lane-label';
6
8
  export { RosterBody } from './components/roster/parts/body';
7
9
  export { RosterCorner } from './components/roster/parts/corner';
@@ -10,10 +12,13 @@ export { RosterGrid } from './components/roster/parts/grid';
10
12
  export { RosterHeader } from './components/roster/parts/header';
11
13
  export { RosterHeaderCell } from './components/roster/parts/header-cell';
12
14
  export { RosterLaneLabelColumn } from './components/roster/parts/lane-label-column';
15
+ export { RosterLaneList } from './components/roster/parts/lane-list';
13
16
  export type {
14
17
  BodyInput,
15
18
  GridInput,
19
+ HeaderCellInput,
16
20
  HeaderInput,
21
+ IntervalDetailInput,
17
22
  LabelColumnInput,
18
23
  LaneLabelInput,
19
24
  RosterInput,
@@ -24,6 +29,8 @@ export type {
24
29
  RosterStyleProps,
25
30
  RosterTick,
26
31
  } from './components/roster/roster.types';
32
+ export { RosterSelectionPopover } from './components/roster/selection/selection-layout';
33
+ export type { SelectionLayoutProps } from './components/roster/selection/selection-layout.types';
27
34
  export { useRoster } from './components/roster/use-roster';
28
35
  export { Schedule } from './components/schedule';
29
36
  export { ScheduleColumn } from './components/schedule/days/parts/column';