ima-claude 2.9.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.
- package/LICENSE +21 -0
- package/README.md +463 -0
- package/dist/cli.js +1064 -0
- package/package.json +49 -0
- package/platforms/claude/adapter.ts +115 -0
- package/platforms/junie/adapter.ts +254 -0
- package/platforms/junie/agents-template.md +113 -0
- package/platforms/junie/hook-translations.md +84 -0
- package/platforms/shared/detector.ts +27 -0
- package/platforms/shared/installer.ts +202 -0
- package/platforms/shared/types.ts +78 -0
- package/plugins/ima-claude/.claude-plugin/plugin.json +25 -0
- package/plugins/ima-claude/agents/explorer.md +30 -0
- package/plugins/ima-claude/agents/implementer.md +30 -0
- package/plugins/ima-claude/agents/memory.md +42 -0
- package/plugins/ima-claude/agents/reviewer.md +53 -0
- package/plugins/ima-claude/agents/tester.md +33 -0
- package/plugins/ima-claude/agents/wp-developer.md +46 -0
- package/plugins/ima-claude/hooks/README.md +145 -0
- package/plugins/ima-claude/hooks/atlassian_prereqs.py +112 -0
- package/plugins/ima-claude/hooks/block_sed_edits.py +59 -0
- package/plugins/ima-claude/hooks/bootstrap.sh +90 -0
- package/plugins/ima-claude/hooks/bootstrap_utility_check.py +94 -0
- package/plugins/ima-claude/hooks/composer_autoload_check.py +70 -0
- package/plugins/ima-claude/hooks/docs_organization.py +104 -0
- package/plugins/ima-claude/hooks/enforce_rg_over_grep.py +56 -0
- package/plugins/ima-claude/hooks/fp_utility_check.py +90 -0
- package/plugins/ima-claude/hooks/hook_logger.py +69 -0
- package/plugins/ima-claude/hooks/hooks.json +239 -0
- package/plugins/ima-claude/hooks/jira_issue_fetch.py +79 -0
- package/plugins/ima-claude/hooks/jquery_in_wordpress.py +92 -0
- package/plugins/ima-claude/hooks/memory_bootstrap.py +79 -0
- package/plugins/ima-claude/hooks/memory_store_reminder.py +75 -0
- package/plugins/ima-claude/hooks/prompt_coach.py +125 -0
- package/plugins/ima-claude/hooks/prompt_coach_digest.md +48 -0
- package/plugins/ima-claude/hooks/prompt_coach_system.md +30 -0
- package/plugins/ima-claude/hooks/sequential_thinking_check.py +81 -0
- package/plugins/ima-claude/hooks/serena_over_grep.py +96 -0
- package/plugins/ima-claude/hooks/serena_over_read.py +66 -0
- package/plugins/ima-claude/hooks/serena_project_check.py +133 -0
- package/plugins/ima-claude/hooks/sql_injection_check.py +73 -0
- package/plugins/ima-claude/hooks/task_master_after_plan.py +31 -0
- package/plugins/ima-claude/hooks/task_master_before_impl.py +93 -0
- package/plugins/ima-claude/hooks/tavily_extract_advanced.py +48 -0
- package/plugins/ima-claude/hooks/vestige_before_external.py +86 -0
- package/plugins/ima-claude/hooks/webfetch_to_tavily.py +42 -0
- package/plugins/ima-claude/hooks/websearch_to_tavily.py +41 -0
- package/plugins/ima-claude/hooks/wp_security_check.py +150 -0
- package/plugins/ima-claude/personalities/README.md +45 -0
- package/plugins/ima-claude/personalities/enable-40k.md +69 -0
- package/plugins/ima-claude/personalities/enable-templars.md +69 -0
- package/plugins/ima-claude/skills/.research-summary.md +340 -0
- package/plugins/ima-claude/skills/architect/SKILL.md +304 -0
- package/plugins/ima-claude/skills/compound-bridge/SKILL.md +200 -0
- package/plugins/ima-claude/skills/discourse/SKILL.md +440 -0
- package/plugins/ima-claude/skills/discourse-admin/SKILL.md +192 -0
- package/plugins/ima-claude/skills/discourse-admin/references/api-endpoints.md +441 -0
- package/plugins/ima-claude/skills/discourse-admin/references/gotchas.md +107 -0
- package/plugins/ima-claude/skills/discourse-admin/references/staging-defaults.md +98 -0
- package/plugins/ima-claude/skills/discourse-admin/scripts/discourse-admin.py +319 -0
- package/plugins/ima-claude/skills/docs-organize/SKILL.md +254 -0
- package/plugins/ima-claude/skills/docs-organize/templates/active-README.md +50 -0
- package/plugins/ima-claude/skills/docs-organize/templates/archive-README.md +57 -0
- package/plugins/ima-claude/skills/docs-organize/templates/docs-README.md +43 -0
- package/plugins/ima-claude/skills/docs-organize/templates/phase-archive-README.md +83 -0
- package/plugins/ima-claude/skills/docs-organize/templates/section-README.md +48 -0
- package/plugins/ima-claude/skills/docs-organize/templates/transient-README.md +79 -0
- package/plugins/ima-claude/skills/docs-organize/templates/transient-gitignore +9 -0
- package/plugins/ima-claude/skills/ember-discourse/SKILL.md +496 -0
- package/plugins/ima-claude/skills/functional-programmer/SKILL.md +258 -0
- package/plugins/ima-claude/skills/ima-bootstrap/SKILL.md +278 -0
- package/plugins/ima-claude/skills/ima-bootstrap/references/bootstrap-patterns.md +356 -0
- package/plugins/ima-claude/skills/ima-bootstrap/references/ima-brand.md +273 -0
- package/plugins/ima-claude/skills/ima-bootstrap/references/theme-integration.md +212 -0
- package/plugins/ima-claude/skills/ima-brand/SKILL.md +108 -0
- package/plugins/ima-claude/skills/ima-brand/references/brand-identity.md +140 -0
- package/plugins/ima-claude/skills/ima-brand/references/digital-standards.md +180 -0
- package/plugins/ima-claude/skills/ima-brand/references/visual-system.md +173 -0
- package/plugins/ima-claude/skills/ima-forms-expert/SKILL.md +175 -0
- package/plugins/ima-claude/skills/ima-forms-expert/references/container-components.md +154 -0
- package/plugins/ima-claude/skills/ima-forms-expert/references/examples.md +328 -0
- package/plugins/ima-claude/skills/ima-forms-expert/references/field-components.md +298 -0
- package/plugins/ima-claude/skills/ima-forms-expert/references/form-factory.md +193 -0
- package/plugins/ima-claude/skills/ima-forms-expert/references/quick-reference.md +153 -0
- package/plugins/ima-claude/skills/ima-forms-expert/references/validation-engine.md +336 -0
- package/plugins/ima-claude/skills/jira-checkpoint/SKILL.md +178 -0
- package/plugins/ima-claude/skills/jquery/SKILL.md +413 -0
- package/plugins/ima-claude/skills/js-fp/SKILL.md +463 -0
- package/plugins/ima-claude/skills/js-fp/core-principles.md +487 -0
- package/plugins/ima-claude/skills/js-fp/examples/pure-functions.js +260 -0
- package/plugins/ima-claude/skills/js-fp/examples/tests/pure-functions.test.js +262 -0
- package/plugins/ima-claude/skills/js-fp/references/anti-patterns.md +120 -0
- package/plugins/ima-claude/skills/js-fp/references/performance-patterns.md +116 -0
- package/plugins/ima-claude/skills/js-fp/references/testing-patterns.md +134 -0
- package/plugins/ima-claude/skills/js-fp-api/SKILL.md +280 -0
- package/plugins/ima-claude/skills/js-fp-api/examples/crud-endpoint.js +258 -0
- package/plugins/ima-claude/skills/js-fp-api/references/middleware-patterns.md +134 -0
- package/plugins/ima-claude/skills/js-fp-api/references/security-sql.md +110 -0
- package/plugins/ima-claude/skills/js-fp-api/references/validation-patterns.md +165 -0
- package/plugins/ima-claude/skills/js-fp-react/SKILL.md +447 -0
- package/plugins/ima-claude/skills/js-fp-react/examples/ProductCard.tsx +65 -0
- package/plugins/ima-claude/skills/js-fp-react/references/hooks-advanced.md +136 -0
- package/plugins/ima-claude/skills/js-fp-react/references/performance-patterns.md +175 -0
- package/plugins/ima-claude/skills/js-fp-vue/SKILL.md +322 -0
- package/plugins/ima-claude/skills/js-fp-vue/references/complete-examples.md +397 -0
- package/plugins/ima-claude/skills/js-fp-vue/references/composables-advanced.md +282 -0
- package/plugins/ima-claude/skills/js-fp-vue/references/reactivity-patterns.md +348 -0
- package/plugins/ima-claude/skills/js-fp-vue/references/testing.md +314 -0
- package/plugins/ima-claude/skills/js-fp-wordpress/SKILL.md +301 -0
- package/plugins/ima-claude/skills/js-fp-wordpress/references/ajax-patterns.md +192 -0
- package/plugins/ima-claude/skills/js-fp-wordpress/references/event-patterns.md +136 -0
- package/plugins/ima-claude/skills/js-fp-wordpress/references/wp-integration.md +248 -0
- package/plugins/ima-claude/skills/livecanvas/SKILL.md +209 -0
- package/plugins/ima-claude/skills/livecanvas/references/livecanvas-features.md +311 -0
- package/plugins/ima-claude/skills/livecanvas/references/loops-and-logic.md +730 -0
- package/plugins/ima-claude/skills/livecanvas/references/picostrap.md +227 -0
- package/plugins/ima-claude/skills/mcp-atlassian/SKILL.md +339 -0
- package/plugins/ima-claude/skills/mcp-context7/SKILL.md +109 -0
- package/plugins/ima-claude/skills/mcp-memory/SKILL.md +182 -0
- package/plugins/ima-claude/skills/mcp-qdrant/SKILL.md +233 -0
- package/plugins/ima-claude/skills/mcp-sequential/SKILL.md +149 -0
- package/plugins/ima-claude/skills/mcp-serena/SKILL.md +174 -0
- package/plugins/ima-claude/skills/mcp-tavily/SKILL.md +118 -0
- package/plugins/ima-claude/skills/mcp-vestige/SKILL.md +259 -0
- package/plugins/ima-claude/skills/php-authnet/SKILL.md +275 -0
- package/plugins/ima-claude/skills/php-authnet/references/api-reference.md +624 -0
- package/plugins/ima-claude/skills/php-authnet/references/sandbox-testing.md +424 -0
- package/plugins/ima-claude/skills/php-fp/SKILL.md +333 -0
- package/plugins/ima-claude/skills/php-fp/examples/pure-functions.php +403 -0
- package/plugins/ima-claude/skills/php-fp/examples/tests/PureFunctionsTest.php +515 -0
- package/plugins/ima-claude/skills/php-fp/references/core-principles.md +277 -0
- package/plugins/ima-claude/skills/php-fp/references/testing-patterns.md +374 -0
- package/plugins/ima-claude/skills/php-fp-wordpress/SKILL.md +216 -0
- package/plugins/ima-claude/skills/php-fp-wordpress/references/fp-patterns.md +275 -0
- package/plugins/ima-claude/skills/php-fp-wordpress/references/plugin-architecture.md +295 -0
- package/plugins/ima-claude/skills/php-fp-wordpress/references/security-examples.md +203 -0
- package/plugins/ima-claude/skills/php-fp-wordpress/references/testing-strategy.md +259 -0
- package/plugins/ima-claude/skills/phpunit-wp/SKILL.md +716 -0
- package/plugins/ima-claude/skills/playwright/SKILL.md +434 -0
- package/plugins/ima-claude/skills/playwright/references/accessibility-testing.md +153 -0
- package/plugins/ima-claude/skills/playwright/references/ci-cd.md +268 -0
- package/plugins/ima-claude/skills/playwright/references/network-mocking.md +270 -0
- package/plugins/ima-claude/skills/playwright/references/visual-regression.md +215 -0
- package/plugins/ima-claude/skills/py-fp/SKILL.md +663 -0
- package/plugins/ima-claude/skills/py-fp/examples/pure-functions.py +185 -0
- package/plugins/ima-claude/skills/py-fp/examples/tests/test_pure_functions.py +244 -0
- package/plugins/ima-claude/skills/py-fp/references/core-principles.md +381 -0
- package/plugins/ima-claude/skills/py-fp/references/testing-patterns.md +283 -0
- package/plugins/ima-claude/skills/quasar-fp/SKILL.md +327 -0
- package/plugins/ima-claude/skills/quasar-fp/metadata.json +85 -0
- package/plugins/ima-claude/skills/quasar-fp/references/component-patterns.md +257 -0
- package/plugins/ima-claude/skills/quasar-fp/references/theme-integration.md +233 -0
- package/plugins/ima-claude/skills/quasar-fp/references/utility-classes.md +237 -0
- package/plugins/ima-claude/skills/quickstart/SKILL.md +129 -0
- package/plugins/ima-claude/skills/rails/SKILL.md +359 -0
- package/plugins/ima-claude/skills/resume-session/SKILL.md +68 -0
- package/plugins/ima-claude/skills/rg/SKILL.md +205 -0
- package/plugins/ima-claude/skills/ruby-fp/SKILL.md +336 -0
- package/plugins/ima-claude/skills/save-session/SKILL.md +81 -0
- package/plugins/ima-claude/skills/scorecard/SKILL.md +96 -0
- package/plugins/ima-claude/skills/skill-analyzer/SKILL.md +127 -0
- package/plugins/ima-claude/skills/skill-analyzer/references/advanced-checklist.md +44 -0
- package/plugins/ima-claude/skills/skill-analyzer/references/core-checklist.md +60 -0
- package/plugins/ima-claude/skills/skill-analyzer/scripts/analyze_skill.py +418 -0
- package/plugins/ima-claude/skills/skill-creator/LICENSE.txt +202 -0
- package/plugins/ima-claude/skills/skill-creator/SKILL.md +343 -0
- package/plugins/ima-claude/skills/skill-creator/references/output-patterns.md +82 -0
- package/plugins/ima-claude/skills/skill-creator/references/workflows.md +28 -0
- package/plugins/ima-claude/skills/skill-creator/scripts/init_skill.py +303 -0
- package/plugins/ima-claude/skills/skill-creator/scripts/package_skill.py +110 -0
- package/plugins/ima-claude/skills/skill-creator/scripts/quick_validate.py +103 -0
- package/plugins/ima-claude/skills/task-master/SKILL.md +51 -0
- package/plugins/ima-claude/skills/task-planner/SKILL.md +228 -0
- package/plugins/ima-claude/skills/task-runner/SKILL.md +192 -0
- package/plugins/ima-claude/skills/unit-testing/SKILL.md +198 -0
- package/plugins/ima-claude/skills/unit-testing/references/mock-patterns.md +181 -0
- package/plugins/ima-claude/skills/unit-testing/references/tdd-workflow.md +177 -0
- package/plugins/ima-claude/skills/unit-testing/references/test-strategy.md +126 -0
- package/plugins/ima-claude/skills/wp-local/SKILL.md +246 -0
- package/plugins/ima-claude/skills/wp-local/references/configuration.md +198 -0
- package/plugins/ima-claude/skills/wp-local/references/wp-cli-reference.md +406 -0
- package/plugins/ima-claude/skills/wp-local/scripts/wp-local.sh +61 -0
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: "quasar-fp"
|
|
3
|
+
description: "Quasar Framework best practices with utility-first CSS and FP patterns. Use when working with .vue files in Quasar projects, when creating Vue/Quasar components, or when user mentions Quasar, QBtn, QCard, or utility classes like q-pa-md. Enforces utility-first approach to prevent hand-written CSS for standard properties."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Quasar Framework - Functional Patterns & Utility-First Approach
|
|
7
|
+
|
|
8
|
+
## Core Principles
|
|
9
|
+
|
|
10
|
+
**Primary Directive**: "Utilities > custom CSS | Components > HTML | Theme system > inline styles"
|
|
11
|
+
|
|
12
|
+
### Anti-Over-Engineering for Quasar
|
|
13
|
+
- **DO NOT** write custom CSS for spacing, typography, colors, layout (use utilities)
|
|
14
|
+
- **DO NOT** reinvent components that Quasar provides (QBtn, QCard, QDialog, etc.)
|
|
15
|
+
- **DO NOT** bypass theme system with hardcoded colors or magic numbers
|
|
16
|
+
- **DO** use utilities first, custom CSS only for theme-specific brand elements
|
|
17
|
+
- **DO** leverage Quasar components for consistent UX and accessibility
|
|
18
|
+
- **DO** integrate with theme system via CSS custom properties and SCSS variables
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## Quick Decision Tree
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
Creating new component?
|
|
26
|
+
|-- Can Quasar utility classes handle spacing/layout/text?
|
|
27
|
+
| |-- YES --> Use utilities (q-pa-*, text-*, row/column)
|
|
28
|
+
| |-- NO --> Is this a standard UI pattern?
|
|
29
|
+
| |-- YES --> Use Quasar component (QBtn, QCard, QDialog)
|
|
30
|
+
| |-- NO --> Custom CSS, but use theme variables
|
|
31
|
+
|
|
|
32
|
+
|-- Final check: Does custom CSS exceed 20% of total styling?
|
|
33
|
+
|-- YES --> Refactor to use more utilities
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## Utility-First Pattern
|
|
39
|
+
|
|
40
|
+
### GOOD: Utility-First Approach
|
|
41
|
+
|
|
42
|
+
```vue
|
|
43
|
+
<template>
|
|
44
|
+
<div class="q-pa-md q-mb-lg rounded-borders">
|
|
45
|
+
<h2 class="text-h5 text-weight-bold text-primary q-mb-sm q-mt-none">
|
|
46
|
+
Title
|
|
47
|
+
</h2>
|
|
48
|
+
<p class="text-caption text-grey-7 q-mb-none">
|
|
49
|
+
Description text
|
|
50
|
+
</p>
|
|
51
|
+
<q-toggle
|
|
52
|
+
v-model="enabled"
|
|
53
|
+
label="Enable Feature"
|
|
54
|
+
class="text-weight-medium q-mb-sm"
|
|
55
|
+
/>
|
|
56
|
+
</div>
|
|
57
|
+
</template>
|
|
58
|
+
|
|
59
|
+
<style scoped lang="scss">
|
|
60
|
+
@import '@/styles/theme.scss';
|
|
61
|
+
|
|
62
|
+
/* ONLY theme-specific custom styling */
|
|
63
|
+
.custom-theme-box {
|
|
64
|
+
background-color: rgba($color-brand-primary, 0.05);
|
|
65
|
+
border-left: $border-width-thick solid $color-brand-accent;
|
|
66
|
+
}
|
|
67
|
+
</style>
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### BAD: Hand-Written CSS for Standard Properties
|
|
71
|
+
|
|
72
|
+
```vue
|
|
73
|
+
<!-- DO NOT DO THIS - utilities exist for all of these! -->
|
|
74
|
+
<style scoped>
|
|
75
|
+
.my-container {
|
|
76
|
+
padding: 16px; /* Use q-pa-md */
|
|
77
|
+
margin-bottom: 24px; /* Use q-mb-lg */
|
|
78
|
+
}
|
|
79
|
+
.my-title {
|
|
80
|
+
font-size: 1.5rem; /* Use text-h5 */
|
|
81
|
+
font-weight: 700; /* Use text-weight-bold */
|
|
82
|
+
color: #1976D2; /* Use text-primary */
|
|
83
|
+
}
|
|
84
|
+
</style>
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
## Common Anti-Patterns & Fixes
|
|
90
|
+
|
|
91
|
+
| Anti-Pattern | Fix |
|
|
92
|
+
|--------------|-----|
|
|
93
|
+
| `padding: 16px;` | `class="q-pa-md"` |
|
|
94
|
+
| `margin-bottom: 24px;` | `class="q-mb-lg"` |
|
|
95
|
+
| `font-size: 1.5rem; font-weight: 700;` | `class="text-h5 text-weight-bold"` |
|
|
96
|
+
| `color: #1976D2;` | `class="text-primary"` |
|
|
97
|
+
| `display: flex; align-items: center;` | `class="row items-center"` |
|
|
98
|
+
| `<button>` | `<q-btn>` |
|
|
99
|
+
| `<input>` | `<q-input>` |
|
|
100
|
+
| Custom card div | `<q-card>` |
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
## When to Use Custom CSS
|
|
105
|
+
|
|
106
|
+
Custom CSS is appropriate ONLY for:
|
|
107
|
+
|
|
108
|
+
1. **Theme-Specific Brand Colors:**
|
|
109
|
+
```scss
|
|
110
|
+
.prayer-card {
|
|
111
|
+
background-color: rgba($color-brand-primary, 0.05);
|
|
112
|
+
border-left: $border-width-thick solid $color-brand-accent;
|
|
113
|
+
}
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
2. **Unique Design Elements:**
|
|
117
|
+
```scss
|
|
118
|
+
.circular-badge {
|
|
119
|
+
width: 48px;
|
|
120
|
+
height: 48px;
|
|
121
|
+
border-radius: 50%;
|
|
122
|
+
background-color: $color-brand-primary;
|
|
123
|
+
}
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
3. **Custom Font Families:**
|
|
127
|
+
```scss
|
|
128
|
+
.prayer-title {
|
|
129
|
+
font-family: $font-family-prayer;
|
|
130
|
+
}
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
4. **Dark Mode Theme Overrides:**
|
|
134
|
+
```scss
|
|
135
|
+
body.body--dark {
|
|
136
|
+
.prayer-card {
|
|
137
|
+
background-color: rgba($color-brand-primary, 0.15);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
---
|
|
143
|
+
|
|
144
|
+
## Settings Panel Pattern
|
|
145
|
+
|
|
146
|
+
```vue
|
|
147
|
+
<script setup>
|
|
148
|
+
import { useUserPreferences } from '@/composables/useUserPreferences.js';
|
|
149
|
+
const userPrefs = useUserPreferences();
|
|
150
|
+
</script>
|
|
151
|
+
|
|
152
|
+
<template>
|
|
153
|
+
<q-expansion-item
|
|
154
|
+
default-opened
|
|
155
|
+
icon="settings"
|
|
156
|
+
label="Settings Section"
|
|
157
|
+
header-class="text-weight-bold"
|
|
158
|
+
>
|
|
159
|
+
<div class="q-pa-md">
|
|
160
|
+
<div class="q-pa-md q-mb-md rounded-borders bg-grey-1">
|
|
161
|
+
<q-toggle
|
|
162
|
+
v-model="userPrefs.someOption"
|
|
163
|
+
label="Enable Feature"
|
|
164
|
+
class="text-weight-medium q-mb-sm"
|
|
165
|
+
/>
|
|
166
|
+
<p class="text-caption text-grey-7 q-pl-sm q-mb-none">
|
|
167
|
+
Feature description using Quasar utilities
|
|
168
|
+
</p>
|
|
169
|
+
</div>
|
|
170
|
+
</div>
|
|
171
|
+
</q-expansion-item>
|
|
172
|
+
</template>
|
|
173
|
+
|
|
174
|
+
<style scoped lang="scss">
|
|
175
|
+
@import '@/styles/theme.scss';
|
|
176
|
+
|
|
177
|
+
/* Minimal custom CSS - ONLY for theme brand colors */
|
|
178
|
+
.option-box {
|
|
179
|
+
background-color: rgba($color-brand-secondary, 0.08);
|
|
180
|
+
border-left: $border-width-thick solid $color-brand-primary;
|
|
181
|
+
}
|
|
182
|
+
</style>
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
---
|
|
186
|
+
|
|
187
|
+
## Page Layout Pattern
|
|
188
|
+
|
|
189
|
+
```vue
|
|
190
|
+
<template>
|
|
191
|
+
<q-page class="q-pa-md">
|
|
192
|
+
<!-- Header with utilities -->
|
|
193
|
+
<div class="text-center q-py-lg q-mb-lg page-header">
|
|
194
|
+
<h1 class="text-h3 text-weight-bold text-primary q-mb-sm q-mt-none">
|
|
195
|
+
Page Title
|
|
196
|
+
</h1>
|
|
197
|
+
<p class="text-h6 text-italic text-accent q-mb-none">
|
|
198
|
+
Subtitle
|
|
199
|
+
</p>
|
|
200
|
+
</div>
|
|
201
|
+
|
|
202
|
+
<!-- Content sections -->
|
|
203
|
+
<div class="q-mb-xl">
|
|
204
|
+
<h2 class="text-h5 text-weight-bold text-primary q-my-md">
|
|
205
|
+
Section Title
|
|
206
|
+
</h2>
|
|
207
|
+
<!-- Content -->
|
|
208
|
+
</div>
|
|
209
|
+
</q-page>
|
|
210
|
+
</template>
|
|
211
|
+
|
|
212
|
+
<style scoped lang="scss">
|
|
213
|
+
@import '@/styles/theme.scss';
|
|
214
|
+
|
|
215
|
+
.page-header {
|
|
216
|
+
border-bottom: 2px solid rgba($color-brand-primary, 0.3);
|
|
217
|
+
}
|
|
218
|
+
</style>
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
---
|
|
222
|
+
|
|
223
|
+
## Composable Integration
|
|
224
|
+
|
|
225
|
+
```javascript
|
|
226
|
+
import { useQuasar } from 'quasar';
|
|
227
|
+
import { computed } from 'vue';
|
|
228
|
+
|
|
229
|
+
export function useThemeAwareStyles() {
|
|
230
|
+
const $q = useQuasar();
|
|
231
|
+
|
|
232
|
+
// Pure function: derive classes from state
|
|
233
|
+
const containerClasses = computed(() => ({
|
|
234
|
+
'q-pa-md': true,
|
|
235
|
+
'q-mb-lg': true,
|
|
236
|
+
'rounded-borders': true,
|
|
237
|
+
'bg-grey-1': !$q.dark.isActive,
|
|
238
|
+
'bg-grey-9': $q.dark.isActive
|
|
239
|
+
}));
|
|
240
|
+
|
|
241
|
+
return { containerClasses };
|
|
242
|
+
}
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
---
|
|
246
|
+
|
|
247
|
+
## Reference Files
|
|
248
|
+
|
|
249
|
+
For detailed information, consult these reference files:
|
|
250
|
+
|
|
251
|
+
- **[references/utility-classes.md](references/utility-classes.md)** - Complete utility class reference (spacing, typography, colors, flexbox)
|
|
252
|
+
- **[references/component-patterns.md](references/component-patterns.md)** - Quasar component usage patterns (QBtn, QCard, QDialog, etc.)
|
|
253
|
+
- **[references/theme-integration.md](references/theme-integration.md)** - Theme system, SCSS variables, CSS custom properties, dark mode
|
|
254
|
+
|
|
255
|
+
---
|
|
256
|
+
|
|
257
|
+
## Component Quick Reference
|
|
258
|
+
|
|
259
|
+
| Need | Use Component | Not HTML |
|
|
260
|
+
|------|---------------|----------|
|
|
261
|
+
| Button | `<q-btn>` | `<button>` |
|
|
262
|
+
| Text input | `<q-input>` | `<input>` |
|
|
263
|
+
| Dropdown | `<q-select>` | `<select>` |
|
|
264
|
+
| Toggle | `<q-toggle>` | Custom toggle |
|
|
265
|
+
| Card | `<q-card>` | `<div class="card">` |
|
|
266
|
+
| Modal | `<q-dialog>` | Custom modal |
|
|
267
|
+
| Tabs | `<q-tabs>` | Custom tabs |
|
|
268
|
+
| List | `<q-list>` + `<q-item>` | `<ul>` + `<li>` |
|
|
269
|
+
|
|
270
|
+
---
|
|
271
|
+
|
|
272
|
+
## Essential Utility Classes
|
|
273
|
+
|
|
274
|
+
### Spacing (8px grid)
|
|
275
|
+
- `q-pa-{xs|sm|md|lg|xl}` - Padding all sides (4px, 8px, 16px, 24px, 48px)
|
|
276
|
+
- `q-mb-{size}` - Margin bottom
|
|
277
|
+
- `q-mt-none` - Remove margin top
|
|
278
|
+
|
|
279
|
+
### Typography
|
|
280
|
+
- `text-h1` through `text-h6` - Headings
|
|
281
|
+
- `text-body1`, `text-body2`, `text-caption` - Body text
|
|
282
|
+
- `text-weight-bold`, `text-weight-medium` - Font weight
|
|
283
|
+
- `text-italic`, `text-uppercase` - Text style
|
|
284
|
+
|
|
285
|
+
### Colors
|
|
286
|
+
- `text-primary`, `text-secondary`, `text-accent` - Brand colors
|
|
287
|
+
- `text-grey-7` - Muted text
|
|
288
|
+
- `bg-grey-1` - Light background
|
|
289
|
+
|
|
290
|
+
### Layout
|
|
291
|
+
- `row`, `column` - Flex containers
|
|
292
|
+
- `items-center`, `justify-between` - Alignment
|
|
293
|
+
- `col`, `col-auto` - Flex items
|
|
294
|
+
|
|
295
|
+
---
|
|
296
|
+
|
|
297
|
+
## Success Metrics
|
|
298
|
+
|
|
299
|
+
Target values for components using this skill:
|
|
300
|
+
- Utility usage: 80%+ (utilities vs custom CSS)
|
|
301
|
+
- CSS reduction: 30-50% compared to hand-written
|
|
302
|
+
- Quasar component usage: 90%+ (vs raw HTML)
|
|
303
|
+
- Theme integration: 100% (no hardcoded colors)
|
|
304
|
+
- Dark mode support: Automatic via theme system
|
|
305
|
+
|
|
306
|
+
---
|
|
307
|
+
|
|
308
|
+
## Integration
|
|
309
|
+
|
|
310
|
+
### Dependencies
|
|
311
|
+
- Requires: `js-fp-vue` (Vue 3 FP patterns)
|
|
312
|
+
|
|
313
|
+
### Context7 Integration
|
|
314
|
+
Query Quasar docs when user asks about specific components or configuration:
|
|
315
|
+
```javascript
|
|
316
|
+
resolveLibraryId({ libraryName: 'quasar', query: 'QTable pagination' })
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
### Official Documentation
|
|
320
|
+
- Main: https://quasar.dev
|
|
321
|
+
- Utilities: https://quasar.dev/style/spacing
|
|
322
|
+
- Components: https://quasar.dev/vue-components
|
|
323
|
+
|
|
324
|
+
---
|
|
325
|
+
|
|
326
|
+
**Framework Version**: Quasar v2 + Vue 3
|
|
327
|
+
**Status**: Production-ready
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
{
|
|
2
|
+
"skill": "quasar-fp",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"category": "Frontend Framework",
|
|
5
|
+
"framework": "Quasar Framework (Vue 3)",
|
|
6
|
+
"purpose": "Quasar Framework best practices with utility-first CSS and FP patterns",
|
|
7
|
+
"auto_detect": true,
|
|
8
|
+
"detection": {
|
|
9
|
+
"file_patterns": [
|
|
10
|
+
"**/*.vue",
|
|
11
|
+
"**/quasar.config.js",
|
|
12
|
+
"**/quasar.variables.scss"
|
|
13
|
+
],
|
|
14
|
+
"import_patterns": [
|
|
15
|
+
"import.*from ['\"]quasar['\"]",
|
|
16
|
+
"useQuasar",
|
|
17
|
+
"@/composables/use.*\\.js"
|
|
18
|
+
],
|
|
19
|
+
"content_patterns": [
|
|
20
|
+
"<q-[a-z-]+",
|
|
21
|
+
"class=\"[^\"]*q-(pa|ma|pt|mt|mb|ml)-[a-z]{2,}",
|
|
22
|
+
"QBtn|QCard|QDialog|QExpansionItem|QToggle|QInput|QSelect"
|
|
23
|
+
],
|
|
24
|
+
"keywords": [
|
|
25
|
+
"create component",
|
|
26
|
+
"build UI",
|
|
27
|
+
"add form",
|
|
28
|
+
"settings panel",
|
|
29
|
+
"quasar component",
|
|
30
|
+
"vue component"
|
|
31
|
+
]
|
|
32
|
+
},
|
|
33
|
+
"confidence_weights": {
|
|
34
|
+
"quasar_config_exists": 0.95,
|
|
35
|
+
"vue_files_with_q_components": 0.90,
|
|
36
|
+
"quasar_imports": 0.85,
|
|
37
|
+
"vue_plus_component_keywords": 0.70
|
|
38
|
+
},
|
|
39
|
+
"mcp_integration": {
|
|
40
|
+
"context7": {
|
|
41
|
+
"library_name": "quasar",
|
|
42
|
+
"library_id": "/quasarframework/quasar",
|
|
43
|
+
"trigger_keywords": [
|
|
44
|
+
"how to use Q",
|
|
45
|
+
"Quasar component",
|
|
46
|
+
"quasar.config",
|
|
47
|
+
"Quasar documentation",
|
|
48
|
+
"Quasar styling"
|
|
49
|
+
],
|
|
50
|
+
"example_queries": [
|
|
51
|
+
"QTable server-side pagination",
|
|
52
|
+
"QDialog component props",
|
|
53
|
+
"Quasar theme customization",
|
|
54
|
+
"QInput validation rules"
|
|
55
|
+
]
|
|
56
|
+
},
|
|
57
|
+
"sequential": {
|
|
58
|
+
"trigger_keywords": [
|
|
59
|
+
"complex Quasar setup",
|
|
60
|
+
"Quasar configuration",
|
|
61
|
+
"plugin setup",
|
|
62
|
+
"boot file"
|
|
63
|
+
]
|
|
64
|
+
}
|
|
65
|
+
},
|
|
66
|
+
"dependencies": ["js-fp-vue"],
|
|
67
|
+
"related_skills": ["js-fp-react", "js-fp"],
|
|
68
|
+
"examples": {
|
|
69
|
+
"settings_panel": "src/components/chaplet/SevenSorrowsChapletOptions.vue",
|
|
70
|
+
"complex_component": "src/components/chaplet/SorrowSection.vue",
|
|
71
|
+
"page_layout": "src/pages/chaplets/SevenSorrowsChaplet.vue"
|
|
72
|
+
},
|
|
73
|
+
"success_metrics": {
|
|
74
|
+
"utility_usage_target": 0.80,
|
|
75
|
+
"css_reduction_target": 0.35,
|
|
76
|
+
"quasar_component_usage_target": 0.90,
|
|
77
|
+
"theme_integration_target": 1.0
|
|
78
|
+
},
|
|
79
|
+
"learning_resources": {
|
|
80
|
+
"official_docs": "https://quasar.dev",
|
|
81
|
+
"utility_reference": "https://quasar.dev/style/spacing",
|
|
82
|
+
"components": "https://quasar.dev/vue-components",
|
|
83
|
+
"theme_customization": "https://quasar.dev/style/theme-builder"
|
|
84
|
+
}
|
|
85
|
+
}
|
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
# Quasar Component Patterns - Best Practices
|
|
2
|
+
|
|
3
|
+
**Purpose**: Guide for using Quasar components effectively with Vue 3 Composition API
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Component Philosophy
|
|
8
|
+
|
|
9
|
+
**Use Quasar components instead of HTML** for:
|
|
10
|
+
- Better accessibility (built-in ARIA)
|
|
11
|
+
- Consistent UX (Material Design)
|
|
12
|
+
- Theme integration (auto-respects brand colors)
|
|
13
|
+
- Mobile optimization (touch-friendly, responsive)
|
|
14
|
+
- Less code (handles edge cases automatically)
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## Essential Components
|
|
19
|
+
|
|
20
|
+
### Buttons (QBtn)
|
|
21
|
+
|
|
22
|
+
```vue
|
|
23
|
+
<q-btn
|
|
24
|
+
@click="handleClick"
|
|
25
|
+
label="Click Me"
|
|
26
|
+
icon="check"
|
|
27
|
+
color="primary"
|
|
28
|
+
/>
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
**Common Props:**
|
|
32
|
+
- `label` - Button text
|
|
33
|
+
- `icon` / `icon-right` - Icons
|
|
34
|
+
- `color` - primary|secondary|accent|positive|negative
|
|
35
|
+
- `flat` - No background
|
|
36
|
+
- `outline` - Outlined style
|
|
37
|
+
- `rounded` - Rounded corners
|
|
38
|
+
- `loading` / `disable` - States
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
### Forms (QInput, QSelect, QToggle)
|
|
43
|
+
|
|
44
|
+
**QInput:**
|
|
45
|
+
```vue
|
|
46
|
+
<q-input
|
|
47
|
+
v-model="name"
|
|
48
|
+
label="Enter name"
|
|
49
|
+
outlined
|
|
50
|
+
:rules="[val => !!val || 'Required']"
|
|
51
|
+
/>
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
**QSelect:**
|
|
55
|
+
```vue
|
|
56
|
+
<q-select
|
|
57
|
+
v-model="selected"
|
|
58
|
+
:options="options"
|
|
59
|
+
label="Choose option"
|
|
60
|
+
outlined
|
|
61
|
+
/>
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
**QToggle:**
|
|
65
|
+
```vue
|
|
66
|
+
<q-toggle
|
|
67
|
+
v-model="enabled"
|
|
68
|
+
label="Enable Feature"
|
|
69
|
+
color="primary"
|
|
70
|
+
/>
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
### Cards (QCard)
|
|
76
|
+
|
|
77
|
+
```vue
|
|
78
|
+
<q-card flat bordered class="q-mb-md">
|
|
79
|
+
<q-card-section class="text-h6">Title</q-card-section>
|
|
80
|
+
<q-card-section>Content</q-card-section>
|
|
81
|
+
<q-card-actions align="right">
|
|
82
|
+
<q-btn label="Action" color="primary" />
|
|
83
|
+
</q-card-actions>
|
|
84
|
+
</q-card>
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
### Expansion Items (QExpansionItem)
|
|
90
|
+
|
|
91
|
+
```vue
|
|
92
|
+
<q-expansion-item
|
|
93
|
+
default-opened
|
|
94
|
+
icon="settings"
|
|
95
|
+
label="Settings Section"
|
|
96
|
+
header-class="text-weight-bold"
|
|
97
|
+
>
|
|
98
|
+
<q-card flat class="q-pa-md">
|
|
99
|
+
<!-- Content -->
|
|
100
|
+
</q-card>
|
|
101
|
+
</q-expansion-item>
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
### Lists (QList, QItem)
|
|
107
|
+
|
|
108
|
+
```vue
|
|
109
|
+
<q-list bordered class="rounded-borders">
|
|
110
|
+
<q-item clickable @click="handleClick">
|
|
111
|
+
<q-item-section avatar>
|
|
112
|
+
<q-icon name="settings" />
|
|
113
|
+
</q-item-section>
|
|
114
|
+
<q-item-section>
|
|
115
|
+
<q-item-label>Setting Name</q-item-label>
|
|
116
|
+
<q-item-label caption>Description</q-item-label>
|
|
117
|
+
</q-item-section>
|
|
118
|
+
<q-item-section side>
|
|
119
|
+
<q-toggle v-model="value" />
|
|
120
|
+
</q-item-section>
|
|
121
|
+
</q-item>
|
|
122
|
+
</q-list>
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
### Dialogs (QDialog)
|
|
128
|
+
|
|
129
|
+
```vue
|
|
130
|
+
<q-dialog v-model="dialogOpen">
|
|
131
|
+
<q-card style="min-width: 350px">
|
|
132
|
+
<q-card-section>
|
|
133
|
+
<div class="text-h6">Dialog Title</div>
|
|
134
|
+
</q-card-section>
|
|
135
|
+
<q-card-section class="q-pt-none">
|
|
136
|
+
Dialog content
|
|
137
|
+
</q-card-section>
|
|
138
|
+
<q-card-actions align="right">
|
|
139
|
+
<q-btn flat label="Cancel" v-close-popup />
|
|
140
|
+
<q-btn label="OK" color="primary" v-close-popup />
|
|
141
|
+
</q-card-actions>
|
|
142
|
+
</q-card>
|
|
143
|
+
</q-dialog>
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
---
|
|
147
|
+
|
|
148
|
+
## Complex Patterns
|
|
149
|
+
|
|
150
|
+
### Settings Panel
|
|
151
|
+
|
|
152
|
+
```vue
|
|
153
|
+
<template>
|
|
154
|
+
<q-expansion-item
|
|
155
|
+
default-opened
|
|
156
|
+
icon="settings"
|
|
157
|
+
label="Display Settings"
|
|
158
|
+
header-class="text-weight-bold"
|
|
159
|
+
>
|
|
160
|
+
<div class="q-pa-md">
|
|
161
|
+
<div class="q-pa-md q-mb-md rounded-borders bg-grey-1">
|
|
162
|
+
<q-toggle
|
|
163
|
+
v-model="setting1"
|
|
164
|
+
label="Show Feature"
|
|
165
|
+
class="text-weight-medium q-mb-sm"
|
|
166
|
+
/>
|
|
167
|
+
<p class="text-caption text-grey-7 q-pl-sm q-mb-none">
|
|
168
|
+
Feature description
|
|
169
|
+
</p>
|
|
170
|
+
</div>
|
|
171
|
+
</div>
|
|
172
|
+
</q-expansion-item>
|
|
173
|
+
</template>
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
### Responsive Header
|
|
177
|
+
|
|
178
|
+
```vue
|
|
179
|
+
<div class="text-center q-py-lg q-mb-lg">
|
|
180
|
+
<h1 class="text-h3 text-weight-bold text-primary q-mb-sm q-mt-none">
|
|
181
|
+
Page Title
|
|
182
|
+
</h1>
|
|
183
|
+
<p class="text-h6 text-italic text-accent q-mb-sm q-mt-none">
|
|
184
|
+
Subtitle
|
|
185
|
+
</p>
|
|
186
|
+
<p class="text-caption text-grey-7 q-mx-auto q-mb-none" style="max-width: 600px">
|
|
187
|
+
Description
|
|
188
|
+
</p>
|
|
189
|
+
</div>
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
---
|
|
193
|
+
|
|
194
|
+
## Dark Mode Pattern
|
|
195
|
+
|
|
196
|
+
```vue
|
|
197
|
+
<script setup>
|
|
198
|
+
import { useQuasar } from 'quasar';
|
|
199
|
+
import { computed } from 'vue';
|
|
200
|
+
|
|
201
|
+
const $q = useQuasar();
|
|
202
|
+
const isDark = computed(() => $q.dark.isActive);
|
|
203
|
+
const toggleDark = () => $q.dark.toggle();
|
|
204
|
+
</script>
|
|
205
|
+
|
|
206
|
+
<template>
|
|
207
|
+
<!-- Quasar utilities auto-handle dark mode -->
|
|
208
|
+
<div class="text-primary bg-secondary q-pa-md">
|
|
209
|
+
Automatically switches colors in dark mode
|
|
210
|
+
</div>
|
|
211
|
+
</template>
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
---
|
|
215
|
+
|
|
216
|
+
## Responsive Grid
|
|
217
|
+
|
|
218
|
+
```vue
|
|
219
|
+
<div class="row q-col-gutter-md">
|
|
220
|
+
<div class="col-12 col-sm-6 col-md-4">
|
|
221
|
+
<q-card>Content 1</q-card>
|
|
222
|
+
</div>
|
|
223
|
+
<div class="col-12 col-sm-6 col-md-4">
|
|
224
|
+
<q-card>Content 2</q-card>
|
|
225
|
+
</div>
|
|
226
|
+
<div class="col-12 col-sm-6 col-md-4">
|
|
227
|
+
<q-card>Content 3</q-card>
|
|
228
|
+
</div>
|
|
229
|
+
</div>
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
**Breakpoints:**
|
|
233
|
+
- `col-xs` - < 600px (mobile)
|
|
234
|
+
- `col-sm` - 600px - 1023px (tablet)
|
|
235
|
+
- `col-md` - 1024px - 1439px (desktop)
|
|
236
|
+
- `col-lg` - 1440px+ (large desktop)
|
|
237
|
+
|
|
238
|
+
---
|
|
239
|
+
|
|
240
|
+
## Quick Component Reference
|
|
241
|
+
|
|
242
|
+
| Need | Use Component | Not HTML |
|
|
243
|
+
|------|---------------|----------|
|
|
244
|
+
| Button | `<q-btn>` | `<button>` |
|
|
245
|
+
| Text input | `<q-input>` | `<input>` |
|
|
246
|
+
| Dropdown | `<q-select>` | `<select>` |
|
|
247
|
+
| Toggle | `<q-toggle>` | Custom toggle |
|
|
248
|
+
| Checkbox | `<q-checkbox>` | `<input type="checkbox">` |
|
|
249
|
+
| Card | `<q-card>` | `<div class="card">` |
|
|
250
|
+
| Modal | `<q-dialog>` | Custom modal |
|
|
251
|
+
| Tabs | `<q-tabs>` | Custom tabs |
|
|
252
|
+
| Table | `<q-table>` | `<table>` |
|
|
253
|
+
| Loading | `<q-spinner>` | Custom spinner |
|
|
254
|
+
|
|
255
|
+
---
|
|
256
|
+
|
|
257
|
+
**Reference**: https://quasar.dev/vue-components
|