varmory 1.0.3 → 1.0.5

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/package.json CHANGED
@@ -1,11 +1,13 @@
1
1
  {
2
2
  "name": "varmory",
3
3
  "description": "",
4
- "version": "1.0.3",
4
+ "version": "1.0.5",
5
5
  "files": [
6
6
  "dist",
7
7
  "mcp/showcaseMcp.js",
8
- "mcp/server.js"
8
+ "mcp/server.js",
9
+ "src/varmory/includes/normalizeQuasarApi.js",
10
+ "src/varmory/includes/package.json"
9
11
  ],
10
12
  "main": "./dist/varmory.umd.js",
11
13
  "module": "./dist/varmory.mjs",
@@ -22,13 +24,10 @@
22
24
  "builddemo": "NODE_ENV=production vite build --config demo.vite.config.mjs --emptyOutDir",
23
25
  "buildcomponent": "NODE_ENV=production vite build --config component.vite.config.mjs",
24
26
  "deploymcp": "npm run buildcomponent; npm run builddemo; bash mcp/heroku/deploy.sh varmory",
25
- "prepack": "rm -rf mcp/node_modules mcp/pnpm-lock.yaml",
26
- "postpack": "cd mcp && pnpm install",
27
27
  "prepublishOnly": "npm run buildcomponent"
28
28
  },
29
29
  "peerDependencies": {
30
30
  "@quasar/extras": "^1.17.0",
31
- "pinia": "^3.0.4",
32
31
  "quasar": "^2.0.0",
33
32
  "vue": "^3.0.0"
34
33
  },
@@ -39,7 +38,6 @@
39
38
  "@quasar/extras": "^1.17.0",
40
39
  "@quasar/vite-plugin": "^1.10.0",
41
40
  "@vitejs/plugin-vue": "^5.2.3",
42
- "pinia": "^3.0.4",
43
41
  "quasar": "^2.19.2",
44
42
  "vite": "^5.4.18",
45
43
  "vite-plugin-lib-inject-css": "^2.2.2",
