srcdev-nuxt-components 9.3.0 → 9.3.2

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 (53) hide show
  1. package/.claude/hooks/check-component-update.sh +66 -0
  2. package/.claude/settings.json +1 -1
  3. package/.claude/skills/component-local-style-override.md +45 -0
  4. package/.claude/skills/components/accordian-core.md +26 -5
  5. package/.claude/skills/components/expanding-panel-classic.md +221 -0
  6. package/.claude/skills/components/expanding-panel.md +8 -8
  7. package/.claude/skills/components/navigation-items.md +51 -0
  8. package/.claude/skills/components/responsive-header.md +161 -0
  9. package/.claude/skills/components/site-header.md +98 -0
  10. package/.claude/skills/index.md +6 -1
  11. package/.claude/skills/page-transitions.md +116 -0
  12. package/.claude/skills/theming-form-geometry-tokens.md +12 -0
  13. package/.claude/skills/theming-override-default.md +14 -0
  14. package/.claude/skills/theming-partial-override.md +17 -0
  15. package/.vscode/srcdev-component-accordian-core.code-snippets +74 -0
  16. package/.vscode/srcdev-component-expanding-panel-classic.code-snippets +121 -0
  17. package/.vscode/srcdev-component-expanding-panel.code-snippets +1 -3
  18. package/.vscode/srcdev-component-responsive-header.code-snippets +46 -0
  19. package/.vscode/srcdev-component-site-header.code-snippets +74 -0
  20. package/app/components/02.molecules/expandable/accordian/AccordianCore.vue +19 -11
  21. package/app/components/02.molecules/expandable/accordian/CONSUMER-STYLING.md +93 -0
  22. package/app/components/02.molecules/expandable/accordian/stories/AccordianCore.stories.ts +31 -0
  23. package/app/components/02.molecules/expandable/accordian/tests/AccordianCore.spec.ts +31 -0
  24. package/app/components/02.molecules/expandable/accordian/tests/__snapshots__/AccordianCore.spec.ts.snap +7 -21
  25. package/app/components/02.molecules/expandable/expanding-panel/CONSUMER-STYLING.md +10 -10
  26. package/app/components/02.molecules/expandable/expanding-panel/ExpandingPanel.vue +35 -37
  27. package/app/components/02.molecules/expandable/expanding-panel/stories/ExpandingPanel.stories.ts +5 -6
  28. package/app/components/02.molecules/expandable/expanding-panel/tests/__snapshots__/ExpandingPanel.spec.ts.snap +5 -13
  29. package/app/components/02.molecules/expandable/expanding-panel-classic/CONSUMER-STYLING.md +103 -0
  30. package/app/components/02.molecules/expandable/expanding-panel-classic/ExpandingPanelClassic.vue +191 -0
  31. package/app/components/02.molecules/expandable/expanding-panel-classic/stories/ExpandingPanelClassic.stories.ts +293 -0
  32. package/app/components/02.molecules/expandable/expanding-panel-classic/tests/ExpandingPanelClassic.spec.ts +514 -0
  33. package/app/components/02.molecules/expandable/expanding-panel-classic/tests/__snapshots__/ExpandingPanelClassic.spec.ts.snap +59 -0
  34. package/app/components/03.organisms/responsive-header/CONSUMER-STYLING.md +66 -0
  35. package/app/components/{responsive-header → 03.organisms/responsive-header}/NavigationItems.vue +21 -28
  36. package/app/components/{responsive-header → 03.organisms/responsive-header}/ResponsiveHeader.vue +141 -43
  37. package/app/components/03.organisms/responsive-header/stories/NavigationItems.stories.ts +80 -0
  38. package/app/components/03.organisms/responsive-header/stories/ResponsiveHeader.stories.ts +122 -0
  39. package/app/components/03.organisms/responsive-header/tests/NavigationItems.spec.ts +155 -0
  40. package/app/components/03.organisms/responsive-header/tests/ResponsiveHeader.spec.ts +319 -0
  41. package/app/components/03.organisms/responsive-header/tests/__snapshots__/NavigationItems.spec.ts.snap +34 -0
  42. package/app/components/03.organisms/responsive-header/tests/__snapshots__/ResponsiveHeader.spec.ts.snap +72 -0
  43. package/app/components/03.organisms/site-header/CONSUMER-STYLING.md +60 -0
  44. package/app/components/03.organisms/site-header/SiteHeader.vue +96 -0
  45. package/app/components/03.organisms/site-header/stories/SiteHeader.stories.ts +135 -0
  46. package/app/components/03.organisms/site-header/tests/SiteHeader.spec.ts +103 -0
  47. package/app/components/03.organisms/site-header/tests/__snapshots__/SiteHeader.spec.ts.snap +15 -0
  48. package/app/components/05.forms/input-select/CONSUMER-STYLING.md +42 -0
  49. package/app/components/05.forms/input-select/InputSelectCore.vue +21 -9
  50. package/app/components/05.forms/input-text/CONSUMER-STYLING.md +60 -0
  51. package/app/components/05.forms/input-text/InputTextCore.vue +17 -8
  52. package/app/layouts/default.vue +64 -67
  53. package/package.json +4 -1
