@keke1933/vibe-dictionary-mcp 0.2.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/index.js +211 -6
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -7,6 +7,65 @@ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"
7
7
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
8
8
  import * as z from "zod/v4";
9
9
 
10
+ // ../../packages/catalog/src/additions/patterns.ts
11
+ var PATTERN_ADDITIONS = [
12
+ {
13
+ id: "zoom-lightbox-gallery",
14
+ domain: "ui",
15
+ category: "card",
16
+ titleKo: "\uC90C \uB77C\uC774\uD2B8\uBC15\uC2A4 \uAC24\uB7EC\uB9AC",
17
+ titleEn: "Zoom Lightbox Gallery",
18
+ summary: "\uC378\uB124\uC77C\uC744 \uB204\uB974\uBA74 \uCE74\uB4DC \uC548\uC5D0 \uC774\uBBF8\uC9C0 \uBDF0\uC5B4\uAC00 \uD3BC\uCCD0\uC9C0\uACE0 \uD655\uB300\xB7\uB4DC\uB798\uADF8\xB7\uC774\uC804 \uB2E4\uC74C \uD0D0\uC0C9\uC73C\uB85C \uC774\uC5B4\uC9C0\uB294 \uAC24\uB7EC\uB9AC",
19
+ vibeTag: "\uC791\uC740 \uC0AC\uC9C4\uC5D0\uC11C \uBAB0\uC785\uD615 \uC774\uBBF8\uC9C0 \uBCF4\uAE30\uB85C",
20
+ vibeKeywords: ["\uB77C\uC774\uD2B8\uBC15\uC2A4", "\uC774\uBBF8\uC9C0 \uD655\uB300", "\uC0AC\uC9C4 \uAC24\uB7EC\uB9AC", "\uC0C1\uD488 \uC774\uBBF8\uC9C0"],
21
+ promptSnippet: "\uC9C0\uC815\uD55C \uC601\uC5ED\uC5D0 \uD574\uC548\xB7\uC0AC\uB9C9\xB7\uB2A5\uC120\uC758 SVG \uC774\uBBF8\uC9C0 \uC138 \uC7A5\uACFC \uC774\uB984\uC744 \uAC00\uC9C4 \uC378\uB124\uC77C \uAC24\uB7EC\uB9AC\uB97C \uB9CC\uB4E4\uC5B4 \uC918. \uC378\uB124\uC77C \uD074\uB9AD\xB7Enter\xB7Space\uB85C \uAC19\uC740 \uCE74\uB4DC \uC548\uC5D0 \uD070 \uC774\uBBF8\uC9C0 \uBDF0\uC5B4\uB97C \uC5F4\uACE0 380ms cubic-bezier(.2,.8,.2,1)\uC758 scale(.78)\xB7opacity(.3)\uC5D0\uC11C \uC6D0\uB798 \uD06C\uAE30\xB7\uBD88\uD22C\uBA85\uB3C4\uB85C \uB4F1\uC7A5\uD574 \uC918. \uBDF0\uC5B4\uB97C \uC5F4\uBA74 \uC774\uC804 \uC774\uBBF8\uC9C0 \uBC84\uD2BC\uC73C\uB85C \uD3EC\uCEE4\uC2A4\uB97C \uC62E\uACA8 \uC918. \uC774\uC804\xB7\uB2E4\uC74C \uBC84\uD2BC\uACFC \uC88C\uC6B0 \uBC29\uD5A5\uD0A4\uB85C \uC138 \uC774\uBBF8\uC9C0\uB97C \uC21C\uD658\uD558\uBA70 \uD655\uB300 \uBC84\uD2BC\uC73C\uB85C \uC911\uC2EC \uAE30\uC900 1\uBC30/1.65\uBC30\uB97C \uC804\uD658\uD574 \uC918. \uC774\uBBF8\uC9C0 \uC804\uD658 \uC2DC \uBC30\uC728\uACFC \uC774\uB3D9\uC744 \uCD08\uAE30\uD654\uD574 \uC918. \uD655\uB300 \uC0C1\uD0DC\uC5D0\uC11C \uC8FC \uD3EC\uC778\uD130 \uB4DC\uB798\uADF8\uB97C capture\uD558\uACE0 \uC774\uB3D9\uC744 \uAC00\uB85C \xB135px\xB7\uC138\uB85C \xB120px\uB85C \uC81C\uD55C\uD574 \uC918. \uD655\uB300\uD558\uC9C0 \uC54A\uC558\uC744 \uB54C \uAC00\uB85C 35px \uCD08\uACFC \uC2A4\uC640\uC774\uD504\uB294 \uC774\uC804\xB7\uB2E4\uC74C \uC774\uBBF8\uC9C0\uB97C \uC120\uD0DD\uD574 \uC918. \uCDE8\uC18C\xB7capture \uC720\uC2E4\uC740 \uB4DC\uB798\uADF8 \uCC38\uC870\uB97C \uC815\uB9AC\uD574 \uC918. \uB2EB\uAE30\xB7Escape\uB294 \uC378\uB124\uC77C\uB85C \uB3CC\uC544\uAC00\uBA70 Escape\uB294 \uCCAB \uC378\uB124\uC77C\uB85C \uD3EC\uCEE4\uC2A4\uB97C \uBCF5\uADC0\uD574 \uC918. \uBDF0\uC5B4\uB294 \uD398\uC774\uC9C0 \uC804\uCCB4 \uBAA8\uB2EC\uC774 \uC544\uB2CC \uCE74\uB4DC \uB0B4\uBD80\uC774\uBA70 \uD540\uCE58 \uC90C\xB7\uC678\uBD80 \uC774\uBBF8\uC9C0 \uC694\uCCAD\uC740 \uC5C6\uC5B4. \uC790\uB3D9\uC73C\uB85C \uC5F4\uAC70\uB098 \uC774\uBBF8\uC9C0\uB97C \uBC14\uAFB8\uC9C0 \uB9D0\uACE0 \uC0AC\uC6A9\uC790\uAC00 \uC120\uD0DD\uD55C \uBDF0\uC5B4 \uC0C1\uD0DC\uB97C \uC720\uC9C0\uD574 \uC918. \uC591\uD14C\uB9C8\xB7\uBAA8\uBC14\uC77C\xB7\uD3EC\uCEE4\uC2A4 \uC724\uACFD\xB7\uBAA8\uC158 \uAC10\uC18C\uB97C \uC9C0\uC6D0\uD574 \uC918."
22
+ },
23
+ {
24
+ id: "selection-bubble-toolbar",
25
+ domain: "ui",
26
+ category: "text",
27
+ titleKo: "\uD14D\uC2A4\uD2B8 \uC120\uD0DD \uBC84\uBE14 \uD234\uBC14",
28
+ titleEn: "Text Selection Bubble Toolbar",
29
+ summary: "\uAE00\uC790\uB97C \uC120\uD0DD\uD55C \uC704\uCE58\uC5D0 \uC791\uC740 \uC11C\uC2DD \uD234\uBC14\uAC00 \uB5A0\uC624\uB974\uACE0 \uC120\uD0DD\uD55C \uBD80\uBD84\uC5D0 \uAD75\uC740 \uAE00\uC528\uB97C \uC801\uC6A9",
30
+ vibeTag: "\uC120\uD0DD\uD55C \uBB38\uC7A5 \uBC14\uB85C \uC704\uC5D0 \uD544\uC694\uD55C \uB3C4\uAD6C\uAC00",
31
+ vibeKeywords: ["\uD14D\uC2A4\uD2B8 \uC120\uD0DD", "\uBC84\uBE14 \uD234\uBC14", "\uD50C\uB85C\uD305 \uC11C\uC2DD", "\uBB38\uC11C \uC5D0\uB514\uD130"],
32
+ promptSnippet: "\uC9C0\uC815\uD55C \uBB38\uB2E8\uC5D0\uC11C \uC2E4\uC81C \uBE0C\uB77C\uC6B0\uC800 \uD14D\uC2A4\uD2B8 \uC120\uD0DD\uC744 \uC77D\uC5B4 \uC120\uD0DD \uC601\uC5ED \uBC14\uB85C \uC704\uC5D0 \uAD75\uAC8C \uBC84\uD2BC \uD558\uB098\uB97C \uAC00\uC9C4 \uBC84\uBE14 \uD234\uBC14\uB97C \uBCF4\uC5EC \uC918. \uD3EC\uC778\uD130 \uC120\uD0DD \uC885\uB8CC\uC640 \uD0A4\uBCF4\uB4DC \uC120\uD0DD \uBCC0\uACBD\uC744 \uBAA8\uB450 \uCC98\uB9AC\uD558\uACE0 \uBB38\uB2E8 \uBC16 \uC120\uD0DD\xB7\uBE48 \uC120\uD0DD\uC5D0\uC11C\uB294 \uC228\uACA8 \uC918. \uD234\uBC14\uB294 \uC120\uD0DD \uC601\uC5ED\uC758 \uAC00\uB85C \uC911\uC2EC\uC744 \uBB38\uB2E8 \uD3ED 25~75% \uC548\uC5D0 \uC81C\uD55C\uD558\uACE0 \uC704\uCABD \uACBD\uACC4\uB97C \uB118\uC9C0 \uC54A\uAC8C \uBC30\uCE58\uD574 \uC918. 180ms \uC544\uB798 5px\xB7\uD22C\uBA85\uC5D0\uC11C \uC6D0\uC704\uCE58\uB85C \uB4F1\uC7A5\uD558\uBA70 \uC791\uC740 \uC0BC\uAC01 \uAF2C\uB9AC\uB97C \uB2EC\uC544 \uC918. \uBC84\uD2BC\uC744 \uB204\uB97C \uB54C \uD3EC\uC778\uD130 \uAE30\uBCF8 \uB3D9\uC791\uC73C\uB85C \uC120\uD0DD\uC774 \uC0AC\uB77C\uC9C0\uC9C0 \uC54A\uAC8C \uD558\uACE0 \uC120\uD0DD\uD55C \uBB38\uC790\uC5F4\uC5D0\uB9CC \uAD75\uC740 \uC11C\uC2DD\uC744 \uC801\uC6A9\uD55C \uB4A4 \uD234\uBC14\uB97C \uB2EB\uC544 \uC918. \uC2E4\uC81C\uB85C \uBB38\uAD6C\uB97C \uC120\uD0DD\uD558\uAE30 \uC804\uC5D0\uB294 \uD234\uBC14\uB97C \uD45C\uC2DC\uD558\uC9C0 \uB9D0\uACE0 \uC790\uB3D9 \uC120\uD0DD\xB7\uC11C\uC2DD \uC2DC\uC5F0\uC744 \uD558\uC9C0 \uC54A\uC544. \uB9C1\uD06C\xB7\uB313\uAE00\xB7\uC2E4\uC81C \uD3B8\uC9D1\uAE30 \uC5F0\uB3D9\uC740 \uCD94\uAC00\uD558\uC9C0 \uB9D0\uC544 \uC918. \uB77C\uC774\uD2B8\xB7\uB2E4\uD06C \uB300\uBE44, \uC881\uC740 \uD3ED, \uD0A4\uBCF4\uB4DC \uC870\uC791\uACFC \uBAA8\uC158 \uAC10\uC18C\uB97C \uC9C0\uC6D0\uD574 \uC918."
33
+ },
34
+ {
35
+ id: "ly-collapsing-scroll-header",
36
+ domain: "layout",
37
+ category: "scroll",
38
+ titleKo: "\uC2A4\uD06C\uB864 \uC555\uCD95 \uD5E4\uB354",
39
+ titleEn: "Collapsing Scroll Header",
40
+ summary: "\uC2A4\uD06C\uB864 \uC9C4\uD589\uC744 \uC790\uB3D9 \uC2DC\uBBAC\uB808\uC774\uC158\uD574 \uD070 \uCEE4\uBC84\uC640 \uC81C\uBAA9\uC774 \uC791\uC740 \uC0C1\uB2E8 \uBC14\uB85C \uC555\uCD95\uB410\uB2E4\uAC00 \uB2E4\uC2DC \uD3BC\uCCD0\uC9C0\uB294 \uD6A8\uACFC",
41
+ vibeTag: "\uD070 \uC81C\uBAA9\uC774 \uC791\uC740 \uC0C1\uB2E8 \uBC14\uB85C \uC790\uC5F0\uC2A4\uB7FD\uAC8C",
42
+ vibeKeywords: ["\uC811\uD788\uB294 \uD5E4\uB354", "\uC2A4\uD06C\uB864 \uD5E4\uB354", "\uCD95\uC18C \uB0B4\uBE44\uAC8C\uC774\uC158", "\uD070 \uC81C\uBAA9 \uC804\uD658"],
43
+ promptSnippet: "\uC9C0\uC815\uD55C \uCE74\uB4DC \uC548\uC5D0 \uB192\uC774 110px\uC758 \uC5EC\uD589 \uC0C1\uC138 \uBBF8\uB9AC\uBCF4\uAE30\uB97C \uB9CC\uB4E4\uC5B4 \uC918. \uCEE4\uBC84 \uADF8\uB9BC\xB7\uD070 \uC81C\uBAA9\xB7\uB4A4\uB85C \uD654\uC0B4\uD45C\xB7\uBCF8\uBB38 \uC120 \uC138 \uAC1C\uB97C \uBC30\uCE58\uD558\uACE0 \uC9C4\uD589\uB960 p\uB97C 0~1\uB85C \uC655\uBCF5\uC2DC\uCF1C \uC2A4\uD06C\uB864 \uC555\uCD95\uC744 \uC2DC\uC5F0\uD574 \uC918. p\uC5D0 \uB530\uB77C \uD5E4\uB354 \uB192\uC774\uB294 82\u219238px, \uC81C\uBAA9 \uAE00\uAF34\uC740 23\u219213px, \uC81C\uBAA9 translate\uB294 (26,40)\u2192(24,5)px\uB85C \uBC14\uAFD4 \uC918. \uCEE4\uBC84\uB294 \uC704\uB85C 48px \uC774\uB3D9\uD558\uBA70 opacity\uAC00 1\u2192.2, \uBCF8\uBB38 \uC120\uC740 \uC704\uB85C 28px \uC774\uB3D9\uD558\uACE0 \uD5E4\uB354 \uD45C\uBA74\uC740 \uD22C\uBA85\uC5D0\uC11C \uD14C\uB9C8 \uD45C\uBA74\uC73C\uB85C \uCC44\uC6CC\uC838 \uC918. \uC0AC\uC804\uC5D0\uC11C\uB294 8\uCD08 \uB3D9\uC548 0\u21921\u21920\uC744 \uC790\uB3D9 \uBC18\uBCF5\uD558\uACE0 \uD074\uB9AD\xB7Enter\xB7Space\uB294 \uC774\uC804 \uC7AC\uC0DD\uC744 \uCDE8\uC18C\uD55C \uB4A4 \uCC98\uC74C\uBD80\uD130 \uD55C \uBC88\uB9CC \uB2E4\uC2DC \uC2DC\uC791\uD574 \uC918. \uC2E4\uC81C \uC2A4\uD06C\uB864\uBC14\uB098 range \uC785\uB825 \uC5C6\uC774 \uD6A8\uACFC\uB97C \uBCF4\uC5EC \uC8FC\uB294 \uC9C4\uD589\uB960 \uC2DC\uBBAC\uB808\uC774\uC158\uC774\uBA70 \uC2E4\uC81C \uD398\uC774\uC9C0 \uC2A4\uD06C\uB864 \uAC10\uC9C0\xB7\uB4A4\uB85C \uC774\uB3D9\uC740 \uC5C6\uC5B4. \uCE74\uB4DC \uACBD\uACC4\xB7\uC0C1\uB2E8 \uB3C4\uAD6C \uC5EC\uBC31\xB7\uB77C\uC774\uD2B8/\uB2E4\uD06C\xB7\uBAA8\uBC14\uC77C\xB7\uD3EC\uCEE4\uC2A4 \uC724\uACFD\uC744 \uC720\uC9C0\uD558\uACE0 \uBAA8\uC158 \uAC10\uC18C\uC5D0\uC11C\uB294 \uC790\uB3D9 \uC6C0\uC9C1\uC784\uACFC \uC804\uD658\uC744 \uC5C6\uC560 \uC918."
44
+ },
45
+ {
46
+ id: "rich-hover-preview",
47
+ domain: "ui",
48
+ category: "card",
49
+ titleKo: "\uB9AC\uCE58 \uD638\uBC84 \uD504\uB9AC\uBDF0",
50
+ titleEn: "Rich Hover Preview",
51
+ summary: "\uC791\uC131\uC790 \uC774\uB984\uC5D0 \uD638\uBC84\xB7\uD3EC\uCEE4\uC2A4\uD558\uAC70\uB098 \uB204\uB974\uBA74 \uBC30\uB108\xB7\uC544\uBC14\uD0C0\xB7\uC18C\uAC1C\uB97C \uB2F4\uC740 \uD504\uB85C\uD544 \uBBF8\uB9AC\uBCF4\uAE30\uAC00 \uB098\uD0C0\uB0A8",
52
+ vibeTag: "\uC774\uB3D9\uD558\uAE30 \uC804\uC5D0 \uB0B4\uC6A9\uC744 \uC0B4\uC9DD \uB4E4\uC5EC\uB2E4\uBCF4\uB294",
53
+ vibeKeywords: ["\uD638\uBC84 \uCE74\uB4DC", "\uD504\uB85C\uD544 \uBBF8\uB9AC\uBCF4\uAE30", "\uB9C1\uD06C \uD504\uB9AC\uBDF0", "\uB9AC\uCE58 \uD234\uD301"],
54
+ promptSnippet: "\uC9C0\uC815\uD55C \uC601\uC5ED\uC5D0 \uB9CC\uB4E0 \uC0AC\uB78C \uB77C\uBCA8\uACFC \uC791\uC131\uC790 \uC774\uB984 button\uC744 \uB450\uACE0, \uADF8 \uC544\uB798\uC5D0 \uD504\uB85C\uD544 \uBBF8\uB9AC\uBCF4\uAE30 \uCE74\uB4DC\uB97C \uBC30\uCE58\uD574 \uC918. \uCE74\uB4DC\uB294 \uADF8\uB77C\uB370\uC774\uC158 \uBC30\uB108, \uACB9\uCCD0\uC9C4 \uC6D0\uD615 \uC544\uBC14\uD0C0, \uC774\uB984, \uC9C1\uBB34, \uD55C \uC904 \uC18C\uAC1C\uB97C \uB2F4\uC544 \uC918. \uC774\uB984 \uD638\uBC84\xB7\uD0A4\uBCF4\uB4DC \uD3EC\uCEE4\uC2A4\uC5D0\uC11C \uC5F4\uACE0 \uD074\uB9AD\xB7\uD130\uCE58\uB294 \uC5F4\uAE30/\uB2EB\uAE30\uB97C \uD1A0\uAE00\uD574 \uC918. \uD3EC\uC778\uD130\uAC00 \uC774\uB984\uC5D0\uC11C \uBBF8\uB9AC\uBCF4\uAE30 \uCE74\uB4DC\uB85C \uC774\uB3D9\uD574\uB3C4 \uC720\uC9C0\uD558\uACE0 \uC804\uCCB4 \uC601\uC5ED \uC774\uD0C8\uC774\uB098 \uC678\uBD80\uB85C \uD3EC\uCEE4\uC2A4\uAC00 \uC774\uB3D9\uD558\uBA74 \uB2EB\uC544 \uC918. \uB2EB\uD78C \uCE74\uB4DC\uB294 hidden\uC73C\uB85C \uAC10\uCD94\uBA70 button\uC758 aria-expanded\uB97C \uB9DE\uCDB0 \uC918. 200ms opacity 0\xB7\uC544\uB798 5px\uC5D0\uC11C \uC6D0\uC704\uCE58\uB85C \uB4F1\uC7A5\uD574 \uC918. \uC0AC\uC6A9\uC790 \uC785\uB825 \uC804\uC5D0\uB294 \uB2EB\uD78C \uC0C1\uD0DC\uB97C \uC720\uC9C0\uD558\uACE0 \uC790\uB3D9\uC73C\uB85C \uC5F4\uAC70\uB098 \uC2E4\uC81C \uD3EC\uCEE4\uC2A4\uB97C \uC774\uB3D9\uD558\uC9C0 \uC54A\uC544. \uC2E4\uC81C \uD504\uB85C\uD544 \uC870\uD68C\xB7\uC678\uBD80 \uB9C1\uD06C\xB7\uD314\uB85C\uC6B0\xB7\uC11C\uBC84 \uD638\uCD9C\uC740 \uC5C6\uC5B4. \uB77C\uC774\uD2B8/\uB2E4\uD06C \uD45C\uBA74\xB7\uBB38\uC790 \uB300\uBE44\uC640 \uC881\uC740 \uD3ED\xB7\uD3EC\uCEE4\uC2A4 \uC724\uACFD\xB7\uBAA8\uC158 \uAC10\uC18C\uB97C \uC9C0\uC6D0\uD574 \uC918."
55
+ },
56
+ {
57
+ id: "inline-edit-field",
58
+ domain: "ui",
59
+ category: "control",
60
+ titleKo: "\uC81C\uC790\uB9AC \uD3B8\uC9D1 \uD544\uB4DC",
61
+ titleEn: "Inline Edit Field",
62
+ summary: "\uD504\uB85C\uC81D\uD2B8 \uC774\uB984\uC744 \uB204\uB974\uBA74 \uAC19\uC740 \uC790\uB9AC\uC758 \uC785\uB825\uCC3D\uC73C\uB85C \uBC14\uB00C\uACE0 \uC800\uC7A5\xB7\uCDE8\uC18C \uD6C4 \uD14D\uC2A4\uD2B8\uB85C \uB3CC\uC544\uC624\uB294 \uD750\uB984",
63
+ vibeTag: "\uD654\uBA74\uC744 \uB5A0\uB098\uC9C0 \uC54A\uACE0 \uBC14\uB85C \uACE0\uCE58\uB294",
64
+ vibeKeywords: ["\uC778\uB77C\uC778 \uD3B8\uC9D1", "\uC81C\uC790\uB9AC \uC218\uC815", "\uC774\uB984 \uBCC0\uACBD", "\uD3B8\uC9D1 \uC800\uC7A5 \uCDE8\uC18C"],
65
+ promptSnippet: "\uC9C0\uC815\uD55C \uCE74\uB4DC\uC5D0 \uD504\uB85C\uC81D\uD2B8 \uC774\uB984 \uB77C\uBCA8\uACFC \uC774\uB984\xB7\uC5F0\uD544 \uC544\uC774\uCF58\uC744 \uB2F4\uC740 \uD3B8\uC9D1 button\uC744 \uB9CC\uB4E4\uC5B4 \uC918. \uCD08\uAE30 \uC774\uB984\uC740 \uC0C8\uB85C\uC6B4 \uD504\uB85C\uC81D\uD2B8\uC774\uBA70 \uB204\uB974\uBA74 \uAC19\uC740 \uC790\uB9AC\uC5D0 \uC785\uB825\uCC3D\xB7\uC800\uC7A5\xB7\uCDE8\uC18C \uBC84\uD2BC\uC744 \uBCF4\uC5EC \uC918. \uC2E4\uC81C \uC785\uB825\uAC12\uC744 \uC784\uC2DC \uC0C1\uD0DC\uB85C \uAD00\uB9AC\uD558\uACE0 \uC800\uC7A5 \uBC84\uD2BC\uC774\uB098 Enter\uB294 \uC55E\uB4A4 \uACF5\uBC31\uC744 \uC81C\uAC70\uD55C \uC774\uB984\uC744 \uB85C\uCEEC \uC0C1\uD0DC\uC5D0 \uC800\uC7A5\uD55C \uB4A4 \uC77D\uAE30 \uBAA8\uB4DC\uB85C \uB3CC\uC544\uAC00 \uC918. \uACF5\uBC31\uBFD0\uC774\uBA74 \uC800\uC7A5\uC744 \uBE44\uD65C\uC131\uD654\uD558\uACE0 \uD578\uB4E4\uB7EC\uC5D0\uC11C\uB3C4 \uCC28\uB2E8\uD574 \uC918. \uCDE8\uC18C\xB7Escape\uB294 \uC784\uC2DC\uAC12\uC744 \uBC84\uB9AC\uACE0 \uAE30\uC874 \uC774\uB984\uC744 \uC720\uC9C0\uD574 \uC918. \uC790\uB3D9\uC73C\uB85C \uD3B8\uC9D1 \uBAA8\uB4DC\uC5D0 \uB4E4\uC5B4\uAC00\uAC70\uB098 \uAC12\uC744 \uBCC0\uACBD\uD558\uC9C0 \uB9D0\uACE0 \uC0AC\uC6A9\uC790\uAC00 \uC785\uB825\uD55C \uC784\uC2DC\uAC12\uACFC \uC800\uC7A5\uD55C \uC774\uB984\uC744 \uC720\uC9C0\uD574 \uC918. \uC11C\uBC84 \uC800\uC7A5\xB7\uC601\uC18D \uC800\uC7A5\xB7\uAC00\uC9DC \uC694\uCCAD \uC131\uACF5 \uC548\uB0B4\uB294 \uC5C6\uC5B4. \uB77C\uC774\uD2B8/\uB2E4\uD06C \uB300\uBE44, \uC881\uC740 \uD3ED\uC5D0\uC11C \uC785\uB825\uACFC \uBC84\uD2BC \uACBD\uACC4, \uD0A4\uBCF4\uB4DC\uC640 \uD3EC\uCEE4\uC2A4 \uC724\uACFD\xB7\uBAA8\uC158 \uAC10\uC18C\uB97C \uC9C0\uC6D0\uD574 \uC918."
66
+ }
67
+ ];
68
+
10
69
  // ../../packages/catalog/src/additions/hover.ts
