Files
gh-trabian-fluxwing-skills/skills/fluxwing-component-creator/schemas/uxm-component.schema.json
2025-11-30 09:02:33 +08:00

386 lines
11 KiB
JSON

{
"$schema": "http://json-schema.org/draft-07/schema#",
"$id": "https://uxscii.org/schemas/uxm-component.json",
"title": "UXM Component Schema",
"description": "JSON schema for .uxm component metadata files",
"type": "object",
"properties": {
"id": {
"type": "string",
"pattern": "^[a-z0-9][a-z0-9-]*[a-z0-9]$",
"minLength": 2,
"maxLength": 64,
"description": "Unique identifier for the component using kebab-case"
},
"type": {
"type": "string",
"enum": [
"button",
"input",
"checkbox",
"card",
"navigation",
"form",
"list",
"modal",
"table",
"badge",
"icon",
"alert",
"container",
"text",
"image",
"divider",
"custom"
],
"description": "Component type from the standard library or 'custom'"
},
"version": {
"type": "string",
"pattern": "^\\d+\\.\\d+\\.\\d+(?:-[a-zA-Z0-9-]+)?$",
"description": "Semantic version of the component specification"
},
"metadata": {
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 100,
"description": "Human-readable name for the component"
},
"description": {
"type": "string",
"maxLength": 500,
"description": "Optional description of the component's purpose and usage"
},
"author": {
"type": "string",
"maxLength": 100,
"description": "Component author or organization"
},
"created": {
"type": "string",
"format": "date-time",
"description": "ISO 8601 timestamp when component was created"
},
"modified": {
"type": "string",
"format": "date-time",
"description": "ISO 8601 timestamp when component was last modified"
},
"tags": {
"type": "array",
"items": {
"type": "string",
"pattern": "^[a-z0-9][a-z0-9-]*[a-z0-9]$"
},
"maxItems": 10,
"uniqueItems": true,
"description": "Tags for categorization and search"
},
"category": {
"type": "string",
"enum": ["layout", "input", "display", "navigation", "feedback", "utility", "overlay", "custom"],
"description": "Primary category for component organization"
},
"fidelity": {
"type": "string",
"enum": ["sketch", "basic", "detailed", "production"],
"description": "Component design fidelity level",
"default": "detailed"
}
},
"required": ["name", "description", "created", "modified", "tags", "category", "fidelity"],
"additionalProperties": false
},
"props": {
"type": "object",
"description": "Component properties and configuration",
"additionalProperties": true
},
"behavior": {
"type": "object",
"properties": {
"states": {
"type": "array",
"items": {
"$ref": "#/$defs/componentState"
},
"description": "Possible states the component can be in"
},
"interactions": {
"type": "array",
"items": {
"$ref": "#/$defs/componentInteraction"
},
"description": "User interactions the component responds to"
},
"animations": {
"type": "array",
"items": {
"$ref": "#/$defs/componentAnimation"
},
"description": "Animations associated with state changes"
},
"accessibility": {
"$ref": "#/$defs/accessibilitySpec",
"description": "Accessibility requirements and ARIA attributes"
}
},
"additionalProperties": true
},
"layout": {
"type": "object",
"properties": {
"positioning": {
"type": "string",
"enum": ["static", "relative", "absolute", "fixed", "sticky"],
"default": "static"
},
"display": {
"type": "string",
"enum": ["block", "inline", "inline-block", "flex", "grid", "none", "overlay", "table"],
"default": "block"
},
"spacing": {
"$ref": "#/$defs/spacingSpec"
},
"sizing": {
"$ref": "#/$defs/sizingSpec"
}
},
"additionalProperties": true
},
"ascii": {
"type": "object",
"properties": {
"templateFile": {
"type": "string",
"pattern": "^[a-zA-Z0-9._-]+\\.md$",
"description": "Filename of the associated ASCII template"
},
"width": {
"type": "integer",
"minimum": 1,
"maximum": 120,
"description": "Character width of the ASCII representation"
},
"height": {
"type": "integer",
"minimum": 1,
"maximum": 50,
"description": "Character height of the ASCII representation"
},
"variables": {
"type": "array",
"items": {
"$ref": "#/$defs/templateVariable"
},
"description": "Variables used in the ASCII template"
}
},
"required": ["templateFile", "width", "height"],
"additionalProperties": false
},
"extends": {
"type": "string",
"description": "Component ID that this component extends"
}
},
"required": ["id", "type", "version", "metadata", "props", "ascii"],
"additionalProperties": false,
"$defs": {
"componentState": {
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1
},
"properties": {
"type": "object",
"additionalProperties": true
},
"triggers": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": ["name", "properties"],
"additionalProperties": true
},
"componentInteraction": {
"type": "object",
"properties": {
"trigger": {
"type": "string",
"enum": ["click", "hover", "focus", "blur", "keydown", "keyup", "change", "submit", "timeout", "reset", "field-change"]
},
"action": {
"type": "string",
"minLength": 1
},
"target": {
"type": "string",
"description": "Optional target element or component"
},
"condition": {
"type": "string",
"description": "Optional condition for the interaction"
}
},
"required": ["trigger", "action"],
"additionalProperties": false
},
"componentAnimation": {
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1
},
"duration": {
"type": "number",
"minimum": 0
},
"easing": {
"type": "string",
"enum": ["linear", "ease", "ease-in", "ease-out", "ease-in-out", "cubic-bezier"]
},
"properties": {
"type": "object",
"additionalProperties": true
}
},
"required": ["name", "duration", "properties"],
"additionalProperties": false
},
"accessibilitySpec": {
"type": "object",
"properties": {
"role": {
"type": "string",
"description": "ARIA role for the component"
},
"ariaLabel": {
"type": "string",
"description": "Accessible label for screen readers"
},
"ariaDescribedBy": {
"type": "string",
"description": "IDs of elements that describe this component"
},
"ariaLabelledBy": {
"type": "string",
"description": "IDs of elements that label this component"
},
"keyboardSupport": {
"type": "array",
"items": {
"type": "string"
},
"description": "Keyboard interactions supported"
},
"focusable": {
"type": "boolean",
"default": false,
"description": "Whether the component can receive focus"
}
},
"additionalProperties": false
},
"spacingSpec": {
"type": "object",
"properties": {
"margin": {
"oneOf": [
{"type": "number"},
{"$ref": "#/$defs/boxSpacing"}
]
},
"padding": {
"oneOf": [
{"type": "number"},
{"$ref": "#/$defs/boxSpacing"}
]
}
},
"additionalProperties": false
},
"boxSpacing": {
"type": "object",
"properties": {
"top": {"type": "number"},
"right": {"type": "number"},
"bottom": {"type": "number"},
"left": {"type": "number"}
},
"additionalProperties": false
},
"sizingSpec": {
"type": "object",
"properties": {
"width": {
"oneOf": [
{"type": "number"},
{"type": "string", "enum": ["auto", "fit-content", "max-content", "min-content"]}
]
},
"height": {
"oneOf": [
{"type": "number"},
{"type": "string", "enum": ["auto", "fit-content", "max-content", "min-content"]}
]
},
"minWidth": {"type": "number"},
"maxWidth": {"type": "number"},
"minHeight": {"type": "number"},
"maxHeight": {"type": "number"}
},
"additionalProperties": true
},
"templateVariable": {
"type": "object",
"properties": {
"name": {
"type": "string",
"pattern": "^[a-zA-Z][a-zA-Z0-9_]*$",
"description": "Variable name using camelCase"
},
"type": {
"type": "string",
"enum": ["string", "number", "boolean", "color", "size", "array", "object"],
"description": "Data type of the variable"
},
"defaultValue": {
"description": "Default value for the variable"
},
"description": {
"type": "string",
"maxLength": 200,
"description": "Description of the variable's purpose"
},
"required": {
"type": "boolean",
"default": false,
"description": "Whether the variable is required"
},
"validation": {
"type": "object",
"properties": {
"min": {"type": "number"},
"max": {"type": "number"},
"pattern": {"type": "string"},
"enum": {"type": "array"}
},
"additionalProperties": false
}
},
"required": ["name", "type"],
"additionalProperties": false
}
}
}