mirror of
https://github.com/Manavarya09/design-extract.git
synced 2026-09-19 02:41:14 +08:00
25db0fa7cb
- form-states.js surfaces:
- forms (input count + style families)
- modal/dialog/sheet containers
- skeleton + spinner loading indicators
- empty-state + error-state placeholders
- toast library detection (Sonner, react-hot-toast, react-toastify,
Radix Toast, Chakra Toast, Notistack)
- New output: *-form-states.json
- Closes the v10.x minor-release series started in v10.1 — all v11
deferred items now shipped as minors.
- 317/317 tests passing.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
74 lines
2.2 KiB
JavaScript
74 lines
2.2 KiB
JavaScript
import { describe, it } from 'node:test';
|
|
import assert from 'node:assert';
|
|
|
|
import { extractFormStates } from '../src/extractors/form-states.js';
|
|
|
|
describe('v10.5: form states', () => {
|
|
it('detects skeleton-loading + spinner + empty-state + error-state from class samples', () => {
|
|
const rawData = {
|
|
light: {
|
|
sections: [],
|
|
stack: {
|
|
classNameSample: [
|
|
'card animate-pulse',
|
|
'spinner text-blue-500',
|
|
'empty-state container',
|
|
'form-error text-red-500',
|
|
],
|
|
},
|
|
componentCandidates: [],
|
|
},
|
|
};
|
|
const r = extractFormStates(rawData);
|
|
assert.ok(r.flags.includes('skeleton-loading'));
|
|
assert.ok(r.flags.includes('spinner-loading'));
|
|
assert.ok(r.flags.includes('empty-state'));
|
|
assert.ok(r.flags.includes('error-state'));
|
|
});
|
|
|
|
it('detects modal containers from section class names', () => {
|
|
const rawData = {
|
|
light: {
|
|
sections: [{ tag: 'div', className: 'modal dialog-overlay', role: 'dialog' }],
|
|
stack: { classNameSample: [] },
|
|
componentCandidates: [],
|
|
},
|
|
};
|
|
const r = extractFormStates(rawData);
|
|
assert.equal(r.modals.length, 1);
|
|
assert.ok(r.flags.includes('modal'));
|
|
});
|
|
|
|
it('detects sonner toast library', () => {
|
|
const rawData = {
|
|
light: {
|
|
sections: [],
|
|
stack: {
|
|
classNameSample: ['sonner-toast group'],
|
|
scripts: [],
|
|
},
|
|
componentCandidates: [],
|
|
},
|
|
};
|
|
const r = extractFormStates(rawData);
|
|
assert.ok(r.toastLibraries.includes('sonner'));
|
|
});
|
|
|
|
it('summarises form input candidates', () => {
|
|
const rawData = {
|
|
light: {
|
|
sections: [],
|
|
stack: { classNameSample: [] },
|
|
componentCandidates: [
|
|
{ kind: 'input', css: { borderRadius: '6px', padding: '8px 12px', border: '1px solid #ddd' } },
|
|
{ kind: 'input', css: { borderRadius: '6px', padding: '8px 12px', border: '1px solid #ddd' } },
|
|
{ kind: 'input', css: { borderRadius: '0px', padding: '12px', border: '2px solid #000' } },
|
|
],
|
|
},
|
|
};
|
|
const r = extractFormStates(rawData);
|
|
assert.equal(r.forms.count, 3);
|
|
assert.ok(r.flags.includes('forms'));
|
|
});
|
|
});
|