11
70
  var HOVER_ADDITIONS = [
12
71
  {
@@ -2900,6 +2959,7 @@ var CATEGORY_LABEL_MAP = Object.fromEntries(
2900
2959
  ].map((c) => [c.id, c.label])
2901
2960
  );
2902
2961
  var TECHNIQUES = [
2962
+ ...PATTERN_ADDITIONS,
2903
2963
  ...TACTILE_ADDITIONS,
2904
2964
  ...RETRO_ADDITIONS,
2905
2965
  ...SCIFI_ADDITIONS,
@@ -3113,7 +3173,7 @@ var TECHNIQUES = [
3113
3173
  titleKo: "\uC2A4\uD06C\uB7A8\uBE14 \uD14D\uC2A4\uD2B8 \uB514\uCF54\uB4DC",
3114
3174
  titleEn: "Scramble / Cipher Text Decode",
3115
3175
  summary: "\uBB34\uC791\uC704 \uAE30\uD638\uB4E4\uC774 \uBE60\uB974\uAC8C \uD68C\uC804\uD558\uB2E4\uAC00 \uC6D0\uB798 \uBB38\uC7A5\uC73C\uB85C \uB9DE\uCDB0\uC9D0",
3116
- promptSnippet: "\uC9C0\uC815\uD55C \uD14D\uC2A4\uD2B8\uAC00 \uCC98\uC74C \uD45C\uC2DC\uB418\uAC70\uB098 \uB9C8\uC6B0\uC2A4 \uC9C4\uC785\xB7\uD074\uB9AD\uD560 \uB54C Scramble Decode\uB97C \uC7AC\uC0DD\uD574 \uC918. 35ms\uB9C8\uB2E4 \uBB34\uC791\uC704 \uAE30\uD638(!<>-_\\\\/[]{}\u2014=+*^?#01)\uB97C \uAC31\uC2E0\uD558\uACE0, \uACF5\uBC31\uC740 \uC720\uC9C0\uD574 \uC918. frame > index * 2\uC778 \uBB38\uC790\uBD80\uD130 \uC6D0\uBB38\uC73C\uB85C \uACE0\uC815\uD574 \uC67C\uCABD\uC5D0\uC11C \uC624\uB978\uCABD\uC73C\uB85C \uD574\uB3C5\uD558\uACE0, frame\uC774 \uC804\uCCB4 \uAE00\uC790 \uC218\uC758 2\uBC30\uB97C \uB118\uC73C\uBA74 \uD0C0\uC774\uBA38\uB97C \uBA48\uCDB0 \uC918. \uC7AC\uC2E4\uD589 \uC804\uC758 \uD0C0\uC774\uBA38\uB294 \uC815\uB9AC\uD574 \uC918."
3176
+ promptSnippet: "\uC9C0\uC815\uD55C \uD14D\uC2A4\uD2B8\uAC00 \uCC98\uC74C \uD45C\uC2DC\uB418\uAC70\uB098 \uD074\uB9AD\uD560 \uB54C Scramble Decode\uB97C \uC7AC\uC0DD\uD574 \uC918. 35ms\uB9C8\uB2E4 \uBB34\uC791\uC704 \uAE30\uD638(!<>-_\\\\/[]{}\u2014=+*^?#01)\uB97C \uAC31\uC2E0\uD558\uACE0, \uACF5\uBC31\uC740 \uC720\uC9C0\uD574 \uC918. frame > index * 2\uC778 \uBB38\uC790\uBD80\uD130 \uC6D0\uBB38\uC73C\uB85C \uACE0\uC815\uD574 \uC67C\uCABD\uC5D0\uC11C \uC624\uB978\uCABD\uC73C\uB85C \uD574\uB3C5\uD558\uACE0, frame\uC774 \uC804\uCCB4 \uAE00\uC790 \uC218\uC758 2\uBC30\uB97C \uB118\uC73C\uBA74 \uD0C0\uC774\uBA38\uB97C \uBA48\uCDB0 \uC918. \uC7AC\uC2E4\uD589 \uC804\uC758 \uD0C0\uC774\uBA38\uB294 \uC815\uB9AC\uD574 \uC918."
3117
3177
  },
3118
3178
  {
3119
3179
  id: "gradient-flow-text",
@@ -3613,6 +3673,50 @@ var TECHNIQUES = [
3613
3673
  summary: "\uC911\uC559 \uAD6C\uC2AC\uB4E4\uC740 \uC815\uC9C0\uD55C \uCC44 \uC88C\uCE21 \uB05D \uAD6C\uC2AC\uACFC \uC6B0\uCE21 \uB05D \uAD6C\uC2AC\uC774 \uAD50\uB300\uB85C \uBD80\uB52A\uD788\uBA70 \uD280\uC5B4 \uC624\uB974\uB294 \uBB3C\uB9AC \uC9C4\uC790 \uBAA8\uC158",
3614
3674
  promptSnippet: "\uC9C0\uC815\uD55C \uADF8\uB798\uD53D\uC5D0 \uC0C1\uB2E8 \uC9C0\uC9C0\uB300\uC640 \uAD6C\uC2AC 5\uAC1C\uB97C \uB9E4\uB2EC\uACE0 transform-origin: top center\uC778 Newton's Cradle \uC2DC\uC5F0\uC744 \uAD6C\uD604\uD574 \uC918. \uCD08\uAE30 \uC67C\uCABD \uB05D \uAD6C\uC2AC\uB9CC +34deg\uB85C \uAE30\uC6B8\uC774\uACE0 320ms\uB9C8\uB2E4 [\uC67C\uCABD +34deg\u2192\uBAA8\uB450 0deg\u2192\uC624\uB978\uCABD -34deg\u2192\uBAA8\uB450 0deg]\uC758 4\uB2E8\uACC4\uB97C \uC21C\uD658\uD574 \uC918. \uC911\uC559 3\uAC1C\uB294 \uACE0\uC815\uD558\uACE0 \uD074\uB9AD\uD574\uB3C4 \uD55C \uB2E8\uACC4 \uC9C4\uD589\uD574 \uC918. \uD68C\uC804\uC740 0.3\uCD08, \uBC14\uAE65\uCABD \uC2A4\uC719\uC740 cubic-bezier(0.215,0.61,0.355,1), \uBCF5\uADC0\uB294 cubic-bezier(0.55,0.055,0.675,0.19)\uB97C \uC0AC\uC6A9\uD574 \uC918. \uC2E4\uC81C \uBB3C\uB9AC \uC2DC\uBBAC\uB808\uC774\uC158\uC774 \uC544\uB2CC \uC0C1\uD0DC \uAE30\uBC18 \uC2DC\uC5F0\uC774\uC57C."
3615
3675
  },
3676
+ {
3677
+ id: "mg-dice-roll-3d",
3678
+ domain: "motion",
3679
+ category: "physics",
3680
+ vibeTag: "\uAD74\uB7EC\uAC00\uBA70 \uD68C\uC804\uD558\uB2E4 \uD55C \uBA74\uC73C\uB85C \uCC29\uC9C0\uD558\uB294 3D \uC8FC\uC0AC\uC704",
3681
+ vibeKeywords: ["\uC8FC\uC0AC\uC704 \uB358\uC9C0\uAE30", "\uC8FC\uC0AC\uC704 \uAD74\uB9AC\uAE30", "3D \uC8FC\uC0AC\uC704", "\uB2E4\uC774\uC2A4 \uB864", "\uC8FC\uC0AC\uC704 \uBB3C\uB9AC"],
3682
+ titleKo: "3D \uC8FC\uC0AC\uC704 \uAD74\uB9AC\uAE30",
3683
+ titleEn: "3D Dice Roll Physics",
3684
+ summary: "\uD074\uB9AD \uC2DC 3D \uACF5\uAC04\uC5D0\uC11C \uD140\uBE14\uB9C1 \uD68C\uC804\uACFC \uBC14\uC6B4\uC2A4\uB97C \uAC70\uCCD0 \uC784\uC758\uC758 \uB208\uAE08\uC73C\uB85C \uC548\uCC29\uD558\uB294 \uC8FC\uC0AC\uC704",
3685
+ promptSnippet: "\uC9C0\uC815\uD55C \uC601\uC5ED\uC5D0 \uD074\uB9AD\uC73C\uB85C \uAD74\uB9AC\uB294 CSS 3D \uC8FC\uC0AC\uC704\uB97C \uAD6C\uD604\uD574 \uC918. perspective: 800px \uBB34\uB300\uC5D0 64\xD764px \uD050\uBE0C\uB97C \uB450\uACE0, 1~6\uAC1C\uC758 \uC810\uC774 \uC788\uB294 \uC5EC\uC12F \uBA74\uC744 translateZ(32px)\uC640 rotateX/Y\uB85C \uC870\uB9BD\uD558\uBA70 preserve-3d\uB97C \uC720\uC9C0\uD574 \uC918. \uAE30\uBCF8 \uBB34\uB300 \uAC01\uB3C4\uB294 rotateX(-40deg) rotateY(26deg), \uCD08\uAE30 \uACB0\uACFC\uB294 6\uC774\uC57C. \uBCC4\uB3C4 \uB358\uC9C0\uAE30 \uBC84\uD2BC \uC5C6\uC774 \uC7A5\uBA74 \uC804\uCCB4\uB97C \uD0A4\uBCF4\uB4DC\uB85C\uB3C4 \uB204\uB97C \uC218 \uC788\uB294 \uBC84\uD2BC\uC73C\uB85C \uB9CC\uB4E4\uACE0, \uD074\uB9AD \uC2DC 1~6 \uC911 \uC784\uC758 \uAC12\uC744 \uBF51\uB418 \uC9C1\uC804\uACFC \uAC19\uC73C\uBA74 (\uC9C1\uC804 \uAC12 % 6) + 1\uB85C \uBC14\uAFD4 \uC918. \uACB0\uACFC \uBC30\uC9C0\uB294 \uC2DC\uC791 \uC989\uC2DC \uAC31\uC2E0\uD558\uACE0, \uC120\uD0DD\uD55C \uAC12\uC758 \uBAA9\uD45C \uD68C\uC804\uAC01\uC5D0 \uB9E4\uD68C X\uCD95 720deg\xB7Y\uCD95 1080deg\uB97C \uB204\uC801\uD574 0.85\uCD08 cubic-bezier(0.22, 1, 0.36, 1)\uB85C \uD68C\uC804\uC2DC\uCF1C \uC918. \uAC19\uC740 \uC2DC\uAC04 \uB3D9\uC548 \uCD5C\uB300 translateY(-44px) \uB3C4\uC57D, \uCC29\uC9C0 \uC555\uCD95, -8px \uC7AC\uB3C4\uC57D \uD6C4 \uBCF5\uADC0\uB97C \uC5F0\uCD9C\uD558\uACE0, \uAD6C\uB974\uB294 \uB3D9\uC548 \uBC14\uB2E5 \uADF8\uB9BC\uC790\uB294 \uC791\uACE0 \uD750\uB9AC\uAC8C \uD588\uB2E4\uAC00 \uBCF5\uC6D0\uD574 \uC918. 850ms \uB3D9\uC548 \uCD94\uAC00 \uC785\uB825\uC744 \uB9C9\uACE0, \uCC29\uC9C0 \uD6C4 \uACB0\uACFC \uBC30\uC9C0\uB9CC 300ms \uD655\uB300\uD588\uB2E4\uAC00 \uC6D0\uB798 \uD06C\uAE30\uB85C \uB3CC\uB824 \uC918. \uBAA8\uC158 \uAC10\uC18C \uC124\uC815\uC5D0\uC11C\uB294 CSS \uC804\uD658\xB7\uD0A4\uD504\uB808\uC784\uC744 \uC0DD\uB7B5\uD558\uB418 \uC785\uB825 \uC7A0\uAE08\uACFC \uBC30\uC9C0 \uD0C0\uC774\uBA38\uB294 \uC720\uC9C0\uD574 \uC918. \uC5B8\uB9C8\uC6B4\uD2B8 \uC2DC \uD0C0\uC774\uBA38\uB97C \uD574\uC81C\uD574 \uC918."
3686
+ },
3687
+ {
3688
+ id: "mg-marble-board",
3689
+ domain: "motion",
3690
+ category: "physics",
3691
+ vibeTag: "\uAC8C\uC774\uC9C0 \uC30D\uC8FC\uC0AC\uC704, \uB9D0 \uC774\uB3D9, \uB79C\uB4DC\uB9C8\uD06C \uAC74\uC124\uC774 \uC5F0\uC1C4 \uBC1C\uB3D9\uD558\uB294 \uBBF8\uB2C8 \uBCF4\uB4DC",
3692
+ vibeKeywords: ["\uBCF4\uB4DC\uAC8C\uC784", "\uC8FC\uC0AC\uC704 \uAC8C\uC784", "\uC30D\uC8FC\uC0AC\uC704", "\uB354\uBE14", "\uB79C\uB4DC\uB9C8\uD06C", "\uC8FC\uC0AC\uC704 \uCEE8\uD2B8\uB864", "\uCC2C\uC2A4 \uCE74\uB4DC"],
3693
+ titleKo: "\uBCF4\uB4DC\uAC8C\uC784 \uC8FC\uC0AC\uC704 & \uD0C0\uC77C \uC778\uD130\uB799\uC158",
3694
+ titleEn: "Board Game Dice & Tile Micro-interactions",
3695
+ summary: "\uAC8C\uC774\uC9C0\uBC14 \uD0C0\uC774\uBC0D\uC73C\uB85C \uC30D\uC8FC\uC0AC\uC704\uB97C \uAD74\uB824 \uB354\uBE14 \uC5F0\uCD9C, \uB9D0\uC758 \uD0C0\uC77C \uC810\uD504, \uB79C\uB4DC\uB9C8\uD06C \uC2A4\uD0EC\uD504\uC640 \uCF54\uC778 \uBD84\uC218\uAC00 \uC5F0\uC1C4 \uBC1C\uB3D9\uD558\uB294 \uBBF8\uB2C8 \uBCF4\uB4DC\uAC8C\uC784",
3696
+ promptSnippet: "\uCE90\uC8FC\uC5BC \uBCF4\uB4DC\uAC8C\uC784\uC758 \uC8FC\uC0AC\uC704\u2192\uB9D0 \uC774\uB3D9\u2192\uB3C4\uCC29 \uD6A8\uACFC\uB97C \uAD6C\uD604\uD574 \uC918. 4\uC5F4\xD73\uD589 \uC678\uACFD\uC5D0 \uC2DC\uC791\xB7\uC11C\uC6B8\xB7\uB3C4\uCFC4\xB7\uCC2C\uC2A4\xB7\uD30C\uB9AC\xB7\uBB34\uC778\uB3C4\xB7\uB274\uC695\xB7\uAD6D\uC138\uCCAD\xB7\uB7F0\uB358\xB7\uC5EC\uD589 \uC21C\uC11C\uC758 \uC21C\uD658 \uD0C0\uC77C 10\uAC1C\uB97C \uB193\uACE0, \uB9D0\uC740 \uC2DC\uC791 \uCE78, \uC30D\uC8FC\uC0AC\uC704\uB294 3\xB73, \uB3C4\uC2DC\uB294 \uBBF8\uAC74\uC124 \uC0C1\uD0DC\uB85C \uC2DC\uC791\uD574 \uC918. \uBCF4\uB4DC \uC804\uCCB4\uB97C \uD074\uB9AD\uD558\uBA74 \uC774\uC804 \uBC30\uB108\xB7\uB3C4\uCC29 \uD6A8\uACFC\uB97C \uC9C0\uC6B0\uACE0, phase=(Date.now()%1400)/1400, power=round(20+75*abs(sin(phase*PI)))\uB85C \uD30C\uC6CC\uB97C \uC815\uD574 \uC918. \uB300\uAE30\xB7\uC774\uB3D9 \uC911 \uAC8C\uC774\uC9C0\uB294 65%\uB85C \uACE0\uC815\uD558\uACE0 \uAD6C\uB974\uB294 \uB3D9\uC548\uB9CC \uC774\uBC88 \uD30C\uC6CC\uB97C \uD45C\uC2DC\uD574 \uC918. power>70\uC774\uBA74 \uAC01 \uC8FC\uC0AC\uC704\uB97C 4~6, power<35\uC774\uBA74 1~3\uC5D0\uC11C \uBF51\uACE0, \uADF8 \uC678\uC5D0\uB294 55% \uD655\uB960\uB85C \uAC19\uC740 1~6 \uAC12\uC744 \uB450 \uAC1C\uC5D0 \uC801\uC6A9\uD558\uBA70 \uB098\uBA38\uC9C0\uB294 \uAC01\uAC01 1~6\uC744 \uBF51\uC544 \uC918. preserve-3d\uC778 30px \uC8FC\uC0AC\uC704 \uB450 \uAC1C\uB97C perspective: 500px, rotateX(-40deg) rotateY(26deg) \uBB34\uB300\uC5D0\uC11C 750ms \uB3D9\uC548 \uB204\uC801 \uD68C\uC804\xB7\uB3C4\uC57D\xB7\uCC29\uC9C0\uC2DC\uCF1C \uC918. \uC774\uD6C4 \uAC19\uC740 \uB208\uAE08\uC774\uBA74 DOUBLE \uBC30\uB108\uB97C \uB744\uC6B0\uACE0, \uB9D0\uC740 \uD569\uACC4\uB9CC\uD07C 160ms\uB9C8\uB2E4 \uD55C \uCE78\uC529 \uC544\uD06C \uC810\uD504\uB85C \uC774\uB3D9\uD558\uBA70 \uB05D \uCE78\uC5D0\uC11C \uCC98\uC74C \uCE78\uC73C\uB85C \uC21C\uD658\uD574 \uC918. \uAD74\uB9BC\xB7\uC774\uB3D9 \uC911 \uCD94\uAC00 \uC785\uB825\uC744 \uB9C9\uC544 \uC918. \uB3C4\uC2DC \uB3C4\uCC29 \uC2DC \uC778\uC218 \uC2A4\uD0EC\uD504\uB97C \uB744\uC6B0\uACE0 \uD574\uB2F9 \uB3C4\uC2DC \uAC74\uBB3C\uC744 \uC9D1\u2192\uBE4C\uB529\u2192\uC131\u2192\uC9D1 \uC21C\uC11C\uB85C \uBC29\uBB38\uB9C8\uB2E4 \uBC14\uAFB8\uBA70 \uB2E4\uC74C \uAD74\uB9BC\uC5D0\uB3C4 \uBCF4\uC874\uD574 \uC918. \uCC2C\uC2A4\uC5D0\uC11C\uB294 3D \uCE74\uB4DC \uB4A4\uC9D1\uAE30, \uAD6D\uC138\uCCAD\uC5D0\uC11C\uB294 \uCF54\uC778 5\uAC1C\uC758 \uBD84\uC218 \uD6A8\uACFC\uB97C \uC7AC\uC0DD\uD574 \uC918. \uB354\uBE14\xB7\uC2A4\uD0EC\uD504\xB7\uCC2C\uC2A4 \uD45C\uC2DC\uC640 \uCF54\uC778 \uC694\uC18C\uB294 \uB2E4\uC74C \uAD74\uB9BC \uC2DC\uC791 \uC2DC \uC9C0\uC6CC \uC918. \uBB34\uC778\uB3C4\xB7\uC5EC\uD589\uC740 \uC774\uB984\uC774 \uC788\uB294 \uC815\uC9C0 \uCE78\uC774\uBA70 \uBCC4\uB3C4 \uD134\xB7\uC774\uB3D9 \uADDC\uCE59\uC740 \uC5C6\uC5B4. \uC2E4\uC81C \uC7AC\uD654\xB7\uC18C\uC720\uAD8C \uAC70\uB798\uAC00 \uC5C6\uB294 \uC0C1\uD0DC \uAE30\uBC18 \uC2DC\uC5F0\uC73C\uB85C \uB9CC\uB4E4\uACE0 \uC5B8\uB9C8\uC6B4\uD2B8 \uC2DC \uC9C0\uC5F0\xB7\uC774\uB3D9 \uD0C0\uC774\uBA38\uB97C \uC815\uB9AC\uD574 \uC918."
3697
+ },
3698
+ {
3699
+ id: "mg-treasure-chest-3d",
3700
+ domain: "motion",
3701
+ category: "physics",
3702
+ vibeTag: "\uB69C\uAED1\uC774 \uC5F4\uB9AC\uBA70 \uD669\uAE08\uBE5B \uBE54\uACFC \uBCF4\uC11D\uC774 \uC19F\uC544\uC624\uB974\uB294 3D \uBCF4\uBB3C\uC0C1\uC790",
3703
+ vibeKeywords: ["\uBCF4\uBB3C\uC0C1\uC790", "\uC0C1\uC790 \uC5F4\uAE30", "\uB8E8\uD2B8 \uBC15\uC2A4", "\uAC00\uCC60 \uC5F0\uCD9C", "3D \uC0C1\uC790", "\uD669\uAE08\uBE5B \uBE54", "\uBCF4\uC11D \uD31D\uC5C5"],
3704
+ titleKo: "3D \uBCF4\uBB3C\uC0C1\uC790 \uB8E8\uD305 \uC5F0\uCD9C",
3705
+ titleEn: "3D Treasure Chest Loot Open",
3706
+ summary: "\uD074\uB9AD \uC2DC \uB4A4\uCABD \uD78C\uC9C0\uB85C \uB69C\uAED1\uC774 \uC5F4\uB9AC\uACE0 \uD669\uAE08\uBE5B \uAD11\uC120\uACFC \uBD80\uC720\uD558\uB294 \uBCF4\uC11D\uC774 \uB098\uD0C0\uB098\uBA70, \uB2E4\uC2DC \uD074\uB9AD\uD558\uBA74 \uB2EB\uD788\uB294 \uAC8C\uC784 \uC5F0\uCD9C",
3707
+ promptSnippet: "\uD074\uB9AD\uC73C\uB85C \uC5F4\uACE0 \uB2EB\uB294 CSS 3D \uBCF4\uBB3C\uC0C1\uC790 \uB8E8\uD305 \uC5F0\uCD9C\uC744 \uAD6C\uD604\uD574 \uC918. perspective: 700px \uBB34\uB300\uC5D0 rotateX(-20deg) rotateY(-24deg)\uB85C \uAE30\uC6B8\uC778 \uBAA9\uC7AC\xB7\uAE08\uC18D \uC0C1\uC790\uB97C \uB9CC\uB4E4\uACE0 preserve-3d\uB97C \uC720\uC9C0\uD574 \uC918. \uBAB8\uCCB4\uC640 \uB69C\uAED1\uC758 \uC678\uBCBD\uBFD0 \uC544\uB2C8\uB77C \uC548\uCABD \uBCBD\xB7\uD14C\uB450\uB9AC\xB7\uB69C\uAED1 \uC548\uAC10\uACFC \uBCF4\uBB3C\uC774 \uB193\uC778 \uB0B4\uBD80 \uBC14\uB2E5\uB3C4 \uC870\uB9BD\uD574 \uC5F4\uB9B0 \uC0C1\uD0DC\uC5D0\uC11C \uBE48 \uBA74\uC774 \uBCF4\uC774\uC9C0 \uC54A\uAC8C \uD574 \uC918. \uCD08\uAE30\uC5D0\uB294 \uB2EB\uD78C \uC0C1\uD0DC\uC774\uBA70, \uC7A5\uBA74 \uC804\uCCB4\uB97C \uD0A4\uBCF4\uB4DC\uB85C\uB3C4 \uB204\uB97C \uC218 \uC788\uB294 \uBC84\uD2BC\uC73C\uB85C \uB9CC\uB4E4\uC5B4 \uD074\uB9AD\uD558\uBA74 \uC989\uC2DC \uC5F4\uB9BC \uC0C1\uD0DC\uB85C \uC804\uD658\uD574 \uC918. 100\xD718px \uB69C\uAED1\uC758 \uB4A4\uCABD \uD78C\uC9C0\uB294 transform-origin: 50px 18px -30px\uC774\uACE0 rotateX(115deg)\uB85C 0.6\uCD08 cubic-bezier(0.34, 1.45, 0.64, 1) \uC804\uD658\uD574 \uC918. \uB3D9\uC2DC\uC5D0 \uC0C1\uC790\uB97C 0.45\uCD08 \uBC14\uC6B4\uC2A4\uC2DC\uD0A4\uACE0, \uBC29\uC0AC\uD615 conic-gradient \uD669\uAE08 \uAD11\uC120\uC740 12\uCD08 \uC8FC\uAE30\uB85C \uD68C\uC804\uC2DC\uD0A4\uBA70 \uBCF4\uB77C\uC0C9 \uBCF4\uC11D\uC740 \uC704\uB85C \uB098\uD0C0\uB098 2.2\uCD08\uC529 \uC655\uBCF5 \uBD80\uC720\uD558\uACE0 \uC791\uC740 \uAE30\uC6B8\uAE30 \uBCC0\uD654\xB7\uD6C4\uAD11\xB7\uBC18\uC9DD\uC784\uC744 \uC720\uC9C0\uD574 \uC918. \uCD5C\uCD08 500ms \uB3D9\uC548 \uCD94\uAC00 \uD074\uB9AD\uC744 \uBB34\uC2DC\uD558\uACE0 \uC774\uD6C4 \uC5F4\uB9BC \uC0C1\uD0DC\uB97C \uC720\uC9C0\uD558\uBA70, \uB2E4\uC2DC \uD074\uB9AD\uD558\uBA74 \uB2EB\uACE0 \uAD11\uC120\xB7\uBCF4\uC11D\uC744 \uC228\uACA8 \uC7AC\uC0AC\uC6A9\uD560 \uC218 \uC788\uAC8C \uD574 \uC918. \uB9E4\uBC88 \uAC19\uC740 \uBCF4\uC11D\uC744 \uBCF4\uC5EC \uC8FC\uB294 \uC2DC\uAC01 \uC2DC\uC5F0\uC774\uBA70 \uC2E4\uC81C \uC544\uC774\uD15C \uC9C0\uAE09\xB7\uBB34\uC791\uC704 \uBCF4\uC0C1 \uCD94\uCCA8\uC740 \uC5C6\uC5B4. \uC5B8\uB9C8\uC6B4\uD2B8 \uC2DC \uC5F4\uB9BC \uD0C0\uC774\uBA38\uB97C \uD574\uC81C\uD574 \uC918."
3708
+ },
3709
+ {
3710
+ id: "mg-lucky-wheel-3d",
3711
+ domain: "motion",
3712
+ category: "physics",
3713
+ vibeTag: "\uAC10\uC18D \uBB3C\uB9AC\uC640 \uD540 \uD295\uAE40\uC774 \uC0B4\uC544\uC788\uB294 \uC785\uCCB4 3D \uB7ED\uD0A4 \uD720 \uB8F0\uB81B",
3714
+ vibeKeywords: ["\uB7ED\uD0A4 \uD720", "\uB8F0\uB81B", "\uD589\uC6B4\uC758 \uBC14\uD034", "\uB3CC\uB9BC\uD310", "\uC2A4\uD540 \uD720", "\uBB3C\uB9AC \uAC10\uC18D", "\uBCF4\uC0C1 \uD68D\uB4DD"],
3715
+ titleKo: "3D \uB7ED\uD0A4 \uD720 \uB8F0\uB81B",
3716
+ titleEn: "3D Lucky Wheel Roulette",
3717
+ summary: "\uC644\uB9CC\uD558\uAC8C \uAE30\uC6B8\uC778 8\uCE78 \uD68C\uC804\uD310\uC774 \uAC10\uC18D\uD558\uBA70 \uBA48\uCD94\uACE0 \uACE0\uC815 \uD3EC\uC778\uD130 \uC544\uB798\uC758 \uBCF4\uC0C1\uC744 \uD45C\uC2DC\uD558\uB294 \uB8F0\uB81B",
3718
+ promptSnippet: "\uCE90\uC8FC\uC5BC \uAC8C\uC784\uC774\uB098 \uB9AC\uC6CC\uB4DC \uC774\uBCA4\uD2B8\uC6A9 CSS 3D \uB7ED\uD0A4 \uD720\uC744 \uAD6C\uD604\uD574 \uC918. rotateX(16deg)\uB85C \uC644\uB9CC\uD558\uAC8C \uAE30\uC6B8\uC778 \uC870\uB9BD\uCCB4 \uC548\uC5D0 \uD06C\uAE30\uAC00 \uBA85\uC2DC\uB41C \uC815\uC0AC\uAC01\uD615 display: block \uD68C\uC804\uD310\uC744 \uB450\uACE0, \uB2E4\uC774\uC544\xB7\uACE8\uB4DC\xB7\uC7AD\uD31F\xB7\uD2F0\uCF13\xB7\uBCF4\uBB3C\uC0C1\uC790\xB72\uBC30\xB7\uACBD\uD5D8\uCE58\xB7\uB7ED\uD0A4\uBC15\uC2A4 \uC21C\uC11C\uC758 45deg \uCEEC\uB7EC \uC139\uD130 8\uAC1C\uB97C \uBC30\uCE58\uD574 \uC918. 0\uBC88 \uC139\uD130 \uC911\uC2EC\uC744 \uC704\uCABD 0deg\uB85C \uC7A1\uACE0 i\uBC88 \uC911\uC2EC\uC744 i*45deg\uC5D0 \uB450\uBA70, \uC544\uC774\uCF58\uC740 rotate(i*45deg) translateY(-r) rotate(-i*45deg)\uB85C \uAC01 \uCE78 \uC911\uC559\uC5D0 \uB193\uACE0 \uC678\uACFD \uD540\uACFC \uD568\uAED8 \uAC19\uC740 \uD68C\uC804\uD310\uC5D0\uC11C \uD68C\uC804\uC2DC\uCF1C \uC918. \uCD08\uAE30 \uD68C\uC804\uC740 270deg\uB85C \uC7AD\uD31F\uC774 \uC704\uC5D0 \uC624\uAC8C \uD558\uACE0, \uC0C1\uB2E8\uC5D0\uB294 \uD68C\uC804\uD310\uACFC \uBD84\uB9AC\uB41C \uC791\uC740 \uACE0\uC815\uBD80\uC640 \uC9E7\uC740 \uD654\uC0B4\uCD09\uC744 \uB46C. \uC7A5\uBA74 \uC804\uCCB4\uB97C \uD0A4\uBCF4\uB4DC\uB85C\uB3C4 \uB204\uB97C \uC218 \uC788\uB294 \uBC84\uD2BC\uC73C\uB85C \uB9CC\uB4E4\uACE0 \uD074\uB9AD \uC2DC next=(\uC774\uC804 \uCE78+floor(random*5)+2)%8\uB85C \uB2E4\uC74C \uCE78\uC744 \uC120\uD0DD\uD574 \uC918. \uD604\uC7AC \uAC01\uB3C4\uC758 \uB098\uBA38\uC9C0\uC5D0\uC11C \uBAA9\uD45C \uB098\uBA38\uC9C0 (360-next*45)%360\uAE4C\uC9C0 \uC2DC\uACC4 \uBC29\uD5A5 \uCC28\uC774\uB97C \uACC4\uC0B0\uD558\uACE0, \uAE30\uC874 \uB204\uC801 \uAC01\uB3C4\uC5D0 1440deg\uC640 \uADF8 \uCC28\uC774\uB97C \uB354\uD574 \uC5ED\uD68C\uC804 \uC5C6\uC774 \uCD5C\uC18C 4\uBC14\uD034 \uB3CC\uB824 \uC918. 2.8\uCD08 cubic-bezier(0.12, 0.86, 0.2, 1)\uB85C \uAC10\uC18D\uC2DC\uD0A4\uACE0 \uAC19\uC740 \uC2DC\uAC04 \uB3D9\uC548 \uCD94\uAC00 \uD074\uB9AD\uC744 \uB9C9\uC544 \uC918. \uD3EC\uC778\uD130\uB294 \uC2DC\uAC04 \uAE30\uBC18 \uD0A4\uD504\uB808\uC784\uC73C\uB85C \uD295\uAE40 \uAC04\uACA9\uC774 \uB298\uACE0 \uC9C4\uD3ED\uC774 \uC904\uB2E4\uAC00 \uC815\uC9C0\uD558\uAC8C \uD574 \uC918. 2800ms \uD6C4 \uD3EC\uC778\uD130\uC640 \uC815\uB82C\uB41C \uCE78\uC758 \uB2F9\uCCA8 \uBC30\uC9C0\uB97C 3\uCD08\uAC04 \uD45C\uC2DC\uD558\uACE0 \uC7AD\uD31F\uC5D0\uB9CC \uD384\uC2A4\uB97C \uC801\uC6A9\uD574 \uC918. \uBC30\uC9C0\uAC00 \uC0AC\uB77C\uC838\uB3C4 \uD68C\uC804\uAC01\uACFC \uB9C8\uC9C0\uB9C9 \uCE78\uC740 \uC720\uC9C0\uD558\uACE0 \uB2E4\uC74C \uD074\uB9AD\uC73C\uB85C \uB2E4\uC2DC \uB3CC\uB9B4 \uC218 \uC788\uAC8C \uD574 \uC918. \uBAA8\uC158 \uAC10\uC18C \uC124\uC815\uC5D0\uC11C\uB294 CSS \uC804\uD658\xB7\uBC18\uBCF5 \uD6A8\uACFC\uB97C \uC0DD\uB7B5\uD558\uB418 \uACB0\uACFC \uD0C0\uC774\uBA38\uB294 \uC720\uC9C0\uD558\uBA70, \uC5B8\uB9C8\uC6B4\uD2B8 \uC2DC \uD0C0\uC774\uBA38\uB97C \uD574\uC81C\uD574 \uC918."
3719
+ },
3616
3720
  /* =====================================================================
3617
3721
  * DOMAIN 3: 레이아웃 (20종)
3618
3722
  * ===================================================================== */
@@ -6125,9 +6229,44 @@ var EN_VFX_TECHNIQUES = {
6125
6229
  }
6126
6230
  };
6127
6231
 
6232
+ // ../../packages/catalog/src/translations/additions/patterns.ts
6233
+ var EN_PATTERN_TECHNIQUES = {
6234
+ "zoom-lightbox-gallery": {
6235
+ summary: "Open an image viewer inside the card, then zoom, drag, or move between three images.",
6236
+ vibeTag: "From tiny thumbnails to an immersive image view",
6237
+ vibeKeywords: ["lightbox", "image zoom", "photo gallery", "product images"],
6238
+ promptSnippet: "Build a gallery with three named SVG landscape thumbnails: Coast, Dunes, and Peaks. Click, Enter, or Space opens a larger image viewer inside the same card with a 380ms cubic-bezier(.2,.8,.2,1) entrance from scale .78 and opacity .3 to full size and opacity. On opening, focus the Previous image button. Previous/next buttons and Left/Right keys cycle through the images. A zoom button toggles center scale 1/1.65. Changing images resets zoom and pan. Capture the primary pointer to pan a zoomed image within \xB135px horizontally and \xB120px vertically. Without zoom, a horizontal swipe exceeding 35px selects the next/previous image. Clear drag references on cancellation or lost capture. Close and Escape restore the thumbnail gallery; Escape returns focus to the first thumbnail. This is an in-card viewer, not a page modal, and has no pinch zoom or external image requests. Do not open or change images automatically; retain the viewer state chosen by the user. Support light/dark themes, narrow screens, focus outlines, and reduced motion."
6239
+ },
6240
+ "selection-bubble-toolbar": {
6241
+ summary: "A small formatting bubble appears above selected text and applies bold to the selected substring.",
6242
+ vibeTag: "The tools appear right above your selection",
6243
+ vibeKeywords: ["text selection", "bubble toolbar", "floating formatting", "document editor"],
6244
+ promptSnippet: "Read actual browser text selection inside the specified paragraph and show a bubble with one Bold button above the selected range. Handle pointer selection end and keyboard selection changes; hide for empty or outside selection. Clamp its horizontal center within 25\u201375% of the paragraph width and keep it inside the top boundary. Enter over 180ms from 5px below and opacity zero, with a small triangular tail. Prevent pointer defaults on the toolbar button from clearing selection. Apply bold only to the selected substring, then hide the bubble. Keep the toolbar hidden until real text is selected; do not simulate selection or formatting automatically. Do not add link/comment actions or a full editor integration. Support light/dark contrast, narrow widths, keyboard operation, and reduced motion."
6245
+ },
6246
+ "ly-collapsing-scroll-header": {
6247
+ summary: "An automatic simulation compresses a large cover and title into a small top bar, then expands them again.",
6248
+ vibeTag: "A large title smoothly becomes a compact top bar",
6249
+ vibeKeywords: ["collapsing header", "scroll header", "shrinking navigation", "large title transition"],
6250
+ promptSnippet: "Build a 110px-tall travel-detail preview inside the specified card. Include cover artwork, a large title, a back arrow, and three body lines. Animate a progress value p between 0 and 1 to simulate scroll compression. Interpolate header height from 82 to 38px, title font size from 23 to 13px, and title translation from (26,40) to (24,5)px. Move the cover up 48px while opacity goes from 1 to .2, move body lines up 28px, and fill the header from transparent to the themed surface. In the dictionary, loop 0\u21921\u21920 over 8 seconds. Click, Enter, or Space cancels the previous playback and restarts once from the beginning. Show the effect without scrollbars or range inputs. This is a progress simulation, not real page scroll detection or back navigation. Preserve card boundaries, top-toolbar spacing, light/dark themes, narrow layouts, and focus outlines. Disable automatic movement and transitions for reduced motion."
6251
+ },
6252
+ "rich-hover-preview": {
6253
+ summary: "Hover, focus, or press an author name to reveal a profile preview with a banner, avatar, and short biography.",
6254
+ vibeTag: "A quick peek before you navigate away",
6255
+ vibeKeywords: ["hover card", "profile preview", "link preview", "rich tooltip"],
6256
+ promptSnippet: "Place a Created by label and author-name button above a profile preview card in the specified area. Include a gradient banner, overlapping circular avatar, name, role, and one-line biography. Open on name hover or keyboard focus; click and touch toggle it. Keep it open while the pointer moves from the name into the preview. Close when the pointer leaves the entire area or focus moves outside. Hide closed content with hidden and match the trigger aria-expanded state. Enter over 200ms from 5px below and opacity zero. Keep the preview closed before user input; do not open it or move real focus automatically. No actual profile lookup, external link, follow action, or server call is performed. Support light/dark surface and text contrast, narrow widths, focus outlines, and reduced motion."
6257
+ },
6258
+ "inline-edit-field": {
6259
+ summary: "Press a project name to replace it with an input in the same place, then save or cancel back to text.",
6260
+ vibeTag: "Edit in place without leaving the screen",
6261
+ vibeKeywords: ["inline edit", "edit in place", "rename", "save cancel field"],
6262
+ promptSnippet: "Build a card with a Project name label and an edit button containing the name and a pencil icon. Start with New project. Pressing it replaces the value in place with an input plus Save and Cancel buttons. Keep draft text separate from the saved name. Save or Enter trims whitespace and stores the name in local state before returning to read mode. Disable Save for whitespace-only input and guard the handler too. Cancel or Escape discards the draft and keeps the saved name. Do not enter edit mode or change values automatically. Retain the draft and saved name entered by the user. There is no server persistence, durable storage, or fake request-success message. Support light/dark contrast, narrow input/button boundaries, keyboard operation, focus outlines, and reduced motion."
6263
+ }
6264
+ };
6265
+
6128
6266
  // ../../packages/catalog/src/translations/en.ts
6129
6267
  var text = (summary, vibeTag, keywords, promptSnippet) => ({ summary, vibeTag, vibeKeywords: keywords.split("|"), promptSnippet });
6130
6268
  var ENGLISH_TECHNIQUES = {
6269
+ ...EN_PATTERN_TECHNIQUES,
6131
6270
  ...EN_BROADCAST_TECHNIQUES,
6132
6271
  ...EN_CAMERA_TECHNIQUES,
6133
6272
  ...EN_CARD_TECHNIQUES,
@@ -6253,7 +6392,7 @@ var ENGLISH_TECHNIQUES = {
6253
6392
  "Random symbols resolve into the original text from left to right.",
6254
6393
  "Symbols decode into a message",
6255
6394
  "scramble|decode|cipher|random symbols|text reveal",
6256
- "Play Scramble Decode when the specified text first appears, on mouse enter, and on click. Update random symbols (!<>-_\\/[]{}\u2014=+*^?#01) every 35ms while preserving spaces. Lock each character to the original when frame > index * 2, decoding from left to right. Stop the timer when frame exceeds twice the total character count. Clean up the previous timer before replaying."
6395
+ "Play Scramble Decode when the specified text first appears and on click. Update random symbols (!<>-_\\/[]{}\u2014=+*^?#01) every 35ms while preserving spaces. Lock each character to the original when frame > index * 2, decoding from left to right. Stop the timer when frame exceeds twice the total character count. Clean up the previous timer before replaying."
6257
6396
  ),
6258
6397
  "gradient-flow-text": text(
6259
6398
  "A multicolor gradient flows continuously inside text.",
@@ -6525,6 +6664,30 @@ var ENGLISH_TECHNIQUES = {
6525
6664
  "newton cradle|pendulum|swing|momentum demo",
6526
6665
  "Hang five balls from a top support in the specified graphic with transform-origin: top center. Initially tilt only the leftmost ball by +34deg. Every 320ms, cycle through four steps: left +34deg, all 0deg, right -34deg, all 0deg. Keep the middle three fixed; clicking also advances one step. Use 0.3s rotations, cubic-bezier(0.215,0.61,0.355,1) for outward swings and cubic-bezier(0.55,0.055,0.675,0.19) for returns. This is a state-driven demo, not a real physics simulation."
6527
6666
  ),
6667
+ "mg-dice-roll-3d": text(
6668
+ "A 3D dice tumbles and bounces on click, settling to reveal a random face.",
6669
+ "A 3D dice tumbles and settles on a face",
6670
+ "dice roll|3D dice|rolling dice|tumbling dice|dice physics",
6671
+ "Implement a click-to-roll CSS 3D die in the specified area. Use perspective: 800px and a 64x64px cube, assembling six faces with one to six pips using translateZ(32px), rotateX/Y, and preserve-3d. Set the resting stage to rotateX(-40deg) rotateY(26deg) and the initial result to 6. Make the whole scene a keyboard-operable button. On click, pick a value from 1 to 6; if it matches the previous value, replace it with (previous % 6) + 1. Update the result badge immediately and add cumulative X-axis 720deg and Y-axis 1080deg turns per roll to the chosen target orientation. Animate for 0.85s with cubic-bezier(0.22, 1, 0.36, 1), including a translateY(-44px) peak, landing squash, a -8px rebound, and a return to rest. Shrink and fade the ground shadow while rolling, then restore it. Block further input for 850ms and enlarge only the result badge for 300ms after landing before restoring its size. Under reduced motion, skip CSS transitions and keyframes while retaining the input lock and badge timers. Clear timers on unmount."
6672
+ ),
6673
+ "mg-marble-board": text(
6674
+ "A mini board game uniting dual dice rolls, pawn tile hops, landmark construction stamps, and coin fountain FX.",
6675
+ "A casual board game cascades micro-interactions",
6676
+ "board game|dice game|double dice|pawn hop|landmark pop|chance card|coin fountain",
6677
+ "Implement a casual board game sequence: dice roll, pawn movement, then landing effects. Arrange ten looping tiles around a 4-column, 3-row perimeter in this order: Start, Seoul, Tokyo, Chance, Paris, Island, New York, Tax, London, Tour. Initially place the pawn at Start, show dice values 3 and 3, and leave cities unbuilt. Clicking anywhere on the board clears previous banners and landing effects, then samples phase=(Date.now()%1400)/1400 and power=round(20+75*abs(sin(phase*PI))). Keep the gauge fixed at 65% while idle or moving and show the sampled power only during the roll. For power>70 pick each die from 4 to 6; for power<35 pick from 1 to 3. Otherwise, with 55% probability assign the same random 1-to-6 value to both dice; in the remaining branch pick each independently from 1 to 6. Use two 30px preserve-3d dice on a perspective: 500px stage at rotateX(-40deg) rotateY(26deg), with 750ms cumulative tumbling, leaping, and landing. Then display a DOUBLE banner for matching values and move the pawn one tile every 160ms with an arc hop, for the sum of the dice, wrapping around the track. Block input during rolling and movement. Landing on a city shows an acquisition stamp and cycles that city through house, office, castle, then house on successive visits; preserve buildings across rolls. Chance triggers a 3D card flip and Tax triggers a five-coin fountain. Clear double, stamp, chance, and coin elements at the start of the next roll. Island and Tour are named stopping tiles without extra turn or travel rules. This is a state-driven visual demo without real currency or ownership transactions. Clear delay and movement timers on unmount."
6678
+ ),
6679
+ "mg-treasure-chest-3d": text(
6680
+ "A chest opens around its rear hinge to reveal golden rays and a floating gem; clicking again closes it.",
6681
+ "A 3D treasure chest opens with loot",
6682
+ "treasure chest|loot box|gacha open|3D chest|gem float|god rays",
6683
+ "Implement a click-to-toggle CSS 3D treasure chest loot animation. Use perspective: 700px and a wood-and-metal chest tilted at rotateX(-20deg) rotateY(-24deg), maintaining preserve-3d. Assemble outer and inner walls, rims, a lined lid underside, and an interior floor with treasure so opening reveals solid surfaces. Start closed and make the whole scene a keyboard-operable button. Clicking immediately enters the open state. For a 100x18px lid, place the rear hinge at transform-origin: 50px 18px -30px and transition to rotateX(115deg) over 0.6s with cubic-bezier(0.34, 1.45, 0.64, 1). Simultaneously bounce the chest for 0.45s, rotate radial conic-gradient golden rays on a 12s loop, and reveal a purple gem that bobs on alternating 2.2s cycles with a small tilt change, halo, and sparkles. Ignore further clicks for the first 500ms, then keep the chest open until another click closes it and hides the rays and gem for reuse. Show the same gem each time as a visual demo without actual item grants or random loot selection. Clear the opening timer on unmount."
6684
+ ),
6685
+ "mg-lucky-wheel-3d": text(
6686
+ "A gently tilted eight-sector wheel decelerates and displays the reward beneath a fixed pointer.",
6687
+ "A 3D lucky wheel spins to a reward",
6688
+ "lucky wheel|roulette|fortune wheel|spin wheel|wheel physics|reward wheel",
6689
+ "Implement a CSS 3D lucky wheel for casual games or reward events. Inside an assembly gently tilted at rotateX(16deg), use an explicitly sized square display: block disc containing eight 45deg colored sectors ordered as gems, gold, jackpot, ticket, chest, double reward, experience, and lucky box. Center sector 0 at the top at 0deg and sector i at i*45deg. Position each icon with rotate(i*45deg) translateY(-r) rotate(-i*45deg), centered in its sector, and rotate the icons and perimeter pegs with the same disc. Start at 270deg so jackpot is at the top. Place a small fixed mount and short arrowhead above and separate from the disc. Make the whole scene a keyboard-operable button. On click choose next=(previousSector+floor(random*5)+2)%8. Calculate the clockwise difference from the current angle modulo 360 to (360-next*45)%360; add that difference and 1440deg to the cumulative angle for at least four forward turns. Decelerate for 2.8s with cubic-bezier(0.12, 0.86, 0.2, 1) and block additional clicks during that interval. Use time-based pointer keyframes with increasing gaps and decreasing deflection until it rests. After 2800ms display the aligned sector reward badge for three seconds, pulsing only jackpot results. Preserve the angle and last sector after the badge disappears so another click can spin again. Under reduced motion skip CSS transitions and repeating effects while retaining result timers. Clear timers on unmount."
6690
+ ),
6528
6691
  "ly-bento-grid": text(
6529
6692
  "A large main tile and three supporting tiles form a compact bento grid.",
6530
6693
  "Content fits like a bento box",
@@ -6906,6 +7069,40 @@ var DOMAIN_NAMES = {
6906
7069
  en: { ui: "UI", motion: "Graphics", layout: "Layout", style: "Style", video: "Motion video" }
6907
7070
  };
6908
7071
 
7072
+ // ../../packages/catalog/src/search-metadata/additions/patterns.ts
7073
+ var PATTERN_SEARCH_METADATA = {
7074
+ "zoom-lightbox-gallery": {
7075
+ targets: ["image", "card"],
7076
+ triggers: ["click", "drag"],
7077
+ useCases: { ko: ["\uC0C1\uD488 \uC0AC\uC9C4\uC774\uB098 \uD3EC\uD2B8\uD3F4\uB9AC\uC624 \uC774\uBBF8\uC9C0\uB97C \uD06C\uAC8C \uBCF4\uACE0 \uB118\uAE30\uAC70\uB098 \uD655\uB300 \uC774\uB3D9\uD560 \uB54C"], en: ["Browse, enlarge, and pan product or portfolio images inside a viewer"] },
7078
+ aliases: { ko: ["\uB77C\uC774\uD2B8\uBC15\uC2A4 \uAC24\uB7EC\uB9AC", "\uC0AC\uC9C4 \uD655\uB300 \uBDF0\uC5B4"], en: ["lightbox gallery", "image viewer", "zoom pan gallery"] }
7079
+ },
7080
+ "selection-bubble-toolbar": {
7081
+ targets: ["text", "panel"],
7082
+ triggers: ["drag", "click"],
7083
+ useCases: { ko: ["\uBB38\uC11C\uC5D0\uC11C \uC120\uD0DD\uD55C \uAE00\uC790 \uBC14\uB85C \uC704\uC5D0 \uC11C\uC2DD \uB3C4\uAD6C\uB97C \uD45C\uC2DC\uD560 \uB54C"], en: ["Show formatting controls directly above selected document text"] },
7084
+ aliases: { ko: ["\uC120\uD0DD \uD234\uBC14", "\uBC84\uBE14 \uBA54\uB274", "\uD50C\uB85C\uD305 \uC11C\uC2DD \uD234\uBC14"], en: ["bubble menu", "selection toolbar", "floating formatting toolbar"] }
7085
+ },
7086
+ "ly-collapsing-scroll-header": {
7087
+ targets: ["navigation", "text"],
7088
+ triggers: ["auto", "click"],
7089
+ useCases: { ko: ["\uD070 \uC81C\uBAA9\uC774 \uC0C1\uB2E8 \uBC14\uB85C \uC555\uCD95\uB418\uB294 \uD6A8\uACFC\uB97C \uC2A4\uD06C\uB864\uBC14 \uC5C6\uC774 \uC790\uB3D9 \uC2DC\uBBAC\uB808\uC774\uC158\uD560 \uB54C"], en: ["Automatically simulate a large title collapsing into a compact top bar without a scrollbar"] },
7090
+ aliases: { ko: ["\uC2A4\uD06C\uB864 \uC555\uCD95 \uD5E4\uB354", "\uC811\uD788\uB294 \uC0C1\uB2E8 \uBC14", "\uD070 \uC81C\uBAA9 \uCD95\uC18C"], en: ["collapsing app bar", "shrinking header", "large title collapse"] }
7091
+ },
7092
+ "rich-hover-preview": {
7093
+ targets: ["card", "text"],
7094
+ triggers: ["hover", "click"],
7095
+ useCases: { ko: ["\uC791\uC131\uC790 \uC774\uB984\uC5D0\uC11C \uC774\uB3D9\uD558\uAE30 \uC804\uC5D0 \uD504\uB85C\uD544 \uC815\uBCF4\uB97C \uBBF8\uB9AC \uD655\uC778\uD560 \uB54C"], en: ["Preview an author profile before leaving the current content"] },
7096
+ aliases: { ko: ["\uD638\uBC84 \uCE74\uB4DC", "\uD504\uB85C\uD544 \uBBF8\uB9AC\uBCF4\uAE30", "\uB9AC\uCE58 \uB9C1\uD06C \uD504\uB9AC\uBDF0"], en: ["hover card", "profile preview", "rich link preview"] }
7097
+ },
7098
+ "inline-edit-field": {
7099
+ targets: ["input", "text"],
7100
+ triggers: ["click", "input"],
7101
+ useCases: { ko: ["\uD504\uB85C\uC81D\uD2B8 \uC774\uB984\uC744 \uAC19\uC740 \uC790\uB9AC\uC5D0\uC11C \uD3B8\uC9D1\uD558\uACE0 \uC800\uC7A5\uD558\uAC70\uB098 \uCDE8\uC18C\uD560 \uB54C"], en: ["Edit a project name in place with save and cancel actions"] },
7102
+ aliases: { ko: ["\uC778\uB77C\uC778 \uD3B8\uC9D1", "\uC81C\uC790\uB9AC \uD3B8\uC9D1", "\uC989\uC2DC \uC774\uB984 \uBCC0\uACBD"], en: ["inline edit", "editable text", "in-place editing"] }
7103
+ }
7104
+ };
7105
+
6909
7106
  // ../../packages/catalog/src/search-metadata/additions/broadcast.ts
6910
7107
  var BROADCAST_SEARCH_METADATA = {
6911
7108
  "vd-word-highlight-subtitles": {
@@ -9583,6 +9780,7 @@ var m = (targets, triggers, ko, en, aliasesKo = "", aliasesEn = "") => ({
9583
9780
  aliases: { ko: aliasesKo ? aliasesKo.split("|") : [], en: aliasesEn ? aliasesEn.split("|") : [] }
9584
9781
  });
9585
9782
  var SEARCH_METADATA = {
9783
+ ...PATTERN_SEARCH_METADATA,
9586
9784
  ...BROADCAST_SEARCH_METADATA,
9587
9785
  ...CAMERA_SEARCH_METADATA,
9588
9786
  ...CARD_SEARCH_METADATA,
@@ -9670,6 +9868,10 @@ var SEARCH_METADATA = {
9670
9868
  "mg-morphing-grid-wave": m(["background", "shape"], ["auto", "click"], "\uD0C0\uC77C \uACA9\uC790\uC5D0 \uB300\uAC01\uC120 \uD30C\uB3C4 \uC804\uB2EC", "Send diagonal waves across a tile grid"),
9671
9869
  "mg-prism-rainbow-refraction": m(["shape"], ["click"], "\uD504\uB9AC\uC998\uC758 \uBB34\uC9C0\uAC1C \uAD11\uC120 \uBD84\uC0B0 \uC2DC\uC5F0", "Demonstrate rainbow beam dispersion with an SVG prism"),
9672
9870
  "mg-gravity-newton-cradle": m(["shape"], ["auto", "click"], "\uB274\uD134\uC758 \uC694\uB78C \uC9C4\uC790 \uC6B4\uB3D9 \uBAA8\uC591 \uC2DC\uC5F0", "Demonstrate a timed Newton cradle pendulum sequence"),
9871
+ "mg-dice-roll-3d": m(["shape", "card"], ["click"], "3D \uC8FC\uC0AC\uC704 \uAD74\uB9AC\uAE30\uC640 \uB208\uAE08 \uC548\uCC29 \uC2DC\uC5F0", "Tumble and roll a 3D dice landing on a random face"),
9872
+ "mg-marble-board": m(["shape", "card", "navigation"], ["click"], "\uCE90\uC8FC\uC5BC \uBCF4\uB4DC\uAC8C\uC784 \uC8FC\uC0AC\uC704\uC640 \uB9D0 \uC774\uB3D9 \uC2DC\uC5F0", "Play a mini board game with dual dice, pawn hops, and landmark animations"),
9873
+ "mg-treasure-chest-3d": m(["shape", "card"], ["click"], "3D \uBCF4\uBB3C\uC0C1\uC790 \uC5F4\uAE30\uC640 \uD669\uAE08\uBE5B \uBE54 \uB8E8\uD305 \uC2DC\uC5F0", "Open a 3D treasure chest to reveal radiant beams and floating loot"),
9874
+ "mg-lucky-wheel-3d": m(["shape", "button"], ["click"], "3D \uB7ED\uD0A4 \uD720 \uB8F0\uB81B \uD68C\uC804\uACFC \uAC10\uC18D \uBB3C\uB9AC \uC2DC\uC5F0", "Spin a 3D lucky wheel roulette with deceleration physics and pin flapper"),
9673
9875
  "ly-bento-grid": m(["panel", "card"], ["click"], "\uB300\uD615\uACFC \uBCF4\uC870 \uCF58\uD150\uCE20 \uD0C0\uC77C \uBC30\uCE58", "Arrange primary and supporting content tiles in a bento grid"),
9674
9876
  "ly-masonry-waterfall": m(["list", "card"], ["click"], "\uB192\uC774\uAC00 \uB2E4\uB978 \uCE74\uB4DC\uC758 \uC6CC\uD130\uD3F4 \uBC30\uCE58", "Arrange variable-height cards in fixed waterfall columns"),
9675
9877
  "ly-editorial-asymmetric": m(["image", "card"], ["hover", "click"], "\uBE44\uC8FC\uC5BC\uACFC \uC815\uBCF4 \uCE74\uB4DC\uC758 \uD3B8\uC9D1\uD615 \uACB9\uCE68", "Overlap a large visual and a small editorial card"),
@@ -9764,8 +9966,12 @@ var SEARCH_SYNONYMS = [
9764
9966
  ["shimmer", "\uC2DC\uBA38", "\uAD11\uD0DD"],
9765
9967
  ["glow", "\uAE00\uB85C\uC6B0", "\uBC1C\uAD11", "\uBE5B\uB098\uB294"],
9766
9968
  ["neon", "\uB124\uC628"],
9767
- ["flip", "\uD50C\uB9BD", "\uB4A4\uC9D1\uAE30", "\uB4A4\uC9D1\uB294", "\uB4A4\uC9D1\uC5B4"],
9969
+ ["flip", "flips", "flipped", "flipping", "\uD50C\uB9BD", "\uB4A4\uC9D1\uAE30", "\uB4A4\uC9D1\uB294", "\uB4A4\uC9D1\uC5B4"],
9768
9970
  ["tilt", "\uD2F8\uD2B8", "\uAE30\uC6B8\uC5B4\uC9C0\uB294", "\uAE30\uC6B8\uC5B4\uC9D0", "\uAE30\uC6B8\uC774\uAE30"],
9971
+ ["scroll", "scrolling", "scrolled", "\uC2A4\uD06C\uB864"],
9972
+ ["continuous", "continuously", "continually", "\uACC4\uC18D", "\uB04A\uC784\uC5C6\uC774"],
9973
+ ["blur", "blurred", "blurring", "\uBE14\uB7EC", "\uD750\uB9BC", "\uD750\uB9AC\uAC8C"],
9974
+ ["face", "\uC5BC\uAD74", "\uC5BC\uAD74\uB9CC"],
9769
9975
  ["glass", "glassmorphism", "\uAE00\uB798\uC2A4\uBAA8\uD53C\uC998", "\uAE00\uB798\uC2A4", "\uC720\uB9AC"],
9770
9976
  ["spring", "\uC2A4\uD504\uB9C1", "\uD0C4\uC131"],
9771
9977
  ["bounce", "\uBC14\uC6B4\uC2A4", "\uD1B5\uD1B5", "\uD280\uB294"],
@@ -9877,7 +10083,6 @@ function rank(item, query, queryTokens) {
9877
10083
  const exact = allEntries.find((entry) => entry.field !== "prompt" && entry.value.normalize("NFKC").trim().toLowerCase() === normalizedQuery);
9878
10084
  if (!queryTokens.length && !exact) return null;
9879
10085
  const matchedOn = [];
9880
- let score = 0;
9881
10086
  const covered = /* @__PURE__ */ new Set();
9882
10087
  const best = /* @__PURE__ */ new Map();
9883
10088
  for (const entry of allEntries) {
@@ -9890,7 +10095,7 @@ function rank(item, query, queryTokens) {
9890
10095
  if (!matchedOn.some((match) => match.field === entry.field)) matchedOn.push({ field: entry.field, value: entry.value });
9891
10096
  }
9892
10097
  if (!exact && covered.size < Math.max(1, Math.ceil(queryTokens.length * 0.6))) return null;
9893
- score = [...best.values()].reduce((sum, weight) => sum + weight, 0);
10098
+ let score = [...best.values()].reduce((sum, weight) => sum + weight, 0);
9894
10099
  score += queryTokens.length ? Math.round(20 * covered.size / queryTokens.length) : 0;
9895
10100
  if (exact) {
9896
10101
  score += exact.field === "title" ? 150 : 100;
@@ -9915,7 +10120,7 @@ function searchTechniques(options = {}) {
9915
10120
  // package.json
9916
10121
  var package_default = {
9917
10122
  name: "@keke1933/vibe-dictionary-mcp",
9918
- version: "0.2.0",
10123
+ version: "0.4.0",
9919
10124
  license: "MIT",
9920
10125
  author: "leejh96",
9921
10126
  description: "Read-only local MCP for searching Vibe Dictionary techniques and retrieving implementation prompts",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@keke1933/vibe-dictionary-mcp",
3
- "version": "0.2.0",
3
+ "version": "0.4.0",
4
4
  "license": "MIT",
5
5
  "author": "leejh96",
6
6
  "description": "Read-only local MCP for searching Vibe Dictionary techniques and retrieving implementation prompts",