vibe-design-system 2.8.24 → 2.8.25
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/package.json
CHANGED
|
@@ -742,6 +742,12 @@ function buildDefaultArgsForRequiredProps(props, usageFromPages = null, componen
|
|
|
742
742
|
continue;
|
|
743
743
|
}
|
|
744
744
|
if (!required) continue;
|
|
745
|
+
// Function/callback types must be caught before name-based type checks (e.g. "Task" in "(task: Task) => void")
|
|
746
|
+
if (isFunctionType(type)) {
|
|
747
|
+
argLines.push(` ${name}: () => {},`);
|
|
748
|
+
added.add(name);
|
|
749
|
+
continue;
|
|
750
|
+
}
|
|
745
751
|
if (/LucideIcon|lucide-react/.test(type)) {
|
|
746
752
|
const iconName = LUCIDE_ICON_DEFAULT;
|
|
747
753
|
lucideImports.add(iconName);
|
|
@@ -1071,6 +1077,52 @@ function buildRecipeStoryContent(comp, componentName, importPath, title, source,
|
|
|
1071
1077
|
return lines.join("\n");
|
|
1072
1078
|
}
|
|
1073
1079
|
|
|
1080
|
+
/**
|
|
1081
|
+
* Map a single extracted TypeScript prop to a Storybook argType entry string.
|
|
1082
|
+
* Returns something like: `{ control: "text", description: "string" }`
|
|
1083
|
+
*/
|
|
1084
|
+
function buildArgTypeEntry(prop) {
|
|
1085
|
+
const t = (prop.type || "").trim();
|
|
1086
|
+
const name = prop.name;
|
|
1087
|
+
|
|
1088
|
+
// Function / callback — disable control widget, show as action
|
|
1089
|
+
if (/=>\s*(void|any|never|Promise)/.test(t) || /^\([^)]*\)\s*=>/.test(t)) {
|
|
1090
|
+
const safe = t.replace(/"/g, '\\"').slice(0, 60);
|
|
1091
|
+
return `{ action: "${name}", control: false, description: "${safe}" }`;
|
|
1092
|
+
}
|
|
1093
|
+
// Boolean
|
|
1094
|
+
if (/^boolean/.test(t)) {
|
|
1095
|
+
return `{ control: "boolean", description: "boolean" }`;
|
|
1096
|
+
}
|
|
1097
|
+
// Number
|
|
1098
|
+
if (/^number/.test(t)) {
|
|
1099
|
+
return `{ control: "number", description: "number" }`;
|
|
1100
|
+
}
|
|
1101
|
+
// String union literals: "a" | "b" | "c" → select control
|
|
1102
|
+
if (/^"[^"]+"(\s*\|\s*"[^"]+")+/.test(t)) {
|
|
1103
|
+
const opts = (t.match(/"([^"]+)"/g) || []).map(s => s.replace(/"/g, ""));
|
|
1104
|
+
return `{ control: "select", options: ${JSON.stringify(opts)}, description: ${JSON.stringify(t)} }`;
|
|
1105
|
+
}
|
|
1106
|
+
// Plain string (including union with null/undefined)
|
|
1107
|
+
if (/^string/.test(t) || t === "string | null" || t === "string | undefined" || t === "string | null | undefined") {
|
|
1108
|
+
return `{ control: "text", description: "string" }`;
|
|
1109
|
+
}
|
|
1110
|
+
// ReactNode
|
|
1111
|
+
if (/ReactNode/.test(t)) {
|
|
1112
|
+
return `{ control: "text", description: "ReactNode" }`;
|
|
1113
|
+
}
|
|
1114
|
+
// Arrays → object control
|
|
1115
|
+
if (t.endsWith("[]") || /^Array</.test(t)) {
|
|
1116
|
+
return `{ control: "object", description: ${JSON.stringify(t.slice(0, 60))} }`;
|
|
1117
|
+
}
|
|
1118
|
+
// Inline object / any
|
|
1119
|
+
if (t === "any" || t.startsWith("{")) {
|
|
1120
|
+
return `{ control: "object", description: ${JSON.stringify(t.slice(0, 60))} }`;
|
|
1121
|
+
}
|
|
1122
|
+
// Imported / custom named types (Circle, Task, etc.) — object control so user can inspect
|
|
1123
|
+
return `{ control: "object", description: ${JSON.stringify(t.slice(0, 60))} }`;
|
|
1124
|
+
}
|
|
1125
|
+
|
|
1074
1126
|
function buildStoryFileContent(comp) {
|
|
1075
1127
|
const componentName = toSafeComponentName(comp.name, comp.file);
|
|
1076
1128
|
const fileNoExt = comp.file.replace(/\.(tsx|jsx)$/, "");
|
|
@@ -1173,13 +1225,27 @@ function buildStoryFileContent(comp) {
|
|
|
1173
1225
|
lines.push(` title: ${JSON.stringify(title)},`);
|
|
1174
1226
|
lines.push(` component: ComponentRef,`);
|
|
1175
1227
|
lines.push(` tags: ["autodocs"],`);
|
|
1228
|
+
|
|
1229
|
+
// Build argTypes from extracted TypeScript props + icon-specific overrides
|
|
1230
|
+
const argTypeEntries = [];
|
|
1231
|
+
for (const p of effectiveProps) {
|
|
1232
|
+
if (!p || !p.name) continue;
|
|
1233
|
+
if (p.name === "children") continue; // Storybook infers children from JSX
|
|
1234
|
+
if (iconPropNames && iconPropNames.includes(p.name)) continue; // handled below
|
|
1235
|
+
const entry = buildArgTypeEntry(p);
|
|
1236
|
+
argTypeEntries.push(` ${p.name}: ${entry},`);
|
|
1237
|
+
}
|
|
1176
1238
|
if (iconPropNames && iconPropNames.length > 0) {
|
|
1177
|
-
lines.push(` argTypes: {`);
|
|
1178
1239
|
for (const name of iconPropNames) {
|
|
1179
|
-
|
|
1240
|
+
argTypeEntries.push(` ${name}: { control: false },`);
|
|
1180
1241
|
}
|
|
1242
|
+
}
|
|
1243
|
+
if (argTypeEntries.length > 0) {
|
|
1244
|
+
lines.push(` argTypes: {`);
|
|
1245
|
+
for (const entry of argTypeEntries) lines.push(entry);
|
|
1181
1246
|
lines.push(` },`);
|
|
1182
1247
|
}
|
|
1248
|
+
|
|
1183
1249
|
lines.push(`} satisfies Meta<typeof ComponentRef>;`);
|
|
1184
1250
|
lines.push("");
|
|
1185
1251
|
lines.push(`export default meta;`);
|