@@ -0,0 +1,293 @@
1
+ import ExpandingPanelClassic from "../ExpandingPanelClassic.vue";
2
+ import type { Meta, StoryObj } from "@nuxtjs/storybook";
3
+
4
+ const meta: Meta<typeof ExpandingPanelClassic> = {
5
+ title: "Molecules/Expandable/Expanding Panel Classic",
6
+ component: ExpandingPanelClassic,
7
+ argTypes: {
8
+ name: {
9
+ control: { type: "text" },
10
+ description: "Unique name used for ARIA attributes and to group panels in a native <details> accordion",
11
+ },
12
+ animationDuration: {
13
+ control: { type: "number", min: 0, step: 50 },
14
+ description: "Expand/collapse animation duration in milliseconds",
15
+ },
16
+ forceOpened: {
17
+ control: { type: "boolean" },
18
+ description: "When true, the panel is always open and the toggle icon is hidden",
19
+ },
20
+ contentIsOnTop: {
21
+ control: { type: "boolean" },
22
+ description:
23
+ "When true, the content region is positioned absolutely below the summary and raised above surrounding page content via z-index, instead of pushing layout down",
24
+ },
25
+ styleClassPassthrough: {
26
+ control: "object",
27
+ description: "Additional CSS classes applied to the root element",
28
+ },
29
+ },
30
+ args: {
31
+ name: "panel-demo",
32
+ animationDuration: 400,
33
+ forceOpened: false,
34
+ contentIsOnTop: false,
35
+ styleClassPassthrough: [],
36
+ },
37
+ };
38
+
39
+ export default meta;
40
+ type Story = StoryObj<typeof ExpandingPanelClassic>;
41
+
42
+ // ─── Stories ─────────────────────────────────────────────────────────────────
43
+
44
+ export const Default: Story = {
45
+ render: (args) => ({
46
+ components: { ExpandingPanelClassic },
47
+ setup() {
48
+ return { args };
49
+ },
50
+ template: `
51
+ <ExpandingPanelClassic v-bind="args">
52
+ <template #summary>
53
+ <span>Panel Summary</span>
54
+ </template>
55
+ <template #content>
56
+ <p style="margin:0;padding:0.5rem 0">
57
+ This is the panel content. It can contain any markup — text, images, or components.
58
+ </p>
59
+ </template>
60
+ </ExpandingPanelClassic>
61
+ `,
62
+ }),
63
+ };
64
+
65
+ export const InitiallyOpen: Story = {
66
+ name: "Initially Open",
67
+ args: {
68
+ name: "initially-open",
69
+ },
70
+ render: (args) => ({
71
+ components: { ExpandingPanelClassic },
72
+ setup() {
73
+ const isOpen = ref(true);
74
+ return { args, isOpen };
75
+ },
76
+ template: `
77
+ <ExpandingPanelClassic v-bind="args" v-model="isOpen">
78
+ <template #summary>
79
+ <span>This panel starts open</span>
80
+ </template>
81
+ <template #content>
82
+ <p style="margin:0;padding:0.5rem 0">
83
+ The panel was opened via v-model on mount.
84
+ </p>
85
+ </template>
86
+ </ExpandingPanelClassic>
87
+ `,
88
+ }),
89
+ };
90
+
91
+ export const ForceOpened: Story = {
92
+ name: "Force Opened",
93
+ args: {
94
+ name: "force-opened",
95
+ forceOpened: true,
96
+ },
97
+ render: (args) => ({
98
+ components: { ExpandingPanelClassic },
99
+ setup() {
100
+ return { args };
101
+ },
102
+ template: `
103
+ <ExpandingPanelClassic v-bind="args">
104
+ <template #summary>
105
+ <span>Always open — toggle icon hidden</span>
106
+ </template>
107
+ <template #content>
108
+ <p style="margin:0;padding:0.5rem 0">
109
+ When <code>forceOpened</code> is true the panel stays open and the icon is not rendered.
110
+ </p>
111
+ </template>
112
+ </ExpandingPanelClassic>
113
+ `,
114
+ }),
115
+ };
116
+
117
+ export const CustomIcon: Story = {
118
+ name: "Custom Icon",
119
+ args: {
120
+ name: "custom-icon",
121
+ },
122
+ render: (args) => ({
123
+ components: { ExpandingPanelClassic },
124
+ setup() {
125
+ return { args };
126
+ },
127
+ template: `
128
+ <ExpandingPanelClassic v-bind="args">
129
+ <template #summary>
130
+ <span>Panel with a custom icon</span>
131
+ </template>
132
+ <template #icon>
133
+ <span style="font-size:1.2rem">+</span>
134
+ </template>
135
+ <template #content>
136
+ <p style="margin:0;padding:0.5rem 0">
137
+ Replace the default caret with any element via the <code>icon</code> slot.
138
+ </p>
139
+ </template>
140
+ </ExpandingPanelClassic>
141
+ `,
142
+ }),
143
+ };
144
+
145
+ export const SlowAnimation: Story = {
146
+ name: "Slow Animation (800ms)",
147
+ args: {
148
+ name: "slow-animation",
149
+ animationDuration: 800,
150
+ },
151
+ render: (args) => ({
152
+ components: { ExpandingPanelClassic },
153
+ setup() {
154
+ return { args };
155
+ },
156
+ template: `
157
+ <ExpandingPanelClassic v-bind="args">
158
+ <template #summary>
159
+ <span>Slow animation panel</span>
160
+ </template>
161
+ <template #content>
162
+ <p style="margin:0;padding:0.5rem 0">
163
+ The expand/collapse transition runs over 800 ms.
164
+ </p>
165
+ </template>
166
+ </ExpandingPanelClassic>
167
+ `,
168
+ }),
169
+ };
170
+
171
+ export const NoAnimation: Story = {
172
+ name: "No Animation (0ms)",
173
+ args: {
174
+ name: "no-animation",
175
+ animationDuration: 0,
176
+ },
177
+ render: (args) => ({
178
+ components: { ExpandingPanelClassic },
179
+ setup() {
180
+ return { args };
181
+ },
182
+ template: `
183
+ <ExpandingPanelClassic v-bind="args">
184
+ <template #summary>
185
+ <span>Instant toggle</span>
186
+ </template>
187
+ <template #content>
188
+ <p style="margin:0;padding:0.5rem 0">
189
+ The panel opens and closes with no transition.
190
+ </p>
191
+ </template>
192
+ </ExpandingPanelClassic>
193
+ `,
194
+ }),
195
+ };
196
+
197
+ export const RichContent: Story = {
198
+ name: "Rich Slot Content",
199
+ args: {
200
+ name: "rich-content",
201
+ animationDuration: 400,
202
+ },
203
+ render: (args) => ({
204
+ components: { ExpandingPanelClassic },
205
+ setup() {
206
+ return { args };
207
+ },
208
+ template: `
209
+ <ExpandingPanelClassic v-bind="args">
210
+ <template #summary>
211
+ <strong>Materials &amp; Care</strong>
212
+ </template>
213
+ <template #content>
214
+ <ul style="margin:0;padding:0.5rem 0 0.5rem 1.2rem">
215
+ <li>100% organic cotton</li>
216
+ <li>Machine wash at 30°C</li>
217
+ <li>Do not tumble dry</li>
218
+ <li>Iron on low heat</li>
219
+ </ul>
220
+ </template>
221
+ </ExpandingPanelClassic>
222
+ `,
223
+ }),
224
+ };
225
+
226
+ export const ContentIsOnTop: Story = {
227
+ name: "Content Is On Top",
228
+ args: {
229
+ name: "content-is-on-top",
230
+ contentIsOnTop: true,
231
+ },
232
+ render: (args) => ({
233
+ components: { ExpandingPanelClassic },
234
+ setup() {
235
+ return { args };
236
+ },
237
+ template: `
238
+ <div style="position:relative;padding-bottom:4rem">
239
+ <ExpandingPanelClassic v-bind="args">
240
+ <template #summary>
241
+ <span>Open me — content overlays what's below</span>
242
+ </template>
243
+ <template #content>
244
+ <!--
245
+ The background/border/shadow live on this wrapper — never on .inner
246
+ itself. .inner has no explicit height when collapsed (grid-template-rows: 0fr)
247
+ and relies on overflow:hidden to clip its children to 0px; but padding/border/
248
+ background set directly on .inner are part of ITS OWN box, not overflow content,
249
+ so they'd still render as a visible gap under the summary while closed. Styling
250
+ a wrapper *inside* the slot keeps it clipped correctly by .inner's overflow:hidden.
251
+ -->
252
+ <div style="color: #808080; background-color:#fff;border:1px solid #ddd;border-radius:0.4rem;padding:1rem;box-shadow:0 4px 12px rgb(0 0 0 / 15%)">
253
+ <p style="margin:0">
254
+ With <code>contentIsOnTop</code>, this content is absolutely positioned below the
255
+ summary and raised above surrounding page content via <code>z-index</code>,
256
+ instead of pushing the "Page content below" text further down.
257
+ </p>
258
+ </div>
259
+ </template>
260
+ </ExpandingPanelClassic>
261
+ <p style="margin-top:1rem;padding:1rem;">
262
+ Page content below — stays in place when the panel opens.
263
+ </p>
264
+ </div>
265
+ `,
266
+ }),
267
+ };
268
+
269
+ export const WithStyleClassPassthrough: Story = {
270
+ name: "With styleClassPassthrough",
271
+ args: {
272
+ name: "style-passthrough",
273
+ styleClassPassthrough: ["custom-class", "another-class"],
274
+ },
275
+ render: (args) => ({
276
+ components: { ExpandingPanelClassic },
277
+ setup() {
278
+ return { args };
279
+ },
280
+ template: `
281
+ <ExpandingPanelClassic v-bind="args">
282
+ <template #summary>
283
+ <span>Custom classes applied to root</span>
284
+ </template>
285
+ <template #content>
286
+ <p style="margin:0;padding:0.5rem 0">
287
+ Inspect the root element to see <code>custom-class</code> and <code>another-class</code>.
288
+ </p>
289
+ </template>
290
+ </ExpandingPanelClassic>
291
+ `,
292
+ }),
293
+ };