@segnavia/format 0.0.0-stage → 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/dist/index.js ADDED
@@ -0,0 +1,344 @@
1
+ import { MARK_GAP_MM, MARK_LENGTH_MM, MM_PER_PT, PAPER_MM, PX_PER_MM, printBoxes, printPadding, printProperties, roundMillimeters, sheetMm, toMillimeters } from "./paper.js";
2
+ import { firstStrongDirection, languageDirection, resolveDirection } from "./direction.js";
3
+ import { fitPage, impose, mirrorPlacement, pagePlacementLayout } from "./imposition.js";
4
+ import { z } from "zod";
5
+ //#region src/index.ts
6
+ const Size = z.object({
7
+ width: z.number().int().positive(),
8
+ height: z.number().int().positive()
9
+ });
10
+ const Scripts = z.enum(["refuse", "sandboxed"]);
11
+ const Direction = z.enum([
12
+ "ltr",
13
+ "rtl",
14
+ "auto"
15
+ ]);
16
+ const NAMED_PAPERS = [
17
+ "letter",
18
+ "legal",
19
+ "tabloid",
20
+ "a3",
21
+ "a4",
22
+ "a5"
23
+ ];
24
+ const Paper = z.union([z.enum(NAMED_PAPERS), z.object({
25
+ width: z.number().positive(),
26
+ height: z.number().positive(),
27
+ unit: z.enum([
28
+ "mm",
29
+ "in",
30
+ "pt"
31
+ ])
32
+ })]);
33
+ const Margin = z.object({
34
+ top: z.number().nonnegative().default(0),
35
+ right: z.number().nonnegative().default(0),
36
+ bottom: z.number().nonnegative().default(0),
37
+ left: z.number().nonnegative().default(0)
38
+ });
39
+ const Print = z.object({
40
+ paper: Paper,
41
+ orientation: z.enum(["portrait", "landscape"]).default("portrait"),
42
+ margin: Margin.optional(),
43
+ bleed: z.number().nonnegative().default(0),
44
+ safe: z.number().nonnegative().default(0),
45
+ marks: z.boolean().default(false)
46
+ }).superRefine((print, ctx) => {
47
+ const trim = sheetMm(print);
48
+ if (print.safe * 2 >= trim.width) ctx.addIssue({
49
+ code: "custom",
50
+ path: ["safe"],
51
+ message: `safe is ${print.safe}mm on the left and right, but the trim is ${trim.width}mm wide; safe must leave area inside the trim`
52
+ });
53
+ if (print.safe * 2 >= trim.height) ctx.addIssue({
54
+ code: "custom",
55
+ path: ["safe"],
56
+ message: `safe is ${print.safe}mm on the top and bottom, but the trim is ${trim.height}mm high; safe must leave area inside the trim`
57
+ });
58
+ });
59
+ const ImpositionGap = z.object({
60
+ column: z.number().nonnegative().default(0),
61
+ row: z.number().nonnegative().default(0)
62
+ });
63
+ const MAX_IMPOSITION_CELLS = 1e4;
64
+ const Imposition = z.object({
65
+ paper: Paper,
66
+ orientation: z.enum(["portrait", "landscape"]).default("portrait"),
67
+ unit: z.enum([
68
+ "mm",
69
+ "in",
70
+ "pt"
71
+ ]).default("mm"),
72
+ margin: Margin.default({
73
+ top: 0,
74
+ right: 0,
75
+ bottom: 0,
76
+ left: 0
77
+ }),
78
+ columns: z.number().int().positive(),
79
+ rows: z.number().int().positive(),
80
+ cell: z.object({
81
+ width: z.number().positive(),
82
+ height: z.number().positive()
83
+ }),
84
+ gap: ImpositionGap.default({
85
+ column: 0,
86
+ row: 0
87
+ }),
88
+ bleed: z.number().nonnegative().default(0),
89
+ safe: z.number().nonnegative().default(0),
90
+ fit: z.enum(["contain", "cover"]).default("contain"),
91
+ fill: z.enum(["sequence", "repeat"]).default("sequence"),
92
+ sides: z.enum(["one", "two"]).default("one"),
93
+ flip: z.enum(["long", "short"]).default("long"),
94
+ skip: z.number().int().nonnegative().default(0),
95
+ dir: z.enum(["ltr", "rtl"]).default("ltr")
96
+ }).superRefine((imposition, ctx) => {
97
+ const cellCount = BigInt(imposition.columns) * BigInt(imposition.rows);
98
+ if (imposition.columns > 1e4 || imposition.rows > 1e4 || cellCount > BigInt(1e4)) {
99
+ ctx.addIssue({
100
+ code: "custom",
101
+ path: ["columns"],
102
+ message: `the grid has ${cellCount} cells and the ceiling is ${MAX_IMPOSITION_CELLS}; fewer columns or rows clears this refusal`
103
+ });
104
+ return;
105
+ }
106
+ const mm = (value) => toMillimeters(value, imposition.unit);
107
+ const paper = sheetMm({
108
+ paper: imposition.paper,
109
+ orientation: imposition.orientation
110
+ });
111
+ const gridWidth = mm(imposition.margin.left + imposition.columns * imposition.cell.width + (imposition.columns - 1) * imposition.gap.column + imposition.margin.right);
112
+ const gridHeight = mm(imposition.margin.top + imposition.rows * imposition.cell.height + (imposition.rows - 1) * imposition.gap.row + imposition.margin.bottom);
113
+ if (gridWidth - paper.width > .01) ctx.addIssue({
114
+ code: "custom",
115
+ path: ["columns"],
116
+ message: `the grid is ${roundMillimeters(gridWidth)}mm wide and the paper is ${paper.width}mm wide, an overflow of ${roundMillimeters(gridWidth - paper.width)}mm; reduce the horizontal margins, columns, cell width or column gap`
117
+ });
118
+ if (gridHeight - paper.height > .01) ctx.addIssue({
119
+ code: "custom",
120
+ path: ["rows"],
121
+ message: `the grid is ${roundMillimeters(gridHeight)}mm high and the paper is ${paper.height}mm high, an overflow of ${roundMillimeters(gridHeight - paper.height)}mm; reduce the vertical margins, rows, cell height or row gap`
122
+ });
123
+ const safe = mm(imposition.safe);
124
+ const cellWidth = mm(imposition.cell.width);
125
+ const cellHeight = mm(imposition.cell.height);
126
+ if (safe * 2 >= cellWidth) ctx.addIssue({
127
+ code: "custom",
128
+ path: ["safe"],
129
+ message: `safe is ${roundMillimeters(safe)}mm on the left and right, but the cell is ${roundMillimeters(cellWidth)}mm wide; safe must leave area inside the cell`
130
+ });
131
+ if (safe * 2 >= cellHeight) ctx.addIssue({
132
+ code: "custom",
133
+ path: ["safe"],
134
+ message: `safe is ${roundMillimeters(safe)}mm on the top and bottom, but the cell is ${roundMillimeters(cellHeight)}mm high; safe must leave area inside the cell`
135
+ });
136
+ const cells = imposition.columns * imposition.rows;
137
+ if (imposition.skip >= cells) ctx.addIssue({
138
+ code: "custom",
139
+ path: ["skip"],
140
+ message: `skip is ${imposition.skip}, but the grid has ${cells} cells; skip must be less than ${cells}`
141
+ });
142
+ });
143
+ const PageSize = z.union([
144
+ z.literal("fluid"),
145
+ Size,
146
+ z.object({
147
+ width: z.number().int().positive(),
148
+ height: z.literal("auto")
149
+ })
150
+ ]);
151
+ const Page = z.object({
152
+ html: z.string(),
153
+ size: PageSize.default("fluid"),
154
+ scripts: Scripts.default("refuse"),
155
+ dir: Direction.optional(),
156
+ lang: z.string().optional(),
157
+ print: Print.optional()
158
+ });
159
+ const Box = z.object({
160
+ x: z.number(),
161
+ y: z.number(),
162
+ width: z.number(),
163
+ height: z.number()
164
+ });
165
+ const Point = z.object({
166
+ x: z.number(),
167
+ y: z.number()
168
+ });
169
+ const Annotation = z.object({
170
+ ring: Box.nullable(),
171
+ badge: z.object({
172
+ center: Point,
173
+ number: z.number().int()
174
+ }).nullable(),
175
+ arrow: z.object({
176
+ head: Point,
177
+ tail: Point,
178
+ label: z.string().nullable()
179
+ }).nullable()
180
+ });
181
+ const SHOT_KEY = /^[a-z0-9]+(?:[.-][a-z0-9]+)*$/;
182
+ const Shot = z.object({
183
+ key: z.string().regex(SHOT_KEY),
184
+ title: z.string(),
185
+ description: z.string().nullable().default(null),
186
+ tags: z.array(z.string()).default([]),
187
+ file: z.string(),
188
+ annotatedFile: z.string().nullable().default(null),
189
+ size: Size,
190
+ scale: z.number().positive(),
191
+ dir: z.enum(["ltr", "rtl"]).default("ltr"),
192
+ annotations: z.array(Annotation),
193
+ capturedAt: z.string(),
194
+ meta: z.record(z.string(), z.unknown()).default({})
195
+ });
196
+ const PublishedShot = z.object({
197
+ src: z.string(),
198
+ shot: Shot
199
+ });
200
+ const Word = z.object({
201
+ text: z.string(),
202
+ startMs: z.number().nonnegative(),
203
+ endMs: z.number().nonnegative()
204
+ });
205
+ const Cue = z.object({
206
+ word: z.number().int().nonnegative(),
207
+ annotation: z.number().int().nonnegative(),
208
+ untilWord: z.number().int().nonnegative().optional()
209
+ });
210
+ const Narration = z.object({
211
+ text: z.string(),
212
+ lang: z.string().optional(),
213
+ dir: Direction.optional(),
214
+ voice: z.string().optional(),
215
+ words: z.array(Word),
216
+ durationMs: z.number().nonnegative(),
217
+ audio: z.string().nullable(),
218
+ live: z.boolean().default(false),
219
+ cues: z.array(Cue).default([])
220
+ });
221
+ const SlideContent = z.discriminatedUnion("kind", [
222
+ z.object({
223
+ kind: z.literal("html"),
224
+ html: z.string()
225
+ }),
226
+ z.object({
227
+ kind: z.literal("url"),
228
+ src: z.string()
229
+ }),
230
+ z.object({
231
+ kind: z.literal("shot"),
232
+ src: z.string(),
233
+ shot: Shot
234
+ }),
235
+ z.object({
236
+ kind: z.literal("shot-ref"),
237
+ href: z.string()
238
+ }),
239
+ z.object({
240
+ kind: z.literal("image"),
241
+ src: z.string(),
242
+ alt: z.string()
243
+ })
244
+ ]);
245
+ const Slide = z.object({
246
+ id: z.string(),
247
+ content: SlideContent,
248
+ notes: z.string().optional(),
249
+ narration: Narration.optional()
250
+ });
251
+ const DECK_SIZE = {
252
+ width: 1280,
253
+ height: 720
254
+ };
255
+ const DeckShape = z.object({
256
+ title: z.string(),
257
+ size: Size.default(DECK_SIZE),
258
+ scripts: Scripts.default("refuse"),
259
+ dir: Direction.optional(),
260
+ lang: z.string().optional(),
261
+ slides: z.array(Slide).min(1)
262
+ });
263
+ function annotationCueIssues(narration, annotations) {
264
+ if (!narration) return [];
265
+ return narration.cues.filter((cue) => cue.annotation >= annotations).map((cue) => `a cue names annotation ${cue.annotation}, but the slide has ${annotations}`);
266
+ }
267
+ function cueIssues(slide) {
268
+ const narration = slide.narration;
269
+ if (!narration) return [];
270
+ const annotations = slide.content.kind === "shot" ? slide.content.shot.annotations.length : null;
271
+ const words = narration.live ? null : narration.words.length;
272
+ const issues = [];
273
+ for (const cue of narration.cues) {
274
+ for (const word of [cue.word, cue.untilWord]) if (word !== void 0 && words !== null && word >= words) issues.push(`a cue names word ${word}, but the narration has ${words} words`);
275
+ if (slide.content.kind !== "shot" && slide.content.kind !== "shot-ref") issues.push("a cue names an annotation, but only a shot carries annotations");
276
+ }
277
+ if (annotations !== null) issues.push(...annotationCueIssues(narration, annotations));
278
+ return issues;
279
+ }
280
+ const Deck = DeckShape.superRefine((deck, ctx) => {
281
+ deck.slides.forEach((slide, index) => {
282
+ for (const message of cueIssues(slide)) ctx.addIssue({
283
+ code: "custom",
284
+ path: [
285
+ "slides",
286
+ index,
287
+ "narration",
288
+ "cues"
289
+ ],
290
+ message
291
+ });
292
+ });
293
+ const ids = /* @__PURE__ */ new Set();
294
+ deck.slides.forEach((slide, index) => {
295
+ if (ids.has(slide.id)) ctx.addIssue({
296
+ code: "custom",
297
+ path: [
298
+ "slides",
299
+ index,
300
+ "id"
301
+ ],
302
+ message: `slide id "${slide.id}" is used twice`
303
+ });
304
+ ids.add(slide.id);
305
+ });
306
+ });
307
+ const Manifest = z.object({
308
+ shots: z.record(z.string(), Shot),
309
+ updatedAt: z.string()
310
+ });
311
+ function exceedsLimits(deck, limits) {
312
+ const reasons = [];
313
+ const bytes = (text) => new TextEncoder().encode(text).length;
314
+ if (limits.maxSlides !== void 0 && deck.slides.length > limits.maxSlides) reasons.push(`the deck has ${deck.slides.length} slides; the limit is ${limits.maxSlides}`);
315
+ deck.slides.forEach((slide, index) => {
316
+ if (limits.maxSlideBytes !== void 0 && slide.content.kind === "html" && bytes(slide.content.html) > limits.maxSlideBytes) reasons.push(`slide ${index + 1} is ${bytes(slide.content.html)} bytes; the limit is ${limits.maxSlideBytes}`);
317
+ if (limits.maxNotesBytes !== void 0 && slide.notes && bytes(slide.notes) > limits.maxNotesBytes) reasons.push(`slide ${index + 1} has ${bytes(slide.notes)} bytes of notes; the limit is ${limits.maxNotesBytes}`);
318
+ });
319
+ return reasons;
320
+ }
321
+ function shotsUsed(deck) {
322
+ return deck.slides.flatMap((slide) => {
323
+ if (slide.content.kind === "shot") return [{
324
+ slide: slide.id,
325
+ key: slide.content.shot.key
326
+ }];
327
+ if (slide.content.kind === "shot-ref") return [{
328
+ slide: slide.id,
329
+ href: slide.content.href
330
+ }];
331
+ return [];
332
+ });
333
+ }
334
+ function jsonSchemas() {
335
+ return {
336
+ page: z.toJSONSchema(Page, { io: "input" }),
337
+ imposition: z.toJSONSchema(Imposition, { io: "input" }),
338
+ deck: z.toJSONSchema(DeckShape, { io: "input" }),
339
+ manifest: z.toJSONSchema(Manifest, { io: "input" }),
340
+ publishedShot: z.toJSONSchema(PublishedShot, { io: "input" })
341
+ };
342
+ }
343
+ //#endregion
344
+ export { Annotation, Box, Cue, DECK_SIZE, Deck, Direction, Imposition, MARK_GAP_MM, MARK_LENGTH_MM, MAX_IMPOSITION_CELLS, MM_PER_PT, Manifest, Margin, NAMED_PAPERS, Narration, PAPER_MM, PX_PER_MM, Page, PageSize, Paper, Point, Print, PublishedShot, SHOT_KEY, Scripts, Shot, Size, Slide, SlideContent, Word, annotationCueIssues, exceedsLimits, firstStrongDirection, fitPage, impose, jsonSchemas, languageDirection, mirrorPlacement, pagePlacementLayout, printBoxes, printPadding, printProperties, resolveDirection, roundMillimeters, sheetMm, shotsUsed, toMillimeters };
@@ -0,0 +1,47 @@
1
+ import { Paper, Print } from "./index.js";
2
+ //#region src/paper.d.ts
3
+ export declare const MM_PER_PT: number;
4
+ export declare const MARK_LENGTH_MM = 5;
5
+ export declare const MARK_GAP_MM = 1;
6
+ export declare const PAPER_MM: Record<Extract<Paper, string>, {
7
+ width: number;
8
+ height: number;
9
+ }>;
10
+ export declare const roundMillimeters: (mm: number) => number;
11
+ export declare function toMillimeters(value: number, unit: 'mm' | 'in' | 'pt'): number;
12
+ export declare function sheetMm(print: Pick<Print, 'paper' | 'orientation'>): {
13
+ width: number;
14
+ height: number;
15
+ };
16
+ export declare const PX_PER_MM: number;
17
+ export declare function printProperties(print: Pick<Print, 'bleed' | 'safe'>, unit?: 'mm' | 'in' | 'pt'): string;
18
+ export declare function printPadding(edges: {
19
+ top: number;
20
+ right: number;
21
+ bottom: number;
22
+ left: number;
23
+ }): string;
24
+ export interface PaperBox {
25
+ x: number;
26
+ y: number;
27
+ width: number;
28
+ height: number;
29
+ }
30
+ export interface MarkSegment {
31
+ x1: number;
32
+ y1: number;
33
+ x2: number;
34
+ y2: number;
35
+ }
36
+ export interface PrintBoxes {
37
+ media: {
38
+ width: number;
39
+ height: number;
40
+ };
41
+ bleedBox: PaperBox;
42
+ trim: PaperBox;
43
+ safeBox: PaperBox;
44
+ marks: MarkSegment[];
45
+ }
46
+ export declare function printBoxes(print: Print): PrintBoxes;
47
+ //#endregion
package/dist/paper.js ADDED
@@ -0,0 +1,159 @@
1
+ //#region src/paper.ts
2
+ const MM_PER_PT = 25.4 / 72;
3
+ const MARK_LENGTH_MM = 5;
4
+ const MARK_GAP_MM = 1;
5
+ const PAPER_MM = {
6
+ letter: {
7
+ width: 215.9,
8
+ height: 279.4
9
+ },
10
+ legal: {
11
+ width: 215.9,
12
+ height: 355.6
13
+ },
14
+ tabloid: {
15
+ width: 279.4,
16
+ height: 431.8
17
+ },
18
+ a3: {
19
+ width: 297,
20
+ height: 420
21
+ },
22
+ a4: {
23
+ width: 210,
24
+ height: 297
25
+ },
26
+ a5: {
27
+ width: 148,
28
+ height: 210
29
+ }
30
+ };
31
+ const roundMillimeters = (mm) => Math.round(mm * 100) / 100;
32
+ function toMillimeters(value, unit) {
33
+ return value * (unit === "in" ? 25.4 : unit === "pt" ? MM_PER_PT : 1);
34
+ }
35
+ function sheetMm(print) {
36
+ const portrait = typeof print.paper === "string" ? PAPER_MM[print.paper] : {
37
+ width: toMillimeters(print.paper.width, print.paper.unit),
38
+ height: toMillimeters(print.paper.height, print.paper.unit)
39
+ };
40
+ const [short, long] = [Math.min(portrait.width, portrait.height), Math.max(portrait.width, portrait.height)];
41
+ return print.orientation === "landscape" ? {
42
+ width: roundMillimeters(long),
43
+ height: roundMillimeters(short)
44
+ } : {
45
+ width: roundMillimeters(short),
46
+ height: roundMillimeters(long)
47
+ };
48
+ }
49
+ const PX_PER_MM = 96 / 25.4;
50
+ function printProperties(print, unit = "mm") {
51
+ return `:root{--segnavia-bleed:${roundMillimeters(toMillimeters(print.bleed, unit))}mm;--segnavia-safe:${roundMillimeters(toMillimeters(print.safe, unit))}mm}`;
52
+ }
53
+ function printPadding(edges) {
54
+ return `:where(html){padding:${[
55
+ edges.top,
56
+ edges.right,
57
+ edges.bottom,
58
+ edges.left
59
+ ].map((value) => `${value}mm`).join(" ")}}`;
60
+ }
61
+ function printBoxes(print) {
62
+ const sheet = sheetMm(print);
63
+ const outside = print.marks ? 6 : 0;
64
+ const bleedBox = {
65
+ x: outside,
66
+ y: outside,
67
+ width: roundMillimeters(sheet.width + print.bleed * 2),
68
+ height: roundMillimeters(sheet.height + print.bleed * 2)
69
+ };
70
+ const trim = {
71
+ x: roundMillimeters(outside + print.bleed),
72
+ y: roundMillimeters(outside + print.bleed),
73
+ width: sheet.width,
74
+ height: sheet.height
75
+ };
76
+ const safeBox = {
77
+ x: roundMillimeters(trim.x + print.safe),
78
+ y: roundMillimeters(trim.y + print.safe),
79
+ width: roundMillimeters(trim.width - print.safe * 2),
80
+ height: roundMillimeters(trim.height - print.safe * 2)
81
+ };
82
+ const media = {
83
+ width: roundMillimeters(bleedBox.width + outside * 2),
84
+ height: roundMillimeters(bleedBox.height + outside * 2)
85
+ };
86
+ if (!print.marks) return {
87
+ media,
88
+ bleedBox,
89
+ trim,
90
+ safeBox,
91
+ marks: []
92
+ };
93
+ const leftStart = roundMillimeters(bleedBox.x - 1);
94
+ const rightStart = roundMillimeters(bleedBox.x + bleedBox.width + 1);
95
+ const topStart = roundMillimeters(bleedBox.y - 1);
96
+ const bottomStart = roundMillimeters(bleedBox.y + bleedBox.height + 1);
97
+ const right = roundMillimeters(rightStart + 5);
98
+ const bottom = roundMillimeters(bottomStart + 5);
99
+ const trimRight = roundMillimeters(trim.x + trim.width);
100
+ const trimBottom = roundMillimeters(trim.y + trim.height);
101
+ return {
102
+ media,
103
+ bleedBox,
104
+ trim,
105
+ safeBox,
106
+ marks: [
107
+ {
108
+ x1: roundMillimeters(leftStart - 5),
109
+ y1: trim.y,
110
+ x2: leftStart,
111
+ y2: trim.y
112
+ },
113
+ {
114
+ x1: trim.x,
115
+ y1: roundMillimeters(topStart - 5),
116
+ x2: trim.x,
117
+ y2: topStart
118
+ },
119
+ {
120
+ x1: rightStart,
121
+ y1: trim.y,
122
+ x2: right,
123
+ y2: trim.y
124
+ },
125
+ {
126
+ x1: trimRight,
127
+ y1: roundMillimeters(topStart - 5),
128
+ x2: trimRight,
129
+ y2: topStart
130
+ },
131
+ {
132
+ x1: roundMillimeters(leftStart - 5),
133
+ y1: trimBottom,
134
+ x2: leftStart,
135
+ y2: trimBottom
136
+ },
137
+ {
138
+ x1: trim.x,
139
+ y1: bottomStart,
140
+ x2: trim.x,
141
+ y2: bottom
142
+ },
143
+ {
144
+ x1: rightStart,
145
+ y1: trimBottom,
146
+ x2: right,
147
+ y2: trimBottom
148
+ },
149
+ {
150
+ x1: trimRight,
151
+ y1: bottomStart,
152
+ x2: trimRight,
153
+ y2: bottom
154
+ }
155
+ ]
156
+ };
157
+ }
158
+ //#endregion
159
+ export { MARK_GAP_MM, MARK_LENGTH_MM, MM_PER_PT, PAPER_MM, PX_PER_MM, printBoxes, printPadding, printProperties, roundMillimeters, sheetMm, toMillimeters };
package/package.json CHANGED
@@ -1,6 +1,31 @@
1
1
  {
2
2
  "name": "@segnavia/format",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.2.0",
4
+ "type": "module",
5
+ "license": "MIT",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/modstudio/segnavia.git",
9
+ "directory": "packages/format"
10
+ },
11
+ "files": [
12
+ "dist"
13
+ ],
14
+ "sideEffects": false,
15
+ "engines": {
16
+ "node": ">=22"
17
+ },
18
+ "publishConfig": {
19
+ "access": "public"
20
+ },
21
+ "exports": {
22
+ ".": {
23
+ "@segnavia/source": "./src/index.ts",
24
+ "types": "./dist/index.d.ts",
25
+ "default": "./dist/index.js"
26
+ }
27
+ },
28
+ "dependencies": {
29
+ "zod": "^4.1.0"
30
+ }
31
+ }
package/README.md DELETED
@@ -1,3 +0,0 @@
1
- # Temporary Holding Version
2
-
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.