skillui 1.1.2 → 1.1.4

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 (62) hide show
  1. package/README.md +20 -15
  2. package/dist/cli.js +105073 -194
  3. package/package.json +15 -6
  4. package/dist/cli.d.ts +0 -3
  5. package/dist/extractors/components.d.ts +0 -11
  6. package/dist/extractors/components.js +0 -455
  7. package/dist/extractors/framework.d.ts +0 -4
  8. package/dist/extractors/framework.js +0 -126
  9. package/dist/extractors/tokens/computed.d.ts +0 -7
  10. package/dist/extractors/tokens/computed.js +0 -249
  11. package/dist/extractors/tokens/css.d.ts +0 -3
  12. package/dist/extractors/tokens/css.js +0 -510
  13. package/dist/extractors/tokens/http-css.d.ts +0 -14
  14. package/dist/extractors/tokens/http-css.js +0 -1689
  15. package/dist/extractors/tokens/tailwind.d.ts +0 -3
  16. package/dist/extractors/tokens/tailwind.js +0 -353
  17. package/dist/extractors/tokens/tokens-file.d.ts +0 -3
  18. package/dist/extractors/tokens/tokens-file.js +0 -229
  19. package/dist/extractors/ultra/animations.d.ts +0 -21
  20. package/dist/extractors/ultra/animations.js +0 -527
  21. package/dist/extractors/ultra/components-dom.d.ts +0 -13
  22. package/dist/extractors/ultra/components-dom.js +0 -149
  23. package/dist/extractors/ultra/interactions.d.ts +0 -14
  24. package/dist/extractors/ultra/interactions.js +0 -222
  25. package/dist/extractors/ultra/layout.d.ts +0 -14
  26. package/dist/extractors/ultra/layout.js +0 -123
  27. package/dist/extractors/ultra/pages.d.ts +0 -16
  28. package/dist/extractors/ultra/pages.js +0 -228
  29. package/dist/font-resolver.d.ts +0 -10
  30. package/dist/font-resolver.js +0 -280
  31. package/dist/modes/dir.d.ts +0 -6
  32. package/dist/modes/dir.js +0 -213
  33. package/dist/modes/repo.d.ts +0 -6
  34. package/dist/modes/repo.js +0 -76
  35. package/dist/modes/ultra.d.ts +0 -22
  36. package/dist/modes/ultra.js +0 -281
  37. package/dist/modes/url.d.ts +0 -14
  38. package/dist/modes/url.js +0 -161
  39. package/dist/normalizer.d.ts +0 -11
  40. package/dist/normalizer.js +0 -867
  41. package/dist/playwright-loader.d.ts +0 -10
  42. package/dist/playwright-loader.js +0 -71
  43. package/dist/screenshot.d.ts +0 -9
  44. package/dist/screenshot.js +0 -94
  45. package/dist/types-ultra.d.ts +0 -157
  46. package/dist/types-ultra.js +0 -4
  47. package/dist/types.d.ts +0 -182
  48. package/dist/types.js +0 -4
  49. package/dist/writers/animations-md.d.ts +0 -17
  50. package/dist/writers/animations-md.js +0 -313
  51. package/dist/writers/components-md.d.ts +0 -8
  52. package/dist/writers/components-md.js +0 -151
  53. package/dist/writers/design-md.d.ts +0 -7
  54. package/dist/writers/design-md.js +0 -704
  55. package/dist/writers/interactions-md.d.ts +0 -8
  56. package/dist/writers/interactions-md.js +0 -146
  57. package/dist/writers/layout-md.d.ts +0 -8
  58. package/dist/writers/layout-md.js +0 -120
  59. package/dist/writers/skill.d.ts +0 -12
  60. package/dist/writers/skill.js +0 -1006
  61. package/dist/writers/tokens-json.d.ts +0 -11
  62. package/dist/writers/tokens-json.js +0 -164
