srcdev-nuxt-components 9.2.1 → 9.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.vscode/extensions.json +15 -0
- package/.vscode/settings.json +45 -0
- package/.vscode/srcdev-component-banner-video.code-snippets +59 -0
- package/.vscode/srcdev-component-dialog.code-snippets +126 -0
- package/.vscode/srcdev-component-display-prompt.code-snippets +66 -0
- package/.vscode/srcdev-component-display-toast.code-snippets +78 -0
- package/.vscode/srcdev-component-input-copy.code-snippets +72 -0
- package/.vscode/srcdev-component-pinia-store.code-snippets +63 -0
- package/.vscode/srcdev-component-pricing-card.code-snippets +96 -0
- package/.vscode/srcdev-component-services-section.code-snippets +84 -0
- package/app/components/02.molecules/input-copy/CONSUMER-STYLING.md +143 -0
- package/app/components/02.molecules/input-copy/InputCopy.vue +195 -0
- package/app/components/02.molecules/input-copy/stories/InputCopy.stories.ts +110 -0
- package/app/components/02.molecules/input-copy/tests/InputCopy.spec.ts +181 -0
- package/app/components/02.molecules/pricing-card/CONSUMER-STYLING.md +149 -0
- package/app/components/02.molecules/pricing-card/PricingCard.vue +225 -0
- package/app/components/02.molecules/pricing-card/stories/PricingCard.stories.ts +160 -0
- package/app/components/02.molecules/pricing-card/tests/PricingCard.spec.ts +139 -0
- package/nuxt.config.ts +6 -1
- package/package.json +2 -1
- package/.claude/skills/components/input-copy-core.md +0 -66
- package/app/components/05.forms/input-copy/InputCopyCore.vue +0 -132
- package/app/components/05.forms/input-copy/stories/InputCopyCore.stories.ts +0 -89
- package/app/components/05.forms/input-copy/tests/InputCopyCore.spec.ts +0 -212
- package/app/components/05.forms/input-copy/tests/__snapshots__/InputCopyCore.spec.ts.snap +0 -28
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"recommendations": [
|
|
3
|
+
"davidanson.vscode-markdownlint",
|
|
4
|
+
"dbaeumer.vscode-eslint",
|
|
5
|
+
"vue.volar",
|
|
6
|
+
"nuxtr.nuxtr-vscode",
|
|
7
|
+
"nixon.env-cmd-file-syntax",
|
|
8
|
+
"jkjustjoshing.vscode-text-pastry",
|
|
9
|
+
"willofindie.vscode-cssvar",
|
|
10
|
+
"vitest.explorer",
|
|
11
|
+
"esbenp.prettier-vscode",
|
|
12
|
+
"formulahendry.auto-rename-tag",
|
|
13
|
+
"anthropic.claude-code"
|
|
14
|
+
]
|
|
15
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
{
|
|
2
|
+
"editor.insertSpaces": true,
|
|
3
|
+
"editor.tabSize": 2,
|
|
4
|
+
"editor.trimAutoWhitespace": true,
|
|
5
|
+
"files.trimTrailingWhitespace": true,
|
|
6
|
+
"files.eol": "\n",
|
|
7
|
+
"files.insertFinalNewline": true,
|
|
8
|
+
"files.trimFinalNewlines": true,
|
|
9
|
+
|
|
10
|
+
"[typescript][javascript][json][jsonc][css][scss][html][markdown]": {
|
|
11
|
+
"editor.formatOnSave": true,
|
|
12
|
+
"editor.defaultFormatter": "esbenp.prettier-vscode",
|
|
13
|
+
"editor.codeActionsOnSave": {
|
|
14
|
+
"source.fixAll.eslint": "explicit",
|
|
15
|
+
"source.fixAll.stylelint": "explicit",
|
|
16
|
+
"source.fixAll.markdownlint": "explicit",
|
|
17
|
+
"editor.trimAutoWhitespace": "explicit"
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
"[vue]": {
|
|
21
|
+
"editor.formatOnSave": true,
|
|
22
|
+
"editor.defaultFormatter": "esbenp.prettier-vscode",
|
|
23
|
+
"editor.codeActionsOnSave": {
|
|
24
|
+
"source.fixAll.eslint": "explicit",
|
|
25
|
+
"source.fixAll.stylelint": "explicit",
|
|
26
|
+
"source.fixAll.markdownlint": "explicit",
|
|
27
|
+
"editor.trimAutoWhitespace": "explicit"
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
"eslint.validate": ["javascript", "typescript", "json", "jsonc", "vue", "markdown", "html"],
|
|
31
|
+
"[css][html][javascript][json][jsonc][markdown][scss][typescript][vue]": {
|
|
32
|
+
"editor.codeActionsOnSave": {
|
|
33
|
+
"source.fixAll.eslint": "explicit",
|
|
34
|
+
"source.fixAll.stylelint": "explicit",
|
|
35
|
+
"source.fixAll.markdownlint": "explicit",
|
|
36
|
+
"editor.trimAutoWhitespace": "explicit"
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
// More info: https://open-props.style/#getting-started
|
|
40
|
+
"cssvar.files": ["assets/styles/main.css"],
|
|
41
|
+
"cssvar.ignore": [],
|
|
42
|
+
"cssvar.extensions": ["css", "sss", "postcss", "vue", "ts"],
|
|
43
|
+
"js/ts.tsdk.path": "node_modules/typescript/lib",
|
|
44
|
+
"git.addAICoAuthor": "off"
|
|
45
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
{
|
|
2
|
+
"SRCDEV BannerVideo Basic": {
|
|
3
|
+
"description": "BannerVideo — full-width autoplaying hero video with poster fallback",
|
|
4
|
+
"scope": "vue,html",
|
|
5
|
+
"body": [
|
|
6
|
+
"<BannerVideo",
|
|
7
|
+
" src=\"$1/videos/hero.mp4\"",
|
|
8
|
+
" poster=\"$2/images/hero-poster.jpg\"",
|
|
9
|
+
" alt=\"$3Studio interior\"",
|
|
10
|
+
" :img-width=\"1920\"",
|
|
11
|
+
" :img-height=\"1080\"",
|
|
12
|
+
" depth=\"$4md\"",
|
|
13
|
+
"/>"
|
|
14
|
+
]
|
|
15
|
+
},
|
|
16
|
+
"SRCDEV BannerVideo Custom Toggle Icons": {
|
|
17
|
+
"description": "BannerVideo with playIcon/pauseIcon props swapped",
|
|
18
|
+
"scope": "vue,html",
|
|
19
|
+
"body": [
|
|
20
|
+
"<BannerVideo",
|
|
21
|
+
" src=\"$1/videos/hero.mp4\"",
|
|
22
|
+
" poster=\"$2/images/hero-poster.jpg\"",
|
|
23
|
+
" play-icon=\"$3mdi:play-circle\"",
|
|
24
|
+
" pause-icon=\"$4mdi:pause-circle\"",
|
|
25
|
+
"/>"
|
|
26
|
+
]
|
|
27
|
+
},
|
|
28
|
+
"SRCDEV BannerVideo Custom Toggle Icon Slot": {
|
|
29
|
+
"description": "BannerVideo with the toggle-icon slot fully replacing the toggle button's icon",
|
|
30
|
+
"scope": "vue,html",
|
|
31
|
+
"body": [
|
|
32
|
+
"<BannerVideo src=\"$1/videos/hero.mp4\" poster=\"$2/images/hero-poster.jpg\">",
|
|
33
|
+
" <template #toggle-icon=\"{ isPlaying }\">",
|
|
34
|
+
" $3",
|
|
35
|
+
" </template>",
|
|
36
|
+
"</BannerVideo>"
|
|
37
|
+
]
|
|
38
|
+
},
|
|
39
|
+
"SRCDEV BannerVideo CSS Override": {
|
|
40
|
+
"description": "CSS override scaffold for BannerVideo — scope to a page or section class",
|
|
41
|
+
"scope": "css",
|
|
42
|
+
"body": [
|
|
43
|
+
".$1my-page {",
|
|
44
|
+
" .banner-video {",
|
|
45
|
+
" --banner-video-max-height-xs: ;",
|
|
46
|
+
" --banner-video-max-height-sm: ;",
|
|
47
|
+
" --banner-video-max-height-md: ;",
|
|
48
|
+
" --banner-video-max-height-lg: ;",
|
|
49
|
+
" --banner-video-max-height-xl: ;",
|
|
50
|
+
" --banner-video-toggle-size: ;",
|
|
51
|
+
" --banner-video-toggle-offset: ;",
|
|
52
|
+
" --banner-video-toggle-background: ;",
|
|
53
|
+
" --banner-video-toggle-background-hover: ;",
|
|
54
|
+
" --banner-video-toggle-icon-color: ;",
|
|
55
|
+
" }",
|
|
56
|
+
"}"
|
|
57
|
+
]
|
|
58
|
+
}
|
|
59
|
+
}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
{
|
|
2
|
+
"SRCDEV DisplayDialog Script Setup": {
|
|
3
|
+
"description": "useDialogControls setup for one or more DisplayDialog instances",
|
|
4
|
+
"scope": "javascript,typescript",
|
|
5
|
+
"body": [
|
|
6
|
+
"const { dialogsConfig, openDialog, closeDialog } = useDialogControls({",
|
|
7
|
+
" $1myDialog: {",
|
|
8
|
+
" onConfirm: () => {},",
|
|
9
|
+
" onCancel: () => {},",
|
|
10
|
+
" },",
|
|
11
|
+
"});"
|
|
12
|
+
]
|
|
13
|
+
},
|
|
14
|
+
"SRCDEV DisplayDialog Trigger Button": {
|
|
15
|
+
"description": "Button that opens a DisplayDialog",
|
|
16
|
+
"scope": "vue,html",
|
|
17
|
+
"body": [
|
|
18
|
+
"<button type=\"button\" @click.prevent=\"openDialog('$1myDialog')\">$2Open dialog</button>"
|
|
19
|
+
]
|
|
20
|
+
},
|
|
21
|
+
"SRCDEV DisplayDialog Confirm Template": {
|
|
22
|
+
"description": "DisplayDialog confirm variant — content-sized, requires explicit action",
|
|
23
|
+
"scope": "vue,html",
|
|
24
|
+
"body": [
|
|
25
|
+
"<DisplayDialog",
|
|
26
|
+
" v-if=\"dialogsConfig['$1myDialog']\"",
|
|
27
|
+
" v-model=\"dialogsConfig['$1myDialog']\"",
|
|
28
|
+
" variant=\"confirm\"",
|
|
29
|
+
" data-dialog-id=\"$1myDialog\"",
|
|
30
|
+
">",
|
|
31
|
+
" <template #dialogTitle>",
|
|
32
|
+
" <p class=\"text-normal wght-700 m-0\">$2Confirm action?</p>",
|
|
33
|
+
" </template>",
|
|
34
|
+
" <template #dialogContent>",
|
|
35
|
+
" <div class=\"m-0\">",
|
|
36
|
+
" <p class=\"text-normal\">$3Are you sure you want to continue?</p>",
|
|
37
|
+
" </div>",
|
|
38
|
+
" </template>",
|
|
39
|
+
" <template #actionButtonLeft>",
|
|
40
|
+
" <button type=\"button\" @click=\"closeDialog('$1myDialog', 'cancel')\">Cancel</button>",
|
|
41
|
+
" </template>",
|
|
42
|
+
" <template #actionButtonRight>",
|
|
43
|
+
" <button type=\"button\" @click=\"closeDialog('$1myDialog', 'confirm')\">Confirm</button>",
|
|
44
|
+
" </template>",
|
|
45
|
+
"</DisplayDialog>"
|
|
46
|
+
]
|
|
47
|
+
},
|
|
48
|
+
"SRCDEV DisplayDialog Alert Template": {
|
|
49
|
+
"description": "DisplayDialog alert variant — cannot be dismissed by Escape or outside-click",
|
|
50
|
+
"scope": "vue,html",
|
|
51
|
+
"body": [
|
|
52
|
+
"<DisplayDialog",
|
|
53
|
+
" v-if=\"dialogsConfig['$1myDialog']\"",
|
|
54
|
+
" v-model=\"dialogsConfig['$1myDialog']\"",
|
|
55
|
+
" variant=\"alert\"",
|
|
56
|
+
" theme=\"error\"",
|
|
57
|
+
" data-dialog-id=\"$1myDialog\"",
|
|
58
|
+
">",
|
|
59
|
+
" <template #dialogTitle>",
|
|
60
|
+
" <p class=\"text-normal wght-700 m-0\">$2Delete item?</p>",
|
|
61
|
+
" </template>",
|
|
62
|
+
" <template #dialogContent>",
|
|
63
|
+
" <div class=\"m-0\">",
|
|
64
|
+
" <p class=\"text-normal\">$3This action is permanent and cannot be undone.</p>",
|
|
65
|
+
" </div>",
|
|
66
|
+
" </template>",
|
|
67
|
+
" <template #actionButtonLeft>",
|
|
68
|
+
" <button type=\"button\" @click=\"closeDialog('$1myDialog', 'cancel')\">Cancel</button>",
|
|
69
|
+
" </template>",
|
|
70
|
+
" <template #actionButtonRight>",
|
|
71
|
+
" <button type=\"button\" @click=\"closeDialog('$1myDialog', 'confirm')\">$4Delete</button>",
|
|
72
|
+
" </template>",
|
|
73
|
+
"</DisplayDialog>"
|
|
74
|
+
]
|
|
75
|
+
},
|
|
76
|
+
"SRCDEV DisplayDialog Scrollable Template": {
|
|
77
|
+
"description": "DisplayDialog dialog variant — tall panel with scrollable content area",
|
|
78
|
+
"scope": "vue,html",
|
|
79
|
+
"body": [
|
|
80
|
+
"<DisplayDialog",
|
|
81
|
+
" v-if=\"dialogsConfig['$1myDialog']\"",
|
|
82
|
+
" v-model=\"dialogsConfig['$1myDialog']\"",
|
|
83
|
+
" variant=\"dialog\"",
|
|
84
|
+
" :allow-content-scroll=\"true\"",
|
|
85
|
+
" data-dialog-id=\"$1myDialog\"",
|
|
86
|
+
">",
|
|
87
|
+
" <template #dialogTitle>",
|
|
88
|
+
" <p class=\"text-normal wght-700 m-0\">$2Dialog title</p>",
|
|
89
|
+
" </template>",
|
|
90
|
+
" <template #dialogContent>",
|
|
91
|
+
" <div class=\"pt-12 pb-12\">",
|
|
92
|
+
" $3",
|
|
93
|
+
" </div>",
|
|
94
|
+
" </template>",
|
|
95
|
+
" <template #actionButtonLeft>",
|
|
96
|
+
" <button type=\"button\" @click=\"closeDialog('$1myDialog', 'cancel')\">Cancel</button>",
|
|
97
|
+
" </template>",
|
|
98
|
+
" <template #actionButtonRight>",
|
|
99
|
+
" <button type=\"button\" @click=\"closeDialog('$1myDialog', 'confirm')\">Confirm</button>",
|
|
100
|
+
" </template>",
|
|
101
|
+
"</DisplayDialog>"
|
|
102
|
+
]
|
|
103
|
+
},
|
|
104
|
+
"SRCDEV DisplayDialog CSS Override": {
|
|
105
|
+
"description": "CSS override scaffold for DisplayDialog — scope to a page or section class",
|
|
106
|
+
"scope": "css",
|
|
107
|
+
"body": [
|
|
108
|
+
".$1my-page {",
|
|
109
|
+
" .display-dialog {",
|
|
110
|
+
" --display-dialog-inner-border-radius: ;",
|
|
111
|
+
" --display-dialog-inner-background: ;",
|
|
112
|
+
" --display-dialog-inner-border: ;",
|
|
113
|
+
" --display-dialog-backdrop-background: ;",
|
|
114
|
+
" --display-dialog-backdrop-blur: ;",
|
|
115
|
+
" --display-dialog-transition-duration: ;",
|
|
116
|
+
"",
|
|
117
|
+
" .inner {",
|
|
118
|
+
" .header {}",
|
|
119
|
+
" .dialog-content {}",
|
|
120
|
+
" .footer {}",
|
|
121
|
+
" }",
|
|
122
|
+
" }",
|
|
123
|
+
"}"
|
|
124
|
+
]
|
|
125
|
+
}
|
|
126
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
{
|
|
2
|
+
"SRCDEV DisplayPrompt Template": {
|
|
3
|
+
"description": "DisplayPrompt inline notification banner with all slots",
|
|
4
|
+
"scope": "vue,html",
|
|
5
|
+
"body": [
|
|
6
|
+
"<DisplayPrompt",
|
|
7
|
+
" theme=\"$1info\"",
|
|
8
|
+
" :dismissible=\"true\"",
|
|
9
|
+
" :style-class-passthrough=\"['$2']\"",
|
|
10
|
+
">",
|
|
11
|
+
" <template #title>$3Prompt title</template>",
|
|
12
|
+
" <template #content>$4Prompt body text.</template>",
|
|
13
|
+
"</DisplayPrompt>"
|
|
14
|
+
]
|
|
15
|
+
},
|
|
16
|
+
"SRCDEV DisplayPrompt Masked Template": {
|
|
17
|
+
"description": "DisplayPrompt with SVG glass border — place over a coloured background",
|
|
18
|
+
"scope": "vue,html",
|
|
19
|
+
"body": [
|
|
20
|
+
"<DisplayPrompt",
|
|
21
|
+
" theme=\"$1info\"",
|
|
22
|
+
" :masked=\"true\"",
|
|
23
|
+
" :dismissible=\"true\"",
|
|
24
|
+
">",
|
|
25
|
+
" <template #title>$2Prompt title</template>",
|
|
26
|
+
" <template #content>$3Prompt body text.</template>",
|
|
27
|
+
"</DisplayPrompt>"
|
|
28
|
+
]
|
|
29
|
+
},
|
|
30
|
+
"SRCDEV DisplayPrompt v-model Template": {
|
|
31
|
+
"description": "DisplayPrompt with parent-controlled dismiss via v-model",
|
|
32
|
+
"scope": "vue,html",
|
|
33
|
+
"body": [
|
|
34
|
+
"<DisplayPrompt",
|
|
35
|
+
" v-model=\"$1showPrompt\"",
|
|
36
|
+
" theme=\"$2info\"",
|
|
37
|
+
" :dismissible=\"true\"",
|
|
38
|
+
">",
|
|
39
|
+
" <template #title>$3Prompt title</template>",
|
|
40
|
+
" <template #content>$4Prompt body text.</template>",
|
|
41
|
+
"</DisplayPrompt>"
|
|
42
|
+
]
|
|
43
|
+
},
|
|
44
|
+
"SRCDEV DisplayPrompt Script Setup": {
|
|
45
|
+
"description": "Script refs for DisplayPrompt v-model and theme",
|
|
46
|
+
"scope": "javascript,typescript",
|
|
47
|
+
"body": [
|
|
48
|
+
"const showPrompt = ref(true);",
|
|
49
|
+
"const promptTheme = ref<'info' | 'success' | 'warning' | 'error'>('$1info');"
|
|
50
|
+
]
|
|
51
|
+
},
|
|
52
|
+
"SRCDEV DisplayPrompt CSS Override": {
|
|
53
|
+
"description": "CSS override scaffold for DisplayPrompt — scope to a page or section class",
|
|
54
|
+
"scope": "css",
|
|
55
|
+
"body": [
|
|
56
|
+
".$1my-page {",
|
|
57
|
+
" .display-prompt-wrapper {",
|
|
58
|
+
" --theme-accent: ;",
|
|
59
|
+
" --theme-border: ;",
|
|
60
|
+
" --theme-surface: ;",
|
|
61
|
+
" --theme-text: ;",
|
|
62
|
+
" }",
|
|
63
|
+
"}"
|
|
64
|
+
]
|
|
65
|
+
}
|
|
66
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
{
|
|
2
|
+
"SRCDEV DisplayToastProvider Layout Setup": {
|
|
3
|
+
"description": "DisplayToastProvider — place once in your default layout",
|
|
4
|
+
"scope": "vue,html",
|
|
5
|
+
"body": [
|
|
6
|
+
"<DisplayToastProvider",
|
|
7
|
+
" position=\"$1top\"",
|
|
8
|
+
" alignment=\"$2right\"",
|
|
9
|
+
" :max-visible=\"1\"",
|
|
10
|
+
"/>"
|
|
11
|
+
]
|
|
12
|
+
},
|
|
13
|
+
"SRCDEV useToastQueue Script Setup": {
|
|
14
|
+
"description": "useToastQueue — trigger app-wide toasts from anywhere",
|
|
15
|
+
"scope": "javascript,typescript",
|
|
16
|
+
"body": [
|
|
17
|
+
"const { show, dismiss, clear } = useToastQueue();",
|
|
18
|
+
"",
|
|
19
|
+
"const show$1Success = () => {",
|
|
20
|
+
" show({",
|
|
21
|
+
" appearance: { theme: 'success' },",
|
|
22
|
+
" behavior: { autoDismiss: true, duration: 4000 },",
|
|
23
|
+
" content: { title: '$2Done', description: '$3Your changes have been saved.' },",
|
|
24
|
+
" });",
|
|
25
|
+
"};",
|
|
26
|
+
"",
|
|
27
|
+
"const show$1Error = () => {",
|
|
28
|
+
" show({",
|
|
29
|
+
" appearance: { theme: 'error' },",
|
|
30
|
+
" behavior: { autoDismiss: false },",
|
|
31
|
+
" content: { title: '$4Something went wrong', description: '$5Please try again.' },",
|
|
32
|
+
" });",
|
|
33
|
+
"};"
|
|
34
|
+
]
|
|
35
|
+
},
|
|
36
|
+
"SRCDEV DisplayToast Standalone Template": {
|
|
37
|
+
"description": "DisplayToast standalone — v-model driven, no queue",
|
|
38
|
+
"scope": "vue,html",
|
|
39
|
+
"body": [
|
|
40
|
+
"<DisplayToast",
|
|
41
|
+
" v-model=\"$1toastVisible\"",
|
|
42
|
+
" :config=\"{",
|
|
43
|
+
" appearance: { theme: '$2info' },",
|
|
44
|
+
" behavior: { autoDismiss: true, duration: 4000 },",
|
|
45
|
+
" content: { title: '$3Title', description: '$4Description.' },",
|
|
46
|
+
" }\"",
|
|
47
|
+
"/>"
|
|
48
|
+
]
|
|
49
|
+
},
|
|
50
|
+
"SRCDEV DisplayToast Standalone Script Setup": {
|
|
51
|
+
"description": "Script ref for standalone DisplayToast v-model",
|
|
52
|
+
"scope": "javascript,typescript",
|
|
53
|
+
"body": [
|
|
54
|
+
"const $1toastVisible = ref(false);"
|
|
55
|
+
]
|
|
56
|
+
},
|
|
57
|
+
"SRCDEV DisplayToast Masked Config": {
|
|
58
|
+
"description": "Masked SVG glass variant — add to any toast config appearance block",
|
|
59
|
+
"scope": "javascript,typescript",
|
|
60
|
+
"body": [
|
|
61
|
+
"appearance: { theme: '$1info', masked: true },"
|
|
62
|
+
]
|
|
63
|
+
},
|
|
64
|
+
"SRCDEV DisplayToast CSS Override": {
|
|
65
|
+
"description": "CSS override scaffold for DisplayToastProvider items",
|
|
66
|
+
"scope": "css",
|
|
67
|
+
"body": [
|
|
68
|
+
".$1my-page {",
|
|
69
|
+
" .display-toast-provider-item {",
|
|
70
|
+
" --theme-surface: ;",
|
|
71
|
+
" --theme-text: ;",
|
|
72
|
+
" --theme-accent: ;",
|
|
73
|
+
" --theme-border: ;",
|
|
74
|
+
" }",
|
|
75
|
+
"}"
|
|
76
|
+
]
|
|
77
|
+
}
|
|
78
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
{
|
|
2
|
+
"SRCDEV InputCopy Basic": {
|
|
3
|
+
"description": "Basic InputCopy component with value and label",
|
|
4
|
+
"scope": "vue,html",
|
|
5
|
+
"body": [
|
|
6
|
+
"<InputCopy",
|
|
7
|
+
" value=\"$1sk_live_abc123xyz\"",
|
|
8
|
+
" label=\"$2API key\"",
|
|
9
|
+
" description=\"$3Copy this key to authenticate with our API.\"",
|
|
10
|
+
" @copy=\"$4handleCopy\"",
|
|
11
|
+
"/>"
|
|
12
|
+
]
|
|
13
|
+
},
|
|
14
|
+
"SRCDEV InputCopy License Key": {
|
|
15
|
+
"description": "InputCopy for displaying a license key on success page",
|
|
16
|
+
"scope": "vue,html",
|
|
17
|
+
"body": [
|
|
18
|
+
"<InputCopy",
|
|
19
|
+
" :value=\"licenseKey\"",
|
|
20
|
+
" label=\"License key\"",
|
|
21
|
+
" description=\"Your license key is ready to use. Copy it to embed in your application.\"",
|
|
22
|
+
" buttonText=\"Copy\"",
|
|
23
|
+
" copiedText=\"Copied to clipboard!\"",
|
|
24
|
+
" @copy=\"$1handleCopy\"",
|
|
25
|
+
" @copied=\"$2showCopiedFeedback\"",
|
|
26
|
+
"/>"
|
|
27
|
+
]
|
|
28
|
+
},
|
|
29
|
+
"SRCDEV InputCopy Disabled": {
|
|
30
|
+
"description": "InputCopy in disabled state",
|
|
31
|
+
"scope": "vue,html",
|
|
32
|
+
"body": [
|
|
33
|
+
"<InputCopy",
|
|
34
|
+
" :value=\"$1value\"",
|
|
35
|
+
" label=\"$2Label\"",
|
|
36
|
+
" :is-disabled=\"true\"",
|
|
37
|
+
" :button-text=\"$3Unavailable\"",
|
|
38
|
+
"/>"
|
|
39
|
+
]
|
|
40
|
+
},
|
|
41
|
+
"SRCDEV InputCopy in Page": {
|
|
42
|
+
"description": "InputCopy with custom aria labels",
|
|
43
|
+
"scope": "vue,html",
|
|
44
|
+
"body": [
|
|
45
|
+
"<InputCopy",
|
|
46
|
+
" :value=\"$1value\"",
|
|
47
|
+
" label=\"$2License key\"",
|
|
48
|
+
" aria-label=\"$3Your unique GuideMyHair license identifier\"",
|
|
49
|
+
" description=\"$4Keep this key safe. You'll need it to embed the widget.\"",
|
|
50
|
+
" button-text=\"$5Copy key\"",
|
|
51
|
+
" copied-text=\"$6Key copied!\"",
|
|
52
|
+
" @copy=\"$7logCopy\"",
|
|
53
|
+
"/>"
|
|
54
|
+
]
|
|
55
|
+
},
|
|
56
|
+
"SRCDEV InputCopy CSS Override": {
|
|
57
|
+
"description": "CSS override scaffold for InputCopy tokens",
|
|
58
|
+
"scope": "css",
|
|
59
|
+
"body": [
|
|
60
|
+
".$1success-page {",
|
|
61
|
+
" .input-copy {",
|
|
62
|
+
" --input-copy-input-bg: $2;",
|
|
63
|
+
" --input-copy-input-border: $3;",
|
|
64
|
+
" --input-copy-input-border-radius: $4;",
|
|
65
|
+
" --input-copy-button-bg: $5;",
|
|
66
|
+
" --input-copy-button-bg-hover: $6;",
|
|
67
|
+
" --input-copy-button-text-color: $7;",
|
|
68
|
+
" }",
|
|
69
|
+
"}"
|
|
70
|
+
]
|
|
71
|
+
}
|
|
72
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
{
|
|
2
|
+
"SRCDEV Pinia Options Store Boilerplate": {
|
|
3
|
+
"description": "Bootstrap the code needed for a Vue.js Pinia Options Store file",
|
|
4
|
+
"scope": "javascript,typescript",
|
|
5
|
+
"body": [
|
|
6
|
+
"import { defineStore, acceptHMRUpdate } from 'pinia'",
|
|
7
|
+
"",
|
|
8
|
+
"export const use${TM_FILENAME_BASE/^(.*)$/${1:/pascalcase}/}Store = defineStore('$TM_FILENAME_BASE', {",
|
|
9
|
+
" state: () => ({",
|
|
10
|
+
" $0",
|
|
11
|
+
" }),",
|
|
12
|
+
" getters: {},",
|
|
13
|
+
" actions: {},",
|
|
14
|
+
"})",
|
|
15
|
+
"",
|
|
16
|
+
"if (import.meta.hot) {",
|
|
17
|
+
" import.meta.hot.accept(acceptHMRUpdate(use${TM_FILENAME_BASE/^(.*)$/${1:/pascalcase}/}Store, import.meta.hot))",
|
|
18
|
+
"}",
|
|
19
|
+
""
|
|
20
|
+
]
|
|
21
|
+
},
|
|
22
|
+
"SRCDEV Pinia Setup Store Boilerplate": {
|
|
23
|
+
"description": "Bootstrap the code needed for a Vue.js Pinia Setup Store file",
|
|
24
|
+
"scope": "javascript,typescript",
|
|
25
|
+
"body": [
|
|
26
|
+
"import { defineStore, acceptHMRUpdate } from 'pinia'",
|
|
27
|
+
"",
|
|
28
|
+
"export const use${TM_FILENAME_BASE/^(.*)$/${1:/pascalcase}/}Store = defineStore('$TM_FILENAME_BASE', () => {",
|
|
29
|
+
"$0",
|
|
30
|
+
" // State",
|
|
31
|
+
" const someNumber = ref(2);",
|
|
32
|
+
" const someString = ref(\"Value\");",
|
|
33
|
+
" const someBoolean = ref(true);",
|
|
34
|
+
" const someNumbersArray = ref<number[]>([]);",
|
|
35
|
+
" const someStringArray = ref<string[]>([]);",
|
|
36
|
+
"",
|
|
37
|
+
" // Getters",
|
|
38
|
+
" const numberValue = computed(() => someNumber.value);",
|
|
39
|
+
" const doubleNumberValue = computed(() => someNumber.value * 2);",
|
|
40
|
+
"",
|
|
41
|
+
" // Actions",
|
|
42
|
+
" const increment = (amount = 1) => {",
|
|
43
|
+
" someNumber.value += amount;",
|
|
44
|
+
" };",
|
|
45
|
+
"",
|
|
46
|
+
" return {",
|
|
47
|
+
" numberValue,",
|
|
48
|
+
" doubleNumberValue,",
|
|
49
|
+
" increment",
|
|
50
|
+
" };",
|
|
51
|
+
"},",
|
|
52
|
+
"{",
|
|
53
|
+
" persist: {",
|
|
54
|
+
" storage: piniaPluginPersistedstate.cookies(),",
|
|
55
|
+
" },",
|
|
56
|
+
"}",
|
|
57
|
+
"",
|
|
58
|
+
"if (import.meta.hot) {",
|
|
59
|
+
" import.meta.hot.accept(acceptHMRUpdate(use${TM_FILENAME_BASE/^(.*)$/${1:/pascalcase}/}Store, import.meta.hot))",
|
|
60
|
+
"}"
|
|
61
|
+
]
|
|
62
|
+
}
|
|
63
|
+
}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
{
|
|
2
|
+
"SRCDEV PricingCard Single": {
|
|
3
|
+
"description": "Single PricingCard component with basic props",
|
|
4
|
+
"scope": "vue,html",
|
|
5
|
+
"body": [
|
|
6
|
+
"<PricingCard",
|
|
7
|
+
" planName=\"$1Single Site\"",
|
|
8
|
+
" :price=\"$2199\"",
|
|
9
|
+
" billingPeriod=\"$3one-time\"",
|
|
10
|
+
" description=\"$4Perfect for freelancers and solo practitioners.\"",
|
|
11
|
+
" :features=\"[",
|
|
12
|
+
" '$5Feature 1',",
|
|
13
|
+
" '$6Feature 2',",
|
|
14
|
+
" '$7Feature 3',",
|
|
15
|
+
" ]\"",
|
|
16
|
+
" @select=\"$8handleSelect\"",
|
|
17
|
+
"/>"
|
|
18
|
+
]
|
|
19
|
+
},
|
|
20
|
+
"SRCDEV PricingCard Highlighted": {
|
|
21
|
+
"description": "PricingCard with 'Most Popular' highlight",
|
|
22
|
+
"scope": "vue,html",
|
|
23
|
+
"body": [
|
|
24
|
+
"<PricingCard",
|
|
25
|
+
" planName=\"$1Agency\"",
|
|
26
|
+
" :price=\"$2499\"",
|
|
27
|
+
" billingPeriod=\"$3one-time\"",
|
|
28
|
+
" description=\"$4Best for growing teams.\"",
|
|
29
|
+
" :is-highlighted=\"true\"",
|
|
30
|
+
" :features=\"[",
|
|
31
|
+
" '$5Feature 1',",
|
|
32
|
+
" '$6Feature 2',",
|
|
33
|
+
" '$7Feature 3',",
|
|
34
|
+
" ]\"",
|
|
35
|
+
" @select=\"$8handleSelect\"",
|
|
36
|
+
"/>"
|
|
37
|
+
]
|
|
38
|
+
},
|
|
39
|
+
"SRCDEV PricingCard Grid": {
|
|
40
|
+
"description": "Three-card pricing comparison grid",
|
|
41
|
+
"scope": "vue,html",
|
|
42
|
+
"body": [
|
|
43
|
+
"<div class=\"pricing-cards-grid\">",
|
|
44
|
+
" <PricingCard",
|
|
45
|
+
" planName=\"Single Site\"",
|
|
46
|
+
" :price=\"$1199\"",
|
|
47
|
+
" billingPeriod=\"one-time\"",
|
|
48
|
+
" description=\"$2For freelancers.\"",
|
|
49
|
+
" :features=\"['$3Feature 1', '$4Feature 2']\"",
|
|
50
|
+
" @select=\"handleSelect\"",
|
|
51
|
+
" />",
|
|
52
|
+
" <PricingCard",
|
|
53
|
+
" planName=\"Agency\"",
|
|
54
|
+
" :price=\"$5499\"",
|
|
55
|
+
" billingPeriod=\"one-time\"",
|
|
56
|
+
" description=\"$6For growing teams.\"",
|
|
57
|
+
" :is-highlighted=\"true\"",
|
|
58
|
+
" :features=\"['$7Feature 1', '$8Feature 2', '$9Feature 3']\"",
|
|
59
|
+
" @select=\"handleSelect\"",
|
|
60
|
+
" />",
|
|
61
|
+
" <PricingCard",
|
|
62
|
+
" planName=\"Unlimited\"",
|
|
63
|
+
" :price=\"$10999\"",
|
|
64
|
+
" billingPeriod=\"one-time\"",
|
|
65
|
+
" description=\"$11Enterprise plan.\"",
|
|
66
|
+
" :features=\"['$12Feature 1', '$13Feature 2', '$14Feature 3', '$15Feature 4']\"",
|
|
67
|
+
" @select=\"handleSelect\"",
|
|
68
|
+
" />",
|
|
69
|
+
"</div>"
|
|
70
|
+
]
|
|
71
|
+
},
|
|
72
|
+
"SRCDEV PricingCard CSS Override": {
|
|
73
|
+
"description": "CSS override scaffold for PricingCard tokens",
|
|
74
|
+
"scope": "css",
|
|
75
|
+
"body": [
|
|
76
|
+
".$1pricing-page {",
|
|
77
|
+
" .pricing-card {",
|
|
78
|
+
" --pricing-card-border-radius: $2;",
|
|
79
|
+
" --pricing-card-padding: $3;",
|
|
80
|
+
" --pricing-card-gap: $4;",
|
|
81
|
+
" --pricing-card-shadow: $5;",
|
|
82
|
+
" --pricing-card-name-color: $6;",
|
|
83
|
+
" --pricing-card-amount-color: $7;",
|
|
84
|
+
" --pricing-card-cta-bg: $8;",
|
|
85
|
+
" --pricing-card-cta-bg-hover: $9;",
|
|
86
|
+
"",
|
|
87
|
+
" &.is-highlighted {",
|
|
88
|
+
" --pricing-card-highlight-border: $10;",
|
|
89
|
+
" --pricing-card-highlight-shadow: $11;",
|
|
90
|
+
" --pricing-card-highlight-scale: $12;",
|
|
91
|
+
" }",
|
|
92
|
+
" }",
|
|
93
|
+
"}"
|
|
94
|
+
]
|
|
95
|
+
}
|
|
96
|
+
}
|