foss-design 0.2.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.
Files changed (132) hide show
  1. package/README.md +6 -3
  2. package/dist/cli.js +1700 -217
  3. package/dist/viewer/assets/index-ChcZNlVM.css +2 -0
  4. package/dist/viewer/assets/index-CzXF5TnZ.js +157 -0
  5. package/dist/viewer/index.html +2 -2
  6. package/dist/viewer-lib/assets/ibm-plex-mono-cyrillic-400-normal-BSMlKf0J.woff2 +0 -0
  7. package/dist/viewer-lib/assets/ibm-plex-mono-cyrillic-400-normal-CEL4l2ZJ.woff +0 -0
  8. package/dist/viewer-lib/assets/ibm-plex-mono-cyrillic-500-normal-Ael50iVv.woff +0 -0
  9. package/dist/viewer-lib/assets/ibm-plex-mono-cyrillic-500-normal-Bq9vWWag.woff2 +0 -0
  10. package/dist/viewer-lib/assets/ibm-plex-mono-cyrillic-ext-400-normal-DMdlQ8Kv.woff +0 -0
  11. package/dist/viewer-lib/assets/ibm-plex-mono-cyrillic-ext-400-normal-xuaO2J-f.woff2 +0 -0
  12. package/dist/viewer-lib/assets/ibm-plex-mono-cyrillic-ext-500-normal-BIfNGwUT.woff +0 -0
  13. package/dist/viewer-lib/assets/ibm-plex-mono-cyrillic-ext-500-normal-BqneJy0T.woff2 +0 -0
  14. package/dist/viewer-lib/assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff +0 -0
  15. package/dist/viewer-lib/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2 +0 -0
  16. package/dist/viewer-lib/assets/ibm-plex-mono-latin-500-normal-CB9ihrfo.woff +0 -0
  17. package/dist/viewer-lib/assets/ibm-plex-mono-latin-500-normal-DSY6xOcd.woff2 +0 -0
  18. package/dist/viewer-lib/assets/ibm-plex-mono-latin-ext-400-normal-BmRBH3aV.woff2 +0 -0
  19. package/dist/viewer-lib/assets/ibm-plex-mono-latin-ext-400-normal-D3D2R8hC.woff +0 -0
  20. package/dist/viewer-lib/assets/ibm-plex-mono-latin-ext-500-normal-CAhNIIs5.woff2 +0 -0
  21. package/dist/viewer-lib/assets/ibm-plex-mono-latin-ext-500-normal-CZ70TYgx.woff +0 -0
  22. package/dist/viewer-lib/assets/ibm-plex-mono-vietnamese-400-normal-BulugwFq.woff2 +0 -0
  23. package/dist/viewer-lib/assets/ibm-plex-mono-vietnamese-400-normal-DDuiU_S-.woff +0 -0
  24. package/dist/viewer-lib/assets/ibm-plex-mono-vietnamese-500-normal-C8zxqsMH.woff +0 -0
  25. package/dist/viewer-lib/assets/ibm-plex-mono-vietnamese-500-normal-DZ4AoWbu.woff2 +0 -0
  26. package/dist/viewer-lib/assets/ibm-plex-sans-cyrillic-400-normal-BTotfTJu.woff +0 -0
  27. package/dist/viewer-lib/assets/ibm-plex-sans-cyrillic-400-normal-DZqxrq2p.woff2 +0 -0
  28. package/dist/viewer-lib/assets/ibm-plex-sans-cyrillic-500-normal-ByOcLdNv.woff +0 -0
  29. package/dist/viewer-lib/assets/ibm-plex-sans-cyrillic-500-normal-CocWQlwt.woff2 +0 -0
  30. package/dist/viewer-lib/assets/ibm-plex-sans-cyrillic-600-normal-71GNu3SW.woff2 +0 -0
  31. package/dist/viewer-lib/assets/ibm-plex-sans-cyrillic-600-normal-BGq0mW3O.woff +0 -0
  32. package/dist/viewer-lib/assets/ibm-plex-sans-cyrillic-ext-400-normal-Dsrv2Tcn.woff +0 -0
  33. package/dist/viewer-lib/assets/ibm-plex-sans-cyrillic-ext-400-normal-g30qAdWV.woff2 +0 -0
  34. package/dist/viewer-lib/assets/ibm-plex-sans-cyrillic-ext-500-normal-Cs5J6C77.woff2 +0 -0
  35. package/dist/viewer-lib/assets/ibm-plex-sans-cyrillic-ext-500-normal-DB5PtV2g.woff +0 -0
  36. package/dist/viewer-lib/assets/ibm-plex-sans-cyrillic-ext-600-normal-Bz0x94Yp.woff +0 -0
  37. package/dist/viewer-lib/assets/ibm-plex-sans-cyrillic-ext-600-normal-DUMzJB7m.woff2 +0 -0
  38. package/dist/viewer-lib/assets/ibm-plex-sans-greek-400-normal-D9ESIMu3.woff +0 -0
  39. package/dist/viewer-lib/assets/ibm-plex-sans-greek-400-normal-_efipK4i.woff2 +0 -0
  40. package/dist/viewer-lib/assets/ibm-plex-sans-greek-500-normal-CuWXN6rf.woff +0 -0
  41. package/dist/viewer-lib/assets/ibm-plex-sans-greek-500-normal-JMMifIXV.woff2 +0 -0
  42. package/dist/viewer-lib/assets/ibm-plex-sans-greek-600-normal-D-CqTdkO.woff +0 -0
  43. package/dist/viewer-lib/assets/ibm-plex-sans-greek-600-normal-DzTrcv_p.woff2 +0 -0
  44. package/dist/viewer-lib/assets/ibm-plex-sans-latin-400-normal-CDDApCn2.woff2 +0 -0
  45. package/dist/viewer-lib/assets/ibm-plex-sans-latin-400-normal-CYLoc0-x.woff +0 -0
  46. package/dist/viewer-lib/assets/ibm-plex-sans-latin-500-normal-6ng42L7E.woff2 +0 -0
  47. package/dist/viewer-lib/assets/ibm-plex-sans-latin-500-normal-BgVn5rGT.woff +0 -0
  48. package/dist/viewer-lib/assets/ibm-plex-sans-latin-600-normal-Cu4Hd6ag.woff +0 -0
  49. package/dist/viewer-lib/assets/ibm-plex-sans-latin-600-normal-CuJfVYMP.woff2 +0 -0
  50. package/dist/viewer-lib/assets/ibm-plex-sans-latin-ext-400-normal-C5H60-Va.woff2 +0 -0
  51. package/dist/viewer-lib/assets/ibm-plex-sans-latin-ext-400-normal-RBey6euL.woff +0 -0
  52. package/dist/viewer-lib/assets/ibm-plex-sans-latin-ext-500-normal-D0aIdm-b.woff +0 -0
  53. package/dist/viewer-lib/assets/ibm-plex-sans-latin-ext-500-normal-DakdToA3.woff2 +0 -0
  54. package/dist/viewer-lib/assets/ibm-plex-sans-latin-ext-600-normal-DIrixKbi.woff +0 -0
  55. package/dist/viewer-lib/assets/ibm-plex-sans-latin-ext-600-normal-DOrvGEcy.woff2 +0 -0
  56. package/dist/viewer-lib/assets/ibm-plex-sans-vietnamese-400-normal-DG4YqDda.woff2 +0 -0
  57. package/dist/viewer-lib/assets/ibm-plex-sans-vietnamese-400-normal-fK1oJ5dG.woff +0 -0
  58. package/dist/viewer-lib/assets/ibm-plex-sans-vietnamese-500-normal-BEb3_waV.woff +0 -0
  59. package/dist/viewer-lib/assets/ibm-plex-sans-vietnamese-500-normal-e4dixQRQ.woff2 +0 -0
  60. package/dist/viewer-lib/assets/ibm-plex-sans-vietnamese-600-normal-DgdngZtN.woff +0 -0
  61. package/dist/viewer-lib/assets/ibm-plex-sans-vietnamese-600-normal-DpPYBSTl.woff2 +0 -0
  62. package/dist/viewer-lib/index.d.ts +1 -0
  63. package/dist/viewer-lib/index.js +17581 -0
  64. package/dist/viewer-lib/styles.css +3090 -0
  65. package/dist/viewer-lib/types/src/shared/devices.d.ts +46 -0
  66. package/dist/viewer-lib/types/src/shared/types.d.ts +355 -0
  67. package/dist/viewer-lib/types/viewer/src/app.d.ts +20 -0
  68. package/dist/viewer-lib/types/viewer/src/components/auto-frame.d.ts +13 -0
  69. package/dist/viewer-lib/types/viewer/src/components/code-view.d.ts +6 -0
  70. package/dist/viewer-lib/types/viewer/src/components/command-palette.d.ts +2 -0
  71. package/dist/viewer-lib/types/viewer/src/components/inspector.d.ts +29 -0
  72. package/dist/viewer-lib/types/viewer/src/components/issues.d.ts +10 -0
  73. package/dist/viewer-lib/types/viewer/src/components/markdown.d.ts +8 -0
  74. package/dist/viewer-lib/types/viewer/src/components/search-button.d.ts +6 -0
  75. package/dist/viewer-lib/types/viewer/src/components/slide-panel.d.ts +11 -0
  76. package/dist/viewer-lib/types/viewer/src/components/theme-menu.d.ts +1 -0
  77. package/dist/viewer-lib/types/viewer/src/components/topbar.d.ts +8 -0
  78. package/dist/viewer-lib/types/viewer/src/components/wordmark.d.ts +7 -0
  79. package/dist/viewer-lib/types/viewer/src/lib/api.d.ts +14 -0
  80. package/dist/viewer-lib/types/viewer/src/lib/cn.d.ts +1 -0
  81. package/dist/viewer-lib/types/viewer/src/lib/copy.d.ts +1 -0
  82. package/dist/viewer-lib/types/viewer/src/lib/focus.d.ts +2 -0
  83. package/dist/viewer-lib/types/viewer/src/lib/format.d.ts +3 -0
  84. package/dist/viewer-lib/types/viewer/src/lib/frames.d.ts +25 -0
  85. package/dist/viewer-lib/types/viewer/src/lib/platform.d.ts +3 -0
  86. package/dist/viewer-lib/types/viewer/src/lib/source.d.ts +43 -0
  87. package/dist/viewer-lib/types/viewer/src/lib/store.d.ts +10 -0
  88. package/dist/viewer-lib/types/viewer/src/lib/theme.d.ts +6 -0
  89. package/dist/viewer-lib/types/viewer/src/lib/viewer.d.ts +44 -0
  90. package/dist/viewer-lib/types/viewer/src/library.d.ts +25 -0
  91. package/dist/viewer-lib/types/viewer/src/pages/canvas/camera.d.ts +43 -0
  92. package/dist/viewer-lib/types/viewer/src/pages/canvas/canvas-bar.d.ts +29 -0
  93. package/dist/viewer-lib/types/viewer/src/pages/canvas/canvas-page.d.ts +4 -0
  94. package/dist/viewer-lib/types/viewer/src/pages/canvas/items.d.ts +47 -0
  95. package/dist/viewer-lib/types/viewer/src/pages/canvas/layout.d.ts +30 -0
  96. package/dist/viewer-lib/types/viewer/src/pages/canvas/overlay.d.ts +19 -0
  97. package/dist/viewer-lib/types/viewer/src/pages/canvas/play-page.d.ts +4 -0
  98. package/dist/viewer-lib/types/viewer/src/pages/canvas/sidebar.d.ts +10 -0
  99. package/dist/viewer-lib/types/viewer/src/pages/canvas/view-state.d.ts +30 -0
  100. package/dist/viewer-lib/types/viewer/src/pages/canvas/viewport.d.ts +37 -0
  101. package/dist/viewer-lib/types/viewer/src/pages/home.d.ts +1 -0
  102. package/dist/viewer-lib/types/viewer/src/pages/not-found.d.ts +4 -0
  103. package/dist/viewer-lib/types/viewer/src/pages/system/assets.d.ts +4 -0
  104. package/dist/viewer-lib/types/viewer/src/pages/system/colors.d.ts +4 -0
  105. package/dist/viewer-lib/types/viewer/src/pages/system/component-page.d.ts +5 -0
  106. package/dist/viewer-lib/types/viewer/src/pages/system/guideline.d.ts +5 -0
  107. package/dist/viewer-lib/types/viewer/src/pages/system/motion.d.ts +7 -0
  108. package/dist/viewer-lib/types/viewer/src/pages/system/nav.d.ts +5 -0
  109. package/dist/viewer-lib/types/viewer/src/pages/system/other-tokens.d.ts +4 -0
  110. package/dist/viewer-lib/types/viewer/src/pages/system/overview.d.ts +4 -0
  111. package/dist/viewer-lib/types/viewer/src/pages/system/shape.d.ts +4 -0
  112. package/dist/viewer-lib/types/viewer/src/pages/system/shared.d.ts +34 -0
  113. package/dist/viewer-lib/types/viewer/src/pages/system/system-routes.d.ts +2 -0
  114. package/dist/viewer-lib/types/viewer/src/pages/system/typography.d.ts +4 -0
  115. package/dist/viewer-lib/types/viewer/src/ui/avatar.d.ts +14 -0
  116. package/dist/viewer-lib/types/viewer/src/ui/badge.d.ts +11 -0
  117. package/dist/viewer-lib/types/viewer/src/ui/button.d.ts +37 -0
  118. package/dist/viewer-lib/types/viewer/src/ui/choice.d.ts +19 -0
  119. package/dist/viewer-lib/types/viewer/src/ui/dialog.d.ts +18 -0
  120. package/dist/viewer-lib/types/viewer/src/ui/icon-paths.d.ts +87 -0
  121. package/dist/viewer-lib/types/viewer/src/ui/icon.d.ts +8 -0
  122. package/dist/viewer-lib/types/viewer/src/ui/menu.d.ts +27 -0
  123. package/dist/viewer-lib/types/viewer/src/ui/meter.d.ts +15 -0
  124. package/dist/viewer-lib/types/viewer/src/ui/page.d.ts +39 -0
  125. package/dist/viewer-lib/types/viewer/src/ui/panel.d.ts +72 -0
  126. package/dist/viewer-lib/types/viewer/src/ui/text-field.d.ts +19 -0
  127. package/dist/viewer-lib/types/viewer/src/ui/text.d.ts +22 -0
  128. package/dist/viewer-lib/types/viewer/src/ui/toast.d.ts +5 -0
  129. package/dist/viewer-lib/types/viewer/src/ui/tooltip.d.ts +13 -0
  130. package/package.json +20 -2
  131. package/dist/viewer/assets/index-DeZ8UVA6.css +0 -2
  132. package/dist/viewer/assets/index-j0vt81cl.js +0 -157
