diff --git a/docs/sw/integrated-improvement-qa/baseline-dropdown-consolidation/after-full-index.json b/docs/sw/integrated-improvement-qa/baseline-dropdown-consolidation/after-full-index.json
new file mode 100644
index 0000000..7aaf7d3
--- /dev/null
+++ b/docs/sw/integrated-improvement-qa/baseline-dropdown-consolidation/after-full-index.json
@@ -0,0 +1,5143 @@
+{
+ "v": 5,
+ "entries": {
+ "foundation-color--all": {
+ "type": "story",
+ "subtype": "story",
+ "id": "foundation-color--all",
+ "name": "Color",
+ "title": "Foundation/Color",
+ "importPath": "./src/foundation/color.stories.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "All"
+ },
+ "foundation-typography--all": {
+ "type": "story",
+ "subtype": "story",
+ "id": "foundation-typography--all",
+ "name": "Typography",
+ "title": "Foundation/Typography",
+ "importPath": "./src/foundation/typography.stories.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "All"
+ },
+ "foundation-layout--all": {
+ "type": "story",
+ "subtype": "story",
+ "id": "foundation-layout--all",
+ "name": "Layout",
+ "title": "Foundation/Layout",
+ "importPath": "./src/foundation/layout.stories.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "All"
+ },
+ "components-form-button--all": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-form-button--all",
+ "name": "Button",
+ "title": "Components/Form/Button",
+ "importPath": "./src/components/button.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "All"
+ },
+ "components-form-button--roles": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-form-button--roles",
+ "name": "Roles",
+ "title": "Components/Form/Button",
+ "importPath": "./src/components/button.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Roles"
+ },
+ "components-form-button--sizes": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-form-button--sizes",
+ "name": "Sizes",
+ "title": "Components/Form/Button",
+ "importPath": "./src/components/button.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Sizes"
+ },
+ "components-form-button--states": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-form-button--states",
+ "name": "Brand States",
+ "title": "Components/Form/Button",
+ "importPath": "./src/components/button.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "States"
+ },
+ "components-form-button--standard-states": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-form-button--standard-states",
+ "name": "Standard States",
+ "title": "Components/Form/Button",
+ "importPath": "./src/components/button.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "StandardStates"
+ },
+ "components-form-button--long-label": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-form-button--long-label",
+ "name": "Long Label",
+ "title": "Components/Form/Button",
+ "importPath": "./src/components/button.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "LongLabel"
+ },
+ "components-form-button--korean-labels": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-form-button--korean-labels",
+ "name": "Korean Labels",
+ "title": "Components/Form/Button",
+ "importPath": "./src/components/button.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "KoreanLabels"
+ },
+ "components-form-button--icon-text-narrow": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-form-button--icon-text-narrow",
+ "name": "Icon Text Narrow",
+ "title": "Components/Form/Button",
+ "importPath": "./src/components/button.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "IconTextNarrow"
+ },
+ "components-form-button--destructive": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-form-button--destructive",
+ "name": "Destructive",
+ "title": "Components/Form/Button",
+ "importPath": "./src/components/button.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Destructive"
+ },
+ "components-form-button--playground": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-form-button--playground",
+ "name": "Playground",
+ "title": "Components/Form/Button",
+ "importPath": "./src/components/button.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Playground"
+ },
+ "components-form-button--compatibility": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-form-button--compatibility",
+ "name": "Compatibility",
+ "title": "Components/Form/Button",
+ "importPath": "./src/components/button.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Compatibility"
+ },
+ "components-form-input--all": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-form-input--all",
+ "name": "Input",
+ "title": "Components/Form/Input",
+ "importPath": "./src/components/input.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "play-fn"
+ ],
+ "exportName": "All"
+ },
+ "components-form-input--default": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-form-input--default",
+ "name": "Default",
+ "title": "Components/Form/Input",
+ "importPath": "./src/components/input.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Default"
+ },
+ "components-form-input--focus": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-form-input--focus",
+ "name": "Focus",
+ "title": "Components/Form/Input",
+ "importPath": "./src/components/input.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification",
+ "play-fn"
+ ],
+ "exportName": "Focus"
+ },
+ "components-form-input--error": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-form-input--error",
+ "name": "Error",
+ "title": "Components/Form/Input",
+ "importPath": "./src/components/input.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Error"
+ },
+ "components-form-input--invalid-focus": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-form-input--invalid-focus",
+ "name": "Invalid Focus",
+ "title": "Components/Form/Input",
+ "importPath": "./src/components/input.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification",
+ "play-fn"
+ ],
+ "exportName": "InvalidFocus"
+ },
+ "components-form-input--error-message": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-form-input--error-message",
+ "name": "Error Message",
+ "title": "Components/Form/Input",
+ "importPath": "./src/components/input.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "ErrorMessage"
+ },
+ "components-form-input--required": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-form-input--required",
+ "name": "Required",
+ "title": "Components/Form/Input",
+ "importPath": "./src/components/input.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Required"
+ },
+ "components-form-input--disabled": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-form-input--disabled",
+ "name": "Disabled",
+ "title": "Components/Form/Input",
+ "importPath": "./src/components/input.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Disabled"
+ },
+ "components-form-input--readonly": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-form-input--readonly",
+ "name": "Readonly",
+ "title": "Components/Form/Input",
+ "importPath": "./src/components/input.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Readonly"
+ },
+ "components-form-input--sizes": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-form-input--sizes",
+ "name": "Compare Sizes",
+ "title": "Components/Form/Input",
+ "importPath": "./src/components/input.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Sizes"
+ },
+ "components-form-input--small": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-form-input--small",
+ "name": "Small",
+ "title": "Components/Form/Input",
+ "importPath": "./src/components/input.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Small"
+ },
+ "components-form-input--medium": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-form-input--medium",
+ "name": "Medium",
+ "title": "Components/Form/Input",
+ "importPath": "./src/components/input.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Medium"
+ },
+ "components-form-input--large": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-form-input--large",
+ "name": "Large",
+ "title": "Components/Form/Input",
+ "importPath": "./src/components/input.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Large"
+ },
+ "components-form-input--playground": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-form-input--playground",
+ "name": "Playground",
+ "title": "Components/Form/Input",
+ "importPath": "./src/components/input.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Playground"
+ },
+ "components-form-textarea--all": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-form-textarea--all",
+ "name": "Textarea",
+ "title": "Components/Form/Textarea",
+ "importPath": "./src/components/textarea.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "play-fn"
+ ],
+ "exportName": "All"
+ },
+ "components-form-textarea--default": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-form-textarea--default",
+ "name": "Default",
+ "title": "Components/Form/Textarea",
+ "importPath": "./src/components/textarea.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Default"
+ },
+ "components-form-textarea--focus": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-form-textarea--focus",
+ "name": "Focus",
+ "title": "Components/Form/Textarea",
+ "importPath": "./src/components/textarea.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification",
+ "play-fn"
+ ],
+ "exportName": "Focus"
+ },
+ "components-form-textarea--error": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-form-textarea--error",
+ "name": "Error",
+ "title": "Components/Form/Textarea",
+ "importPath": "./src/components/textarea.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Error"
+ },
+ "components-form-textarea--invalid-focus": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-form-textarea--invalid-focus",
+ "name": "Invalid Focus",
+ "title": "Components/Form/Textarea",
+ "importPath": "./src/components/textarea.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification",
+ "play-fn"
+ ],
+ "exportName": "InvalidFocus"
+ },
+ "components-form-textarea--error-message": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-form-textarea--error-message",
+ "name": "Error Message",
+ "title": "Components/Form/Textarea",
+ "importPath": "./src/components/textarea.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "ErrorMessage"
+ },
+ "components-form-textarea--required": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-form-textarea--required",
+ "name": "Required",
+ "title": "Components/Form/Textarea",
+ "importPath": "./src/components/textarea.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Required"
+ },
+ "components-form-textarea--readonly": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-form-textarea--readonly",
+ "name": "Readonly",
+ "title": "Components/Form/Textarea",
+ "importPath": "./src/components/textarea.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Readonly"
+ },
+ "components-form-textarea--disabled": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-form-textarea--disabled",
+ "name": "Disabled",
+ "title": "Components/Form/Textarea",
+ "importPath": "./src/components/textarea.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Disabled"
+ },
+ "components-form-textarea--long-content": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-form-textarea--long-content",
+ "name": "Long Content",
+ "title": "Components/Form/Textarea",
+ "importPath": "./src/components/textarea.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "LongContent"
+ },
+ "components-form-textarea--playground": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-form-textarea--playground",
+ "name": "Playground",
+ "title": "Components/Form/Textarea",
+ "importPath": "./src/components/textarea.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Playground"
+ },
+ "components-form-select--all": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-form-select--all",
+ "name": "Select",
+ "title": "Components/Form/Select",
+ "importPath": "./src/components/select.stories.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "All"
+ },
+ "components-form-select--default": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-form-select--default",
+ "name": "Default",
+ "title": "Components/Form/Select",
+ "importPath": "./src/components/select.stories.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Default"
+ },
+ "components-form-select--invalid-focus": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-form-select--invalid-focus",
+ "name": "Invalid Focus",
+ "title": "Components/Form/Select",
+ "importPath": "./src/components/select.stories.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "InvalidFocus"
+ },
+ "components-form-select--open": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-form-select--open",
+ "name": "Open",
+ "title": "Components/Form/Select",
+ "importPath": "./src/components/select.stories.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Open"
+ },
+ "components-form-select--selected": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-form-select--selected",
+ "name": "Selected",
+ "title": "Components/Form/Select",
+ "importPath": "./src/components/select.stories.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Selected"
+ },
+ "components-form-select--disabled": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-form-select--disabled",
+ "name": "Disabled",
+ "title": "Components/Form/Select",
+ "importPath": "./src/components/select.stories.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Disabled"
+ },
+ "components-form-select--sizes": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-form-select--sizes",
+ "name": "Compare Sizes",
+ "title": "Components/Form/Select",
+ "importPath": "./src/components/select.stories.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Sizes"
+ },
+ "components-form-select--medium": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-form-select--medium",
+ "name": "Medium",
+ "title": "Components/Form/Select",
+ "importPath": "./src/components/select.stories.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Medium"
+ },
+ "components-form-select--large": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-form-select--large",
+ "name": "Large",
+ "title": "Components/Form/Select",
+ "importPath": "./src/components/select.stories.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Large"
+ },
+ "components-form-select--long-content": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-form-select--long-content",
+ "name": "Long Content",
+ "title": "Components/Form/Select",
+ "importPath": "./src/components/select.stories.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "LongContent"
+ },
+ "components-form-select--open-large-short": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-form-select--open-large-short",
+ "name": "Open Large Short",
+ "title": "Components/Form/Select",
+ "importPath": "./src/components/select.stories.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "OpenLargeShort"
+ },
+ "components-form-select--open-medium-long": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-form-select--open-medium-long",
+ "name": "Open Medium Long",
+ "title": "Components/Form/Select",
+ "importPath": "./src/components/select.stories.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "OpenMediumLong"
+ },
+ "components-form-select--open-large-long": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-form-select--open-large-long",
+ "name": "Open Large Long",
+ "title": "Components/Form/Select",
+ "importPath": "./src/components/select.stories.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "OpenLargeLong"
+ },
+ "components-form-select--open-top": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-form-select--open-top",
+ "name": "Open Top",
+ "title": "Components/Form/Select",
+ "importPath": "./src/components/select.stories.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "OpenTop"
+ },
+ "components-form-select--open-top-long": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-form-select--open-top-long",
+ "name": "Open Top Long",
+ "title": "Components/Form/Select",
+ "importPath": "./src/components/select.stories.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "OpenTopLong"
+ },
+ "components-form-select--list-size-comparison": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-form-select--list-size-comparison",
+ "name": "Medium Trigger / List Size Comparison",
+ "title": "Components/Form/Select",
+ "importPath": "./src/components/select.stories.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "ListSizeComparison"
+ },
+ "components-form-select--scroll": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-form-select--scroll",
+ "name": "Scroll",
+ "title": "Components/Form/Select",
+ "importPath": "./src/components/select.stories.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Scroll"
+ },
+ "components-form-select--playground": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-form-select--playground",
+ "name": "Playground",
+ "title": "Components/Form/Select",
+ "importPath": "./src/components/select.stories.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Playground"
+ },
+ "components-form-checkbox--all": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-form-checkbox--all",
+ "name": "Checkbox",
+ "title": "Components/Form/Checkbox",
+ "importPath": "./src/components/checkbox.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "play-fn"
+ ],
+ "exportName": "All"
+ },
+ "components-form-checkbox--unchecked": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-form-checkbox--unchecked",
+ "name": "Unchecked",
+ "title": "Components/Form/Checkbox",
+ "importPath": "./src/components/checkbox.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Unchecked"
+ },
+ "components-form-checkbox--checked": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-form-checkbox--checked",
+ "name": "Checked",
+ "title": "Components/Form/Checkbox",
+ "importPath": "./src/components/checkbox.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Checked"
+ },
+ "components-form-checkbox--indeterminate": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-form-checkbox--indeterminate",
+ "name": "Indeterminate",
+ "title": "Components/Form/Checkbox",
+ "importPath": "./src/components/checkbox.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Indeterminate"
+ },
+ "components-form-checkbox--disabled": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-form-checkbox--disabled",
+ "name": "Disabled",
+ "title": "Components/Form/Checkbox",
+ "importPath": "./src/components/checkbox.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Disabled"
+ },
+ "components-form-checkbox--error": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-form-checkbox--error",
+ "name": "Error",
+ "title": "Components/Form/Checkbox",
+ "importPath": "./src/components/checkbox.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Error"
+ },
+ "components-form-checkbox--playground": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-form-checkbox--playground",
+ "name": "Playground",
+ "title": "Components/Form/Checkbox",
+ "importPath": "./src/components/checkbox.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Playground"
+ },
+ "components-form-radio-group--all": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-form-radio-group--all",
+ "name": "Radio Group",
+ "title": "Components/Form/Radio Group",
+ "importPath": "./src/components/radio-group.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "play-fn"
+ ],
+ "exportName": "All"
+ },
+ "components-form-radio-group--vertical": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-form-radio-group--vertical",
+ "name": "Vertical",
+ "title": "Components/Form/Radio Group",
+ "importPath": "./src/components/radio-group.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Vertical"
+ },
+ "components-form-radio-group--horizontal": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-form-radio-group--horizontal",
+ "name": "Horizontal",
+ "title": "Components/Form/Radio Group",
+ "importPath": "./src/components/radio-group.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Horizontal"
+ },
+ "components-form-radio-group--disabled": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-form-radio-group--disabled",
+ "name": "Disabled",
+ "title": "Components/Form/Radio Group",
+ "importPath": "./src/components/radio-group.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Disabled"
+ },
+ "components-form-radio-group--error": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-form-radio-group--error",
+ "name": "Error",
+ "title": "Components/Form/Radio Group",
+ "importPath": "./src/components/radio-group.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Error"
+ },
+ "components-form-switch--all": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-form-switch--all",
+ "name": "Switch",
+ "title": "Components/Form/Switch",
+ "importPath": "./src/components/switch.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "play-fn"
+ ],
+ "exportName": "All"
+ },
+ "components-form-switch--off": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-form-switch--off",
+ "name": "Off",
+ "title": "Components/Form/Switch",
+ "importPath": "./src/components/switch.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Off"
+ },
+ "components-form-switch--on": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-form-switch--on",
+ "name": "On",
+ "title": "Components/Form/Switch",
+ "importPath": "./src/components/switch.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "On"
+ },
+ "components-form-switch--disabled": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-form-switch--disabled",
+ "name": "Disabled",
+ "title": "Components/Form/Switch",
+ "importPath": "./src/components/switch.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Disabled"
+ },
+ "components-form-slider--all": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-form-slider--all",
+ "name": "Slider",
+ "title": "Components/Form/Slider",
+ "importPath": "./src/components/slider.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "All"
+ },
+ "components-form-slider--single-value": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-form-slider--single-value",
+ "name": "Single",
+ "title": "Components/Form/Slider",
+ "importPath": "./src/components/slider.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "SingleValue"
+ },
+ "components-form-slider--range-value": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-form-slider--range-value",
+ "name": "Range",
+ "title": "Components/Form/Slider",
+ "importPath": "./src/components/slider.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "RangeValue"
+ },
+ "components-form-slider--disabled-slider": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-form-slider--disabled-slider",
+ "name": "Disabled",
+ "title": "Components/Form/Slider",
+ "importPath": "./src/components/slider.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "DisabledSlider"
+ },
+ "components-form-slider--focus": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-form-slider--focus",
+ "name": "Focus",
+ "title": "Components/Form/Slider",
+ "importPath": "./src/components/slider.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification",
+ "play-fn"
+ ],
+ "exportName": "Focus"
+ },
+ "components-form-toggle--all": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-form-toggle--all",
+ "name": "Toggle",
+ "title": "Components/Form/Toggle",
+ "importPath": "./src/components/toggle.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "All"
+ },
+ "components-form-toggle--states": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-form-toggle--states",
+ "name": "States",
+ "title": "Components/Form/Toggle",
+ "importPath": "./src/components/toggle.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "States"
+ },
+ "components-form-toggle--icon-only": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-form-toggle--icon-only",
+ "name": "Icon Only",
+ "title": "Components/Form/Toggle",
+ "importPath": "./src/components/toggle.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "IconOnly"
+ },
+ "components-form-toggle--disabled-toggle": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-form-toggle--disabled-toggle",
+ "name": "Disabled",
+ "title": "Components/Form/Toggle",
+ "importPath": "./src/components/toggle.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "DisabledToggle"
+ },
+ "components-form-toggle--content-nodes": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-form-toggle--content-nodes",
+ "name": "Content Nodes",
+ "title": "Components/Form/Toggle",
+ "importPath": "./src/components/toggle.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "ContentNodes"
+ },
+ "components-form-toggle-group--all": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-form-toggle-group--all",
+ "name": "Toggle Group",
+ "title": "Components/Form/Toggle Group",
+ "importPath": "./src/components/toggle-group.stories.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "All"
+ },
+ "components-form-toggle-group--single-selection": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-form-toggle-group--single-selection",
+ "name": "Single",
+ "title": "Components/Form/Toggle Group",
+ "importPath": "./src/components/toggle-group.stories.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "SingleSelection"
+ },
+ "components-form-toggle-group--multiple-selection": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-form-toggle-group--multiple-selection",
+ "name": "Multiple",
+ "title": "Components/Form/Toggle Group",
+ "importPath": "./src/components/toggle-group.stories.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "MultipleSelection"
+ },
+ "components-form-toggle-group--vertical-group": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-form-toggle-group--vertical-group",
+ "name": "Vertical",
+ "title": "Components/Form/Toggle Group",
+ "importPath": "./src/components/toggle-group.stories.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "VerticalGroup"
+ },
+ "components-form-toggle-group--content-nodes": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-form-toggle-group--content-nodes",
+ "name": "Content Nodes",
+ "title": "Components/Form/Toggle Group",
+ "importPath": "./src/components/toggle-group.stories.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "ContentNodes"
+ },
+ "components-form-label--all": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-form-label--all",
+ "name": "Label",
+ "title": "Components/Form/Label",
+ "importPath": "./src/components/label.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "All"
+ },
+ "components-navigation-tabs--all": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-navigation-tabs--all",
+ "name": "Tabs",
+ "title": "Components/Navigation/Tabs",
+ "importPath": "./src/components/tabs.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "All"
+ },
+ "components-navigation-tabs--secondary": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-navigation-tabs--secondary",
+ "name": "Secondary",
+ "title": "Components/Navigation/Tabs",
+ "importPath": "./src/components/tabs.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Secondary"
+ },
+ "components-navigation-tabs--selected-first": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-navigation-tabs--selected-first",
+ "name": "Selected First",
+ "title": "Components/Navigation/Tabs",
+ "importPath": "./src/components/tabs.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "SelectedFirst"
+ },
+ "components-navigation-tabs--selected-last": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-navigation-tabs--selected-last",
+ "name": "Selected Last",
+ "title": "Components/Navigation/Tabs",
+ "importPath": "./src/components/tabs.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "SelectedLast"
+ },
+ "components-navigation-tabs--focus": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-navigation-tabs--focus",
+ "name": "Focus",
+ "title": "Components/Navigation/Tabs",
+ "importPath": "./src/components/tabs.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification",
+ "play-fn"
+ ],
+ "exportName": "Focus"
+ },
+ "components-navigation-tabs--disabled": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-navigation-tabs--disabled",
+ "name": "Disabled",
+ "title": "Components/Navigation/Tabs",
+ "importPath": "./src/components/tabs.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Disabled"
+ },
+ "components-navigation-tabs--overflow": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-navigation-tabs--overflow",
+ "name": "Overflow",
+ "title": "Components/Navigation/Tabs",
+ "importPath": "./src/components/tabs.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Overflow"
+ },
+ "components-navigation-tabs--secondary-overflow": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-navigation-tabs--secondary-overflow",
+ "name": "Secondary Overflow",
+ "title": "Components/Navigation/Tabs",
+ "importPath": "./src/components/tabs.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "SecondaryOverflow"
+ },
+ "components-navigation-tabs--long-label": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-navigation-tabs--long-label",
+ "name": "Long Label",
+ "title": "Components/Navigation/Tabs",
+ "importPath": "./src/components/tabs.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "LongLabel"
+ },
+ "components-navigation-tabs--compatibility": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-navigation-tabs--compatibility",
+ "name": "Compatibility",
+ "title": "Components/Navigation/Tabs",
+ "importPath": "./src/components/tabs.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Compatibility"
+ },
+ "components-navigation-breadcrumb--all": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-navigation-breadcrumb--all",
+ "name": "Breadcrumb",
+ "title": "Components/Navigation/Breadcrumb",
+ "importPath": "./src/components/breadcrumb.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "All"
+ },
+ "components-navigation-breadcrumb--basic-3": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-navigation-breadcrumb--basic-3",
+ "name": "Basic",
+ "title": "Components/Navigation/Breadcrumb",
+ "importPath": "./src/components/breadcrumb.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Basic3"
+ },
+ "components-navigation-breadcrumb--with-ellipsis": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-navigation-breadcrumb--with-ellipsis",
+ "name": "Ellipsis",
+ "title": "Components/Navigation/Breadcrumb",
+ "importPath": "./src/components/breadcrumb.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "WithEllipsis"
+ },
+ "components-navigation-breadcrumb--long-path": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-navigation-breadcrumb--long-path",
+ "name": "Long Path",
+ "title": "Components/Navigation/Breadcrumb",
+ "importPath": "./src/components/breadcrumb.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "LongPath"
+ },
+ "components-navigation-pagination--all": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-navigation-pagination--all",
+ "name": "Pagination",
+ "title": "Components/Navigation/Pagination",
+ "importPath": "./src/components/pagination.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "All"
+ },
+ "components-navigation-pagination--first-page": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-navigation-pagination--first-page",
+ "name": "First Page",
+ "title": "Components/Navigation/Pagination",
+ "importPath": "./src/components/pagination.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "FirstPage"
+ },
+ "components-navigation-pagination--last-page": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-navigation-pagination--last-page",
+ "name": "Last Page",
+ "title": "Components/Navigation/Pagination",
+ "importPath": "./src/components/pagination.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "LastPage"
+ },
+ "components-navigation-pagination--long-range": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-navigation-pagination--long-range",
+ "name": "Long Range",
+ "title": "Components/Navigation/Pagination",
+ "importPath": "./src/components/pagination.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "LongRange"
+ },
+ "components-navigation-navigation-menu--all": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-navigation-navigation-menu--all",
+ "name": "Navigation Menu",
+ "title": "Components/Navigation/Navigation Menu",
+ "importPath": "./src/components/navigation-menu.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "All"
+ },
+ "components-navigation-navigation-menu--default": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-navigation-navigation-menu--default",
+ "name": "Default",
+ "title": "Components/Navigation/Navigation Menu",
+ "importPath": "./src/components/navigation-menu.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Default"
+ },
+ "components-navigation-navigation-menu--no-viewport": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-navigation-navigation-menu--no-viewport",
+ "name": "No Viewport",
+ "title": "Components/Navigation/Navigation Menu",
+ "importPath": "./src/components/navigation-menu.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "NoViewport"
+ },
+ "components-navigation-navigation-menu--indicator-alignment": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-navigation-navigation-menu--indicator-alignment",
+ "name": "Indicator Alignment",
+ "title": "Components/Navigation/Navigation Menu",
+ "importPath": "./src/components/navigation-menu.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "IndicatorAlignment"
+ },
+ "components-navigation-menubar--all": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-navigation-menubar--all",
+ "name": "Menubar",
+ "title": "Components/Navigation/Menubar",
+ "importPath": "./src/components/menubar.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "All"
+ },
+ "components-navigation-menubar--trigger-focus": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-navigation-menubar--trigger-focus",
+ "name": "Trigger Focus",
+ "title": "Components/Navigation/Menubar",
+ "importPath": "./src/components/menubar.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification",
+ "play-fn"
+ ],
+ "exportName": "TriggerFocus"
+ },
+ "components-navigation-menubar--open-focus": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-navigation-menubar--open-focus",
+ "name": "Open Focus",
+ "title": "Components/Navigation/Menubar",
+ "importPath": "./src/components/menubar.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification",
+ "play-fn"
+ ],
+ "exportName": "OpenFocus"
+ },
+ "components-overlay-dialog--all": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-overlay-dialog--all",
+ "name": "Dialog",
+ "title": "Components/Overlay/Dialog",
+ "importPath": "./src/components/dialog.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "All"
+ },
+ "components-overlay-dialog--open": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-overlay-dialog--open",
+ "name": "Open",
+ "title": "Components/Overlay/Dialog",
+ "importPath": "./src/components/dialog.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Open"
+ },
+ "components-overlay-dialog--long-content-open": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-overlay-dialog--long-content-open",
+ "name": "Long Content",
+ "title": "Components/Overlay/Dialog",
+ "importPath": "./src/components/dialog.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "LongContentOpen"
+ },
+ "components-overlay-dialog--wide-content-open": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-overlay-dialog--wide-content-open",
+ "name": "Wide Content",
+ "title": "Components/Overlay/Dialog",
+ "importPath": "./src/components/dialog.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "WideContentOpen"
+ },
+ "components-overlay-dialog--body-scroll-open": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-overlay-dialog--body-scroll-open",
+ "name": "Body Scroll",
+ "title": "Components/Overlay/Dialog",
+ "importPath": "./src/components/dialog.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "BodyScrollOpen"
+ },
+ "components-overlay-dialog--delete-confirmation-open": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-overlay-dialog--delete-confirmation-open",
+ "name": "Delete Confirmation",
+ "title": "Components/Overlay/Dialog",
+ "importPath": "./src/components/dialog.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "DeleteConfirmationOpen"
+ },
+ "components-overlay-alert-dialog--all": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-overlay-alert-dialog--all",
+ "name": "Alert Dialog",
+ "title": "Components/Overlay/Alert Dialog",
+ "importPath": "./src/components/alert-dialog.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "All"
+ },
+ "components-overlay-alert-dialog--confirmation-open": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-overlay-alert-dialog--confirmation-open",
+ "name": "Confirmation",
+ "title": "Components/Overlay/Alert Dialog",
+ "importPath": "./src/components/alert-dialog.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "ConfirmationOpen"
+ },
+ "components-overlay-alert-dialog--destructive-open": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-overlay-alert-dialog--destructive-open",
+ "name": "Destructive",
+ "title": "Components/Overlay/Alert Dialog",
+ "importPath": "./src/components/alert-dialog.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "DestructiveOpen"
+ },
+ "components-overlay-sheet--all": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-overlay-sheet--all",
+ "name": "Sheet",
+ "title": "Components/Overlay/Sheet",
+ "importPath": "./src/components/sheet.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "All"
+ },
+ "components-overlay-sheet--right": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-overlay-sheet--right",
+ "name": "Right",
+ "title": "Components/Overlay/Sheet",
+ "importPath": "./src/components/sheet.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Right"
+ },
+ "components-overlay-sheet--left": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-overlay-sheet--left",
+ "name": "Left",
+ "title": "Components/Overlay/Sheet",
+ "importPath": "./src/components/sheet.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Left"
+ },
+ "components-overlay-sheet--top": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-overlay-sheet--top",
+ "name": "Top",
+ "title": "Components/Overlay/Sheet",
+ "importPath": "./src/components/sheet.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Top"
+ },
+ "components-overlay-sheet--bottom": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-overlay-sheet--bottom",
+ "name": "Bottom",
+ "title": "Components/Overlay/Sheet",
+ "importPath": "./src/components/sheet.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Bottom"
+ },
+ "components-overlay-sheet--form": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-overlay-sheet--form",
+ "name": "Form",
+ "title": "Components/Overlay/Sheet",
+ "importPath": "./src/components/sheet.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Form"
+ },
+ "components-overlay-sheet--long-content": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-overlay-sheet--long-content",
+ "name": "Long Content",
+ "title": "Components/Overlay/Sheet",
+ "importPath": "./src/components/sheet.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "LongContent"
+ },
+ "components-overlay-drawer--all": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-overlay-drawer--all",
+ "name": "Drawer",
+ "title": "Components/Overlay/Drawer",
+ "importPath": "./src/components/drawer.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "All"
+ },
+ "components-overlay-drawer--open": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-overlay-drawer--open",
+ "name": "Open",
+ "title": "Components/Overlay/Drawer",
+ "importPath": "./src/components/drawer.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Open"
+ },
+ "components-overlay-drawer--form": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-overlay-drawer--form",
+ "name": "Form",
+ "title": "Components/Overlay/Drawer",
+ "importPath": "./src/components/drawer.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Form"
+ },
+ "components-overlay-drawer--long-content": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-overlay-drawer--long-content",
+ "name": "Long Content",
+ "title": "Components/Overlay/Drawer",
+ "importPath": "./src/components/drawer.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "LongContent"
+ },
+ "components-overlay-dropdown-menu--all": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-overlay-dropdown-menu--all",
+ "name": "Dropdown Menu",
+ "title": "Components/Overlay/Dropdown Menu",
+ "importPath": "./src/components/dropdown-menu.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "All"
+ },
+ "components-overlay-dropdown-menu--open": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-overlay-dropdown-menu--open",
+ "name": "Open",
+ "title": "Components/Overlay/Dropdown Menu",
+ "importPath": "./src/components/dropdown-menu.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Open"
+ },
+ "components-overlay-context-menu--all": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-overlay-context-menu--all",
+ "name": "Context Menu",
+ "title": "Components/Overlay/Context Menu",
+ "importPath": "./src/components/context-menu.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "All"
+ },
+ "components-overlay-context-menu--open": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-overlay-context-menu--open",
+ "name": "Open",
+ "title": "Components/Overlay/Context Menu",
+ "importPath": "./src/components/context-menu.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification",
+ "play-fn"
+ ],
+ "exportName": "Open"
+ },
+ "components-overlay-popover--all": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-overlay-popover--all",
+ "name": "Popover",
+ "title": "Components/Overlay/Popover",
+ "importPath": "./src/components/popover.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "All"
+ },
+ "components-overlay-popover--open": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-overlay-popover--open",
+ "name": "Open",
+ "title": "Components/Overlay/Popover",
+ "importPath": "./src/components/popover.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Open"
+ },
+ "components-overlay-tooltip--all": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-overlay-tooltip--all",
+ "name": "Tooltip",
+ "title": "Components/Overlay/Tooltip",
+ "importPath": "./src/components/tooltip.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "All"
+ },
+ "components-overlay-tooltip--open": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-overlay-tooltip--open",
+ "name": "Open",
+ "title": "Components/Overlay/Tooltip",
+ "importPath": "./src/components/tooltip.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Open"
+ },
+ "components-overlay-hover-card--all": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-overlay-hover-card--all",
+ "name": "Hover Card",
+ "title": "Components/Overlay/Hover Card",
+ "importPath": "./src/components/hover-card.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "All"
+ },
+ "components-overlay-hover-card--open": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-overlay-hover-card--open",
+ "name": "Open",
+ "title": "Components/Overlay/Hover Card",
+ "importPath": "./src/components/hover-card.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Open"
+ },
+ "components-data-display-card--all": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-data-display-card--all",
+ "name": "Card",
+ "title": "Components/Data & Display/Card",
+ "importPath": "./src/components/card.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "All"
+ },
+ "components-data-display-card--surfaces": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-data-display-card--surfaces",
+ "name": "Surfaces",
+ "title": "Components/Data & Display/Card",
+ "importPath": "./src/components/card.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Surfaces"
+ },
+ "components-data-display-card--action": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-data-display-card--action",
+ "name": "Action",
+ "title": "Components/Data & Display/Card",
+ "importPath": "./src/components/card.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Action"
+ },
+ "components-data-display-card--compatibility": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-data-display-card--compatibility",
+ "name": "Compatibility",
+ "title": "Components/Data & Display/Card",
+ "importPath": "./src/components/card.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Compatibility"
+ },
+ "components-data-display-table--all": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-data-display-table--all",
+ "name": "Table",
+ "title": "Components/Data & Display/Table",
+ "importPath": "./src/components/table.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "All"
+ },
+ "components-data-display-table--basic": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-data-display-table--basic",
+ "name": "Basic",
+ "title": "Components/Data & Display/Table",
+ "importPath": "./src/components/table.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Basic"
+ },
+ "components-data-display-table--selected": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-data-display-table--selected",
+ "name": "Selected",
+ "title": "Components/Data & Display/Table",
+ "importPath": "./src/components/table.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Selected"
+ },
+ "components-data-display-table--long-text": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-data-display-table--long-text",
+ "name": "Long Text",
+ "title": "Components/Data & Display/Table",
+ "importPath": "./src/components/table.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "LongText"
+ },
+ "components-data-display-table--overflow": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-data-display-table--overflow",
+ "name": "Horizontal Overflow",
+ "title": "Components/Data & Display/Table",
+ "importPath": "./src/components/table.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Overflow"
+ },
+ "components-data-display-badge--all": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-data-display-badge--all",
+ "name": "Badge",
+ "title": "Components/Data & Display/Badge",
+ "importPath": "./src/components/badge.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "All"
+ },
+ "components-data-display-badge--variants": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-data-display-badge--variants",
+ "name": "Variants",
+ "title": "Components/Data & Display/Badge",
+ "importPath": "./src/components/badge.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Variants"
+ },
+ "components-data-display-badge--playground": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-data-display-badge--playground",
+ "name": "Playground",
+ "title": "Components/Data & Display/Badge",
+ "importPath": "./src/components/badge.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Playground"
+ },
+ "components-data-display-avatar--all": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-data-display-avatar--all",
+ "name": "Avatar",
+ "title": "Components/Data & Display/Avatar",
+ "importPath": "./src/components/avatar.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "All"
+ },
+ "components-data-display-avatar--image": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-data-display-avatar--image",
+ "name": "Image",
+ "title": "Components/Data & Display/Avatar",
+ "importPath": "./src/components/avatar.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Image"
+ },
+ "components-data-display-avatar--fallback-error": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-data-display-avatar--fallback-error",
+ "name": "Fallback",
+ "title": "Components/Data & Display/Avatar",
+ "importPath": "./src/components/avatar.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "FallbackError"
+ },
+ "components-data-display-progress--all": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-data-display-progress--all",
+ "name": "Progress",
+ "title": "Components/Data & Display/Progress",
+ "importPath": "./src/components/progress.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "All"
+ },
+ "components-data-display-progress--zero": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-data-display-progress--zero",
+ "name": "Zero",
+ "title": "Components/Data & Display/Progress",
+ "importPath": "./src/components/progress.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Zero"
+ },
+ "components-data-display-progress--middle": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-data-display-progress--middle",
+ "name": "Middle",
+ "title": "Components/Data & Display/Progress",
+ "importPath": "./src/components/progress.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Middle"
+ },
+ "components-data-display-progress--full": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-data-display-progress--full",
+ "name": "Full",
+ "title": "Components/Data & Display/Progress",
+ "importPath": "./src/components/progress.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Full"
+ },
+ "components-data-display-progress--non-default-max": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-data-display-progress--non-default-max",
+ "name": "Non Default Max",
+ "title": "Components/Data & Display/Progress",
+ "importPath": "./src/components/progress.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification",
+ "play-fn"
+ ],
+ "exportName": "NonDefaultMax"
+ },
+ "components-data-display-skeleton--all": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-data-display-skeleton--all",
+ "name": "Skeleton",
+ "title": "Components/Data & Display/Skeleton",
+ "importPath": "./src/components/skeleton.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "All"
+ },
+ "components-data-display-skeleton--text": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-data-display-skeleton--text",
+ "name": "Text",
+ "title": "Components/Data & Display/Skeleton",
+ "importPath": "./src/components/skeleton.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Text"
+ },
+ "components-data-display-skeleton--card-list": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-data-display-skeleton--card-list",
+ "name": "Card List",
+ "title": "Components/Data & Display/Skeleton",
+ "importPath": "./src/components/skeleton.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "CardList"
+ },
+ "components-data-display-separator--all": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-data-display-separator--all",
+ "name": "Separator",
+ "title": "Components/Data & Display/Separator",
+ "importPath": "./src/components/separator.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "All"
+ },
+ "components-data-display-separator--horizontal": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-data-display-separator--horizontal",
+ "name": "Horizontal",
+ "title": "Components/Data & Display/Separator",
+ "importPath": "./src/components/separator.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Horizontal"
+ },
+ "components-data-display-separator--vertical": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-data-display-separator--vertical",
+ "name": "Vertical",
+ "title": "Components/Data & Display/Separator",
+ "importPath": "./src/components/separator.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Vertical"
+ },
+ "components-data-display-aspect-ratio--all": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-data-display-aspect-ratio--all",
+ "name": "Aspect Ratio",
+ "title": "Components/Data & Display/Aspect Ratio",
+ "importPath": "./src/components/aspect-ratio.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "All"
+ },
+ "components-data-display-aspect-ratio--wide": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-data-display-aspect-ratio--wide",
+ "name": "16:9",
+ "title": "Components/Data & Display/Aspect Ratio",
+ "importPath": "./src/components/aspect-ratio.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Wide"
+ },
+ "components-data-display-aspect-ratio--square": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-data-display-aspect-ratio--square",
+ "name": "1:1",
+ "title": "Components/Data & Display/Aspect Ratio",
+ "importPath": "./src/components/aspect-ratio.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Square"
+ },
+ "components-data-display-carousel--all": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-data-display-carousel--all",
+ "name": "Carousel",
+ "title": "Components/Data & Display/Carousel",
+ "importPath": "./src/components/carousel.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "All"
+ },
+ "components-data-display-carousel--basic-carousel": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-data-display-carousel--basic-carousel",
+ "name": "Basic",
+ "title": "Components/Data & Display/Carousel",
+ "importPath": "./src/components/carousel.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "BasicCarousel"
+ },
+ "components-data-display-carousel--multiple-items": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-data-display-carousel--multiple-items",
+ "name": "Multiple Items",
+ "title": "Components/Data & Display/Carousel",
+ "importPath": "./src/components/carousel.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "MultipleItems"
+ },
+ "components-data-display-carousel--loop-carousel": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-data-display-carousel--loop-carousel",
+ "name": "Loop",
+ "title": "Components/Data & Display/Carousel",
+ "importPath": "./src/components/carousel.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "LoopCarousel"
+ },
+ "components-data-display-carousel--vertical-carousel": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-data-display-carousel--vertical-carousel",
+ "name": "Vertical",
+ "title": "Components/Data & Display/Carousel",
+ "importPath": "./src/components/carousel.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "VerticalCarousel"
+ },
+ "components-data-display-scroll-area--all": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-data-display-scroll-area--all",
+ "name": "Scroll Area",
+ "title": "Components/Data & Display/Scroll Area",
+ "importPath": "./src/components/scroll-area.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "All"
+ },
+ "components-data-display-scroll-area--vertical-scroll": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-data-display-scroll-area--vertical-scroll",
+ "name": "Vertical",
+ "title": "Components/Data & Display/Scroll Area",
+ "importPath": "./src/components/scroll-area.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "VerticalScroll"
+ },
+ "components-data-display-scroll-area--horizontal-scroll": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-data-display-scroll-area--horizontal-scroll",
+ "name": "Horizontal",
+ "title": "Components/Data & Display/Scroll Area",
+ "importPath": "./src/components/scroll-area.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "HorizontalScroll"
+ },
+ "components-disclosure-accordion--all": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-disclosure-accordion--all",
+ "name": "Accordion",
+ "title": "Components/Disclosure/Accordion",
+ "importPath": "./src/components/accordion.stories.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "All"
+ },
+ "components-disclosure-accordion--single": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-disclosure-accordion--single",
+ "name": "Single",
+ "title": "Components/Disclosure/Accordion",
+ "importPath": "./src/components/accordion.stories.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Single"
+ },
+ "components-disclosure-accordion--multiple": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-disclosure-accordion--multiple",
+ "name": "Multiple",
+ "title": "Components/Disclosure/Accordion",
+ "importPath": "./src/components/accordion.stories.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Multiple"
+ },
+ "components-disclosure-accordion--disabled": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-disclosure-accordion--disabled",
+ "name": "Disabled",
+ "title": "Components/Disclosure/Accordion",
+ "importPath": "./src/components/accordion.stories.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Disabled"
+ },
+ "components-disclosure-accordion--long-content": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-disclosure-accordion--long-content",
+ "name": "Long Content",
+ "title": "Components/Disclosure/Accordion",
+ "importPath": "./src/components/accordion.stories.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "LongContent"
+ },
+ "components-disclosure-collapsible--all": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-disclosure-collapsible--all",
+ "name": "Collapsible",
+ "title": "Components/Disclosure/Collapsible",
+ "importPath": "./src/components/collapsible.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "All"
+ },
+ "components-disclosure-collapsible--closed": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-disclosure-collapsible--closed",
+ "name": "Closed",
+ "title": "Components/Disclosure/Collapsible",
+ "importPath": "./src/components/collapsible.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Closed"
+ },
+ "components-disclosure-collapsible--open": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-disclosure-collapsible--open",
+ "name": "Open",
+ "title": "Components/Disclosure/Collapsible",
+ "importPath": "./src/components/collapsible.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Open"
+ },
+ "components-disclosure-collapsible--disabled": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-disclosure-collapsible--disabled",
+ "name": "Disabled",
+ "title": "Components/Disclosure/Collapsible",
+ "importPath": "./src/components/collapsible.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Disabled"
+ },
+ "components-disclosure-collapsible--long-content": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-disclosure-collapsible--long-content",
+ "name": "Long Content",
+ "title": "Components/Disclosure/Collapsible",
+ "importPath": "./src/components/collapsible.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "LongContent"
+ },
+ "components-disclosure-resizable--all": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-disclosure-resizable--all",
+ "name": "Resizable",
+ "title": "Components/Disclosure/Resizable",
+ "importPath": "./src/components/resizable.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "All"
+ },
+ "components-disclosure-resizable--horizontal-layout": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-disclosure-resizable--horizontal-layout",
+ "name": "Horizontal",
+ "title": "Components/Disclosure/Resizable",
+ "importPath": "./src/components/resizable.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "HorizontalLayout"
+ },
+ "components-disclosure-resizable--vertical-layout": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-disclosure-resizable--vertical-layout",
+ "name": "Vertical",
+ "title": "Components/Disclosure/Resizable",
+ "importPath": "./src/components/resizable.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "VerticalLayout"
+ },
+ "components-disclosure-resizable--min-max-layout": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-disclosure-resizable--min-max-layout",
+ "name": "Min Max",
+ "title": "Components/Disclosure/Resizable",
+ "importPath": "./src/components/resizable.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "MinMaxLayout"
+ },
+ "components-search-date-command--all": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-search-date-command--all",
+ "name": "Command",
+ "title": "Components/Search & Date/Command",
+ "importPath": "./src/components/command.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "All"
+ },
+ "components-search-date-command--search": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-search-date-command--search",
+ "name": "Search",
+ "title": "Components/Search & Date/Command",
+ "importPath": "./src/components/command.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Search"
+ },
+ "components-search-date-command--grouped-list": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-search-date-command--grouped-list",
+ "name": "Grouped",
+ "title": "Components/Search & Date/Command",
+ "importPath": "./src/components/command.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "GroupedList"
+ },
+ "components-search-date-combobox--all": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-search-date-combobox--all",
+ "name": "Combobox",
+ "title": "Components/Search & Date/Combobox",
+ "importPath": "./src/components/combobox.stories.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "All"
+ },
+ "components-search-date-combobox--empty-combobox": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-search-date-combobox--empty-combobox",
+ "name": "Empty",
+ "title": "Components/Search & Date/Combobox",
+ "importPath": "./src/components/combobox.stories.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "EmptyCombobox"
+ },
+ "components-search-date-combobox--controlled-combobox": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-search-date-combobox--controlled-combobox",
+ "name": "Controlled",
+ "title": "Components/Search & Date/Combobox",
+ "importPath": "./src/components/combobox.stories.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "ControlledCombobox"
+ },
+ "components-search-date-combobox--long-option": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-search-date-combobox--long-option",
+ "name": "Long Option",
+ "title": "Components/Search & Date/Combobox",
+ "importPath": "./src/components/combobox.stories.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "LongOption"
+ },
+ "components-search-date-combobox--open-bottom": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-search-date-combobox--open-bottom",
+ "name": "Open Bottom",
+ "title": "Components/Search & Date/Combobox",
+ "importPath": "./src/components/combobox.stories.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "OpenBottom"
+ },
+ "components-search-date-combobox--open-top": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-search-date-combobox--open-top",
+ "name": "Open Top",
+ "title": "Components/Search & Date/Combobox",
+ "importPath": "./src/components/combobox.stories.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "OpenTop"
+ },
+ "components-search-date-calendar--all": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-search-date-calendar--all",
+ "name": "Calendar",
+ "title": "Components/Search & Date/Calendar",
+ "importPath": "./src/components/calendar.stories.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "All"
+ },
+ "components-search-date-calendar--single-selection": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-search-date-calendar--single-selection",
+ "name": "Single",
+ "title": "Components/Search & Date/Calendar",
+ "importPath": "./src/components/calendar.stories.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "SingleSelection"
+ },
+ "components-search-date-calendar--disabled-selection": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-search-date-calendar--disabled-selection",
+ "name": "Disabled Dates",
+ "title": "Components/Search & Date/Calendar",
+ "importPath": "./src/components/calendar.stories.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "DisabledSelection"
+ },
+ "components-search-date-calendar--range-selection": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-search-date-calendar--range-selection",
+ "name": "Range",
+ "title": "Components/Search & Date/Calendar",
+ "importPath": "./src/components/calendar.stories.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "RangeSelection"
+ },
+ "components-search-date-date-picker--all": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-search-date-date-picker--all",
+ "name": "Date Picker",
+ "title": "Components/Search & Date/Date Picker",
+ "importPath": "./src/components/date-picker.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "All"
+ },
+ "components-search-date-date-picker--empty-picker": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-search-date-date-picker--empty-picker",
+ "name": "Empty",
+ "title": "Components/Search & Date/Date Picker",
+ "importPath": "./src/components/date-picker.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "EmptyPicker"
+ },
+ "components-search-date-date-picker--invalid-focus": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-search-date-date-picker--invalid-focus",
+ "name": "Invalid Focus",
+ "title": "Components/Search & Date/Date Picker",
+ "importPath": "./src/components/date-picker.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "InvalidFocus"
+ },
+ "components-search-date-date-picker--selected-picker": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-search-date-date-picker--selected-picker",
+ "name": "Selected",
+ "title": "Components/Search & Date/Date Picker",
+ "importPath": "./src/components/date-picker.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "SelectedPicker"
+ },
+ "components-search-date-date-picker--controlled-picker": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-search-date-date-picker--controlled-picker",
+ "name": "Controlled",
+ "title": "Components/Search & Date/Date Picker",
+ "importPath": "./src/components/date-picker.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "ControlledPicker"
+ },
+ "components-feedback-alert--all": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-feedback-alert--all",
+ "name": "Alert",
+ "title": "Components/Feedback/Alert",
+ "importPath": "./src/components/alert.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "All"
+ },
+ "components-feedback-alert--default": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-feedback-alert--default",
+ "name": "Default",
+ "title": "Components/Feedback/Alert",
+ "importPath": "./src/components/alert.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Default"
+ },
+ "components-feedback-alert--destructive": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-feedback-alert--destructive",
+ "name": "Destructive",
+ "title": "Components/Feedback/Alert",
+ "importPath": "./src/components/alert.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Destructive"
+ },
+ "components-feedback-sonner--all": {
+ "type": "story",
+ "subtype": "story",
+ "id": "components-feedback-sonner--all",
+ "name": "Sonner",
+ "title": "Components/Feedback/Sonner",
+ "importPath": "./src/components/sonner.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "All"
+ },
+ "patterns-data-data-table--all": {
+ "type": "story",
+ "subtype": "story",
+ "id": "patterns-data-data-table--all",
+ "name": "Data Table",
+ "title": "Patterns/Data/Data Table",
+ "importPath": "./src/patterns/data-table.stories.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "All"
+ },
+ "patterns-data-data-table--with-filter-bar-story": {
+ "type": "story",
+ "subtype": "story",
+ "id": "patterns-data-data-table--with-filter-bar-story",
+ "name": "With Filter Bar",
+ "title": "Patterns/Data/Data Table",
+ "importPath": "./src/patterns/data-table.stories.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "WithFilterBarStory"
+ },
+ "patterns-data-data-table--loading": {
+ "type": "story",
+ "subtype": "story",
+ "id": "patterns-data-data-table--loading",
+ "name": "Loading",
+ "title": "Patterns/Data/Data Table",
+ "importPath": "./src/patterns/data-table.stories.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Loading"
+ },
+ "patterns-data-data-table--empty": {
+ "type": "story",
+ "subtype": "story",
+ "id": "patterns-data-data-table--empty",
+ "name": "Empty",
+ "title": "Patterns/Data/Data Table",
+ "importPath": "./src/patterns/data-table.stories.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Empty"
+ },
+ "patterns-data-filter-bar--all": {
+ "type": "story",
+ "subtype": "story",
+ "id": "patterns-data-filter-bar--all",
+ "name": "Filter Bar",
+ "title": "Patterns/Data/Filter Bar",
+ "importPath": "./src/patterns/filter-bar.stories.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "All"
+ },
+ "patterns-layout-gnb--all": {
+ "type": "story",
+ "subtype": "story",
+ "id": "patterns-layout-gnb--all",
+ "name": "GNB",
+ "title": "Patterns/Layout/GNB",
+ "importPath": "./src/patterns/gnb.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "All"
+ },
+ "patterns-layout-gnb--default": {
+ "type": "story",
+ "subtype": "story",
+ "id": "patterns-layout-gnb--default",
+ "name": "Default",
+ "title": "Patterns/Layout/GNB",
+ "importPath": "./src/patterns/gnb.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Default"
+ },
+ "patterns-layout-gnb--sticky": {
+ "type": "story",
+ "subtype": "story",
+ "id": "patterns-layout-gnb--sticky",
+ "name": "Sticky",
+ "title": "Patterns/Layout/GNB",
+ "importPath": "./src/patterns/gnb.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Sticky"
+ },
+ "patterns-layout-gnb--sidebar": {
+ "type": "story",
+ "subtype": "story",
+ "id": "patterns-layout-gnb--sidebar",
+ "name": "GNB Sidebar",
+ "title": "Patterns/Layout/GNB",
+ "importPath": "./src/patterns/gnb.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Sidebar"
+ },
+ "patterns-layout-gnb--navigation-menu-open": {
+ "type": "story",
+ "subtype": "story",
+ "id": "patterns-layout-gnb--navigation-menu-open",
+ "name": "Navigation Menu Open",
+ "title": "Patterns/Layout/GNB",
+ "importPath": "./src/patterns/gnb.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "NavigationMenuOpen"
+ },
+ "patterns-layout-gnb--short-depth-open": {
+ "type": "story",
+ "subtype": "story",
+ "id": "patterns-layout-gnb--short-depth-open",
+ "name": "Short Depth Open",
+ "title": "Patterns/Layout/GNB",
+ "importPath": "./src/patterns/gnb.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "ShortDepthOpen"
+ },
+ "patterns-layout-gnb--right-edge-long-depth": {
+ "type": "story",
+ "subtype": "story",
+ "id": "patterns-layout-gnb--right-edge-long-depth",
+ "name": "Right Edge Long Depth",
+ "title": "Patterns/Layout/GNB",
+ "importPath": "./src/patterns/gnb.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "RightEdgeLongDepth"
+ },
+ "patterns-layout-gnb--first-depth-short": {
+ "type": "story",
+ "subtype": "story",
+ "id": "patterns-layout-gnb--first-depth-short",
+ "name": "First Depth Short",
+ "title": "Patterns/Layout/GNB",
+ "importPath": "./src/patterns/gnb.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "FirstDepthShort"
+ },
+ "patterns-layout-gnb--first-depth-long": {
+ "type": "story",
+ "subtype": "story",
+ "id": "patterns-layout-gnb--first-depth-long",
+ "name": "First Depth Long",
+ "title": "Patterns/Layout/GNB",
+ "importPath": "./src/patterns/gnb.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "FirstDepthLong"
+ },
+ "patterns-layout-gnb--middle-depth-short": {
+ "type": "story",
+ "subtype": "story",
+ "id": "patterns-layout-gnb--middle-depth-short",
+ "name": "Middle Depth Short",
+ "title": "Patterns/Layout/GNB",
+ "importPath": "./src/patterns/gnb.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "MiddleDepthShort"
+ },
+ "patterns-layout-gnb--middle-depth-long": {
+ "type": "story",
+ "subtype": "story",
+ "id": "patterns-layout-gnb--middle-depth-long",
+ "name": "Middle Depth Long",
+ "title": "Patterns/Layout/GNB",
+ "importPath": "./src/patterns/gnb.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "MiddleDepthLong"
+ },
+ "patterns-layout-gnb--last-depth-short": {
+ "type": "story",
+ "subtype": "story",
+ "id": "patterns-layout-gnb--last-depth-short",
+ "name": "Last Depth Short",
+ "title": "Patterns/Layout/GNB",
+ "importPath": "./src/patterns/gnb.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "LastDepthShort"
+ },
+ "patterns-layout-gnb--last-depth-long": {
+ "type": "story",
+ "subtype": "story",
+ "id": "patterns-layout-gnb--last-depth-long",
+ "name": "Last Depth Long",
+ "title": "Patterns/Layout/GNB",
+ "importPath": "./src/patterns/gnb.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "LastDepthLong"
+ },
+ "patterns-layout-gnb--edge-first-long": {
+ "type": "story",
+ "subtype": "story",
+ "id": "patterns-layout-gnb--edge-first-long",
+ "name": "Edge First Long",
+ "title": "Patterns/Layout/GNB",
+ "importPath": "./src/patterns/gnb.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "EdgeFirstLong"
+ },
+ "patterns-layout-gnb--edge-last-long": {
+ "type": "story",
+ "subtype": "story",
+ "id": "patterns-layout-gnb--edge-last-long",
+ "name": "Edge Last Long",
+ "title": "Patterns/Layout/GNB",
+ "importPath": "./src/patterns/gnb.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "EdgeLastLong"
+ },
+ "patterns-layout-gnb--user-menu-open": {
+ "type": "story",
+ "subtype": "story",
+ "id": "patterns-layout-gnb--user-menu-open",
+ "name": "User Menu Open",
+ "title": "Patterns/Layout/GNB",
+ "importPath": "./src/patterns/gnb.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "UserMenuOpen"
+ },
+ "patterns-layout-gnb--long-labels": {
+ "type": "story",
+ "subtype": "story",
+ "id": "patterns-layout-gnb--long-labels",
+ "name": "Long Labels",
+ "title": "Patterns/Layout/GNB",
+ "importPath": "./src/patterns/gnb.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "LongLabels"
+ },
+ "patterns-layout-gnb--with-logo": {
+ "type": "story",
+ "subtype": "story",
+ "id": "patterns-layout-gnb--with-logo",
+ "name": "With Logo",
+ "title": "Patterns/Layout/GNB",
+ "importPath": "./src/patterns/gnb.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "WithLogo"
+ },
+ "patterns-layout-gnb--utilities": {
+ "type": "story",
+ "subtype": "story",
+ "id": "patterns-layout-gnb--utilities",
+ "name": "Utilities",
+ "title": "Patterns/Layout/GNB",
+ "importPath": "./src/patterns/gnb.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Utilities"
+ },
+ "patterns-layout-gnb--mobile": {
+ "type": "story",
+ "subtype": "story",
+ "id": "patterns-layout-gnb--mobile",
+ "name": "Mobile",
+ "title": "Patterns/Layout/GNB",
+ "importPath": "./src/patterns/gnb.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Mobile"
+ },
+ "patterns-layout-gnb--mobile-menu-open": {
+ "type": "story",
+ "subtype": "story",
+ "id": "patterns-layout-gnb--mobile-menu-open",
+ "name": "Mobile Menu Open",
+ "title": "Patterns/Layout/GNB",
+ "importPath": "./src/patterns/gnb.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "MobileMenuOpen"
+ },
+ "patterns-layout-lnb--all": {
+ "type": "story",
+ "subtype": "story",
+ "id": "patterns-layout-lnb--all",
+ "name": "LNB",
+ "title": "Patterns/Layout/LNB",
+ "importPath": "./src/patterns/lnb.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "All"
+ },
+ "patterns-layout-lnb--default": {
+ "type": "story",
+ "subtype": "story",
+ "id": "patterns-layout-lnb--default",
+ "name": "Default",
+ "title": "Patterns/Layout/LNB",
+ "importPath": "./src/patterns/lnb.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Default"
+ },
+ "patterns-layout-lnb--selected": {
+ "type": "story",
+ "subtype": "story",
+ "id": "patterns-layout-lnb--selected",
+ "name": "Selected",
+ "title": "Patterns/Layout/LNB",
+ "importPath": "./src/patterns/lnb.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Selected"
+ },
+ "patterns-layout-lnb--expanded": {
+ "type": "story",
+ "subtype": "story",
+ "id": "patterns-layout-lnb--expanded",
+ "name": "Expanded",
+ "title": "Patterns/Layout/LNB",
+ "importPath": "./src/patterns/lnb.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Expanded"
+ },
+ "patterns-layout-lnb--selected-child": {
+ "type": "story",
+ "subtype": "story",
+ "id": "patterns-layout-lnb--selected-child",
+ "name": "Selected Child",
+ "title": "Patterns/Layout/LNB",
+ "importPath": "./src/patterns/lnb.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "SelectedChild"
+ },
+ "patterns-layout-lnb--collapsed-with-selection": {
+ "type": "story",
+ "subtype": "story",
+ "id": "patterns-layout-lnb--collapsed-with-selection",
+ "name": "Collapsed With Selection",
+ "title": "Patterns/Layout/LNB",
+ "importPath": "./src/patterns/lnb.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "CollapsedWithSelection"
+ },
+ "patterns-layout-lnb--with-logo": {
+ "type": "story",
+ "subtype": "story",
+ "id": "patterns-layout-lnb--with-logo",
+ "name": "With Logo",
+ "title": "Patterns/Layout/LNB",
+ "importPath": "./src/patterns/lnb.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "WithLogo"
+ },
+ "patterns-layout-lnb--long-labels": {
+ "type": "story",
+ "subtype": "story",
+ "id": "patterns-layout-lnb--long-labels",
+ "name": "Long Labels",
+ "title": "Patterns/Layout/LNB",
+ "importPath": "./src/patterns/lnb.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "LongLabels"
+ },
+ "patterns-layout-lnb--scroll": {
+ "type": "story",
+ "subtype": "story",
+ "id": "patterns-layout-lnb--scroll",
+ "name": "Scroll",
+ "title": "Patterns/Layout/LNB",
+ "importPath": "./src/patterns/lnb.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Scroll"
+ },
+ "patterns-layout-lnb--third-level": {
+ "type": "story",
+ "subtype": "story",
+ "id": "patterns-layout-lnb--third-level",
+ "name": "Third Level",
+ "title": "Patterns/Layout/LNB",
+ "importPath": "./src/patterns/lnb.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "ThirdLevel"
+ },
+ "patterns-layout-lnb--third-level-long-labels": {
+ "type": "story",
+ "subtype": "story",
+ "id": "patterns-layout-lnb--third-level-long-labels",
+ "name": "Third Level Long Labels",
+ "title": "Patterns/Layout/LNB",
+ "importPath": "./src/patterns/lnb.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "ThirdLevelLongLabels"
+ },
+ "patterns-layout-lnb--third-level-scroll": {
+ "type": "story",
+ "subtype": "story",
+ "id": "patterns-layout-lnb--third-level-scroll",
+ "name": "Third Level Scroll",
+ "title": "Patterns/Layout/LNB",
+ "importPath": "./src/patterns/lnb.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "ThirdLevelScroll"
+ },
+ "patterns-layout-lnb--with-gnb": {
+ "type": "story",
+ "subtype": "story",
+ "id": "patterns-layout-lnb--with-gnb",
+ "name": "VERIFICATION ONLY · GNB + LNB",
+ "title": "Patterns/Layout/LNB",
+ "importPath": "./src/patterns/lnb.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "WithGNB"
+ },
+ "patterns-layout-lnb--standalone-desktop": {
+ "type": "story",
+ "subtype": "story",
+ "id": "patterns-layout-lnb--standalone-desktop",
+ "name": "LNB Standalone Desktop",
+ "title": "Patterns/Layout/LNB",
+ "importPath": "./src/patterns/lnb.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "StandaloneDesktop"
+ },
+ "patterns-layout-lnb--lnb-profile-menu-open": {
+ "type": "story",
+ "subtype": "story",
+ "id": "patterns-layout-lnb--lnb-profile-menu-open",
+ "name": "LNB Profile Menu Open",
+ "title": "Patterns/Layout/LNB",
+ "importPath": "./src/patterns/lnb.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "LNBProfileMenuOpen"
+ },
+ "patterns-layout-lnb--standalone-mobile": {
+ "type": "story",
+ "subtype": "story",
+ "id": "patterns-layout-lnb--standalone-mobile",
+ "name": "LNB Standalone Mobile",
+ "title": "Patterns/Layout/LNB",
+ "importPath": "./src/patterns/lnb.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "StandaloneMobile"
+ },
+ "patterns-layout-lnb--standalone-mobile-menu-open": {
+ "type": "story",
+ "subtype": "story",
+ "id": "patterns-layout-lnb--standalone-mobile-menu-open",
+ "name": "LNB Standalone Mobile Menu Open",
+ "title": "Patterns/Layout/LNB",
+ "importPath": "./src/patterns/lnb.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "StandaloneMobileMenuOpen"
+ },
+ "patterns-layout-loading-screen--all": {
+ "type": "story",
+ "subtype": "story",
+ "id": "patterns-layout-loading-screen--all",
+ "name": "Loading Screen",
+ "title": "Patterns/Layout/Loading Screen",
+ "importPath": "./src/patterns/loading-screen.stories.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "All"
+ },
+ "patterns-layout-loading-screen--inline": {
+ "type": "story",
+ "subtype": "story",
+ "id": "patterns-layout-loading-screen--inline",
+ "name": "Inline",
+ "title": "Patterns/Layout/Loading Screen",
+ "importPath": "./src/patterns/loading-screen.stories.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Inline"
+ },
+ "patterns-layout-dashboard-layout--all": {
+ "type": "story",
+ "subtype": "story",
+ "id": "patterns-layout-dashboard-layout--all",
+ "name": "Dashboard",
+ "title": "Patterns/Layout/Dashboard",
+ "importPath": "./src/patterns/dashboard-layout.stories.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "All"
+ },
+ "patterns-layout-dashboard-layout--with-sidebar": {
+ "type": "story",
+ "subtype": "story",
+ "id": "patterns-layout-dashboard-layout--with-sidebar",
+ "name": "VERIFICATION ONLY — 운영 사용 금지 · Dashboard Header + Sidebar",
+ "title": "Patterns/Layout/Dashboard",
+ "importPath": "./src/patterns/dashboard-layout.stories.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "WithSidebar"
+ },
+ "patterns-layout-dashboard-layout--third-level": {
+ "type": "story",
+ "subtype": "story",
+ "id": "patterns-layout-dashboard-layout--third-level",
+ "name": "VERIFICATION ONLY — 운영 사용 금지 · Third Level",
+ "title": "Patterns/Layout/Dashboard",
+ "importPath": "./src/patterns/dashboard-layout.stories.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "ThirdLevel"
+ },
+ "patterns-layout-dashboard-layout--sidebar-only": {
+ "type": "story",
+ "subtype": "story",
+ "id": "patterns-layout-dashboard-layout--sidebar-only",
+ "name": "VERIFICATION ONLY — 운영 사용 금지 · Dashboard Sidebar",
+ "title": "Patterns/Layout/Dashboard",
+ "importPath": "./src/patterns/dashboard-layout.stories.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "SidebarOnly"
+ },
+ "patterns-layout-dashboard-layout--long-content": {
+ "type": "story",
+ "subtype": "story",
+ "id": "patterns-layout-dashboard-layout--long-content",
+ "name": "VERIFICATION ONLY — 운영 사용 금지 · Long Content",
+ "title": "Patterns/Layout/Dashboard",
+ "importPath": "./src/patterns/dashboard-layout.stories.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "LongContent"
+ },
+ "patterns-layout-dashboard-layout--loading": {
+ "type": "story",
+ "subtype": "story",
+ "id": "patterns-layout-dashboard-layout--loading",
+ "name": "Loading",
+ "title": "Patterns/Layout/Dashboard",
+ "importPath": "./src/patterns/dashboard-layout.stories.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Loading"
+ },
+ "patterns-layout-dashboard-layout--empty": {
+ "type": "story",
+ "subtype": "story",
+ "id": "patterns-layout-dashboard-layout--empty",
+ "name": "Empty",
+ "title": "Patterns/Layout/Dashboard",
+ "importPath": "./src/patterns/dashboard-layout.stories.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Empty"
+ },
+ "patterns-layout-dashboard-layout--framed": {
+ "type": "story",
+ "subtype": "story",
+ "id": "patterns-layout-dashboard-layout--framed",
+ "name": "VERIFICATION ONLY — 운영 사용 금지 · Framed",
+ "title": "Patterns/Layout/Dashboard",
+ "importPath": "./src/patterns/dashboard-layout.stories.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Framed"
+ },
+ "patterns-layout-page-header--all": {
+ "type": "story",
+ "subtype": "story",
+ "id": "patterns-layout-page-header--all",
+ "name": "Page Header",
+ "title": "Patterns/Layout/Page Header",
+ "importPath": "./src/patterns/page-header.stories.tsx",
+ "componentPath": "./packages/ui/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "All"
+ },
+ "orgchart--logo-personnel-summary": {
+ "type": "story",
+ "subtype": "story",
+ "id": "orgchart--logo-personnel-summary",
+ "name": "Overview",
+ "title": "OrgChart/Overview",
+ "importPath": "./src/org-chart/org-chart-p1.stories.tsx",
+ "componentPath": "./src/org-chart/org-chart-page-previews.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "LogoPersonnelSummary"
+ },
+ "orgchart--department-colors": {
+ "type": "story",
+ "subtype": "story",
+ "id": "orgchart--department-colors",
+ "name": "Department Colors",
+ "title": "OrgChart/Department Colors",
+ "importPath": "./src/org-chart/org-chart-department-colors.stories.tsx",
+ "componentPath": "./src/org-chart/org-chart-page-previews.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "DepartmentColors"
+ },
+ "orgchart--full-composition": {
+ "type": "story",
+ "subtype": "story",
+ "id": "orgchart--full-composition",
+ "name": "Full Composition",
+ "title": "OrgChart/Full Composition",
+ "importPath": "./src/org-chart/org-chart-full-composition.stories.tsx",
+ "componentPath": "./src/org-chart/org-chart-page-previews.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "FullComposition"
+ },
+ "orgchart--expanded-org-chart": {
+ "type": "story",
+ "subtype": "story",
+ "id": "orgchart--expanded-org-chart",
+ "name": "Expanded OrgChart",
+ "title": "OrgChart/Expanded OrgChart",
+ "importPath": "./src/org-chart/org-chart-expanded.stories.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "ExpandedOrgChart"
+ },
+ "orgchart-components-cards--business-management": {
+ "type": "story",
+ "subtype": "story",
+ "id": "orgchart-components-cards--business-management",
+ "name": "Business Management",
+ "title": "OrgChart/Components/Cards",
+ "importPath": "./src/org-chart/org-chart-cards.stories.tsx",
+ "componentPath": "./src/org-chart/core-component-preview.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "internal"
+ ],
+ "exportName": "BusinessManagement"
+ },
+ "orgchart-components-cards--business-planning": {
+ "type": "story",
+ "subtype": "story",
+ "id": "orgchart-components-cards--business-planning",
+ "name": "Business Planning",
+ "title": "OrgChart/Components/Cards",
+ "importPath": "./src/org-chart/org-chart-cards.stories.tsx",
+ "componentPath": "./src/org-chart/core-component-preview.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "internal"
+ ],
+ "exportName": "BusinessPlanning"
+ },
+ "orgchart-components-cards--talent-growth": {
+ "type": "story",
+ "subtype": "story",
+ "id": "orgchart-components-cards--talent-growth",
+ "name": "Talent Growth",
+ "title": "OrgChart/Components/Cards",
+ "importPath": "./src/org-chart/org-chart-cards.stories.tsx",
+ "componentPath": "./src/org-chart/core-component-preview.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "internal"
+ ],
+ "exportName": "TalentGrowth"
+ },
+ "orgchart-components-cards--integrated-system": {
+ "type": "story",
+ "subtype": "story",
+ "id": "orgchart-components-cards--integrated-system",
+ "name": "Integrated System",
+ "title": "OrgChart/Components/Cards",
+ "importPath": "./src/org-chart/org-chart-cards.stories.tsx",
+ "componentPath": "./src/org-chart/core-component-preview.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "internal"
+ ],
+ "exportName": "IntegratedSystem"
+ },
+ "orgchart-components-cards--design-planning": {
+ "type": "story",
+ "subtype": "story",
+ "id": "orgchart-components-cards--design-planning",
+ "name": "Design Planning",
+ "title": "OrgChart/Components/Cards",
+ "importPath": "./src/org-chart/org-chart-cards.stories.tsx",
+ "componentPath": "./src/org-chart/core-component-preview.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "internal"
+ ],
+ "exportName": "DesignPlanning"
+ },
+ "orgchart-components-cards--solution-sales": {
+ "type": "story",
+ "subtype": "story",
+ "id": "orgchart-components-cards--solution-sales",
+ "name": "Solution Sales",
+ "title": "OrgChart/Components/Cards",
+ "importPath": "./src/org-chart/org-chart-cards.stories.tsx",
+ "componentPath": "./src/org-chart/core-component-preview.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "internal"
+ ],
+ "exportName": "SolutionSales"
+ },
+ "orgchart-components-cards--top-leader": {
+ "type": "story",
+ "subtype": "story",
+ "id": "orgchart-components-cards--top-leader",
+ "name": "최상위 리더",
+ "title": "OrgChart/Components/Cards",
+ "importPath": "./src/org-chart/org-chart-cards.stories.tsx",
+ "componentPath": "./src/org-chart/core-component-preview.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "internal"
+ ],
+ "exportName": "TopLeader"
+ },
+ "orgchart-components-cards--organization-leader": {
+ "type": "story",
+ "subtype": "story",
+ "id": "orgchart-components-cards--organization-leader",
+ "name": "조직장",
+ "title": "OrgChart/Components/Cards",
+ "importPath": "./src/org-chart/org-chart-cards.stories.tsx",
+ "componentPath": "./src/org-chart/core-component-preview.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "internal"
+ ],
+ "exportName": "OrganizationLeader"
+ },
+ "orgchart-components-cards--employee": {
+ "type": "story",
+ "subtype": "story",
+ "id": "orgchart-components-cards--employee",
+ "name": "일반 직원",
+ "title": "OrgChart/Components/Cards",
+ "importPath": "./src/org-chart/org-chart-cards.stories.tsx",
+ "componentPath": "./src/org-chart/core-component-preview.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "internal"
+ ],
+ "exportName": "Employee"
+ },
+ "orgchart--logo": {
+ "type": "story",
+ "subtype": "story",
+ "id": "orgchart--logo",
+ "name": "Logo",
+ "title": "OrgChart/Verification/Overview",
+ "importPath": "./src/org-chart/org-chart-overview-internal.stories.tsx",
+ "componentPath": "./src/org-chart/core-component-preview.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "internal"
+ ],
+ "exportName": "Logo"
+ },
+ "orgchart--position-summary": {
+ "type": "story",
+ "subtype": "story",
+ "id": "orgchart--position-summary",
+ "name": "Position Summary",
+ "title": "OrgChart/Verification/Overview",
+ "importPath": "./src/org-chart/org-chart-overview-internal.stories.tsx",
+ "componentPath": "./src/org-chart/core-component-preview.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "internal"
+ ],
+ "exportName": "PositionSummary"
+ },
+ "orgchart--affiliation-summary": {
+ "type": "story",
+ "subtype": "story",
+ "id": "orgchart--affiliation-summary",
+ "name": "Affiliation Summary",
+ "title": "OrgChart/Verification/Overview",
+ "importPath": "./src/org-chart/org-chart-overview-internal.stories.tsx",
+ "componentPath": "./src/org-chart/core-component-preview.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "internal"
+ ],
+ "exportName": "AffiliationSummary"
+ },
+ "orgchart-components-summaries--position-summary": {
+ "type": "story",
+ "subtype": "story",
+ "id": "orgchart-components-summaries--position-summary",
+ "name": "Position Summary",
+ "title": "OrgChart/Components/Summaries",
+ "importPath": "./src/org-chart/org-chart-summary.stories.tsx",
+ "componentPath": "./src/org-chart/core-component-preview.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "internal"
+ ],
+ "exportName": "PositionSummary"
+ },
+ "orgchart-components-summaries--affiliation-summary": {
+ "type": "story",
+ "subtype": "story",
+ "id": "orgchart-components-summaries--affiliation-summary",
+ "name": "Affiliation Summary",
+ "title": "OrgChart/Components/Summaries",
+ "importPath": "./src/org-chart/org-chart-summary.stories.tsx",
+ "componentPath": "./src/org-chart/core-component-preview.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "internal"
+ ],
+ "exportName": "AffiliationSummary"
+ },
+ "orgchart-components-summaries--status-summary": {
+ "type": "story",
+ "subtype": "story",
+ "id": "orgchart-components-summaries--status-summary",
+ "name": "Status Summary",
+ "title": "OrgChart/Components/Summaries",
+ "importPath": "./src/org-chart/org-chart-summary.stories.tsx",
+ "componentPath": "./src/org-chart/core-component-preview.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "internal"
+ ],
+ "exportName": "StatusSummary"
+ },
+ "orgchart-content--basic-organization": {
+ "type": "story",
+ "subtype": "story",
+ "id": "orgchart-content--basic-organization",
+ "name": "Basic Organization",
+ "title": "OrgChart/Content",
+ "importPath": "./src/org-chart/org-chart.stories.tsx",
+ "componentPath": "./packages/org-chart-react/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "internal"
+ ],
+ "exportName": "BasicOrganization"
+ },
+ "orgchart-content--organization-hierarchy": {
+ "type": "story",
+ "subtype": "story",
+ "id": "orgchart-content--organization-hierarchy",
+ "name": "Organization Hierarchy",
+ "title": "OrgChart/Content",
+ "importPath": "./src/org-chart/org-chart.stories.tsx",
+ "componentPath": "./packages/org-chart-react/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "internal"
+ ],
+ "exportName": "OrganizationHierarchy"
+ },
+ "orgchart-content--employee-cards": {
+ "type": "story",
+ "subtype": "story",
+ "id": "orgchart-content--employee-cards",
+ "name": "Employee Cards",
+ "title": "OrgChart/Content",
+ "importPath": "./src/org-chart/org-chart.stories.tsx",
+ "componentPath": "./packages/org-chart-react/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "internal"
+ ],
+ "exportName": "EmployeeCards"
+ },
+ "orgchart-content--organization-summary": {
+ "type": "story",
+ "subtype": "story",
+ "id": "orgchart-content--organization-summary",
+ "name": "Organization Summary",
+ "title": "OrgChart/Content",
+ "importPath": "./src/org-chart/org-chart.stories.tsx",
+ "componentPath": "./packages/org-chart-react/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "internal"
+ ],
+ "exportName": "OrganizationSummary"
+ },
+ "orgchart-content--json-data-update": {
+ "type": "story",
+ "subtype": "story",
+ "id": "orgchart-content--json-data-update",
+ "name": "JSON Data Update",
+ "title": "OrgChart/Content",
+ "importPath": "./src/org-chart/org-chart.stories.tsx",
+ "componentPath": "./packages/org-chart-react/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "internal"
+ ],
+ "exportName": "JSONDataUpdate"
+ },
+ "orgchart-content--loading-empty-error": {
+ "type": "story",
+ "subtype": "story",
+ "id": "orgchart-content--loading-empty-error",
+ "name": "Loading / Empty / Error",
+ "title": "OrgChart/Content",
+ "importPath": "./src/org-chart/org-chart.stories.tsx",
+ "componentPath": "./packages/org-chart-react/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "internal"
+ ],
+ "exportName": "LoadingEmptyError"
+ },
+ "orgchart-content--responsive-container": {
+ "type": "story",
+ "subtype": "story",
+ "id": "orgchart-content--responsive-container",
+ "name": "Responsive Container",
+ "title": "OrgChart/Content",
+ "importPath": "./src/org-chart/org-chart.stories.tsx",
+ "componentPath": "./packages/org-chart-react/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "internal"
+ ],
+ "exportName": "ResponsiveContainer"
+ },
+ "orgchart-content--multiple-instances": {
+ "type": "story",
+ "subtype": "story",
+ "id": "orgchart-content--multiple-instances",
+ "name": "Multiple Instances",
+ "title": "OrgChart/Content",
+ "importPath": "./src/org-chart/org-chart.stories.tsx",
+ "componentPath": "./packages/org-chart-react/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "internal"
+ ],
+ "exportName": "MultipleInstances"
+ },
+ "center-graphic-facility--tunnel": {
+ "type": "story",
+ "subtype": "story",
+ "id": "center-graphic-facility--tunnel",
+ "name": "Tunnel",
+ "title": "Center Graphic/Facility",
+ "importPath": "./src/center/center-facility.stories.tsx",
+ "componentPath": "./packages/center-graphic/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "Tunnel"
+ },
+ "center-graphic-facility--bridge": {
+ "type": "story",
+ "subtype": "story",
+ "id": "center-graphic-facility--bridge",
+ "name": "Bridge",
+ "title": "Center Graphic/Facility",
+ "importPath": "./src/center/center-facility.stories.tsx",
+ "componentPath": "./packages/center-graphic/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "Bridge"
+ },
+ "center-graphic-facility--intersection": {
+ "type": "story",
+ "subtype": "story",
+ "id": "center-graphic-facility--intersection",
+ "name": "Intersection",
+ "title": "Center Graphic/Facility",
+ "importPath": "./src/center/center-facility.stories.tsx",
+ "componentPath": "./packages/center-graphic/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "Intersection"
+ },
+ "center-graphic-facility--junction": {
+ "type": "story",
+ "subtype": "story",
+ "id": "center-graphic-facility--junction",
+ "name": "Junction",
+ "title": "Center Graphic/Facility",
+ "importPath": "./src/center/center-facility.stories.tsx",
+ "componentPath": "./packages/center-graphic/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "Junction"
+ },
+ "center-graphic-facility--interchange": {
+ "type": "story",
+ "subtype": "story",
+ "id": "center-graphic-facility--interchange",
+ "name": "Interchange",
+ "title": "Center Graphic/Facility",
+ "importPath": "./src/center/center-facility.stories.tsx",
+ "componentPath": "./packages/center-graphic/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "Interchange"
+ },
+ "center-graphic-facility--roadside": {
+ "type": "story",
+ "subtype": "story",
+ "id": "center-graphic-facility--roadside",
+ "name": "Roadside",
+ "title": "Center Graphic/Facility",
+ "importPath": "./src/center/center-facility.stories.tsx",
+ "componentPath": "./packages/center-graphic/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "Roadside"
+ },
+ "center-graphic-facility--linked": {
+ "type": "story",
+ "subtype": "story",
+ "id": "center-graphic-facility--linked",
+ "name": "Linked",
+ "title": "Center Graphic/Facility",
+ "importPath": "./src/center/center-facility.stories.tsx",
+ "componentPath": "./packages/center-graphic/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "Linked"
+ },
+ "center-graphic-facility--tunnel-playground": {
+ "type": "story",
+ "subtype": "story",
+ "id": "center-graphic-facility--tunnel-playground",
+ "name": "직접 테스트 (터널)",
+ "title": "Center Graphic/Facility",
+ "importPath": "./src/center/center-facility.stories.tsx",
+ "componentPath": "./packages/center-graphic/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "TunnelPlayground"
+ },
+ "center-graphic-information--information": {
+ "type": "story",
+ "subtype": "story",
+ "id": "center-graphic-information--information",
+ "name": "Information",
+ "title": "Center Graphic/Information",
+ "importPath": "./src/center/center-information.stories.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "Information"
+ },
+ "center-graphic-overview--overview": {
+ "type": "story",
+ "subtype": "story",
+ "id": "center-graphic-overview--overview",
+ "name": "Overview",
+ "title": "Center Graphic/Overview",
+ "importPath": "./src/center/center-overview.stories.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "Overview"
+ },
+ "center-graphic-spatial--spatial": {
+ "type": "story",
+ "subtype": "story",
+ "id": "center-graphic-spatial--spatial",
+ "name": "Spatial",
+ "title": "Center Graphic/Spatial",
+ "importPath": "./src/center/center-spatial.stories.tsx",
+ "componentPath": "./packages/center-graphic/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "Spatial"
+ },
+ "center-graphic-title--compositions": {
+ "type": "story",
+ "subtype": "story",
+ "id": "center-graphic-title--compositions",
+ "name": "Title",
+ "title": "Center Graphic/Title",
+ "importPath": "./src/center/center-title.stories.tsx",
+ "componentPath": "./packages/center-graphic/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "Compositions"
+ },
+ "center-graphic-title--playground": {
+ "type": "story",
+ "subtype": "story",
+ "id": "center-graphic-title--playground",
+ "name": "Playground",
+ "title": "Center Graphic/Title",
+ "importPath": "./src/center/center-title.stories.tsx",
+ "componentPath": "./packages/center-graphic/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Playground"
+ },
+ "verification-publisher-regression--consumers-regression": {
+ "type": "story",
+ "subtype": "story",
+ "id": "verification-publisher-regression--consumers-regression",
+ "name": "Consumers Regression",
+ "title": "Verification/Publisher Regression",
+ "importPath": "./src/components/publisher-regression.stories.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification",
+ "play-fn"
+ ],
+ "exportName": "ConsumersRegression"
+ },
+ "sw-header--composed-controls": {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--composed-controls",
+ "name": "Dropdown",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header-dropdown.stories.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "ComposedControls"
+ },
+ "sw-header--detail-buttons": {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--detail-buttons",
+ "name": "Detail Buttons (Shared States)",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "DetailButtons"
+ },
+ "sw-header--overview": {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--overview",
+ "name": "Overview",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "Overview"
+ },
+ "sw-header--interactive-states": {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--interactive-states",
+ "name": "Interactive States",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "InteractiveStates"
+ },
+ "sw-header--window-move-motion": {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--window-move-motion",
+ "name": "Window Move Motion",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "WindowMoveMotion"
+ },
+ "sw-header--logo-slot": {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--logo-slot",
+ "name": "Logo Slot",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "LogoSlot"
+ },
+ "sw-header--document-dropdown": {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--document-dropdown",
+ "name": "Document Dropdown",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "DocumentDropdown"
+ },
+ "sw-header--responsive-more": {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--responsive-more",
+ "name": "Responsive More",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "ResponsiveMore"
+ },
+ "sw-header--k-guide": {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--k-guide",
+ "name": "K Guide",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "KGuide"
+ },
+ "sw-header--property-panel-compare": {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--property-panel-compare",
+ "name": "Property Panel · 4개 비교",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "PropertyPanelCompare"
+ },
+ "theme-designer-playground--editor": {
+ "type": "story",
+ "subtype": "story",
+ "id": "theme-designer-playground--editor",
+ "name": "Designer Playground",
+ "title": "Theme/Designer Playground",
+ "importPath": "./src/theme/designer-theme.stories.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "internal"
+ ],
+ "exportName": "Editor"
+ },
+ "theme-designer-playground--live-verification": {
+ "type": "story",
+ "subtype": "story",
+ "id": "theme-designer-playground--live-verification",
+ "name": "Live Verification",
+ "title": "Theme/Designer Playground",
+ "importPath": "./src/theme/designer-theme.stories.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "internal",
+ "verification",
+ "play-fn"
+ ],
+ "exportName": "LiveVerification"
+ },
+ "theme-runtime-contract--comparison": {
+ "type": "story",
+ "subtype": "story",
+ "id": "theme-runtime-contract--comparison",
+ "name": "Comparison",
+ "title": "Theme/Runtime Contract",
+ "importPath": "./src/theme/runtime-theme.stories.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Comparison"
+ },
+ "theme-runtime-contract--global-external": {
+ "type": "story",
+ "subtype": "story",
+ "id": "theme-runtime-contract--global-external",
+ "name": "Global External",
+ "title": "Theme/Runtime Contract",
+ "importPath": "./src/theme/runtime-theme.stories.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "GlobalExternal"
+ },
+ "theme-runtime-contract--verification": {
+ "type": "story",
+ "subtype": "story",
+ "id": "theme-runtime-contract--verification",
+ "name": "Verification",
+ "title": "Theme/Runtime Contract",
+ "importPath": "./src/theme/runtime-theme.stories.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification",
+ "play-fn"
+ ],
+ "exportName": "Verification"
+ },
+ "theme-runtime-contract--dashboard": {
+ "type": "story",
+ "subtype": "story",
+ "id": "theme-runtime-contract--dashboard",
+ "name": "Dashboard",
+ "title": "Theme/Runtime Contract",
+ "importPath": "./src/theme/runtime-theme.stories.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "Dashboard"
+ },
+ "theme-runtime-contract-loader--cdn-verification": {
+ "type": "story",
+ "subtype": "story",
+ "id": "theme-runtime-contract-loader--cdn-verification",
+ "name": "Cdn Verification",
+ "title": "Theme/Runtime Contract/Loader",
+ "importPath": "./src/theme/runtime-loader.stories.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification",
+ "play-fn"
+ ],
+ "exportName": "CdnVerification"
+ }
+ }
+}
diff --git a/docs/sw/integrated-improvement-qa/baseline-dropdown-consolidation/composed-1280.png b/docs/sw/integrated-improvement-qa/baseline-dropdown-consolidation/composed-1280.png
new file mode 100644
index 0000000..37ed59f
Binary files /dev/null and b/docs/sw/integrated-improvement-qa/baseline-dropdown-consolidation/composed-1280.png differ
diff --git a/docs/sw/integrated-improvement-qa/baseline-dropdown-consolidation/composed-1440.png b/docs/sw/integrated-improvement-qa/baseline-dropdown-consolidation/composed-1440.png
new file mode 100644
index 0000000..074dc19
Binary files /dev/null and b/docs/sw/integrated-improvement-qa/baseline-dropdown-consolidation/composed-1440.png differ
diff --git a/docs/sw/integrated-improvement-qa/baseline-dropdown-consolidation/composed-390.png b/docs/sw/integrated-improvement-qa/baseline-dropdown-consolidation/composed-390.png
new file mode 100644
index 0000000..dc36845
Binary files /dev/null and b/docs/sw/integrated-improvement-qa/baseline-dropdown-consolidation/composed-390.png differ
diff --git a/docs/sw/integrated-improvement-qa/baseline-dropdown-consolidation/composed-768.png b/docs/sw/integrated-improvement-qa/baseline-dropdown-consolidation/composed-768.png
new file mode 100644
index 0000000..1c567ce
Binary files /dev/null and b/docs/sw/integrated-improvement-qa/baseline-dropdown-consolidation/composed-768.png differ
diff --git a/docs/sw/integrated-improvement-qa/baseline-dropdown-consolidation/composed-manager.png b/docs/sw/integrated-improvement-qa/baseline-dropdown-consolidation/composed-manager.png
new file mode 100644
index 0000000..ed8a4a3
Binary files /dev/null and b/docs/sw/integrated-improvement-qa/baseline-dropdown-consolidation/composed-manager.png differ
diff --git a/docs/sw/integrated-improvement-qa/baseline-dropdown-consolidation/composed-property-panel-390.png b/docs/sw/integrated-improvement-qa/baseline-dropdown-consolidation/composed-property-panel-390.png
new file mode 100644
index 0000000..d89d661
Binary files /dev/null and b/docs/sw/integrated-improvement-qa/baseline-dropdown-consolidation/composed-property-panel-390.png differ
diff --git a/docs/sw/integrated-improvement-qa/baseline-dropdown-consolidation/composed-property-panel.png b/docs/sw/integrated-improvement-qa/baseline-dropdown-consolidation/composed-property-panel.png
new file mode 100644
index 0000000..cd9ea5b
Binary files /dev/null and b/docs/sw/integrated-improvement-qa/baseline-dropdown-consolidation/composed-property-panel.png differ
diff --git a/docs/sw/integrated-improvement-qa/baseline-dropdown-consolidation/overlay-0-1440.png b/docs/sw/integrated-improvement-qa/baseline-dropdown-consolidation/overlay-0-1440.png
new file mode 100644
index 0000000..5f45607
Binary files /dev/null and b/docs/sw/integrated-improvement-qa/baseline-dropdown-consolidation/overlay-0-1440.png differ
diff --git a/docs/sw/integrated-improvement-qa/baseline-dropdown-consolidation/overlay-0-390.png b/docs/sw/integrated-improvement-qa/baseline-dropdown-consolidation/overlay-0-390.png
new file mode 100644
index 0000000..36e8300
Binary files /dev/null and b/docs/sw/integrated-improvement-qa/baseline-dropdown-consolidation/overlay-0-390.png differ
diff --git a/docs/sw/integrated-improvement-qa/baseline-dropdown-consolidation/overlay-1-1440.png b/docs/sw/integrated-improvement-qa/baseline-dropdown-consolidation/overlay-1-1440.png
new file mode 100644
index 0000000..f3dd8c3
Binary files /dev/null and b/docs/sw/integrated-improvement-qa/baseline-dropdown-consolidation/overlay-1-1440.png differ
diff --git a/docs/sw/integrated-improvement-qa/baseline-dropdown-consolidation/overlay-1-390.png b/docs/sw/integrated-improvement-qa/baseline-dropdown-consolidation/overlay-1-390.png
new file mode 100644
index 0000000..701ea9e
Binary files /dev/null and b/docs/sw/integrated-improvement-qa/baseline-dropdown-consolidation/overlay-1-390.png differ
diff --git a/docs/sw/integrated-improvement-qa/baseline-dropdown-consolidation/overlay-2-1440.png b/docs/sw/integrated-improvement-qa/baseline-dropdown-consolidation/overlay-2-1440.png
new file mode 100644
index 0000000..29330b6
Binary files /dev/null and b/docs/sw/integrated-improvement-qa/baseline-dropdown-consolidation/overlay-2-1440.png differ
diff --git a/docs/sw/integrated-improvement-qa/baseline-dropdown-consolidation/overlay-2-390.png b/docs/sw/integrated-improvement-qa/baseline-dropdown-consolidation/overlay-2-390.png
new file mode 100644
index 0000000..9027973
Binary files /dev/null and b/docs/sw/integrated-improvement-qa/baseline-dropdown-consolidation/overlay-2-390.png differ
diff --git a/docs/sw/integrated-improvement-qa/baseline-dropdown-consolidation/overlay-3-1440.png b/docs/sw/integrated-improvement-qa/baseline-dropdown-consolidation/overlay-3-1440.png
new file mode 100644
index 0000000..fa54908
Binary files /dev/null and b/docs/sw/integrated-improvement-qa/baseline-dropdown-consolidation/overlay-3-1440.png differ
diff --git a/docs/sw/integrated-improvement-qa/baseline-dropdown-consolidation/overlay-3-390.png b/docs/sw/integrated-improvement-qa/baseline-dropdown-consolidation/overlay-3-390.png
new file mode 100644
index 0000000..9470a10
Binary files /dev/null and b/docs/sw/integrated-improvement-qa/baseline-dropdown-consolidation/overlay-3-390.png differ
diff --git a/docs/sw/integrated-improvement-qa/baseline-dropdown-consolidation/overlay-4-1440.png b/docs/sw/integrated-improvement-qa/baseline-dropdown-consolidation/overlay-4-1440.png
new file mode 100644
index 0000000..b6dc805
Binary files /dev/null and b/docs/sw/integrated-improvement-qa/baseline-dropdown-consolidation/overlay-4-1440.png differ
diff --git a/docs/sw/integrated-improvement-qa/baseline-dropdown-consolidation/overlay-4-390.png b/docs/sw/integrated-improvement-qa/baseline-dropdown-consolidation/overlay-4-390.png
new file mode 100644
index 0000000..d8075e0
Binary files /dev/null and b/docs/sw/integrated-improvement-qa/baseline-dropdown-consolidation/overlay-4-390.png differ
diff --git a/docs/sw/integrated-improvement-qa/baseline-dropdown-consolidation/result.json b/docs/sw/integrated-improvement-qa/baseline-dropdown-consolidation/result.json
new file mode 100644
index 0000000..b55e231
--- /dev/null
+++ b/docs/sw/integrated-improvement-qa/baseline-dropdown-consolidation/result.json
@@ -0,0 +1,1705 @@
+{
+ "baseCommit": "c165753bbe24de6581c66704bde4ba3246049ec2",
+ "checks": [
+ {
+ "name": "28 -> 24 SW Stories, exactly four approved Dropdown retirements",
+ "status": "FAIL"
+ },
+ {
+ "name": "Dropdown is one Story directly under Header with original ID, no Dropdown folder",
+ "status": "PASS"
+ },
+ {
+ "name": "menu correction keeps all 24 IDs; only composed Story name/title change",
+ "status": "FAIL"
+ },
+ {
+ "name": "all non-SW index entries identical",
+ "status": "PASS"
+ },
+ {
+ "name": "all retained declarations identical outside imports, meta and ComposedDemo",
+ "status": "FAIL"
+ },
+ {
+ "name": "runtime, API, AI template, Overview, existing CSS/assets and Storybook configuration untouched",
+ "status": "FAIL"
+ },
+ {
+ "name": "render sw-header--composed-controls",
+ "status": "PASS"
+ },
+ {
+ "name": "render sw-header--detail-buttons",
+ "status": "PASS"
+ },
+ {
+ "name": "render sw-header--overview",
+ "status": "PASS"
+ },
+ {
+ "name": "render sw-header--interactive-states",
+ "status": "PASS"
+ },
+ {
+ "name": "render sw-header--window-move-motion",
+ "status": "PASS"
+ },
+ {
+ "name": "render sw-header--logo-slot",
+ "status": "PASS"
+ },
+ {
+ "name": "render sw-header--document-dropdown",
+ "status": "PASS"
+ },
+ {
+ "name": "render sw-header--responsive-more",
+ "status": "PASS"
+ },
+ {
+ "name": "render sw-header--k-guide",
+ "status": "PASS"
+ },
+ {
+ "name": "render sw-header--property-panel-compare",
+ "status": "PASS"
+ },
+ {
+ "name": "Dropdown page contains the Composed Controls group",
+ "status": "PASS"
+ },
+ {
+ "name": "one copy of five Dropdown fields and the details group",
+ "status": "PASS"
+ },
+ {
+ "name": "composition wraps without page overflow or scaling at 390",
+ "status": "PASS",
+ "data": {
+ "overflow": 0,
+ "fields": [
+ {
+ "width": 234,
+ "height": 38
+ },
+ {
+ "width": 192,
+ "height": 38
+ },
+ {
+ "width": 284,
+ "height": 38
+ },
+ {
+ "width": 164,
+ "height": 38
+ },
+ {
+ "width": 164,
+ "height": 38
+ }
+ ]
+ }
+ },
+ {
+ "name": "레이어 Hover does not open at 390",
+ "status": "PASS"
+ },
+ {
+ "name": "레이어 overlay in viewport, not clipped or covered at 390",
+ "status": "PASS",
+ "data": {
+ "x": 24,
+ "y": 364.5,
+ "w": 234,
+ "h": 280,
+ "right": 258,
+ "bottom": 644.5,
+ "hit": true
+ }
+ },
+ {
+ "name": "레이어 selected and expanded at 390",
+ "status": "PASS"
+ },
+ {
+ "name": "레이어 Escape closes and restores focus at 390",
+ "status": "PASS"
+ },
+ {
+ "name": "레이어 trigger toggles closed at 390",
+ "status": "PASS"
+ },
+ {
+ "name": "레이어 outside click closes at 390",
+ "status": "PASS"
+ },
+ {
+ "name": "색상 Hover does not open at 390",
+ "status": "PASS"
+ },
+ {
+ "name": "색상 overlay in viewport, not clipped or covered at 390",
+ "status": "PASS",
+ "data": {
+ "x": 24,
+ "y": 406.5,
+ "w": 192,
+ "h": 182,
+ "right": 216,
+ "bottom": 588.5,
+ "hit": true
+ }
+ },
+ {
+ "name": "색상 selected and expanded at 390",
+ "status": "PASS"
+ },
+ {
+ "name": "색상 Escape closes and restores focus at 390",
+ "status": "PASS"
+ },
+ {
+ "name": "색상 trigger toggles closed at 390",
+ "status": "PASS"
+ },
+ {
+ "name": "색상 outside click closes at 390",
+ "status": "PASS"
+ },
+ {
+ "name": "선스타일 Hover does not open at 390",
+ "status": "PASS"
+ },
+ {
+ "name": "선스타일 overlay in viewport, not clipped or covered at 390",
+ "status": "PASS",
+ "data": {
+ "x": 1,
+ "y": 447.5,
+ "w": 388,
+ "h": 192,
+ "right": 389,
+ "bottom": 639.5,
+ "hit": true
+ }
+ },
+ {
+ "name": "선스타일 selected and expanded at 390",
+ "status": "PASS"
+ },
+ {
+ "name": "선스타일 Escape closes and restores focus at 390",
+ "status": "PASS"
+ },
+ {
+ "name": "선스타일 trigger toggles closed at 390",
+ "status": "PASS"
+ },
+ {
+ "name": "선스타일 outside click closes at 390",
+ "status": "PASS"
+ },
+ {
+ "name": "문자스타일 Hover does not open at 390",
+ "status": "PASS"
+ },
+ {
+ "name": "문자스타일 overlay in viewport, not clipped or covered at 390",
+ "status": "PASS",
+ "data": {
+ "x": 24,
+ "y": 490.5,
+ "w": 164,
+ "h": 100,
+ "right": 188,
+ "bottom": 590.5,
+ "hit": true
+ }
+ },
+ {
+ "name": "문자스타일 selected and expanded at 390",
+ "status": "PASS"
+ },
+ {
+ "name": "문자스타일 Escape closes and restores focus at 390",
+ "status": "PASS"
+ },
+ {
+ "name": "문자스타일 trigger toggles closed at 390",
+ "status": "PASS"
+ },
+ {
+ "name": "문자스타일 outside click closes at 390",
+ "status": "PASS"
+ },
+ {
+ "name": "치수스타일 Hover does not open at 390",
+ "status": "PASS"
+ },
+ {
+ "name": "치수스타일 overlay in viewport, not clipped or covered at 390",
+ "status": "PASS",
+ "data": {
+ "x": 192,
+ "y": 490.5,
+ "w": 164,
+ "h": 100,
+ "right": 356,
+ "bottom": 590.5,
+ "hit": true
+ }
+ },
+ {
+ "name": "치수스타일 selected and expanded at 390",
+ "status": "PASS"
+ },
+ {
+ "name": "치수스타일 Escape closes and restores focus at 390",
+ "status": "PASS"
+ },
+ {
+ "name": "치수스타일 trigger toggles closed at 390",
+ "status": "PASS"
+ },
+ {
+ "name": "치수스타일 outside click closes at 390",
+ "status": "PASS"
+ },
+ {
+ "name": "composition wraps without page overflow or scaling at 768",
+ "status": "PASS",
+ "data": {
+ "overflow": 0,
+ "fields": [
+ {
+ "width": 234,
+ "height": 38
+ },
+ {
+ "width": 192,
+ "height": 38
+ },
+ {
+ "width": 284,
+ "height": 38
+ },
+ {
+ "width": 164,
+ "height": 38
+ },
+ {
+ "width": 164,
+ "height": 38
+ }
+ ]
+ }
+ },
+ {
+ "name": "레이어 Hover does not open at 768",
+ "status": "PASS"
+ },
+ {
+ "name": "레이어 overlay in viewport, not clipped or covered at 768",
+ "status": "PASS",
+ "data": {
+ "x": 31.046875,
+ "y": 331.53125,
+ "w": 234,
+ "h": 280,
+ "right": 265.046875,
+ "bottom": 611.53125,
+ "hit": true
+ }
+ },
+ {
+ "name": "레이어 selected and expanded at 768",
+ "status": "PASS"
+ },
+ {
+ "name": "레이어 Escape closes and restores focus at 768",
+ "status": "PASS"
+ },
+ {
+ "name": "레이어 trigger toggles closed at 768",
+ "status": "PASS"
+ },
+ {
+ "name": "레이어 outside click closes at 768",
+ "status": "PASS"
+ },
+ {
+ "name": "색상 Hover does not open at 768",
+ "status": "PASS"
+ },
+ {
+ "name": "색상 overlay in viewport, not clipped or covered at 768",
+ "status": "PASS",
+ "data": {
+ "x": 269.046875,
+ "y": 331.53125,
+ "w": 192,
+ "h": 182,
+ "right": 461.046875,
+ "bottom": 513.53125,
+ "hit": true
+ }
+ },
+ {
+ "name": "색상 selected and expanded at 768",
+ "status": "PASS"
+ },
+ {
+ "name": "색상 Escape closes and restores focus at 768",
+ "status": "PASS"
+ },
+ {
+ "name": "색상 trigger toggles closed at 768",
+ "status": "PASS"
+ },
+ {
+ "name": "색상 outside click closes at 768",
+ "status": "PASS"
+ },
+ {
+ "name": "선스타일 Hover does not open at 768",
+ "status": "PASS"
+ },
+ {
+ "name": "선스타일 overlay in viewport, not clipped or covered at 768",
+ "status": "PASS",
+ "data": {
+ "x": 1.046875,
+ "y": 372.53125,
+ "w": 473.1875,
+ "h": 192,
+ "right": 474.234375,
+ "bottom": 564.53125,
+ "hit": true
+ }
+ },
+ {
+ "name": "선스타일 selected and expanded at 768",
+ "status": "PASS"
+ },
+ {
+ "name": "선스타일 Escape closes and restores focus at 768",
+ "status": "PASS"
+ },
+ {
+ "name": "선스타일 trigger toggles closed at 768",
+ "status": "PASS"
+ },
+ {
+ "name": "선스타일 outside click closes at 768",
+ "status": "PASS"
+ },
+ {
+ "name": "문자스타일 Hover does not open at 768",
+ "status": "PASS"
+ },
+ {
+ "name": "문자스타일 overlay in viewport, not clipped or covered at 768",
+ "status": "PASS",
+ "data": {
+ "x": 319.046875,
+ "y": 373.53125,
+ "w": 164,
+ "h": 100,
+ "right": 483.046875,
+ "bottom": 473.53125,
+ "hit": true
+ }
+ },
+ {
+ "name": "문자스타일 selected and expanded at 768",
+ "status": "PASS"
+ },
+ {
+ "name": "문자스타일 Escape closes and restores focus at 768",
+ "status": "PASS"
+ },
+ {
+ "name": "문자스타일 trigger toggles closed at 768",
+ "status": "PASS"
+ },
+ {
+ "name": "문자스타일 outside click closes at 768",
+ "status": "PASS"
+ },
+ {
+ "name": "치수스타일 Hover does not open at 768",
+ "status": "PASS"
+ },
+ {
+ "name": "치수스타일 overlay in viewport, not clipped or covered at 768",
+ "status": "PASS",
+ "data": {
+ "x": 487.046875,
+ "y": 373.53125,
+ "w": 164,
+ "h": 100,
+ "right": 651.046875,
+ "bottom": 473.53125,
+ "hit": true
+ }
+ },
+ {
+ "name": "치수스타일 selected and expanded at 768",
+ "status": "PASS"
+ },
+ {
+ "name": "치수스타일 Escape closes and restores focus at 768",
+ "status": "PASS"
+ },
+ {
+ "name": "치수스타일 trigger toggles closed at 768",
+ "status": "PASS"
+ },
+ {
+ "name": "치수스타일 outside click closes at 768",
+ "status": "PASS"
+ },
+ {
+ "name": "composition wraps without page overflow or scaling at 1280",
+ "status": "PASS",
+ "data": {
+ "overflow": 0,
+ "fields": [
+ {
+ "width": 234,
+ "height": 38
+ },
+ {
+ "width": 192,
+ "height": 38
+ },
+ {
+ "width": 284,
+ "height": 38
+ },
+ {
+ "width": 164,
+ "height": 38
+ },
+ {
+ "width": 164,
+ "height": 38
+ }
+ ]
+ }
+ },
+ {
+ "name": "레이어 Hover does not open at 1280",
+ "status": "PASS"
+ },
+ {
+ "name": "레이어 overlay in viewport, not clipped or covered at 1280",
+ "status": "PASS",
+ "data": {
+ "x": 46.40625,
+ "y": 326.890625,
+ "w": 234,
+ "h": 280,
+ "right": 280.40625,
+ "bottom": 606.890625,
+ "hit": true
+ }
+ },
+ {
+ "name": "레이어 selected and expanded at 1280",
+ "status": "PASS"
+ },
+ {
+ "name": "레이어 Escape closes and restores focus at 1280",
+ "status": "PASS"
+ },
+ {
+ "name": "레이어 trigger toggles closed at 1280",
+ "status": "PASS"
+ },
+ {
+ "name": "레이어 outside click closes at 1280",
+ "status": "PASS"
+ },
+ {
+ "name": "색상 Hover does not open at 1280",
+ "status": "PASS"
+ },
+ {
+ "name": "색상 overlay in viewport, not clipped or covered at 1280",
+ "status": "PASS",
+ "data": {
+ "x": 284.40625,
+ "y": 326.890625,
+ "w": 192,
+ "h": 182,
+ "right": 476.40625,
+ "bottom": 508.890625,
+ "hit": true
+ }
+ },
+ {
+ "name": "색상 selected and expanded at 1280",
+ "status": "PASS"
+ },
+ {
+ "name": "색상 Escape closes and restores focus at 1280",
+ "status": "PASS"
+ },
+ {
+ "name": "색상 trigger toggles closed at 1280",
+ "status": "PASS"
+ },
+ {
+ "name": "색상 outside click closes at 1280",
+ "status": "PASS"
+ },
+ {
+ "name": "선스타일 Hover does not open at 1280",
+ "status": "PASS"
+ },
+ {
+ "name": "선스타일 overlay in viewport, not clipped or covered at 1280",
+ "status": "PASS",
+ "data": {
+ "x": 386.40625,
+ "y": 325.890625,
+ "w": 473.1875,
+ "h": 192,
+ "right": 859.59375,
+ "bottom": 517.890625,
+ "hit": true
+ }
+ },
+ {
+ "name": "선스타일 selected and expanded at 1280",
+ "status": "PASS"
+ },
+ {
+ "name": "선스타일 Escape closes and restores focus at 1280",
+ "status": "PASS"
+ },
+ {
+ "name": "선스타일 trigger toggles closed at 1280",
+ "status": "PASS"
+ },
+ {
+ "name": "선스타일 outside click closes at 1280",
+ "status": "PASS"
+ },
+ {
+ "name": "문자스타일 Hover does not open at 1280",
+ "status": "PASS"
+ },
+ {
+ "name": "문자스타일 overlay in viewport, not clipped or covered at 1280",
+ "status": "PASS",
+ "data": {
+ "x": 768.40625,
+ "y": 326.890625,
+ "w": 164,
+ "h": 100,
+ "right": 932.40625,
+ "bottom": 426.890625,
+ "hit": true
+ }
+ },
+ {
+ "name": "문자스타일 selected and expanded at 1280",
+ "status": "PASS"
+ },
+ {
+ "name": "문자스타일 Escape closes and restores focus at 1280",
+ "status": "PASS"
+ },
+ {
+ "name": "문자스타일 trigger toggles closed at 1280",
+ "status": "PASS"
+ },
+ {
+ "name": "문자스타일 outside click closes at 1280",
+ "status": "PASS"
+ },
+ {
+ "name": "치수스타일 Hover does not open at 1280",
+ "status": "PASS"
+ },
+ {
+ "name": "치수스타일 overlay in viewport, not clipped or covered at 1280",
+ "status": "PASS",
+ "data": {
+ "x": 936.40625,
+ "y": 326.890625,
+ "w": 164,
+ "h": 100,
+ "right": 1100.40625,
+ "bottom": 426.890625,
+ "hit": true
+ }
+ },
+ {
+ "name": "치수스타일 selected and expanded at 1280",
+ "status": "PASS"
+ },
+ {
+ "name": "치수스타일 Escape closes and restores focus at 1280",
+ "status": "PASS"
+ },
+ {
+ "name": "치수스타일 trigger toggles closed at 1280",
+ "status": "PASS"
+ },
+ {
+ "name": "치수스타일 outside click closes at 1280",
+ "status": "PASS"
+ },
+ {
+ "name": "composition wraps without page overflow or scaling at 1440",
+ "status": "PASS",
+ "data": {
+ "overflow": 0,
+ "fields": [
+ {
+ "width": 234,
+ "height": 38
+ },
+ {
+ "width": 192,
+ "height": 38
+ },
+ {
+ "width": 284,
+ "height": 38
+ },
+ {
+ "width": 164,
+ "height": 38
+ },
+ {
+ "width": 164,
+ "height": 38
+ }
+ ]
+ }
+ },
+ {
+ "name": "레이어 Hover does not open at 1440",
+ "status": "PASS"
+ },
+ {
+ "name": "레이어 overlay in viewport, not clipped or covered at 1440",
+ "status": "PASS",
+ "data": {
+ "x": 128,
+ "y": 328.5,
+ "w": 234,
+ "h": 280,
+ "right": 362,
+ "bottom": 608.5,
+ "hit": true
+ }
+ },
+ {
+ "name": "레이어 selected and expanded at 1440",
+ "status": "PASS"
+ },
+ {
+ "name": "레이어 Escape closes and restores focus at 1440",
+ "status": "PASS"
+ },
+ {
+ "name": "레이어 trigger toggles closed at 1440",
+ "status": "PASS"
+ },
+ {
+ "name": "레이어 outside click closes at 1440",
+ "status": "PASS"
+ },
+ {
+ "name": "색상 Hover does not open at 1440",
+ "status": "PASS"
+ },
+ {
+ "name": "색상 overlay in viewport, not clipped or covered at 1440",
+ "status": "PASS",
+ "data": {
+ "x": 366,
+ "y": 328.5,
+ "w": 192,
+ "h": 182,
+ "right": 558,
+ "bottom": 510.5,
+ "hit": true
+ }
+ },
+ {
+ "name": "색상 selected and expanded at 1440",
+ "status": "PASS"
+ },
+ {
+ "name": "색상 Escape closes and restores focus at 1440",
+ "status": "PASS"
+ },
+ {
+ "name": "색상 trigger toggles closed at 1440",
+ "status": "PASS"
+ },
+ {
+ "name": "색상 outside click closes at 1440",
+ "status": "PASS"
+ },
+ {
+ "name": "선스타일 Hover does not open at 1440",
+ "status": "PASS"
+ },
+ {
+ "name": "선스타일 overlay in viewport, not clipped or covered at 1440",
+ "status": "PASS",
+ "data": {
+ "x": 468,
+ "y": 327.5,
+ "w": 473.1875,
+ "h": 192,
+ "right": 941.1875,
+ "bottom": 519.5,
+ "hit": true
+ }
+ },
+ {
+ "name": "선스타일 selected and expanded at 1440",
+ "status": "PASS"
+ },
+ {
+ "name": "선스타일 Escape closes and restores focus at 1440",
+ "status": "PASS"
+ },
+ {
+ "name": "선스타일 trigger toggles closed at 1440",
+ "status": "PASS"
+ },
+ {
+ "name": "선스타일 outside click closes at 1440",
+ "status": "PASS"
+ },
+ {
+ "name": "문자스타일 Hover does not open at 1440",
+ "status": "PASS"
+ },
+ {
+ "name": "문자스타일 overlay in viewport, not clipped or covered at 1440",
+ "status": "PASS",
+ "data": {
+ "x": 850,
+ "y": 328.5,
+ "w": 164,
+ "h": 100,
+ "right": 1014,
+ "bottom": 428.5,
+ "hit": true
+ }
+ },
+ {
+ "name": "문자스타일 selected and expanded at 1440",
+ "status": "PASS"
+ },
+ {
+ "name": "문자스타일 Escape closes and restores focus at 1440",
+ "status": "PASS"
+ },
+ {
+ "name": "문자스타일 trigger toggles closed at 1440",
+ "status": "PASS"
+ },
+ {
+ "name": "문자스타일 outside click closes at 1440",
+ "status": "PASS"
+ },
+ {
+ "name": "치수스타일 Hover does not open at 1440",
+ "status": "PASS"
+ },
+ {
+ "name": "치수스타일 overlay in viewport, not clipped or covered at 1440",
+ "status": "PASS",
+ "data": {
+ "x": 1018,
+ "y": 328.5,
+ "w": 164,
+ "h": 100,
+ "right": 1182,
+ "bottom": 428.5,
+ "hit": true
+ }
+ },
+ {
+ "name": "치수스타일 selected and expanded at 1440",
+ "status": "PASS"
+ },
+ {
+ "name": "치수스타일 Escape closes and restores focus at 1440",
+ "status": "PASS"
+ },
+ {
+ "name": "치수스타일 trigger toggles closed at 1440",
+ "status": "PASS"
+ },
+ {
+ "name": "치수스타일 outside click closes at 1440",
+ "status": "PASS"
+ },
+ {
+ "name": "keyboard opens layer menu and focuses current row",
+ "status": "PASS"
+ },
+ {
+ "name": "keyboard moves to next layer row",
+ "status": "PASS"
+ },
+ {
+ "name": "onLayerSelect callback exactly once",
+ "status": "PASS",
+ "data": [
+ "dimensionStyleOpen(true)",
+ "dimensionStyleOpen(false)",
+ "layerOpen(true)",
+ "onLayerSelect(layer, Sample-Center)",
+ "layerOpen(false)"
+ ]
+ },
+ {
+ "name": "layer selection appears, closes and restores focus",
+ "status": "PASS"
+ },
+ {
+ "name": "selected layer retains original row Hover background",
+ "status": "PASS"
+ },
+ {
+ "name": "onLayerVisibilityChange callback exactly once",
+ "status": "PASS",
+ "data": [
+ "onLayerSelect(layer, Sample-Center)",
+ "layerOpen(false)",
+ "onLayerOpen",
+ "layerOpen(true)",
+ "onLayerVisibilityChange(layer-1, false)"
+ ]
+ },
+ {
+ "name": "onLayerVisibilityChange toggles only its own state, menu remains open",
+ "status": "PASS"
+ },
+ {
+ "name": "onLayerFreezeChange callback exactly once",
+ "status": "PASS",
+ "data": [
+ "layerOpen(false)",
+ "onLayerOpen",
+ "layerOpen(true)",
+ "onLayerVisibilityChange(layer-1, false)",
+ "onLayerFreezeChange(layer-1, true)"
+ ]
+ },
+ {
+ "name": "onLayerFreezeChange toggles only its own state, menu remains open",
+ "status": "PASS"
+ },
+ {
+ "name": "onLayerLockChange callback exactly once",
+ "status": "PASS",
+ "data": [
+ "onLayerOpen",
+ "layerOpen(true)",
+ "onLayerVisibilityChange(layer-1, false)",
+ "onLayerFreezeChange(layer-1, true)",
+ "onLayerLockChange(layer-1, true)"
+ ]
+ },
+ {
+ "name": "onLayerLockChange toggles only its own state, menu remains open",
+ "status": "PASS"
+ },
+ {
+ "name": "disabled layer selection and toggles blocked",
+ "status": "PASS"
+ },
+ {
+ "name": "full color menu: seven palette chips, two user colors, modes, RGB and pick",
+ "status": "PASS"
+ },
+ {
+ "name": "onColorSelect callback exactly once",
+ "status": "PASS",
+ "data": [
+ "onLayerLockChange(layer-1, true)",
+ "layerOpen(false)",
+ "onColorOpen",
+ "colorOpen(true)",
+ "onColorSelect(color, 241,4,4)"
+ ]
+ },
+ {
+ "name": "color palette updates displayed RGB and leaves menu open",
+ "status": "PASS"
+ },
+ {
+ "name": "onColorModeChange callback exactly once",
+ "status": "PASS",
+ "data": [
+ "layerOpen(false)",
+ "onColorOpen",
+ "colorOpen(true)",
+ "onColorSelect(color, 241,4,4)",
+ "onColorModeChange(byBlock)"
+ ]
+ },
+ {
+ "name": "ByBlock On and displayed mode",
+ "status": "PASS"
+ },
+ {
+ "name": "onColorInput callback exactly once",
+ "status": "PASS",
+ "data": [
+ "onColorOpen",
+ "colorOpen(true)",
+ "onColorSelect(color, 241,4,4)",
+ "onColorModeChange(byBlock)",
+ "onColorInput(color, 255,0,0)"
+ ]
+ },
+ {
+ "name": "RGB commit clears mode and updates chip",
+ "status": "PASS"
+ },
+ {
+ "name": "invalid RGB restores without callback",
+ "status": "PASS"
+ },
+ {
+ "name": "onColorPick callback exactly once",
+ "status": "PASS",
+ "data": [
+ "onColorSelect(color, 241,4,4)",
+ "onColorModeChange(byBlock)",
+ "onColorInput(color, 255,0,0)",
+ "onColorPick",
+ "colorOpen(false)"
+ ]
+ },
+ {
+ "name": "color pick closes and restores focus",
+ "status": "PASS"
+ },
+ {
+ "name": "color changes leave layer, line, text and dimension values intact",
+ "status": "PASS"
+ },
+ {
+ "name": "all original line rows and weights retained",
+ "status": "PASS"
+ },
+ {
+ "name": "onLineTypeSelect callback exactly once",
+ "status": "PASS",
+ "data": [
+ "onColorPick",
+ "colorOpen(false)",
+ "onLineStyleOpen",
+ "lineStyleOpen(true)",
+ "onLineTypeSelect(line, CENTER)"
+ ]
+ },
+ {
+ "name": "selected line retains original row Hover and preview",
+ "status": "PASS"
+ },
+ {
+ "name": "onLineWeightSelect callback exactly once",
+ "status": "PASS",
+ "data": [
+ "colorOpen(false)",
+ "onLineStyleOpen",
+ "lineStyleOpen(true)",
+ "onLineTypeSelect(line, CENTER)",
+ "onLineWeightSelect(weight, 0.25)"
+ ]
+ },
+ {
+ "name": "onLineWeightValueChange callback exactly once",
+ "status": "PASS",
+ "data": [
+ "onLineStyleOpen",
+ "lineStyleOpen(true)",
+ "onLineTypeSelect(line, CENTER)",
+ "onLineWeightSelect(weight, 0.25)",
+ "onLineWeightValueChange(weight, 0.5)"
+ ]
+ },
+ {
+ "name": "onLineScaleChange callback exactly once",
+ "status": "PASS",
+ "data": [
+ "lineStyleOpen(true)",
+ "onLineTypeSelect(line, CENTER)",
+ "onLineWeightSelect(weight, 0.25)",
+ "onLineWeightValueChange(weight, 0.5)",
+ "onLineScaleChange(scale, 2)"
+ ]
+ },
+ {
+ "name": "line type, editable weight and scale update independently; menu stays open",
+ "status": "PASS"
+ },
+ {
+ "name": "invalid scale restores, no callback",
+ "status": "PASS"
+ },
+ {
+ "name": "문자스타일 full two-item list retained",
+ "status": "PASS"
+ },
+ {
+ "name": "onTextStyleSelect callback exactly once",
+ "status": "PASS",
+ "data": [
+ "lineStyleOpen(false)",
+ "onTextStyleOpen",
+ "textStyleOpen(true)",
+ "onTextStyleSelect(dotum)",
+ "textStyleOpen(false)"
+ ]
+ },
+ {
+ "name": "문자스타일 selection displayed, closes, focus returns",
+ "status": "PASS"
+ },
+ {
+ "name": "치수스타일 full two-item list retained",
+ "status": "PASS"
+ },
+ {
+ "name": "onDimensionStyleSelect callback exactly once",
+ "status": "PASS",
+ "data": [
+ "textStyleOpen(false)",
+ "onDimensionStyleOpen",
+ "dimensionStyleOpen(true)",
+ "onDimensionStyleSelect(iso-25)",
+ "dimensionStyleOpen(false)"
+ ]
+ },
+ {
+ "name": "치수스타일 selection displayed, closes, focus returns",
+ "status": "PASS"
+ },
+ {
+ "name": "레이어 detail Hover uses existing text opacity",
+ "status": "PASS"
+ },
+ {
+ "name": "onLayerDetail callback exactly once",
+ "status": "PASS",
+ "data": [
+ "dimensionStyleOpen(false)",
+ "onLayerOpen",
+ "layerOpen(true)",
+ "onLayerDetail",
+ "layerOpen(false)"
+ ]
+ },
+ {
+ "name": "레이어 detail closes, focus returns, no fabricated popup",
+ "status": "PASS"
+ },
+ {
+ "name": "색상 detail Hover uses existing text opacity",
+ "status": "PASS"
+ },
+ {
+ "name": "onColorDetail callback exactly once",
+ "status": "PASS",
+ "data": [
+ "layerOpen(false)",
+ "onColorOpen",
+ "colorOpen(true)",
+ "onColorDetail",
+ "colorOpen(false)"
+ ]
+ },
+ {
+ "name": "색상 detail closes, focus returns, no fabricated popup",
+ "status": "PASS"
+ },
+ {
+ "name": "선스타일 detail Hover uses existing text opacity",
+ "status": "PASS"
+ },
+ {
+ "name": "onLineStyleDetail callback exactly once",
+ "status": "PASS",
+ "data": [
+ "colorOpen(false)",
+ "onLineStyleOpen",
+ "lineStyleOpen(true)",
+ "onLineStyleDetail",
+ "lineStyleOpen(false)"
+ ]
+ },
+ {
+ "name": "선스타일 detail closes, focus returns, no fabricated popup",
+ "status": "PASS"
+ },
+ {
+ "name": "문자스타일 detail Hover uses existing text opacity",
+ "status": "PASS"
+ },
+ {
+ "name": "onTextStyleDetail callback exactly once",
+ "status": "PASS",
+ "data": [
+ "lineStyleOpen(false)",
+ "onTextStyleOpen",
+ "textStyleOpen(true)",
+ "onTextStyleDetail",
+ "textStyleOpen(false)"
+ ]
+ },
+ {
+ "name": "문자스타일 detail closes, focus returns, no fabricated popup",
+ "status": "PASS"
+ },
+ {
+ "name": "치수스타일 detail Hover uses existing text opacity",
+ "status": "PASS"
+ },
+ {
+ "name": "onDimensionStyleDetail callback exactly once",
+ "status": "PASS",
+ "data": [
+ "textStyleOpen(false)",
+ "onDimensionStyleOpen",
+ "dimensionStyleOpen(true)",
+ "onDimensionStyleDetail",
+ "dimensionStyleOpen(false)"
+ ]
+ },
+ {
+ "name": "치수스타일 detail closes, focus returns, no fabricated popup",
+ "status": "PASS"
+ },
+ {
+ "name": "opening another control leaves exactly one menu and preserves selection",
+ "status": "PASS"
+ },
+ {
+ "name": "keyboard Tab enters the open color controls",
+ "status": "PASS"
+ },
+ {
+ "name": "details opens existing 28px property Bar",
+ "status": "PASS"
+ },
+ {
+ "name": "details opens existing 314px property panel with focus",
+ "status": "PASS",
+ "data": {
+ "width": 314,
+ "focused": true,
+ "active": "
"
+ }
+ },
+ {
+ "name": "property Bar and panel share edited state",
+ "status": "PASS",
+ "data": "12.5"
+ },
+ {
+ "name": "property panel weight edit appears in composed line field",
+ "status": "PASS"
+ },
+ {
+ "name": "property panel close returns focus",
+ "status": "PASS"
+ },
+ {
+ "name": "property panel Escape returns focus",
+ "status": "PASS"
+ },
+ {
+ "name": "narrow details panel keeps natural width and fits viewport",
+ "status": "PASS",
+ "data": {
+ "width": 314,
+ "left": 72,
+ "right": 386,
+ "bottom": 840,
+ "overflow": 0
+ }
+ },
+ {
+ "name": "all seven actionable controls Disabled",
+ "status": "PASS"
+ },
+ {
+ "name": "Disabled controls block callbacks and overlays",
+ "status": "PASS"
+ },
+ {
+ "name": "callback-free layer icons become readonly status images",
+ "status": "PASS"
+ },
+ {
+ "name": "missing detail callback keeps safe no-op and menu open",
+ "status": "PASS"
+ },
+ {
+ "name": "retained long layer scenario",
+ "status": "PASS"
+ },
+ {
+ "name": "long layer name preserved with full title",
+ "status": "PASS"
+ },
+ {
+ "name": "retained many layer scenario",
+ "status": "PASS"
+ },
+ {
+ "name": "long layer list scrolls internally",
+ "status": "PASS"
+ },
+ {
+ "name": "all 40 user colors accessible with palette scroll",
+ "status": "PASS"
+ },
+ {
+ "name": "retained empty layer scenario",
+ "status": "PASS"
+ },
+ {
+ "name": "Overview keeps one Header at 49px and 16:9 Stage",
+ "status": "PASS"
+ },
+ {
+ "name": "Window Move Motion retains only nine 3x steps",
+ "status": "PASS"
+ },
+ {
+ "name": "manager shows a single Dropdown link directly under Header, no Composed Controls submenu",
+ "status": "PASS"
+ },
+ {
+ "name": "retired Dropdown links absent in manager",
+ "status": "PASS"
+ },
+ {
+ "name": "no browser console or page errors",
+ "status": "PASS",
+ "data": []
+ }
+ ],
+ "errors": [],
+ "callbacks": [
+ "onLayerOpen",
+ "layerOpen(true)",
+ "layerOpen(false)",
+ "onLayerOpen",
+ "layerOpen(true)",
+ "onLayerOpen",
+ "layerOpen(false)",
+ "onLayerOpen",
+ "layerOpen(true)",
+ "layerOpen(false)",
+ "onColorOpen",
+ "colorOpen(true)",
+ "colorOpen(false)",
+ "onColorOpen",
+ "colorOpen(true)",
+ "onColorOpen",
+ "colorOpen(false)",
+ "onColorOpen",
+ "colorOpen(true)",
+ "colorOpen(false)",
+ "onLineStyleOpen",
+ "lineStyleOpen(true)",
+ "lineStyleOpen(false)",
+ "onLineStyleOpen",
+ "lineStyleOpen(true)",
+ "onLineStyleOpen",
+ "lineStyleOpen(false)",
+ "onLineStyleOpen",
+ "lineStyleOpen(true)",
+ "lineStyleOpen(false)",
+ "onTextStyleOpen",
+ "textStyleOpen(true)",
+ "textStyleOpen(false)",
+ "onTextStyleOpen",
+ "textStyleOpen(true)",
+ "onTextStyleOpen",
+ "textStyleOpen(false)",
+ "onTextStyleOpen",
+ "textStyleOpen(true)",
+ "textStyleOpen(false)",
+ "onDimensionStyleOpen",
+ "dimensionStyleOpen(true)",
+ "dimensionStyleOpen(false)",
+ "onDimensionStyleOpen",
+ "dimensionStyleOpen(true)",
+ "onDimensionStyleOpen",
+ "dimensionStyleOpen(false)",
+ "onDimensionStyleOpen",
+ "dimensionStyleOpen(true)",
+ "dimensionStyleOpen(false)",
+ "onLayerOpen",
+ "layerOpen(true)",
+ "layerOpen(false)",
+ "onLayerOpen",
+ "layerOpen(true)",
+ "onLayerOpen",
+ "layerOpen(false)",
+ "onLayerOpen",
+ "layerOpen(true)",
+ "layerOpen(false)",
+ "onColorOpen",
+ "colorOpen(true)",
+ "colorOpen(false)",
+ "onColorOpen",
+ "colorOpen(true)",
+ "onColorOpen",
+ "colorOpen(false)",
+ "onColorOpen",
+ "colorOpen(true)",
+ "colorOpen(false)",
+ "onLineStyleOpen",
+ "lineStyleOpen(true)",
+ "lineStyleOpen(false)",
+ "onLineStyleOpen",
+ "lineStyleOpen(true)",
+ "onLineStyleOpen",
+ "lineStyleOpen(false)",
+ "onLineStyleOpen",
+ "lineStyleOpen(true)",
+ "lineStyleOpen(false)",
+ "onTextStyleOpen",
+ "textStyleOpen(true)",
+ "textStyleOpen(false)",
+ "onTextStyleOpen",
+ "textStyleOpen(true)",
+ "onTextStyleOpen",
+ "textStyleOpen(false)",
+ "onTextStyleOpen",
+ "textStyleOpen(true)",
+ "textStyleOpen(false)",
+ "onDimensionStyleOpen",
+ "dimensionStyleOpen(true)",
+ "dimensionStyleOpen(false)",
+ "onDimensionStyleOpen",
+ "dimensionStyleOpen(true)",
+ "onDimensionStyleOpen",
+ "dimensionStyleOpen(false)",
+ "onDimensionStyleOpen",
+ "dimensionStyleOpen(true)",
+ "dimensionStyleOpen(false)",
+ "onLayerOpen",
+ "layerOpen(true)",
+ "layerOpen(false)",
+ "onLayerOpen",
+ "layerOpen(true)",
+ "onLayerOpen",
+ "layerOpen(false)",
+ "onLayerOpen",
+ "layerOpen(true)",
+ "layerOpen(false)",
+ "onColorOpen",
+ "colorOpen(true)",
+ "colorOpen(false)",
+ "onColorOpen",
+ "colorOpen(true)",
+ "onColorOpen",
+ "colorOpen(false)",
+ "onColorOpen",
+ "colorOpen(true)",
+ "colorOpen(false)",
+ "onLineStyleOpen",
+ "lineStyleOpen(true)",
+ "lineStyleOpen(false)",
+ "onLineStyleOpen",
+ "lineStyleOpen(true)",
+ "onLineStyleOpen",
+ "lineStyleOpen(false)",
+ "onLineStyleOpen",
+ "lineStyleOpen(true)",
+ "lineStyleOpen(false)",
+ "onTextStyleOpen",
+ "textStyleOpen(true)",
+ "textStyleOpen(false)",
+ "onTextStyleOpen",
+ "textStyleOpen(true)",
+ "onTextStyleOpen",
+ "textStyleOpen(false)",
+ "onTextStyleOpen",
+ "textStyleOpen(true)",
+ "textStyleOpen(false)",
+ "onDimensionStyleOpen",
+ "dimensionStyleOpen(true)",
+ "dimensionStyleOpen(false)",
+ "onDimensionStyleOpen",
+ "dimensionStyleOpen(true)",
+ "onDimensionStyleOpen",
+ "dimensionStyleOpen(false)",
+ "onDimensionStyleOpen",
+ "dimensionStyleOpen(true)",
+ "dimensionStyleOpen(false)",
+ "onLayerOpen",
+ "layerOpen(true)",
+ "layerOpen(false)",
+ "onLayerOpen",
+ "layerOpen(true)",
+ "onLayerOpen",
+ "layerOpen(false)",
+ "onLayerOpen",
+ "layerOpen(true)",
+ "layerOpen(false)",
+ "onColorOpen",
+ "colorOpen(true)",
+ "colorOpen(false)",
+ "onColorOpen",
+ "colorOpen(true)",
+ "onColorOpen",
+ "colorOpen(false)",
+ "onColorOpen",
+ "colorOpen(true)",
+ "colorOpen(false)",
+ "onLineStyleOpen",
+ "lineStyleOpen(true)",
+ "lineStyleOpen(false)",
+ "onLineStyleOpen",
+ "lineStyleOpen(true)",
+ "onLineStyleOpen",
+ "lineStyleOpen(false)",
+ "onLineStyleOpen",
+ "lineStyleOpen(true)",
+ "lineStyleOpen(false)",
+ "onTextStyleOpen",
+ "textStyleOpen(true)",
+ "textStyleOpen(false)",
+ "onTextStyleOpen",
+ "textStyleOpen(true)",
+ "onTextStyleOpen",
+ "textStyleOpen(false)",
+ "onTextStyleOpen",
+ "textStyleOpen(true)",
+ "textStyleOpen(false)",
+ "onDimensionStyleOpen",
+ "dimensionStyleOpen(true)",
+ "dimensionStyleOpen(false)",
+ "onDimensionStyleOpen",
+ "dimensionStyleOpen(true)",
+ "onDimensionStyleOpen",
+ "dimensionStyleOpen(false)",
+ "onDimensionStyleOpen",
+ "dimensionStyleOpen(true)",
+ "dimensionStyleOpen(false)",
+ "layerOpen(true)",
+ "onLayerSelect(layer, Sample-Center)",
+ "layerOpen(false)",
+ "onLayerOpen",
+ "layerOpen(true)",
+ "onLayerVisibilityChange(layer-1, false)",
+ "onLayerFreezeChange(layer-1, true)",
+ "onLayerLockChange(layer-1, true)",
+ "layerOpen(false)",
+ "onColorOpen",
+ "colorOpen(true)",
+ "onColorSelect(color, 241,4,4)",
+ "onColorModeChange(byBlock)",
+ "onColorInput(color, 255,0,0)",
+ "onColorPick",
+ "colorOpen(false)",
+ "onLineStyleOpen",
+ "lineStyleOpen(true)",
+ "onLineTypeSelect(line, CENTER)",
+ "onLineWeightSelect(weight, 0.25)",
+ "onLineWeightValueChange(weight, 0.5)",
+ "onLineScaleChange(scale, 2)",
+ "lineStyleOpen(false)",
+ "onTextStyleOpen",
+ "textStyleOpen(true)",
+ "onTextStyleSelect(dotum)",
+ "textStyleOpen(false)",
+ "onDimensionStyleOpen",
+ "dimensionStyleOpen(true)",
+ "onDimensionStyleSelect(iso-25)",
+ "dimensionStyleOpen(false)",
+ "onLayerOpen",
+ "layerOpen(true)",
+ "onLayerDetail",
+ "layerOpen(false)",
+ "onColorOpen",
+ "colorOpen(true)",
+ "onColorDetail",
+ "colorOpen(false)",
+ "onLineStyleOpen",
+ "lineStyleOpen(true)",
+ "onLineStyleDetail",
+ "lineStyleOpen(false)",
+ "onTextStyleOpen",
+ "textStyleOpen(true)",
+ "onTextStyleDetail",
+ "textStyleOpen(false)",
+ "onDimensionStyleOpen",
+ "dimensionStyleOpen(true)",
+ "onDimensionStyleDetail",
+ "dimensionStyleOpen(false)",
+ "onLayerOpen",
+ "layerOpen(true)",
+ "layerOpen(false)",
+ "onColorOpen",
+ "colorOpen(true)",
+ "colorOpen(false)",
+ "onColorOpen",
+ "colorOpen(true)",
+ "colorOpen(false)",
+ "onPropertyBarOpenChange(true)",
+ "onPropertyPanelOpenChange(true)",
+ "onPropertyChange(radius, 12.5)",
+ "onPropertyChange(weight, 0.75)",
+ "onPropertyPanelOpenChange(false)",
+ "onPropertyPanelOpenChange(true)",
+ "onPropertyPanelOpenChange(false)",
+ "onPropertyPanelOpenChange(true)",
+ "onPropertyPanelOpenChange(false)",
+ "onPropertyBarOpenChange(false)",
+ "onLayerOpen",
+ "layerOpen(true)",
+ "layerOpen(false)",
+ "onColorOpen",
+ "colorOpen(true)",
+ "colorOpen(false)",
+ "onLayerOpen",
+ "layerOpen(true)",
+ "onLayerSelect(layer, Sample-매우-긴-레이어-이름-Ellipsis-확인용-Layer-Name-0123456789)",
+ "layerOpen(false)",
+ "onLayerOpen",
+ "layerOpen(true)",
+ "layerOpen(false)",
+ "onColorOpen",
+ "colorOpen(true)",
+ "colorOpen(false)",
+ "onLayerOpen",
+ "layerOpen(true)",
+ "layerOpen(false)"
+ ],
+ "geometry": [
+ {
+ "width": 390,
+ "overflow": 0,
+ "fields": [
+ {
+ "width": 234,
+ "height": 38
+ },
+ {
+ "width": 192,
+ "height": 38
+ },
+ {
+ "width": 284,
+ "height": 38
+ },
+ {
+ "width": 164,
+ "height": 38
+ },
+ {
+ "width": 164,
+ "height": 38
+ }
+ ]
+ },
+ {
+ "width": 768,
+ "overflow": 0,
+ "fields": [
+ {
+ "width": 234,
+ "height": 38
+ },
+ {
+ "width": 192,
+ "height": 38
+ },
+ {
+ "width": 284,
+ "height": 38
+ },
+ {
+ "width": 164,
+ "height": 38
+ },
+ {
+ "width": 164,
+ "height": 38
+ }
+ ]
+ },
+ {
+ "width": 1280,
+ "overflow": 0,
+ "fields": [
+ {
+ "width": 234,
+ "height": 38
+ },
+ {
+ "width": 192,
+ "height": 38
+ },
+ {
+ "width": 284,
+ "height": 38
+ },
+ {
+ "width": 164,
+ "height": 38
+ },
+ {
+ "width": 164,
+ "height": 38
+ }
+ ]
+ },
+ {
+ "width": 1440,
+ "overflow": 0,
+ "fields": [
+ {
+ "width": 234,
+ "height": 38
+ },
+ {
+ "width": 192,
+ "height": 38
+ },
+ {
+ "width": 284,
+ "height": 38
+ },
+ {
+ "width": 164,
+ "height": 38
+ },
+ {
+ "width": 164,
+ "height": 38
+ }
+ ]
+ }
+ ],
+ "menuCorrectionBaseCommit": "9482d45f340981c4b4ad6537cb678bf4afcdc681",
+ "browser": "155.0.8059.80",
+ "status": "FAIL"
+}
diff --git a/docs/sw/integrated-improvement-qa/baseline-dropdown-consolidation/story-inventory.json b/docs/sw/integrated-improvement-qa/baseline-dropdown-consolidation/story-inventory.json
new file mode 100644
index 0000000..e019ca9
--- /dev/null
+++ b/docs/sw/integrated-improvement-qa/baseline-dropdown-consolidation/story-inventory.json
@@ -0,0 +1,639 @@
+{
+ "before": [
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--detail-buttons",
+ "name": "Detail Buttons (Shared States)",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "DetailButtons"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--overview",
+ "name": "Overview",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "Overview"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--interactive-states",
+ "name": "Interactive States",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "InteractiveStates"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--window-move-motion",
+ "name": "Window Move Motion",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "WindowMoveMotion"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--composed-controls",
+ "name": "Composed Controls",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "ComposedControls"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--logo-slot",
+ "name": "Logo Slot",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "LogoSlot"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--document-dropdown",
+ "name": "Document Dropdown",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "DocumentDropdown"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--layer-dropdown",
+ "name": "Layer Dropdown",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "LayerDropdown"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--color-dropdown",
+ "name": "Color Dropdown",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "ColorDropdown"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--line-style-dropdown",
+ "name": "Line Style Dropdown",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "LineStyleDropdown"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--text-dimension-style-dropdown",
+ "name": "Text · Dimension Style Dropdown",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "TextDimensionStyleDropdown"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--responsive-more",
+ "name": "Responsive More",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "ResponsiveMore"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--layer-detail-input",
+ "name": "Layer Detail · Input",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "LayerDetailInput"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--property-panel",
+ "name": "Property Panel",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "PropertyPanel"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--property-panel-variants",
+ "name": "Property Panel Variants",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "PropertyPanelVariants"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--k-guide",
+ "name": "K Guide",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "KGuide"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--additional-hover",
+ "name": "Additional Hover",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "AdditionalHover"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--property-bar",
+ "name": "Property Bar",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "PropertyBar"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--dynamic-controls",
+ "name": "Dynamic Controls",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "DynamicControls"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--colorize",
+ "name": "Colorize",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "Colorize"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--composition",
+ "name": "Composition (Visibility · Order)",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "Composition"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--property-panel-none",
+ "name": "Property Panel · 선택 없음",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "PropertyPanelNone"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--property-panel-all",
+ "name": "Property Panel · 전체 선택",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "PropertyPanelAll"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--property-panel-circle",
+ "name": "Property Panel · 원 1개",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "PropertyPanelCircle"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--property-panel-expanded",
+ "name": "Property Panel · 모두 펼침",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "PropertyPanelExpanded"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--property-panel-compare",
+ "name": "Property Panel · 4개 비교",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "PropertyPanelCompare"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--property-shape-slot",
+ "name": "Property Panel · 형상 Slot",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "PropertyShapeSlot"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--property-fields",
+ "name": "Property Panel · 필드 13개",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "PropertyFields"
+ }
+ ],
+ "after": [
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--composed-controls",
+ "name": "Dropdown",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header-dropdown.stories.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "ComposedControls"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--detail-buttons",
+ "name": "Detail Buttons (Shared States)",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "DetailButtons"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--overview",
+ "name": "Overview",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "Overview"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--interactive-states",
+ "name": "Interactive States",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "InteractiveStates"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--window-move-motion",
+ "name": "Window Move Motion",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "WindowMoveMotion"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--logo-slot",
+ "name": "Logo Slot",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "LogoSlot"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--document-dropdown",
+ "name": "Document Dropdown",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "DocumentDropdown"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--responsive-more",
+ "name": "Responsive More",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "ResponsiveMore"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--k-guide",
+ "name": "K Guide",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "KGuide"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--property-panel-compare",
+ "name": "Property Panel · 4개 비교",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "PropertyPanelCompare"
+ }
+ ],
+ "removed": [
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--layer-dropdown",
+ "name": "Layer Dropdown",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "LayerDropdown"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--color-dropdown",
+ "name": "Color Dropdown",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "ColorDropdown"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--line-style-dropdown",
+ "name": "Line Style Dropdown",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "LineStyleDropdown"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--text-dimension-style-dropdown",
+ "name": "Text · Dimension Style Dropdown",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "TextDimensionStyleDropdown"
+ }
+ ]
+}
diff --git a/docs/sw/integrated-improvement-qa/baseline-overview/after-index.json b/docs/sw/integrated-improvement-qa/baseline-overview/after-index.json
new file mode 100644
index 0000000..1359483
--- /dev/null
+++ b/docs/sw/integrated-improvement-qa/baseline-overview/after-index.json
@@ -0,0 +1,152 @@
+[
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--composed-controls",
+ "name": "Dropdown",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header-dropdown.stories.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "ComposedControls"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--detail-buttons",
+ "name": "Detail Buttons (Shared States)",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "DetailButtons"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--overview",
+ "name": "Overview",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "Overview"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--interactive-states",
+ "name": "Interactive States",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "InteractiveStates"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--window-move-motion",
+ "name": "Window Move Motion",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "WindowMoveMotion"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--logo-slot",
+ "name": "Logo Slot",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "LogoSlot"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--document-dropdown",
+ "name": "Document Dropdown",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "DocumentDropdown"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--responsive-more",
+ "name": "Responsive More",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "ResponsiveMore"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--k-guide",
+ "name": "K Guide",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "KGuide"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--property-panel-compare",
+ "name": "Property Panel · 4개 비교",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "PropertyPanelCompare"
+ }
+]
diff --git a/docs/sw/integrated-improvement-qa/baseline-overview/before-index.json b/docs/sw/integrated-improvement-qa/baseline-overview/before-index.json
new file mode 100644
index 0000000..d3311f8
--- /dev/null
+++ b/docs/sw/integrated-improvement-qa/baseline-overview/before-index.json
@@ -0,0 +1,423 @@
+[
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--detail-buttons",
+ "name": "Detail Buttons (Shared States)",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "DetailButtons"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--overview",
+ "name": "Overview",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "Overview"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--interactive-states",
+ "name": "Interactive States",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "InteractiveStates"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--window-move-motion",
+ "name": "Window Move Motion",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "WindowMoveMotion"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--composed-controls",
+ "name": "Composed Controls",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "ComposedControls"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--logo-slot",
+ "name": "Logo Slot",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "LogoSlot"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--document-dropdown",
+ "name": "Document Dropdown",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "DocumentDropdown"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--layer-dropdown",
+ "name": "Layer Dropdown",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "LayerDropdown"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--color-dropdown",
+ "name": "Color Dropdown",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "ColorDropdown"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--line-style-dropdown",
+ "name": "Line Style Dropdown",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "LineStyleDropdown"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--text-dimension-style-dropdown",
+ "name": "Text · Dimension Style Dropdown",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "TextDimensionStyleDropdown"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--responsive-more",
+ "name": "Responsive More",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "ResponsiveMore"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--layer-detail-input",
+ "name": "Layer Detail · Input",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "LayerDetailInput"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--property-panel",
+ "name": "Property Panel",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "PropertyPanel"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--property-panel-variants",
+ "name": "Property Panel Variants",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "PropertyPanelVariants"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--k-guide",
+ "name": "K Guide",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "KGuide"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--additional-hover",
+ "name": "Additional Hover",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "AdditionalHover"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--property-bar",
+ "name": "Property Bar",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "PropertyBar"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--dynamic-controls",
+ "name": "Dynamic Controls",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "DynamicControls"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--colorize",
+ "name": "Colorize",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "Colorize"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--composition",
+ "name": "Composition (Visibility · Order)",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "Composition"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--property-panel-none",
+ "name": "Property Panel · 선택 없음",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "PropertyPanelNone"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--property-panel-all",
+ "name": "Property Panel · 전체 선택",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "PropertyPanelAll"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--property-panel-circle",
+ "name": "Property Panel · 원 1개",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "PropertyPanelCircle"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--property-panel-expanded",
+ "name": "Property Panel · 모두 펼침",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "PropertyPanelExpanded"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--property-panel-compare",
+ "name": "Property Panel · 4개 비교",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "PropertyPanelCompare"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--property-shape-slot",
+ "name": "Property Panel · 형상 Slot",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "PropertyShapeSlot"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--property-fields",
+ "name": "Property Panel · 필드 13개",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "PropertyFields"
+ }
+]
diff --git a/docs/sw/integrated-improvement-qa/baseline-overview/chrome-result.json b/docs/sw/integrated-improvement-qa/baseline-overview/chrome-result.json
new file mode 100644
index 0000000..14763d0
--- /dev/null
+++ b/docs/sw/integrated-improvement-qa/baseline-overview/chrome-result.json
@@ -0,0 +1,656 @@
+{
+ "baseCommit": "50bf5bda8e956a4973b923d64131f2f2285bd38c",
+ "checks": [
+ {
+ "name": "24 retained Story IDs, names and tags; only approved Dropdown retirements",
+ "status": "FAIL"
+ },
+ {
+ "name": "retained non-Overview declarations byte-identical; relocated composition separately verified",
+ "status": "FAIL"
+ },
+ {
+ "name": "retired Dropdown IDs absent",
+ "status": "PASS"
+ },
+ {
+ "name": "package production source untouched",
+ "status": "PASS"
+ },
+ {
+ "name": "16:9 fitted to both Inner dimensions at 1920x1080",
+ "status": "PASS",
+ "data": {
+ "stage": {
+ "x": 360,
+ "y": 264.25,
+ "w": 1200,
+ "h": 675,
+ "right": 1560,
+ "bottom": 939.25
+ },
+ "slot": {
+ "x": 360,
+ "y": 169.5,
+ "w": 1200,
+ "h": 864.5,
+ "right": 1560,
+ "bottom": 1034
+ },
+ "header": {
+ "x": 360,
+ "y": 264.25,
+ "w": 1200,
+ "h": 49,
+ "right": 1560,
+ "bottom": 313.25
+ },
+ "viewport": {
+ "w": 1920,
+ "h": 1080
+ },
+ "overflow": 0
+ }
+ },
+ {
+ "name": "16:9 fitted to both Inner dimensions at 1440x900",
+ "status": "PASS",
+ "data": {
+ "stage": {
+ "x": 120,
+ "y": 174.25,
+ "w": 1200,
+ "h": 675,
+ "right": 1320,
+ "bottom": 849.25
+ },
+ "slot": {
+ "x": 120,
+ "y": 169.5,
+ "w": 1200,
+ "h": 684.5,
+ "right": 1320,
+ "bottom": 854
+ },
+ "header": {
+ "x": 120,
+ "y": 174.25,
+ "w": 1200,
+ "h": 49,
+ "right": 1320,
+ "bottom": 223.25
+ },
+ "viewport": {
+ "w": 1440,
+ "h": 900
+ },
+ "overflow": 0
+ }
+ },
+ {
+ "name": "16:9 fitted to both Inner dimensions at 1280x720",
+ "status": "PASS",
+ "data": {
+ "stage": {
+ "x": 191.5625,
+ "y": 169.5,
+ "w": 896.875,
+ "h": 504.5,
+ "right": 1088.4375,
+ "bottom": 674
+ },
+ "slot": {
+ "x": 38.40625,
+ "y": 169.5,
+ "w": 1203.1875,
+ "h": 504.5,
+ "right": 1241.59375,
+ "bottom": 674
+ },
+ "header": {
+ "x": 191.5625,
+ "y": 169.5,
+ "w": 896.875,
+ "h": 49,
+ "right": 1088.4375,
+ "bottom": 218.5
+ },
+ "viewport": {
+ "w": 1280,
+ "h": 720
+ },
+ "overflow": 0
+ }
+ },
+ {
+ "name": "16:9 fitted to both Inner dimensions at 768x600",
+ "status": "PASS",
+ "data": {
+ "stage": {
+ "x": 42.21875,
+ "y": 169.5,
+ "w": 683.546875,
+ "h": 384.5,
+ "right": 725.765625,
+ "bottom": 554
+ },
+ "slot": {
+ "x": 23.046875,
+ "y": 169.5,
+ "w": 721.90625,
+ "h": 384.5,
+ "right": 744.953125,
+ "bottom": 554
+ },
+ "header": {
+ "x": 42.21875,
+ "y": 169.5,
+ "w": 683.546875,
+ "h": 49,
+ "right": 725.765625,
+ "bottom": 218.5
+ },
+ "viewport": {
+ "w": 768,
+ "h": 600
+ },
+ "overflow": 0
+ }
+ },
+ {
+ "name": "16:9 fitted to both Inner dimensions at 390x844",
+ "status": "PASS",
+ "data": {
+ "stage": {
+ "x": 16,
+ "y": 383.0625,
+ "w": 358,
+ "h": 201.375,
+ "right": 374,
+ "bottom": 584.4375
+ },
+ "slot": {
+ "x": 16,
+ "y": 169.5,
+ "w": 358,
+ "h": 628.5,
+ "right": 374,
+ "bottom": 798
+ },
+ "header": {
+ "x": 16,
+ "y": 383.0625,
+ "w": 390,
+ "h": 49,
+ "right": 406,
+ "bottom": 432.0625
+ },
+ "viewport": {
+ "w": 390,
+ "h": 844
+ },
+ "overflow": 0
+ }
+ },
+ {
+ "name": "16:9 fitted to both Inner dimensions at 1000x500",
+ "status": "PASS",
+ "data": {
+ "stage": {
+ "x": 247.109375,
+ "y": 169.5,
+ "w": 505.765625,
+ "h": 284.5,
+ "right": 752.875,
+ "bottom": 454
+ },
+ "slot": {
+ "x": 30,
+ "y": 169.5,
+ "w": 940,
+ "h": 284.5,
+ "right": 970,
+ "bottom": 454
+ },
+ "header": {
+ "x": 247.109375,
+ "y": 169.5,
+ "w": 505.765625,
+ "h": 49,
+ "right": 752.875,
+ "bottom": 218.5
+ },
+ "viewport": {
+ "w": 1000,
+ "h": 500
+ },
+ "overflow": 0
+ }
+ },
+ {
+ "name": "one Header and no duplicate fixed Figma specimen",
+ "status": "PASS"
+ },
+ {
+ "name": "document selection updates Header and Callback",
+ "status": "PASS",
+ "data": "onDocumentClick → documentOpen(true) → onDocumentSelect(doc-2) → documentOpen(false)"
+ },
+ {
+ "name": "layer selection updates shared data",
+ "status": "PASS",
+ "data": "onDocumentClick → documentOpen(true) → onDocumentSelect(doc-2) → documentOpen(false) → onLayerOpen → onLayerSelect(layer, CC-D GNL)"
+ },
+ {
+ "name": "existing layer Detail callback closes list",
+ "status": "PASS"
+ },
+ {
+ "name": "color selection invokes host callback",
+ "status": "PASS",
+ "data": "onLayerOpen → onLayerSelect(layer, CC-D GNL) → onLayerOpen → onLayerDetail → onColorOpen → onColorSelect(color, 255,255,255)"
+ },
+ {
+ "name": "line selection updates Header",
+ "status": "PASS",
+ "data": "onLayerOpen → onLayerDetail → onColorOpen → onColorSelect(color, 255,255,255) → onLineStyleOpen → onLineTypeSelect(line, CENTER)"
+ },
+ {
+ "name": "ByLayer weight mode does not turn numeric property into a mode string",
+ "status": "PASS"
+ },
+ {
+ "name": "text style selection updates Header",
+ "status": "PASS",
+ "data": "onColorSelect(color, 255,255,255) → onLineStyleOpen → onLineTypeSelect(line, CENTER) → onLineWeightSelect(w-bylayer) → onTextStyleOpen → onTextStyleSelect(dotum)"
+ },
+ {
+ "name": "dimension style selection updates Header",
+ "status": "PASS",
+ "data": "onLineTypeSelect(line, CENTER) → onLineWeightSelect(w-bylayer) → onTextStyleOpen → onTextStyleSelect(dotum) → onDimensionStyleOpen → onDimensionStyleSelect(iso-25)"
+ },
+ {
+ "name": "opening another dropdown closes the previous one",
+ "status": "PASS"
+ },
+ {
+ "name": "Escape closes Header dropdown",
+ "status": "PASS"
+ },
+ {
+ "name": "outside click closes Header dropdown",
+ "status": "PASS"
+ },
+ {
+ "name": "Bar Enter commits state",
+ "status": "PASS"
+ },
+ {
+ "name": "Bar validates min=0",
+ "status": "PASS"
+ },
+ {
+ "name": "Bar Escape cancels edit",
+ "status": "PASS"
+ },
+ {
+ "name": "Header opens panel with same Bar value",
+ "status": "PASS"
+ },
+ {
+ "name": "numeric weight property remains numeric after ByLayer mode",
+ "status": "PASS"
+ },
+ {
+ "name": "Header layer value shared with panel",
+ "status": "PASS"
+ },
+ {
+ "name": "panel edit updates the Bar",
+ "status": "PASS"
+ },
+ {
+ "name": "panel number validation rejects negative radius",
+ "status": "PASS"
+ },
+ {
+ "name": "panel Layer dropdown updates Header shared value",
+ "status": "PASS"
+ },
+ {
+ "name": "panel line dropdown updates Header shared value",
+ "status": "PASS"
+ },
+ {
+ "name": "panel color dropdown updates Header shared value",
+ "status": "PASS"
+ },
+ {
+ "name": "panel RGB validation rejects out-of-range value",
+ "status": "PASS"
+ },
+ {
+ "name": "gauge keyboard editing commits host state",
+ "status": "PASS"
+ },
+ {
+ "name": "first Escape cancels draft and retains panel",
+ "status": "PASS"
+ },
+ {
+ "name": "next Escape closes panel and restores Header focus",
+ "status": "PASS"
+ },
+ {
+ "name": "panel Close button restores focus",
+ "status": "PASS"
+ },
+ {
+ "name": "external Props update Bar",
+ "status": "PASS"
+ },
+ {
+ "name": "Bar ReadOnly",
+ "status": "PASS"
+ },
+ {
+ "name": "Bar Disabled",
+ "status": "PASS"
+ },
+ {
+ "name": "dynamic Bar field added",
+ "status": "PASS"
+ },
+ {
+ "name": "dynamic field shared with panel",
+ "status": "PASS"
+ },
+ {
+ "name": "dynamic field removed from both",
+ "status": "PASS"
+ },
+ {
+ "name": "shape Slot can be empty without changing panel structure",
+ "status": "PASS"
+ },
+ {
+ "name": "original panel size none:314x256",
+ "status": "PASS",
+ "data": {
+ "x": 1000,
+ "y": 301.25,
+ "width": 314,
+ "height": 256
+ }
+ },
+ {
+ "name": "original panel size all:314x361",
+ "status": "PASS",
+ "data": {
+ "x": 1000,
+ "y": 301.25,
+ "width": 314,
+ "height": 361
+ }
+ },
+ {
+ "name": "original panel size circle:314x658",
+ "status": "PASS",
+ "data": {
+ "x": 1000,
+ "y": 301.25,
+ "width": 314,
+ "height": 658
+ }
+ },
+ {
+ "name": "original panel size expanded:314x754",
+ "status": "PASS",
+ "data": {
+ "x": 1000,
+ "y": 301.25,
+ "width": 314,
+ "height": 754
+ }
+ },
+ {
+ "name": "expanded popup bottom accessible through internal scroll",
+ "status": "PASS"
+ },
+ {
+ "name": "small Inner reaches full popup bottom with native Header and popup dimensions",
+ "status": "PASS",
+ "data": {
+ "top": 630,
+ "left": 16,
+ "height": 201,
+ "scrollHeight": 831,
+ "width": 358,
+ "scrollWidth": 390
+ }
+ },
+ {
+ "name": "narrow popup Escape restores More focus",
+ "status": "PASS"
+ },
+ {
+ "name": "actual Storybook manager iframe fits its own Inner",
+ "status": "PASS",
+ "data": {
+ "width": 1071.59375,
+ "height": 602.765625,
+ "slotWidth": 1071.59375,
+ "slotHeight": 744.5,
+ "viewportWidth": 1140,
+ "viewportHeight": 960
+ }
+ },
+ {
+ "name": "no browser errors",
+ "status": "PASS",
+ "data": []
+ }
+ ],
+ "errors": [],
+ "sizes": [
+ {
+ "stage": {
+ "x": 360,
+ "y": 264.25,
+ "w": 1200,
+ "h": 675,
+ "right": 1560,
+ "bottom": 939.25
+ },
+ "slot": {
+ "x": 360,
+ "y": 169.5,
+ "w": 1200,
+ "h": 864.5,
+ "right": 1560,
+ "bottom": 1034
+ },
+ "header": {
+ "x": 360,
+ "y": 264.25,
+ "w": 1200,
+ "h": 49,
+ "right": 1560,
+ "bottom": 313.25
+ },
+ "viewport": {
+ "w": 1920,
+ "h": 1080
+ },
+ "overflow": 0
+ },
+ {
+ "stage": {
+ "x": 120,
+ "y": 174.25,
+ "w": 1200,
+ "h": 675,
+ "right": 1320,
+ "bottom": 849.25
+ },
+ "slot": {
+ "x": 120,
+ "y": 169.5,
+ "w": 1200,
+ "h": 684.5,
+ "right": 1320,
+ "bottom": 854
+ },
+ "header": {
+ "x": 120,
+ "y": 174.25,
+ "w": 1200,
+ "h": 49,
+ "right": 1320,
+ "bottom": 223.25
+ },
+ "viewport": {
+ "w": 1440,
+ "h": 900
+ },
+ "overflow": 0
+ },
+ {
+ "stage": {
+ "x": 191.5625,
+ "y": 169.5,
+ "w": 896.875,
+ "h": 504.5,
+ "right": 1088.4375,
+ "bottom": 674
+ },
+ "slot": {
+ "x": 38.40625,
+ "y": 169.5,
+ "w": 1203.1875,
+ "h": 504.5,
+ "right": 1241.59375,
+ "bottom": 674
+ },
+ "header": {
+ "x": 191.5625,
+ "y": 169.5,
+ "w": 896.875,
+ "h": 49,
+ "right": 1088.4375,
+ "bottom": 218.5
+ },
+ "viewport": {
+ "w": 1280,
+ "h": 720
+ },
+ "overflow": 0
+ },
+ {
+ "stage": {
+ "x": 42.21875,
+ "y": 169.5,
+ "w": 683.546875,
+ "h": 384.5,
+ "right": 725.765625,
+ "bottom": 554
+ },
+ "slot": {
+ "x": 23.046875,
+ "y": 169.5,
+ "w": 721.90625,
+ "h": 384.5,
+ "right": 744.953125,
+ "bottom": 554
+ },
+ "header": {
+ "x": 42.21875,
+ "y": 169.5,
+ "w": 683.546875,
+ "h": 49,
+ "right": 725.765625,
+ "bottom": 218.5
+ },
+ "viewport": {
+ "w": 768,
+ "h": 600
+ },
+ "overflow": 0
+ },
+ {
+ "stage": {
+ "x": 16,
+ "y": 383.0625,
+ "w": 358,
+ "h": 201.375,
+ "right": 374,
+ "bottom": 584.4375
+ },
+ "slot": {
+ "x": 16,
+ "y": 169.5,
+ "w": 358,
+ "h": 628.5,
+ "right": 374,
+ "bottom": 798
+ },
+ "header": {
+ "x": 16,
+ "y": 383.0625,
+ "w": 390,
+ "h": 49,
+ "right": 406,
+ "bottom": 432.0625
+ },
+ "viewport": {
+ "w": 390,
+ "h": 844
+ },
+ "overflow": 0
+ },
+ {
+ "stage": {
+ "x": 247.109375,
+ "y": 169.5,
+ "w": 505.765625,
+ "h": 284.5,
+ "right": 752.875,
+ "bottom": 454
+ },
+ "slot": {
+ "x": 30,
+ "y": 169.5,
+ "w": 940,
+ "h": 284.5,
+ "right": 970,
+ "bottom": 454
+ },
+ "header": {
+ "x": 247.109375,
+ "y": 169.5,
+ "w": 505.765625,
+ "h": 49,
+ "right": 752.875,
+ "bottom": 218.5
+ },
+ "viewport": {
+ "w": 1000,
+ "h": 500
+ },
+ "overflow": 0
+ }
+ ],
+ "browser": "155.0.8059.80",
+ "managerOrder": [
+ "sw-header--composed-controls",
+ "sw-header--overview",
+ "sw-header--interactive-states",
+ "sw-header--window-move-motion",
+ "sw-header--logo-slot",
+ "sw-header--document-dropdown",
+ "sw-header--responsive-more",
+ "sw-header--k-guide",
+ "sw-header--property-panel-compare"
+ ],
+ "status": "FAIL"
+}
diff --git a/docs/sw/integrated-improvement-qa/baseline-overview/manager-story-order.json b/docs/sw/integrated-improvement-qa/baseline-overview/manager-story-order.json
new file mode 100644
index 0000000..756b232
--- /dev/null
+++ b/docs/sw/integrated-improvement-qa/baseline-overview/manager-story-order.json
@@ -0,0 +1,11 @@
+[
+ "sw-header--composed-controls",
+ "sw-header--overview",
+ "sw-header--interactive-states",
+ "sw-header--window-move-motion",
+ "sw-header--logo-slot",
+ "sw-header--document-dropdown",
+ "sw-header--responsive-more",
+ "sw-header--k-guide",
+ "sw-header--property-panel-compare"
+]
diff --git a/docs/sw/integrated-improvement-qa/baseline-overview/overview-after-expanded.png b/docs/sw/integrated-improvement-qa/baseline-overview/overview-after-expanded.png
new file mode 100644
index 0000000..9afb4cf
Binary files /dev/null and b/docs/sw/integrated-improvement-qa/baseline-overview/overview-after-expanded.png differ
diff --git a/docs/sw/integrated-improvement-qa/baseline-overview/overview-after-scrolled.png b/docs/sw/integrated-improvement-qa/baseline-overview/overview-after-scrolled.png
new file mode 100644
index 0000000..dc5d847
Binary files /dev/null and b/docs/sw/integrated-improvement-qa/baseline-overview/overview-after-scrolled.png differ
diff --git a/docs/sw/integrated-improvement-qa/baseline-overview/overview-after.png b/docs/sw/integrated-improvement-qa/baseline-overview/overview-after.png
new file mode 100644
index 0000000..8a64869
Binary files /dev/null and b/docs/sw/integrated-improvement-qa/baseline-overview/overview-after.png differ
diff --git a/docs/sw/integrated-improvement-qa/baseline-overview/overview-manager.png b/docs/sw/integrated-improvement-qa/baseline-overview/overview-manager.png
new file mode 100644
index 0000000..f44c5ac
Binary files /dev/null and b/docs/sw/integrated-improvement-qa/baseline-overview/overview-manager.png differ
diff --git a/docs/sw/integrated-improvement-qa/baseline-overview/overview-narrow.png b/docs/sw/integrated-improvement-qa/baseline-overview/overview-narrow.png
new file mode 100644
index 0000000..134f239
Binary files /dev/null and b/docs/sw/integrated-improvement-qa/baseline-overview/overview-narrow.png differ
diff --git a/docs/sw/integrated-improvement-qa/baseline-storybook-unused-removal/compare-1280-end.png b/docs/sw/integrated-improvement-qa/baseline-storybook-unused-removal/compare-1280-end.png
new file mode 100644
index 0000000..fca3565
Binary files /dev/null and b/docs/sw/integrated-improvement-qa/baseline-storybook-unused-removal/compare-1280-end.png differ
diff --git a/docs/sw/integrated-improvement-qa/baseline-storybook-unused-removal/compare-1440-end.png b/docs/sw/integrated-improvement-qa/baseline-storybook-unused-removal/compare-1440-end.png
new file mode 100644
index 0000000..d3d82b0
Binary files /dev/null and b/docs/sw/integrated-improvement-qa/baseline-storybook-unused-removal/compare-1440-end.png differ
diff --git a/docs/sw/integrated-improvement-qa/baseline-storybook-unused-removal/compare-390-end.png b/docs/sw/integrated-improvement-qa/baseline-storybook-unused-removal/compare-390-end.png
new file mode 100644
index 0000000..9fc5f41
Binary files /dev/null and b/docs/sw/integrated-improvement-qa/baseline-storybook-unused-removal/compare-390-end.png differ
diff --git a/docs/sw/integrated-improvement-qa/baseline-storybook-unused-removal/compare-768-end.png b/docs/sw/integrated-improvement-qa/baseline-storybook-unused-removal/compare-768-end.png
new file mode 100644
index 0000000..4686f20
Binary files /dev/null and b/docs/sw/integrated-improvement-qa/baseline-storybook-unused-removal/compare-768-end.png differ
diff --git a/docs/sw/integrated-improvement-qa/baseline-storybook-unused-removal/dropdown-1280.png b/docs/sw/integrated-improvement-qa/baseline-storybook-unused-removal/dropdown-1280.png
new file mode 100644
index 0000000..71b3615
Binary files /dev/null and b/docs/sw/integrated-improvement-qa/baseline-storybook-unused-removal/dropdown-1280.png differ
diff --git a/docs/sw/integrated-improvement-qa/baseline-storybook-unused-removal/dropdown-1440.png b/docs/sw/integrated-improvement-qa/baseline-storybook-unused-removal/dropdown-1440.png
new file mode 100644
index 0000000..af06cb7
Binary files /dev/null and b/docs/sw/integrated-improvement-qa/baseline-storybook-unused-removal/dropdown-1440.png differ
diff --git a/docs/sw/integrated-improvement-qa/baseline-storybook-unused-removal/dropdown-390.png b/docs/sw/integrated-improvement-qa/baseline-storybook-unused-removal/dropdown-390.png
new file mode 100644
index 0000000..66cf027
Binary files /dev/null and b/docs/sw/integrated-improvement-qa/baseline-storybook-unused-removal/dropdown-390.png differ
diff --git a/docs/sw/integrated-improvement-qa/baseline-storybook-unused-removal/dropdown-768.png b/docs/sw/integrated-improvement-qa/baseline-storybook-unused-removal/dropdown-768.png
new file mode 100644
index 0000000..2a55839
Binary files /dev/null and b/docs/sw/integrated-improvement-qa/baseline-storybook-unused-removal/dropdown-768.png differ
diff --git a/docs/sw/integrated-improvement-qa/baseline-storybook-unused-removal/manager-sidebar.png b/docs/sw/integrated-improvement-qa/baseline-storybook-unused-removal/manager-sidebar.png
new file mode 100644
index 0000000..df26275
Binary files /dev/null and b/docs/sw/integrated-improvement-qa/baseline-storybook-unused-removal/manager-sidebar.png differ
diff --git a/docs/sw/integrated-improvement-qa/baseline-storybook-unused-removal/manager-story-order.json b/docs/sw/integrated-improvement-qa/baseline-storybook-unused-removal/manager-story-order.json
new file mode 100644
index 0000000..11e2001
--- /dev/null
+++ b/docs/sw/integrated-improvement-qa/baseline-storybook-unused-removal/manager-story-order.json
@@ -0,0 +1,38 @@
+[
+ [
+ "sw-header--composed-controls",
+ "Dropdown"
+ ],
+ [
+ "sw-header--overview",
+ "Overview"
+ ],
+ [
+ "sw-header--interactive-states",
+ "Interactive States"
+ ],
+ [
+ "sw-header--window-move-motion",
+ "Window Move Motion"
+ ],
+ [
+ "sw-header--logo-slot",
+ "Logo Slot"
+ ],
+ [
+ "sw-header--document-dropdown",
+ "Document Dropdown"
+ ],
+ [
+ "sw-header--responsive-more",
+ "Responsive More"
+ ],
+ [
+ "sw-header--k-guide",
+ "K Guide"
+ ],
+ [
+ "sw-header--property-panel-compare",
+ "Property Panel · 4개 비교"
+ ]
+]
diff --git a/docs/sw/integrated-improvement-qa/baseline-storybook-unused-removal/overview-1280.png b/docs/sw/integrated-improvement-qa/baseline-storybook-unused-removal/overview-1280.png
new file mode 100644
index 0000000..4fd85cb
Binary files /dev/null and b/docs/sw/integrated-improvement-qa/baseline-storybook-unused-removal/overview-1280.png differ
diff --git a/docs/sw/integrated-improvement-qa/baseline-storybook-unused-removal/overview-1440.png b/docs/sw/integrated-improvement-qa/baseline-storybook-unused-removal/overview-1440.png
new file mode 100644
index 0000000..4301028
Binary files /dev/null and b/docs/sw/integrated-improvement-qa/baseline-storybook-unused-removal/overview-1440.png differ
diff --git a/docs/sw/integrated-improvement-qa/baseline-storybook-unused-removal/overview-390.png b/docs/sw/integrated-improvement-qa/baseline-storybook-unused-removal/overview-390.png
new file mode 100644
index 0000000..caa2b39
Binary files /dev/null and b/docs/sw/integrated-improvement-qa/baseline-storybook-unused-removal/overview-390.png differ
diff --git a/docs/sw/integrated-improvement-qa/baseline-storybook-unused-removal/overview-768.png b/docs/sw/integrated-improvement-qa/baseline-storybook-unused-removal/overview-768.png
new file mode 100644
index 0000000..5eb5417
Binary files /dev/null and b/docs/sw/integrated-improvement-qa/baseline-storybook-unused-removal/overview-768.png differ
diff --git a/docs/sw/integrated-improvement-qa/baseline-storybook-unused-removal/result.json b/docs/sw/integrated-improvement-qa/baseline-storybook-unused-removal/result.json
new file mode 100644
index 0000000..d32fdf5
--- /dev/null
+++ b/docs/sw/integrated-improvement-qa/baseline-storybook-unused-removal/result.json
@@ -0,0 +1,1140 @@
+{
+ "baseCommit": "c8e5fbeebc26fba92998fc5ddcd28c6c110e452d",
+ "checks": [
+ {
+ "name": "inventory: 19 -> 10 SW Stories, 338 -> 329 total",
+ "status": "PASS",
+ "data": {
+ "before": [
+ 338,
+ 19
+ ],
+ "after": [
+ 329,
+ 10
+ ],
+ "sw": [
+ [
+ "sw-header--composed-controls",
+ "Dropdown"
+ ],
+ [
+ "sw-header--detail-buttons",
+ "Detail Buttons (Shared States)"
+ ],
+ [
+ "sw-header--overview",
+ "Overview"
+ ],
+ [
+ "sw-header--interactive-states",
+ "Interactive States"
+ ],
+ [
+ "sw-header--window-move-motion",
+ "Window Move Motion"
+ ],
+ [
+ "sw-header--logo-slot",
+ "Logo Slot"
+ ],
+ [
+ "sw-header--document-dropdown",
+ "Document Dropdown"
+ ],
+ [
+ "sw-header--responsive-more",
+ "Responsive More"
+ ],
+ [
+ "sw-header--k-guide",
+ "K Guide"
+ ],
+ [
+ "sw-header--property-panel-compare",
+ "Property Panel · 4개 비교"
+ ]
+ ]
+ }
+ },
+ {
+ "name": "inventory: the nine requested IDs existed before and are absent now",
+ "status": "PASS"
+ },
+ {
+ "name": "inventory: retained SW IDs, names, titles, tags and order unchanged",
+ "status": "PASS",
+ "data": [
+ "sw-header--composed-controls",
+ "sw-header--detail-buttons",
+ "sw-header--overview",
+ "sw-header--interactive-states",
+ "sw-header--window-move-motion",
+ "sw-header--logo-slot",
+ "sw-header--document-dropdown",
+ "sw-header--responsive-more",
+ "sw-header--k-guide",
+ "sw-header--property-panel-compare"
+ ]
+ },
+ {
+ "name": "inventory: every non-removed index entry identical (docs and other packages included)",
+ "status": "PASS"
+ },
+ {
+ "name": "inventory: Dropdown keeps sw-header--composed-controls / Dropdown / SW/Header",
+ "status": "PASS"
+ },
+ {
+ "name": "inventory: comparison keeps its ID and name",
+ "status": "PASS"
+ },
+ {
+ "name": "source: the nine Story exports are removed",
+ "status": "PASS"
+ },
+ {
+ "name": "source: retained exports (Stories and ComposedDemo) byte-identical",
+ "status": "PASS",
+ "data": []
+ },
+ {
+ "name": "source: runtime, public API, AI template, other packages, Overview, Dropdown CSF, assets and Storybook config untouched",
+ "status": "PASS",
+ "data": ""
+ },
+ {
+ "name": "sidebar: retained non-verification Stories in index order with their names",
+ "status": "PASS",
+ "data": [
+ [
+ "sw-header--composed-controls",
+ "Dropdown"
+ ],
+ [
+ "sw-header--overview",
+ "Overview"
+ ],
+ [
+ "sw-header--interactive-states",
+ "Interactive States"
+ ],
+ [
+ "sw-header--window-move-motion",
+ "Window Move Motion"
+ ],
+ [
+ "sw-header--logo-slot",
+ "Logo Slot"
+ ],
+ [
+ "sw-header--document-dropdown",
+ "Document Dropdown"
+ ],
+ [
+ "sw-header--responsive-more",
+ "Responsive More"
+ ],
+ [
+ "sw-header--k-guide",
+ "K Guide"
+ ],
+ [
+ "sw-header--property-panel-compare",
+ "Property Panel · 4개 비교"
+ ]
+ ]
+ },
+ {
+ "name": "sidebar: none of the nine removed menu IDs or names remain",
+ "status": "PASS",
+ "data": [
+ "Layer Detail · Input",
+ "Property Panel",
+ "Additional Hover",
+ "Property Bar",
+ "Dynamic Controls",
+ "Colorize",
+ "Composition (Visibility · Order)",
+ "Property Panel · 형상 Slot",
+ "Property Panel · 필드 13개"
+ ]
+ },
+ {
+ "name": "removed URL renders no SW Story",
+ "status": "PASS"
+ },
+ {
+ "name": "render sw-header--composed-controls",
+ "status": "PASS"
+ },
+ {
+ "name": "render sw-header--detail-buttons",
+ "status": "PASS"
+ },
+ {
+ "name": "render sw-header--overview",
+ "status": "PASS"
+ },
+ {
+ "name": "render sw-header--interactive-states",
+ "status": "PASS"
+ },
+ {
+ "name": "render sw-header--window-move-motion",
+ "status": "PASS"
+ },
+ {
+ "name": "render sw-header--logo-slot",
+ "status": "PASS"
+ },
+ {
+ "name": "render sw-header--document-dropdown",
+ "status": "PASS"
+ },
+ {
+ "name": "render sw-header--responsive-more",
+ "status": "PASS"
+ },
+ {
+ "name": "render sw-header--k-guide",
+ "status": "PASS"
+ },
+ {
+ "name": "render sw-header--property-panel-compare",
+ "status": "PASS"
+ },
+ {
+ "name": "Overview 390: one Header 49px, one Stage, no page overflow",
+ "status": "PASS",
+ "data": {
+ "height": 49
+ }
+ },
+ {
+ "name": "Overview 768: one Header 49px, one Stage, no page overflow",
+ "status": "PASS",
+ "data": {
+ "height": 49
+ }
+ },
+ {
+ "name": "Overview 1280: one Header 49px, one Stage, no page overflow",
+ "status": "PASS",
+ "data": {
+ "height": 49
+ }
+ },
+ {
+ "name": "Overview 1440: one Header 49px, one Stage, no page overflow",
+ "status": "PASS",
+ "data": {
+ "height": 49
+ }
+ },
+ {
+ "name": "Overview: layer Dropdown opens",
+ "status": "PASS"
+ },
+ {
+ "name": "Overview: Escape closes Dropdown and restores focus",
+ "status": "PASS"
+ },
+ {
+ "name": "Overview: layer Detail callback (former Layer Detail page) and close",
+ "status": "PASS"
+ },
+ {
+ "name": "Overview: btn_colorize 24 × 24 calls onColorPick and closes (former Colorize page)",
+ "status": "PASS",
+ "data": {
+ "x": 700,
+ "y": 324.25,
+ "width": 24,
+ "height": 24
+ }
+ },
+ {
+ "name": "Overview: property Bar Enter commits through callback",
+ "status": "PASS"
+ },
+ {
+ "name": "Overview: property Bar validation keeps min=0",
+ "status": "PASS"
+ },
+ {
+ "name": "Overview: panel opens with the shared Bar value",
+ "status": "PASS"
+ },
+ {
+ "name": "Overview: Escape closes panel and returns focus to its trigger",
+ "status": "PASS"
+ },
+ {
+ "name": "Dropdown: five fields plus the 상세보기 group (6 controls)",
+ "status": "PASS"
+ },
+ {
+ "name": "Dropdown 390: 레이어 opens, Escape closes, focus returns",
+ "status": "PASS"
+ },
+ {
+ "name": "Dropdown 390: 색상 opens, Escape closes, focus returns",
+ "status": "PASS"
+ },
+ {
+ "name": "Dropdown 390: 선스타일 opens, Escape closes, focus returns",
+ "status": "PASS"
+ },
+ {
+ "name": "Dropdown 390: 문자스타일 opens, Escape closes, focus returns",
+ "status": "PASS"
+ },
+ {
+ "name": "Dropdown 390: 치수스타일 opens, Escape closes, focus returns",
+ "status": "PASS"
+ },
+ {
+ "name": "Dropdown 390: no page overflow",
+ "status": "PASS"
+ },
+ {
+ "name": "Dropdown 768: 레이어 opens, Escape closes, focus returns",
+ "status": "PASS"
+ },
+ {
+ "name": "Dropdown 768: 색상 opens, Escape closes, focus returns",
+ "status": "PASS"
+ },
+ {
+ "name": "Dropdown 768: 선스타일 opens, Escape closes, focus returns",
+ "status": "PASS"
+ },
+ {
+ "name": "Dropdown 768: 문자스타일 opens, Escape closes, focus returns",
+ "status": "PASS"
+ },
+ {
+ "name": "Dropdown 768: 치수스타일 opens, Escape closes, focus returns",
+ "status": "PASS"
+ },
+ {
+ "name": "Dropdown 768: no page overflow",
+ "status": "PASS"
+ },
+ {
+ "name": "Dropdown 1280: 레이어 opens, Escape closes, focus returns",
+ "status": "PASS"
+ },
+ {
+ "name": "Dropdown 1280: 색상 opens, Escape closes, focus returns",
+ "status": "PASS"
+ },
+ {
+ "name": "Dropdown 1280: 선스타일 opens, Escape closes, focus returns",
+ "status": "PASS"
+ },
+ {
+ "name": "Dropdown 1280: 문자스타일 opens, Escape closes, focus returns",
+ "status": "PASS"
+ },
+ {
+ "name": "Dropdown 1280: 치수스타일 opens, Escape closes, focus returns",
+ "status": "PASS"
+ },
+ {
+ "name": "Dropdown 1280: no page overflow",
+ "status": "PASS"
+ },
+ {
+ "name": "Dropdown 1440: 레이어 opens, Escape closes, focus returns",
+ "status": "PASS"
+ },
+ {
+ "name": "Dropdown 1440: 색상 opens, Escape closes, focus returns",
+ "status": "PASS"
+ },
+ {
+ "name": "Dropdown 1440: 선스타일 opens, Escape closes, focus returns",
+ "status": "PASS"
+ },
+ {
+ "name": "Dropdown 1440: 문자스타일 opens, Escape closes, focus returns",
+ "status": "PASS"
+ },
+ {
+ "name": "Dropdown 1440: 치수스타일 opens, Escape closes, focus returns",
+ "status": "PASS"
+ },
+ {
+ "name": "Dropdown 1440: no page overflow",
+ "status": "PASS"
+ },
+ {
+ "name": "Dropdown: text style selection reflected in field and status",
+ "status": "PASS"
+ },
+ {
+ "name": "Dropdown: line style selection reflected",
+ "status": "PASS"
+ },
+ {
+ "name": "Compare 390: four states in order at 314 × 256 / 361 / 658 / 754",
+ "status": "PASS",
+ "data": [
+ {
+ "id": "none",
+ "x": 16,
+ "y": 212.5,
+ "right": 330,
+ "bottom": 534.5,
+ "w": 314,
+ "h": 256
+ },
+ {
+ "id": "all",
+ "x": 354,
+ "y": 212.5,
+ "right": 668,
+ "bottom": 639.5,
+ "w": 314,
+ "h": 361
+ },
+ {
+ "id": "circle",
+ "x": 16,
+ "y": 663.5,
+ "right": 330,
+ "bottom": 1387.5,
+ "w": 314,
+ "h": 658
+ },
+ {
+ "id": "expanded",
+ "x": 354,
+ "y": 663.5,
+ "right": 668,
+ "bottom": 1483.5,
+ "w": 314,
+ "h": 754
+ }
+ ]
+ },
+ {
+ "name": "Compare 390: 2 columns × 2 rows",
+ "status": "PASS"
+ },
+ {
+ "name": "Compare 390: Inner scroll reaches the 754px panel bottom; page does not scroll",
+ "status": "PASS",
+ "data": {
+ "cells": [
+ {
+ "id": "none",
+ "x": 16,
+ "y": 212.5,
+ "right": 330,
+ "bottom": 534.5,
+ "w": 314,
+ "h": 256
+ },
+ {
+ "id": "all",
+ "x": 354,
+ "y": 212.5,
+ "right": 668,
+ "bottom": 639.5,
+ "w": 314,
+ "h": 361
+ },
+ {
+ "id": "circle",
+ "x": 16,
+ "y": 663.5,
+ "right": 330,
+ "bottom": 1387.5,
+ "w": 314,
+ "h": 658
+ },
+ {
+ "id": "expanded",
+ "x": 354,
+ "y": 663.5,
+ "right": 668,
+ "bottom": 1483.5,
+ "w": 314,
+ "h": 754
+ }
+ ],
+ "reach": true,
+ "docFits": true
+ }
+ },
+ {
+ "name": "Compare 768: four states in order at 314 × 256 / 361 / 658 / 754",
+ "status": "PASS",
+ "data": [
+ {
+ "id": "none",
+ "x": 23.046875,
+ "y": 199.53125,
+ "right": 337.046875,
+ "bottom": 521.53125,
+ "w": 314,
+ "h": 256
+ },
+ {
+ "id": "all",
+ "x": 361.046875,
+ "y": 199.53125,
+ "right": 675.046875,
+ "bottom": 626.53125,
+ "w": 314,
+ "h": 361
+ },
+ {
+ "id": "circle",
+ "x": 23.046875,
+ "y": 650.53125,
+ "right": 337.046875,
+ "bottom": 1374.53125,
+ "w": 314,
+ "h": 658
+ },
+ {
+ "id": "expanded",
+ "x": 361.046875,
+ "y": 650.53125,
+ "right": 675.046875,
+ "bottom": 1470.53125,
+ "w": 314,
+ "h": 754
+ }
+ ]
+ },
+ {
+ "name": "Compare 768: 2 columns × 2 rows",
+ "status": "PASS"
+ },
+ {
+ "name": "Compare 768: Inner scroll reaches the 754px panel bottom; page does not scroll",
+ "status": "PASS",
+ "data": {
+ "cells": [
+ {
+ "id": "none",
+ "x": 23.046875,
+ "y": 199.53125,
+ "right": 337.046875,
+ "bottom": 521.53125,
+ "w": 314,
+ "h": 256
+ },
+ {
+ "id": "all",
+ "x": 361.046875,
+ "y": 199.53125,
+ "right": 675.046875,
+ "bottom": 626.53125,
+ "w": 314,
+ "h": 361
+ },
+ {
+ "id": "circle",
+ "x": 23.046875,
+ "y": 650.53125,
+ "right": 337.046875,
+ "bottom": 1374.53125,
+ "w": 314,
+ "h": 658
+ },
+ {
+ "id": "expanded",
+ "x": 361.046875,
+ "y": 650.53125,
+ "right": 675.046875,
+ "bottom": 1470.53125,
+ "w": 314,
+ "h": 754
+ }
+ ],
+ "reach": true,
+ "docFits": true
+ }
+ },
+ {
+ "name": "Compare 1280: four states in order at 314 × 256 / 361 / 658 / 754",
+ "status": "PASS",
+ "data": [
+ {
+ "id": "none",
+ "x": 38.40625,
+ "y": 214.890625,
+ "right": 352.40625,
+ "bottom": 536.890625,
+ "w": 314,
+ "h": 256
+ },
+ {
+ "id": "all",
+ "x": 376.40625,
+ "y": 214.890625,
+ "right": 690.40625,
+ "bottom": 641.890625,
+ "w": 314,
+ "h": 361
+ },
+ {
+ "id": "circle",
+ "x": 38.40625,
+ "y": 665.890625,
+ "right": 352.40625,
+ "bottom": 1389.890625,
+ "w": 314,
+ "h": 658
+ },
+ {
+ "id": "expanded",
+ "x": 376.40625,
+ "y": 665.890625,
+ "right": 690.40625,
+ "bottom": 1485.890625,
+ "w": 314,
+ "h": 754
+ }
+ ]
+ },
+ {
+ "name": "Compare 1280: 2 columns × 2 rows",
+ "status": "PASS"
+ },
+ {
+ "name": "Compare 1280: Inner scroll reaches the 754px panel bottom; page does not scroll",
+ "status": "PASS",
+ "data": {
+ "cells": [
+ {
+ "id": "none",
+ "x": 38.40625,
+ "y": 214.890625,
+ "right": 352.40625,
+ "bottom": 536.890625,
+ "w": 314,
+ "h": 256
+ },
+ {
+ "id": "all",
+ "x": 376.40625,
+ "y": 214.890625,
+ "right": 690.40625,
+ "bottom": 641.890625,
+ "w": 314,
+ "h": 361
+ },
+ {
+ "id": "circle",
+ "x": 38.40625,
+ "y": 665.890625,
+ "right": 352.40625,
+ "bottom": 1389.890625,
+ "w": 314,
+ "h": 658
+ },
+ {
+ "id": "expanded",
+ "x": 376.40625,
+ "y": 665.890625,
+ "right": 690.40625,
+ "bottom": 1485.890625,
+ "w": 314,
+ "h": 754
+ }
+ ],
+ "reach": true,
+ "docFits": true
+ }
+ },
+ {
+ "name": "Compare 1440: four states in order at 314 × 256 / 361 / 658 / 754",
+ "status": "PASS",
+ "data": [
+ {
+ "id": "none",
+ "x": 120,
+ "y": 216.5,
+ "right": 434,
+ "bottom": 538.5,
+ "w": 314,
+ "h": 256
+ },
+ {
+ "id": "all",
+ "x": 458,
+ "y": 216.5,
+ "right": 772,
+ "bottom": 643.5,
+ "w": 314,
+ "h": 361
+ },
+ {
+ "id": "circle",
+ "x": 120,
+ "y": 667.5,
+ "right": 434,
+ "bottom": 1391.5,
+ "w": 314,
+ "h": 658
+ },
+ {
+ "id": "expanded",
+ "x": 458,
+ "y": 667.5,
+ "right": 772,
+ "bottom": 1487.5,
+ "w": 314,
+ "h": 754
+ }
+ ]
+ },
+ {
+ "name": "Compare 1440: 2 columns × 2 rows",
+ "status": "PASS"
+ },
+ {
+ "name": "Compare 1440: Inner scroll reaches the 754px panel bottom; page does not scroll",
+ "status": "PASS",
+ "data": {
+ "cells": [
+ {
+ "id": "none",
+ "x": 120,
+ "y": 216.5,
+ "right": 434,
+ "bottom": 538.5,
+ "w": 314,
+ "h": 256
+ },
+ {
+ "id": "all",
+ "x": 458,
+ "y": 216.5,
+ "right": 772,
+ "bottom": 643.5,
+ "w": 314,
+ "h": 361
+ },
+ {
+ "id": "circle",
+ "x": 120,
+ "y": 667.5,
+ "right": 434,
+ "bottom": 1391.5,
+ "w": 314,
+ "h": 658
+ },
+ {
+ "id": "expanded",
+ "x": 458,
+ "y": 667.5,
+ "right": 772,
+ "bottom": 1487.5,
+ "w": 314,
+ "h": 754
+ }
+ ],
+ "reach": true,
+ "docFits": true
+ }
+ },
+ {
+ "name": "Compare: editable Input caret #E60403 (former Layer Detail · Input page)",
+ "status": "PASS"
+ },
+ {
+ "name": "Compare: Input Enter commits only in its own panel",
+ "status": "PASS"
+ },
+ {
+ "name": "Compare: Input Escape cancels",
+ "status": "PASS"
+ },
+ {
+ "name": "Compare: layer Dropdown selection commits via callback",
+ "status": "PASS"
+ },
+ {
+ "name": "Compare: Escape closes the Dropdown and returns focus",
+ "status": "PASS"
+ },
+ {
+ "name": "Motion: one section 「단계별 진행 (3배 확대)」 with nine stages at zoom 3",
+ "status": "PASS",
+ "data": [
+ {
+ "time": "rest",
+ "animations": 0,
+ "zoom": "3"
+ },
+ {
+ "time": "0",
+ "animations": 3,
+ "zoom": "3"
+ },
+ {
+ "time": "204.8780487804878",
+ "animations": 3,
+ "zoom": "3"
+ },
+ {
+ "time": "409.7560975609756",
+ "animations": 3,
+ "zoom": "3"
+ },
+ {
+ "time": "443.9024390243902",
+ "animations": 3,
+ "zoom": "3"
+ },
+ {
+ "time": "682.9268292682926",
+ "animations": 3,
+ "zoom": "3"
+ },
+ {
+ "time": "887.8048780487804",
+ "animations": 3,
+ "zoom": "3"
+ },
+ {
+ "time": "1365.8536585365853",
+ "animations": 3,
+ "zoom": "3"
+ },
+ {
+ "time": "1400",
+ "animations": 3,
+ "zoom": "3"
+ }
+ ]
+ },
+ {
+ "name": "Motion: rest stage static, timed stages hold three paused animations",
+ "status": "PASS",
+ "data": [
+ {
+ "time": "rest",
+ "animations": 0,
+ "zoom": "3"
+ },
+ {
+ "time": "0",
+ "animations": 3,
+ "zoom": "3"
+ },
+ {
+ "time": "204.8780487804878",
+ "animations": 3,
+ "zoom": "3"
+ },
+ {
+ "time": "409.7560975609756",
+ "animations": 3,
+ "zoom": "3"
+ },
+ {
+ "time": "443.9024390243902",
+ "animations": 3,
+ "zoom": "3"
+ },
+ {
+ "time": "682.9268292682926",
+ "animations": 3,
+ "zoom": "3"
+ },
+ {
+ "time": "887.8048780487804",
+ "animations": 3,
+ "zoom": "3"
+ },
+ {
+ "time": "1365.8536585365853",
+ "animations": 3,
+ "zoom": "3"
+ },
+ {
+ "time": "1400",
+ "animations": 3,
+ "zoom": "3"
+ }
+ ]
+ },
+ {
+ "name": "no browser console or page errors",
+ "status": "PASS",
+ "data": []
+ }
+ ],
+ "errors": [],
+ "data": {
+ "inventory": {
+ "before": [
+ 338,
+ 19
+ ],
+ "after": [
+ 329,
+ 10
+ ],
+ "sw": [
+ [
+ "sw-header--composed-controls",
+ "Dropdown"
+ ],
+ [
+ "sw-header--detail-buttons",
+ "Detail Buttons (Shared States)"
+ ],
+ [
+ "sw-header--overview",
+ "Overview"
+ ],
+ [
+ "sw-header--interactive-states",
+ "Interactive States"
+ ],
+ [
+ "sw-header--window-move-motion",
+ "Window Move Motion"
+ ],
+ [
+ "sw-header--logo-slot",
+ "Logo Slot"
+ ],
+ [
+ "sw-header--document-dropdown",
+ "Document Dropdown"
+ ],
+ [
+ "sw-header--responsive-more",
+ "Responsive More"
+ ],
+ [
+ "sw-header--k-guide",
+ "K Guide"
+ ],
+ [
+ "sw-header--property-panel-compare",
+ "Property Panel · 4개 비교"
+ ]
+ ]
+ },
+ "sidebar": [
+ [
+ "sw-header--composed-controls",
+ "Dropdown"
+ ],
+ [
+ "sw-header--overview",
+ "Overview"
+ ],
+ [
+ "sw-header--interactive-states",
+ "Interactive States"
+ ],
+ [
+ "sw-header--window-move-motion",
+ "Window Move Motion"
+ ],
+ [
+ "sw-header--logo-slot",
+ "Logo Slot"
+ ],
+ [
+ "sw-header--document-dropdown",
+ "Document Dropdown"
+ ],
+ [
+ "sw-header--responsive-more",
+ "Responsive More"
+ ],
+ [
+ "sw-header--k-guide",
+ "K Guide"
+ ],
+ [
+ "sw-header--property-panel-compare",
+ "Property Panel · 4개 비교"
+ ]
+ ],
+ "compare390": {
+ "cells": [
+ {
+ "id": "none",
+ "x": 16,
+ "y": 212.5,
+ "right": 330,
+ "bottom": 534.5,
+ "w": 314,
+ "h": 256
+ },
+ {
+ "id": "all",
+ "x": 354,
+ "y": 212.5,
+ "right": 668,
+ "bottom": 639.5,
+ "w": 314,
+ "h": 361
+ },
+ {
+ "id": "circle",
+ "x": 16,
+ "y": 663.5,
+ "right": 330,
+ "bottom": 1387.5,
+ "w": 314,
+ "h": 658
+ },
+ {
+ "id": "expanded",
+ "x": 354,
+ "y": 663.5,
+ "right": 668,
+ "bottom": 1483.5,
+ "w": 314,
+ "h": 754
+ }
+ ],
+ "reach": true,
+ "docFits": true
+ },
+ "compare768": {
+ "cells": [
+ {
+ "id": "none",
+ "x": 23.046875,
+ "y": 199.53125,
+ "right": 337.046875,
+ "bottom": 521.53125,
+ "w": 314,
+ "h": 256
+ },
+ {
+ "id": "all",
+ "x": 361.046875,
+ "y": 199.53125,
+ "right": 675.046875,
+ "bottom": 626.53125,
+ "w": 314,
+ "h": 361
+ },
+ {
+ "id": "circle",
+ "x": 23.046875,
+ "y": 650.53125,
+ "right": 337.046875,
+ "bottom": 1374.53125,
+ "w": 314,
+ "h": 658
+ },
+ {
+ "id": "expanded",
+ "x": 361.046875,
+ "y": 650.53125,
+ "right": 675.046875,
+ "bottom": 1470.53125,
+ "w": 314,
+ "h": 754
+ }
+ ],
+ "reach": true,
+ "docFits": true
+ },
+ "compare1280": {
+ "cells": [
+ {
+ "id": "none",
+ "x": 38.40625,
+ "y": 214.890625,
+ "right": 352.40625,
+ "bottom": 536.890625,
+ "w": 314,
+ "h": 256
+ },
+ {
+ "id": "all",
+ "x": 376.40625,
+ "y": 214.890625,
+ "right": 690.40625,
+ "bottom": 641.890625,
+ "w": 314,
+ "h": 361
+ },
+ {
+ "id": "circle",
+ "x": 38.40625,
+ "y": 665.890625,
+ "right": 352.40625,
+ "bottom": 1389.890625,
+ "w": 314,
+ "h": 658
+ },
+ {
+ "id": "expanded",
+ "x": 376.40625,
+ "y": 665.890625,
+ "right": 690.40625,
+ "bottom": 1485.890625,
+ "w": 314,
+ "h": 754
+ }
+ ],
+ "reach": true,
+ "docFits": true
+ },
+ "compare1440": {
+ "cells": [
+ {
+ "id": "none",
+ "x": 120,
+ "y": 216.5,
+ "right": 434,
+ "bottom": 538.5,
+ "w": 314,
+ "h": 256
+ },
+ {
+ "id": "all",
+ "x": 458,
+ "y": 216.5,
+ "right": 772,
+ "bottom": 643.5,
+ "w": 314,
+ "h": 361
+ },
+ {
+ "id": "circle",
+ "x": 120,
+ "y": 667.5,
+ "right": 434,
+ "bottom": 1391.5,
+ "w": 314,
+ "h": 658
+ },
+ {
+ "id": "expanded",
+ "x": 458,
+ "y": 667.5,
+ "right": 772,
+ "bottom": 1487.5,
+ "w": 314,
+ "h": 754
+ }
+ ],
+ "reach": true,
+ "docFits": true
+ }
+ },
+ "browser": "155.0.8059.80",
+ "status": "PASS"
+}
diff --git a/docs/sw/integrated-improvement-qa/baseline-storybook-unused-removal/story-inventory-after.json b/docs/sw/integrated-improvement-qa/baseline-storybook-unused-removal/story-inventory-after.json
new file mode 100644
index 0000000..ee24331
--- /dev/null
+++ b/docs/sw/integrated-improvement-qa/baseline-storybook-unused-removal/story-inventory-after.json
@@ -0,0 +1,106 @@
+{
+ "total": 329,
+ "sw": [
+ {
+ "id": "sw-header--composed-controls",
+ "name": "Dropdown",
+ "title": "SW/Header",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ]
+ },
+ {
+ "id": "sw-header--detail-buttons",
+ "name": "Detail Buttons (Shared States)",
+ "title": "SW/Header",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ]
+ },
+ {
+ "id": "sw-header--overview",
+ "name": "Overview",
+ "title": "SW/Header",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ]
+ },
+ {
+ "id": "sw-header--interactive-states",
+ "name": "Interactive States",
+ "title": "SW/Header",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ]
+ },
+ {
+ "id": "sw-header--window-move-motion",
+ "name": "Window Move Motion",
+ "title": "SW/Header",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ]
+ },
+ {
+ "id": "sw-header--logo-slot",
+ "name": "Logo Slot",
+ "title": "SW/Header",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ]
+ },
+ {
+ "id": "sw-header--document-dropdown",
+ "name": "Document Dropdown",
+ "title": "SW/Header",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ]
+ },
+ {
+ "id": "sw-header--responsive-more",
+ "name": "Responsive More",
+ "title": "SW/Header",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ]
+ },
+ {
+ "id": "sw-header--k-guide",
+ "name": "K Guide",
+ "title": "SW/Header",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ]
+ },
+ {
+ "id": "sw-header--property-panel-compare",
+ "name": "Property Panel · 4개 비교",
+ "title": "SW/Header",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ]
+ }
+ ]
+}
diff --git a/docs/sw/integrated-improvement-qa/build-reproducibility/build-reproducibility-result.json b/docs/sw/integrated-improvement-qa/build-reproducibility/build-reproducibility-result.json
new file mode 100644
index 0000000..c28be14
--- /dev/null
+++ b/docs/sw/integrated-improvement-qa/build-reproducibility/build-reproducibility-result.json
@@ -0,0 +1,114 @@
+{
+ "status": "PASS",
+ "commit": "5faa1f1ffe89eb7aeb4aaec81ac5bb2d0f4fced9",
+ "notLf": [],
+ "buildCommit": "5faa1f1ffe89eb7aeb4aaec81ac5bb2d0f4fced9+reproducibility-check",
+ "runs": [
+ {
+ "checkout": "LF",
+ "path": "C:\\Users\\user\\AppData\\Local\\Temp\\claude\\D---------HMDesign-SW\\9f00c085-5295-455b-8864-1b75de666f9d\\scratchpad\\repro-final\\lf",
+ "attempt": 1,
+ "tarball": "hm-design-sw-0.2.0.tgz",
+ "tarballSha256": "e98cc5eda023d135cac4d3d30b545461016e3f63a90bf9558b999fddf3982506",
+ "fileCount": 29
+ },
+ {
+ "checkout": "LF",
+ "path": "C:\\Users\\user\\AppData\\Local\\Temp\\claude\\D---------HMDesign-SW\\9f00c085-5295-455b-8864-1b75de666f9d\\scratchpad\\repro-final\\lf",
+ "attempt": 2,
+ "tarball": "hm-design-sw-0.2.0.tgz",
+ "tarballSha256": "e98cc5eda023d135cac4d3d30b545461016e3f63a90bf9558b999fddf3982506",
+ "fileCount": 29
+ },
+ {
+ "checkout": "LF",
+ "path": "C:\\Users\\user\\AppData\\Local\\Temp\\claude\\D---------HMDesign-SW\\9f00c085-5295-455b-8864-1b75de666f9d\\scratchpad\\repro-final\\deeper\\path\\lf",
+ "attempt": 1,
+ "tarball": "hm-design-sw-0.2.0.tgz",
+ "tarballSha256": "e98cc5eda023d135cac4d3d30b545461016e3f63a90bf9558b999fddf3982506",
+ "fileCount": 29
+ },
+ {
+ "checkout": "LF",
+ "path": "C:\\Users\\user\\AppData\\Local\\Temp\\claude\\D---------HMDesign-SW\\9f00c085-5295-455b-8864-1b75de666f9d\\scratchpad\\repro-final\\deeper\\path\\lf",
+ "attempt": 2,
+ "tarball": "hm-design-sw-0.2.0.tgz",
+ "tarballSha256": "e98cc5eda023d135cac4d3d30b545461016e3f63a90bf9558b999fddf3982506",
+ "fileCount": 29
+ },
+ {
+ "checkout": "CRLF",
+ "path": "C:\\Users\\user\\AppData\\Local\\Temp\\claude\\D---------HMDesign-SW\\9f00c085-5295-455b-8864-1b75de666f9d\\scratchpad\\repro-final\\crlf-copy",
+ "attempt": 1,
+ "tarball": "hm-design-sw-0.2.0.tgz",
+ "tarballSha256": "2e1b8ee4048a7ce579dc2fdc3d420309315bae7f4d8cef85db30bf2adbabaec1",
+ "fileCount": 29
+ },
+ {
+ "checkout": "CRLF",
+ "path": "C:\\Users\\user\\AppData\\Local\\Temp\\claude\\D---------HMDesign-SW\\9f00c085-5295-455b-8864-1b75de666f9d\\scratchpad\\repro-final\\crlf-copy",
+ "attempt": 2,
+ "tarball": "hm-design-sw-0.2.0.tgz",
+ "tarballSha256": "2e1b8ee4048a7ce579dc2fdc3d420309315bae7f4d8cef85db30bf2adbabaec1",
+ "fileCount": 29
+ }
+ ],
+ "referenceFiles": {
+ "dist/build-info.json": "efd00e884702f6a30b322ad03f7cf18ab146ad1e74f68640ee5e7e3ae1dbd34a",
+ "dist/components/sw-header/components/SWHeaderActions.d.ts": "c572d028522a56ac4bf1a5d7eb3d6e260b718fa3cac197d87757ec49f508af34",
+ "dist/components/sw-header/components/SWHeaderColorMenu.d.ts": "ff361ed274150c32a8a6931b31348b85de0463db642bd8c6af3c1bbb79fa5fda",
+ "dist/components/sw-header/components/SWHeaderDocumentTitle.d.ts": "ca96a9b886740d5b68b852d7494c35fe139c22df74f4fd13d342638a1b6ea439",
+ "dist/components/sw-header/components/SWHeaderDropdown.d.ts": "06ce5aa914826b6dc85df923a24baded80d16f43aebce39845f5b18d9d996504",
+ "dist/components/sw-header/components/SWHeaderField.d.ts": "741fdd1b0e7da4cf8f7adeaec021eb4eb103d7312f34e80135d00c3510159901",
+ "dist/components/sw-header/components/SWHeaderFields.d.ts": "43950332583b4c74231a793e18651b45494165626cc45e3dfcf50169ec189edc",
+ "dist/components/sw-header/components/SWHeaderHome.d.ts": "8696aa8f79f6e248ab5eacff363c180d382e58d2c37400cdf26a2446d43a6d3f",
+ "dist/components/sw-header/components/SWHeaderInput.d.ts": "6b379ee70b9bcbf6e9a0808ca891b86838a9bfa355bfa12f036088b26241dd9c",
+ "dist/components/sw-header/components/SWHeaderKGuide.d.ts": "093b413bf398f0172596469d6fb5b40f254fb2dbc9b141bd143d7ef9e2127f42",
+ "dist/components/sw-header/components/SWHeaderLayerIcons.d.ts": "84cf3ca7f8c89d679bcaa407790ce450d978a93be93e5de03caa029333d27fb0",
+ "dist/components/sw-header/components/SWHeaderLayerMenu.d.ts": "0fb65b14f52cd2abf54e74ea09ed4b783fe1665416dfd910bd6cd7d3e1995711",
+ "dist/components/sw-header/components/SWHeaderLineStyleMenu.d.ts": "d8ca8fc2543a1313793ceaa0e9e852f04dd6107027b2c51efcc080db60c34d29",
+ "dist/components/sw-header/components/SWHeaderMore.d.ts": "eba0b89eade44dd384db6d3da016c5b0c8b0544bed269918fbeb091dbdb93430",
+ "dist/components/sw-header/components/SWHeaderProperties.d.ts": "20ae22aac2d49c546d23c726ce5f210bd0f89024d60f24b2d75d9eba9524704f",
+ "dist/components/sw-header/components/SWHeaderPropertyBar.d.ts": "38fcf8305edfa6ff15917520cdbb446ac69d5200b17f5524304d106b8aeb7b91",
+ "dist/components/sw-header/components/SWHeaderPropertyFields.d.ts": "1277b0f3df27eac1f21c4ffb5554b95ed122d280b171f691259c50d7bbb7a037",
+ "dist/components/sw-header/components/SWHeaderPropertyPanel.d.ts": "dddffda48785d8fffc6d9c90f759f3287e939375cfc86887b1a9f75458d04309",
+ "dist/components/sw-header/components/SWHeaderStyleListMenus.d.ts": "6bbcf310fda8deed5c607fc85e8fb730b84c743a5a85be68d2549afa0341891d",
+ "dist/components/sw-header/components/SWHeaderWindowControls.d.ts": "db8bfbd14340e03c28e407f58fc08cef55b9eef49f406ba53fc50e994f5f0834",
+ "dist/components/sw-header/index.d.ts": "7f9a5677f64ae26ae97906b32425ba8fa22cd64d5d8e239a67cc44ef7ce85688",
+ "dist/components/sw-header/SWHeader.d.ts": "3adac1db372451d9f86a6f6df1df0e9696cd40c3ed7945531ee378da122136d8",
+ "dist/components/sw-header/types.d.ts": "5cafbb6ba475e988fe9aa0eca0eefd620c68e2c79e134e949d342df8ee3e9448",
+ "dist/components/sw-popup/SWPopup.d.ts": "c19e8372931cb81187c306c22c25a2e47bcfe3f3f25f849d458f972d87d361e8",
+ "dist/components/sw-theme/SWTheme.d.ts": "cdcc2e7c4b80241afa4d0b7c3da671b7086c16f9b9c231c1927c931757e4244c",
+ "dist/components/sw-tool/SWTool.d.ts": "23b1eb156578cd3f1dee325afbd81988d88c4a3f421f7350a0e8c47c652e804c",
+ "dist/index.d.ts": "d185a69b7bf04400a6c114d2694bf853b367d20e168f5a78cfbb78ce04aa21a6",
+ "dist/index.js": "363c9b3e0cff61306ac183a91d11241ef9acbed850efbda0948c2ac5a9d93a1d",
+ "dist/styles.css": "4c419e9776c51f9cce0f33fa7b9064f839f4a87311a3d3f8d2712eba3ed1c7d7"
+ },
+ "differences": [
+ {
+ "run": "LF #2",
+ "tarballSame": true,
+ "differentFiles": []
+ },
+ {
+ "run": "LF #1",
+ "tarballSame": true,
+ "differentFiles": []
+ },
+ {
+ "run": "LF #2",
+ "tarballSame": true,
+ "differentFiles": []
+ },
+ {
+ "run": "CRLF #1",
+ "tarballSame": false,
+ "differentFiles": []
+ },
+ {
+ "run": "CRLF #2",
+ "tarballSame": false,
+ "differentFiles": []
+ }
+ ]
+}
diff --git a/docs/sw/integrated-improvement-qa/consumer/integrated-consumer-result.json b/docs/sw/integrated-improvement-qa/consumer/integrated-consumer-result.json
new file mode 100644
index 0000000..866acd1
--- /dev/null
+++ b/docs/sw/integrated-improvement-qa/consumer/integrated-consumer-result.json
@@ -0,0 +1,683 @@
+{
+ "browser": "155.0.8059.80",
+ "checks": [
+ {
+ "name": "sw-first: every SVG/PNG asset decodes",
+ "status": "PASS",
+ "data": 54
+ },
+ {
+ "name": "sw-first F: Open next to the logo with documentOpenLabel",
+ "status": "PASS"
+ },
+ {
+ "name": "sw-first F: Open calls onDocumentOpen",
+ "status": "PASS",
+ "data": "document:open"
+ },
+ {
+ "name": "sw-first F: document dropdown without + New and Open (both hidden or placed)",
+ "status": "PASS"
+ },
+ {
+ "name": "sw-first F: layer rows have no freeze / lock buttons",
+ "status": "PASS"
+ },
+ {
+ "name": "sw-first F: Model / Layout radio group by keyboard",
+ "status": "PASS",
+ "data": "view:layout"
+ },
+ {
+ "name": "sw-first F: 2.5D toggle",
+ "status": "PASS"
+ },
+ {
+ "name": "sw-first F: Fit pill",
+ "status": "PASS"
+ },
+ {
+ "name": "sw-first F 640px: Open moved into More (measured), works there, no overflow",
+ "status": "PASS",
+ "data": {
+ "narrow": {
+ "open": 0,
+ "overflow": 0,
+ "height": 49
+ },
+ "inMore": true
+ }
+ },
+ {
+ "name": "sw-first F 1920px again: Open returns next to the logo",
+ "status": "PASS"
+ },
+ {
+ "name": "sw-first E: SW popup frame (314, #E4DBC9, #A67D03)",
+ "status": "PASS",
+ "data": {
+ "w": 314,
+ "bg": "rgb(228, 219, 201)",
+ "border": "rgb(166, 125, 3)"
+ }
+ },
+ {
+ "name": "sw-first E: row input commits",
+ "status": "PASS",
+ "data": "name:평면도-02"
+ },
+ {
+ "name": "sw-first E: layer dropdown inside the popup is a fixed overlay",
+ "status": "PASS"
+ },
+ {
+ "name": "sw-first E: layer selection callback",
+ "status": "PASS",
+ "data": "layer:dim"
+ },
+ {
+ "name": "sw-first UI in popup: Switch",
+ "status": "PASS",
+ "data": "ui:snap:false"
+ },
+ {
+ "name": "sw-first UI in popup: Select (portal)",
+ "status": "PASS",
+ "data": "ui:unit:cm"
+ },
+ {
+ "name": "sw-first UI in popup: Slider",
+ "status": "PASS",
+ "data": "ui:opacity:70"
+ },
+ {
+ "name": "sw-first UI in popup: Button",
+ "status": "PASS",
+ "data": "ui:apply"
+ },
+ {
+ "name": "sw-first Escape outside closes only the last used popup",
+ "status": "PASS",
+ "data": "ui:close"
+ },
+ {
+ "name": "sw-first Escape inside a popup closes that popup",
+ "status": "PASS",
+ "data": "popup:close"
+ },
+ {
+ "name": "ui-first: every SVG/PNG asset decodes",
+ "status": "PASS",
+ "data": 54
+ },
+ {
+ "name": "ui-first F: Open next to the logo with documentOpenLabel",
+ "status": "PASS"
+ },
+ {
+ "name": "ui-first F: Open calls onDocumentOpen",
+ "status": "PASS",
+ "data": "document:open"
+ },
+ {
+ "name": "ui-first F: document dropdown without + New and Open (both hidden or placed)",
+ "status": "PASS"
+ },
+ {
+ "name": "ui-first F: layer rows have no freeze / lock buttons",
+ "status": "PASS"
+ },
+ {
+ "name": "ui-first F: Model / Layout radio group by keyboard",
+ "status": "PASS",
+ "data": "view:layout"
+ },
+ {
+ "name": "ui-first F: 2.5D toggle",
+ "status": "PASS"
+ },
+ {
+ "name": "ui-first F: Fit pill",
+ "status": "PASS"
+ },
+ {
+ "name": "ui-first F 640px: Open moved into More (measured), works there, no overflow",
+ "status": "PASS",
+ "data": {
+ "narrow": {
+ "open": 0,
+ "overflow": 0,
+ "height": 49
+ },
+ "inMore": true
+ }
+ },
+ {
+ "name": "ui-first F 1920px again: Open returns next to the logo",
+ "status": "PASS"
+ },
+ {
+ "name": "ui-first E: SW popup frame (314, #E4DBC9, #A67D03)",
+ "status": "PASS",
+ "data": {
+ "w": 314,
+ "bg": "rgb(228, 219, 201)",
+ "border": "rgb(166, 125, 3)"
+ }
+ },
+ {
+ "name": "ui-first E: row input commits",
+ "status": "PASS",
+ "data": "name:평면도-02"
+ },
+ {
+ "name": "ui-first E: layer dropdown inside the popup is a fixed overlay",
+ "status": "PASS"
+ },
+ {
+ "name": "ui-first E: layer selection callback",
+ "status": "PASS",
+ "data": "layer:dim"
+ },
+ {
+ "name": "ui-first UI in popup: Switch",
+ "status": "PASS",
+ "data": "ui:snap:false"
+ },
+ {
+ "name": "ui-first UI in popup: Select (portal)",
+ "status": "PASS",
+ "data": "ui:unit:cm"
+ },
+ {
+ "name": "ui-first UI in popup: Slider",
+ "status": "PASS",
+ "data": "ui:opacity:70"
+ },
+ {
+ "name": "ui-first UI in popup: Button",
+ "status": "PASS",
+ "data": "ui:apply"
+ },
+ {
+ "name": "ui-first Escape outside closes only the last used popup",
+ "status": "PASS",
+ "data": "ui:close"
+ },
+ {
+ "name": "ui-first Escape inside a popup closes that popup",
+ "status": "PASS",
+ "data": "popup:close"
+ },
+ {
+ "name": "stylesheet order (SW first / UI first) changes no computed SW or UI style",
+ "status": "PASS",
+ "data": {
+ "differences": [],
+ "missing": []
+ }
+ },
+ {
+ "name": "no page/console errors",
+ "status": "PASS",
+ "data": []
+ }
+ ],
+ "errors": [],
+ "styles": {
+ "sw-first": {
+ "header": {
+ "w": 1920,
+ "h": 49,
+ "background-color": "rgb(6, 6, 6)",
+ "background-image": "none",
+ "border-top": "0px solid rgb(154, 146, 132)",
+ "border-radius": "0px",
+ "box-shadow": "none",
+ "color": "rgb(246, 244, 242)",
+ "font-family": "\"Noto Sans KR\", \"Malgun Gothic\", \"Apple SD Gothic Neo\", sans-serif",
+ "font-size": "14px",
+ "font-weight": "400",
+ "padding": "0px",
+ "margin": "0px"
+ },
+ "field": {
+ "w": 234,
+ "h": 38,
+ "background-color": "rgba(0, 0, 0, 0)",
+ "background-image": "linear-gradient(0deg, rgba(0, 0, 0, 0.45) 0%, rgba(0, 0, 0, 0.45) 26.41%, rgba(0, 0, 0, 0.4) 70%, rgba(0, 0, 0, 0.45) 100%)",
+ "border-top": "1px solid rgb(8, 37, 28)",
+ "border-radius": "3px",
+ "box-shadow": "rgba(9, 39, 30, 0.7) 0px 1px 4px 0px",
+ "color": "rgb(246, 244, 242)",
+ "font-family": "\"Noto Sans KR\", \"Malgun Gothic\", \"Apple SD Gothic Neo\", sans-serif",
+ "font-size": "14px",
+ "font-weight": "400",
+ "padding": "0px 10px 0px 12px",
+ "margin": "0px"
+ },
+ "documentButton": {
+ "w": 310,
+ "h": 48,
+ "background-color": "rgba(0, 0, 0, 0)",
+ "background-image": "linear-gradient(rgb(8, 24, 19) 0%, rgb(9, 39, 30) 8.69%, rgb(11, 50, 39) 25.43%, rgb(14, 61, 47) 51.25%, rgb(11, 50, 39) 80.03%, rgb(10, 43, 33) 89.76%, rgb(8, 24, 19) 100%)",
+ "border-top": "1px solid rgb(14, 76, 58)",
+ "border-radius": "0px",
+ "box-shadow": "none",
+ "color": "rgb(240, 247, 245)",
+ "font-family": "\"Noto Sans KR\", \"Malgun Gothic\", \"Apple SD Gothic Neo\", sans-serif",
+ "font-size": "14px",
+ "font-weight": "700",
+ "padding": "0px 12px 0px 5px",
+ "margin": "0px"
+ },
+ "toggle": {
+ "w": 78,
+ "h": 19,
+ "background-color": "rgba(0, 0, 0, 0)",
+ "background-image": "none",
+ "border-top": "0px none rgb(246, 244, 242)",
+ "border-radius": "2px",
+ "box-shadow": "none",
+ "color": "rgb(246, 244, 242)",
+ "font-family": "\"Noto Sans KR\", \"Malgun Gothic\", \"Apple SD Gothic Neo\", sans-serif",
+ "font-size": "14px",
+ "font-weight": "700",
+ "padding": "0px",
+ "margin": "0px"
+ },
+ "open": {
+ "w": 77.6,
+ "h": 48,
+ "background-color": "rgba(0, 0, 0, 0)",
+ "background-image": "linear-gradient(rgb(8, 24, 19) 0%, rgb(9, 39, 30) 8.69%, rgb(11, 50, 39) 25.43%, rgb(14, 61, 47) 51.25%, rgb(11, 50, 39) 80.03%, rgb(10, 43, 33) 89.76%, rgb(8, 24, 19) 100%)",
+ "border-top": "1px solid rgb(14, 76, 58)",
+ "border-radius": "0px",
+ "box-shadow": "none",
+ "color": "rgb(240, 247, 245)",
+ "font-family": "\"Noto Sans KR\", \"Malgun Gothic\", \"Apple SD Gothic Neo\", sans-serif",
+ "font-size": "14px",
+ "font-weight": "700",
+ "padding": "0px 12px 0px 5px",
+ "margin": "0px"
+ },
+ "toolText": {
+ "w": 61.1,
+ "h": 19,
+ "background-color": "rgba(0, 0, 0, 0)",
+ "background-image": "none",
+ "border-top": "0px none rgb(255, 198, 0)",
+ "border-radius": "2px",
+ "box-shadow": "none",
+ "color": "rgb(255, 198, 0)",
+ "font-family": "\"Noto Sans KR\", \"Malgun Gothic\", \"Apple SD Gothic Neo\", sans-serif",
+ "font-size": "14px",
+ "font-weight": "700",
+ "padding": "0px 8px",
+ "margin": "0px"
+ },
+ "toolPill": {
+ "w": 40,
+ "h": 38,
+ "background-color": "rgba(0, 0, 0, 0)",
+ "background-image": "linear-gradient(rgb(8, 24, 19) 0%, rgb(9, 39, 30) 8.69%, rgb(11, 50, 39) 25.43%, rgb(14, 61, 47) 51.25%, rgb(11, 50, 39) 80.03%, rgb(10, 43, 33) 89.76%, rgb(8, 24, 19) 100%)",
+ "border-top": "1px solid rgb(8, 37, 28)",
+ "border-radius": "2px",
+ "box-shadow": "none",
+ "color": "rgb(246, 244, 242)",
+ "font-family": "\"Noto Sans KR\", \"Malgun Gothic\", \"Apple SD Gothic Neo\", sans-serif",
+ "font-size": "14px",
+ "font-weight": "400",
+ "padding": "0px",
+ "margin": "0px"
+ },
+ "popup": {
+ "w": 314,
+ "h": 306,
+ "background-color": "rgb(228, 219, 201)",
+ "background-image": "none",
+ "border-top": "1px solid rgb(166, 125, 3)",
+ "border-radius": "4px",
+ "box-shadow": "rgb(0, 0, 0) 0px 0px 0px 1px inset",
+ "color": "rgb(0, 0, 0)",
+ "font-family": "\"Noto Sans KR\", \"Malgun Gothic\", \"Apple SD Gothic Neo\", sans-serif",
+ "font-size": "14px",
+ "font-weight": "400",
+ "padding": "0px",
+ "margin": "0px"
+ },
+ "popupTitle": {
+ "w": 261,
+ "h": 16,
+ "background-color": "rgba(0, 0, 0, 0)",
+ "background-image": "none",
+ "border-top": "0px solid rgb(154, 146, 132)",
+ "border-radius": "0px",
+ "box-shadow": "none",
+ "color": "rgb(255, 198, 0)",
+ "font-family": "\"Noto Sans KR\", \"Malgun Gothic\", \"Apple SD Gothic Neo\", sans-serif",
+ "font-size": "14px",
+ "font-weight": "700",
+ "padding": "0px 4px 0px 0px",
+ "margin": "0px 0px 0px 7px"
+ },
+ "popupRow": {
+ "w": 292,
+ "h": 32,
+ "background-color": "rgba(0, 0, 0, 0)",
+ "background-image": "none",
+ "border-top": "0px solid rgb(154, 146, 132)",
+ "border-radius": "0px",
+ "box-shadow": "none",
+ "color": "rgb(0, 0, 0)",
+ "font-family": "\"Noto Sans KR\", \"Malgun Gothic\", \"Apple SD Gothic Neo\", sans-serif",
+ "font-size": "14px",
+ "font-weight": "400",
+ "padding": "0px 6px",
+ "margin": "0px"
+ },
+ "popupInput": {
+ "w": 184,
+ "h": 26,
+ "background-color": "rgba(0, 0, 0, 0)",
+ "background-image": "none",
+ "border-top": "0px none rgb(230, 4, 3)",
+ "border-radius": "0px",
+ "box-shadow": "none",
+ "color": "rgb(230, 4, 3)",
+ "font-family": "\"Noto Sans KR\", \"Malgun Gothic\", \"Apple SD Gothic Neo\", sans-serif",
+ "font-size": "14px",
+ "font-weight": "500",
+ "padding": "0px",
+ "margin": "0px"
+ },
+ "searchInput": {
+ "w": 66.8,
+ "h": 20,
+ "background-color": "rgba(0, 0, 0, 0)",
+ "background-image": "none",
+ "border-top": "0px none rgb(230, 4, 3)",
+ "border-radius": "2px",
+ "box-shadow": "none",
+ "color": "rgb(230, 4, 3)",
+ "font-family": "\"Noto Sans KR\", \"Malgun Gothic\", \"Apple SD Gothic Neo\", sans-serif",
+ "font-size": "14px",
+ "font-weight": "700",
+ "padding": "2px 4px 2px 6px",
+ "margin": "0px"
+ },
+ "uiButton": {
+ "w": 298,
+ "h": 28,
+ "background-color": "rgba(0, 0, 0, 0)",
+ "background-image": "linear-gradient(rgb(31, 130, 101) 0%, rgb(22, 92, 71) 30%, rgb(17, 72, 56) 65%, rgb(8, 36, 28) 100%), linear-gradient(rgb(10, 34, 29) 0%, rgb(52, 218, 170) 50%, rgb(8, 36, 28) 100%)",
+ "border-top": "1px solid rgba(0, 0, 0, 0)",
+ "border-radius": "4px",
+ "box-shadow": "rgba(0, 0, 0, 0) 0px 0px 0px 0px, color(srgb 1 1 1 / 0.1) 0px 1px 1px 0px inset, color(srgb 0 0 0 / 0.25) 0px -1px 2px 0px inset, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px",
+ "color": "rgb(255, 255, 255)",
+ "font-family": "\"Noto Sans KR\", \"Malgun Gothic\", sans-serif",
+ "font-size": "12px",
+ "font-weight": "700",
+ "padding": "3.5px 10px",
+ "margin": "0px"
+ },
+ "uiSwitch": {
+ "w": 36,
+ "h": 20,
+ "background-color": "rgb(38, 102, 81)",
+ "background-image": "none",
+ "border-top": "0px none rgb(0, 0, 0)",
+ "border-radius": "9999px",
+ "box-shadow": "none",
+ "color": "rgb(0, 0, 0)",
+ "font-family": "\"Noto Sans KR\", \"Malgun Gothic\", \"Apple SD Gothic Neo\", sans-serif",
+ "font-size": "14px",
+ "font-weight": "400",
+ "padding": "0px",
+ "margin": "0px"
+ },
+ "uiSelect": {
+ "w": 86.2,
+ "h": 44,
+ "background-color": "rgb(255, 255, 255)",
+ "background-image": "none",
+ "border-top": "1px solid rgb(222, 219, 210)",
+ "border-radius": "4px",
+ "box-shadow": "none",
+ "color": "rgb(10, 34, 29)",
+ "font-family": "\"Noto Sans KR\", \"Malgun Gothic\", \"Apple SD Gothic Neo\", sans-serif",
+ "font-size": "16px",
+ "font-weight": "400",
+ "padding": "0px 12px",
+ "margin": "0px"
+ }
+ },
+ "ui-first": {
+ "header": {
+ "w": 1920,
+ "h": 49,
+ "background-color": "rgb(6, 6, 6)",
+ "background-image": "none",
+ "border-top": "0px solid rgb(154, 146, 132)",
+ "border-radius": "0px",
+ "box-shadow": "none",
+ "color": "rgb(246, 244, 242)",
+ "font-family": "\"Noto Sans KR\", \"Malgun Gothic\", \"Apple SD Gothic Neo\", sans-serif",
+ "font-size": "14px",
+ "font-weight": "400",
+ "padding": "0px",
+ "margin": "0px"
+ },
+ "field": {
+ "w": 234,
+ "h": 38,
+ "background-color": "rgba(0, 0, 0, 0)",
+ "background-image": "linear-gradient(0deg, rgba(0, 0, 0, 0.45) 0%, rgba(0, 0, 0, 0.45) 26.41%, rgba(0, 0, 0, 0.4) 70%, rgba(0, 0, 0, 0.45) 100%)",
+ "border-top": "1px solid rgb(8, 37, 28)",
+ "border-radius": "3px",
+ "box-shadow": "rgba(9, 39, 30, 0.7) 0px 1px 4px 0px",
+ "color": "rgb(246, 244, 242)",
+ "font-family": "\"Noto Sans KR\", \"Malgun Gothic\", \"Apple SD Gothic Neo\", sans-serif",
+ "font-size": "14px",
+ "font-weight": "400",
+ "padding": "0px 10px 0px 12px",
+ "margin": "0px"
+ },
+ "documentButton": {
+ "w": 310,
+ "h": 48,
+ "background-color": "rgba(0, 0, 0, 0)",
+ "background-image": "linear-gradient(rgb(8, 24, 19) 0%, rgb(9, 39, 30) 8.69%, rgb(11, 50, 39) 25.43%, rgb(14, 61, 47) 51.25%, rgb(11, 50, 39) 80.03%, rgb(10, 43, 33) 89.76%, rgb(8, 24, 19) 100%)",
+ "border-top": "1px solid rgb(14, 76, 58)",
+ "border-radius": "0px",
+ "box-shadow": "none",
+ "color": "rgb(240, 247, 245)",
+ "font-family": "\"Noto Sans KR\", \"Malgun Gothic\", \"Apple SD Gothic Neo\", sans-serif",
+ "font-size": "14px",
+ "font-weight": "700",
+ "padding": "0px 12px 0px 5px",
+ "margin": "0px"
+ },
+ "toggle": {
+ "w": 78,
+ "h": 19,
+ "background-color": "rgba(0, 0, 0, 0)",
+ "background-image": "none",
+ "border-top": "0px none rgb(246, 244, 242)",
+ "border-radius": "2px",
+ "box-shadow": "none",
+ "color": "rgb(246, 244, 242)",
+ "font-family": "\"Noto Sans KR\", \"Malgun Gothic\", \"Apple SD Gothic Neo\", sans-serif",
+ "font-size": "14px",
+ "font-weight": "700",
+ "padding": "0px",
+ "margin": "0px"
+ },
+ "open": {
+ "w": 77.6,
+ "h": 48,
+ "background-color": "rgba(0, 0, 0, 0)",
+ "background-image": "linear-gradient(rgb(8, 24, 19) 0%, rgb(9, 39, 30) 8.69%, rgb(11, 50, 39) 25.43%, rgb(14, 61, 47) 51.25%, rgb(11, 50, 39) 80.03%, rgb(10, 43, 33) 89.76%, rgb(8, 24, 19) 100%)",
+ "border-top": "1px solid rgb(14, 76, 58)",
+ "border-radius": "0px",
+ "box-shadow": "none",
+ "color": "rgb(240, 247, 245)",
+ "font-family": "\"Noto Sans KR\", \"Malgun Gothic\", \"Apple SD Gothic Neo\", sans-serif",
+ "font-size": "14px",
+ "font-weight": "700",
+ "padding": "0px 12px 0px 5px",
+ "margin": "0px"
+ },
+ "toolText": {
+ "w": 61.1,
+ "h": 19,
+ "background-color": "rgba(0, 0, 0, 0)",
+ "background-image": "none",
+ "border-top": "0px none rgb(255, 198, 0)",
+ "border-radius": "2px",
+ "box-shadow": "none",
+ "color": "rgb(255, 198, 0)",
+ "font-family": "\"Noto Sans KR\", \"Malgun Gothic\", \"Apple SD Gothic Neo\", sans-serif",
+ "font-size": "14px",
+ "font-weight": "700",
+ "padding": "0px 8px",
+ "margin": "0px"
+ },
+ "toolPill": {
+ "w": 40,
+ "h": 38,
+ "background-color": "rgba(0, 0, 0, 0)",
+ "background-image": "linear-gradient(rgb(8, 24, 19) 0%, rgb(9, 39, 30) 8.69%, rgb(11, 50, 39) 25.43%, rgb(14, 61, 47) 51.25%, rgb(11, 50, 39) 80.03%, rgb(10, 43, 33) 89.76%, rgb(8, 24, 19) 100%)",
+ "border-top": "1px solid rgb(8, 37, 28)",
+ "border-radius": "2px",
+ "box-shadow": "none",
+ "color": "rgb(246, 244, 242)",
+ "font-family": "\"Noto Sans KR\", \"Malgun Gothic\", \"Apple SD Gothic Neo\", sans-serif",
+ "font-size": "14px",
+ "font-weight": "400",
+ "padding": "0px",
+ "margin": "0px"
+ },
+ "popup": {
+ "w": 314,
+ "h": 306,
+ "background-color": "rgb(228, 219, 201)",
+ "background-image": "none",
+ "border-top": "1px solid rgb(166, 125, 3)",
+ "border-radius": "4px",
+ "box-shadow": "rgb(0, 0, 0) 0px 0px 0px 1px inset",
+ "color": "rgb(0, 0, 0)",
+ "font-family": "\"Noto Sans KR\", \"Malgun Gothic\", \"Apple SD Gothic Neo\", sans-serif",
+ "font-size": "14px",
+ "font-weight": "400",
+ "padding": "0px",
+ "margin": "0px"
+ },
+ "popupTitle": {
+ "w": 261,
+ "h": 16,
+ "background-color": "rgba(0, 0, 0, 0)",
+ "background-image": "none",
+ "border-top": "0px solid rgb(154, 146, 132)",
+ "border-radius": "0px",
+ "box-shadow": "none",
+ "color": "rgb(255, 198, 0)",
+ "font-family": "\"Noto Sans KR\", \"Malgun Gothic\", \"Apple SD Gothic Neo\", sans-serif",
+ "font-size": "14px",
+ "font-weight": "700",
+ "padding": "0px 4px 0px 0px",
+ "margin": "0px 0px 0px 7px"
+ },
+ "popupRow": {
+ "w": 292,
+ "h": 32,
+ "background-color": "rgba(0, 0, 0, 0)",
+ "background-image": "none",
+ "border-top": "0px solid rgb(154, 146, 132)",
+ "border-radius": "0px",
+ "box-shadow": "none",
+ "color": "rgb(0, 0, 0)",
+ "font-family": "\"Noto Sans KR\", \"Malgun Gothic\", \"Apple SD Gothic Neo\", sans-serif",
+ "font-size": "14px",
+ "font-weight": "400",
+ "padding": "0px 6px",
+ "margin": "0px"
+ },
+ "popupInput": {
+ "w": 184,
+ "h": 26,
+ "background-color": "rgba(0, 0, 0, 0)",
+ "background-image": "none",
+ "border-top": "0px none rgb(230, 4, 3)",
+ "border-radius": "0px",
+ "box-shadow": "none",
+ "color": "rgb(230, 4, 3)",
+ "font-family": "\"Noto Sans KR\", \"Malgun Gothic\", \"Apple SD Gothic Neo\", sans-serif",
+ "font-size": "14px",
+ "font-weight": "500",
+ "padding": "0px",
+ "margin": "0px"
+ },
+ "searchInput": {
+ "w": 66.8,
+ "h": 20,
+ "background-color": "rgba(0, 0, 0, 0)",
+ "background-image": "none",
+ "border-top": "0px none rgb(230, 4, 3)",
+ "border-radius": "2px",
+ "box-shadow": "none",
+ "color": "rgb(230, 4, 3)",
+ "font-family": "\"Noto Sans KR\", \"Malgun Gothic\", \"Apple SD Gothic Neo\", sans-serif",
+ "font-size": "14px",
+ "font-weight": "700",
+ "padding": "2px 4px 2px 6px",
+ "margin": "0px"
+ },
+ "uiButton": {
+ "w": 298,
+ "h": 28,
+ "background-color": "rgba(0, 0, 0, 0)",
+ "background-image": "linear-gradient(rgb(31, 130, 101) 0%, rgb(22, 92, 71) 30%, rgb(17, 72, 56) 65%, rgb(8, 36, 28) 100%), linear-gradient(rgb(10, 34, 29) 0%, rgb(52, 218, 170) 50%, rgb(8, 36, 28) 100%)",
+ "border-top": "1px solid rgba(0, 0, 0, 0)",
+ "border-radius": "4px",
+ "box-shadow": "rgba(0, 0, 0, 0) 0px 0px 0px 0px, color(srgb 1 1 1 / 0.1) 0px 1px 1px 0px inset, color(srgb 0 0 0 / 0.25) 0px -1px 2px 0px inset, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px",
+ "color": "rgb(255, 255, 255)",
+ "font-family": "\"Noto Sans KR\", \"Malgun Gothic\", sans-serif",
+ "font-size": "12px",
+ "font-weight": "700",
+ "padding": "3.5px 10px",
+ "margin": "0px"
+ },
+ "uiSwitch": {
+ "w": 36,
+ "h": 20,
+ "background-color": "rgb(38, 102, 81)",
+ "background-image": "none",
+ "border-top": "0px none rgb(0, 0, 0)",
+ "border-radius": "9999px",
+ "box-shadow": "none",
+ "color": "rgb(0, 0, 0)",
+ "font-family": "\"Noto Sans KR\", \"Malgun Gothic\", \"Apple SD Gothic Neo\", sans-serif",
+ "font-size": "14px",
+ "font-weight": "400",
+ "padding": "0px",
+ "margin": "0px"
+ },
+ "uiSelect": {
+ "w": 86.2,
+ "h": 44,
+ "background-color": "rgb(255, 255, 255)",
+ "background-image": "none",
+ "border-top": "1px solid rgb(222, 219, 210)",
+ "border-radius": "4px",
+ "box-shadow": "none",
+ "color": "rgb(10, 34, 29)",
+ "font-family": "\"Noto Sans KR\", \"Malgun Gothic\", \"Apple SD Gothic Neo\", sans-serif",
+ "font-size": "16px",
+ "font-weight": "400",
+ "padding": "0px 12px",
+ "margin": "0px"
+ }
+ }
+ }
+}
diff --git a/docs/sw/integrated-improvement-qa/consumer/sw-first-1920.png b/docs/sw/integrated-improvement-qa/consumer/sw-first-1920.png
new file mode 100644
index 0000000..af36716
Binary files /dev/null and b/docs/sw/integrated-improvement-qa/consumer/sw-first-1920.png differ
diff --git a/docs/sw/integrated-improvement-qa/consumer/ui-first-1920.png b/docs/sw/integrated-improvement-qa/consumer/ui-first-1920.png
new file mode 100644
index 0000000..af36716
Binary files /dev/null and b/docs/sw/integrated-improvement-qa/consumer/ui-first-1920.png differ
diff --git a/docs/sw/integrated-improvement-qa/final-ai-template-consumer/A-default-1920.png b/docs/sw/integrated-improvement-qa/final-ai-template-consumer/A-default-1920.png
new file mode 100644
index 0000000..eb4a525
Binary files /dev/null and b/docs/sw/integrated-improvement-qa/final-ai-template-consumer/A-default-1920.png differ
diff --git a/docs/sw/integrated-improvement-qa/final-ai-template-consumer/B-k-guide.png b/docs/sw/integrated-improvement-qa/final-ai-template-consumer/B-k-guide.png
new file mode 100644
index 0000000..1a42c41
Binary files /dev/null and b/docs/sw/integrated-improvement-qa/final-ai-template-consumer/B-k-guide.png differ
diff --git a/docs/sw/integrated-improvement-qa/final-ai-template-consumer/B-layer-open.png b/docs/sw/integrated-improvement-qa/final-ai-template-consumer/B-layer-open.png
new file mode 100644
index 0000000..fbc5dec
Binary files /dev/null and b/docs/sw/integrated-improvement-qa/final-ai-template-consumer/B-layer-open.png differ
diff --git a/docs/sw/integrated-improvement-qa/final-ai-template-consumer/B-viewer-1920.png b/docs/sw/integrated-improvement-qa/final-ai-template-consumer/B-viewer-1920.png
new file mode 100644
index 0000000..d2aaf22
Binary files /dev/null and b/docs/sw/integrated-improvement-qa/final-ai-template-consumer/B-viewer-1920.png differ
diff --git a/docs/sw/integrated-improvement-qa/final-ai-template-consumer/C-feature-1920.png b/docs/sw/integrated-improvement-qa/final-ai-template-consumer/C-feature-1920.png
new file mode 100644
index 0000000..ebe7fc1
Binary files /dev/null and b/docs/sw/integrated-improvement-qa/final-ai-template-consumer/C-feature-1920.png differ
diff --git a/docs/sw/integrated-improvement-qa/final-ai-template-consumer/D-search-1920.png b/docs/sw/integrated-improvement-qa/final-ai-template-consumer/D-search-1920.png
new file mode 100644
index 0000000..ba7f6f8
Binary files /dev/null and b/docs/sw/integrated-improvement-qa/final-ai-template-consumer/D-search-1920.png differ
diff --git a/docs/sw/integrated-improvement-qa/final-ai-template-consumer/D-search-hover.png b/docs/sw/integrated-improvement-qa/final-ai-template-consumer/D-search-hover.png
new file mode 100644
index 0000000..3354dca
Binary files /dev/null and b/docs/sw/integrated-improvement-qa/final-ai-template-consumer/D-search-hover.png differ
diff --git a/docs/sw/integrated-improvement-qa/final-ai-template-consumer/report.json b/docs/sw/integrated-improvement-qa/final-ai-template-consumer/report.json
new file mode 100644
index 0000000..3f5a33d
--- /dev/null
+++ b/docs/sw/integrated-improvement-qa/final-ai-template-consumer/report.json
@@ -0,0 +1,276 @@
+{
+ "checks": [
+ {
+ "name": "1 all SVG/PNG assets decode (data URI, no external path)",
+ "status": "PASS",
+ "data": {
+ "count": 33,
+ "broken": []
+ }
+ },
+ {
+ "name": "1 styles.css loaded; SWTheme provides tokens",
+ "status": "PASS",
+ "data": {
+ "height": "49px",
+ "font": "\"Noto Sans KR\", \"Malgun Gothic\", \"Apple SD Gothic Neo\", sans-serif"
+ }
+ },
+ {
+ "name": "2 A default header 1920 geometry = Figma (49 / 0·80 / 65·310 / 377·1301 / 1680·240)",
+ "status": "PASS",
+ "data": {
+ "header": {
+ "x": 0,
+ "y": 0,
+ "w": 1920,
+ "h": 49
+ },
+ "home": {
+ "x": 0,
+ "y": 0,
+ "w": 80,
+ "h": 48
+ },
+ "document": {
+ "x": 65,
+ "y": 0,
+ "w": 310,
+ "h": 48
+ },
+ "object": {
+ "x": 377,
+ "y": 0,
+ "w": 1301,
+ "h": 48
+ },
+ "window": {
+ "x": 1680,
+ "y": 0,
+ "w": 240,
+ "h": 48
+ }
+ }
+ },
+ {
+ "name": "2 A layer dropdown select callback",
+ "status": "PASS",
+ "data": "layer:center"
+ },
+ {
+ "name": "2 A close callback",
+ "status": "PASS",
+ "data": "close"
+ },
+ {
+ "name": "3 B order Logo → File → Layer → Color → K (DOM)",
+ "status": "PASS",
+ "data": [
+ "뷰어 홈",
+ "hm-sw-header__document",
+ "레이어",
+ "색상",
+ "팝업 가이드"
+ ]
+ },
+ {
+ "name": "3 B sizes keep SW rules (bar 49, home 80 overlapping file 15px, fields 234/192 x 38)",
+ "status": "PASS",
+ "data": {
+ "bar": {
+ "x": 0,
+ "y": 409,
+ "w": 1920,
+ "h": 49
+ },
+ "home": {
+ "x": 0,
+ "y": 409,
+ "w": 80,
+ "h": 48
+ },
+ "document": {
+ "x": 65,
+ "y": 409,
+ "w": 310,
+ "h": 48
+ },
+ "layer": {
+ "x": 382,
+ "y": 414,
+ "w": 234,
+ "h": 38
+ },
+ "color": {
+ "x": 620,
+ "y": 414,
+ "w": 192,
+ "h": 38
+ }
+ }
+ },
+ {
+ "name": "3 B document dropdown New callback",
+ "status": "PASS",
+ "data": "document:new"
+ },
+ {
+ "name": "3 B layer dropdown opens under the field",
+ "status": "PASS",
+ "data": "true"
+ },
+ {
+ "name": "3 B Escape closes and returns focus to the field",
+ "status": "PASS",
+ "data": null
+ },
+ {
+ "name": "3 B color chip callback (dropdown stays open)",
+ "status": "PASS",
+ "data": "color:red"
+ },
+ {
+ "name": "3 B K guide preview on hover (animation frame advances)",
+ "status": "PASS",
+ "data": {
+ "guide": true
+ }
+ },
+ {
+ "name": "3 B K click callback",
+ "status": "PASS",
+ "data": "popupGuide"
+ },
+ {
+ "name": "4 C order File → 선 → 문자 → 치수 → 인쇄",
+ "status": "PASS",
+ "data": [
+ "file",
+ "선스타일",
+ "문자스타일",
+ "치수스타일",
+ "인쇄"
+ ]
+ },
+ {
+ "name": "4 C first file well has a left edge (consumer wrapper)",
+ "status": "PASS",
+ "data": "1px"
+ },
+ {
+ "name": "4 C line type callback + field value",
+ "status": "PASS",
+ "data": "lineType:center"
+ },
+ {
+ "name": "4 C text style callback + field value",
+ "status": "PASS",
+ "data": "textStyle:dotum"
+ },
+ {
+ "name": "4 C dimension style callback",
+ "status": "PASS",
+ "data": "dimensionStyle:iso"
+ },
+ {
+ "name": "4 C print callback",
+ "status": "PASS",
+ "data": "print"
+ },
+ {
+ "name": "5 D new search field matches the SW field surface (height/top/border/radius/background/shadow/label)",
+ "status": "PASS",
+ "data": {
+ "layer": {
+ "h": 38,
+ "top": 1232,
+ "border": "1px rgb(8, 37, 28)",
+ "radius": "3px",
+ "bg": "linear-gradient(0deg, rgba(0, 0, 0, 0.45",
+ "shadow": "rgba(9, 39, 30, 0.7) 0px 1px 4px 0px"
+ },
+ "search": {
+ "h": 38,
+ "top": 1232,
+ "border": "1px rgb(8, 37, 28)",
+ "radius": "3px",
+ "bg": "linear-gradient(0deg, rgba(0, 0, 0, 0.45",
+ "shadow": "rgba(9, 39, 30, 0.7) 0px 1px 4px 0px"
+ },
+ "label": "12px",
+ "fieldLabel": "12px"
+ }
+ },
+ {
+ "name": "5 D hover ring like existing fields (edge turns yellow, inside unchanged)",
+ "status": "PASS",
+ "data": {
+ "ring": "1",
+ "before": {
+ "inside": [
+ 18,
+ 50,
+ 39
+ ],
+ "edge": [
+ 8,
+ 37,
+ 28
+ ]
+ },
+ "after": {
+ "inside": [
+ 18,
+ 50,
+ 39
+ ],
+ "edge": [
+ 172,
+ 131,
+ 3
+ ]
+ }
+ }
+ },
+ {
+ "name": "5 D Enter commits through SWHeaderInput → search callback",
+ "status": "PASS",
+ "data": "search:WALL-01"
+ },
+ {
+ "name": "5 D search button callback uses committed value",
+ "status": "PASS",
+ "data": "search:WALL-01"
+ },
+ {
+ "name": "5 D Escape restores the committed value",
+ "status": "PASS",
+ "data": "WALL-01"
+ },
+ {
+ "name": "5 D existing color dropdown in the same bar",
+ "status": "PASS",
+ "data": "color:blue"
+ },
+ {
+ "name": "6 B Tab order = display order",
+ "status": "PASS",
+ "data": [
+ "문서: C0020101-006-평면및종단면도(06)",
+ "레이어",
+ "색상",
+ "팝업 가이드"
+ ]
+ },
+ {
+ "name": "7 no page/console errors",
+ "status": "PASS",
+ "data": []
+ }
+ ],
+ "errors": [],
+ "warnings": [
+ "Canvas2D: Multiple readback operations using getImageData are faster with the willReadFrequently attribute set to true. See: https://html.spec.whatwg.org/multipage/canvas.html#concept-canvas-will-read-frequently",
+ "Canvas2D: Multiple readback operations using getImageData are faster with the willReadFrequently attribute set to true. See: https://html.spec.whatwg.org/multipage/canvas.html#concept-canvas-will-read-frequently"
+ ]
+}
\ No newline at end of file
diff --git a/docs/sw/integrated-improvement-qa/final-overview/after-index.json b/docs/sw/integrated-improvement-qa/final-overview/after-index.json
new file mode 100644
index 0000000..1359483
--- /dev/null
+++ b/docs/sw/integrated-improvement-qa/final-overview/after-index.json
@@ -0,0 +1,152 @@
+[
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--composed-controls",
+ "name": "Dropdown",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header-dropdown.stories.tsx",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "ComposedControls"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--detail-buttons",
+ "name": "Detail Buttons (Shared States)",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "DetailButtons"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--overview",
+ "name": "Overview",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "Overview"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--interactive-states",
+ "name": "Interactive States",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "InteractiveStates"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--window-move-motion",
+ "name": "Window Move Motion",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "WindowMoveMotion"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--logo-slot",
+ "name": "Logo Slot",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "LogoSlot"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--document-dropdown",
+ "name": "Document Dropdown",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "DocumentDropdown"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--responsive-more",
+ "name": "Responsive More",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "ResponsiveMore"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--k-guide",
+ "name": "K Guide",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "KGuide"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--property-panel-compare",
+ "name": "Property Panel · 4개 비교",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "PropertyPanelCompare"
+ }
+]
diff --git a/docs/sw/integrated-improvement-qa/final-overview/before-index.json b/docs/sw/integrated-improvement-qa/final-overview/before-index.json
new file mode 100644
index 0000000..d3311f8
--- /dev/null
+++ b/docs/sw/integrated-improvement-qa/final-overview/before-index.json
@@ -0,0 +1,423 @@
+[
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--detail-buttons",
+ "name": "Detail Buttons (Shared States)",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ],
+ "exportName": "DetailButtons"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--overview",
+ "name": "Overview",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "Overview"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--interactive-states",
+ "name": "Interactive States",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "InteractiveStates"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--window-move-motion",
+ "name": "Window Move Motion",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "WindowMoveMotion"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--composed-controls",
+ "name": "Composed Controls",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "ComposedControls"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--logo-slot",
+ "name": "Logo Slot",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "LogoSlot"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--document-dropdown",
+ "name": "Document Dropdown",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "DocumentDropdown"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--layer-dropdown",
+ "name": "Layer Dropdown",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "LayerDropdown"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--color-dropdown",
+ "name": "Color Dropdown",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "ColorDropdown"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--line-style-dropdown",
+ "name": "Line Style Dropdown",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "LineStyleDropdown"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--text-dimension-style-dropdown",
+ "name": "Text · Dimension Style Dropdown",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "TextDimensionStyleDropdown"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--responsive-more",
+ "name": "Responsive More",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "ResponsiveMore"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--layer-detail-input",
+ "name": "Layer Detail · Input",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "LayerDetailInput"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--property-panel",
+ "name": "Property Panel",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "PropertyPanel"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--property-panel-variants",
+ "name": "Property Panel Variants",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "PropertyPanelVariants"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--k-guide",
+ "name": "K Guide",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "KGuide"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--additional-hover",
+ "name": "Additional Hover",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "AdditionalHover"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--property-bar",
+ "name": "Property Bar",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "PropertyBar"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--dynamic-controls",
+ "name": "Dynamic Controls",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "DynamicControls"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--colorize",
+ "name": "Colorize",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "Colorize"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--composition",
+ "name": "Composition (Visibility · Order)",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "Composition"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--property-panel-none",
+ "name": "Property Panel · 선택 없음",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "PropertyPanelNone"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--property-panel-all",
+ "name": "Property Panel · 전체 선택",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "PropertyPanelAll"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--property-panel-circle",
+ "name": "Property Panel · 원 1개",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "PropertyPanelCircle"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--property-panel-expanded",
+ "name": "Property Panel · 모두 펼침",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "PropertyPanelExpanded"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--property-panel-compare",
+ "name": "Property Panel · 4개 비교",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "PropertyPanelCompare"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--property-shape-slot",
+ "name": "Property Panel · 형상 Slot",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "PropertyShapeSlot"
+ },
+ {
+ "type": "story",
+ "subtype": "story",
+ "id": "sw-header--property-fields",
+ "name": "Property Panel · 필드 13개",
+ "title": "SW/Header",
+ "importPath": "./src/sw/sw-header.stories.tsx",
+ "componentPath": "./packages/sw/dist/index.js",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ],
+ "exportName": "PropertyFields"
+ }
+]
diff --git a/docs/sw/integrated-improvement-qa/final-overview/chrome-result.json b/docs/sw/integrated-improvement-qa/final-overview/chrome-result.json
new file mode 100644
index 0000000..f372ba8
--- /dev/null
+++ b/docs/sw/integrated-improvement-qa/final-overview/chrome-result.json
@@ -0,0 +1,657 @@
+{
+ "baseCommit": "50bf5bda8e956a4973b923d64131f2f2285bd38c",
+ "checks": [
+ {
+ "name": "24 retained Story IDs, names and tags; only approved Dropdown retirements",
+ "status": "FAIL"
+ },
+ {
+ "name": "retained non-Overview declarations byte-identical; relocated composition separately verified",
+ "status": "FAIL"
+ },
+ {
+ "name": "retired Dropdown IDs absent",
+ "status": "PASS"
+ },
+ {
+ "name": "package production source untouched except the integrated-improvement files",
+ "status": "PASS",
+ "data": []
+ },
+ {
+ "name": "16:9 fitted to both Inner dimensions at 1920x1080",
+ "status": "PASS",
+ "data": {
+ "stage": {
+ "x": 360,
+ "y": 264.25,
+ "w": 1200,
+ "h": 675,
+ "right": 1560,
+ "bottom": 939.25
+ },
+ "slot": {
+ "x": 360,
+ "y": 169.5,
+ "w": 1200,
+ "h": 864.5,
+ "right": 1560,
+ "bottom": 1034
+ },
+ "header": {
+ "x": 360,
+ "y": 264.25,
+ "w": 1200,
+ "h": 49,
+ "right": 1560,
+ "bottom": 313.25
+ },
+ "viewport": {
+ "w": 1920,
+ "h": 1080
+ },
+ "overflow": 0
+ }
+ },
+ {
+ "name": "16:9 fitted to both Inner dimensions at 1440x900",
+ "status": "PASS",
+ "data": {
+ "stage": {
+ "x": 120,
+ "y": 174.25,
+ "w": 1200,
+ "h": 675,
+ "right": 1320,
+ "bottom": 849.25
+ },
+ "slot": {
+ "x": 120,
+ "y": 169.5,
+ "w": 1200,
+ "h": 684.5,
+ "right": 1320,
+ "bottom": 854
+ },
+ "header": {
+ "x": 120,
+ "y": 174.25,
+ "w": 1200,
+ "h": 49,
+ "right": 1320,
+ "bottom": 223.25
+ },
+ "viewport": {
+ "w": 1440,
+ "h": 900
+ },
+ "overflow": 0
+ }
+ },
+ {
+ "name": "16:9 fitted to both Inner dimensions at 1280x720",
+ "status": "PASS",
+ "data": {
+ "stage": {
+ "x": 191.5625,
+ "y": 169.5,
+ "w": 896.875,
+ "h": 504.5,
+ "right": 1088.4375,
+ "bottom": 674
+ },
+ "slot": {
+ "x": 38.40625,
+ "y": 169.5,
+ "w": 1203.1875,
+ "h": 504.5,
+ "right": 1241.59375,
+ "bottom": 674
+ },
+ "header": {
+ "x": 191.5625,
+ "y": 169.5,
+ "w": 896.875,
+ "h": 49,
+ "right": 1088.4375,
+ "bottom": 218.5
+ },
+ "viewport": {
+ "w": 1280,
+ "h": 720
+ },
+ "overflow": 0
+ }
+ },
+ {
+ "name": "16:9 fitted to both Inner dimensions at 768x600",
+ "status": "PASS",
+ "data": {
+ "stage": {
+ "x": 42.21875,
+ "y": 169.5,
+ "w": 683.546875,
+ "h": 384.5,
+ "right": 725.765625,
+ "bottom": 554
+ },
+ "slot": {
+ "x": 23.046875,
+ "y": 169.5,
+ "w": 721.90625,
+ "h": 384.5,
+ "right": 744.953125,
+ "bottom": 554
+ },
+ "header": {
+ "x": 42.21875,
+ "y": 169.5,
+ "w": 683.546875,
+ "h": 49,
+ "right": 725.765625,
+ "bottom": 218.5
+ },
+ "viewport": {
+ "w": 768,
+ "h": 600
+ },
+ "overflow": 0
+ }
+ },
+ {
+ "name": "16:9 fitted to both Inner dimensions at 390x844",
+ "status": "PASS",
+ "data": {
+ "stage": {
+ "x": 16,
+ "y": 383.0625,
+ "w": 358,
+ "h": 201.375,
+ "right": 374,
+ "bottom": 584.4375
+ },
+ "slot": {
+ "x": 16,
+ "y": 169.5,
+ "w": 358,
+ "h": 628.5,
+ "right": 374,
+ "bottom": 798
+ },
+ "header": {
+ "x": 16,
+ "y": 383.0625,
+ "w": 390,
+ "h": 49,
+ "right": 406,
+ "bottom": 432.0625
+ },
+ "viewport": {
+ "w": 390,
+ "h": 844
+ },
+ "overflow": 0
+ }
+ },
+ {
+ "name": "16:9 fitted to both Inner dimensions at 1000x500",
+ "status": "PASS",
+ "data": {
+ "stage": {
+ "x": 247.109375,
+ "y": 169.5,
+ "w": 505.765625,
+ "h": 284.5,
+ "right": 752.875,
+ "bottom": 454
+ },
+ "slot": {
+ "x": 30,
+ "y": 169.5,
+ "w": 940,
+ "h": 284.5,
+ "right": 970,
+ "bottom": 454
+ },
+ "header": {
+ "x": 247.109375,
+ "y": 169.5,
+ "w": 505.765625,
+ "h": 49,
+ "right": 752.875,
+ "bottom": 218.5
+ },
+ "viewport": {
+ "w": 1000,
+ "h": 500
+ },
+ "overflow": 0
+ }
+ },
+ {
+ "name": "one Header and no duplicate fixed Figma specimen",
+ "status": "PASS"
+ },
+ {
+ "name": "document selection updates Header and Callback",
+ "status": "PASS",
+ "data": "onDocumentClick → documentOpen(true) → onDocumentSelect(doc-2) → documentOpen(false)"
+ },
+ {
+ "name": "layer selection updates shared data",
+ "status": "PASS",
+ "data": "onDocumentClick → documentOpen(true) → onDocumentSelect(doc-2) → documentOpen(false) → onLayerOpen → onLayerSelect(layer, CC-D GNL)"
+ },
+ {
+ "name": "existing layer Detail callback closes list",
+ "status": "PASS"
+ },
+ {
+ "name": "color selection invokes host callback",
+ "status": "PASS",
+ "data": "onLayerOpen → onLayerSelect(layer, CC-D GNL) → onLayerOpen → onLayerDetail → onColorOpen → onColorSelect(color, 255,255,255)"
+ },
+ {
+ "name": "line selection updates Header",
+ "status": "PASS",
+ "data": "onLayerOpen → onLayerDetail → onColorOpen → onColorSelect(color, 255,255,255) → onLineStyleOpen → onLineTypeSelect(line, CENTER)"
+ },
+ {
+ "name": "ByLayer weight mode does not turn numeric property into a mode string",
+ "status": "PASS"
+ },
+ {
+ "name": "text style selection updates Header",
+ "status": "PASS",
+ "data": "onColorSelect(color, 255,255,255) → onLineStyleOpen → onLineTypeSelect(line, CENTER) → onLineWeightSelect(w-bylayer) → onTextStyleOpen → onTextStyleSelect(dotum)"
+ },
+ {
+ "name": "dimension style selection updates Header",
+ "status": "PASS",
+ "data": "onLineTypeSelect(line, CENTER) → onLineWeightSelect(w-bylayer) → onTextStyleOpen → onTextStyleSelect(dotum) → onDimensionStyleOpen → onDimensionStyleSelect(iso-25)"
+ },
+ {
+ "name": "opening another dropdown closes the previous one",
+ "status": "PASS"
+ },
+ {
+ "name": "Escape closes Header dropdown",
+ "status": "PASS"
+ },
+ {
+ "name": "outside click closes Header dropdown",
+ "status": "PASS"
+ },
+ {
+ "name": "Bar Enter commits state",
+ "status": "PASS"
+ },
+ {
+ "name": "Bar validates min=0",
+ "status": "PASS"
+ },
+ {
+ "name": "Bar Escape cancels edit",
+ "status": "PASS"
+ },
+ {
+ "name": "Header opens panel with same Bar value",
+ "status": "PASS"
+ },
+ {
+ "name": "numeric weight property remains numeric after ByLayer mode",
+ "status": "PASS"
+ },
+ {
+ "name": "Header layer value shared with panel",
+ "status": "PASS"
+ },
+ {
+ "name": "panel edit updates the Bar",
+ "status": "PASS"
+ },
+ {
+ "name": "panel number validation rejects negative radius",
+ "status": "PASS"
+ },
+ {
+ "name": "panel Layer dropdown updates Header shared value",
+ "status": "PASS"
+ },
+ {
+ "name": "panel line dropdown updates Header shared value",
+ "status": "PASS"
+ },
+ {
+ "name": "panel color dropdown updates Header shared value",
+ "status": "PASS"
+ },
+ {
+ "name": "panel RGB validation rejects out-of-range value",
+ "status": "PASS"
+ },
+ {
+ "name": "gauge keyboard editing commits host state",
+ "status": "PASS"
+ },
+ {
+ "name": "first Escape cancels draft and retains panel",
+ "status": "PASS"
+ },
+ {
+ "name": "next Escape closes panel and restores Header focus",
+ "status": "PASS"
+ },
+ {
+ "name": "panel Close button restores focus",
+ "status": "PASS"
+ },
+ {
+ "name": "external Props update Bar",
+ "status": "PASS"
+ },
+ {
+ "name": "Bar ReadOnly",
+ "status": "PASS"
+ },
+ {
+ "name": "Bar Disabled",
+ "status": "PASS"
+ },
+ {
+ "name": "dynamic Bar field added",
+ "status": "PASS"
+ },
+ {
+ "name": "dynamic field shared with panel",
+ "status": "PASS"
+ },
+ {
+ "name": "dynamic field removed from both",
+ "status": "PASS"
+ },
+ {
+ "name": "shape Slot can be empty without changing panel structure",
+ "status": "PASS"
+ },
+ {
+ "name": "original panel size none:314x256",
+ "status": "PASS",
+ "data": {
+ "x": 1000,
+ "y": 301.25,
+ "width": 314,
+ "height": 256
+ }
+ },
+ {
+ "name": "original panel size all:314x361",
+ "status": "PASS",
+ "data": {
+ "x": 1000,
+ "y": 301.25,
+ "width": 314,
+ "height": 361
+ }
+ },
+ {
+ "name": "original panel size circle:314x658",
+ "status": "PASS",
+ "data": {
+ "x": 1000,
+ "y": 301.25,
+ "width": 314,
+ "height": 658
+ }
+ },
+ {
+ "name": "original panel size expanded:314x754",
+ "status": "PASS",
+ "data": {
+ "x": 1000,
+ "y": 301.25,
+ "width": 314,
+ "height": 754
+ }
+ },
+ {
+ "name": "expanded popup bottom accessible through internal scroll",
+ "status": "PASS"
+ },
+ {
+ "name": "small Inner reaches full popup bottom with native Header and popup dimensions",
+ "status": "PASS",
+ "data": {
+ "top": 630,
+ "left": 16,
+ "height": 201,
+ "scrollHeight": 831,
+ "width": 358,
+ "scrollWidth": 390
+ }
+ },
+ {
+ "name": "narrow popup Escape restores More focus",
+ "status": "PASS"
+ },
+ {
+ "name": "actual Storybook manager iframe fits its own Inner",
+ "status": "PASS",
+ "data": {
+ "width": 1071.59375,
+ "height": 602.765625,
+ "slotWidth": 1071.59375,
+ "slotHeight": 744.5,
+ "viewportWidth": 1140,
+ "viewportHeight": 960
+ }
+ },
+ {
+ "name": "no browser errors",
+ "status": "PASS",
+ "data": []
+ }
+ ],
+ "errors": [],
+ "sizes": [
+ {
+ "stage": {
+ "x": 360,
+ "y": 264.25,
+ "w": 1200,
+ "h": 675,
+ "right": 1560,
+ "bottom": 939.25
+ },
+ "slot": {
+ "x": 360,
+ "y": 169.5,
+ "w": 1200,
+ "h": 864.5,
+ "right": 1560,
+ "bottom": 1034
+ },
+ "header": {
+ "x": 360,
+ "y": 264.25,
+ "w": 1200,
+ "h": 49,
+ "right": 1560,
+ "bottom": 313.25
+ },
+ "viewport": {
+ "w": 1920,
+ "h": 1080
+ },
+ "overflow": 0
+ },
+ {
+ "stage": {
+ "x": 120,
+ "y": 174.25,
+ "w": 1200,
+ "h": 675,
+ "right": 1320,
+ "bottom": 849.25
+ },
+ "slot": {
+ "x": 120,
+ "y": 169.5,
+ "w": 1200,
+ "h": 684.5,
+ "right": 1320,
+ "bottom": 854
+ },
+ "header": {
+ "x": 120,
+ "y": 174.25,
+ "w": 1200,
+ "h": 49,
+ "right": 1320,
+ "bottom": 223.25
+ },
+ "viewport": {
+ "w": 1440,
+ "h": 900
+ },
+ "overflow": 0
+ },
+ {
+ "stage": {
+ "x": 191.5625,
+ "y": 169.5,
+ "w": 896.875,
+ "h": 504.5,
+ "right": 1088.4375,
+ "bottom": 674
+ },
+ "slot": {
+ "x": 38.40625,
+ "y": 169.5,
+ "w": 1203.1875,
+ "h": 504.5,
+ "right": 1241.59375,
+ "bottom": 674
+ },
+ "header": {
+ "x": 191.5625,
+ "y": 169.5,
+ "w": 896.875,
+ "h": 49,
+ "right": 1088.4375,
+ "bottom": 218.5
+ },
+ "viewport": {
+ "w": 1280,
+ "h": 720
+ },
+ "overflow": 0
+ },
+ {
+ "stage": {
+ "x": 42.21875,
+ "y": 169.5,
+ "w": 683.546875,
+ "h": 384.5,
+ "right": 725.765625,
+ "bottom": 554
+ },
+ "slot": {
+ "x": 23.046875,
+ "y": 169.5,
+ "w": 721.90625,
+ "h": 384.5,
+ "right": 744.953125,
+ "bottom": 554
+ },
+ "header": {
+ "x": 42.21875,
+ "y": 169.5,
+ "w": 683.546875,
+ "h": 49,
+ "right": 725.765625,
+ "bottom": 218.5
+ },
+ "viewport": {
+ "w": 768,
+ "h": 600
+ },
+ "overflow": 0
+ },
+ {
+ "stage": {
+ "x": 16,
+ "y": 383.0625,
+ "w": 358,
+ "h": 201.375,
+ "right": 374,
+ "bottom": 584.4375
+ },
+ "slot": {
+ "x": 16,
+ "y": 169.5,
+ "w": 358,
+ "h": 628.5,
+ "right": 374,
+ "bottom": 798
+ },
+ "header": {
+ "x": 16,
+ "y": 383.0625,
+ "w": 390,
+ "h": 49,
+ "right": 406,
+ "bottom": 432.0625
+ },
+ "viewport": {
+ "w": 390,
+ "h": 844
+ },
+ "overflow": 0
+ },
+ {
+ "stage": {
+ "x": 247.109375,
+ "y": 169.5,
+ "w": 505.765625,
+ "h": 284.5,
+ "right": 752.875,
+ "bottom": 454
+ },
+ "slot": {
+ "x": 30,
+ "y": 169.5,
+ "w": 940,
+ "h": 284.5,
+ "right": 970,
+ "bottom": 454
+ },
+ "header": {
+ "x": 247.109375,
+ "y": 169.5,
+ "w": 505.765625,
+ "h": 49,
+ "right": 752.875,
+ "bottom": 218.5
+ },
+ "viewport": {
+ "w": 1000,
+ "h": 500
+ },
+ "overflow": 0
+ }
+ ],
+ "browser": "155.0.8059.80",
+ "managerOrder": [
+ "sw-header--composed-controls",
+ "sw-header--overview",
+ "sw-header--interactive-states",
+ "sw-header--window-move-motion",
+ "sw-header--logo-slot",
+ "sw-header--document-dropdown",
+ "sw-header--responsive-more",
+ "sw-header--k-guide",
+ "sw-header--property-panel-compare"
+ ],
+ "status": "FAIL"
+}
diff --git a/docs/sw/integrated-improvement-qa/final-overview/manager-story-order.json b/docs/sw/integrated-improvement-qa/final-overview/manager-story-order.json
new file mode 100644
index 0000000..756b232
--- /dev/null
+++ b/docs/sw/integrated-improvement-qa/final-overview/manager-story-order.json
@@ -0,0 +1,11 @@
+[
+ "sw-header--composed-controls",
+ "sw-header--overview",
+ "sw-header--interactive-states",
+ "sw-header--window-move-motion",
+ "sw-header--logo-slot",
+ "sw-header--document-dropdown",
+ "sw-header--responsive-more",
+ "sw-header--k-guide",
+ "sw-header--property-panel-compare"
+]
diff --git a/docs/sw/integrated-improvement-qa/final-overview/overview-after-expanded.png b/docs/sw/integrated-improvement-qa/final-overview/overview-after-expanded.png
new file mode 100644
index 0000000..9afb4cf
Binary files /dev/null and b/docs/sw/integrated-improvement-qa/final-overview/overview-after-expanded.png differ
diff --git a/docs/sw/integrated-improvement-qa/final-overview/overview-after-scrolled.png b/docs/sw/integrated-improvement-qa/final-overview/overview-after-scrolled.png
new file mode 100644
index 0000000..dc5d847
Binary files /dev/null and b/docs/sw/integrated-improvement-qa/final-overview/overview-after-scrolled.png differ
diff --git a/docs/sw/integrated-improvement-qa/final-overview/overview-after.png b/docs/sw/integrated-improvement-qa/final-overview/overview-after.png
new file mode 100644
index 0000000..8a64869
Binary files /dev/null and b/docs/sw/integrated-improvement-qa/final-overview/overview-after.png differ
diff --git a/docs/sw/integrated-improvement-qa/final-overview/overview-manager.png b/docs/sw/integrated-improvement-qa/final-overview/overview-manager.png
new file mode 100644
index 0000000..f44c5ac
Binary files /dev/null and b/docs/sw/integrated-improvement-qa/final-overview/overview-manager.png differ
diff --git a/docs/sw/integrated-improvement-qa/final-overview/overview-narrow.png b/docs/sw/integrated-improvement-qa/final-overview/overview-narrow.png
new file mode 100644
index 0000000..134f239
Binary files /dev/null and b/docs/sw/integrated-improvement-qa/final-overview/overview-narrow.png differ
diff --git a/docs/sw/integrated-improvement-qa/final-storybook-unused-removal/compare-1280-end.png b/docs/sw/integrated-improvement-qa/final-storybook-unused-removal/compare-1280-end.png
new file mode 100644
index 0000000..fca3565
Binary files /dev/null and b/docs/sw/integrated-improvement-qa/final-storybook-unused-removal/compare-1280-end.png differ
diff --git a/docs/sw/integrated-improvement-qa/final-storybook-unused-removal/compare-1440-end.png b/docs/sw/integrated-improvement-qa/final-storybook-unused-removal/compare-1440-end.png
new file mode 100644
index 0000000..d3d82b0
Binary files /dev/null and b/docs/sw/integrated-improvement-qa/final-storybook-unused-removal/compare-1440-end.png differ
diff --git a/docs/sw/integrated-improvement-qa/final-storybook-unused-removal/compare-390-end.png b/docs/sw/integrated-improvement-qa/final-storybook-unused-removal/compare-390-end.png
new file mode 100644
index 0000000..9fc5f41
Binary files /dev/null and b/docs/sw/integrated-improvement-qa/final-storybook-unused-removal/compare-390-end.png differ
diff --git a/docs/sw/integrated-improvement-qa/final-storybook-unused-removal/compare-768-end.png b/docs/sw/integrated-improvement-qa/final-storybook-unused-removal/compare-768-end.png
new file mode 100644
index 0000000..4686f20
Binary files /dev/null and b/docs/sw/integrated-improvement-qa/final-storybook-unused-removal/compare-768-end.png differ
diff --git a/docs/sw/integrated-improvement-qa/final-storybook-unused-removal/dropdown-1280.png b/docs/sw/integrated-improvement-qa/final-storybook-unused-removal/dropdown-1280.png
new file mode 100644
index 0000000..71b3615
Binary files /dev/null and b/docs/sw/integrated-improvement-qa/final-storybook-unused-removal/dropdown-1280.png differ
diff --git a/docs/sw/integrated-improvement-qa/final-storybook-unused-removal/dropdown-1440.png b/docs/sw/integrated-improvement-qa/final-storybook-unused-removal/dropdown-1440.png
new file mode 100644
index 0000000..af06cb7
Binary files /dev/null and b/docs/sw/integrated-improvement-qa/final-storybook-unused-removal/dropdown-1440.png differ
diff --git a/docs/sw/integrated-improvement-qa/final-storybook-unused-removal/dropdown-390.png b/docs/sw/integrated-improvement-qa/final-storybook-unused-removal/dropdown-390.png
new file mode 100644
index 0000000..66cf027
Binary files /dev/null and b/docs/sw/integrated-improvement-qa/final-storybook-unused-removal/dropdown-390.png differ
diff --git a/docs/sw/integrated-improvement-qa/final-storybook-unused-removal/dropdown-768.png b/docs/sw/integrated-improvement-qa/final-storybook-unused-removal/dropdown-768.png
new file mode 100644
index 0000000..2a55839
Binary files /dev/null and b/docs/sw/integrated-improvement-qa/final-storybook-unused-removal/dropdown-768.png differ
diff --git a/docs/sw/integrated-improvement-qa/final-storybook-unused-removal/manager-sidebar.png b/docs/sw/integrated-improvement-qa/final-storybook-unused-removal/manager-sidebar.png
new file mode 100644
index 0000000..aff595b
Binary files /dev/null and b/docs/sw/integrated-improvement-qa/final-storybook-unused-removal/manager-sidebar.png differ
diff --git a/docs/sw/integrated-improvement-qa/final-storybook-unused-removal/manager-story-order.json b/docs/sw/integrated-improvement-qa/final-storybook-unused-removal/manager-story-order.json
new file mode 100644
index 0000000..11e2001
--- /dev/null
+++ b/docs/sw/integrated-improvement-qa/final-storybook-unused-removal/manager-story-order.json
@@ -0,0 +1,38 @@
+[
+ [
+ "sw-header--composed-controls",
+ "Dropdown"
+ ],
+ [
+ "sw-header--overview",
+ "Overview"
+ ],
+ [
+ "sw-header--interactive-states",
+ "Interactive States"
+ ],
+ [
+ "sw-header--window-move-motion",
+ "Window Move Motion"
+ ],
+ [
+ "sw-header--logo-slot",
+ "Logo Slot"
+ ],
+ [
+ "sw-header--document-dropdown",
+ "Document Dropdown"
+ ],
+ [
+ "sw-header--responsive-more",
+ "Responsive More"
+ ],
+ [
+ "sw-header--k-guide",
+ "K Guide"
+ ],
+ [
+ "sw-header--property-panel-compare",
+ "Property Panel · 4개 비교"
+ ]
+]
diff --git a/docs/sw/integrated-improvement-qa/final-storybook-unused-removal/overview-1280.png b/docs/sw/integrated-improvement-qa/final-storybook-unused-removal/overview-1280.png
new file mode 100644
index 0000000..4fd85cb
Binary files /dev/null and b/docs/sw/integrated-improvement-qa/final-storybook-unused-removal/overview-1280.png differ
diff --git a/docs/sw/integrated-improvement-qa/final-storybook-unused-removal/overview-1440.png b/docs/sw/integrated-improvement-qa/final-storybook-unused-removal/overview-1440.png
new file mode 100644
index 0000000..4301028
Binary files /dev/null and b/docs/sw/integrated-improvement-qa/final-storybook-unused-removal/overview-1440.png differ
diff --git a/docs/sw/integrated-improvement-qa/final-storybook-unused-removal/overview-390.png b/docs/sw/integrated-improvement-qa/final-storybook-unused-removal/overview-390.png
new file mode 100644
index 0000000..caa2b39
Binary files /dev/null and b/docs/sw/integrated-improvement-qa/final-storybook-unused-removal/overview-390.png differ
diff --git a/docs/sw/integrated-improvement-qa/final-storybook-unused-removal/overview-768.png b/docs/sw/integrated-improvement-qa/final-storybook-unused-removal/overview-768.png
new file mode 100644
index 0000000..5eb5417
Binary files /dev/null and b/docs/sw/integrated-improvement-qa/final-storybook-unused-removal/overview-768.png differ
diff --git a/docs/sw/integrated-improvement-qa/final-storybook-unused-removal/result.json b/docs/sw/integrated-improvement-qa/final-storybook-unused-removal/result.json
new file mode 100644
index 0000000..e624a1f
--- /dev/null
+++ b/docs/sw/integrated-improvement-qa/final-storybook-unused-removal/result.json
@@ -0,0 +1,1152 @@
+{
+ "baseCommit": "c8e5fbeebc26fba92998fc5ddcd28c6c110e452d",
+ "checks": [
+ {
+ "name": "inventory: 19 -> 10 SW/Header Stories, 338 -> 329 total plus only the 7 integrated-improvement Stories",
+ "status": "PASS",
+ "data": {
+ "before": [
+ 338,
+ 19
+ ],
+ "after": [
+ 336,
+ 10
+ ],
+ "sw": [
+ [
+ "sw-header--composed-controls",
+ "Dropdown"
+ ],
+ [
+ "sw-header--detail-buttons",
+ "Detail Buttons (Shared States)"
+ ],
+ [
+ "sw-header--overview",
+ "Overview"
+ ],
+ [
+ "sw-header--interactive-states",
+ "Interactive States"
+ ],
+ [
+ "sw-header--window-move-motion",
+ "Window Move Motion"
+ ],
+ [
+ "sw-header--logo-slot",
+ "Logo Slot"
+ ],
+ [
+ "sw-header--document-dropdown",
+ "Document Dropdown"
+ ],
+ [
+ "sw-header--responsive-more",
+ "Responsive More"
+ ],
+ [
+ "sw-header--k-guide",
+ "K Guide"
+ ],
+ [
+ "sw-header--property-panel-compare",
+ "Property Panel · 4개 비교"
+ ]
+ ],
+ "added": [
+ "sw-header-options--open-placement",
+ "sw-header-options--hidden-sub-controls",
+ "sw-header-options--composed-open",
+ "sw-header-options--composed-responsive",
+ "sw-popup--custom-content",
+ "sw-popup--multiple-popups",
+ "sw-tool--tool-buttons"
+ ]
+ }
+ },
+ {
+ "name": "inventory: the nine requested IDs existed before and are absent now",
+ "status": "PASS"
+ },
+ {
+ "name": "inventory: retained SW IDs, names, titles, tags and order unchanged",
+ "status": "PASS",
+ "data": [
+ "sw-header--composed-controls",
+ "sw-header--detail-buttons",
+ "sw-header--overview",
+ "sw-header--interactive-states",
+ "sw-header--window-move-motion",
+ "sw-header--logo-slot",
+ "sw-header--document-dropdown",
+ "sw-header--responsive-more",
+ "sw-header--k-guide",
+ "sw-header--property-panel-compare"
+ ]
+ },
+ {
+ "name": "inventory: every non-removed index entry identical (docs and other packages included)",
+ "status": "PASS"
+ },
+ {
+ "name": "inventory: Dropdown keeps sw-header--composed-controls / Dropdown / SW/Header",
+ "status": "PASS"
+ },
+ {
+ "name": "inventory: comparison keeps its ID and name",
+ "status": "PASS"
+ },
+ {
+ "name": "source: the nine Story exports are removed",
+ "status": "PASS"
+ },
+ {
+ "name": "source: retained exports (Stories and ComposedDemo) byte-identical",
+ "status": "PASS",
+ "data": []
+ },
+ {
+ "name": "source: other packages, Overview, Dropdown CSF, assets and Storybook config untouched; SW package only within the integrated-improvement files",
+ "status": "PASS",
+ "data": {
+ "unexpected": [],
+ "integrated": 19
+ }
+ },
+ {
+ "name": "sidebar: retained non-verification Stories in index order with their names",
+ "status": "PASS",
+ "data": [
+ [
+ "sw-header--composed-controls",
+ "Dropdown"
+ ],
+ [
+ "sw-header--overview",
+ "Overview"
+ ],
+ [
+ "sw-header--interactive-states",
+ "Interactive States"
+ ],
+ [
+ "sw-header--window-move-motion",
+ "Window Move Motion"
+ ],
+ [
+ "sw-header--logo-slot",
+ "Logo Slot"
+ ],
+ [
+ "sw-header--document-dropdown",
+ "Document Dropdown"
+ ],
+ [
+ "sw-header--responsive-more",
+ "Responsive More"
+ ],
+ [
+ "sw-header--k-guide",
+ "K Guide"
+ ],
+ [
+ "sw-header--property-panel-compare",
+ "Property Panel · 4개 비교"
+ ]
+ ]
+ },
+ {
+ "name": "sidebar: none of the nine removed menu IDs or names remain",
+ "status": "PASS",
+ "data": [
+ "Layer Detail · Input",
+ "Property Panel",
+ "Additional Hover",
+ "Property Bar",
+ "Dynamic Controls",
+ "Colorize",
+ "Composition (Visibility · Order)",
+ "Property Panel · 형상 Slot",
+ "Property Panel · 필드 13개"
+ ]
+ },
+ {
+ "name": "removed URL renders no SW Story",
+ "status": "PASS"
+ },
+ {
+ "name": "render sw-header--composed-controls",
+ "status": "PASS"
+ },
+ {
+ "name": "render sw-header--detail-buttons",
+ "status": "PASS"
+ },
+ {
+ "name": "render sw-header--overview",
+ "status": "PASS"
+ },
+ {
+ "name": "render sw-header--interactive-states",
+ "status": "PASS"
+ },
+ {
+ "name": "render sw-header--window-move-motion",
+ "status": "PASS"
+ },
+ {
+ "name": "render sw-header--logo-slot",
+ "status": "PASS"
+ },
+ {
+ "name": "render sw-header--document-dropdown",
+ "status": "PASS"
+ },
+ {
+ "name": "render sw-header--responsive-more",
+ "status": "PASS"
+ },
+ {
+ "name": "render sw-header--k-guide",
+ "status": "PASS"
+ },
+ {
+ "name": "render sw-header--property-panel-compare",
+ "status": "PASS"
+ },
+ {
+ "name": "Overview 390: one Header 49px, one Stage, no page overflow",
+ "status": "PASS",
+ "data": {
+ "height": 49
+ }
+ },
+ {
+ "name": "Overview 768: one Header 49px, one Stage, no page overflow",
+ "status": "PASS",
+ "data": {
+ "height": 49
+ }
+ },
+ {
+ "name": "Overview 1280: one Header 49px, one Stage, no page overflow",
+ "status": "PASS",
+ "data": {
+ "height": 49
+ }
+ },
+ {
+ "name": "Overview 1440: one Header 49px, one Stage, no page overflow",
+ "status": "PASS",
+ "data": {
+ "height": 49
+ }
+ },
+ {
+ "name": "Overview: layer Dropdown opens",
+ "status": "PASS"
+ },
+ {
+ "name": "Overview: Escape closes Dropdown and restores focus",
+ "status": "PASS"
+ },
+ {
+ "name": "Overview: layer Detail callback (former Layer Detail page) and close",
+ "status": "PASS"
+ },
+ {
+ "name": "Overview: btn_colorize 24 × 24 calls onColorPick and closes (former Colorize page)",
+ "status": "PASS",
+ "data": {
+ "x": 700,
+ "y": 324.25,
+ "width": 24,
+ "height": 24
+ }
+ },
+ {
+ "name": "Overview: property Bar Enter commits through callback",
+ "status": "PASS"
+ },
+ {
+ "name": "Overview: property Bar validation keeps min=0",
+ "status": "PASS"
+ },
+ {
+ "name": "Overview: panel opens with the shared Bar value",
+ "status": "PASS"
+ },
+ {
+ "name": "Overview: Escape closes panel and returns focus to its trigger",
+ "status": "PASS"
+ },
+ {
+ "name": "Dropdown: five fields plus the 상세보기 group (6 controls)",
+ "status": "PASS"
+ },
+ {
+ "name": "Dropdown 390: 레이어 opens, Escape closes, focus returns",
+ "status": "PASS"
+ },
+ {
+ "name": "Dropdown 390: 색상 opens, Escape closes, focus returns",
+ "status": "PASS"
+ },
+ {
+ "name": "Dropdown 390: 선스타일 opens, Escape closes, focus returns",
+ "status": "PASS"
+ },
+ {
+ "name": "Dropdown 390: 문자스타일 opens, Escape closes, focus returns",
+ "status": "PASS"
+ },
+ {
+ "name": "Dropdown 390: 치수스타일 opens, Escape closes, focus returns",
+ "status": "PASS"
+ },
+ {
+ "name": "Dropdown 390: no page overflow",
+ "status": "PASS"
+ },
+ {
+ "name": "Dropdown 768: 레이어 opens, Escape closes, focus returns",
+ "status": "PASS"
+ },
+ {
+ "name": "Dropdown 768: 색상 opens, Escape closes, focus returns",
+ "status": "PASS"
+ },
+ {
+ "name": "Dropdown 768: 선스타일 opens, Escape closes, focus returns",
+ "status": "PASS"
+ },
+ {
+ "name": "Dropdown 768: 문자스타일 opens, Escape closes, focus returns",
+ "status": "PASS"
+ },
+ {
+ "name": "Dropdown 768: 치수스타일 opens, Escape closes, focus returns",
+ "status": "PASS"
+ },
+ {
+ "name": "Dropdown 768: no page overflow",
+ "status": "PASS"
+ },
+ {
+ "name": "Dropdown 1280: 레이어 opens, Escape closes, focus returns",
+ "status": "PASS"
+ },
+ {
+ "name": "Dropdown 1280: 색상 opens, Escape closes, focus returns",
+ "status": "PASS"
+ },
+ {
+ "name": "Dropdown 1280: 선스타일 opens, Escape closes, focus returns",
+ "status": "PASS"
+ },
+ {
+ "name": "Dropdown 1280: 문자스타일 opens, Escape closes, focus returns",
+ "status": "PASS"
+ },
+ {
+ "name": "Dropdown 1280: 치수스타일 opens, Escape closes, focus returns",
+ "status": "PASS"
+ },
+ {
+ "name": "Dropdown 1280: no page overflow",
+ "status": "PASS"
+ },
+ {
+ "name": "Dropdown 1440: 레이어 opens, Escape closes, focus returns",
+ "status": "PASS"
+ },
+ {
+ "name": "Dropdown 1440: 색상 opens, Escape closes, focus returns",
+ "status": "PASS"
+ },
+ {
+ "name": "Dropdown 1440: 선스타일 opens, Escape closes, focus returns",
+ "status": "PASS"
+ },
+ {
+ "name": "Dropdown 1440: 문자스타일 opens, Escape closes, focus returns",
+ "status": "PASS"
+ },
+ {
+ "name": "Dropdown 1440: 치수스타일 opens, Escape closes, focus returns",
+ "status": "PASS"
+ },
+ {
+ "name": "Dropdown 1440: no page overflow",
+ "status": "PASS"
+ },
+ {
+ "name": "Dropdown: text style selection reflected in field and status",
+ "status": "PASS"
+ },
+ {
+ "name": "Dropdown: line style selection reflected",
+ "status": "PASS"
+ },
+ {
+ "name": "Compare 390: four states in order at 314 × 256 / 361 / 658 / 754",
+ "status": "PASS",
+ "data": [
+ {
+ "id": "none",
+ "x": 16,
+ "y": 212.5,
+ "right": 330,
+ "bottom": 534.5,
+ "w": 314,
+ "h": 256
+ },
+ {
+ "id": "all",
+ "x": 354,
+ "y": 212.5,
+ "right": 668,
+ "bottom": 639.5,
+ "w": 314,
+ "h": 361
+ },
+ {
+ "id": "circle",
+ "x": 16,
+ "y": 663.5,
+ "right": 330,
+ "bottom": 1387.5,
+ "w": 314,
+ "h": 658
+ },
+ {
+ "id": "expanded",
+ "x": 354,
+ "y": 663.5,
+ "right": 668,
+ "bottom": 1483.5,
+ "w": 314,
+ "h": 754
+ }
+ ]
+ },
+ {
+ "name": "Compare 390: 2 columns × 2 rows",
+ "status": "PASS"
+ },
+ {
+ "name": "Compare 390: Inner scroll reaches the 754px panel bottom; page does not scroll",
+ "status": "PASS",
+ "data": {
+ "cells": [
+ {
+ "id": "none",
+ "x": 16,
+ "y": 212.5,
+ "right": 330,
+ "bottom": 534.5,
+ "w": 314,
+ "h": 256
+ },
+ {
+ "id": "all",
+ "x": 354,
+ "y": 212.5,
+ "right": 668,
+ "bottom": 639.5,
+ "w": 314,
+ "h": 361
+ },
+ {
+ "id": "circle",
+ "x": 16,
+ "y": 663.5,
+ "right": 330,
+ "bottom": 1387.5,
+ "w": 314,
+ "h": 658
+ },
+ {
+ "id": "expanded",
+ "x": 354,
+ "y": 663.5,
+ "right": 668,
+ "bottom": 1483.5,
+ "w": 314,
+ "h": 754
+ }
+ ],
+ "reach": true,
+ "docFits": true
+ }
+ },
+ {
+ "name": "Compare 768: four states in order at 314 × 256 / 361 / 658 / 754",
+ "status": "PASS",
+ "data": [
+ {
+ "id": "none",
+ "x": 23.046875,
+ "y": 199.53125,
+ "right": 337.046875,
+ "bottom": 521.53125,
+ "w": 314,
+ "h": 256
+ },
+ {
+ "id": "all",
+ "x": 361.046875,
+ "y": 199.53125,
+ "right": 675.046875,
+ "bottom": 626.53125,
+ "w": 314,
+ "h": 361
+ },
+ {
+ "id": "circle",
+ "x": 23.046875,
+ "y": 650.53125,
+ "right": 337.046875,
+ "bottom": 1374.53125,
+ "w": 314,
+ "h": 658
+ },
+ {
+ "id": "expanded",
+ "x": 361.046875,
+ "y": 650.53125,
+ "right": 675.046875,
+ "bottom": 1470.53125,
+ "w": 314,
+ "h": 754
+ }
+ ]
+ },
+ {
+ "name": "Compare 768: 2 columns × 2 rows",
+ "status": "PASS"
+ },
+ {
+ "name": "Compare 768: Inner scroll reaches the 754px panel bottom; page does not scroll",
+ "status": "PASS",
+ "data": {
+ "cells": [
+ {
+ "id": "none",
+ "x": 23.046875,
+ "y": 199.53125,
+ "right": 337.046875,
+ "bottom": 521.53125,
+ "w": 314,
+ "h": 256
+ },
+ {
+ "id": "all",
+ "x": 361.046875,
+ "y": 199.53125,
+ "right": 675.046875,
+ "bottom": 626.53125,
+ "w": 314,
+ "h": 361
+ },
+ {
+ "id": "circle",
+ "x": 23.046875,
+ "y": 650.53125,
+ "right": 337.046875,
+ "bottom": 1374.53125,
+ "w": 314,
+ "h": 658
+ },
+ {
+ "id": "expanded",
+ "x": 361.046875,
+ "y": 650.53125,
+ "right": 675.046875,
+ "bottom": 1470.53125,
+ "w": 314,
+ "h": 754
+ }
+ ],
+ "reach": true,
+ "docFits": true
+ }
+ },
+ {
+ "name": "Compare 1280: four states in order at 314 × 256 / 361 / 658 / 754",
+ "status": "PASS",
+ "data": [
+ {
+ "id": "none",
+ "x": 38.40625,
+ "y": 214.890625,
+ "right": 352.40625,
+ "bottom": 536.890625,
+ "w": 314,
+ "h": 256
+ },
+ {
+ "id": "all",
+ "x": 376.40625,
+ "y": 214.890625,
+ "right": 690.40625,
+ "bottom": 641.890625,
+ "w": 314,
+ "h": 361
+ },
+ {
+ "id": "circle",
+ "x": 38.40625,
+ "y": 665.890625,
+ "right": 352.40625,
+ "bottom": 1389.890625,
+ "w": 314,
+ "h": 658
+ },
+ {
+ "id": "expanded",
+ "x": 376.40625,
+ "y": 665.890625,
+ "right": 690.40625,
+ "bottom": 1485.890625,
+ "w": 314,
+ "h": 754
+ }
+ ]
+ },
+ {
+ "name": "Compare 1280: 2 columns × 2 rows",
+ "status": "PASS"
+ },
+ {
+ "name": "Compare 1280: Inner scroll reaches the 754px panel bottom; page does not scroll",
+ "status": "PASS",
+ "data": {
+ "cells": [
+ {
+ "id": "none",
+ "x": 38.40625,
+ "y": 214.890625,
+ "right": 352.40625,
+ "bottom": 536.890625,
+ "w": 314,
+ "h": 256
+ },
+ {
+ "id": "all",
+ "x": 376.40625,
+ "y": 214.890625,
+ "right": 690.40625,
+ "bottom": 641.890625,
+ "w": 314,
+ "h": 361
+ },
+ {
+ "id": "circle",
+ "x": 38.40625,
+ "y": 665.890625,
+ "right": 352.40625,
+ "bottom": 1389.890625,
+ "w": 314,
+ "h": 658
+ },
+ {
+ "id": "expanded",
+ "x": 376.40625,
+ "y": 665.890625,
+ "right": 690.40625,
+ "bottom": 1485.890625,
+ "w": 314,
+ "h": 754
+ }
+ ],
+ "reach": true,
+ "docFits": true
+ }
+ },
+ {
+ "name": "Compare 1440: four states in order at 314 × 256 / 361 / 658 / 754",
+ "status": "PASS",
+ "data": [
+ {
+ "id": "none",
+ "x": 120,
+ "y": 216.5,
+ "right": 434,
+ "bottom": 538.5,
+ "w": 314,
+ "h": 256
+ },
+ {
+ "id": "all",
+ "x": 458,
+ "y": 216.5,
+ "right": 772,
+ "bottom": 643.5,
+ "w": 314,
+ "h": 361
+ },
+ {
+ "id": "circle",
+ "x": 120,
+ "y": 667.5,
+ "right": 434,
+ "bottom": 1391.5,
+ "w": 314,
+ "h": 658
+ },
+ {
+ "id": "expanded",
+ "x": 458,
+ "y": 667.5,
+ "right": 772,
+ "bottom": 1487.5,
+ "w": 314,
+ "h": 754
+ }
+ ]
+ },
+ {
+ "name": "Compare 1440: 2 columns × 2 rows",
+ "status": "PASS"
+ },
+ {
+ "name": "Compare 1440: Inner scroll reaches the 754px panel bottom; page does not scroll",
+ "status": "PASS",
+ "data": {
+ "cells": [
+ {
+ "id": "none",
+ "x": 120,
+ "y": 216.5,
+ "right": 434,
+ "bottom": 538.5,
+ "w": 314,
+ "h": 256
+ },
+ {
+ "id": "all",
+ "x": 458,
+ "y": 216.5,
+ "right": 772,
+ "bottom": 643.5,
+ "w": 314,
+ "h": 361
+ },
+ {
+ "id": "circle",
+ "x": 120,
+ "y": 667.5,
+ "right": 434,
+ "bottom": 1391.5,
+ "w": 314,
+ "h": 658
+ },
+ {
+ "id": "expanded",
+ "x": 458,
+ "y": 667.5,
+ "right": 772,
+ "bottom": 1487.5,
+ "w": 314,
+ "h": 754
+ }
+ ],
+ "reach": true,
+ "docFits": true
+ }
+ },
+ {
+ "name": "Compare: editable Input caret #E60403 (former Layer Detail · Input page)",
+ "status": "PASS"
+ },
+ {
+ "name": "Compare: Input Enter commits only in its own panel",
+ "status": "PASS"
+ },
+ {
+ "name": "Compare: Input Escape cancels",
+ "status": "PASS"
+ },
+ {
+ "name": "Compare: layer Dropdown selection commits via callback",
+ "status": "PASS"
+ },
+ {
+ "name": "Compare: Escape closes the Dropdown and returns focus",
+ "status": "PASS"
+ },
+ {
+ "name": "Motion: one section 「단계별 진행 (3배 확대)」 with nine stages at zoom 3",
+ "status": "PASS",
+ "data": [
+ {
+ "time": "rest",
+ "animations": 0,
+ "zoom": "3"
+ },
+ {
+ "time": "0",
+ "animations": 3,
+ "zoom": "3"
+ },
+ {
+ "time": "204.8780487804878",
+ "animations": 3,
+ "zoom": "3"
+ },
+ {
+ "time": "409.7560975609756",
+ "animations": 3,
+ "zoom": "3"
+ },
+ {
+ "time": "443.9024390243902",
+ "animations": 3,
+ "zoom": "3"
+ },
+ {
+ "time": "682.9268292682926",
+ "animations": 3,
+ "zoom": "3"
+ },
+ {
+ "time": "887.8048780487804",
+ "animations": 3,
+ "zoom": "3"
+ },
+ {
+ "time": "1365.8536585365853",
+ "animations": 3,
+ "zoom": "3"
+ },
+ {
+ "time": "1400",
+ "animations": 3,
+ "zoom": "3"
+ }
+ ]
+ },
+ {
+ "name": "Motion: rest stage static, timed stages hold three paused animations",
+ "status": "PASS",
+ "data": [
+ {
+ "time": "rest",
+ "animations": 0,
+ "zoom": "3"
+ },
+ {
+ "time": "0",
+ "animations": 3,
+ "zoom": "3"
+ },
+ {
+ "time": "204.8780487804878",
+ "animations": 3,
+ "zoom": "3"
+ },
+ {
+ "time": "409.7560975609756",
+ "animations": 3,
+ "zoom": "3"
+ },
+ {
+ "time": "443.9024390243902",
+ "animations": 3,
+ "zoom": "3"
+ },
+ {
+ "time": "682.9268292682926",
+ "animations": 3,
+ "zoom": "3"
+ },
+ {
+ "time": "887.8048780487804",
+ "animations": 3,
+ "zoom": "3"
+ },
+ {
+ "time": "1365.8536585365853",
+ "animations": 3,
+ "zoom": "3"
+ },
+ {
+ "time": "1400",
+ "animations": 3,
+ "zoom": "3"
+ }
+ ]
+ },
+ {
+ "name": "no browser console or page errors",
+ "status": "PASS",
+ "data": []
+ }
+ ],
+ "errors": [],
+ "data": {
+ "inventory": {
+ "before": [
+ 338,
+ 19
+ ],
+ "after": [
+ 336,
+ 10
+ ],
+ "sw": [
+ [
+ "sw-header--composed-controls",
+ "Dropdown"
+ ],
+ [
+ "sw-header--detail-buttons",
+ "Detail Buttons (Shared States)"
+ ],
+ [
+ "sw-header--overview",
+ "Overview"
+ ],
+ [
+ "sw-header--interactive-states",
+ "Interactive States"
+ ],
+ [
+ "sw-header--window-move-motion",
+ "Window Move Motion"
+ ],
+ [
+ "sw-header--logo-slot",
+ "Logo Slot"
+ ],
+ [
+ "sw-header--document-dropdown",
+ "Document Dropdown"
+ ],
+ [
+ "sw-header--responsive-more",
+ "Responsive More"
+ ],
+ [
+ "sw-header--k-guide",
+ "K Guide"
+ ],
+ [
+ "sw-header--property-panel-compare",
+ "Property Panel · 4개 비교"
+ ]
+ ]
+ },
+ "sidebar": [
+ [
+ "sw-header--composed-controls",
+ "Dropdown"
+ ],
+ [
+ "sw-header--overview",
+ "Overview"
+ ],
+ [
+ "sw-header--interactive-states",
+ "Interactive States"
+ ],
+ [
+ "sw-header--window-move-motion",
+ "Window Move Motion"
+ ],
+ [
+ "sw-header--logo-slot",
+ "Logo Slot"
+ ],
+ [
+ "sw-header--document-dropdown",
+ "Document Dropdown"
+ ],
+ [
+ "sw-header--responsive-more",
+ "Responsive More"
+ ],
+ [
+ "sw-header--k-guide",
+ "K Guide"
+ ],
+ [
+ "sw-header--property-panel-compare",
+ "Property Panel · 4개 비교"
+ ]
+ ],
+ "compare390": {
+ "cells": [
+ {
+ "id": "none",
+ "x": 16,
+ "y": 212.5,
+ "right": 330,
+ "bottom": 534.5,
+ "w": 314,
+ "h": 256
+ },
+ {
+ "id": "all",
+ "x": 354,
+ "y": 212.5,
+ "right": 668,
+ "bottom": 639.5,
+ "w": 314,
+ "h": 361
+ },
+ {
+ "id": "circle",
+ "x": 16,
+ "y": 663.5,
+ "right": 330,
+ "bottom": 1387.5,
+ "w": 314,
+ "h": 658
+ },
+ {
+ "id": "expanded",
+ "x": 354,
+ "y": 663.5,
+ "right": 668,
+ "bottom": 1483.5,
+ "w": 314,
+ "h": 754
+ }
+ ],
+ "reach": true,
+ "docFits": true
+ },
+ "compare768": {
+ "cells": [
+ {
+ "id": "none",
+ "x": 23.046875,
+ "y": 199.53125,
+ "right": 337.046875,
+ "bottom": 521.53125,
+ "w": 314,
+ "h": 256
+ },
+ {
+ "id": "all",
+ "x": 361.046875,
+ "y": 199.53125,
+ "right": 675.046875,
+ "bottom": 626.53125,
+ "w": 314,
+ "h": 361
+ },
+ {
+ "id": "circle",
+ "x": 23.046875,
+ "y": 650.53125,
+ "right": 337.046875,
+ "bottom": 1374.53125,
+ "w": 314,
+ "h": 658
+ },
+ {
+ "id": "expanded",
+ "x": 361.046875,
+ "y": 650.53125,
+ "right": 675.046875,
+ "bottom": 1470.53125,
+ "w": 314,
+ "h": 754
+ }
+ ],
+ "reach": true,
+ "docFits": true
+ },
+ "compare1280": {
+ "cells": [
+ {
+ "id": "none",
+ "x": 38.40625,
+ "y": 214.890625,
+ "right": 352.40625,
+ "bottom": 536.890625,
+ "w": 314,
+ "h": 256
+ },
+ {
+ "id": "all",
+ "x": 376.40625,
+ "y": 214.890625,
+ "right": 690.40625,
+ "bottom": 641.890625,
+ "w": 314,
+ "h": 361
+ },
+ {
+ "id": "circle",
+ "x": 38.40625,
+ "y": 665.890625,
+ "right": 352.40625,
+ "bottom": 1389.890625,
+ "w": 314,
+ "h": 658
+ },
+ {
+ "id": "expanded",
+ "x": 376.40625,
+ "y": 665.890625,
+ "right": 690.40625,
+ "bottom": 1485.890625,
+ "w": 314,
+ "h": 754
+ }
+ ],
+ "reach": true,
+ "docFits": true
+ },
+ "compare1440": {
+ "cells": [
+ {
+ "id": "none",
+ "x": 120,
+ "y": 216.5,
+ "right": 434,
+ "bottom": 538.5,
+ "w": 314,
+ "h": 256
+ },
+ {
+ "id": "all",
+ "x": 458,
+ "y": 216.5,
+ "right": 772,
+ "bottom": 643.5,
+ "w": 314,
+ "h": 361
+ },
+ {
+ "id": "circle",
+ "x": 120,
+ "y": 667.5,
+ "right": 434,
+ "bottom": 1391.5,
+ "w": 314,
+ "h": 658
+ },
+ {
+ "id": "expanded",
+ "x": 458,
+ "y": 667.5,
+ "right": 772,
+ "bottom": 1487.5,
+ "w": 314,
+ "h": 754
+ }
+ ],
+ "reach": true,
+ "docFits": true
+ }
+ },
+ "browser": "155.0.8059.80",
+ "status": "PASS"
+}
diff --git a/docs/sw/integrated-improvement-qa/final-storybook-unused-removal/story-inventory-after.json b/docs/sw/integrated-improvement-qa/final-storybook-unused-removal/story-inventory-after.json
new file mode 100644
index 0000000..70b67ce
--- /dev/null
+++ b/docs/sw/integrated-improvement-qa/final-storybook-unused-removal/story-inventory-after.json
@@ -0,0 +1,106 @@
+{
+ "total": 336,
+ "sw": [
+ {
+ "id": "sw-header--composed-controls",
+ "name": "Dropdown",
+ "title": "SW/Header",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ]
+ },
+ {
+ "id": "sw-header--detail-buttons",
+ "name": "Detail Buttons (Shared States)",
+ "title": "SW/Header",
+ "tags": [
+ "dev",
+ "test",
+ "manifest",
+ "verification"
+ ]
+ },
+ {
+ "id": "sw-header--overview",
+ "name": "Overview",
+ "title": "SW/Header",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ]
+ },
+ {
+ "id": "sw-header--interactive-states",
+ "name": "Interactive States",
+ "title": "SW/Header",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ]
+ },
+ {
+ "id": "sw-header--window-move-motion",
+ "name": "Window Move Motion",
+ "title": "SW/Header",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ]
+ },
+ {
+ "id": "sw-header--logo-slot",
+ "name": "Logo Slot",
+ "title": "SW/Header",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ]
+ },
+ {
+ "id": "sw-header--document-dropdown",
+ "name": "Document Dropdown",
+ "title": "SW/Header",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ]
+ },
+ {
+ "id": "sw-header--responsive-more",
+ "name": "Responsive More",
+ "title": "SW/Header",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ]
+ },
+ {
+ "id": "sw-header--k-guide",
+ "name": "K Guide",
+ "title": "SW/Header",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ]
+ },
+ {
+ "id": "sw-header--property-panel-compare",
+ "name": "Property Panel · 4개 비교",
+ "title": "SW/Header",
+ "tags": [
+ "dev",
+ "test",
+ "manifest"
+ ]
+ }
+ ]
+}
diff --git a/docs/sw/integrated-improvement-qa/verify/composed-open.png b/docs/sw/integrated-improvement-qa/verify/composed-open.png
new file mode 100644
index 0000000..f85f874
Binary files /dev/null and b/docs/sw/integrated-improvement-qa/verify/composed-open.png differ
diff --git a/docs/sw/integrated-improvement-qa/verify/composed-responsive.png b/docs/sw/integrated-improvement-qa/verify/composed-responsive.png
new file mode 100644
index 0000000..c85a301
Binary files /dev/null and b/docs/sw/integrated-improvement-qa/verify/composed-responsive.png differ
diff --git a/docs/sw/integrated-improvement-qa/verify/hidden-document-new.png b/docs/sw/integrated-improvement-qa/verify/hidden-document-new.png
new file mode 100644
index 0000000..96a1d9f
Binary files /dev/null and b/docs/sw/integrated-improvement-qa/verify/hidden-document-new.png differ
diff --git a/docs/sw/integrated-improvement-qa/verify/hidden-layer-states.png b/docs/sw/integrated-improvement-qa/verify/hidden-layer-states.png
new file mode 100644
index 0000000..354b838
Binary files /dev/null and b/docs/sw/integrated-improvement-qa/verify/hidden-layer-states.png differ
diff --git a/docs/sw/integrated-improvement-qa/verify/integrated-improvement-result.json b/docs/sw/integrated-improvement-qa/verify/integrated-improvement-result.json
new file mode 100644
index 0000000..1d61e84
--- /dev/null
+++ b/docs/sw/integrated-improvement-qa/verify/integrated-improvement-result.json
@@ -0,0 +1,1286 @@
+{
+ "browser": "155.0.8059.80",
+ "checks": [
+ {
+ "name": "menu (default): no Open next to the logo",
+ "status": "PASS"
+ },
+ {
+ "name": "menu (default): dropdown footer keeps + New and Open",
+ "status": "PASS"
+ },
+ {
+ "name": "header: Open takes the file name place right of the logo (same junction offset, 48px)",
+ "status": "PASS",
+ "data": {
+ "home": {
+ "x": 360,
+ "y": 851.5,
+ "w": 80,
+ "h": 48,
+ "right": 440
+ },
+ "openBox": {
+ "x": 425,
+ "y": 851.5,
+ "w": 58.265625,
+ "h": 48,
+ "right": 483.265625
+ },
+ "junction": -15
+ }
+ },
+ {
+ "name": "header: file name follows Open without overlap",
+ "status": "PASS",
+ "data": {
+ "openBox": {
+ "x": 425,
+ "y": 851.5,
+ "w": 58.265625,
+ "h": 48,
+ "right": 483.265625
+ },
+ "docBox": {
+ "x": 485.265625,
+ "y": 851.5,
+ "w": 249.734375,
+ "h": 48,
+ "right": 735
+ }
+ }
+ },
+ {
+ "name": "header: Open uses hm-sw-header__document-button (same surface, color, weight as the file name)",
+ "status": "PASS",
+ "data": {
+ "styles": {
+ "cls": "hm-sw-header__document-button",
+ "bg": "linear-gradient(rgb(8, 24, 19) 0%, rgb(9",
+ "color": "rgb(240, 247, 245)",
+ "weight": "700",
+ "padL": "5px",
+ "borderL": "0px",
+ "borderR": "1px"
+ },
+ "fileStyles": {
+ "bg": "linear-gradient(rgb(8, 24, 19) 0%, rgb(9",
+ "color": "rgb(240, 247, 245)",
+ "weight": "700",
+ "padL": "12px"
+ }
+ }
+ },
+ {
+ "name": "D-1: file name after Open starts with 12px padding",
+ "status": "PASS",
+ "data": {
+ "bg": "linear-gradient(rgb(8, 24, 19) 0%, rgb(9",
+ "color": "rgb(240, 247, 245)",
+ "weight": "700",
+ "padL": "12px"
+ }
+ },
+ {
+ "name": "header: Open hover turns only the text #FFC600",
+ "status": "PASS"
+ },
+ {
+ "name": "header: dropdown footer has + New only (no duplicate Open)",
+ "status": "PASS"
+ },
+ {
+ "name": "header: Open calls onDocumentOpen",
+ "status": "PASS"
+ },
+ {
+ "name": "documentOpenLabel is the Open text",
+ "status": "PASS"
+ },
+ {
+ "name": "responsive 1920: 49px, no overflow or overlap, nothing past the edge",
+ "status": "PASS",
+ "data": {
+ "height": 49,
+ "barOverflow": 0,
+ "areaOverflow": 1,
+ "headerRight": 2280,
+ "barRight": 2280,
+ "overlap": false,
+ "open": 58.265625,
+ "doc": 249.734375,
+ "layer": 234,
+ "more": false
+ }
+ },
+ {
+ "name": "responsive 1920: Open shown next to the logo",
+ "status": "PASS",
+ "data": {
+ "open": 58.265625,
+ "inMore": null
+ }
+ },
+ {
+ "name": "responsive 1920: layer field keeps its Figma width (234) while Open is shown",
+ "status": "PASS",
+ "data": 234
+ },
+ {
+ "name": "responsive 1800: 49px, no overflow or overlap, nothing past the edge",
+ "status": "PASS",
+ "data": {
+ "height": 49,
+ "barOverflow": 0,
+ "areaOverflow": 1,
+ "headerRight": 2160,
+ "barRight": 2160,
+ "overlap": false,
+ "open": 58.265625,
+ "doc": 190,
+ "layer": 234,
+ "more": false
+ }
+ },
+ {
+ "name": "responsive 1800: Open shown next to the logo",
+ "status": "PASS",
+ "data": {
+ "open": 58.265625,
+ "inMore": null
+ }
+ },
+ {
+ "name": "responsive 1800: layer field keeps its Figma width (234) while Open is shown",
+ "status": "PASS",
+ "data": 234
+ },
+ {
+ "name": "responsive 1440: 49px, no overflow or overlap, nothing past the edge",
+ "status": "PASS",
+ "data": {
+ "height": 49,
+ "barOverflow": 0,
+ "areaOverflow": 1,
+ "headerRight": 1800,
+ "barRight": 1800,
+ "overlap": false,
+ "open": 58.265625,
+ "doc": 310,
+ "layer": 234,
+ "more": true
+ }
+ },
+ {
+ "name": "responsive 1440: Open shown next to the logo",
+ "status": "PASS",
+ "data": {
+ "open": 58.265625,
+ "inMore": null
+ }
+ },
+ {
+ "name": "responsive 1440: layer field keeps its Figma width (234) while Open is shown",
+ "status": "PASS",
+ "data": 234
+ },
+ {
+ "name": "responsive 1180: 49px, no overflow or overlap, nothing past the edge",
+ "status": "PASS",
+ "data": {
+ "height": 49,
+ "barOverflow": 0,
+ "areaOverflow": 1,
+ "headerRight": 1540,
+ "barRight": 1540,
+ "overlap": false,
+ "open": 58.265625,
+ "doc": 120,
+ "layer": 234,
+ "more": true
+ }
+ },
+ {
+ "name": "responsive 1180: Open shown next to the logo",
+ "status": "PASS",
+ "data": {
+ "open": 58.265625,
+ "inMore": null
+ }
+ },
+ {
+ "name": "responsive 1180: layer field keeps its Figma width (234) while Open is shown",
+ "status": "PASS",
+ "data": 234
+ },
+ {
+ "name": "responsive 1080: 49px, no overflow or overlap, nothing past the edge",
+ "status": "PASS",
+ "data": {
+ "height": 49,
+ "barOverflow": 0,
+ "areaOverflow": 1,
+ "headerRight": 1440,
+ "barRight": 1440,
+ "overlap": false,
+ "open": 58.265625,
+ "doc": 120,
+ "layer": 234,
+ "more": true
+ }
+ },
+ {
+ "name": "responsive 1080: Open shown next to the logo",
+ "status": "PASS",
+ "data": {
+ "open": 58.265625,
+ "inMore": null
+ }
+ },
+ {
+ "name": "responsive 1080: layer field keeps its Figma width (234) while Open is shown",
+ "status": "PASS",
+ "data": 234
+ },
+ {
+ "name": "responsive 900: 49px, no overflow or overlap, nothing past the edge",
+ "status": "PASS",
+ "data": {
+ "height": 49,
+ "barOverflow": 0,
+ "areaOverflow": 0,
+ "headerRight": 1260,
+ "barRight": 1260,
+ "overlap": false,
+ "open": 58.265625,
+ "doc": 120,
+ "layer": 234,
+ "more": true
+ }
+ },
+ {
+ "name": "responsive 900: Open shown next to the logo",
+ "status": "PASS",
+ "data": {
+ "open": 58.265625,
+ "inMore": null
+ }
+ },
+ {
+ "name": "responsive 900: layer field keeps its Figma width (234) while Open is shown",
+ "status": "PASS",
+ "data": 234
+ },
+ {
+ "name": "responsive 768: 49px, no overflow or overlap, nothing past the edge",
+ "status": "PASS",
+ "data": {
+ "height": 49,
+ "barOverflow": 0,
+ "areaOverflow": 0,
+ "headerRight": 1128,
+ "barRight": 1128,
+ "overlap": false,
+ "open": 58.265625,
+ "doc": 178.734375,
+ "layer": 234,
+ "more": true
+ }
+ },
+ {
+ "name": "responsive 768: Open shown next to the logo",
+ "status": "PASS",
+ "data": {
+ "open": 58.265625,
+ "inMore": null
+ }
+ },
+ {
+ "name": "responsive 768: layer field keeps its Figma width (234) while Open is shown",
+ "status": "PASS",
+ "data": 234
+ },
+ {
+ "name": "responsive 640: 49px, no overflow or overlap, nothing past the edge",
+ "status": "PASS",
+ "data": {
+ "height": 49,
+ "barOverflow": 0,
+ "areaOverflow": 1,
+ "headerRight": 1000,
+ "barRight": 1000,
+ "overlap": false,
+ "open": 58.265625,
+ "doc": 96,
+ "layer": 234,
+ "more": true
+ }
+ },
+ {
+ "name": "responsive 640: Open shown next to the logo",
+ "status": "PASS",
+ "data": {
+ "open": 58.265625,
+ "inMore": null
+ }
+ },
+ {
+ "name": "responsive 640: layer field keeps its Figma width (234) while Open is shown",
+ "status": "PASS",
+ "data": 234
+ },
+ {
+ "name": "responsive 520: 49px, no overflow or overlap, nothing past the edge",
+ "status": "PASS",
+ "data": {
+ "height": 49,
+ "barOverflow": 0,
+ "areaOverflow": 0,
+ "headerRight": 880,
+ "barRight": 880,
+ "overlap": false,
+ "open": 0,
+ "doc": 103,
+ "layer": 234,
+ "more": true
+ }
+ },
+ {
+ "name": "responsive 520: Open moved into More and works there",
+ "status": "PASS",
+ "data": {
+ "open": 0,
+ "inMore": true
+ }
+ },
+ {
+ "name": "responsive 520: layer field keeps its Figma width (234) while Open is shown",
+ "status": "PASS",
+ "data": 234
+ },
+ {
+ "name": "responsive 390: 49px, no overflow or overlap, nothing past the edge",
+ "status": "PASS",
+ "data": {
+ "height": 49,
+ "barOverflow": 0,
+ "areaOverflow": 0,
+ "headerRight": 750,
+ "barRight": 750,
+ "overlap": false,
+ "open": 0,
+ "doc": 96,
+ "layer": 113,
+ "more": true
+ }
+ },
+ {
+ "name": "responsive 390: Open moved into More and works there",
+ "status": "PASS",
+ "data": {
+ "open": 0,
+ "inMore": true
+ }
+ },
+ {
+ "name": "resize: collapsed Open returns once when the header grows (measured, with hysteresis)",
+ "status": "PASS",
+ "data": [
+ [
+ 520,
+ 0
+ ],
+ [
+ 560,
+ 0
+ ],
+ [
+ 600,
+ 1
+ ],
+ [
+ 640,
+ 1
+ ],
+ [
+ 680,
+ 1
+ ],
+ [
+ 720,
+ 1
+ ],
+ [
+ 760,
+ 1
+ ],
+ [
+ 820,
+ 1
+ ],
+ [
+ 900,
+ 1
+ ],
+ [
+ 1080,
+ 1
+ ]
+ ]
+ },
+ {
+ "name": "hidden documentNew: footer keeps Open on its right side",
+ "status": "PASS",
+ "data": {
+ "footer": {
+ "x": 424,
+ "y": 442.5,
+ "w": 310,
+ "h": 40,
+ "right": 734
+ },
+ "action": {
+ "x": 675.96875,
+ "y": 451,
+ "w": 50.03125,
+ "h": 24,
+ "right": 726
+ }
+ }
+ },
+ {
+ "name": "hidden documentNew + documentOpen: no footer",
+ "status": "PASS"
+ },
+ {
+ "name": "hidden layerFreeze / layerLock: field draws the bulb only, two empty 20px places",
+ "status": "PASS",
+ "data": [
+ {
+ "empty": false,
+ "w": 20
+ },
+ {
+ "empty": true,
+ "w": 20
+ },
+ {
+ "empty": true,
+ "w": 20
+ }
+ ]
+ },
+ {
+ "name": "hidden layerFreeze / layerLock: rows have no snowflake / lock button, places kept",
+ "status": "PASS",
+ "data": [
+ {
+ "buttons": [
+ "hm-sw-header__layer-toggle--visibility",
+ "hm-sw-header__layer-item"
+ ],
+ "empty": 2,
+ "name": 931
+ },
+ {
+ "buttons": [
+ "hm-sw-header__layer-toggle--visibility",
+ "hm-sw-header__layer-item"
+ ],
+ "empty": 2,
+ "name": 931
+ },
+ {
+ "buttons": [
+ "hm-sw-header__layer-toggle--visibility",
+ "hm-sw-header__layer-item"
+ ],
+ "empty": 2,
+ "name": 931
+ }
+ ]
+ },
+ {
+ "name": "hidden layer states: the bulb still reports its callback",
+ "status": "PASS"
+ },
+ {
+ "name": "composed: Open right of the logo at the same junction offset as SWHeader",
+ "status": "PASS",
+ "data": {
+ "cHome": {
+ "x": 360,
+ "y": 285.5,
+ "w": 80,
+ "h": 48,
+ "right": 440
+ },
+ "cOpen": {
+ "x": 425,
+ "y": 285.5,
+ "w": 58.265625,
+ "h": 48,
+ "right": 483.265625
+ }
+ }
+ },
+ {
+ "name": "composed: file name after Open has 12px padding",
+ "status": "PASS"
+ },
+ {
+ "name": "composed: Open callback",
+ "status": "PASS"
+ },
+ {
+ "name": "composed: showOpen={false} removes Open from the dropdown",
+ "status": "PASS"
+ },
+ {
+ "name": "composed responsive 1920: 49px, no overflow, nothing past the edge",
+ "status": "PASS",
+ "data": {
+ "height": 49,
+ "barOverflow": 0,
+ "areaOverflow": 0,
+ "open": 1,
+ "more": 0,
+ "clipped": false,
+ "right": 0
+ }
+ },
+ {
+ "name": "composed responsive 1800: 49px, no overflow, nothing past the edge",
+ "status": "PASS",
+ "data": {
+ "height": 49,
+ "barOverflow": 0,
+ "areaOverflow": 0,
+ "open": 1,
+ "more": 0,
+ "clipped": false,
+ "right": 0
+ }
+ },
+ {
+ "name": "composed responsive 1440: 49px, no overflow, nothing past the edge",
+ "status": "PASS",
+ "data": {
+ "height": 49,
+ "barOverflow": 0,
+ "areaOverflow": 0,
+ "open": 1,
+ "more": 0,
+ "clipped": false,
+ "right": 0
+ }
+ },
+ {
+ "name": "composed responsive 1180: 49px, no overflow, nothing past the edge",
+ "status": "PASS",
+ "data": {
+ "height": 49,
+ "barOverflow": 0,
+ "areaOverflow": 0,
+ "open": 1,
+ "more": 0,
+ "clipped": false,
+ "right": 0
+ }
+ },
+ {
+ "name": "composed responsive 1080: 49px, no overflow, nothing past the edge",
+ "status": "PASS",
+ "data": {
+ "height": 49,
+ "barOverflow": 0,
+ "areaOverflow": 0,
+ "open": 1,
+ "more": 0,
+ "clipped": false,
+ "right": 0
+ }
+ },
+ {
+ "name": "composed responsive 900: 49px, no overflow, nothing past the edge",
+ "status": "PASS",
+ "data": {
+ "height": 49,
+ "barOverflow": 0,
+ "areaOverflow": 0,
+ "open": 1,
+ "more": 0,
+ "clipped": false,
+ "right": 0
+ }
+ },
+ {
+ "name": "composed responsive 768: 49px, no overflow, nothing past the edge",
+ "status": "PASS",
+ "data": {
+ "height": 49,
+ "barOverflow": 0,
+ "areaOverflow": 0,
+ "open": 0,
+ "more": 1,
+ "clipped": false,
+ "right": 0
+ }
+ },
+ {
+ "name": "composed responsive 768: 파일 열기 reachable in More",
+ "status": "PASS"
+ },
+ {
+ "name": "composed responsive 640: 49px, no overflow, nothing past the edge",
+ "status": "PASS",
+ "data": {
+ "height": 49,
+ "barOverflow": 0,
+ "areaOverflow": 0,
+ "open": 0,
+ "more": 1,
+ "clipped": false,
+ "right": 0
+ }
+ },
+ {
+ "name": "composed responsive 640: 파일 열기 reachable in More",
+ "status": "PASS"
+ },
+ {
+ "name": "composed responsive 520: 49px, no overflow, nothing past the edge",
+ "status": "PASS",
+ "data": {
+ "height": 49,
+ "barOverflow": 0,
+ "areaOverflow": 0,
+ "open": 0,
+ "more": 1,
+ "clipped": false,
+ "right": 0
+ }
+ },
+ {
+ "name": "composed responsive 520: 파일 열기 reachable in More",
+ "status": "PASS"
+ },
+ {
+ "name": "composed responsive 390: 49px, no overflow, nothing past the edge",
+ "status": "PASS",
+ "data": {
+ "height": 49,
+ "barOverflow": 0,
+ "areaOverflow": 0,
+ "open": 0,
+ "more": 1,
+ "clipped": false,
+ "right": 0
+ }
+ },
+ {
+ "name": "composed responsive 390: 파일 열기 reachable in More",
+ "status": "PASS"
+ },
+ {
+ "name": "tool: Model / Layout is a radio group",
+ "status": "PASS"
+ },
+ {
+ "name": "tool: arrow key moves focus and selects Layout",
+ "status": "PASS"
+ },
+ {
+ "name": "tool: 2.5D toggle reports and shows pressed (#FFC600)",
+ "status": "PASS"
+ },
+ {
+ "name": "tool: text buttons are the 속성Bar toggle look (700, 19px row, 12px caption)",
+ "status": "PASS",
+ "data": {
+ "text": {
+ "weight": "700",
+ "h": 19
+ },
+ "ref": "12px"
+ }
+ },
+ {
+ "name": "tool: pill button is 40 x 38 with the yellow ring and hover icon",
+ "status": "PASS",
+ "data": {
+ "pillBox": {
+ "x": 1467.234375,
+ "y": 336,
+ "w": 40,
+ "h": 38,
+ "right": 1507.234375
+ },
+ "hover": {
+ "ring": "1",
+ "icon": "hidden",
+ "hoverIcon": "visible"
+ }
+ }
+ },
+ {
+ "name": "tool: pill click callback",
+ "status": "PASS"
+ },
+ {
+ "name": "tool: pill accessible name from its text",
+ "status": "PASS"
+ },
+ {
+ "name": "tool: document look keeps the logo junction in a composed bar",
+ "status": "PASS",
+ "data": {
+ "tHome": {
+ "x": 360,
+ "y": 491.5,
+ "w": 80,
+ "h": 48,
+ "right": 440
+ },
+ "tOpen": {
+ "x": 425,
+ "y": 491.5,
+ "w": 58.265625,
+ "h": 48,
+ "right": 483.265625
+ }
+ }
+ },
+ {
+ "name": "popup: SWPopup frames match the property window frame (314, surface, border, radius, title)",
+ "status": "PASS",
+ "data": [
+ {
+ "w": 314,
+ "bg": "rgb(228, 219, 201)",
+ "border": "rgb(166, 125, 3)",
+ "radius": "4px",
+ "shadow": "rgb(0, 0, 0) 0px 0px 0px 1px inset",
+ "title": "rgb(255, 198, 0)",
+ "weight": "700",
+ "titlebar": 30,
+ "role": "dialog",
+ "modal": "false"
+ },
+ {
+ "w": 314,
+ "bg": "rgb(228, 219, 201)",
+ "border": "rgb(166, 125, 3)",
+ "radius": "4px",
+ "shadow": "rgb(0, 0, 0) 0px 0px 0px 1px inset",
+ "title": "rgb(255, 198, 0)",
+ "weight": "700",
+ "titlebar": 30,
+ "role": "dialog",
+ "modal": "false"
+ },
+ {
+ "w": 314,
+ "bg": "rgb(228, 219, 201)",
+ "border": "rgb(166, 125, 3)",
+ "radius": "4px",
+ "shadow": "rgb(0, 0, 0) 0px 0px 0px 1px inset",
+ "title": "rgb(255, 198, 0)",
+ "weight": "700",
+ "titlebar": 30,
+ "role": "dialog",
+ "modal": "false"
+ }
+ ]
+ },
+ {
+ "name": "popup content: SWHeaderInput rows commit through the host callbacks",
+ "status": "PASS"
+ },
+ {
+ "name": "popup content: SWPopupRow is the property row (72px label, 32px row, 28px box)",
+ "status": "PASS",
+ "data": {
+ "label": "72px",
+ "minH": "32px",
+ "box": "28px"
+ }
+ },
+ {
+ "name": "popup content: HM UI Switch works inside",
+ "status": "PASS"
+ },
+ {
+ "name": "popup content: HM UI Select (portal) works inside",
+ "status": "PASS"
+ },
+ {
+ "name": "popup content: HM UI Slider works inside",
+ "status": "PASS",
+ "data": "Callback: name=평면도-02 → scale=50 → snap=false → unit=cm → opacity=70"
+ },
+ {
+ "name": "popup content: HM UI Button works inside",
+ "status": "PASS"
+ },
+ {
+ "name": "popup dropdown: SW layer dropdown opens right under its field (fixed overlay) and is not clipped",
+ "status": "PASS",
+ "data": {
+ "fieldBox": {
+ "x": 387,
+ "y": 548.5,
+ "w": 234,
+ "h": 38,
+ "right": 621
+ },
+ "menuBox": {
+ "x": 387,
+ "y": 586.5,
+ "w": 234,
+ "h": 160,
+ "right": 621
+ },
+ "hit": true
+ }
+ },
+ {
+ "name": "popup dropdown: selection callback, list closes, popup stays",
+ "status": "PASS"
+ },
+ {
+ "name": "popup dropdown: SW color dropdown becomes a fixed overlay",
+ "status": "PASS"
+ },
+ {
+ "name": "popup dropdown: color chip callback",
+ "status": "PASS"
+ },
+ {
+ "name": "popup dropdown: Escape closes the dropdown only",
+ "status": "PASS"
+ },
+ {
+ "name": "object popup: read-only rows",
+ "status": "PASS"
+ },
+ {
+ "name": "object popup: number row commits",
+ "status": "PASS"
+ },
+ {
+ "name": "object popup: compact row uses the 41px hug field",
+ "status": "PASS",
+ "data": {
+ "cls": "hm-sw-header__input hm-sw-property__compact",
+ "w": 26.53125
+ }
+ },
+ {
+ "name": "property panel + children: children follow the property groups in the same body",
+ "status": "PASS",
+ "data": [
+ "공통",
+ "메모"
+ ]
+ },
+ {
+ "name": "property panel + children: child content callback",
+ "status": "PASS"
+ },
+ {
+ "name": "popup: close button calls onClose",
+ "status": "PASS"
+ },
+ {
+ "name": "short popup: dropdown extends past the popup and stays fully visible (no clipping)",
+ "status": "PASS",
+ "data": {
+ "bBox": {
+ "x": 706,
+ "y": 264.5,
+ "w": 314,
+ "h": 110,
+ "right": 1020
+ },
+ "menuB": {
+ "x": 717,
+ "y": 363.5,
+ "w": 234,
+ "h": 160,
+ "right": 951
+ },
+ "bHit": true
+ }
+ },
+ {
+ "name": "several popups: Escape in a dropdown closes only the dropdown",
+ "status": "PASS"
+ },
+ {
+ "name": "several popups: Escape on an edited input cancels the edit only",
+ "status": "PASS"
+ },
+ {
+ "name": "several popups: Escape inside a popup closes that popup only",
+ "status": "PASS",
+ "data": "Callback: close(a)"
+ },
+ {
+ "name": "several popups: Escape outside closes only the top popup (last used: B)",
+ "status": "PASS",
+ "data": "Callback: close(a) → close(b)"
+ },
+ {
+ "name": "several popups: the popup used last becomes the top",
+ "status": "PASS",
+ "data": "Callback: close(a) → close(b) → close(a)"
+ },
+ {
+ "name": "long content: the body scrolls inside the frame and the last row is reachable",
+ "status": "PASS",
+ "data": {
+ "scroll": {
+ "sh": 1000,
+ "ch": 328,
+ "overflow": "auto"
+ },
+ "lastVisible": true
+ }
+ },
+ {
+ "name": "no browser console or page errors",
+ "status": "PASS",
+ "data": []
+ }
+ ],
+ "errors": [],
+ "data": {
+ "junction": -15,
+ "responsive": [
+ {
+ "width": 1920,
+ "height": 49,
+ "barOverflow": 0,
+ "areaOverflow": 1,
+ "headerRight": 2280,
+ "barRight": 2280,
+ "overlap": false,
+ "open": 58.265625,
+ "doc": 249.734375,
+ "layer": 234,
+ "more": false,
+ "inMore": null
+ },
+ {
+ "width": 1800,
+ "height": 49,
+ "barOverflow": 0,
+ "areaOverflow": 1,
+ "headerRight": 2160,
+ "barRight": 2160,
+ "overlap": false,
+ "open": 58.265625,
+ "doc": 190,
+ "layer": 234,
+ "more": false,
+ "inMore": null
+ },
+ {
+ "width": 1440,
+ "height": 49,
+ "barOverflow": 0,
+ "areaOverflow": 1,
+ "headerRight": 1800,
+ "barRight": 1800,
+ "overlap": false,
+ "open": 58.265625,
+ "doc": 310,
+ "layer": 234,
+ "more": true,
+ "inMore": null
+ },
+ {
+ "width": 1180,
+ "height": 49,
+ "barOverflow": 0,
+ "areaOverflow": 1,
+ "headerRight": 1540,
+ "barRight": 1540,
+ "overlap": false,
+ "open": 58.265625,
+ "doc": 120,
+ "layer": 234,
+ "more": true,
+ "inMore": null
+ },
+ {
+ "width": 1080,
+ "height": 49,
+ "barOverflow": 0,
+ "areaOverflow": 1,
+ "headerRight": 1440,
+ "barRight": 1440,
+ "overlap": false,
+ "open": 58.265625,
+ "doc": 120,
+ "layer": 234,
+ "more": true,
+ "inMore": null
+ },
+ {
+ "width": 900,
+ "height": 49,
+ "barOverflow": 0,
+ "areaOverflow": 0,
+ "headerRight": 1260,
+ "barRight": 1260,
+ "overlap": false,
+ "open": 58.265625,
+ "doc": 120,
+ "layer": 234,
+ "more": true,
+ "inMore": null
+ },
+ {
+ "width": 768,
+ "height": 49,
+ "barOverflow": 0,
+ "areaOverflow": 0,
+ "headerRight": 1128,
+ "barRight": 1128,
+ "overlap": false,
+ "open": 58.265625,
+ "doc": 178.734375,
+ "layer": 234,
+ "more": true,
+ "inMore": null
+ },
+ {
+ "width": 640,
+ "height": 49,
+ "barOverflow": 0,
+ "areaOverflow": 1,
+ "headerRight": 1000,
+ "barRight": 1000,
+ "overlap": false,
+ "open": 58.265625,
+ "doc": 96,
+ "layer": 234,
+ "more": true,
+ "inMore": null
+ },
+ {
+ "width": 520,
+ "height": 49,
+ "barOverflow": 0,
+ "areaOverflow": 0,
+ "headerRight": 880,
+ "barRight": 880,
+ "overlap": false,
+ "open": 0,
+ "doc": 103,
+ "layer": 234,
+ "more": true,
+ "inMore": true
+ },
+ {
+ "width": 390,
+ "height": 49,
+ "barOverflow": 0,
+ "areaOverflow": 0,
+ "headerRight": 750,
+ "barRight": 750,
+ "overlap": false,
+ "open": 0,
+ "doc": 96,
+ "layer": 113,
+ "more": true,
+ "inMore": true
+ }
+ ],
+ "hysteresis": [
+ [
+ 520,
+ 0
+ ],
+ [
+ 560,
+ 0
+ ],
+ [
+ 600,
+ 1
+ ],
+ [
+ 640,
+ 1
+ ],
+ [
+ 680,
+ 1
+ ],
+ [
+ 720,
+ 1
+ ],
+ [
+ 760,
+ 1
+ ],
+ [
+ 820,
+ 1
+ ],
+ [
+ 900,
+ 1
+ ],
+ [
+ 1080,
+ 1
+ ]
+ ],
+ "composedResponsive": [
+ {
+ "width": 1920,
+ "height": 49,
+ "barOverflow": 0,
+ "areaOverflow": 0,
+ "open": 1,
+ "more": 0,
+ "clipped": false,
+ "right": 0
+ },
+ {
+ "width": 1800,
+ "height": 49,
+ "barOverflow": 0,
+ "areaOverflow": 0,
+ "open": 1,
+ "more": 0,
+ "clipped": false,
+ "right": 0
+ },
+ {
+ "width": 1440,
+ "height": 49,
+ "barOverflow": 0,
+ "areaOverflow": 0,
+ "open": 1,
+ "more": 0,
+ "clipped": false,
+ "right": 0
+ },
+ {
+ "width": 1180,
+ "height": 49,
+ "barOverflow": 0,
+ "areaOverflow": 0,
+ "open": 1,
+ "more": 0,
+ "clipped": false,
+ "right": 0
+ },
+ {
+ "width": 1080,
+ "height": 49,
+ "barOverflow": 0,
+ "areaOverflow": 0,
+ "open": 1,
+ "more": 0,
+ "clipped": false,
+ "right": 0
+ },
+ {
+ "width": 900,
+ "height": 49,
+ "barOverflow": 0,
+ "areaOverflow": 0,
+ "open": 1,
+ "more": 0,
+ "clipped": false,
+ "right": 0
+ },
+ {
+ "width": 768,
+ "height": 49,
+ "barOverflow": 0,
+ "areaOverflow": 0,
+ "open": 0,
+ "more": 1,
+ "clipped": false,
+ "right": 0
+ },
+ {
+ "width": 640,
+ "height": 49,
+ "barOverflow": 0,
+ "areaOverflow": 0,
+ "open": 0,
+ "more": 1,
+ "clipped": false,
+ "right": 0
+ },
+ {
+ "width": 520,
+ "height": 49,
+ "barOverflow": 0,
+ "areaOverflow": 0,
+ "open": 0,
+ "more": 1,
+ "clipped": false,
+ "right": 0
+ },
+ {
+ "width": 390,
+ "height": 49,
+ "barOverflow": 0,
+ "areaOverflow": 0,
+ "open": 0,
+ "more": 1,
+ "clipped": false,
+ "right": 0
+ }
+ ],
+ "popupFrames": [
+ {
+ "w": 314,
+ "bg": "rgb(228, 219, 201)",
+ "border": "rgb(166, 125, 3)",
+ "radius": "4px",
+ "shadow": "rgb(0, 0, 0) 0px 0px 0px 1px inset",
+ "title": "rgb(255, 198, 0)",
+ "weight": "700",
+ "titlebar": 30,
+ "role": "dialog",
+ "modal": "false"
+ },
+ {
+ "w": 314,
+ "bg": "rgb(228, 219, 201)",
+ "border": "rgb(166, 125, 3)",
+ "radius": "4px",
+ "shadow": "rgb(0, 0, 0) 0px 0px 0px 1px inset",
+ "title": "rgb(255, 198, 0)",
+ "weight": "700",
+ "titlebar": 30,
+ "role": "dialog",
+ "modal": "false"
+ },
+ {
+ "w": 314,
+ "bg": "rgb(228, 219, 201)",
+ "border": "rgb(166, 125, 3)",
+ "radius": "4px",
+ "shadow": "rgb(0, 0, 0) 0px 0px 0px 1px inset",
+ "title": "rgb(255, 198, 0)",
+ "weight": "700",
+ "titlebar": 30,
+ "role": "dialog",
+ "modal": "false"
+ }
+ ]
+ },
+ "status": "PASS"
+}
diff --git a/docs/sw/integrated-improvement-qa/verify/open-placement-header.png b/docs/sw/integrated-improvement-qa/verify/open-placement-header.png
new file mode 100644
index 0000000..0b9564c
Binary files /dev/null and b/docs/sw/integrated-improvement-qa/verify/open-placement-header.png differ
diff --git a/docs/sw/integrated-improvement-qa/verify/open-placement-responsive.png b/docs/sw/integrated-improvement-qa/verify/open-placement-responsive.png
new file mode 100644
index 0000000..6cb2bb0
Binary files /dev/null and b/docs/sw/integrated-improvement-qa/verify/open-placement-responsive.png differ
diff --git a/docs/sw/integrated-improvement-qa/verify/popup-custom-content.png b/docs/sw/integrated-improvement-qa/verify/popup-custom-content.png
new file mode 100644
index 0000000..c1b0433
Binary files /dev/null and b/docs/sw/integrated-improvement-qa/verify/popup-custom-content.png differ
diff --git a/docs/sw/integrated-improvement-qa/verify/popup-custom-dropdown.png b/docs/sw/integrated-improvement-qa/verify/popup-custom-dropdown.png
new file mode 100644
index 0000000..757abe0
Binary files /dev/null and b/docs/sw/integrated-improvement-qa/verify/popup-custom-dropdown.png differ
diff --git a/docs/sw/integrated-improvement-qa/verify/popup-short-dropdown.png b/docs/sw/integrated-improvement-qa/verify/popup-short-dropdown.png
new file mode 100644
index 0000000..3ff45fc
Binary files /dev/null and b/docs/sw/integrated-improvement-qa/verify/popup-short-dropdown.png differ
diff --git a/docs/sw/integrated-improvement-qa/verify/popup-stack.png b/docs/sw/integrated-improvement-qa/verify/popup-stack.png
new file mode 100644
index 0000000..95d58ea
Binary files /dev/null and b/docs/sw/integrated-improvement-qa/verify/popup-stack.png differ
diff --git a/docs/sw/integrated-improvement-qa/verify/tool-composed.png b/docs/sw/integrated-improvement-qa/verify/tool-composed.png
new file mode 100644
index 0000000..4f7c6f8
Binary files /dev/null and b/docs/sw/integrated-improvement-qa/verify/tool-composed.png differ
diff --git a/docs/sw/integrated-improvement-qa/verify/tool-in-header.png b/docs/sw/integrated-improvement-qa/verify/tool-in-header.png
new file mode 100644
index 0000000..1303894
Binary files /dev/null and b/docs/sw/integrated-improvement-qa/verify/tool-in-header.png differ
diff --git a/docs/sw/integrated-improvement-qa/verify/tool-states.png b/docs/sw/integrated-improvement-qa/verify/tool-states.png
new file mode 100644
index 0000000..8e423b2
Binary files /dev/null and b/docs/sw/integrated-improvement-qa/verify/tool-states.png differ
diff --git a/docs/sw/integrated-improvement-qa/visual-diff/compare-result.json b/docs/sw/integrated-improvement-qa/visual-diff/compare-result.json
new file mode 100644
index 0000000..0bb1d0e
--- /dev/null
+++ b/docs/sw/integrated-improvement-qa/visual-diff/compare-result.json
@@ -0,0 +1,146 @@
+{
+ "total": 28,
+ "same": 28,
+ "results": [
+ {
+ "file": "composed-controls-1920.png",
+ "status": "SAME",
+ "changed": 0
+ },
+ {
+ "file": "detail-buttons-1920.png",
+ "status": "SAME",
+ "changed": 0
+ },
+ {
+ "file": "document-dropdown-1920.png",
+ "status": "SAME",
+ "changed": 0
+ },
+ {
+ "file": "interactive-states-1920.png",
+ "status": "SAME",
+ "changed": 0
+ },
+ {
+ "file": "k-guide-1920.png",
+ "status": "SAME",
+ "changed": 0
+ },
+ {
+ "file": "logo-slot-1920.png",
+ "status": "SAME",
+ "changed": 0
+ },
+ {
+ "file": "overview-1080.png",
+ "status": "SAME",
+ "changed": 0
+ },
+ {
+ "file": "overview-1180.png",
+ "status": "SAME",
+ "changed": 0
+ },
+ {
+ "file": "overview-1440.png",
+ "status": "SAME",
+ "changed": 0
+ },
+ {
+ "file": "overview-1800.png",
+ "status": "SAME",
+ "changed": 0
+ },
+ {
+ "file": "overview-1920.png",
+ "status": "SAME",
+ "changed": 0
+ },
+ {
+ "file": "overview-390.png",
+ "status": "SAME",
+ "changed": 0
+ },
+ {
+ "file": "overview-520.png",
+ "status": "SAME",
+ "changed": 0
+ },
+ {
+ "file": "overview-640.png",
+ "status": "SAME",
+ "changed": 0
+ },
+ {
+ "file": "overview-768.png",
+ "status": "SAME",
+ "changed": 0
+ },
+ {
+ "file": "overview-900.png",
+ "status": "SAME",
+ "changed": 0
+ },
+ {
+ "file": "property-panel-compare-1920.png",
+ "status": "SAME",
+ "changed": 0
+ },
+ {
+ "file": "responsive-more-1080.png",
+ "status": "SAME",
+ "changed": 0
+ },
+ {
+ "file": "responsive-more-1180.png",
+ "status": "SAME",
+ "changed": 0
+ },
+ {
+ "file": "responsive-more-1440.png",
+ "status": "SAME",
+ "changed": 0
+ },
+ {
+ "file": "responsive-more-1800.png",
+ "status": "SAME",
+ "changed": 0
+ },
+ {
+ "file": "responsive-more-1920.png",
+ "status": "SAME",
+ "changed": 0
+ },
+ {
+ "file": "responsive-more-390.png",
+ "status": "SAME",
+ "changed": 0
+ },
+ {
+ "file": "responsive-more-520.png",
+ "status": "SAME",
+ "changed": 0
+ },
+ {
+ "file": "responsive-more-640.png",
+ "status": "SAME",
+ "changed": 0
+ },
+ {
+ "file": "responsive-more-768.png",
+ "status": "SAME",
+ "changed": 0
+ },
+ {
+ "file": "responsive-more-900.png",
+ "status": "SAME",
+ "changed": 0
+ },
+ {
+ "file": "window-move-motion-1920.png",
+ "status": "SAME",
+ "changed": 0
+ }
+ ]
+}
\ No newline at end of file
diff --git a/docs/sw/sw-header-usage.md b/docs/sw/sw-header-usage.md
index bed79df..56f9f48 100644
--- a/docs/sw/sw-header-usage.md
+++ b/docs/sw/sw-header-usage.md
@@ -1,5 +1,7 @@
# SW Header 사용 가이드
+> **0.2.0 통합 개선(2026-10-19):** 로고 오른쪽 파일 열기(`documentOpenPlacement="header"`, `documentOpenLabel` 재사용, 실측 기반 More 이동), `leading` 슬롯, 하위 항목 숨김(`hiddenControls`의 `documentNew`·`documentOpen`·`layerFreeze`·`layerLock`), 도구 막대 `SWToolButton` / `SWToolGroup`, 속성창 프레임 `SWPopup`(자유 `children`)과 `SWHeaderPropertyPanel`의 `children`·`title`을 추가했습니다. API·예제는 패키지 [AI 카탈로그](../../packages/sw/ai/COMPONENT_CATALOG.md)와 [조합 패턴](../../packages/sw/ai/COMPOSITION_PATTERNS.md), Story는 `SW / Header / Options`·`SW / Tool`·`SW / Popup`, 검증은 [통합 개선 기록](./sw-integrated-improvement-2026-10-19.md)을 따릅니다.
+
> **현재 기준 색인(2026-10-19 1차 정리):** 아래 날짜별 안내 중 최신 항목이 같은 주제의 이전 설명보다 우선합니다. 속성 필드 13개·필드 Dropdown(`picker`·`menus`·`decimals`)은 [속성창·K 가이드 추가 연결](#속성창k-가이드-추가-연결-2026-10-16)의 2026-10-19 항목, 표시·숨김(`hiddenControls`)·메뉴 순서(`menuOrder`)·속성창 4상태·형상 Slot은 [3차 절](#구성요소-표시메뉴-순서속성창-4상태형상-slot-2026-10-16-3차), 속성Bar·`controls`·Colorize는 [후속 절](#후속-5개-요구사항-연결-2026-10-16)을 봅니다. 현재 Storybook 33개 목록은 [§12](#12-storybook)와 [1차 정리 보고](./sw-first-pass-cleanup-review-2026-10-19.md)에 있습니다.
> **상세 버튼 최신 기준(2026-10-16):** 레이어·색상·선·문자·치수 상세는 문자스타일 디자인의 `SWHeaderMenuDetail`을 공통 사용합니다. `on*Detail` 미전달 시 Hover 유지·클릭 무동작이며, Callback 전달 시 기존 1회 호출·닫힘·Focus 복귀를 유지합니다. 내부 공통 컴포넌트는 `label`, `icon`, `onClick`, `disabled`, `className`, `aria-label` 등 native 버튼 Props를 지원합니다. 새 공개 export는 추가하지 않았습니다. 비교 Story는 `SW/Header → Detail Buttons (Shared States)`(verification 태그, 직접 ID `sw-header--detail-buttons`)입니다. 과거의 Callback 미전달=Disabled 및 치수만 밝은 Hover 설명보다 이 기준이 우선합니다. [이번 검증 기록](./sw-header-detail-buttons-verification-2026-10-16.md).
diff --git a/docs/sw/sw-integrated-improvement-2026-10-19.md b/docs/sw/sw-integrated-improvement-2026-10-19.md
new file mode 100644
index 0000000..e773387
--- /dev/null
+++ b/docs/sw/sw-integrated-improvement-2026-10-19.md
@@ -0,0 +1,78 @@
+# SW 패키지 통합 개선 구현·검증 기록 (2026-10-19)
+
+- 대상: `@hm-design/sw` 0.1.0 → **0.2.0**, 브랜치 `feature/sw-package`, 기준 Commit `5faa1f1`(작업 시작 시 로컬 = 원격).
+- 범위: 승인된 통합 계획 1~8단계(빌드 재현성, 숨김 API, 도구 버튼, 로고 옆 파일 열기·실측 반응형, `SWPopup` 자유 콘텐츠·Escape 스택, Popup 안 Dropdown, 조합형 반응형, 문서·Storybook·소비 검증).
+- Commit·Push·Publish 없음. 증거: [integrated-improvement-qa/](./integrated-improvement-qa/).
+
+## 1. 단계별 결과
+
+| 단계 | 내용 | 판정 |
+|---|---|---|
+| 1 빌드 재현성 | 원인: 체크아웃 줄바꿈. 작업 폴더의 `ai/`·README 등 16개 파일이 CRLF였고(`core.autocrlf=true`), CSS에 base64로 들어가는 SVG도 CRLF 체크아웃이면 바이트가 달라짐. `//#region` 경로는 경로가 달라도 동일(원인 아님). 조치: `build.mjs`가 dist 텍스트를 LF로 정규화하고 `dist/build-info.json`(commit, dirty, vite·rolldown·typescript 버전, 시각 없음) 기록, `packages/sw/.gitattributes`(`eol=lf`), 작업 폴더 16개 파일 LF 변환(내용 diff 없음), 0.2.0 | PASS |
+| 2 숨김 API | `hiddenControls`에 `documentNew`·`documentOpen`·`layerFreeze`·`layerLock`(`SWHeaderSubControlId`). 하위 Props `showNew`/`showOpen`, `showFreeze`/`showLock`, 속성창 `menus.showLayerFreeze`/`showLayerLock`. 동결·잠금은 20px 자리 유지 + 그리지 않음(가짜 버튼 없음). 하위 항목 숨김은 레이아웃 모드·Breakpoint를 바꾸지 않음 | PASS |
+| 3 도구 버튼 | `SWToolButton`(`text` = 속성Bar/속성창 토글, `pill` = 인쇄·K, `document` = 파일명 면), `SWToolGroup`(`text` 상세보기 묶음 / `pill`, `selection="single"` radiogroup). 새 디자인 값 없음 | PASS |
+| 4 파일 열기 | `documentOpenPlacement="header"`: Home 바로 뒤에 `hm-sw-header__document-button` 면으로 Open, Dropdown Open 숨김, `onDocumentOpen`·`documentOpenLabel` 재사용. `leading` 슬롯. 측정 폭을 `--hm-sw-header-leading-width`로 파일명 clamp에서 빼고, Open이 보이는 동안 다른 필드는 줄지 않게 해 실제 넘침이 생기면 Open을 More로 이동(되돌릴 때 Open 폭 히스테리시스). D-1 12px 여백 | PASS |
+| 5 SWPopup | 속성창 프레임을 `SWPopupFrame`(내부)으로 분리해 `SWPopup`과 `SWHeaderPropertyPanel`이 같은 DOM 사용. `children`·`title`·`autoFocus`, `selection`/`properties`/`groups` 선택형. Escape 스택(안 = 그 Popup, 밖 = 최근 사용 Popup 하나, `defaultPrevented` 존중), autoFocus 시 안에서 닫히면 Focus 복귀 | PASS |
+| 6 Popup 안 Dropdown | 실측: 짧은 Popup에서 레이어 목록이 본문 경계에서 잘림 확인 → 속성창 Picker의 고정 위치 계산을 `useSWFixedDropdownPosition`으로 추출해 Picker와 공개 Dropdown 5종이 공유(중복 구현 없음). `SWPopupSection` / `SWPopupRow` 추가 | PASS |
+| 7 조합형 반응형 | 새 More 로직 없음. `SWHeader`의 `controls`·`documentOpenPlacement`·`leading`·`tools`로 조합형 구성이 기존 More·실측 판단을 그대로 사용. `SWTheme` 직접 배치에는 More 없음(문서화) | PARTIAL(도구 막대 자체는 More로 이동하지 않음, §6) |
+| 8 문서·Storybook·소비 검증 | AI 가이드 4종·예제 E/F·README·사용 가이드, Story 3개 파일(7 Story), 독립 소비 프로젝트(SW + HM UI) | PASS |
+
+## 2. 추가·변경 공개 API (모두 선택, 기본 동작 동일)
+
+| 대상 | 추가 |
+|---|---|
+| `SWHeader` | `documentOpenPlacement?: "menu" \| "header"`, `leading?: ReactNode`, `hiddenControls`의 `SWHeaderSubControlId` 4개 |
+| `SWHeaderDocumentTitle` | `showNew`, `showOpen`(둘 다 false → 하단 없음, 문서도 없으면 Dropdown 없음) |
+| `SWHeaderLayerMenu` · `SWHeaderLayerControl` | `showFreeze`, `showLock` |
+| `SWHeaderPropertyPanel` | `children`, `title`, `autoFocus`, `selection`·`properties`·`groups` 선택형, `menus.showLayerFreeze`/`showLayerLock` |
+| 신규 | `SWPopup`, `SWPopupSection`, `SWPopupRow`, `SWToolButton`, `SWToolGroup` 및 `*Props`, `SWToolButtonAppearance`, `SWHeaderSubControlId` |
+| 내부(비공개) | `SWPopupFrame`, `useSWFixedDropdownPosition`, `SWHeaderMore.forceVisible` |
+
+호환성: 기존 Props·Export 제거·이름 변경 없음. 동작 변경은 Escape 하나(여러 Popup이 동시에 열린 경우 바깥 Escape가 모두가 아니라 최근 사용 Popup 하나만 닫음, Popup 안에서 이미 처리된 Escape 무시). Header 단일 속성창의 Escape 닫기·Focus 복귀는 기존 overview 회귀로 확인.
+
+## 3. 기존 디자인 유지
+
+- 기존 SW Story 10개 × 1920 + Overview·Responsive More × 9개 폭 = 28장, 변경 전 기준선과 **픽셀 단위 28/28 동일**(threshold 0, 기준선 자체 2회 캡처 28/28 동일). [compare-result](./integrated-improvement-qa/visual-diff/compare-result.json)
+- 소비 프로젝트에서 SW·HM UI CSS 순서를 바꿔도(SW 먼저 / UI 먼저) 대표 SW·UI 요소 15종 computed style 동일. Tailwind 4 preflight는 `@layer base`, SW CSS는 layer 밖이라 충돌 없음.
+
+## 4. 반응형 (Chrome, 실측)
+
+| 폭 | 1920 | 1800 | 1440 | 1180 | 1080 | 900 | 768 | 640 | 520 | 390 |
+|---|---|---|---|---|---|---|---|---|---|---|
+| 기본 Header + Open: Open | 표시 | 표시 | 표시 | 표시 | 표시 | 표시 | 표시 | 표시 | More | More |
+| 파일명 폭(px) | 250 | 190 | 310 | 120 | 120 | 120 | 179 | 96 | 103 | 96 |
+| 레이어 필드(px) | 234 | 234 | 234 | 234 | 234 | 234 | 234 | 234 | 234 | 113 |
+| 조합형(controls) Open | 표시 | 표시 | 표시 | 표시 | 표시 | 표시 | More | More | More | More |
+
+- 모든 폭: Header 49px, 막대·객체 영역 넘침 ≤ 1px, 부품 겹침 없음, 오른쪽 끝 밖으로 나가는 부품 없음, More의 Open 실행 확인.
+- 히스테리시스: 520 → 1080 확대 시 600px에서 한 번만 복귀(깜빡임 없음). D-2는 고정 640px 대신 실측으로 결정(기본 520 미만·조합형 768 이하에서 이동).
+- 사선 접점: Open은 기존 파일명과 같은 위치(로고 오른쪽 − 15px, 48px)에서 시작, 파일명은 Open 뒤에서 12px 여백. 조합형(`SWHeaderHome` → `SWToolButton document` → `SWHeaderDocumentTitle`)도 같은 값.
+
+## 5. Popup 자유 콘텐츠·Dropdown
+
+- `SWPopup` 3종 프레임 = 속성창 프레임(314, `#E4DBC9`, `#A67D03`, 4px, 제목 `#FFC600`, 제목줄 30, dialog / aria-modal=false) 동일.
+- children: SW `SWHeaderInput` 행(확정·잘못된 값 복원), compact 41px 필드, 읽기 전용 행, SW 레이어·색상 Dropdown, HM UI Switch·Select(Portal)·Slider·Button 모두 동작. 기존 `SWHeaderPropertyPanel`에 children 추가 시 그룹 뒤 같은 본문에 배치.
+- Dropdown: Popup 안에서 `position: fixed`로 필드 바로 아래 열림, Popup 밖으로 나가도 끝까지 보임(elementFromPoint), Escape는 Dropdown만 닫음.
+- 여러 Popup: 편집 중 Input Escape = 편집 취소만, Popup 안 Escape = 그 Popup만, 바깥 Escape = 최근 사용(Focus·클릭) Popup 하나. 긴 콘텐츠는 본문 스크롤로 마지막 행 도달.
+
+## 6. 남은 문제·미검증
+
+- **[미해결] 좁은 화면에서 문서명·레이어 필드가 사라짐:** `tools`·`leading`의 소비 콘텐츠(`SWToolGroup` 포함)는 More로 이동하지 않고 폭을 유지합니다. 그래서 넓은 도구 막대가 있으면 `controls` 필드가 대신 줄어듭니다. 예제 F(도구 237px) 실측: 1080px에서 Open은 More로 이동, 640px 문서명 64 · 레이어 93px, 520px 33 · 48px, **390px 문서명·레이어 필드 폭 0(사실상 사라짐)**. 막대 넘침은 없지만 필드를 쓸 수 없습니다. 도구 막대 항목을 More로 옮기는 기능이 필요하며 이번 범위에서는 해결하지 않았습니다(해결 계획: 커밋 보고 §남은 문제 1).
+- **Popup 안 Header Dropdown 외형:** 동작은 정상이지만 어두운 Header 필드가 밝은 Popup 면 위에 그대로 그려집니다(디자인 미정). 행 모양 선택이 필요하면 속성창 `picker`.
+- **디자인 미확정 보류:** `SWToolStatus`, Popup 하단 버튼(적용·취소) 전용 스타일.
+- `index.ts`의 `SWHeaderSubControlId` export 한 줄은 다른 세션(Figma 병렬 작업)이 같은 폴더에 같은 내용으로 추가한 것으로 보이며, 이 계획과 같아 유지했습니다.
+- NOT VERIFIED: Firefox·Safari, 실제 모바일 기기, 스크린 리더 음성, 실제 Registry publish, Popup `anchorRef` 경로의 새 Story(기존 Header 속성창 경로는 overview 회귀로 확인).
+
+## 7. 실행한 검증
+
+| 검증 | 결과 |
+|---|---|
+| `tsc -b`(루트) / `npm run typecheck -w @hm-design/sw` | exit 0 / exit 0 |
+| [integrated-improvement.browser.mjs](../../packages/sw/tests/integrated-improvement.browser.mjs) (옵션·조합형·도구·Popup) | 97/97 PASS, 콘솔 오류 0 |
+| [integrated-consumer.mjs](../../packages/sw/tests/integrated-consumer.mjs) + browser (React 19.3 · TS 7.0 · Vite 8.3 · Tailwind 4.3, SW + UI Tarball, CSS 2순서) | tsc·build 성공, 42/42 PASS |
+| 기존 A~D 소비([ai-template-consumer](../../packages/sw/tests/ai-template-consumer.mjs)) | 27/27 PASS |
+| [ai-docs.check.mjs](../../packages/sw/tests/ai-docs.check.mjs) | 21/21 PASS(예제 E·F 포함) |
+| [integrated-visual.browser.mjs](../../packages/sw/tests/integrated-visual.browser.mjs) | 28/28 픽셀 동일 |
+| [build-reproducibility.mjs](../../packages/sw/tests/build-reproducibility.mjs) | PASS: LF 2경로 × 2회 dist·Tarball 동일(`e98cc5ed…`), CRLF 복사본 dist 동일, 비-LF 파일 0 |
+| storybook-unused-removal / overview(기존 회귀) | 처음 실행 78/81 · 51/54: 6건 중 4건은 이 작업이 의도적으로 바꾼 범위 단언(Story 수 329 → 336, SW 소스·AI 문서), 2건은 변경 전 기준선에서도 실패하던 overview 과거 단언. 4건은 검사 의미를 유지해 범위를 갱신(SW/Header 10개·다른 항목 동일, 추가는 승인된 7개 Story만, 다른 패키지·설정·자산 무변경, SW 변경은 통합 개선 파일 목록 안에서만) → **81/81 · 52/54**. 남은 2건은 기준선과 동일 |
+| font-weight 정책 테스트 | 3/3 PASS |
diff --git a/package-lock.json b/package-lock.json
index 1bf6fc3..e615788 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -10725,7 +10725,7 @@
},
"packages/sw": {
"name": "@hm-design/sw",
- "version": "0.1.0",
+ "version": "0.2.0",
"peerDependencies": {
"react": "^19.0.0",
"react-dom": "^19.0.0"
diff --git a/packages/sw/.gitattributes b/packages/sw/.gitattributes
new file mode 100644
index 0000000..604c258
--- /dev/null
+++ b/packages/sw/.gitattributes
@@ -0,0 +1,4 @@
+# Package files are LF on every checkout so dist, ai/ and the tarball are byte-identical (core.autocrlf=true included).
+* text=auto eol=lf
+*.png binary
+*.svg text eol=lf
diff --git a/packages/sw/README.md b/packages/sw/README.md
index 957a9bf..bf32d93 100644
--- a/packages/sw/README.md
+++ b/packages/sw/README.md
@@ -1,5 +1,7 @@
# @hm-design/sw
+> **0.2.0 통합 개선(2026-10-19):** 패키지에 포함된 AI 안내 [ai/AI_USAGE.md](./ai/AI_USAGE.md)·[카탈로그](./ai/COMPONENT_CATALOG.md)가 공개 API의 기준입니다. 추가: `SWPopup` / `SWPopupSection` / `SWPopupRow`(속성창 외형 + `children` 자유 콘텐츠, 여러 Popup Escape 스택, Popup 안 Dropdown 고정 Overlay), `SWHeaderPropertyPanel`의 `children`·`title`·`autoFocus`와 선택형 `selection`/`properties`/`groups`, `SWToolButton` / `SWToolGroup`(기존 글자 토글·pill·파일명 면 재사용), `SWHeader`의 `documentOpenPlacement`(로고 오른쪽 Open, 실측 기반 More 이동)·`leading`, `hiddenControls`의 `documentNew`·`documentOpen`·`layerFreeze`·`layerLock`, `showNew`/`showOpen`/`showFreeze`/`showLock`. 모두 선택 Props이며 기존 화면은 그대로입니다. 빌드는 줄바꿈 정규화로 재현 가능하고 `dist/build-info.json`에 출처 Commit·도구 버전을 남깁니다. 검증 기록: 저장소 `docs/sw/sw-integrated-improvement-2026-10-19.md`.
+
> **현재 기준 색인(2026-10-19 1차 정리):** 아래 날짜별 안내는 작성 당시 기록입니다. 현재 기준은 [사용 가이드](../../docs/sw/sw-header-usage.md), [디자인 명세](../../docs/sw/sw-header-design-spec.md) 상단 색인, 속성 필드 13개 [검증 기록](../../docs/sw/sw-property-fields-verification-2026-10-19.md), 게이지·속성Bar [후속 4건 기록](../../docs/sw/sw-header-followup-four-design-fixes-verification-2026-10-19.md)·[Firefox 게이지 기록](../../docs/sw/sw-header-firefox-range-close-verification-2026-10-19.md)입니다. Storybook은 `SW / Header` 33개 Story이며 전체 목록과 2차 검토 대상은 [1차 정리 보고](../../docs/sw/sw-first-pass-cleanup-review-2026-10-19.md)에 있습니다.
> **3차 구현(2026-10-16):** `hiddenControls`(로고 외 모든 구성요소 개별 제거, 로고 필수), `menuOrder`(레이어·색상·선/문자/치수스타일 순서), 속성창 `shapeContent` Slot, 속성창 4상태 개별·비교 Story를 추가했습니다. 미지정 시 기존 디자인과 같습니다. [사용법](../../docs/sw/sw-header-usage.md#구성요소-표시메뉴-순서속성창-4상태형상-slot-2026-10-16-3차), [3차 검증 기록](../../docs/sw/sw-header-composition-shape-verification-2026-10-16.md).
diff --git a/packages/sw/ai/AI_USAGE.md b/packages/sw/ai/AI_USAGE.md
index ee9d57e..ab53b6f 100644
--- a/packages/sw/ai/AI_USAGE.md
+++ b/packages/sw/ai/AI_USAGE.md
@@ -4,15 +4,16 @@
| 문서 | 내용 |
|---|---|
-| [COMPONENT_CATALOG.md](./COMPONENT_CATALOG.md) | 공식 공개 컴포넌트·Props·Callback·크기·CSS 의존성 |
-| [DESIGN_RULES.md](./DESIGN_RULES.md) | SW 전용 토큰·Typography·간격·Hover/Focus/Selected·Overlay·Motion·반응형 |
-| [COMPOSITION_PATTERNS.md](./COMPOSITION_PATTERNS.md) | 완성형·간소화·기능 중심·확장 Header 조합 방법 |
-| [examples/](./examples) | 공개 API만 쓰는 예제 A~D(독립 소비 프로젝트에서 Typecheck·Build·브라우저 검증) |
+| [COMPONENT_CATALOG.md](./COMPONENT_CATALOG.md) | 공식 공개 컴포넌트(Header·개별 컨트롤·Popup·도구 막대)·Props·Callback·크기·CSS 의존성 |
+| [DESIGN_RULES.md](./DESIGN_RULES.md) | SW 전용 토큰·Typography·간격·Hover/Focus/Selected·Overlay·Motion·반응형·Popup 외형·도구 버튼 |
+| [COMPOSITION_PATTERNS.md](./COMPOSITION_PATTERNS.md) | 완성형·간소화·기능 중심·확장 Header, Popup(자유 콘텐츠), 파일 열기 + 도구 막대 |
+| [examples/](./examples) | 공개 API만 쓰는 예제 A~F(E = 사용자 정의 Popup, F = 파일 열기 + 도구 막대. 독립 소비 프로젝트에서 Typecheck·Build·브라우저 검증) |
## 1. 작업 순서 (필수)
1. **먼저 검색한다.** 요청 기능을 [COMPONENT_CATALOG.md](./COMPONENT_CATALOG.md)의 공개 컴포넌트에서 찾는다.
-2. **있으면 재사용한다(1순위).** 완성형 Header가 필요하면 `SWHeader` 하나만 쓴다. 기존 Props(`hiddenControls`, `menuOrder`, `controls`, 각 데이터 배열·Callback)로 해결되는지 먼저 본다.
+2. **있으면 재사용한다(1순위).** 완성형 Header가 필요하면 `SWHeader` 하나만 쓴다. 기존 Props(`hiddenControls`, `menuOrder`, `controls`, `documentOpenPlacement`, `leading`, `tools`, 각 데이터 배열·Callback)로 해결되는지 먼저 본다. 팝업·설정창은 `SWPopup`, 버튼·탭·토글은 `SWToolButton` / `SWToolGroup`이다.
+ - Popup 요청은 이렇게 판단한다: ① `SWPopup`이 프레임(외형·닫기·Escape·스크롤)을 제공한다 → ② 내용은 `children`으로 자유 구성(구조 제한 없음) → ③ 행 모양은 `SWPopupSection` / `SWPopupRow` + `SWHeaderInput` → ④ SW에 없는 컨트롤은 `@hm-design/ui`를 children에 → ⑤ 프레임을 다시 만들거나 없는 Props(`content`, `renderContent` 등)를 추측하지 않는다.
3. **없으면 조합한다(2순위).** 개별 공개 컴포넌트(`SWHeaderHome`, `SWHeaderDocumentTitle`, `SWHeaderLayerMenu` …)를 `` 안에 배치한다. 배치용 CSS만 소비 프로젝트에 작성한다([COMPOSITION_PATTERNS.md](./COMPOSITION_PATTERNS.md)).
4. **조합으로도 안 될 때만 새로 만든다(3순위).** 새 컴포넌트는 **소비 프로젝트**에 작성하고, 공개 컴포넌트(예: `SWHeaderInput`)를 내부에 재사용하며, 외형은 공개 토큰 `--hm-sw-header-*`만 읽는다([DESIGN_RULES.md](./DESIGN_RULES.md), 예제 D).
5. **새 디자인 값을 만들지 않는다.** 크기·색·간격은 토큰과 DESIGN_RULES의 확인값만 쓴다. 값이 없으면 추측하지 말고 사용자에게 확인한다.
diff --git a/packages/sw/ai/COMPONENT_CATALOG.md b/packages/sw/ai/COMPONENT_CATALOG.md
index 999b020..d9000b2 100644
--- a/packages/sw/ai/COMPONENT_CATALOG.md
+++ b/packages/sw/ai/COMPONENT_CATALOG.md
@@ -1,12 +1,13 @@
# @hm-design/sw 컴포넌트 카탈로그
-기준: `@hm-design/sw` 0.1.0, `dist/index.d.ts` 공개 Export(2026-10-19). 모든 Import는 `from "@hm-design/sw"`이며 CSS는 `@hm-design/sw/styles.css` 한 개입니다. 이 표에 없는 이름은 공개 API가 아닙니다.
+기준: `@hm-design/sw` 0.2.0, `dist/index.d.ts` 공개 Export(2026-10-19 통합 개선 반영). 출처 Commit·빌드 도구 버전은 `dist/build-info.json`에 있습니다. 모든 Import는 `from "@hm-design/sw"`이며 CSS는 `@hm-design/sw/styles.css` 한 개입니다. 이 표에 없는 이름은 공개 API가 아닙니다.
- **단독 사용:** `SWHeader` 밖에서는 `` 안에 둡니다(토큰·글꼴·버튼 초기화).
- **상태 소유:** 값은 Props, 사용자 행동은 Callback입니다. 컴포넌트는 CAD 데이터를 바꾸지 않습니다. 호스트가 Callback을 받아 Props를 갱신합니다.
- **열림 상태:** Dropdown은 `open` / `onOpenChange`(Controlled)를 주지 않으면 내부 상태로 동작합니다.
- **공통 키보드:** Click·Enter·Space 열기/닫기(Hover로는 열리지 않음), ArrowDown 열고 첫(현재) 항목 Focus, Arrow 이동, Escape·바깥 클릭·Tab 이탈 닫기(Escape는 Trigger로 Focus 복귀).
-- **검증 표시:** ✅ = 2026-10-19 독립 소비 프로젝트(Tarball 설치)에서 브라우저 검증, ◻ = 이번 소비 검증 범위 밖(기존 Storybook 검증 기록만 있음).
+- **검증 표시:** ✅ = 2026-10-19 독립 소비 프로젝트(Tarball 설치)에서 브라우저 검증, ◻ = 소비 검증 범위 밖(Storybook 검증 기록만 있음).
+- **무엇을 쓸까:** Header 전체 → `SWHeader`(1). Header 부품 조합 → 개별 컨트롤(2). 팝업·설정창·정보창 → `SWPopup`(3). 도구 막대·탭·토글 → `SWToolButton` / `SWToolGroup`(4). Slider·Switch·Badge·Progress·Dialog(모달)·Label·FilterBar는 SW에 없습니다 → `@hm-design/ui`를 그대로 씁니다(필요하면 `SWPopup` children 안에).
## 1. 완성형 템플릿
@@ -16,7 +17,8 @@ SW 공식 기준 Header(Figma 26:8944, 1920 × 49). 로고 · 파일 · 객체
| 구분 | Props / Callback |
|---|---|
| 필수 | `documentTitle: string` |
-| 구성 | `hiddenControls?: SWHeaderHideableControlId[]`(로고 외 부품 제거, `home` 제거 시 정적 로고), `menuOrder?: SWHeaderMenuId[]`(5개 메뉴끼리 순서), `controls?: SWHeaderControlConfig[]`(객체 영역 전체 allowlist·순서·label) |
+| 구성 | `hiddenControls?: SWHeaderHideableControlId[]`(로고 외 부품 제거, `home` 제거 시 정적 로고. 하위 항목 `documentNew`·`documentOpen`·`layerFreeze`·`layerLock`도 제거 — 레이아웃 변화 없음), `menuOrder?: SWHeaderMenuId[]`(5개 메뉴끼리 순서), `controls?: SWHeaderControlConfig[]`(객체 영역 전체 allowlist·순서·label) |
+| 로고 오른쪽 | `documentOpenPlacement?: "menu" \| "header"`(기본 `menu` = 기존 Dropdown 하단. `header` = 로고 바로 오른쪽에 파일명과 같은 면의 Open 버튼, Dropdown의 Open은 숨김. 둘 다 `onDocumentOpen`·`documentOpenLabel`), `leading?: ReactNode`(Open 뒤·파일명 앞 추가 부품, 예: `SWToolButton appearance="document"`) |
| 로고 | `logo?: ReactNode`, `logoSrc?: string`, `logoAlt?: string`, `onHomeClick` |
| 파일 | `documents`, `activeDocumentId`, `documentMenuOpen`, `onDocumentMenuOpenChange`, `onDocumentSelect`, `onDocumentClose`, `onDocumentNew`, `onDocumentOpen`, `onDocumentClick`, `documentIcon`, `documentNewLabel`, `documentOpenLabel` |
| 레이어 | `layer`, `layers`, `activeLayerId`, `layerMenuOpen`, `onLayerMenuOpenChange`, `onLayerSelect`, `onLayerVisibilityChange`, `onLayerFreezeChange`, `onLayerLockChange`, `onLayerDetail`, `onLayerOpen` |
@@ -28,7 +30,8 @@ SW 공식 기준 Header(Figma 26:8944, 1920 × 49). 로고 · 파일 · 객체
| 기타 | `activeMenu`, `disabled`(창 버튼 제외), `drawingModeLabel`, `tools?: ReactNode`(객체 영역 메뉴 뒤), `` HTML 속성·`ref` |
- 데이터 배열(`layers`, `colors`, `lineTypes`/`lineWeights`, `textStyles`, `dimensionStyles`, `documents`)을 주지 않으면 해당 필드는 Dropdown 없는 버튼입니다.
-- 반응형(More·대표 필드 전환·창 영역 축소)은 **`SWHeader` 안에서만** 동작합니다(CSS container `hm-sw-header`).
+- 반응형(More·대표 필드 전환·창 영역 축소)은 **`SWHeader` 안에서만** 동작합니다(CSS container `hm-sw-header`). 조합형 구성이 반응형이어야 하면 `controls` + `documentOpenPlacement` + `leading` + `tools`로 `SWHeader` 안에서 구성합니다(예제 F).
+- 로고 옆 Open은 실제 공간을 측정해 넘칠 때만 More로 이동하고, 그 시점보다 Open 폭만큼 넓어지면 돌아옵니다. Open이 보이는 동안 파일명이 먼저 줄고 레이어 필드는 Figma 폭을 유지합니다.
```tsx
setId(l.id)} onClose={closeWindow} />
@@ -40,36 +43,64 @@ SW 공식 기준 Header(Figma 26:8944, 1920 × 49). 로고 · 파일 · 객체
|---|---|---|---|---|---|
| `SWTheme` | 단독 사용 범위(토큰·글꼴·초기화). 배치는 정하지 않음 | `div` HTML 속성, `className`, `style`(토큰 override) | — | — | ✅ |
| `SWHeaderHome` | 로고 슬롯 + 홈 버튼 | `logo`, `logoSrc`, `logoAlt`, `onClick`, `interactive`(false = 정적 로고) | 80 × 48, 로고 슬롯 32 × 17, 오른쪽 −17px로 다음 파일 면과 겹침 | Hover 배경 교체, Focus | ✅ |
-| `SWHeaderDocumentTitle` | 파일명 + 문서 Dropdown(+ New / Open) | `title`(필수), `documents`, `activeDocumentId`, `menuOpen`, `onMenuOpenChange`, `onDocumentSelect`, `onDocumentClose`, `onNew`, `onOpen`, `onClick`, `documentIcon`, `newLabel`, `openLabel`, `label` | 높이 48, 폭 190–310(반응형 clamp), 메뉴 310 | 텍스트만 Hover #FFC600, 열림 화살표 회전 | ✅ |
-| `SWHeaderLayerMenu` | 레이어 필드 + Dropdown | `value`(필수), `layers`(필수), `activeLayerId`, `open`, `onOpenChange`, `onClick`, `selected`, `disabled`, `onLayerSelect`, `onVisibilityChange`, `onFreezeChange`, `onLockChange`, `onDetail`, `label` | 필드 234 × 38, 메뉴 234 | Hover 링, Selected, Expanded, 행 Hover | ✅ |
+| `SWHeaderDocumentTitle` | 파일명 + 문서 Dropdown(+ New / Open) | `title`(필수), `documents`, `activeDocumentId`, `menuOpen`, `onMenuOpenChange`, `onDocumentSelect`, `onDocumentClose`, `onNew`, `onOpen`, `onClick`, `documentIcon`, `newLabel`, `openLabel`, `label`, `showNew` / `showOpen`(기본 true, 둘 다 false면 하단 없음) | 높이 48, 폭 190–310(반응형 clamp), 메뉴 310 | 텍스트만 Hover #FFC600, 열림 화살표 회전 | ✅ |
+| `SWHeaderLayerMenu` | 레이어 필드 + Dropdown | `value`(필수), `layers`(필수), `activeLayerId`, `open`, `onOpenChange`, `onClick`, `selected`, `disabled`, `onLayerSelect`, `onVisibilityChange`, `onFreezeChange`, `onLockChange`, `onDetail`, `label`, `showFreeze` / `showLock`(기본 true. false = 그 상태를 그리지 않고 20px 자리만 유지) | 필드 234 × 38, 메뉴 234 | Hover 링, Selected, Expanded, 행 Hover | ✅ |
| `SWHeaderColorMenu` | 색상 필드 + Dropdown(ByLayer/ByBlock, 팔레트, 사용자 색, 추출, RGB 입력) | `value`, `colors`(필수), `userColors`, `mode`, `open`, `onOpenChange`, `onClick`, `selected`, `disabled`, `onColorSelect`, `onModeChange`, `onColorInput`, `onPick`, `onDetail`, `label` | 필드 192 × 38 | 칩 선택 시 열림 유지 | ✅ |
| `SWHeaderLineStyleMenu` | 선스타일 필드 + 3열 Dropdown | `value`, `lineTypes`, `lineWeights`, `activeLineTypeId`, `activeLineWeightId`, `open`, `onOpenChange`, `onClick`, `selected`, `disabled`, `onLineTypeSelect`, `onLineWeightSelect`, `onLineWeightValueChange`, `onScaleChange`, `onDetail`, `label` | 필드 284 × 38, 열 182·142·142(필드 중앙 정렬) | 열별 선택, 열림 유지 | ✅ |
| `SWHeaderTextStyleMenu` | 문자스타일 필드 + 목록 | `value`, `textStyles`(필수), `activeTextStyleId`, `onTextStyleSelect`, `open`, `onOpenChange`, `onClick`, `selected`, `disabled`, `onDetail`, `label` | 필드 164 × 38 | 선택 시 닫힘 | ✅ |
| `SWHeaderDimensionStyleMenu` | 치수스타일 필드 + 목록 | `value`, `dimensionStyles`(필수), `activeDimensionStyleId`, `onDimensionStyleSelect`, 열림·`onDetail`·`label` 동일 | 필드 164 × 38 | 선택 시 닫힘 | ✅ |
-| `SWHeaderLayerControl` · `SWHeaderColorControl` · `SWHeaderLineStyle` · `SWHeaderTextStyle` · `SWHeaderDimensionStyle` | Dropdown 없는 필드 버튼(호스트가 자체 팝업을 열 때) | `value`(필수), `label`, `selected`, `disabled`, `onClick`, `expanded`, `controls`, `buttonRef` / `SWHeaderLayerControl`은 `state`(표시·동결·잠금) | 위 필드 크기와 같음 | Hover 링, Selected | ◻ |
+| `SWHeaderLayerControl` · `SWHeaderColorControl` · `SWHeaderLineStyle` · `SWHeaderTextStyle` · `SWHeaderDimensionStyle` | Dropdown 없는 필드 버튼(호스트가 자체 팝업을 열 때) | `value`(필수), `label`, `selected`, `disabled`, `onClick`, `expanded`, `controls`, `buttonRef` / `SWHeaderLayerControl`은 `state`(표시·동결·잠금), `showFreeze` / `showLock` | 위 필드 크기와 같음 | Hover 링, Selected | ◻ |
| `SWHeaderActions` | 인쇄·K 버튼 pill | `onPrint`, `onPopupGuide`, `disabled`, `showPrint`, `showPopupGuide`(하나만 남기면 pill이 축소) | pill 85 × 42(버튼 40 × 38) | 아이콘 Hover, Hover 링, K 가이드 미리보기(반복 Motion, Reduced Motion 정적) | ✅ |
| `SWHeaderWindowControls` | 창 이동·최소화·종료 | `onWindowMoveStart`, `onMinimize`, `onClose`, `showWindowMove`, `showMinimize`, `showClose` | 이동 88 × 48, 버튼 32 × 48 | 창 이동 Hover Motion 1.4s, 종료 Hover 자산 | ◻ |
| `SWHeaderProperties` | 상세보기 / 속성Bar · 속성창 토글 | `barOpen`, `panelOpen`, `panelId`, `disabled`, `onBarToggle`, `onPanelToggle`, `showCaption`, `showBar`, `showPanel` | 157 × 38 | 텍스트 Hover #FFC600 | ◻ |
| `SWHeaderPropertyBar` | 28px 속성 편집 띠 | `selection`, `properties`, `onPropertyChange`, `readOnly`, `disabled`, `div` 속성 | 높이 28, 콘텐츠 폭 | Input 상태 | ◻ |
-| `SWHeaderPropertyPanel` | 속성창(13개 필드 타입, 그룹, 형상 Slot) | `selection`, `properties`, `groups`, `onPropertyChange`, `menus`, `expandedGroupIds`/`defaultExpandedGroupIds`/`onExpandedGroupsChange`, `toolActive`/`onToolActiveChange`, `toolLabel`, `onOverviewClick`, `shapeContent`, `onClose`, `id`, `anchorRef`, `style` | 고정 위치 Overlay(Portal·Dim 없음) | 4가지 선택 상태 | ◻ |
+| `SWHeaderPropertyPanel` | 데이터 기반 속성창(필드 타입 6종 `text`·`number`·`select`·`color`·`slider`·`computed` + picker, 그룹 레이아웃 `rows`·`circle`·`position`, 형상 Slot) | `selection`·`properties`·`groups`(0.2.0부터 선택), `title`, `children`(그룹 뒤 자유 콘텐츠), `autoFocus`, `onPropertyChange`, `menus`(`showLayerFreeze`/`showLayerLock` 포함), `expandedGroupIds`/`defaultExpandedGroupIds`/`onExpandedGroupsChange`, `toolActive`/`onToolActiveChange`, `toolLabel`, `onOverviewClick`, `shapeContent`, `onClose`, `id`, `anchorRef`, `style` | 314 폭, 높이는 콘텐츠(최대 화면, 본문 스크롤). `anchorRef`가 있으면 고정 위치 Overlay, 없으면 문서 흐름(위치는 `style`) | 4가지 선택 상태 | ✅ |
| `SWHeaderInput` | 수정 가능한 SW Input | `value`(필수), `onValueChange`, `onCommit`(Enter·Blur, 유효 + 변경 시), `onCancel`(Escape 복원), `valueType`(`text`/`number`), `parse`, `readOnly`, `disabled`, `commitOnUnmount`, `input` 속성 | 58 × 20 기준, Hover/편집 24px | Default/Hover/편집/ReadOnly/Disabled, IME 조합 중 Enter 무시 | ✅ |
| `parseSWHeaderColor` · `parseSWHeaderNumber` | Input 검증 도우미 | `r,g,b` / `#rrggbb`, 숫자(`min`, `max`) | — | — | ◻ |
| `SWHeaderLinePreview` · `swHeaderLinePatterns` | 70 × 2 선 미리보기, CENTER/HIDDEN 패턴 | `pattern?: number[]` | 70 × 2 | — | ◻(패턴 상수만 예제 데이터에서 사용) |
-## 3. 공개 타입
+## 3. Popup — 외형 고정, 콘텐츠 자유
-`SWHeaderProps`, 각 컴포넌트 `*Props`, `SWThemeProps`, `SWHeaderMenuId`, `SWHeaderControlId`, `SWHeaderControlConfig`, `SWHeaderFrameControlId`, `SWHeaderHideableControlId`, `SWHeaderDocument`, `SWHeaderLayer`, `SWHeaderLayerValue`, `SWHeaderColorValue`, `SWHeaderColorOption`, `SWHeaderColorMode`, `SWHeaderColorInputValue`, `SWHeaderLineStyleValue`, `SWHeaderLineType`, `SWHeaderLineWeight`, `SWHeaderTextStyleValue`, `SWHeaderTextStyleOption`, `SWHeaderDimensionStyleValue`, `SWHeaderDimensionStyleOption`, `SWHeaderInputValueType`, `SWHeaderProperty`, `SWHeaderPropertyType`, `SWHeaderPropertyPicker`, `SWHeaderPropertyMenus`, `SWHeaderPropertyGroup`, `SWHeaderPropertySelection`, `SWHeaderPropertyShapeContent`, `SWHeaderPropertyShapeContext`.
+속성창(Figma 26:11822)의 외형과 공통 동작을 그대로 쓰는 Popup입니다. Header 없이 `` 안에서 씁니다. 내용은 `children`으로 자유롭게 구성합니다(SW 컨트롤, `@hm-design/ui` 컴포넌트, 소비 프로젝트 요소 모두 가능, 구조 제한 없음).
-## 4. 공개하지 않은 것 (사용 금지)
+| 컴포넌트 | 용도 | 주요 Props | 크기·동작 | 검증 |
+|---|---|---|---|---|
+| `SWPopup` | 설정·정보·사용자 정의 Popup 프레임 | `title`(필수), `children`, `onClose`(닫기 버튼·Escape), `closeLabel`(기본 `닫기`), `autoFocus`(열릴 때 Focus, 안에서 닫히면 원래 위치로 복귀), `anchorRef`(기준 요소 아래 고정 Overlay), `style`·`className`·`div` 속성 | 폭 314, 제목줄 30, 높이는 콘텐츠(최대 화면 − 8px, `style.maxHeight`로 더 줄일 수 있음) → 본문 스크롤. Non-modal(Dim·Portal·Focus trap 없음) | ✅ |
+| `SWPopupSection` | 속성창 그룹 면(제목 + 내용) | `title`, `children`, `section` 속성 | 그룹 제목 700·70% 검정, 내용 면 `--hm-sw-property-content` | ✅ |
+| `SWPopupRow` | 속성창 한 줄(라벨 + 값) | `label`(필수), `htmlFor`, `children`(값 컨트롤, SW 필드는 `SWHeaderInput`), `unit`, `field`(`box` 기본 · `compact` · `none`), `numeric`(숫자 편집 On), `readOnly`, `disabled` | 행 최소 32, 라벨 72, 값 상자 28(Default·Hover 테두리, 숫자 편집 시 #0F0D0A). `compact` = 41px hug 숫자 필드 | ✅ |
+| `SWHeaderPropertyPanel` | 데이터 기반 속성창(2절). 같은 프레임이며 `children`도 받음 | 2절 | 같은 DOM·class | ✅ |
-`SWHeaderMore`, `SWHeaderField`/`SWHeaderFieldText`, `SWHeaderKGuide`, `useSWHeaderDropdown`, `SWHeaderMenuDetail`, `SWHeaderColorChip`, `SWHeaderLayerRows`, `SWHeaderColorPanelBody`, `SWHeaderLineStyleColumns`, 속성창 내부 Picker, `useSWHeaderOverlay` 등은 내부 구현입니다. 필요하면 공개 컴포넌트로 대체하거나, 부족한 API로 보고합니다.
+- **Escape·Focus:** Popup 안의 Escape는 그 Popup만 닫습니다. 바깥의 Escape는 가장 최근에 열리거나 사용한(Focus·클릭) Popup 하나만 닫습니다. Dropdown·편집 중인 Input처럼 Escape를 이미 처리한 요소(`preventDefault` / 전파 중단)가 있으면 Popup은 닫히지 않습니다.
+- **Popup 안 SW Dropdown:** 레이어·색상·선·문자·치수 Dropdown은 Popup 안에서 고정 위치 Overlay로 열려 스크롤 본문에 잘리지 않습니다(아래에 자리가 없으면 위로 열림). 단, Header용 어두운 필드 모양 그대로이므로 밝은 Popup 면과 대비가 다릅니다. 속성창 행 모양의 선택 필드가 필요하면 `SWHeaderPropertyPanel`의 `picker` 속성(`properties`)을 씁니다.
+- **Popup 하단 버튼(적용·취소)의 SW 전용 디자인은 아직 없습니다.** 필요하면 소비 프로젝트 버튼이나 `@hm-design/ui`의 `Button`을 `children`에 둡니다. 어두운 `SWToolButton`을 밝은 Popup에 강제로 쓰지 않습니다.
-## 5. 알려진 단독 사용 제약
+## 4. 도구 막대 — 기존 SW 버튼 3종
+
+새 디자인 값 없이 기존 SW 버튼 모양을 공개 버튼으로 씁니다(뷰어의 Model/Layout, Fit, 2.5D, 파일 열기 등). `SWHeader`의 `tools`·`leading` 안이나 `` 안에 둡니다.
+
+| 컴포넌트 | 용도 | 주요 Props | 모양(기존 기준) | 검증 |
+|---|---|---|---|---|
+| `SWToolButton` | 버튼·토글 | `appearance`(`text` 기본 / `pill` / `document`), `pressed`(토글·선택), `children`(글자. `pill`은 접근성 이름으로만 사용), `icon`·`hoverIcon`(`pill`), `button` 속성 | `text` = 속성Bar·속성창 글자 토글(700, Hover·선택 #FFC600, 행 19px). `pill` = 인쇄·K 40 × 38(노란 Hover 링, 아이콘 24 × 23 영역). `document` = 파일명 면(48px, 글자만 Hover #FFC600). Home 바로 뒤에 두면 로고 사선 접점을 그대로 공유 | ✅ |
+| `SWToolGroup` | 버튼 묶음 | `appearance`(`text` 기본 = 상세보기 묶음, `pill` = 인쇄·K pill), `label`(`text`의 12px 캡션·접근성 이름), `selection`(`single` = radiogroup, 화살표·Home·End로 이동·선택), `div` 속성 | 버튼 사이 1px 구분선(`text`), 내용 폭 pill | ✅ |
+
+- 탭(Model / Layout)은 별도 컴포넌트 없이 `SWToolGroup selection="single"` + `SWToolButton pressed`입니다.
+- 상태 표시(로드 상태 등) 전용 SW 디자인은 아직 없습니다(상태 표시 컴포넌트는 디자인 확정 후 검토).
+
+## 5. 공개 타입
+
+`SWHeaderProps`, 각 컴포넌트 `*Props`, `SWThemeProps`, `SWPopupProps`, `SWPopupSectionProps`, `SWPopupRowProps`, `SWToolButtonProps`, `SWToolButtonAppearance`, `SWToolGroupProps`, `SWHeaderMenuId`, `SWHeaderControlId`, `SWHeaderControlConfig`, `SWHeaderFrameControlId`, `SWHeaderSubControlId`, `SWHeaderHideableControlId`, `SWHeaderDocument`, `SWHeaderLayer`, `SWHeaderLayerValue`, `SWHeaderColorValue`, `SWHeaderColorOption`, `SWHeaderColorMode`, `SWHeaderColorInputValue`, `SWHeaderLineStyleValue`, `SWHeaderLineType`, `SWHeaderLineWeight`, `SWHeaderTextStyleValue`, `SWHeaderTextStyleOption`, `SWHeaderDimensionStyleValue`, `SWHeaderDimensionStyleOption`, `SWHeaderInputValueType`, `SWHeaderProperty`, `SWHeaderPropertyType`, `SWHeaderPropertyPicker`, `SWHeaderPropertyMenus`, `SWHeaderPropertyGroup`, `SWHeaderPropertySelection`, `SWHeaderPropertyShapeContent`, `SWHeaderPropertyShapeContext`.
+
+## 6. 공개하지 않은 것 (사용 금지)
+
+`SWHeaderMore`, `SWHeaderField`/`SWHeaderFieldText`, `SWHeaderKGuide`, `useSWHeaderDropdown`, `SWHeaderMenuDetail`, `SWHeaderColorChip`, `SWHeaderLayerRows`, `SWHeaderColorPanelBody`, `SWHeaderLineStyleColumns`, `SWPopupFrame`, `useSWFixedDropdownPosition`, 속성창 내부 Picker, `useSWHeaderOverlay` 등은 내부 구현입니다. 필요하면 공개 컴포넌트로 대체하거나, 부족한 API로 보고합니다.
+
+## 7. 알려진 단독 사용 제약
| 항목 | 내용 | 대응 |
|---|---|---|
-| 반응형 More | `SWHeader` 전용. 조합 Header에서는 More·필드 이동이 없음 | 조합 Header의 폭은 소비 앱이 정함(필요 없는 컨트롤을 빼거나 가로 공간 확보) |
+| 반응형 More | `SWHeader` 전용. `SWTheme`로 직접 배치한 조합 Header에는 More·필드 이동이 없음 | 반응형이 필요하면 `SWHeader`의 `controls`·`documentOpenPlacement`·`leading`·`tools`로 구성(예제 F). 직접 배치하면 폭은 소비 앱이 정함 |
| `SWHeaderDocumentTitle` 왼쪽 테두리 | 앞의 로고와 겹치는 전제로 왼쪽 테두리가 없음 | 로고 없이 첫 칸이면 소비 레이아웃 wrapper에 1px 테두리(예제 C) |
| `SWHeaderDocumentTitle` 폭 | `clamp(190px, 100cqw − 1610px, 310px)`; Header 밖에서는 cqw가 뷰포트 기준 | flex 부모 안에 둔다. 1920 뷰포트에서 310px |
| 창 영역 배경 | 배경·테두리는 `SWHeader`의 창 영역에 있음 | 소비 레이아웃이 토큰으로 표면 작성(예제 B·C) |
-| Dropdown 위치 | `SWHeader` 안이면 헤더, 밖이면 뷰포트 안으로 좌우 보정 | 부모에 `overflow: hidden`을 두지 않는다 |
+| Dropdown 위치 | `SWHeader` 안이면 헤더, 밖이면 뷰포트 안으로 좌우 보정. `SWPopup`·속성창 안이면 고정 위치 Overlay | Popup 밖에서는 부모에 `overflow: hidden`을 두지 않는다 |
+| 파일 열기 뒤 파일명 여백 | `SWToolButton appearance="document"` 바로 뒤의 파일명은 왼쪽 여백 12px(로고 아래가 아니므로) | 패키지 CSS가 처리. 소비 코드에서 조정하지 않음 |
diff --git a/packages/sw/ai/COMPOSITION_PATTERNS.md b/packages/sw/ai/COMPOSITION_PATTERNS.md
index 179a409..5d02109 100644
--- a/packages/sw/ai/COMPOSITION_PATTERNS.md
+++ b/packages/sw/ai/COMPOSITION_PATTERNS.md
@@ -10,6 +10,8 @@
| 기존 컨트롤 일부만, 다른 배치·순서 | 2. 조합 Header |
| 기존 Dropdown을 툴바·패널 등 다른 곳에 | 3. 개별 컨트롤 |
| 패키지에 없는 기능 | 4. 확장(소비 프로젝트 신규 컴포넌트) |
+| SW Popup 디자인의 설정창·정보창·사용자 정의 폼 | 5. Popup(외형 고정, 콘텐츠 자유) |
+| 로고 옆 파일 열기, 뷰어 도구 막대(Model/Layout, Fit, 2.5D) | 6. 파일 열기 + 도구 막대 |
## 1. 완성형 SW Header — [ExampleA-DefaultHeader.tsx](./examples/ExampleA-DefaultHeader.tsx)
@@ -73,7 +75,48 @@
새 컨트롤은 패키지 공식 컴포넌트로 자동 등록하지 않습니다. 여러 프로젝트에서 반복되면 SW 패키지 승격을 별도로 검토합니다.
-## 5. 하지 말 것
+## 5. Popup — 외형 고정, 콘텐츠 자유 — [ExampleE-CustomPopup.tsx](./examples/ExampleE-CustomPopup.tsx)
+
+요청 예: "HMDesign SW Popup 디자인을 사용해서 내부에 새로운 설정 폼을 만들어 줘."
+
+1. 카탈로그 3절에서 `SWPopup`을 찾는다(프레임 = 속성창 외형·닫기·Escape·스크롤).
+2. 내용은 `children`으로 구성한다. 행 모양은 `SWPopupSection` + `SWPopupRow`, 값 입력은 `SWHeaderInput`.
+3. SW에 없는 컨트롤(Switch, Slider, Select, Button 등)은 `@hm-design/ui`를 `children` 안에 그대로 둔다. 구조 제한은 없다.
+4. 프레임(폭, 제목줄, 닫기, 표면색)을 다시 만들지 않고, `hm-sw-property*` class를 쓰지 않는다.
+
+```tsx
+
+
+
+
+
+
+
+
+
+```
+
+- 데이터 기반 속성창이 필요하면 `SWHeaderPropertyPanel`(`properties` / `groups`)을 쓰고, 추가 내용은 같은 컴포넌트의 `children`으로 붙인다.
+- 위치는 호스트가 정한다: 문서 흐름(`style`) 또는 `anchorRef`(기준 요소 아래 고정 Overlay). 열고 닫는 상태도 호스트가 가진다(조건부 렌더링).
+- 여러 Popup을 동시에 띄워도 Escape는 하나씩 닫힌다(카탈로그 3절).
+
+## 6. 파일 열기 + 도구 막대 — [ExampleF-ViewerToolbar.tsx](./examples/ExampleF-ViewerToolbar.tsx)
+
+```tsx
+
+ Model
+ Layout
+ } />
+```
+
+- 파일 열기는 `tools`에 직접 만들지 않는다. `documentOpenPlacement="header"`가 로고 바로 오른쪽에 파일명과 같은 면으로 그리고 Dropdown의 Open은 숨긴다(중복 없음). 공간이 부족하면 More로 이동한다.
+- 지원하지 않는 기능은 `hiddenControls`로 뺀다(`documentNew`, `documentOpen`, `layerFreeze`, `layerLock`). 가짜 버튼을 두지 않는다.
+- `SWHeader` 없이 같은 순서가 필요하면: `SWHeaderHome` → `SWToolButton appearance="document"` → `SWHeaderDocumentTitle showOpen={false}`(사선 접점·12px 여백은 패키지가 처리). 이 경우 More는 없다.
+
+## 7. 하지 말 것
- `hm-sw-*` class를 소비 코드에 쓰거나 CSS로 덮어쓰기
- `dist` 구현·`styles.css` 블록 복사로 같은 컴포넌트 재작성
diff --git a/packages/sw/ai/DESIGN_RULES.md b/packages/sw/ai/DESIGN_RULES.md
index b3323bc..b4a00df 100644
--- a/packages/sw/ai/DESIGN_RULES.md
+++ b/packages/sw/ai/DESIGN_RULES.md
@@ -84,7 +84,33 @@ Container `hm-sw-header` 기준 Breakpoint: **< 1800** 선/문자/치수스타
조합 Header(개별 컴포넌트)에는 이 규칙이 적용되지 않습니다. 필요한 컨트롤만 배치하고 폭 정책은 소비 앱이 정합니다.
-## 8. 새 컴포넌트 체크리스트
+## 8. Popup (속성창 프레임, `SWPopup` / `SWHeaderPropertyPanel`)
+
+프로젝트마다 내용이 달라도 아래 외형은 그대로 유지됩니다(프레임은 패키지가 그림). 새 Popup 화면은 `SWPopup`을 쓰고 프레임을 다시 만들지 않습니다.
+
+| 항목 | 값 | 토큰 |
+|---|---|---|
+| 폭 / 높이 | 314px / 콘텐츠 높이(최대 화면 − 8px), 넘치면 본문 세로 스크롤 | — |
+| 표면 / 테두리 / radius | `#E4DBC9` / 1px `#A67D03` / 4px, 안쪽 1px 검정 그림자 | `--hm-sw-property-surface`, `--hm-sw-property-border` |
+| 제목줄 | 30px, Figma 제목 아트, 제목 14px 700 `#FFC600` + 검정 외곽선, 닫기 44 × 30(Hover 자산) | `--hm-sw-header-selected-color` |
+| 본문 | padding 7px, 그룹 사이 8px | — |
+| 그룹 면(`SWPopupSection`) | 제목 700 · 검정 70%, 내용 면 `#F1ECE1`, 1px `#585349`, radius 4px | `--hm-sw-property-content` |
+| 행(`SWPopupRow`) | 최소 32px, 라벨 72px 700 검정, 값 글자 `#E60403` 500, 단위 12px | `--hm-sw-property-label`, `--hm-sw-header-input-color` |
+| 값 상자 | 28px, Hover 1px `rgba(33,29,19,.4)`, 숫자 편집 On `#0F0D0A`(단위 흰색), Dropdown On `#211D13` | `--hm-sw-property-field-*` |
+| 동작 | Non-modal(Dim·Portal·Focus trap 없음). Escape는 Popup 안이면 그 Popup, 밖이면 최근 사용 Popup 하나. `autoFocus`면 열릴 때 Focus, 안에서 닫히면 원래 위치로 | — |
+
+- 밝은 Popup 면에는 SW Header의 어두운 컨트롤(필드·`SWToolButton`)이 디자인상 맞지 않습니다. 쓸 수는 있지만(Dropdown은 고정 Overlay로 잘리지 않음) 행 모양이 필요하면 `SWPopupRow` + `SWHeaderInput` 또는 속성창 `picker`를 씁니다.
+- Popup 하단 버튼의 SW 디자인은 없습니다. 임의 색·크기로 만들지 말고 `@hm-design/ui` `Button` 등 기존 컴포넌트를 쓰거나 사용자에게 디자인을 확인합니다.
+
+## 9. 도구 버튼 (`SWToolButton` / `SWToolGroup`)
+
+| appearance | 기존 기준 | 상태 |
+|---|---|---|
+| `text` | 속성Bar·속성창 토글: 19px 행, 14px 700, 자간 0.04em, 묶음 위 12px 캡션, 버튼 사이 1px 구분선 | Hover·`pressed` 글자 `#FFC600`, 테두리·배경 변화 없음 |
+| `pill` | 인쇄·K: pill(`rgba(0,0,0,.8)`, 1px `#092920`, radius 4px) 안 40 × 38 버튼, 아이콘 영역 24 × 23 | Hover 노란 gradient 링 + `hoverIcon`. 아이콘 색은 기존 인쇄 아이콘 `#B6D0C9` → Hover `#FFC600`(`--hm-sw-header-selected-color`) |
+| `document` | 파일명 면: 48px, gradient 표면, 위·오른쪽·아래 1px `#0E4C3A`, 글자 `#F0F7F5` 700 · 자간 0.06em | 글자만 Hover `#FFC600`. Home 바로 뒤면 로고 사선 접점 공유, 그 뒤 파일명은 왼쪽 여백 12px |
+
+## 10. 새 컴포넌트 체크리스트
1. ``(또는 `SWHeader`의 `tools`) 안에서 렌더링한다.
2. 표면·크기·색은 위 토큰만 쓴다. 필드형이면 38px·속성 필드 면·12px 라벨 + 14px 700 값.
@@ -92,3 +118,5 @@ Container `hm-sw-header` 기준 Breakpoint: **< 1800** 선/문자/치수스타
4. 입력이 필요하면 `SWHeaderInput`을 재사용한다.
5. 값은 Props, 동작은 Callback. CAD 데이터를 내부에서 바꾸지 않는다.
6. `hm-sw-*` class를 새로 쓰거나 덮어쓰지 않는다(자기 접두사 사용, 예: `app-`).
+7. 버튼·탭·토글이면 먼저 `SWToolButton`의 세 모양(§9)으로 해결되는지 본다. 팝업·설정창이면 `SWPopup` + `SWPopupSection` / `SWPopupRow`(§8).
+8. 팝업 안의 새 콘텐츠는 §8의 Popup 토큰(`--hm-sw-property-*`)만 읽는다. Header용 어두운 토큰을 밝은 Popup 면에 섞지 않는다.
diff --git a/packages/sw/ai/examples/ExampleE-CustomPopup.tsx b/packages/sw/ai/examples/ExampleE-CustomPopup.tsx
new file mode 100644
index 0000000..6425289
--- /dev/null
+++ b/packages/sw/ai/examples/ExampleE-CustomPopup.tsx
@@ -0,0 +1,40 @@
+// Example E — the SW popup frame with project content (no Header). SWPopup keeps the property window design;
+// children are free: SWPopupSection / SWPopupRow rows with SWHeaderInput, and an existing SW dropdown.
+import { useId, useState } from "react"
+import { SWHeaderLayerMenu, SWHeaderInput, SWPopup, SWPopupRow, SWPopupSection, SWTheme } from "@hm-design/sw"
+import { layers } from "./sample-data"
+
+export function ExampleECustomPopup({ onEvent }: { onEvent?: (name: string) => void }) {
+ const [open, setOpen] = useState(true)
+ const nameId = useId()
+ const [name, setName] = useState("평면도-01")
+ const [scale, setScale] = useState("100")
+ const [x, setX] = useState("1200.5")
+ const [activeLayerId, setActiveLayerId] = useState("0")
+ if (!open) return
+ return (
+
+ { setOpen(false); onEvent?.("popup:close") }}>
+
+
+ { setName(next); onEvent?.(`name:${next}`) }} />
+
+
+ { setScale(next); onEvent?.(`scale:${next}`) }} />
+
+
+
+
+
+ { setX(next); onEvent?.(`x:${next}`) }} />
+
+
+
+ {/* Inside a popup the dropdown opens as a fixed overlay, so the scrolling body never clips it. */}
+ { setActiveLayerId(layer.id); onEvent?.(`layer:${layer.id}`) }} />
+
+
+
+ )
+}
diff --git a/packages/sw/ai/examples/ExampleF-ViewerToolbar.tsx b/packages/sw/ai/examples/ExampleF-ViewerToolbar.tsx
new file mode 100644
index 0000000..81631d2
--- /dev/null
+++ b/packages/sw/ai/examples/ExampleF-ViewerToolbar.tsx
@@ -0,0 +1,50 @@
+// Example F — a viewer header: logo → Open → file → layer → color → K, plus a tool bar (Model / Layout, 2.5D,
+// Fit) after the menus. Everything is SWHeader props, so the existing responsive More serves the whole layout
+// (Open moves into More when the measured header has no room). No freeze / lock, no "+ New" in this product.
+import { useState } from "react"
+import { SWHeader, SWToolButton, SWToolGroup } from "@hm-design/sw"
+import { colors, documents, layers } from "./sample-data"
+
+// The program supplies its icons (24 x 23 box of a pill button). Colors: the existing print icon fill #B6D0C9,
+// hover --hm-sw-header-selected-color (#FFC600), as in DESIGN_RULES §2.
+const FitIcon = ({ color }: { color: string }) => (
+
+)
+
+export function ExampleFViewerToolbar({ onEvent }: { onEvent?: (name: string) => void }) {
+ const [activeLayerId, setActiveLayerId] = useState("0")
+ const [view, setView] = useState<"model" | "layout">("model")
+ const [depth, setDepth] = useState(false)
+ return (
+ onEvent?.("document:open")}
+ onDocumentSelect={document => onEvent?.(`document:${document.id}`)}
+ controls={[{ id: "document" }, { id: "layer" }, { id: "color" }, { id: "popupGuide" }]}
+ hiddenControls={["documentNew", "layerFreeze", "layerLock"]}
+ layers={layers}
+ activeLayerId={activeLayerId}
+ onLayerSelect={layer => { setActiveLayerId(layer.id); onEvent?.(`layer:${layer.id}`) }}
+ colors={colors}
+ onColorSelect={option => onEvent?.(`color:${option.id}`)}
+ tools={<>
+
+ { setView("model"); onEvent?.("view:model") }}>Model
+ { setView("layout"); onEvent?.("view:layout") }}>Layout
+
+
+ { setDepth(!depth); onEvent?.(`2.5d:${!depth}`) }}>2.5D
+
+
+ } hoverIcon={} onClick={() => onEvent?.("fit")}>화면 맞춤
+
+ >}
+ />
+ )
+}
diff --git a/packages/sw/build.mjs b/packages/sw/build.mjs
index 3e2cfd0..00e9201 100644
--- a/packages/sw/build.mjs
+++ b/packages/sw/build.mjs
@@ -55,3 +55,33 @@ async function finishDeclarations(directory) {
}
}
await finishDeclarations(output)
+
+// Reproducibility: the same source and the same locked tools give byte-identical dist on any path or
+// checkout. Sources are copied as written (styles.css keeps sw.css bytes), so CRLF checkouts
+// (core.autocrlf=true) would change the output; every emitted text file is normalized to LF.
+async function normalizeLineEndings(directory) {
+ for (const entry of await readdir(directory, { withFileTypes: true })) {
+ const file = path.join(directory, entry.name)
+ if (entry.isDirectory()) await normalizeLineEndings(file)
+ else if (/\.(js|css|d\.ts|json)$/.test(entry.name)) {
+ const text = await readFile(file, "utf8")
+ if (text.includes("\r")) await writeFile(file, text.replace(/\r\n?/g, "\n"))
+ }
+ }
+}
+await normalizeLineEndings(output)
+
+// Provenance without timestamps: source commit (SW_BUILD_COMMIT overrides; "unknown" outside git),
+// whether packages/sw had uncommitted changes, and the locked build tool versions.
+const git = args => { try { return execFileSync("git", args, { cwd: packageRoot, encoding: "utf8", stdio: ["ignore", "pipe", "ignore"] }).trim() } catch { return null } }
+const toolVersion = name => { try { return JSON.parse(execFileSync(process.execPath, ["-p", `JSON.stringify(require("${name}/package.json").version)`], { cwd: packageRoot, encoding: "utf8" })) } catch { return null } }
+const commit = process.env.SW_BUILD_COMMIT ?? git(["rev-parse", "HEAD"]) ?? "unknown"
+// With SW_BUILD_COMMIT the caller vouches for the source; dirty is then unknown (null), never a guess.
+const status = process.env.SW_BUILD_COMMIT ? null : git(["status", "--porcelain", "--", "."])
+await writeFile(path.join(output, "build-info.json"), JSON.stringify({
+ name: manifest.name,
+ version: manifest.version,
+ commit,
+ dirty: status === null ? null : status.length > 0,
+ tools: { vite: toolVersion("vite"), rolldown: toolVersion("rolldown"), typescript: toolVersion("typescript") },
+}, null, 2) + "\n")
diff --git a/packages/sw/package.json b/packages/sw/package.json
index 84801af..7769d74 100644
--- a/packages/sw/package.json
+++ b/packages/sw/package.json
@@ -1,6 +1,6 @@
{
"name": "@hm-design/sw",
- "version": "0.1.0",
+ "version": "0.2.0",
"private": false,
"description": "HM Design System SW (EasyBeam-style desktop software) components. Independent of @hm-design/ui.",
"type": "module",
diff --git a/packages/sw/src/components/sw-header/SWHeader.tsx b/packages/sw/src/components/sw-header/SWHeader.tsx
index d2a6b2a..b192deb 100644
--- a/packages/sw/src/components/sw-header/SWHeader.tsx
+++ b/packages/sw/src/components/sw-header/SWHeader.tsx
@@ -19,7 +19,8 @@ import printHover from "../../assets/print-hover.svg"
import { SWHeaderPropertyPanel } from "./components/SWHeaderPropertyPanel"
import { SWHeaderDimensionStyleMenu, SWHeaderTextStyleMenu } from "./components/SWHeaderStyleListMenus"
import { SWHeaderWindowControls } from "./components/SWHeaderWindowControls"
-import type { SWHeaderControlId, SWHeaderControlConfig, SWHeaderFrameControlId, SWHeaderHideableControlId, SWHeaderMenuId, SWHeaderProps } from "./types"
+import { SWToolButton } from "../sw-tool/SWTool"
+import type { SWHeaderControlId, SWHeaderControlConfig, SWHeaderFrameControlId, SWHeaderHideableControlId, SWHeaderMenuId, SWHeaderProps, SWHeaderSubControlId } from "./types"
const defaults = {
layer: { name: "0" },
@@ -37,6 +38,7 @@ const menuSlot: Record = {
const defaultMenuOrder = Object.keys(menuSlot) as SWHeaderMenuId[]
const defaultControls: SWHeaderControlConfig[] = (["document", "drawingMode", ...defaultMenuOrder, "details", "propertyBar", "propertyPanel", "print", "popupGuide"] as const).map(id => ({ id }))
const frameControls: readonly SWHeaderFrameControlId[] = ["home", "windowMove", "minimize", "close"]
+const subControls: readonly SWHeaderSubControlId[] = ["documentNew", "documentOpen", "layerFreeze", "layerLock"]
const isMenu = (id: string): id is SWHeaderMenuId => id in menuSlot
/**
@@ -73,6 +75,8 @@ export const SWHeader = forwardRef(function SWHeader
documentIcon,
documentNewLabel,
documentOpenLabel,
+ documentOpenPlacement = "menu",
+ leading,
drawingModeLabel = "그리기모드",
layer = defaults.layer,
layers,
@@ -161,7 +165,9 @@ export const SWHeader = forwardRef(function SWHeader
const enabled = (id: SWHeaderControlId) => configuration.some(item => item.id === id)
// Default design with removed object parts: same structure and breakpoints, but the script decides what
// moves into More (the CSS alone assumes every field is present). Untouched defaults stay CSS-only.
- const scripted = controls !== undefined || [...removed].some(id => !frameControls.includes(id as SWHeaderFrameControlId))
+ // Sub-items live inside a part and never change the layout mode.
+ const scripted = controls !== undefined || [...removed].some(id => !frameControls.includes(id as SWHeaderFrameControlId) && !subControls.includes(id as SWHeaderSubControlId))
+ const layerStates = { showFreeze: shown("layerFreeze"), showLock: shown("layerLock") }
const presentRef = useRef(new Set(configuration.map(item => item.id)))
presentRef.current = new Set(configuration.map(item => item.id))
const label = (id: SWHeaderControlId, fallback: string) => configuration.find(item => item.id === id)?.label ?? fallback
@@ -204,6 +210,13 @@ export const SWHeader = forwardRef(function SWHeader
const [headerWidth, setHeaderWidth] = useState(1920)
const [barOffset, setBarOffset] = useState(0)
+ // Open next to the logo (documentOpenPlacement="header") moves into More when the measured header has no room.
+ const openInHeader = documentOpenPlacement === "header" && shown("documentOpen")
+ const leadingRef = useRef(null)
+ const [openCollapsed, setOpenCollapsed] = useState(false)
+ const collapseRef = useRef<{ at: number; width: number } | null>(null)
+ const openShown = openInHeader && !openCollapsed
+ const hasLeading = openShown || (leading !== undefined && leading !== null && leading !== false)
useLayoutEffect(() => {
const header = fieldsRef.current?.closest(".hm-sw-header")
if (!header) return
@@ -218,6 +231,35 @@ export const SWHeader = forwardRef(function SWHeader
if (panelAnchorRef.current) observer.observe(panelAnchorRef.current)
return () => observer.disconnect()
}, [])
+ // Space for the parts right of the logo, measured: the file name gives way first (its CSS clamp subtracts
+ // --hm-sw-header-leading-width). Open moves into More only when the bar or object area really overflows,
+ // and returns once the header is wider than at that moment by the Open width (no flicker at the edge).
+ useLayoutEffect(() => {
+ const header = fieldsRef.current?.closest(".hm-sw-header")
+ if (!header) return
+ const leadingWidth = leadingRef.current ? leadingRef.current.getBoundingClientRect().width : 0
+ const value = hasLeading ? `${leadingWidth + 2}px` : ""
+ if (header.style.getPropertyValue("--hm-sw-header-leading-width") !== value) {
+ if (value) header.style.setProperty("--hm-sw-header-leading-width", value)
+ else header.style.removeProperty("--hm-sw-header-leading-width")
+ }
+ if (!openInHeader) {
+ collapseRef.current = null
+ if (openCollapsed) setOpenCollapsed(false)
+ return
+ }
+ if (!openCollapsed) {
+ const bar = header.querySelector(":scope > .hm-sw-header__bar")
+ const overflow = [bar, panelAnchorRef.current].some(element => !!element && element.scrollWidth - element.clientWidth > 1)
+ const open = leadingRef.current?.querySelector("[data-document-open]")
+ if (overflow && open) {
+ collapseRef.current = { at: header.getBoundingClientRect().width, width: open.getBoundingClientRect().width + 2 }
+ setOpenCollapsed(true)
+ }
+ } else if (collapseRef.current && headerWidth >= collapseRef.current.at + collapseRef.current.width) {
+ setOpenCollapsed(false)
+ }
+ })
const menuIds = configuration.map(item => item.id).filter((id): id is SWHeaderMenuId => id in menuSlot)
const baseMenu = menuIds.includes("layer") ? "layer" : menuIds[0]
const validPromoted = promoted && enabled(promoted) ? promoted : null
@@ -302,7 +344,7 @@ export const SWHeader = forwardRef(function SWHeader
if (!item) return []
const hidden = config.id in menuSlot ? fieldHidden(config.id as SWHeaderMenuId) : isOverflow(config.id)
return [{ ...item, label: config.label ?? item.label, visible: scripted ? hidden : undefined }]
- })
+ }).concat(openInHeader ? [{ id: "documentOpen", label: documentOpenLabel ?? "Open", tier: "action" as const, disabled, visible: openCollapsed, onSelect: onDocumentOpen }] : [])
const fieldNodes: Record = {
layer: (layers ? (
(function SWHeader
onFreezeChange={onLayerFreezeChange}
onLockChange={onLayerLockChange}
onDetail={onLayerDetail}
+ {...layerStates}
/>
) : (
-
+
)),
color: (colors ? (
(function SWHeader
onDocumentClose={onDocumentClose}
onNew={onDocumentNew}
onOpen={onDocumentOpen}
+ showNew={shown("documentNew")}
+ showOpen={shown("documentOpen") && !openInHeader}
documentIcon={documentIcon}
newLabel={documentNewLabel}
openLabel={documentOpenLabel}
@@ -424,16 +469,21 @@ export const SWHeader = forwardRef(function SWHeader
const windowReduced = removed.size > 0 && (frameControls.some(id => removed.has(id)) || (controls === undefined && !(enabled("print") && enabled("popupGuide"))))
// CSS-only default layout: a field holding the first slot instead of the removed layer is styled as promoted.
const promotedSlot = validPromoted ?? (!scripted && baseMenu && baseMenu !== "layer" ? baseMenu : null)
- const barData = propertyBar ?? (propertyPanel && {
+ // The bar shares the panel data only when the panel has a selection (a content-only panel has no bar rows).
+ const barData = propertyBar ?? (propertyPanel?.selection && {
selection: propertyPanel.selection,
- properties: propertyPanel.properties,
+ properties: propertyPanel.properties ?? [],
onPropertyChange: propertyPanel.onPropertyChange,
})
return (
-
+
+ {hasLeading &&
+ {openShown && {documentOpenLabel ?? "Open"}}
+ {leading}
+
}
{controls === undefined && enabled("document") && documentNode}
{controls === undefined && enabled("drawingMode") && {drawingModeLabel}}
@@ -446,7 +496,7 @@ export const SWHeader = forwardRef(function SWHeader
)) : menuIds.map(id => {fieldNodes[id]})}
{tools}
- {moreItems.some(item => item.visible !== false) &&
}
+ {moreItems.some(item => item.visible !== false) &&
}
{controls === undefined &&
}
{windowShown &&
@@ -455,7 +505,7 @@ export const SWHeader = forwardRef(function SWHeader
}
{barOpen && barData &&
}
- {panelOpen && propertyPanel && }
+ {panelOpen && propertyPanel && }
)
})
diff --git a/packages/sw/src/components/sw-header/components/SWHeaderDocumentTitle.tsx b/packages/sw/src/components/sw-header/components/SWHeaderDocumentTitle.tsx
index 323e54b..db8327e 100644
--- a/packages/sw/src/components/sw-header/components/SWHeaderDocumentTitle.tsx
+++ b/packages/sw/src/components/sw-header/components/SWHeaderDocumentTitle.tsx
@@ -33,6 +33,12 @@ export interface SWHeaderDocumentTitleProps {
documentIcon?: ReactNode
newLabel?: string
openLabel?: string
+ /**
+ * Footer actions for products without that function (default true). Hiding both removes the footer;
+ * hiding Open avoids a duplicate when the Header shows its own Open button next to the logo.
+ */
+ showNew?: boolean
+ showOpen?: boolean
}
/**
@@ -55,8 +61,11 @@ export function SWHeaderDocumentTitle({
documentIcon: iconOverride,
newLabel = "+ New",
openLabel = "Open",
+ showNew = true,
+ showOpen = true,
}: SWHeaderDocumentTitleProps) {
- const hasMenu = documents !== undefined
+ // Nothing to list and no footer action: the file name stays a plain button (no empty dropdown).
+ const hasMenu = documents !== undefined && (documents.length > 0 || showNew || showOpen)
const [internalOpen, setInternalOpen] = useState(false)
const open = hasMenu && (menuOpen ?? internalOpen)
const rootRef = useRef(null)
@@ -173,10 +182,10 @@ export function SWHeaderDocumentTitle({
))}
)}
-
-
-
-
+ {(showNew || showOpen) &&
+ {showNew && }
+ {showOpen && }
+
}
)}
diff --git a/packages/sw/src/components/sw-header/components/SWHeaderDropdown.tsx b/packages/sw/src/components/sw-header/components/SWHeaderDropdown.tsx
index 6fcca83..e30b9e7 100644
--- a/packages/sw/src/components/sw-header/components/SWHeaderDropdown.tsx
+++ b/packages/sw/src/components/sw-header/components/SWHeaderDropdown.tsx
@@ -1,4 +1,4 @@
-import { useEffect, useId, useLayoutEffect, useRef, useState, type FocusEvent, type KeyboardEvent } from "react"
+import { useEffect, useId, useLayoutEffect, useRef, useState, type FocusEvent, type KeyboardEvent, type RefObject } from "react"
import detailIcon from "../../../assets/layer-detail.svg"
import type { ButtonHTMLAttributes, ReactNode } from "react"
@@ -9,6 +9,45 @@ export interface SWHeaderDropdownOptions {
disabled?: boolean
/** `start`: left edge under the field (color, text, dimension). `center`: centered under it (line style). */
align?: "start" | "center"
+ /** Inside an SW popup (scrolling, clipping body) the list becomes a fixed overlay. Default true. */
+ escapePopup?: boolean
+}
+
+export interface SWFixedDropdownPosition { left: number; top: number; flipped: boolean; offset: number }
+
+/**
+ * Fixed overlay position of a field dropdown, kept on screen: below the field (or above it when only there is
+ * room), aligned to the field start / end / center and shifted sideways only at the screen edge. Used by the
+ * property window pickers and by every field dropdown placed inside an SW popup, whose body scrolls and clips.
+ * `offset` is the panel left relative to the field.
+ */
+export function useSWFixedDropdownPosition(open: boolean, rootRef: RefObject, panelRef: RefObject, align: "start" | "end" | "center", enabled = true) {
+ const [position, setPosition] = useState(null)
+ useLayoutEffect(() => {
+ if (!open || !enabled) { setPosition(null); return }
+ const update = () => {
+ const field = rootRef.current?.getBoundingClientRect()
+ const panel = panelRef.current
+ if (!field || !panel) return
+ const width = panel.offsetWidth, height = panel.offsetHeight
+ const viewportWidth = document.documentElement.clientWidth, viewportHeight = window.innerHeight
+ const start = align === "end" ? field.right - width : align === "center" ? field.left + Math.round((field.width - width) / 2) : field.left
+ const left = Math.max(4, Math.min(start, viewportWidth - width - 4))
+ const below = field.bottom
+ const flipped = below + height > viewportHeight - 4 && field.top - height >= 4
+ const top = flipped ? field.top - height : below
+ const offset = Math.round(left - field.left)
+ setPosition(current => (current && current.left === left && current.top === top && current.flipped === flipped ? current : { left, top, flipped, offset }))
+ }
+ update()
+ window.addEventListener("resize", update)
+ window.addEventListener("scroll", update, true)
+ return () => {
+ window.removeEventListener("resize", update)
+ window.removeEventListener("scroll", update, true)
+ }
+ }, [open, enabled, align, rootRef, panelRef])
+ return position
}
/**
@@ -18,7 +57,7 @@ export interface SWHeaderDropdownOptions {
* a click outside / Tab out close. The list overlays below the field and is shifted horizontally only
* when it would leave the header (or the screen).
*/
-export function useSWHeaderDropdown({ open: openProp, onOpenChange, disabled = false, align = "start" }: SWHeaderDropdownOptions) {
+export function useSWHeaderDropdown({ open: openProp, onOpenChange, disabled = false, align = "start", escapePopup = true }: SWHeaderDropdownOptions) {
const [internalOpen, setInternalOpen] = useState(false)
const open = !disabled && (openProp ?? internalOpen)
const rootRef = useRef(null)
@@ -70,6 +109,9 @@ export function useSWHeaderDropdown({ open: openProp, onOpenChange, disabled = f
return () => window.removeEventListener("resize", update)
}) // Reposition after a host-driven control reorder as well as open/resize.
+ const inPopup = open && escapePopup && !!rootRef.current?.closest(".hm-sw-property")
+ const fixed = useSWFixedDropdownPosition(open, rootRef, panelRef, align, inPopup)
+
/** Focusable entries of the panel in DOM order (rows, inputs, footer). */
const entries = () => Array.from(panelRef.current?.querySelectorAll("button:not(:disabled), input:not(:disabled)") ?? [])
@@ -120,9 +162,11 @@ export function useSWHeaderDropdown({ open: openProp, onOpenChange, disabled = f
triggerRef,
menuId,
/** Panel `left` relative to the field (centered and / or shifted to stay on screen). */
- panelStyle: position.left !== 0 ? { left: position.left } : undefined,
+ panelStyle: fixed ? { position: "fixed" as const, left: fixed.left, top: fixed.top } : inPopup ? { visibility: "hidden" as const } : position.left !== 0 ? { left: position.left } : undefined,
+ /** Panel left relative to the field (also in the fixed popup overlay). */
+ panelOffset: fixed ? fixed.offset : position.left,
/** The panel no longer sits under the field (the outline then rings the panel only). */
- shifted: position.left !== position.base,
+ shifted: fixed ? fixed.flipped || fixed.offset !== position.base : position.left !== position.base,
rootProps: { ref: rootRef, onKeyDown, onBlur, "data-open": open ? "true" : undefined },
}
}
diff --git a/packages/sw/src/components/sw-header/components/SWHeaderFields.tsx b/packages/sw/src/components/sw-header/components/SWHeaderFields.tsx
index f276ac4..339cbec 100644
--- a/packages/sw/src/components/sw-header/components/SWHeaderFields.tsx
+++ b/packages/sw/src/components/sw-header/components/SWHeaderFields.tsx
@@ -18,15 +18,18 @@ export interface SWHeaderLayerControlProps extends FieldBase {
value: SWHeaderLayerValue
/** State of the current layer for the three field icons (gray when off). Defaults to all colored. */
state?: Pick
+ /** Products without freeze / lock: the icon is not drawn, its 20px place stays (default true). */
+ showFreeze?: boolean
+ showLock?: boolean
}
-export function SWHeaderLayerControl({ value, state, label = "레이어", ...rest }: SWHeaderLayerControlProps) {
+export function SWHeaderLayerControl({ value, state, label = "레이어", showFreeze = true, showLock = true, ...rest }: SWHeaderLayerControlProps) {
return (
-
-
+ {showFreeze ? : }
+ {showLock ? : }
diff --git a/packages/sw/src/components/sw-header/components/SWHeaderLayerMenu.tsx b/packages/sw/src/components/sw-header/components/SWHeaderLayerMenu.tsx
index d9ddd37..b6e260f 100644
--- a/packages/sw/src/components/sw-header/components/SWHeaderLayerMenu.tsx
+++ b/packages/sw/src/components/sw-header/components/SWHeaderLayerMenu.tsx
@@ -1,5 +1,5 @@
import { useEffect, useId, useLayoutEffect, useRef, useState, type KeyboardEvent } from "react"
-import { SWHeaderMenuDetail } from "./SWHeaderDropdown"
+import { SWHeaderMenuDetail, useSWFixedDropdownPosition } from "./SWHeaderDropdown"
import type { SWHeaderLayer, SWHeaderLayerValue } from "../types"
import { SWHeaderLayerControl } from "./SWHeaderFields"
import { SWHeaderLayerToggle } from "./SWHeaderLayerIcons"
@@ -26,6 +26,12 @@ export interface SWHeaderLayerMenuProps {
onLockChange?: (layer: SWHeaderLayer, nextLocked: boolean) => void
/** "레이어 상세". Optional host action; omitting it does not disable hover or simulate CAD work. */
onDetail?: () => void
+ /**
+ * Products without freeze / lock (default true): the snowflake / lock is not drawn in the field or in
+ * any row and is no button; its 20px place stays so names and the other icons keep their positions.
+ */
+ showFreeze?: boolean
+ showLock?: boolean
}
/**
@@ -49,6 +55,8 @@ export function SWHeaderLayerMenu({
onFreezeChange,
onLockChange,
onDetail,
+ showFreeze = true,
+ showLock = true,
}: SWHeaderLayerMenuProps) {
const [internalOpen, setInternalOpen] = useState(false)
const open = !disabled && (openProp ?? internalOpen)
@@ -150,6 +158,9 @@ export function SWHeaderLayerMenu({
}
const current = layers.find(item => item.id === activeLayerId)
+ // Inside an SW popup the scrolling body would clip the list: the shared fixed overlay takes over.
+ const inPopup = open && !!rootRef.current?.closest(".hm-sw-property")
+ const fixed = useSWFixedDropdownPosition(open, rootRef, menuRef, "start", inPopup)
return (
{ onDetail(); close(true) })}
/>
@@ -207,7 +222,7 @@ export function SWHeaderLayerMenu({
)
}
-export interface SWHeaderLayerRowsProps extends Pick
{
+export interface SWHeaderLayerRowsProps extends Pick {
layers: SWHeaderLayer[]
/** Row shown as current (#FFC600 name, hover emphasis). None when the selection mixes layers. */
current?: SWHeaderLayer
@@ -222,7 +237,7 @@ export interface SWHeaderLayerRowsProps extends Pick
{layers.length > 0 && (
@@ -236,8 +251,8 @@ export function SWHeaderLayerRows({ layers, current, onSelect, onVisibilityChang
>
-
-
+ {showFreeze ? : }
+ {showLock ? : }