paraframe 0.0.0-stage → 0.1.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/LICENSE +21 -0
- package/README.md +131 -2
- package/dist/Canvas.svelte +693 -0
- package/dist/Canvas.svelte.d.ts +9 -0
- package/dist/Comments.svelte +48 -0
- package/dist/Comments.svelte.d.ts +13 -0
- package/dist/FrameHost.svelte +135 -0
- package/dist/FrameHost.svelte.d.ts +8 -0
- package/dist/FrameLink.svelte +17 -0
- package/dist/FrameLink.svelte.d.ts +7 -0
- package/dist/Player.svelte +368 -0
- package/dist/Player.svelte.d.ts +8 -0
- package/dist/comments.d.ts +4 -0
- package/dist/comments.js +7 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +6 -0
- package/dist/internal/CanvasPreview.svelte +153 -0
- package/dist/internal/CanvasPreview.svelte.d.ts +15 -0
- package/dist/internal/Icon.svelte +44 -0
- package/dist/internal/Icon.svelte.d.ts +29 -0
- package/dist/internal/Menu.svelte +65 -0
- package/dist/internal/Menu.svelte.d.ts +13 -0
- package/dist/internal/MenuItem.svelte +38 -0
- package/dist/internal/MenuItem.svelte.d.ts +12 -0
- package/dist/internal/canvas-frame.d.ts +2 -0
- package/dist/internal/canvas-frame.js +88 -0
- package/dist/internal/canvas-load-queue.d.ts +7 -0
- package/dist/internal/canvas-load-queue.js +69 -0
- package/dist/internal/comments.d.ts +36 -0
- package/dist/internal/comments.js +14 -0
- package/dist/internal/storage.d.ts +3 -0
- package/dist/internal/storage.js +22 -0
- package/dist/messages.d.ts +24 -0
- package/dist/messages.js +20 -0
- package/dist/nav.d.ts +18 -0
- package/dist/nav.js +15 -0
- package/dist/prototype.d.ts +10 -0
- package/dist/prototype.js +77 -0
- package/dist/styles.css +133 -0
- package/dist/types.d.ts +97 -0
- package/dist/types.js +1 -0
- package/package.json +90 -3
package/dist/nav.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Attachment } from 'svelte/attachments';
|
|
2
|
+
/** Navigation between frames, available to any component inside a frame. */
|
|
3
|
+
export interface FrameNav {
|
|
4
|
+
/** Id of the frame being shown. */
|
|
5
|
+
readonly current: string;
|
|
6
|
+
/** URL that opens a frame in the player. */
|
|
7
|
+
href(frameId: string): string;
|
|
8
|
+
/** Shows another frame. */
|
|
9
|
+
go(frameId: string): void;
|
|
10
|
+
/**
|
|
11
|
+
* Turns any element into a link to another frame, e.g. a table row:
|
|
12
|
+
* `<tr {@attach nav.hotspot('detail')}>`.
|
|
13
|
+
*/
|
|
14
|
+
hotspot(frameId: string): Attachment<HTMLElement>;
|
|
15
|
+
}
|
|
16
|
+
export declare function setFrameNav(nav: FrameNav): void;
|
|
17
|
+
/** Returns frame navigation. Outside a frame host, links do nothing. */
|
|
18
|
+
export declare function useFrameNav(): FrameNav;
|
package/dist/nav.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { getContext, setContext } from 'svelte';
|
|
2
|
+
const KEY = Symbol('paraframe.nav');
|
|
3
|
+
const detached = {
|
|
4
|
+
current: '',
|
|
5
|
+
href: () => '#',
|
|
6
|
+
go: () => { },
|
|
7
|
+
hotspot: () => () => { }
|
|
8
|
+
};
|
|
9
|
+
export function setFrameNav(nav) {
|
|
10
|
+
setContext(KEY, nav);
|
|
11
|
+
}
|
|
12
|
+
/** Returns frame navigation. Outside a frame host, links do nothing. */
|
|
13
|
+
export function useFrameNav() {
|
|
14
|
+
return getContext(KEY) ?? detached;
|
|
15
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { FrameSize, Prototype, PrototypeDefinition, ResolvedFrame } from './types.js';
|
|
2
|
+
export declare const DEFAULT_SIZE: FrameSize;
|
|
3
|
+
/** Validates a prototype definition and indexes its frames. Throws on bad or duplicate ids. */
|
|
4
|
+
export declare function definePrototype(definition: PrototypeDefinition): Prototype;
|
|
5
|
+
/** Prerender entries for a `[frame]` route parameter. */
|
|
6
|
+
export declare function frameEntries(prototype: Prototype): {
|
|
7
|
+
frame: string;
|
|
8
|
+
}[];
|
|
9
|
+
/** Imports a frame's component. Use it in the frame route's `load`. Responds 404 for unknown ids. */
|
|
10
|
+
export declare function resolveFrame(prototype: Prototype, frameId: string): Promise<ResolvedFrame>;
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { error } from '@sveltejs/kit';
|
|
2
|
+
export const DEFAULT_SIZE = { width: 1440, height: 900 };
|
|
3
|
+
const ID = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
|
|
4
|
+
function assertId(kind, id) {
|
|
5
|
+
if (!ID.test(id)) {
|
|
6
|
+
throw new Error(`[paraframe] ${kind} id "${id}" must be lowercase letters, digits and dashes`);
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
/** Validates a prototype definition and indexes its frames. Throws on bad or duplicate ids. */
|
|
10
|
+
export function definePrototype(definition) {
|
|
11
|
+
const size = { ...DEFAULT_SIZE, ...definition.size };
|
|
12
|
+
const frames = [];
|
|
13
|
+
const byId = new Map();
|
|
14
|
+
const sectionIds = new Set();
|
|
15
|
+
const sections = definition.sections.map((def) => {
|
|
16
|
+
assertId('Section', def.id);
|
|
17
|
+
if (sectionIds.has(def.id))
|
|
18
|
+
throw new Error(`[paraframe] Duplicate section id "${def.id}"`);
|
|
19
|
+
sectionIds.add(def.id);
|
|
20
|
+
const section = { id: def.id, title: def.title, columns: def.columns, frames: [] };
|
|
21
|
+
for (const f of def.frames) {
|
|
22
|
+
assertId('Frame', f.id);
|
|
23
|
+
if (byId.has(f.id))
|
|
24
|
+
throw new Error(`[paraframe] Duplicate frame id "${f.id}"`);
|
|
25
|
+
const frame = {
|
|
26
|
+
id: f.id,
|
|
27
|
+
title: f.title,
|
|
28
|
+
load: f.load,
|
|
29
|
+
props: f.props ?? {},
|
|
30
|
+
size: { ...size, ...f.size },
|
|
31
|
+
section,
|
|
32
|
+
index: frames.length
|
|
33
|
+
};
|
|
34
|
+
frames.push(frame);
|
|
35
|
+
byId.set(f.id, frame);
|
|
36
|
+
section.frames.push(frame);
|
|
37
|
+
}
|
|
38
|
+
return section;
|
|
39
|
+
});
|
|
40
|
+
const flows = (definition.flows ?? []).map((flow) => {
|
|
41
|
+
assertId('Flow', flow.id);
|
|
42
|
+
if (!byId.has(flow.start)) {
|
|
43
|
+
throw new Error(`[paraframe] Flow "${flow.id}" starts on unknown frame "${flow.start}"`);
|
|
44
|
+
}
|
|
45
|
+
return { ...flow };
|
|
46
|
+
});
|
|
47
|
+
return {
|
|
48
|
+
title: definition.title,
|
|
49
|
+
description: definition.description,
|
|
50
|
+
size,
|
|
51
|
+
sections,
|
|
52
|
+
frames,
|
|
53
|
+
flows,
|
|
54
|
+
paths: definition.paths,
|
|
55
|
+
get: (id) => byId.get(id),
|
|
56
|
+
next: (id) => {
|
|
57
|
+
const frame = byId.get(id);
|
|
58
|
+
return frame ? frames[frame.index + 1] : undefined;
|
|
59
|
+
},
|
|
60
|
+
prev: (id) => {
|
|
61
|
+
const frame = byId.get(id);
|
|
62
|
+
return frame && frame.index > 0 ? frames[frame.index - 1] : undefined;
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
/** Prerender entries for a `[frame]` route parameter. */
|
|
67
|
+
export function frameEntries(prototype) {
|
|
68
|
+
return prototype.frames.map((f) => ({ frame: f.id }));
|
|
69
|
+
}
|
|
70
|
+
/** Imports a frame's component. Use it in the frame route's `load`. Responds 404 for unknown ids. */
|
|
71
|
+
export async function resolveFrame(prototype, frameId) {
|
|
72
|
+
const frame = prototype.get(frameId);
|
|
73
|
+
if (!frame)
|
|
74
|
+
error(404, `No frame "${frameId}" in this prototype`);
|
|
75
|
+
const module = await frame.load();
|
|
76
|
+
return { frame, component: module.default };
|
|
77
|
+
}
|
package/dist/styles.css
ADDED
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/*
|
|
2
|
+
paraframe's chrome. Import it once in the layout of the canvas and player
|
|
3
|
+
routes, not in the frame route: frames carry the host app's own styles.
|
|
4
|
+
|
|
5
|
+
Override the --pf-* custom properties to theme the chrome.
|
|
6
|
+
*/
|
|
7
|
+
@import 'tailwindcss' source(none);
|
|
8
|
+
@source './';
|
|
9
|
+
|
|
10
|
+
:root {
|
|
11
|
+
--pf-font: ui-sans-serif, system-ui, -apple-system, 'Segoe UI', sans-serif;
|
|
12
|
+
--pf-ink: #292524;
|
|
13
|
+
--pf-muted: #78716c;
|
|
14
|
+
--pf-line: #d6d3d1;
|
|
15
|
+
--pf-wash: #e7e5e4;
|
|
16
|
+
--pf-surface: #f5f5f4;
|
|
17
|
+
--pf-canvas: #1c1917;
|
|
18
|
+
--pf-canvas-ink: #e7e5e4;
|
|
19
|
+
--pf-canvas-muted: #a8a29e;
|
|
20
|
+
--pf-selection: #f5f5f4;
|
|
21
|
+
--pf-section: #292524;
|
|
22
|
+
--pf-grid: rgb(168 162 158 / 0.2);
|
|
23
|
+
--pf-stage: #1c1917;
|
|
24
|
+
--pf-accent: #57534e;
|
|
25
|
+
--pf-avatar: #009aaa;
|
|
26
|
+
--pf-comment: #0d99ff;
|
|
27
|
+
--pf-comment-soft: #e5f4ff;
|
|
28
|
+
/* Comments (visual-comments) take paraframe's colours and font. */
|
|
29
|
+
--vc-comment: var(--pf-comment);
|
|
30
|
+
--vc-comment-soft: var(--pf-comment-soft);
|
|
31
|
+
--vc-avatar: var(--pf-avatar);
|
|
32
|
+
--vc-font: var(--pf-font);
|
|
33
|
+
--pf-island: rgb(50 50 50 / 0.57);
|
|
34
|
+
--pf-island-ink: #fff;
|
|
35
|
+
--pf-island-muted: rgb(255 255 255 / 0.6);
|
|
36
|
+
--pf-island-hover: rgb(255 255 255 / 0.12);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
@theme inline {
|
|
40
|
+
--font-pf: var(--pf-font);
|
|
41
|
+
--color-pf-ink: var(--pf-ink);
|
|
42
|
+
--color-pf-muted: var(--pf-muted);
|
|
43
|
+
--color-pf-line: var(--pf-line);
|
|
44
|
+
--color-pf-wash: var(--pf-wash);
|
|
45
|
+
--color-pf-surface: var(--pf-surface);
|
|
46
|
+
--color-pf-canvas: var(--pf-canvas);
|
|
47
|
+
--color-pf-canvas-ink: var(--pf-canvas-ink);
|
|
48
|
+
--color-pf-canvas-muted: var(--pf-canvas-muted);
|
|
49
|
+
--color-pf-selection: var(--pf-selection);
|
|
50
|
+
--color-pf-section: var(--pf-section);
|
|
51
|
+
--color-pf-stage: var(--pf-stage);
|
|
52
|
+
--color-pf-accent: var(--pf-accent);
|
|
53
|
+
--color-pf-avatar: var(--pf-avatar);
|
|
54
|
+
--color-pf-comment: var(--pf-comment);
|
|
55
|
+
--color-pf-comment-soft: var(--pf-comment-soft);
|
|
56
|
+
--color-pf-island: var(--pf-island);
|
|
57
|
+
--color-pf-island-ink: var(--pf-island-ink);
|
|
58
|
+
--color-pf-island-muted: var(--pf-island-muted);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
@layer components {
|
|
62
|
+
.pf-toolbar {
|
|
63
|
+
display: flex;
|
|
64
|
+
flex-wrap: wrap;
|
|
65
|
+
align-items: flex-start;
|
|
66
|
+
justify-content: space-between;
|
|
67
|
+
gap: 0.5rem;
|
|
68
|
+
pointer-events: none;
|
|
69
|
+
}
|
|
70
|
+
/* Floating chrome: a frosted pill of pill-shaped tools. */
|
|
71
|
+
.pf-island {
|
|
72
|
+
display: flex;
|
|
73
|
+
min-width: 0;
|
|
74
|
+
max-width: 100%;
|
|
75
|
+
align-items: center;
|
|
76
|
+
gap: 0.125rem;
|
|
77
|
+
padding: 0.25rem;
|
|
78
|
+
border-radius: 9999px;
|
|
79
|
+
background: var(--pf-island);
|
|
80
|
+
backdrop-filter: blur(5px);
|
|
81
|
+
-webkit-backdrop-filter: blur(5px);
|
|
82
|
+
color: var(--pf-island-ink);
|
|
83
|
+
pointer-events: auto;
|
|
84
|
+
}
|
|
85
|
+
.pf-tool {
|
|
86
|
+
display: inline-flex;
|
|
87
|
+
height: 2rem;
|
|
88
|
+
min-width: 2rem;
|
|
89
|
+
align-items: center;
|
|
90
|
+
justify-content: center;
|
|
91
|
+
border-radius: 9999px;
|
|
92
|
+
color: var(--pf-island-ink);
|
|
93
|
+
outline: none;
|
|
94
|
+
}
|
|
95
|
+
.pf-tool:hover,
|
|
96
|
+
.pf-tool[aria-expanded='true'] {
|
|
97
|
+
background: var(--pf-island-hover);
|
|
98
|
+
}
|
|
99
|
+
.pf-tool:disabled {
|
|
100
|
+
opacity: 0.35;
|
|
101
|
+
pointer-events: none;
|
|
102
|
+
}
|
|
103
|
+
.pf-tool[aria-pressed='true'],
|
|
104
|
+
.pf-tool-primary {
|
|
105
|
+
background: var(--pf-island-ink);
|
|
106
|
+
color: var(--pf-ink);
|
|
107
|
+
}
|
|
108
|
+
.pf-tool-primary {
|
|
109
|
+
gap: 0.375rem;
|
|
110
|
+
padding-inline: 0.875rem 1rem;
|
|
111
|
+
font-weight: 500;
|
|
112
|
+
}
|
|
113
|
+
.pf-tool-primary:hover { background: rgb(255 255 255 / 0.85); }
|
|
114
|
+
.pf-tool:focus-visible {
|
|
115
|
+
box-shadow: 0 0 0 2px var(--pf-island-muted);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
.pf-tool-light {
|
|
119
|
+
display: inline-flex;
|
|
120
|
+
height: 1.75rem;
|
|
121
|
+
min-width: 1.75rem;
|
|
122
|
+
align-items: center;
|
|
123
|
+
justify-content: center;
|
|
124
|
+
border-radius: 0.125rem;
|
|
125
|
+
outline: none;
|
|
126
|
+
}
|
|
127
|
+
.pf-tool-light:hover {
|
|
128
|
+
background: var(--pf-wash);
|
|
129
|
+
}
|
|
130
|
+
.pf-tool-light:focus-visible {
|
|
131
|
+
box-shadow: 0 0 0 2px var(--pf-accent);
|
|
132
|
+
}
|
|
133
|
+
}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import type { Component } from 'svelte';
|
|
2
|
+
export type FrameComponent = Component<any>;
|
|
3
|
+
/** A frame's viewport in CSS pixels. */
|
|
4
|
+
export interface FrameSize {
|
|
5
|
+
width: number;
|
|
6
|
+
height: number;
|
|
7
|
+
}
|
|
8
|
+
export interface FrameDefinition {
|
|
9
|
+
/** URL-safe identifier: lowercase letters, digits and single dashes. */
|
|
10
|
+
id: string;
|
|
11
|
+
title: string;
|
|
12
|
+
/** Imports the frame's component, e.g. `() => import('./Overview.svelte')`. */
|
|
13
|
+
load: () => Promise<{
|
|
14
|
+
default: FrameComponent;
|
|
15
|
+
}>;
|
|
16
|
+
/** Props passed to the component, so one component can back several frames. */
|
|
17
|
+
props?: Record<string, unknown>;
|
|
18
|
+
/** Overrides the prototype's default size. */
|
|
19
|
+
size?: Partial<FrameSize>;
|
|
20
|
+
}
|
|
21
|
+
export interface SectionDefinition {
|
|
22
|
+
id: string;
|
|
23
|
+
title: string;
|
|
24
|
+
frames: FrameDefinition[];
|
|
25
|
+
/** Wrap frames onto a new canvas row after this many. Default: one row. */
|
|
26
|
+
columns?: number;
|
|
27
|
+
}
|
|
28
|
+
/** A named starting point for clicking through the prototype. */
|
|
29
|
+
export interface FlowDefinition {
|
|
30
|
+
id: string;
|
|
31
|
+
title: string;
|
|
32
|
+
/** Id of the frame the flow starts on. */
|
|
33
|
+
start: string;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Where the host app mounts paraframe's three views. Build these with
|
|
37
|
+
* `resolve()` from `$app/paths` so base paths are respected, e.g.
|
|
38
|
+
* `play: (frame) => resolve(`play/${frame}`)`.
|
|
39
|
+
*/
|
|
40
|
+
export interface PrototypePaths {
|
|
41
|
+
/** The canvas with every frame. */
|
|
42
|
+
canvas: () => string;
|
|
43
|
+
/** The player, showing one frame. */
|
|
44
|
+
play: (frameId: string) => string;
|
|
45
|
+
/** A frame rendered on its own, without paraframe's chrome. Loaded inside iframes. */
|
|
46
|
+
frame: (frameId: string) => string;
|
|
47
|
+
}
|
|
48
|
+
export interface PrototypeDefinition {
|
|
49
|
+
title: string;
|
|
50
|
+
description?: string;
|
|
51
|
+
/** Default frame size. Default: 1440 × 900. */
|
|
52
|
+
size?: Partial<FrameSize>;
|
|
53
|
+
sections: SectionDefinition[];
|
|
54
|
+
flows?: FlowDefinition[];
|
|
55
|
+
paths: PrototypePaths;
|
|
56
|
+
}
|
|
57
|
+
export interface Frame {
|
|
58
|
+
id: string;
|
|
59
|
+
title: string;
|
|
60
|
+
load: FrameDefinition['load'];
|
|
61
|
+
props: Record<string, unknown>;
|
|
62
|
+
size: FrameSize;
|
|
63
|
+
section: Section;
|
|
64
|
+
/** Position in reading order across all sections. */
|
|
65
|
+
index: number;
|
|
66
|
+
}
|
|
67
|
+
export interface Section {
|
|
68
|
+
id: string;
|
|
69
|
+
title: string;
|
|
70
|
+
columns: number | undefined;
|
|
71
|
+
frames: Frame[];
|
|
72
|
+
}
|
|
73
|
+
export interface Flow {
|
|
74
|
+
id: string;
|
|
75
|
+
title: string;
|
|
76
|
+
start: string;
|
|
77
|
+
}
|
|
78
|
+
export interface Prototype {
|
|
79
|
+
title: string;
|
|
80
|
+
description: string | undefined;
|
|
81
|
+
size: FrameSize;
|
|
82
|
+
sections: Section[];
|
|
83
|
+
/** Every frame, in reading order. */
|
|
84
|
+
frames: Frame[];
|
|
85
|
+
flows: Flow[];
|
|
86
|
+
paths: PrototypePaths;
|
|
87
|
+
get(frameId: string): Frame | undefined;
|
|
88
|
+
/** The frame after this one in reading order, if any. */
|
|
89
|
+
next(frameId: string): Frame | undefined;
|
|
90
|
+
/** The frame before this one in reading order, if any. */
|
|
91
|
+
prev(frameId: string): Frame | undefined;
|
|
92
|
+
}
|
|
93
|
+
/** A frame with its component imported, ready to render. */
|
|
94
|
+
export interface ResolvedFrame {
|
|
95
|
+
frame: Frame;
|
|
96
|
+
component: FrameComponent;
|
|
97
|
+
}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/package.json
CHANGED
|
@@ -1,6 +1,93 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "paraframe",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Click through Svelte prototypes like a Figma file: real Svelte components as frames, on a zoomable canvas and in a flow player.",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"svelte",
|
|
7
|
+
"sveltekit",
|
|
8
|
+
"svelte5",
|
|
9
|
+
"prototype",
|
|
10
|
+
"prototyping",
|
|
11
|
+
"prototype-viewer",
|
|
12
|
+
"canvas",
|
|
13
|
+
"infinite-canvas",
|
|
14
|
+
"design-tools",
|
|
15
|
+
"figma",
|
|
16
|
+
"frames"
|
|
17
|
+
],
|
|
18
|
+
"homepage": "https://paraframe.convex.works",
|
|
19
|
+
"bugs": "https://github.com/Convex-Works/paraframe/issues",
|
|
20
|
+
"repository": {
|
|
21
|
+
"type": "git",
|
|
22
|
+
"url": "git+https://github.com/Convex-Works/paraframe.git"
|
|
23
|
+
},
|
|
24
|
+
"license": "MIT",
|
|
25
|
+
"author": "Convex Works",
|
|
26
|
+
"type": "module",
|
|
27
|
+
"engines": {
|
|
28
|
+
"node": ">=22.17"
|
|
29
|
+
},
|
|
30
|
+
"files": [
|
|
31
|
+
"dist",
|
|
32
|
+
"!dist/**/*.test.*",
|
|
33
|
+
"!dist/**/*.spec.*"
|
|
34
|
+
],
|
|
35
|
+
"sideEffects": [
|
|
36
|
+
"**/*.css"
|
|
37
|
+
],
|
|
38
|
+
"svelte": "./dist/index.js",
|
|
39
|
+
"types": "./dist/index.d.ts",
|
|
40
|
+
"exports": {
|
|
41
|
+
".": {
|
|
42
|
+
"types": "./dist/index.d.ts",
|
|
43
|
+
"svelte": "./dist/index.js"
|
|
44
|
+
},
|
|
45
|
+
"./comments": {
|
|
46
|
+
"types": "./dist/comments.d.ts",
|
|
47
|
+
"svelte": "./dist/comments.js"
|
|
48
|
+
},
|
|
49
|
+
"./styles.css": "./dist/styles.css"
|
|
50
|
+
},
|
|
51
|
+
"peerDependencies": {
|
|
52
|
+
"@sveltejs/kit": "^3.0.0",
|
|
53
|
+
"svelte": "^5.57.1",
|
|
54
|
+
"tailwindcss": "^4.3.0",
|
|
55
|
+
"visual-comments": "^0.1.0"
|
|
56
|
+
},
|
|
57
|
+
"peerDependenciesMeta": {
|
|
58
|
+
"visual-comments": {
|
|
59
|
+
"optional": true
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
"devDependencies": {
|
|
63
|
+
"@convex-works/sign-in": "link:../sign-in",
|
|
64
|
+
"@sveltejs/adapter-static": "^4.0.0",
|
|
65
|
+
"@sveltejs/kit": "^3.0.0",
|
|
66
|
+
"@sveltejs/package": "^3.0.0",
|
|
67
|
+
"@sveltejs/vite-plugin-svelte": "^7.2.0",
|
|
68
|
+
"@tailwindcss/vite": "^4.3.0",
|
|
69
|
+
"@types/node": "^26.6.5",
|
|
70
|
+
"@typescript/native": "npm:typescript@^7.0.2",
|
|
71
|
+
"publint": "^0.3.21",
|
|
72
|
+
"svelte": "^5.57.1",
|
|
73
|
+
"svelte-check": "^4.7.6",
|
|
74
|
+
"tailwindcss": "^4.3.0",
|
|
75
|
+
"typescript": "~6.0.3",
|
|
76
|
+
"visual-comments": "^0.1.0",
|
|
77
|
+
"vite": "^8.3.0",
|
|
78
|
+
"vitest": "^5.0.5"
|
|
79
|
+
},
|
|
80
|
+
"imports": {
|
|
81
|
+
"#lib": "./src/lib/index.js",
|
|
82
|
+
"#lib/*": "./src/lib/*"
|
|
83
|
+
},
|
|
84
|
+
"scripts": {
|
|
85
|
+
"dev": "svelte-kit sync && svelte-package --watch",
|
|
86
|
+
"package": "svelte-kit sync && svelte-package && publint",
|
|
87
|
+
"showcase": "vite dev",
|
|
88
|
+
"build": "vite build && pnpm package",
|
|
89
|
+
"preview": "vite preview",
|
|
90
|
+
"check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --tsgo",
|
|
91
|
+
"test": "vitest run"
|
|
92
|
+
}
|
|
6
93
|
}
|