@@ -0,0 +1,44 @@
1
+ import { type ReactNode } from 'react';
2
+ import type { ViewerSource } from './source';
3
+ /** Places where an app that embeds the viewer adds its own controls. */
4
+ export interface ViewerSlots {
5
+ /** At the start of every top bar. */
6
+ barStart?: ReactNode;
7
+ /** At the end of every top bar. */
8
+ barEnd?: ReactNode;
9
+ /** Full width under every top bar, above the page: a notice strip. */
10
+ belowBar?: ReactNode;
11
+ /** Next to the project title on the home page. */
12
+ homeActions?: ReactNode;
13
+ /** At the end of each canvas row on the home page. */
14
+ canvasRowActions?: (canvasId: string) => ReactNode;
15
+ /** Below the panels of the home page. */
16
+ homeAfter?: ReactNode;
17
+ }
18
+ /** Single-canvas mode: only this canvas is reachable, without the design system or other canvases. */
19
+ export interface ViewerScope {
20
+ canvas: string;
21
+ }
22
+ /** Query keys of one source, so viewers of different projects can share a QueryClient. */
23
+ export declare function viewerKeys(id: string): {
24
+ all: readonly ['design', string];
25
+ project: readonly ['design', string, 'project'];
26
+ canvas: (canvas: string) => readonly ['design', string, 'canvas', string];
27
+ system: readonly ['design', string, 'system'];
28
+ sources: readonly ['design', string, 'source'];
29
+ source: (unit: string, path: string) => readonly ['design', string, 'source', string, string];
30
+ };
31
+ export type ViewerKeys = ReturnType<typeof viewerKeys>;
32
+ export interface Viewer {
33
+ source: ViewerSource;
34
+ keys: ViewerKeys;
35
+ frameSandbox?: string;
36
+ slots: ViewerSlots;
37
+ scope: ViewerScope | null;
38
+ }
39
+ /** A stable id per source object. */
40
+ export declare function sourceId(source: ViewerSource): string;
41
+ export declare const ViewerContext: import("react").Context<Viewer | null>;
42
+ export declare function useViewer(): Viewer;
43
+ /** Whether a route parameter names the canvas `id`, encoded or not. */
44
+ export declare function sameId(param: string, id: string): boolean;
@@ -0,0 +1,25 @@
1
+ export type { AssetDoc, CanvasDoc, CanvasItem, CanvasPage, CanvasSection, CanvasSummary, ComponentDoc, FrameSize, GuidelineDoc, ImageItem, Issue, NoteItem, ProjectInfo, ScreenItem, SystemDoc, SystemSummary, Theme, Token, TokenKind, TokenValue, UrlItem, } from '../../src/shared/types';
2
+ export { DesignViewer, type DesignViewerProps } from './app';
3
+ export { SlidePanel } from './components/slide-panel';
4
+ export { ThemeMenu } from './components/theme-menu';
5
+ export { Bar } from './components/topbar';
6
+ export { Mark, Wordmark } from './components/wordmark';
7
+ export { cn } from './lib/cn';
8
+ export { copyText } from './lib/copy';
9
+ export { ApiError, localSource, resolveUrl, staticSource, type ViewerSource } from './lib/source';
10
+ export { setThemePref, type ThemePref, useTheme, useThemePref } from './lib/theme';
11
+ export type { ViewerScope, ViewerSlots } from './lib/viewer';
12
+ export { Avatar, initials } from './ui/avatar';
13
+ export { Badge, Count, type Tone } from './ui/badge';
14
+ export { Button, ButtonAnchor, type ButtonKind, ButtonLink, type ButtonProps, buttonClass, IconButton, type IconButtonProps, iconButtonClass, } from './ui/button';
15
+ export { Segmented, Switch } from './ui/choice';
16
+ export { Dialog } from './ui/dialog';
17
+ export { Icon, type IconName } from './ui/icon';
18
+ export { floatingSurface, Menu, MenuItem, MenuLabel, MenuSeparator, menuItemClass, menuSurface } from './ui/menu';
19
+ export { Meter } from './ui/meter';
20
+ export { Content, type NavItem, NavLabel, Notice, NoticeCard, PageHead, SubNav } from './ui/page';
21
+ export { GroupRow, KV, Panel, PanelBody, PanelFoot, PanelHead, PanelTabs, Row, RowLink, type RowProps, Strip, THead, } from './ui/panel';
22
+ export { Kbd, Mono, Muted, Two } from './ui/text';
23
+ export { TextArea, type TextAreaProps, TextField, type TextFieldProps } from './ui/text-field';
24
+ export { Toaster, type ToastTone, toast } from './ui/toast';
25
+ export { Tooltip, TooltipProvider } from './ui/tooltip';
@@ -0,0 +1,43 @@
1
+ /** Screen = world × z + (x, y). */
2
+ export interface Camera {
3
+ x: number;
4
+ y: number;
5
+ z: number;
6
+ }
7
+ export interface Rect {
8
+ x: number;
9
+ y: number;
10
+ w: number;
11
+ h: number;
12
+ }
13
+ /** The farthest out the camera goes; past it a page is specks, and every one of them still costs. */
14
+ export declare const MIN_ZOOM = 0.1;
15
+ export declare const MAX_ZOOM = 8;
16
+ type Listener = (camera: Camera) => void;
17
+ /** The canvas camera. Lives outside React so panning never re-renders the tree. */
18
+ export declare class CameraStore {
19
+ camera: Camera;
20
+ /** How far out the camera may go; the viewport sets it from the size of the page. */
21
+ minZoom: number;
22
+ private listeners;
23
+ private animation;
24
+ subscribe(listener: Listener): () => void;
25
+ set(next: Camera): void;
26
+ /** Stop any animation: the user took over. */
27
+ interrupt(): void;
28
+ panBy(dx: number, dy: number): void;
29
+ /** Zoom by `factor` keeping the screen point (sx, sy) in place. */
30
+ zoomAt(sx: number, sy: number, factor: number): void;
31
+ animateTo(target: Camera, duration?: number): void;
32
+ toWorld(sx: number, sy: number): {
33
+ x: number;
34
+ y: number;
35
+ };
36
+ }
37
+ /**
38
+ * The camera that shows `rect` inside a viewport of `w`×`h` with `pad` screen pixels around it.
39
+ * When `rect` does not fit even at `minZoom`, it lines up with the top (and the left, if it is too wide).
40
+ */
41
+ export declare function fitRect(rect: Rect, w: number, h: number, pad?: number, maxZoom?: number, minZoom?: number): Camera;
42
+ export declare function intersects(a: Rect, b: Rect): boolean;
43
+ export {};
@@ -0,0 +1,29 @@
1
+ import type { CanvasDoc, CanvasItem, CanvasPage as Page, Theme } from '../../../../src/shared/types';
2
+ import type { ViewStore } from './view-state';
3
+ /** The canvas page's top bar: the canvas and its pages, screen theme, inspect and play. */
4
+ export declare function CanvasBar({ canvas, page, theme, onTheme, sidebar, onSidebar, onPlay, canPlay, inspect, onInspect, }: {
5
+ canvas: CanvasDoc;
6
+ page: Page | undefined;
7
+ theme: Theme;
8
+ onTheme(theme: Theme): void;
9
+ sidebar: boolean;
10
+ onSidebar(value: boolean): void;
11
+ onPlay(): void;
12
+ canPlay: boolean;
13
+ inspect: boolean;
14
+ onInspect(value: boolean): void;
15
+ }): import("react").JSX.Element;
16
+ /** The selected item's name and actions, floating over the bottom of the canvas. */
17
+ export declare function SelectionBar({ canvas, store, layoutItems, theme, onPlay, inspect, }: {
18
+ canvas: CanvasDoc;
19
+ store: ViewStore;
20
+ layoutItems: CanvasItem[];
21
+ theme: Theme;
22
+ onPlay(id: string): void;
23
+ inspect: boolean;
24
+ }): import("react").JSX.Element | null;
25
+ /** The inspect mode switch: a button that stays pressed while on. */
26
+ export declare function InspectToggle({ on, onChange }: {
27
+ on: boolean;
28
+ onChange(value: boolean): void;
29
+ }): import("react").JSX.Element;
@@ -0,0 +1,4 @@
1
+ export declare function CanvasPage({ canvasId, pageId }: {
2
+ canvasId: string;
3
+ pageId?: string;
4
+ }): import("react").JSX.Element;
@@ -0,0 +1,47 @@
1
+ import type { CanvasSection, ImageItem, NoteItem, ScreenItem, Theme, UrlItem } from '../../../../src/shared/types';
2
+ import type { Placed } from './layout';
3
+ import { type ViewStore } from './view-state';
4
+ import type { FrameMode } from './viewport';
5
+ export interface FrameEvents {
6
+ onGo(from: string, target: string): void;
7
+ onWheel(frame: HTMLIFrameElement, message: {
8
+ deltaX: number;
9
+ deltaY: number;
10
+ x: number;
11
+ y: number;
12
+ zoom: boolean;
13
+ }): void;
14
+ onEscape(): void;
15
+ }
16
+ /** A screen or an external page on the canvas: live frame, snapshot or placeholder. */
17
+ export declare const FrameItem: import("react").MemoExoticComponent<({ placed, mode, thumb, theme, store, events, capture, }: {
18
+ placed: Placed & {
19
+ item: ScreenItem | UrlItem;
20
+ };
21
+ mode: FrameMode;
22
+ /** Small on screen: show the small snapshot. */
23
+ thumb: boolean;
24
+ theme: Theme;
25
+ store: ViewStore;
26
+ events: FrameEvents;
27
+ capture: boolean;
28
+ }) => import("react").JSX.Element>;
29
+ export declare const NoteView: import("react").MemoExoticComponent<({ placed, store, }: {
30
+ placed: Placed & {
31
+ item: NoteItem;
32
+ };
33
+ store: ViewStore;
34
+ }) => import("react").JSX.Element>;
35
+ export declare const ImageView: import("react").MemoExoticComponent<({ placed, store, }: {
36
+ placed: Placed & {
37
+ item: ImageItem;
38
+ };
39
+ store: ViewStore;
40
+ }) => import("react").JSX.Element>;
41
+ export declare const SectionHeader: import("react").MemoExoticComponent<({ section, x, y, w, store, }: {
42
+ section: CanvasSection;
43
+ x: number;
44
+ y: number;
45
+ w: number;
46
+ store: ViewStore;
47
+ }) => import("react").JSX.Element | null>;
@@ -0,0 +1,30 @@
1
+ import type { CanvasItem, CanvasPage, CanvasSection } from '../../../../src/shared/types';
2
+ import type { Rect } from './camera';
3
+ export interface Placed extends Rect {
4
+ item: CanvasItem;
5
+ section: CanvasSection;
6
+ }
7
+ export interface PlacedSection extends Rect {
8
+ section: CanvasSection;
9
+ /** Height of the title/description block above the row. */
10
+ header: number;
11
+ }
12
+ export interface Layout {
13
+ items: Placed[];
14
+ sections: PlacedSection[];
15
+ bounds: Rect;
16
+ }
17
+ /** Measured sizes: auto-height frames, notes, section headers, images. Keyed by item id or `section:<id>`. */
18
+ export type Sizes = Record<string, {
19
+ w?: number;
20
+ h: number;
21
+ }>;
22
+ export declare const isFrame: (item: CanvasItem) => item is import("../../../../src/shared/types").ScreenItem | import("../../../../src/shared/types").UrlItem;
23
+ export declare function itemSize(item: CanvasItem, sizes: Sizes): {
24
+ w: number;
25
+ h: number;
26
+ };
27
+ /** Sections stack top to bottom; items run left to right, wrapping after `columns`. */
28
+ export declare function layoutPage(page: CanvasPage, sizes: Sizes): Layout;
29
+ /** Frames in reading order, for arrow-key stepping and play mode. */
30
+ export declare function frameOrder(layout: Layout): Placed[];
@@ -0,0 +1,19 @@
1
+ import { type Layout } from './layout';
2
+ import type { ViewStore } from './view-state';
3
+ /**
4
+ * Labels and outlines drawn in screen space so they stay crisp at every zoom.
5
+ * Only frames near the screen get a label: every label restyles as the camera moves.
6
+ */
7
+ export declare function Overlay({ layout, view, store, overlayRef, }: {
8
+ layout: Layout;
9
+ /** The camera and viewport size, updated a few times a second while it moves. */
10
+ view: {
11
+ x: number;
12
+ y: number;
13
+ z: number;
14
+ w: number;
15
+ h: number;
16
+ } | null;
17
+ store: ViewStore;
18
+ overlayRef: React.RefObject<HTMLDivElement | null>;
19
+ }): import("react").JSX.Element;
@@ -0,0 +1,4 @@
1
+ export declare function PlayPage({ canvasId, itemId }: {
2
+ canvasId: string;
3
+ itemId: string;
4
+ }): import("react").JSX.Element | null;
@@ -0,0 +1,10 @@
1
+ import type { CanvasDoc, CanvasPage } from '../../../../src/shared/types';
2
+ import type { ViewStore } from './view-state';
3
+ export declare function pageHref(canvas: CanvasDoc, page: CanvasPage): string;
4
+ /** Pages of the canvas and the items on the current one. */
5
+ export declare function Sidebar({ canvas, page, store, onPick, }: {
6
+ canvas: CanvasDoc;
7
+ page: CanvasPage;
8
+ store: ViewStore;
9
+ onPick(id: string): void;
10
+ }): import("react").JSX.Element;
@@ -0,0 +1,30 @@
1
+ import { Store } from '../../lib/store';
2
+ import type { Sizes } from './layout';
3
+ export interface FrameStatus {
4
+ ready: boolean;
5
+ errors: string[];
6
+ }
7
+ export interface ViewState {
8
+ selected: string | null;
9
+ /** The frame that receives the pointer; the others sit behind a shield. */
10
+ active: string | null;
11
+ hovered: string | null;
12
+ sizes: Sizes;
13
+ frames: Record<string, FrameStatus>;
14
+ /** Frames kept alive, most recently wanted first. */
15
+ live: string[];
16
+ panning: boolean;
17
+ zoomTiny: boolean;
18
+ /** Mounted iframes by item id, for the inspector. */
19
+ frameEls: Record<string, HTMLIFrameElement | null>;
20
+ /** Inspect mode: screens take the pointer so the inspector can see it. */
21
+ inspecting: boolean;
22
+ }
23
+ export declare function createViewState(): Store<ViewState>;
24
+ export type ViewStore = ReturnType<typeof createViewState>;
25
+ export declare function setSize(store: ViewStore, key: string, size: {
26
+ w?: number;
27
+ h: number;
28
+ }): void;
29
+ export declare function setFrame(store: ViewStore, id: string, patch: Partial<FrameStatus>): void;
30
+ export declare function setFrameEl(store: ViewStore, id: string, el: HTMLIFrameElement | null): void;
@@ -0,0 +1,37 @@
1
+ import type { Theme } from '../../../../src/shared/types';
2
+ import { type RefObject } from 'react';
3
+ import { type CameraStore } from './camera';
4
+ import { type FrameEvents } from './items';
5
+ import { type Layout } from './layout';
6
+ import type { ViewStore } from './view-state';
7
+ /** How a frame runs: live, mounted but asleep behind its snapshot, or not mounted. */
8
+ export type FrameMode = 'live' | 'asleep' | 'off';
9
+ export interface ViewportApi {
10
+ /** The first view of a page: all of it, or its top when it is too big to see at once. */
11
+ openView(): void;
12
+ fitAll(animate?: boolean): void;
13
+ fitItem(id: string, animate?: boolean): void;
14
+ zoomBy(factor: number): void;
15
+ zoomTo(z: number): void;
16
+ size(): {
17
+ w: number;
18
+ h: number;
19
+ };
20
+ }
21
+ interface ViewportProps {
22
+ layout: Layout;
23
+ theme: Theme;
24
+ store: ViewStore;
25
+ camera: CameraStore;
26
+ events: FrameEvents;
27
+ capture: boolean;
28
+ apiRef: RefObject<ViewportApi | null>;
29
+ onPlay(id: string): void;
30
+ onSelect(id: string | null, point?: {
31
+ x: number;
32
+ y: number;
33
+ }): void;
34
+ }
35
+ export declare function Viewport({ layout, theme, store, camera, events, capture, apiRef, onPlay, onSelect }: ViewportProps): import("react").JSX.Element;
36
+ export declare function isTyping(target: EventTarget | null): boolean;
37
+ export {};
@@ -0,0 +1 @@
1
+ export declare function HomePage(): import("react").JSX.Element | null;
@@ -0,0 +1,4 @@
1
+ export declare function NotFound({ title, text }: {
2
+ title?: string;
3
+ text?: string;
4
+ }): import("react").JSX.Element;
@@ -0,0 +1,4 @@
1
+ import type { SystemDoc } from '../../../../src/shared/types';
2
+ export declare function AssetsPage({ system }: {
3
+ system: SystemDoc;
4
+ }): import("react").JSX.Element;
@@ -0,0 +1,4 @@
1
+ import type { SystemDoc } from '../../../../src/shared/types';
2
+ export declare function ColorsPage({ system }: {
3
+ system: SystemDoc;
4
+ }): import("react").JSX.Element;
@@ -0,0 +1,5 @@
1
+ import type { SystemDoc } from '../../../../src/shared/types';
2
+ export declare function ComponentPage({ system, id }: {
3
+ system: SystemDoc;
4
+ id: string;
5
+ }): import("react").JSX.Element;
@@ -0,0 +1,5 @@
1
+ import type { SystemDoc } from '../../../../src/shared/types';
2
+ export declare function GuidelinePage({ system, slug }: {
3
+ system: SystemDoc;
4
+ slug: string;
5
+ }): import("react").JSX.Element;
@@ -0,0 +1,7 @@
1
+ import type { SystemDoc } from '../../../../src/shared/types';
2
+ type Bezier = [number, number, number, number];
3
+ export declare function parseBezier(value: string): Bezier | null;
4
+ export declare function MotionPage({ system }: {
5
+ system: SystemDoc;
6
+ }): import("react").JSX.Element;
7
+ export {};
@@ -0,0 +1,5 @@
1
+ import type { SystemDoc } from '../../../../src/shared/types';
2
+ /** Grouped links of the system section; a wrapping row above the content on narrow screens. */
3
+ export declare function SystemNav({ system }: {
4
+ system: SystemDoc;
5
+ }): import("react").JSX.Element;
@@ -0,0 +1,4 @@
1
+ import type { SystemDoc } from '../../../../src/shared/types';
2
+ export declare function OtherTokensPage({ system }: {
3
+ system: SystemDoc;
4
+ }): import("react").JSX.Element;
@@ -0,0 +1,4 @@
1
+ import type { SystemDoc } from '../../../../src/shared/types';
2
+ export declare function OverviewPage({ system }: {
3
+ system: SystemDoc;
4
+ }): import("react").JSX.Element;
@@ -0,0 +1,4 @@
1
+ import type { SystemDoc } from '../../../../src/shared/types';
2
+ export declare function ShapePage({ system }: {
3
+ system: SystemDoc;
4
+ }): import("react").JSX.Element;
@@ -0,0 +1,34 @@
1
+ import type { Theme, Token, TokenKind } from '../../../../src/shared/types';
2
+ import { type ReactNode } from 'react';
3
+ /** Tailwind classes a token feeds, such as `bg-ink` for `--color-ink`. */
4
+ export declare function utilityHints(token: Token): string[];
5
+ export declare function byKind(tokens: Token[], ...kinds: TokenKind[]): Token[];
6
+ /** Tokens in the order their groups first appear. */
7
+ export declare function groupTokens(tokens: Token[]): {
8
+ group: string;
9
+ tokens: Token[];
10
+ }[];
11
+ /** A CSS length in pixels, with rem and em at 16px; null when it is not a plain length. */
12
+ export declare function toPx(value: string): number | null;
13
+ /** The value a token has in `theme`, falling back to light. */
14
+ export declare function valueIn(token: Token, theme: Theme): string | undefined;
15
+ /** A section's theme: follows the app until the reader picks one. */
16
+ export declare function useLocalTheme(): [Theme, (theme: Theme) => void];
17
+ export declare function ThemeSwitch({ value, onChange }: {
18
+ value: Theme;
19
+ onChange: (theme: Theme) => void;
20
+ }): import("react").JSX.Element;
21
+ export declare function Hints({ items }: {
22
+ items: string[];
23
+ }): import("react").JSX.Element | null;
24
+ /** What to add, and where, when a page has nothing to show. */
25
+ export declare function EmptyPanel({ title, children }: {
26
+ title: string;
27
+ children: ReactNode;
28
+ }): import("react").JSX.Element;
29
+ export declare const TOKENS_FILE = ".design/system/tokens.css";
30
+ /** A token value in mono that wraps between words, never inside a number. */
31
+ export declare function Value({ children, className }: {
32
+ children: ReactNode;
33
+ className?: string;
34
+ }): import("react").JSX.Element;
@@ -0,0 +1,2 @@
1
+ /** `/system/*`: foundations, guidelines and components of `.design/system`. */
2
+ export declare function SystemRoutes(): import("react").JSX.Element | null;
@@ -0,0 +1,4 @@
1
+ import type { SystemDoc } from '../../../../src/shared/types';
2
+ export declare function TypographyPage({ system }: {
3
+ system: SystemDoc;
4
+ }): import("react").JSX.Element;
@@ -0,0 +1,14 @@
1
+ /** Up to two letters: the first of the first and last words. */
2
+ export declare function initials(name: string): string;
3
+ /**
4
+ * A person's picture, or their initials when there is none or it fails to
5
+ * load. The picture is fetched without a referrer: it usually sits on a
6
+ * third-party host.
7
+ */
8
+ export declare function Avatar({ src, name, size, shape, className, }: {
9
+ src?: string | null;
10
+ name: string;
11
+ size?: number;
12
+ shape?: 'circle' | 'square';
13
+ className?: string;
14
+ }): import("react").JSX.Element;
@@ -0,0 +1,11 @@
1
+ import type { ReactNode } from 'react';
2
+ export type Tone = 'neutral' | 'action' | 'ok' | 'danger';
3
+ export declare function Badge({ tone, children, className, }: {
4
+ tone?: Tone;
5
+ children: ReactNode;
6
+ className?: string;
7
+ }): import("react").JSX.Element;
8
+ export declare function Count({ value, tone }: {
9
+ value: number;
10
+ tone?: 'neutral' | 'action' | 'danger';
11
+ }): import("react").JSX.Element;
@@ -0,0 +1,37 @@
1
+ import { type AnchorHTMLAttributes, type ButtonHTMLAttributes, type ReactNode } from 'react';
2
+ import { type IconName } from './icon';
3
+ export type ButtonKind = 'primary' | 'secondary' | 'ghost' | 'dashed' | 'danger';
4
+ export declare const buttonClass: (kind?: ButtonKind, extra?: string) => string;
5
+ export interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
6
+ kind?: ButtonKind;
7
+ icon?: IconName;
8
+ loading?: boolean;
9
+ children?: ReactNode;
10
+ }
11
+ export declare const Button: import("react").ForwardRefExoticComponent<ButtonProps & import("react").RefAttributes<HTMLButtonElement>>;
12
+ declare const ICON_KIND: {
13
+ ghost: string;
14
+ secondary: string;
15
+ };
16
+ export interface IconButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
17
+ icon: IconName;
18
+ label: string;
19
+ kind?: keyof typeof ICON_KIND;
20
+ size?: number;
21
+ }
22
+ export declare const iconButtonClass: (kind?: keyof typeof ICON_KIND, extra?: string) => string;
23
+ export declare const IconButton: import("react").ForwardRefExoticComponent<IconButtonProps & import("react").RefAttributes<HTMLButtonElement>>;
24
+ /** An in-app link styled as a button. */
25
+ export declare function ButtonLink({ to, kind, icon, className, children, }: {
26
+ to: string;
27
+ kind?: ButtonKind;
28
+ icon?: IconName;
29
+ className?: string;
30
+ children?: ReactNode;
31
+ }): import("react").JSX.Element;
32
+ /** A link out of the app (a frame in a new tab), styled as a button. */
33
+ export declare function ButtonAnchor({ kind, icon, className, children, ...rest }: {
34
+ kind?: ButtonKind;
35
+ icon?: IconName;
36
+ } & AnchorHTMLAttributes<HTMLAnchorElement>): import("react").JSX.Element;
37
+ export {};
@@ -0,0 +1,19 @@
1
+ import { type ReactNode } from 'react';
2
+ export declare function Switch({ checked, onChange, label, disabled, }: {
3
+ checked: boolean;
4
+ onChange?: (value: boolean) => void;
5
+ label: string;
6
+ disabled?: boolean;
7
+ }): import("react").JSX.Element;
8
+ export declare function Segmented<T extends string>({ items, value, onChange, label, stretch, size, }: {
9
+ items: {
10
+ value: T;
11
+ label: ReactNode;
12
+ title?: string;
13
+ }[];
14
+ value: T;
15
+ onChange: (value: T) => void;
16
+ label: string;
17
+ stretch?: boolean;
18
+ size?: 'ctrl' | 'sm';
19
+ }): import("react").JSX.Element;
@@ -0,0 +1,18 @@
1
+ import type { ReactNode } from 'react';
2
+ /**
3
+ * A modal over a dimmed page: focus stays inside until it closes, Escape and a
4
+ * click outside close it. Head and foot are a panel's; `actions` go to the foot.
5
+ */
6
+ export declare function Dialog({ open, onOpenChange, title, description, children, actions, footNote, width, }: {
7
+ open: boolean;
8
+ onOpenChange: (open: boolean) => void;
9
+ title: ReactNode;
10
+ /** Under the title, and what screen readers announce with it. */
11
+ description?: ReactNode;
12
+ children?: ReactNode;
13
+ /** Buttons at the end of the foot. */
14
+ actions?: ReactNode;
15
+ /** Muted text at the start of the foot. */
16
+ footNote?: ReactNode;
17
+ width?: number;
18
+ }): import("react").JSX.Element;