@@ -0,0 +1,117 @@
1
+ function resolveEntry(name, def, base) {
2
+ if (!def || typeof def !== 'object') return def;
3
+ if (!def.extends) return def;
4
+ const source = base?.[def.extends] || base?.[name];
5
+ if (!source) {
6
+ const { extends: _e, ...rest } = def;
7
+ return rest;
8
+ }
9
+ const { extends: _e, ...overrides } = def;
10
+ return { ...source, ...overrides };
11
+ }
12
+
13
+ function mergeSection(target, source, base, mixinName) {
14
+ if (!source) return target;
15
+ const out = { ...target };
16
+ for (const [name, def] of Object.entries(source)) {
17
+ const resolved = resolveEntry(name, def, base);
18
+ if (mixinName) {
19
+ // Mixin pass: this is the source-of-truth for the prop. Replace + tag.
20
+ out[name] = { ...resolved, _mixin: mixinName };
21
+ } else if (out[name]) {
22
+ // Own-prop overlay on top of an existing (mixin) entry: keep mixin's
23
+ // desc/type/default, override only what's explicitly set. Preserves _mixin.
24
+ out[name] = { ...out[name], ...resolved };
25
+ } else {
26
+ out[name] = resolved;
27
+ }
28
+ }
29
+ return out;
30
+ }
31
+
32
+ function shortMixinName(ref) {
33
+ const last = ref.split('/').pop() || ref;
34
+ return last.replace(/^private\./, '');
35
+ }
36
+
37
+ function hasRawMarkers(raw) {
38
+ if (!raw || typeof raw !== 'object') return false;
39
+ if (Array.isArray(raw.mixins) && raw.mixins.length > 0) return true;
40
+ for (const section of ['props', 'slots', 'events', 'methods']) {
41
+ const bag = raw[section];
42
+ if (!bag) continue;
43
+ for (const def of Object.values(bag)) {
44
+ if (def && typeof def === 'object' && def.extends) return true;
45
+ }
46
+ }
47
+ return false;
48
+ }
49
+
50
+ export default function normalizeQuasarApi(raw, { apiExtends = {}, mixinLookup = {} } = {}) {
51
+ if (!hasRawMarkers(raw)) return raw;
52
+
53
+ const extProps = apiExtends?.props || {};
54
+ const extSlots = apiExtends?.slots || {};
55
+ const extEvents = apiExtends?.events || {};
56
+ const extMethods = apiExtends?.methods || {};
57
+
58
+ let props = {};
59
+ let slots = {};
60
+ let events = {};
61
+ let methods = {};
62
+
63
+ if (Array.isArray(raw.mixins)) {
64
+ for (const ref of raw.mixins) {
65
+ const mixin = mixinLookup[ref];
66
+ if (!mixin) continue;
67
+ const mixinName = shortMixinName(ref);
68
+ props = mergeSection(props, mixin.props, extProps, mixinName);
69
+ slots = mergeSection(slots, mixin.slots, extSlots, mixinName);
70
+ events = mergeSection(events, mixin.events, extEvents, mixinName);
71
+ methods = mergeSection(methods, mixin.methods, extMethods, mixinName);
72
+ }
73
+ }
74
+
75
+ props = mergeSection(props, raw.props, extProps);
76
+ slots = mergeSection(slots, raw.slots, extSlots);
77
+ events = mergeSection(events, raw.events, extEvents);
78
+ methods = mergeSection(methods, raw.methods, extMethods);
79
+
80
+ // Resolve `extends` inside nested scope/params objects (slots, events, methods).
81
+ // The base is `extProps` since these inner entries have prop-shaped definitions.
82
+ // IMPORTANT: clone the entry before assigning a new scope/params, otherwise we
83
+ // mutate the original raw JSON (which may be made reactive by Vue when stored
84
+ // in data()), feeding reactive updates back into our own dependency chain.
85
+ slots = remapNestedExtends(slots, 'scope', extProps);
86
+ events = remapNestedExtends(events, 'params', extProps);
87
+ methods = remapNestedExtends(methods, 'params', extProps);
88
+
89
+ // Order: required first, then component's own entries, then inherited (mixin) ones.
90
+ props = sortByOrigin(props);
91
+ slots = sortByOrigin(slots);
92
+ events = sortByOrigin(events);
93
+ methods = sortByOrigin(methods);
94
+
95
+ const { mixins: _m, ...rest } = raw;
96
+ return { ...rest, props, slots, events, methods };
97
+ }
98
+
99
+ function remapNestedExtends(bag, nestedKey, base) {
100
+ const out = {};
101
+ for (const [name, entry] of Object.entries(bag)) {
102
+ if (entry && typeof entry === 'object' && entry[nestedKey]) {
103
+ out[name] = { ...entry, [nestedKey]: mergeSection({}, entry[nestedKey], base) };
104
+ } else {
105
+ out[name] = entry;
106
+ }
107
+ }
108
+ return out;
109
+ }
110
+
111
+ function sortByOrigin(bag) {
112
+ const rank = (def) => (def?.required ? 0 : (def?._mixin ? 2 : 1));
113
+ const entries = Object.entries(bag);
114
+ // Stable sort (ES2019+) preserves original order within same rank.
115
+ entries.sort((a, b) => rank(a[1]) - rank(b[1]));
116
+ return Object.fromEntries(entries);
117
+ }
@@ -0,0 +1 @@
1
+ { "type": "module" }
@@ -1,4 +0,0 @@
1
- const r = '@import"https://fonts.googleapis.com/css2?family=Newsreader:ital,opsz,wght@0,6..72,200;0,6..72,300;0,6..72,400;0,6..72,500;0,6..72,600;0,6..72,700;0,6..72,800;1,6..72,400;1,6..72,500;1,6..72,600&family=Source+Sans+3:ital,wght@0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,400;1,500&family=IBM+Plex+Mono:wght@200;300;400;500;600;700&display=swap";:root{--font-display: "Helvetica Neue", sans-serif;--font-body: "Source Sans 3", "Helvetica Neue", sans-serif;--font-mono: "IBM Plex Mono", "Consolas", monospace}.jPanel.fullscreen{background:repeating-linear-gradient(45deg,transparent,transparent 23px,rgba(200,202,210,.06) 23px,rgba(200,202,210,.06) 24px),repeating-linear-gradient(-45deg,transparent,transparent 23px,rgba(200,202,210,.06) 23px,rgba(200,202,210,.06) 24px),linear-gradient(170deg,#141620,#1a1d28 40%,#1e2130,#1a1d28)}.portfolioHeader .portfolioHeader_frame{border-width:0px;background:repeating-linear-gradient(45deg,transparent,transparent 23px,color-mix(in srgb,var(--q-primary) 8%,transparent) 23px,color-mix(in srgb,var(--q-primary) 16%,transparent) 24px),repeating-linear-gradient(-45deg,transparent,transparent 23px,color-mix(in srgb,var(--q-primary) 12%,transparent) 23px,color-mix(in srgb,var(--q-primary) 6%,transparent) 24px),linear-gradient(170deg,color-mix(in srgb,var(--q-surface-1) 12%,var(--q-body-bg)),color-mix(in srgb,var(--q-surface-1) 12%,var(--q-body-bg)) 40%,color-mix(in srgb,var(--q-surface-1) 12%,var(--q-body-bg)),color-mix(in srgb,var(--q-surface-1) 12%,var(--q-body-bg)))}.portfolioHeader.compact .portfolioHeader_frame{background:var(--q-panel-compact-gradient);border-bottom-width:1px;border-color:var(--q-primary);border-image:linear-gradient(180deg,var(--q-primary),color-mix(in srgb,var(--q-primary) 25%,transparent)) 1}.portfolioHeader .portfolioHeader_frame:before{background:linear-gradient(90deg,transparent 5%,var(--q-primary) 30%,var(--q-primary) 50%,var(--q-secondary) 70%,transparent 95%)}.portfolioHeader .portfolioHeader_frame:after{background:radial-gradient(circle,color-mix(in srgb,var(--q-primary) 12%,transparent) 0%,transparent 70%)}.portfolioHeader .portfolioHeader_corner{border-color:var(--q-primary)}.portfolioHeader .portfolioHeader_tag{color:var(--q-secondary)}.portfolioHeader .portfolioHeader_tagDot{background:var(--q-secondary);box-shadow:0 0 8px var(--q-secondary),0 0 2px var(--q-primary)}.portfolioFooter .portfolioFooter_frame{background:var(--q-panel-compact-gradient);border-color:var(--q-primary);border-image:linear-gradient(90deg,transparent 5%,var(--q-primary) 30%,var(--q-primary) 50%,var(--q-secondary) 70%,transparent 95%) 1}.portfolioFooter .portfolioFooter_tag{color:var(--q-secondary)}.portfolioFooter .portfolioFooter_tagDot{background:var(--q-secondary);box-shadow:0 0 8px var(--q-secondary),0 0 2px var(--q-primary)}.portfolioFooter .portfolioFooter_divider{background:linear-gradient(90deg,transparent,color-mix(in srgb,var(--q-primary) 20%,transparent) 20%,color-mix(in srgb,var(--q-secondary) 15%,transparent) 80%,transparent)}';
2
- export {
3
- r as default
4
- };
@@ -1,4 +0,0 @@
1
- const r = '@import"https://fonts.googleapis.com/css2?family=MedievalSharp&family=EB+Garamond:ital,wght@0,400;0,500;0,600;0,700;0,800;1,400;1,500;1,600&family=JetBrains+Mono:wght@200;300;400;500;600;700;800&display=swap";:root{--font-display: "MedievalSharp", "Georgia", serif;--font-body: "EB Garamond", "Georgia", serif;--font-mono: "JetBrains Mono", monospace}.portfolioHeader .portfolioHeader_frame{border-width:0px;background:repeating-linear-gradient(127deg,transparent,transparent 40px,color-mix(in srgb,var(--q-secondary) 12%,var(--q-surface-2)) 40px,color-mix(in srgb,var(--q-secondary) 20%,var(--q-surface-2)) 41px,transparent 42px),repeating-linear-gradient(-38deg,transparent,transparent 55px,color-mix(in srgb,var(--q-secondary) 8%,var(--q-surface-2)) 55px,color-mix(in srgb,var(--q-secondary) 15%,var(--q-surface-2)) 56px,transparent 57px),repeating-linear-gradient(73deg,transparent,transparent 70px,color-mix(in srgb,var(--q-accent) 6%,var(--q-surface-2)) 70px,color-mix(in srgb,var(--q-accent) 10%,var(--q-surface-2)) 71px,transparent 72px),radial-gradient(ellipse 50% 70% at 35% 60%,color-mix(in srgb,var(--q-secondary) 6%,var(--q-surface-2)) 0%,transparent 70%),radial-gradient(ellipse 40% 50% at 75% 30%,color-mix(in srgb,var(--q-accent) 4%,var(--q-surface-2)) 0%,transparent 70%),linear-gradient(170deg,color-mix(in srgb,var(--q-surface-1) 90%,black) 0%,var(--q-surface-1) 50%,color-mix(in srgb,var(--q-surface-1) 90%,black) 100%)}.portfolioHeader.compact .portfolioHeader_frame{background:none;border-bottom-width:1px;border-color:var(--q-secondary);border-image:linear-gradient(90deg,transparent 5%,var(--q-secondary) 30%,color-mix(in srgb,var(--q-surface-2) 50%,var(--q-secondary)) 50%,var(--q-secondary) 70%,transparent 95%) 1}.portfolioHeader .portfolioHeader_frame:before{background:linear-gradient(90deg,transparent,var(--q-surface-2) 20%,var(--q-primary) 50%,var(--q-surface-2) 80%,transparent);opacity:.9}.portfolioHeader .portfolioHeader_frame:after{width:100%;height:100%;top:0;left:0;right:auto;background:radial-gradient(circle 600px at 85% 25%,color-mix(in srgb,var(--q-secondary) 14%,transparent) 0%,transparent 100%),radial-gradient(circle 400px at 75% 60%,color-mix(in srgb,var(--q-accent) 10%,transparent) 0%,transparent 100%),radial-gradient(circle 500px at 15% 35%,color-mix(in srgb,var(--q-secondary) 10%,transparent) 0%,transparent 100%),radial-gradient(circle 300px at 25% 75%,color-mix(in srgb,var(--q-accent) 8%,transparent) 0%,transparent 100%),radial-gradient(circle 750px at 50% 50%,color-mix(in srgb,var(--q-secondary) 5%,transparent) 0%,transparent 100%)}.portfolioHeader .portfolioHeader_corner{border-color:var(--q-secondary)}.portfolioHeader .portfolioHeader_tag{color:var(--q-secondary)}.portfolioHeader .portfolioHeader_tagDot{background:var(--q-secondary);box-shadow:0 0 4px var(--q-secondary),0 0 12px color-mix(in srgb,var(--q-secondary) 60%,transparent)}.portfolioFooter .portfolioFooter_frame{border-color:var(--q-secondary);border-image:linear-gradient(90deg,transparent 5%,var(--q-secondary) 30%,color-mix(in srgb,var(--q-surface-2) 50%,var(--q-secondary)) 50%,var(--q-secondary) 70%,transparent 95%) 1}.portfolioFooter .portfolioFooter_tag{color:var(--q-secondary)}.portfolioFooter .portfolioFooter_tagDot{background:var(--q-secondary);box-shadow:0 0 4px var(--q-secondary),0 0 12px color-mix(in srgb,var(--q-secondary) 60%,transparent)}.portfolioFooter .portfolioFooter_divider{background:linear-gradient(90deg,transparent,color-mix(in srgb,var(--q-secondary) 20%,transparent) 20%,color-mix(in srgb,var(--q-accent) 15%,transparent) 80%,transparent)}';
2
- export {
3
- r as default
4
- };
@@ -1,4 +0,0 @@
1
- const t = '@import"https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:ital,wght@0,200;0,300;0,400;0,500;0,600;0,700;0,800;1,400;1,500;1,600&family=DM+Sans:ital,opsz,wght@0,9..40,100;0,9..40,200;0,9..40,300;0,9..40,400;0,9..40,500;0,9..40,600;0,9..40,700;0,9..40,800;0,9..40,900;1,9..40,400;1,9..40,500&family=JetBrains+Mono:wght@200;300;400;500;600;700;800&display=swap";:root{--font-display: "Plus Jakarta Sans", "Helvetica Neue", sans-serif;--font-body: "DM Sans", "Helvetica Neue", sans-serif;--font-mono: "JetBrains Mono", monospace}.jPanel{border-radius:16px!important}.jPanel.fullscreen,.jPanelSquare{border-radius:0!important}.q-card{border-radius:16px!important}.q-dialog .q-card{border:none!important}.q-btn{border-radius:10px!important;letter-spacing:.3px!important;font-weight:600!important;text-transform:none!important;border-width:1px!important;transition:all .2s ease!important;border-color:transparent!important;box-shadow:0 2px 8px color-mix(in srgb,var(--q-primary) 30%,transparent)!important}.q-btn.q-btn--round{border-radius:50%!important}.q-btn.ghost{font-weight:200!important;box-shadow:none!important;background:transparent!important}.q-btn.ghost:hover{box-shadow:0 2px 8px color-mix(in srgb,var(--q-primary) 30%,transparent)!important;background:transparent!important}.q-btn.ghost:hover .q-focus-helper{background:transparent!important}.q-btn-group{border-radius:10px!important;border-color:transparent!important;box-shadow:0 2px 8px color-mix(in srgb,var(--q-primary) 30%,transparent)!important}.q-btn-group>.q-btn-item:not(:last-child){border-top-right-radius:0!important;border-bottom-right-radius:0!important}.q-btn-group>.q-btn-item:not(:first-child){border-top-left-radius:0!important;border-bottom-left-radius:0!important}.q-btn-group>.q-btn-item{box-shadow:none!important}';
2
- export {
3
- t as default
4
- };
@@ -1,4 +0,0 @@
1
- const r = '@import"https://fonts.googleapis.com/css2?family=Orbitron:wght@400;500;600;700;800;900&family=Space+Grotesk:wght@300;400;500;600;700&family=IBM+Plex+Mono:wght@200;300;400;500;600;700&display=swap";:root{--font-display: "Orbitron", "Space Grotesk", sans-serif;--font-body: "Space Grotesk", "IBM Plex Mono", sans-serif;--font-mono: "IBM Plex Mono", monospace}.portfolioHeader .portfolioHeader_frame{border-width:0px;background:repeating-linear-gradient(0deg,transparent,transparent 3px,color-mix(in srgb,var(--q-primary) 4%,transparent) 3px,color-mix(in srgb,var(--q-primary) 4%,transparent) 4px),radial-gradient(ellipse 120px 100% at 30% 50%,color-mix(in srgb,var(--q-primary) 8%,transparent) 0%,transparent 100%),linear-gradient(180deg,color-mix(in srgb,var(--q-primary) 4%,var(--q-surface-1)) 0%,var(--q-surface-1) 50%,color-mix(in srgb,var(--q-accent) 3%,var(--q-surface-1)) 100%)}.portfolioHeader.compact .portfolioHeader_frame{background:var(--q-panel-compact-gradient);border-bottom-width:1px;border-color:var(--q-primary);border-image:linear-gradient(90deg,transparent,var(--q-primary),transparent) 1}.portfolioHeader .portfolioHeader_frame:before{background:linear-gradient(90deg,transparent,var(--q-primary) 40%,var(--q-accent) 60%,transparent)}.portfolioHeader .portfolioHeader_frame:after{background:radial-gradient(ellipse 200px 150px at 85% 20%,color-mix(in srgb,var(--q-primary) 12%,transparent) 0%,transparent 100%)}.portfolioHeader .portfolioHeader_corner{border-color:color-mix(in srgb,var(--q-primary) 50%,var(--q-surface-border))}.portfolioHeader .portfolioHeader_tag{color:var(--q-primary)}.portfolioHeader .portfolioHeader_tagDot{background:var(--q-primary);box-shadow:0 0 8px var(--q-primary),0 0 2px var(--q-accent)}.portfolioHeader_collapsed .amountDisplay_currency,.portfolioHeader_collapsed .amountDisplay_whole,.portfolioHeader_collapsed .amountDisplay_decimal{color:var(--q-text-bright)}.portfolioFooter .portfolioFooter_frame{background:var(--q-panel-compact-gradient);border-color:var(--q-primary);border-image:linear-gradient(90deg,transparent,var(--q-primary),transparent) 1}.portfolioFooter .portfolioFooter_tag{color:var(--q-primary)}.portfolioFooter .portfolioFooter_tagDot{background:var(--q-primary);box-shadow:0 0 8px var(--q-primary),0 0 2px var(--q-accent)}.portfolioFooter .portfolioFooter_divider{background:linear-gradient(90deg,transparent,color-mix(in srgb,var(--q-primary) 20%,transparent) 20%,color-mix(in srgb,var(--q-accent) 15%,transparent) 80%,transparent)}';
2
- export {
3
- r as default
4
- };
@@ -1,4 +0,0 @@
1
- const a = ":root{--q-primary: #4ade80;--q-secondary: #d4a017;--q-accent: #a855f7;--q-dark: #0c0a08;--q-positive: #4ade80;--q-negative: #ef4444;--q-info: #60a5fa;--q-warning: #f59e0b;--q-body-bg: #0c0a08;--q-surface-0: #0c0a08;--q-surface-1: #1a1510;--q-surface-2: #251e16;--q-surface-3: #33291e;--q-surface-border: #4a3c2a;--q-surface-overlay: rgba(12, 10, 8, .88);--q-panel-gradient: linear-gradient(180deg, var(--q-surface-2) 0%, color-mix(in srgb, var(--q-surface-1) 80%, transparent) 100%);--q-panel-compact-gradient: linear-gradient(135deg, color-mix(in srgb, var(--q-surface-2) 95%, transparent) 0%, color-mix(in srgb, var(--q-surface-1) 90%, transparent) 100%);--q-text-bright: #f5e6d0;--q-text: #c9b89a;--q-text-muted: #7a6b56;--q-text-faint: rgba(201, 184, 154, .3);--q-glow-primary: color-mix(in srgb, var(--q-primary) 20%, transparent);--q-glow-accent: color-mix(in srgb, var(--q-accent) 20%, transparent);--q-glow-warning: color-mix(in srgb, var(--q-warning) 25%, transparent);--q-shadow-drop: color-mix(in srgb, black 60%, transparent);--q-shadow-inset: color-mix(in srgb, black 35%, transparent)}.jPanel.fullscreen{background:repeating-conic-gradient(rgba(201,184,154,.05) 0% 25%,transparent 0% 50%) 0 0 / 4px 4px,linear-gradient(175deg,#1e1812,#241c14,#2c2218 60%,#241c14)}";
2
- export {
3
- a as default
4
- };