@@ -1,10 +0,0 @@
1
- /**
2
- * Loads playwright from any location it might be installed:
3
- * 1. Bundled with the CLI (peer dep)
4
- * 2. In the user's cwd node_modules (local project install)
5
- * 3. In the global npm prefix (npm install -g playwright)
6
- *
7
- * Returns the playwright module or null if not found anywhere.
8
- */
9
- export declare function loadPlaywright(): any | null;
10
- //# sourceMappingURL=playwright-loader.d.ts.map
@@ -1,71 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
- Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.loadPlaywright = loadPlaywright;
37
- const path = __importStar(require("path"));
38
- const child_process_1 = require("child_process");
39
- /**
40
- * Loads playwright from any location it might be installed:
41
- * 1. Bundled with the CLI (peer dep)
42
- * 2. In the user's cwd node_modules (local project install)
43
- * 3. In the global npm prefix (npm install -g playwright)
44
- *
45
- * Returns the playwright module or null if not found anywhere.
46
- */
47
- function loadPlaywright() {
48
- // 1. Try standard require (works when playwright is in same node_modules tree)
49
- try {
50
- return require('playwright');
51
- }
52
- catch { /* fall through */ }
53
- // 2. Try from cwd (user ran: npm install playwright in their project)
54
- try {
55
- const cwdPath = path.join(process.cwd(), 'node_modules', 'playwright');
56
- return require(cwdPath);
57
- }
58
- catch { /* fall through */ }
59
- // 3. Try from global npm prefix (npm install -g playwright)
60
- try {
61
- const globalRoot = (0, child_process_1.execSync)('npm root -g', {
62
- encoding: 'utf-8',
63
- stdio: ['ignore', 'pipe', 'ignore'],
64
- timeout: 5000,
65
- }).trim();
66
- return require(path.join(globalRoot, 'playwright'));
67
- }
68
- catch { /* fall through */ }
69
- return null;
70
- }
71
- //# sourceMappingURL=playwright-loader.js.map
@@ -1,9 +0,0 @@
1
- /**
2
- * Capture a screenshot of a website using the microlink.io free API.
3
- * No API key required for basic usage.
4
- *
5
- * Saves screenshot to skillDir/screenshots/homepage.png
6
- * Returns the local relative path, or null if capture fails.
7
- */
8
- export declare function captureScreenshot(url: string, skillDir: string): Promise<string | null>;
9
- //# sourceMappingURL=screenshot.d.ts.map
@@ -1,94 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
- Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.captureScreenshot = captureScreenshot;
37
- const fs = __importStar(require("fs"));
38
- const path = __importStar(require("path"));
39
- /**
40
- * Capture a screenshot of a website using the microlink.io free API.
41
- * No API key required for basic usage.
42
- *
43
- * Saves screenshot to skillDir/screenshots/homepage.png
44
- * Returns the local relative path, or null if capture fails.
45
- */
46
- async function captureScreenshot(url, skillDir) {
47
- try {
48
- const screenshotsDir = path.join(skillDir, 'screenshots');
49
- fs.mkdirSync(screenshotsDir, { recursive: true });
50
- // microlink.io with embed=screenshot.url returns the image bytes directly
51
- const apiUrl = `https://api.microlink.io?url=${encodeURIComponent(url)}&screenshot=true&meta=false&embed=screenshot.url&waitFor=2000`;
52
- const res = await fetch(apiUrl, {
53
- headers: { 'User-Agent': 'skillui/1.0' },
54
- signal: AbortSignal.timeout(25000),
55
- });
56
- if (!res.ok)
57
- return null;
58
- const contentType = res.headers.get('content-type') || '';
59
- // The embed=screenshot.url mode returns image bytes directly
60
- if (contentType.startsWith('image/')) {
61
- const buffer = Buffer.from(await res.arrayBuffer());
62
- if (buffer.length < 1000)
63
- return null;
64
- const ext = contentType.includes('png') ? 'png' : 'jpg';
65
- const destPath = path.join(screenshotsDir, `homepage.${ext}`);
66
- fs.writeFileSync(destPath, buffer);
67
- return `screenshots/homepage.${ext}`;
68
- }
69
- // Fallback: try JSON response (without embed param behaviour)
70
- const text = await res.text();
71
- try {
72
- const json = JSON.parse(text);
73
- const screenshotUrl = json?.data?.screenshot?.url;
74
- if (!screenshotUrl)
75
- return null;
76
- const imgRes = await fetch(screenshotUrl, { signal: AbortSignal.timeout(20000) });
77
- if (!imgRes.ok)
78
- return null;
79
- const buffer = Buffer.from(await imgRes.arrayBuffer());
80
- if (buffer.length < 1000)
81
- return null;
82
- const destPath = path.join(screenshotsDir, 'homepage.jpg');
83
- fs.writeFileSync(destPath, buffer);
84
- return 'screenshots/homepage.jpg';
85
- }
86
- catch {
87
- return null;
88
- }
89
- }
90
- catch {
91
- return null;
92
- }
93
- }
94
- //# sourceMappingURL=screenshot.js.map
@@ -1,157 +0,0 @@
1
- export interface UltraOptions {
2
- /** Max pages to crawl (default: 5) */
3
- screens: number;
4
- }
5
- export interface PageScreenshot {
6
- url: string;
7
- slug: string;
8
- /** Relative path inside skillDir: screens/pages/[slug].png */
9
- filePath: string;
10
- title: string;
11
- }
12
- export interface SectionScreenshot {
13
- page: string;
14
- index: number;
15
- /** Relative path inside skillDir: screens/sections/[page]-section-[index].png */
16
- filePath: string;
17
- selector: string;
18
- height: number;
19
- width: number;
20
- }
21
- export interface StyleSnapshot {
22
- backgroundColor: string;
23
- color: string;
24
- borderColor: string;
25
- borderWidth: string;
26
- boxShadow: string;
27
- opacity: string;
28
- transform: string;
29
- outline: string;
30
- outlineColor: string;
31
- textDecoration: string;
32
- transition: string;
33
- }
34
- export interface StyleDiff {
35
- property: string;
36
- from: string;
37
- to: string;
38
- }
39
- export interface InteractionRecord {
40
- componentType: 'button' | 'link' | 'input' | 'role-button';
41
- label: string;
42
- selector: string;
43
- index: number;
44
- screenshots: {
45
- default?: string;
46
- hover?: string;
47
- focus?: string;
48
- };
49
- hoverChanges: StyleDiff[];
50
- focusChanges: StyleDiff[];
51
- transitionValue: string;
52
- }
53
- export interface LayoutRecord {
54
- tag: string;
55
- selector: string;
56
- display: string;
57
- flexDirection: string;
58
- flexWrap: string;
59
- justifyContent: string;
60
- alignItems: string;
61
- gap: string;
62
- rowGap: string;
63
- columnGap: string;
64
- padding: string;
65
- margin: string;
66
- gridTemplateColumns: string;
67
- gridTemplateRows: string;
68
- maxWidth: string;
69
- width: string;
70
- height: string;
71
- position: string;
72
- childCount: number;
73
- depth: number;
74
- }
75
- export interface DOMComponent {
76
- name: string;
77
- pattern: string;
78
- instances: number;
79
- commonClasses: string[];
80
- htmlSnippet: string;
81
- category: 'card' | 'list-item' | 'nav-item' | 'form-field' | 'button' | 'badge' | 'unknown';
82
- }
83
- export interface KeyframeStop {
84
- stop: string;
85
- properties: Record<string, string>;
86
- }
87
- export interface ExtractedKeyframe {
88
- name: string;
89
- stops: KeyframeStop[];
90
- usedBy: string[];
91
- animDuration?: string;
92
- animEasing?: string;
93
- animDelay?: string;
94
- animIteration?: string;
95
- animFillMode?: string;
96
- animDirection?: string;
97
- }
98
- export interface ScrollFrame {
99
- scrollPercent: number;
100
- scrollY: number;
101
- pageHeight: number;
102
- filePath: string;
103
- }
104
- export interface DetectedLibrary {
105
- name: string;
106
- version?: string;
107
- type: 'animation' | 'scroll' | 'physics' | '3d' | 'lottie' | 'other';
108
- cdn?: string;
109
- }
110
- export interface VideoInfo {
111
- index: number;
112
- src: string;
113
- poster?: string;
114
- autoplay: boolean;
115
- loop: boolean;
116
- muted: boolean;
117
- width?: number;
118
- height?: number;
119
- role: 'background' | 'content' | 'unknown';
120
- firstFramePath?: string;
121
- }
122
- export interface ScrollAnimationPattern {
123
- selector: string;
124
- library: string;
125
- attribute?: string;
126
- animationType: string;
127
- duration?: string;
128
- delay?: string;
129
- easing?: string;
130
- count: number;
131
- }
132
- export interface CSSAnimationVar {
133
- name: string;
134
- value: string;
135
- category: 'duration' | 'easing' | 'delay' | 'animation' | 'other';
136
- }
137
- export interface FullAnimationResult {
138
- keyframes: ExtractedKeyframe[];
139
- scrollFrames: ScrollFrame[];
140
- libraries: DetectedLibrary[];
141
- videos: VideoInfo[];
142
- scrollPatterns: ScrollAnimationPattern[];
143
- animationVars: CSSAnimationVar[];
144
- globalTransitions: string[];
145
- canvasCount: number;
146
- webglDetected: boolean;
147
- lottieCount: number;
148
- }
149
- export interface UltraResult {
150
- pageScreenshots: PageScreenshot[];
151
- sectionScreenshots: SectionScreenshot[];
152
- interactions: InteractionRecord[];
153
- layouts: LayoutRecord[];
154
- domComponents: DOMComponent[];
155
- animations: FullAnimationResult;
156
- }
157
- //# sourceMappingURL=types-ultra.d.ts.map
@@ -1,4 +0,0 @@
1
- "use strict";
2
- // ── Ultra Mode Types ─────────────────────────────────────────────────
3
- Object.defineProperty(exports, "__esModule", { value: true });
4
- //# sourceMappingURL=types-ultra.js.map
package/dist/types.d.ts DELETED
@@ -1,182 +0,0 @@
1
- export interface DesignProfile {
2
- projectName: string;
3
- siteUrl?: string;
4
- favicon?: string | null;
5
- frameworks: Framework[];
6
- colors: ColorToken[];
7
- typography: TypographyToken[];
8
- spacing: SpacingScale;
9
- shadows: ShadowToken[];
10
- components: ComponentInfo[];
11
- breakpoints: Breakpoint[];
12
- cssVariables: CSSVariable[];
13
- borderRadius: string[];
14
- fontVarMap: Record<string, string>;
15
- antiPatterns: string[];
16
- designTraits: DesignTraits;
17
- animations: AnimationToken[];
18
- darkModeVars: DarkModeVar[];
19
- iconLibrary: string | null;
20
- stateLibrary: string | null;
21
- componentCategories: Record<ComponentCategory, string[]>;
22
- zIndexScale: number[];
23
- containerMaxWidth: string | null;
24
- fontSources: FontSource[];
25
- pageSections: PageSection[];
26
- motionTokens: MotionTokens;
27
- }
28
- export interface DesignTraits {
29
- isDark: boolean;
30
- hasShadows: boolean;
31
- hasGradients: boolean;
32
- hasRoundedFull: boolean;
33
- maxBorderRadius: number;
34
- primaryColorTemp: 'warm' | 'cool' | 'neutral';
35
- fontStyle: 'serif' | 'sans-serif' | 'monospace';
36
- density: 'compact' | 'standard' | 'spacious';
37
- hasAnimations: boolean;
38
- hasDarkMode: boolean;
39
- motionStyle: 'none' | 'subtle' | 'expressive';
40
- }
41
- export type ComponentCategory = 'layout' | 'navigation' | 'data-display' | 'data-input' | 'feedback' | 'overlay' | 'typography' | 'media' | 'other';
42
- export interface AnimationToken {
43
- name: string;
44
- type: 'css-keyframe' | 'css-transition' | 'framer-motion' | 'spring';
45
- value: string;
46
- source: string;
47
- }
48
- export interface DarkModeVar {
49
- variable: string;
50
- lightValue: string;
51
- darkValue: string;
52
- }
53
- export type FrameworkId = 'tailwind' | 'react' | 'vue' | 'next' | 'nuxt' | 'svelte' | 'angular' | 'css-in-js' | 'css-modules';
54
- export interface Framework {
55
- id: FrameworkId;
56
- name: string;
57
- version?: string;
58
- }
59
- export type ColorRole = 'background' | 'surface' | 'text-primary' | 'text-muted' | 'accent' | 'border' | 'danger' | 'success' | 'warning' | 'info' | 'unknown';
60
- export interface ColorToken {
61
- hex: string;
62
- name?: string;
63
- role: ColorRole;
64
- frequency: number;
65
- source: 'tailwind' | 'css' | 'tokens-file' | 'component' | 'computed';
66
- }
67
- export type TypographyRole = 'heading-1' | 'heading-2' | 'heading-3' | 'heading-4' | 'body' | 'caption' | 'code' | 'unknown';
68
- export interface TypographyToken {
69
- role: TypographyRole;
70
- fontFamily: string;
71
- fontSize?: string;
72
- fontWeight?: string | number;
73
- lineHeight?: string;
74
- source: 'tailwind' | 'css' | 'tokens-file' | 'component' | 'computed';
75
- }
76
- export interface SpacingScale {
77
- base: number;
78
- values: number[];
79
- unit: 'px' | 'rem';
80
- }
81
- export type ShadowLevel = 'flat' | 'raised' | 'floating' | 'overlay';
82
- export interface ShadowToken {
83
- value: string;
84
- level: ShadowLevel;
85
- name?: string;
86
- }
87
- export interface ComponentInfo {
88
- name: string;
89
- filePath: string;
90
- variants: string[];
91
- cssClasses: string[];
92
- jsxSnippet: string;
93
- props: string[];
94
- category: ComponentCategory;
95
- hasAnimation: boolean;
96
- animationDetails: string[];
97
- statePatterns: string[];
98
- tailwindPatterns: TailwindPattern;
99
- }
100
- export interface TailwindPattern {
101
- backgrounds: string[];
102
- borders: string[];
103
- spacing: string[];
104
- typography: string[];
105
- effects: string[];
106
- layout: string[];
107
- interactive: string[];
108
- }
109
- export interface Breakpoint {
110
- name: string;
111
- value: string;
112
- source: 'tailwind' | 'css';
113
- }
114
- export interface CSSVariable {
115
- name: string;
116
- value: string;
117
- property?: string;
118
- }
119
- export interface RawTokens {
120
- colors: Array<{
121
- value: string;
122
- frequency: number;
123
- source: ColorToken['source'];
124
- name?: string;
125
- }>;
126
- fonts: Array<{
127
- family: string;
128
- size?: string;
129
- weight?: string | number;
130
- source: TypographyToken['source'];
131
- }>;
132
- spacingValues: number[];
133
- shadows: Array<{
134
- value: string;
135
- name?: string;
136
- }>;
137
- cssVariables: CSSVariable[];
138
- breakpoints: Breakpoint[];
139
- borderRadii: string[];
140
- gradients: string[];
141
- fontVarMap: Record<string, string>;
142
- animations: AnimationToken[];
143
- darkModeVars: DarkModeVar[];
144
- zIndexValues: number[];
145
- containerMaxWidth: string | null;
146
- fontSources: FontSource[];
147
- pageSections: PageSection[];
148
- transitionDurations: string[];
149
- transitionEasings: string[];
150
- favicon?: string | null;
151
- siteTitle?: string | null;
152
- }
153
- export interface FontSource {
154
- family: string;
155
- src: string;
156
- format?: string;
157
- weight?: string;
158
- }
159
- export interface PageSection {
160
- type: 'navigation' | 'hero' | 'features' | 'content' | 'cards' | 'faq' | 'footer' | 'cta' | 'stats' | 'testimonials';
161
- tag: string;
162
- classes: string[];
163
- childCount: number;
164
- description: string;
165
- }
166
- export interface MotionTokens {
167
- durations: string[];
168
- easings: string[];
169
- properties: string[];
170
- }
171
- export interface CLIOptions {
172
- dir?: string;
173
- repo?: string;
174
- url?: string;
175
- out: string;
176
- name?: string;
177
- skill: boolean;
178
- format: 'design-md' | 'skill' | 'both';
179
- mode: 'default' | 'ultra';
180
- screens: string;
181
- }
182
- //# sourceMappingURL=types.d.ts.map
package/dist/types.js DELETED
@@ -1,4 +0,0 @@
1
- "use strict";
2
- // ── Core Design Profile ──────────────────────────────────────────────
3
- Object.defineProperty(exports, "__esModule", { value: true });
4
- //# sourceMappingURL=types.js.map
@@ -1,17 +0,0 @@
1
- import { FullAnimationResult } from '../types-ultra';
2
- import { DesignProfile } from '../types';
3
- /**
4
- * Generate references/ANIMATIONS.md
5
- *
6
- * Cinematic-quality animation documentation:
7
- * - Technology stack (GSAP, Lottie, Three.js, etc.)
8
- * - Scroll journey (7 screenshots from top to bottom)
9
- * - Every CSS @keyframe with full code + usage context
10
- * - Scroll-triggered animation patterns
11
- * - Video background specifications
12
- * - Canvas / WebGL indicators
13
- * - CSS animation variables / tokens
14
- * - Implementation guide (how to recreate the motion design)
15
- */
16
- export declare function generateAnimationsMd(anim: FullAnimationResult, profile: DesignProfile): string;
17
- //# sourceMappingURL=animations-md.d.ts.map