@stacksjs/defaults 0.75.192 → 0.75.195

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.
@@ -642,3 +642,11 @@ selected permissions, discovery and subject-owned disconnect. Mount protocol
642
642
  POST handlers with `parseBody(false)` and `skipCsrf()`; keep router login and CSRF
643
643
  protection on consent and connection management. Do not duplicate these HTTP
644
644
  boundaries in applications or accept a subject from client input.
645
+
646
+ Delegated OAuth bearers are not ordinary login credentials. `Auth.validateToken`,
647
+ `Auth.getUserFromToken`, `Auth.currentAccessToken` and `Auth.rotateToken` reject
648
+ them even while their grant is active. Generic `auth` middleware therefore does
649
+ not authenticate them. OAuth resource endpoints must explicitly use
650
+ `authorizeOAuthDelegatedToken` with the exact resource, audience, workspace and
651
+ required scopes. Ordinary refresh also refuses delegated refresh credentials;
652
+ use the OAuth token endpoint and the registered client's protocol authentication.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: stacks-dashboard
3
- description: Use when building or customizing the Stacks admin dashboard, including dashboard pages, model management views, analytics widgets, commerce dashboards, content management, settings panels, deployment monitoring, job/queue management, or the 411 built-in dashboard components. Covers the dashboard system at storage/framework/defaults/.
3
+ description: Use when building or customizing the Stacks admin dashboard, including dashboard pages, model management views, analytics widgets, commerce dashboards, content management, settings panels, deployment monitoring, job/queue management, or the 412 built-in dashboard components. Covers the dashboard system at storage/framework/defaults/.
4
4
  license: MIT
5
5
  compatibility: Bun >= 1.3.0, TypeScript
6
6
  allowed-tools: Read Edit Write Bash Grep Glob
@@ -8,7 +8,7 @@ allowed-tools: Read Edit Write Bash Grep Glob
8
8
 
9
9
  # Stacks Dashboard
10
10
 
11
- The Stacks admin dashboard provides a full-featured admin panel with 100+ route views, 411 components, and a multi-section layout.
11
+ The Stacks admin dashboard provides a full-featured admin panel with 100+ route views, 412 components, and a multi-section layout.
12
12
 
13
13
  ## Key Paths
14
14
  - Dashboard components: `storage/framework/defaults/resources/components/Dashboard/`
@@ -61,6 +61,20 @@ Full pagination provides counts and page jumps. Simple/cursor results do not
61
61
  have a last page; render previous/next controls using their URLs/cursors.
62
62
  Outside a request, missing URL context is normal rather than a broken query.
63
63
 
64
+ ## Membership completion
65
+
66
+ `<MembershipCard>` renders a metal keepsake with an engraved name, a finite
67
+ entrance and light sweep, and a brief confetti burst. Pass localized `brand`,
68
+ `label`, `nameLabel`, `name` and optional `detail` props. Mount it only after
69
+ the operation succeeds; it does not grant membership or represent a check-in
70
+ credential. Set `:celebrate="false"` when displaying an existing card. Motion
71
+ is gated by `prefers-reduced-motion`; the card remains readable without it.
72
+
73
+ ```stx
74
+ <MembershipCard :if="joined" :name="memberName" brand="My club"
75
+ label="Membership card" nameLabel="Member" :detail="planName" />
76
+ ```
77
+
64
78
  ## Gotchas
65
79
 
66
80
  - `config/ui.ts` configures STX topology; `config/css.ts` configures utilities.
@@ -2,7 +2,7 @@
2
2
  "publisher": "Stacks",
3
3
  "name": "vscode-stacks",
4
4
  "displayName": "Stacks",
5
- "version": "0.75.192",
5
+ "version": "0.75.195",
6
6
  "description": "Stacks, built into VS Code: stx templates, pickier linting and formatting, encrypted env files, the dev server preview and every buddy command. No other extensions required.",
7
7
  "license": "MIT",
8
8
  "funding": "https://github.com/sponsors/chrisbbreuer",
@@ -144,6 +144,11 @@
144
144
  "command": "stx.reloadUtilityClasses",
