@autumnsgrove/gossamer 0.0.1 → 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.
Files changed (50) hide show
  1. package/dist/animation.d.ts +80 -0
  2. package/dist/animation.d.ts.map +1 -0
  3. package/dist/characters.d.ts +49 -0
  4. package/dist/characters.d.ts.map +1 -0
  5. package/dist/index.d.ts +37 -11
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +1284 -2
  8. package/dist/index.js.map +1 -1
  9. package/dist/patterns.d.ts +100 -0
  10. package/dist/patterns.d.ts.map +1 -0
  11. package/dist/renderer.d.ts +113 -0
  12. package/dist/renderer.d.ts.map +1 -0
  13. package/dist/style.css +124 -0
  14. package/dist/svelte/GossamerBorder.svelte.d.ts +1 -0
  15. package/dist/svelte/GossamerClouds.svelte.d.ts +1 -0
  16. package/dist/svelte/GossamerImage.svelte.d.ts +1 -0
  17. package/dist/svelte/GossamerOverlay.svelte.d.ts +1 -0
  18. package/dist/svelte/GossamerText.svelte.d.ts +1 -0
  19. package/dist/svelte/index.d.ts +20 -0
  20. package/dist/svelte/index.d.ts.map +1 -0
  21. package/dist/svelte/index.js +3651 -0
  22. package/dist/svelte/index.js.map +1 -0
  23. package/dist/svelte/presets.d.ts +38 -0
  24. package/dist/svelte/presets.d.ts.map +1 -0
  25. package/dist/utils/canvas.d.ts +73 -0
  26. package/dist/utils/canvas.d.ts.map +1 -0
  27. package/dist/utils/image.d.ts +74 -0
  28. package/dist/utils/image.d.ts.map +1 -0
  29. package/dist/utils/performance.d.ts +86 -0
  30. package/dist/utils/performance.d.ts.map +1 -0
  31. package/package.json +23 -5
  32. package/src/animation.test.ts +254 -0
  33. package/src/animation.ts +243 -0
  34. package/src/characters.test.ts +148 -0
  35. package/src/characters.ts +164 -0
  36. package/src/index.test.ts +115 -0
  37. package/src/index.ts +133 -11
  38. package/src/patterns.test.ts +273 -0
  39. package/src/patterns.ts +316 -0
  40. package/src/renderer.ts +309 -0
  41. package/src/svelte/GossamerBorder.svelte +326 -0
  42. package/src/svelte/GossamerClouds.svelte +269 -0
  43. package/src/svelte/GossamerImage.svelte +266 -0
  44. package/src/svelte/GossamerOverlay.svelte +232 -0
  45. package/src/svelte/GossamerText.svelte +239 -0
  46. package/src/svelte/index.ts +75 -0
  47. package/src/svelte/presets.ts +174 -0
  48. package/src/utils/canvas.ts +210 -0
  49. package/src/utils/image.ts +275 -0
  50. package/src/utils/performance.ts +282 -0
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Gossamer Animation Utilities
3
+ *
4
+ * FPS limiting, animation loop management, and timing utilities.
5
+ */
6
+ /**
7
+ * Animation state for tracking loop execution
8
+ */
9
+ export interface AnimationState {
10
+ /** Whether animation is currently running */
11
+ isRunning: boolean;
12
+ /** Current animation frame ID */
13
+ frameId: number | null;
14
+ /** Timestamp of last frame */
15
+ lastFrameTime: number;
16
+ /** Frame interval in ms (derived from FPS) */
17
+ frameInterval: number;
18
+ /** Total elapsed time in ms */
19
+ elapsedTime: number;
20
+ /** Current frame count */
21
+ frameCount: number;
22
+ }
23
+ /**
24
+ * Options for creating an animation loop
25
+ */
26
+ export interface AnimationOptions {
27
+ /** Target frames per second (default: 30) */
28
+ fps?: number;
29
+ /** Callback when animation starts */
30
+ onStart?: () => void;
31
+ /** Callback when animation stops */
32
+ onStop?: () => void;
33
+ /** Callback for each frame - return false to stop */
34
+ onFrame: (time: number, deltaTime: number, frameCount: number) => boolean | void;
35
+ }
36
+ /**
37
+ * Create a managed animation loop with FPS limiting
38
+ */
39
+ export declare function createAnimationLoop(options: AnimationOptions): {
40
+ start: () => void;
41
+ stop: () => void;
42
+ pause: () => void;
43
+ resume: () => void;
44
+ getState: () => AnimationState;
45
+ };
46
+ /**
47
+ * Simple throttle function for limiting function execution
48
+ */
49
+ export declare function throttle<T extends (...args: unknown[]) => unknown>(fn: T, limit: number): (...args: Parameters<T>) => void;
50
+ /**
51
+ * Debounce function for delaying execution until activity stops
52
+ */
53
+ export declare function debounce<T extends (...args: unknown[]) => unknown>(fn: T, delay: number): (...args: Parameters<T>) => void;
54
+ /**
55
+ * Calculate actual FPS from frame times
56
+ */
57
+ export declare function calculateFPS(frameTimes: number[], sampleSize?: number): number;
58
+ /**
59
+ * Easing functions for smooth animations
60
+ */
61
+ export declare const easings: {
62
+ /** Linear - no easing */
63
+ linear: (t: number) => number;
64
+ /** Ease in - slow start */
65
+ easeIn: (t: number) => number;
66
+ /** Ease out - slow end */
67
+ easeOut: (t: number) => number;
68
+ /** Ease in/out - slow start and end */
69
+ easeInOut: (t: number) => number;
70
+ /** Sine ease in */
71
+ sineIn: (t: number) => number;
72
+ /** Sine ease out */
73
+ sineOut: (t: number) => number;
74
+ /** Sine ease in/out */
75
+ sineInOut: (t: number) => number;
76
+ /** Bounce at end */
77
+ bounceOut: (t: number) => number;
78
+ };
79
+ export type EasingFunction = (t: number) => number;
80
+ //# sourceMappingURL=animation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"animation.d.ts","sourceRoot":"","sources":["../src/animation.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,6CAA6C;IAC7C,SAAS,EAAE,OAAO,CAAC;IACnB,iCAAiC;IACjC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,8BAA8B;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,8CAA8C;IAC9C,aAAa,EAAE,MAAM,CAAC;IACtB,+BAA+B;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,0BAA0B;IAC1B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,6CAA6C;IAC7C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,qCAAqC;IACrC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,oCAAoC;IACpC,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,qDAAqD;IACrD,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,OAAO,GAAG,IAAI,CAAC;CAClF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,gBAAgB,GAAG;IAC9D,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,QAAQ,EAAE,MAAM,cAAc,CAAC;CAChC,CAyFA;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,EAChE,EAAE,EAAE,CAAC,EACL,KAAK,EAAE,MAAM,GACZ,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,CAkBlC;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,EAChE,EAAE,EAAE,CAAC,EACL,KAAK,EAAE,MAAM,GACZ,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,CAalC;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,UAAU,GAAE,MAAW,GAAG,MAAM,CAUlF;AAED;;GAEG;AACH,eAAO,MAAM,OAAO;IAClB,yBAAyB;gBACb,MAAM,KAAG,MAAM;IAE3B,2BAA2B;gBACf,MAAM,KAAG,MAAM;IAE3B,0BAA0B;iBACb,MAAM,KAAG,MAAM;IAE5B,uCAAuC;mBACxB,MAAM,KAAG,MAAM;IAE9B,mBAAmB;gBACP,MAAM,KAAG,MAAM;IAE3B,oBAAoB;iBACP,MAAM,KAAG,MAAM;IAE5B,uBAAuB;mBACR,MAAM,KAAG,MAAM;IAE9B,oBAAoB;mBACL,MAAM,KAAG,MAAM;CAc/B,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Gossamer Character Sets
3
+ *
4
+ * Predefined character sets for ASCII rendering, ordered from light to dark.
5
+ * Character density determines which character represents each brightness level.
6
+ */
7
+ /**
8
+ * Character set configuration
9
+ */
10
+ export interface CharacterSet {
11
+ /** Unique identifier for the character set */
12
+ name: string;
13
+ /** Description of the set's aesthetic */
14
+ description: string;
15
+ /** Characters ordered from lightest (space) to darkest */
16
+ characters: string;
17
+ /** Recommended use cases */
18
+ bestFor: string[];
19
+ }
20
+ /**
21
+ * Standard character sets for ASCII rendering
22
+ */
23
+ export declare const CHARACTER_SETS: Record<string, CharacterSet>;
24
+ /**
25
+ * Get a character set by name
26
+ */
27
+ export declare function getCharacterSet(name: string): CharacterSet | undefined;
28
+ /**
29
+ * Get just the characters string from a named set
30
+ */
31
+ export declare function getCharacters(name: string): string;
32
+ /**
33
+ * List all available character set names
34
+ */
35
+ export declare function getCharacterSetNames(): string[];
36
+ /**
37
+ * Create a custom character set
38
+ */
39
+ export declare function createCharacterSet(name: string, characters: string, description?: string, bestFor?: string[]): CharacterSet;
40
+ /**
41
+ * Validate that a character string is suitable for ASCII rendering
42
+ * (should start with space and have at least 2 characters)
43
+ */
44
+ export declare function validateCharacterSet(characters: string): boolean;
45
+ /**
46
+ * Reverse a character set (for inverted brightness mapping)
47
+ */
48
+ export declare function invertCharacters(characters: string): string;
49
+ //# sourceMappingURL=characters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"characters.d.ts","sourceRoot":"","sources":["../src/characters.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,8CAA8C;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,yCAAyC;IACzC,WAAW,EAAE,MAAM,CAAC;IACpB,0DAA0D;IAC1D,UAAU,EAAE,MAAM,CAAC;IACnB,4BAA4B;IAC5B,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAoFvD,CAAC;AAEF;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAEtE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAElD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,EAAE,CAE/C;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,WAAW,GAAE,MAAW,EACxB,OAAO,GAAE,MAAM,EAAO,GACrB,YAAY,CAOd;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAIhE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAE3D"}
package/dist/index.d.ts CHANGED
@@ -26,6 +26,27 @@ export interface GossamerConfig {
26
26
  /** Target FPS for animation */
27
27
  fps?: number;
28
28
  }