145
145
  "title": "Reload Utility Class Configuration",
146
146
  "category": "stx"
147
+ },
148
+ {
149
+ "command": "stx.extractToComponent",
150
+ "title": "Extract to Component",
151
+ "category": "stx"
147
152
  }
148
153
  ],
149
154
  "menus": {
@@ -281,6 +286,11 @@
281
286
  "default": true,
282
287
  "description": "Validate that template paths in @include and @component directives exist"
283
288
  },
289
+ "stx.diagnostics.validateComponentProps": {
290
+ "type": "boolean",
291
+ "default": true,
292
+ "description": "Validate required and unknown props passed through @component directives"
293
+ },
284
294
  "stx.completion.enable": {
285
295
  "type": "boolean",
286
296
  "default": true,
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@stacksjs/defaults",
3
3
  "type": "module",
4
4
  "sideEffects": false,
5
- "version": "0.75.192",
5
+ "version": "0.75.195",
6
6
  "repository": {
7
7
  "type": "git",
8
8
  "url": "git+https://github.com/stacksjs/stacks.git",
@@ -55,7 +55,7 @@
55
55
  "dependencies": {
56
56
  "@iconify-json/f7": "^1.2.2",
57
57
  "@iconify-json/hugeicons": "^1.2.35",
58
- "@stacksjs/mobile": "0.75.192",
58
+ "@stacksjs/mobile": "0.75.195",
59
59
  "@stacksjs/sanitizer": "^0.2.534",
60
60
  "@xterm/addon-fit": "^0.11.0",
61
61
  "@xterm/xterm": "^6.0.0",
@@ -0,0 +1,66 @@
1
+ <script client>
2
+ /** A personalized keepsake. Mount after confirmed completion to play once. */
3
+ const mcName = useReactiveProp<string>('name', '')
4
+ const mcBrand = useReactiveProp<string>('brand', '')
5
+ const mcDetail = useReactiveProp<string>('detail', '')
6
+ const mcLabel = useReactiveProp<string>('label', '')
7
+ const mcNameLabel = useReactiveProp<string>('nameLabel', '')
8
+ const mcCelebrate = useReactiveProp<boolean>('celebrate', true)
9
+ const mcPieces = Array.from({ length: 32 }, (_, id) => ({
10
+ id,
11
+ style: `--mc-x:${(id * 37 + 11) % 100}%;--mc-drift:${(id * 29 % 160) - 80}px;--mc-delay:${id % 8 * 65}ms;--mc-turn:${180 + id * 47}deg;--mc-color:${['#99f6e4', '#e2e8f0', '#5eead4', '#94a3b8'][id % 4]}`,
12
+ }))
13
+ </script>
14
+
15
+ <div class="relative mx-auto w-full mc-stage" :class="mcCelebrate ? 'mc-celebrate' : ''" data-membership-reveal>
16
+ <div :if="mcCelebrate" class="absolute inset-0 overflow-hidden pointer-events-none mc-confetti" aria-hidden="true">
17
+ <span :for="piece in mcPieces" :key="piece.id" class="mc-piece" :style="piece.style"></span>
18
+ </div>
19
+ <article class="overflow-hidden relative mx-auto w-full mc-metal" :aria-label="mcLabel" data-membership-card>
20
+ <div class="absolute inset-0 pointer-events-none mc-grain" aria-hidden="true"></div>
21
+ <div class="absolute inset-0 pointer-events-none mc-shine" aria-hidden="true"></div>
22
+ <div class="flex relative gap-4 items-start justify-between">
23
+ <span class="font-bold mc-wordmark" :text="mcBrand"></span>
24
+ <i class="shrink-0 h-6 w-6 i-lucide-sparkles mc-emblem" aria-hidden="true"></i>
25
+ </div>
26
+ <p class="relative mt-3 text-xs mc-label" :text="mcLabel"></p>
27
+ <div class="relative mc-holder">
28
+ <p class="mb-2 text-xs mc-label" :text="mcNameLabel"></p>
29
+ <p class="font-semibold mc-engraving" :text="mcName" data-membership-name></p>
30
+ <p :if="mcDetail" class="mt-3 text-xs mc-detail" :text="mcDetail"></p>
31
+ </div>
32
+ </article>
33
+ </div>
34
+
35
+ <style>
36
+ .mc-stage { max-width: 28rem; padding: 2rem 0 2.5rem; perspective: 1000px; }
37
+ .mc-metal {
38
+ box-sizing: border-box; min-height: 15.5rem; padding: clamp(1.25rem, 5vw, 2rem); border-radius: 1.25rem;
39
+ color: #e2e8f0; border: 1px solid #87939d;
40
+ background: linear-gradient(125deg, #596570 0%, #28343e 22%, #111c25 48%, #35434f 74%, #657480 100%);
41
+ box-shadow: inset 0 1px 0 #f1f5f9a6, inset 0 -2px 0 #050b10, inset 1px 0 0 #cbd5e133, 0 24px 40px -20px #02061799;
42
+ }
43
+ .mc-metal::after { content: ''; position: absolute; inset: 6px; border: 1px solid #cbd5e126; border-radius: 1rem; pointer-events: none; }
44
+ .mc-grain { opacity: 0.35; background: repeating-linear-gradient(0deg, transparent, transparent 1px, #cbd5e114 1px, #cbd5e114 2px); }
45
+ .mc-shine { transform: translateX(-150%) skewX(-20deg); background: linear-gradient(90deg, transparent 25%, #ffffff30 48%, #ffffff66 50%, #ffffff12 54%, transparent 75%); }
46
+ .mc-wordmark { font-size: clamp(1.3rem, 5vw, 1.75rem); letter-spacing: -0.06em; overflow-wrap: anywhere; text-shadow: 0 -1px 1px #020617, 0 1px 0 #ffffff55; }
47
+ .mc-emblem { color: #99f6e4; }
48
+ .mc-label { color: #cbd5e1; letter-spacing: 0.12em; }
49
+ .mc-holder { margin-top: 3rem; }
50
+ .mc-engraving { font-size: clamp(1.15rem, 4.8vw, 1.6rem); line-height: 1.3; letter-spacing: 0.025em; overflow-wrap: anywhere; color: #e2e8f0; text-shadow: 0 -1px 1px #020617, 0 1px 0 #ffffff80, 0 2px 2px #02061780; }
51
+ .mc-detail { color: #cbd5e1; overflow-wrap: anywhere; }
52
+ .mc-confetti { z-index: 2; }
53
+ .mc-piece { position: absolute; top: 0; left: var(--mc-x); width: 5px; height: 10px; border-radius: 1px; background: var(--mc-color); opacity: 0; }
54
+ @media (prefers-reduced-motion: no-preference) {
55
+ .mc-celebrate .mc-metal { animation: mc-arrive 1100ms cubic-bezier(0.16, 1, 0.3, 1) both; }
56
+ .mc-celebrate .mc-shine { animation: mc-polish 1700ms ease-in-out 650ms both; }
57
+ .mc-celebrate .mc-piece { animation: mc-fall 2400ms cubic-bezier(0.2, 0.65, 0.45, 1) var(--mc-delay) both; }
58
+ .mc-metal:hover .mc-shine { transform: translateX(150%) skewX(-20deg); transition: transform 1400ms ease; }
59
+ }
60
+ @media (prefers-reduced-motion: reduce) {
61
+ .mc-confetti, .mc-shine { display: none; }
62
+ }
63
+ @keyframes mc-arrive { from { opacity: 0; transform: translateY(32px) rotateX(16deg) rotateY(-12deg) scale(0.92); } to { opacity: 1; transform: none; } }
64
+ @keyframes mc-polish { from { transform: translateX(-150%) skewX(-20deg); } to { transform: translateX(150%) skewX(-20deg); } }
65
+ @keyframes mc-fall { 0% { opacity: 0; transform: translateY(-12px) rotate(0deg); } 12% { opacity: 1; } 80% { opacity: 0.9; } 100% { opacity: 0; transform: translate(var(--mc-drift), 340px) rotate(var(--mc-turn)); } }
66
+ </style>