29
+ /**
30
+ * Preset configuration for effects
31
+ */
32
+ export interface PresetConfig {
33
+ /** Preset display name */
34
+ name: string;
35
+ /** Preset description */
36
+ description: string;
37
+ /** Character set */
38
+ characters: string;
39
+ /** Pattern type */
40
+ pattern: 'perlin' | 'waves' | 'static' | 'ripple' | 'fbm';
41
+ /** Pattern frequency */
42
+ frequency: number;
43
+ /** Pattern amplitude */
44
+ amplitude: number;
45
+ /** Animation speed */
46
+ speed: number;
47
+ /** Default opacity */
48
+ opacity: number;
49
+ }
29
50
  /**
30
51
  * Default character set ordered from light to dark
31
52
  */
@@ -43,17 +64,22 @@ export declare function calculateBrightness(r: number, g: number, b: number): nu
43
64
  * Map a brightness value (0-255) to an ASCII character
44
65
  */
45
66
  export declare function brightnessToChar(brightness: number, characters?: string): string;
67
+ export { GossamerRenderer } from './renderer';
68
+ export type { RenderConfig } from './renderer';
69
+ export { perlinNoise2D, fbmNoise, wavePattern, ripplePattern, staticNoise, seededNoise2D, generateBrightnessGrid, gridToImageData, DEFAULT_PATTERN_CONFIG, } from './patterns';
70
+ export type { PatternConfig, PatternType } from './patterns';
71
+ export { CHARACTER_SETS, getCharacterSet, getCharacters, getCharacterSetNames, createCharacterSet, validateCharacterSet, invertCharacters, } from './characters';
72
+ export type { CharacterSet } from './characters';
73
+ export { createAnimationLoop, throttle, debounce, calculateFPS, easings, } from './animation';
74
+ export type { AnimationState, AnimationOptions, EasingFunction } from './animation';
75
+ export { createCanvas, getDevicePixelRatio, resizeCanvasToContainer, createOffscreenCanvas, clearCanvas, getImageData, optimizeContext, setupTextRendering, measureTextWidth, calculateCellSize, setBlendMode, } from './utils/canvas';
76
+ export type { CanvasOptions } from './utils/canvas';
77
+ export { loadImage, loadAndScaleImage, imageToPixelData, extractBrightness, sampleImageCells, rgbToHex, hexToRgb, adjustBrightness, adjustContrast, invertColors, toGrayscale, } from './utils/image';
78
+ export type { ImageLoadOptions } from './utils/image';
79
+ export { createVisibilityObserver, createResizeObserver, prefersReducedMotion, onReducedMotionChange, isLowPowerMode, getRecommendedFPS, createFPSCounter, requestIdleCallback, cancelIdleCallback, isBrowser, isCanvasSupported, isOffscreenCanvasSupported, } from './utils/performance';
80
+ export type { VisibilityCallback, PerformanceMetrics } from './utils/performance';
46
81
  /**
47
- * Gossamer v0.0.1 - Placeholder release
48
- *
49
- * Full implementation coming soon. This package will provide:
50
- * - 2D Canvas ASCII rendering
51
- * - Ambient pattern generation
52
- * - Image-to-ASCII conversion
53
- * - Animation loops
54
- * - Framework adapters (Svelte, React, Vue)
55
- *
56
- * @see https://github.com/AutumnsGrove/Gossamer
82
+ * Gossamer version
57
83
  */
58
- export declare const VERSION = "0.0.1";
84
+ export declare const VERSION = "0.1.0";
59
85
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,wDAAwD;IACxD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2BAA2B;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4BAA4B;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,uBAAuB;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gDAAgD;IAChD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,uCAAuC;IACvC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4BAA4B;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,+BAA+B;IAC/B,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,eAAO,MAAM,kBAAkB,eAAe,CAAC;AAE/C;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,QAAQ,CAAC,cAAc,CASnD,CAAC;AAEF;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAE3E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,MAAM,EAClB,UAAU,GAAE,MAA2B,GACtC,MAAM,CAGR;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,OAAO,UAAU,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}