srcdev-nuxt-components 9.4.9 → 9.4.11

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 (178) hide show
  1. package/.claude/commands/migrate-component.md +38 -6
  2. package/.claude/component-ledger/audit.json +1 -1
  3. package/.claude/component-ledger/build.mjs +26 -0
  4. package/.claude/component-ledger/output.html +8 -3
  5. package/.claude/component-ledger/template.html +7 -2
  6. package/.claude/skills/component-dynamic-slots.md +1 -1
  7. package/.claude/skills/components/alert-mask-core.md +84 -0
  8. package/.claude/skills/components/canvas-switcher.md +1 -1
  9. package/.claude/skills/components/carousel-flip.md +112 -168
  10. package/.claude/skills/components/container-glow.md +123 -0
  11. package/.claude/skills/components/dashboard-quad-grid.md +98 -0
  12. package/.claude/skills/components/dashboard-stats-grid.md +103 -0
  13. package/.claude/skills/components/display-theme-switch.md +60 -0
  14. package/.claude/skills/components/glowing-border.md +66 -0
  15. package/.claude/skills/components/input-number-core.md +214 -0
  16. package/.claude/skills/components/input-range-core.md +142 -0
  17. package/.claude/skills/components/input-select-core.md +151 -0
  18. package/.claude/skills/components/input-text-core.md +16 -0
  19. package/.claude/skills/components/input-textarea-core.md +154 -0
  20. package/.claude/skills/components/section-parallax.md +32 -10
  21. package/.claude/skills/components/select-menu.md +195 -0
  22. package/.claude/skills/components/toggle-switch-core.md +150 -0
  23. package/.claude/skills/components/ui-block-decorated.md +56 -0
  24. package/.claude/skills/components/wipe-away-vertical.md +98 -0
  25. package/.claude/skills/icon-sets.md +1 -1
  26. package/.claude/skills/index.md +15 -1
  27. package/.vscode/css-custom-data.json +38 -0
  28. package/.vscode/settings.json +3 -0
  29. package/.vscode/srcdev-component-alert-mask-core.code-snippets +31 -0
  30. package/.vscode/srcdev-component-carousel-flip.code-snippets +41 -0
  31. package/.vscode/srcdev-component-container-glow.code-snippets +33 -0
  32. package/.vscode/srcdev-component-dashboard-quad-grid.code-snippets +36 -0
  33. package/.vscode/srcdev-component-dashboard-stats-grid.code-snippets +35 -0
  34. package/.vscode/srcdev-component-display-theme-switch.code-snippets +27 -0
  35. package/.vscode/srcdev-component-glowing-border.code-snippets +23 -0
  36. package/.vscode/srcdev-component-input-number.code-snippets +65 -0
  37. package/.vscode/srcdev-component-input-range.code-snippets +85 -0
  38. package/.vscode/srcdev-component-input-select.code-snippets +42 -0
  39. package/.vscode/srcdev-component-input-textarea.code-snippets +40 -0
  40. package/.vscode/srcdev-component-section-parallax.code-snippets +27 -0
  41. package/.vscode/srcdev-component-select-menu.code-snippets +65 -0
  42. package/.vscode/srcdev-component-toggle-switch.code-snippets +49 -0
  43. package/.vscode/srcdev-component-ui-block-decorated.code-snippets +24 -0
  44. package/.vscode/srcdev-component-wipe-away-vertical.code-snippets +25 -0
  45. package/README.md +18 -37
  46. package/app/components/{alert-mask → 01.atoms/alert-mask}/AlertMaskCore.vue +16 -17
  47. package/app/components/01.atoms/alert-mask/CONSUMER-STYLING.md +46 -0
  48. package/app/components/01.atoms/alert-mask/stories/AlertMaskCore.stories.ts +79 -0
  49. package/app/components/{alert-mask → 01.atoms/alert-mask}/tests/AlertMaskCore.spec.ts +10 -10
  50. package/app/components/01.atoms/animations/container-glow/CONSUMER-STYLING.md +86 -0
  51. package/app/components/01.atoms/animations/container-glow/ContainerGlow.vue +299 -0
  52. package/app/components/01.atoms/animations/container-glow/stories/ContainerGlow.stories.ts +175 -0
  53. package/app/components/01.atoms/animations/container-glow/tests/ContainerGlow.spec.ts +131 -0
  54. package/app/components/01.atoms/animations/container-glow/tests/__snapshots__/ContainerGlow.spec.ts.snap +14 -0
  55. package/app/components/01.atoms/animations/glowing-border/CONSUMER-STYLING.md +61 -0
  56. package/app/components/01.atoms/animations/glowing-border/GlowingBorder.vue +132 -0
  57. package/app/components/01.atoms/animations/glowing-border/stories/GlowingBorder.stories.ts +165 -0
  58. package/app/components/01.atoms/animations/glowing-border/tests/GlowingBorder.spec.ts +94 -0
  59. package/app/components/01.atoms/animations/glowing-border/tests/__snapshots__/GlowingBorder.spec.ts.snap +3 -0
  60. package/app/components/01.atoms/animations/marquee-scroller/CONSUMER-STYLING.md +1 -1
  61. package/app/components/01.atoms/animations/marquee-scroller/MarqueeScroller.vue +1 -1
  62. package/app/components/01.atoms/animations/marquee-scroller/stories/MarqueeScroller.stories.ts +1 -1
  63. package/app/components/01.atoms/animations/section-parallax/CONSUMER-STYLING.md +44 -0
  64. package/app/components/{parallax → 01.atoms/animations/section-parallax}/SectionParallax.vue +11 -10
  65. package/app/components/01.atoms/animations/section-parallax/stories/SectionParallax.stories.ts +98 -0
  66. package/app/components/01.atoms/animations/section-parallax/tests/SectionParallax.spec.ts +102 -0
  67. package/app/components/01.atoms/animations/section-parallax/tests/__snapshots__/SectionParallax.spec.ts.snap +9 -0
  68. package/app/components/01.atoms/animations/view-timeline/CONSUMER-STYLING.md +70 -0
  69. package/app/components/01.atoms/animations/view-timeline/WipeAwayVertical.vue +181 -0
  70. package/app/components/01.atoms/animations/view-timeline/stories/WipeAwayVertical.stories.ts +269 -0
  71. package/app/components/01.atoms/animations/view-timeline/tests/WipeAwayVertical.spec.ts +127 -0
  72. package/app/components/01.atoms/canvas-switcher/CONSUMER-STYLING.md +3 -3
  73. package/app/components/01.atoms/canvas-switcher/CanvasSwitcher.vue +2 -2
  74. package/app/components/01.atoms/canvas-switcher/stories/CanvasSwitcher.stories.ts +1 -1
  75. package/app/components/01.atoms/card/CardCore.vue +4 -4
  76. package/app/components/01.atoms/clipped-panel/CONSUMER-STYLING.md +2 -2
  77. package/app/components/01.atoms/clipped-panel/ClippedPanel.vue +2 -2
  78. package/app/components/01.atoms/content-wrappers/layout-grid/dashboard-quad-grid/CONSUMER-STYLING.md +42 -0
  79. package/app/components/{layout-grids/LayoutGridA.vue → 01.atoms/content-wrappers/layout-grid/dashboard-quad-grid/DashboardQuadGrid.vue} +23 -13
  80. package/app/components/{layout-grids/stories/LayoutGridA.stories.ts → 01.atoms/content-wrappers/layout-grid/dashboard-quad-grid/stories/DashboardQuadGrid.stories.ts} +151 -23
  81. package/app/components/{layout-grids/tests/LayoutGridA.spec.ts → 01.atoms/content-wrappers/layout-grid/dashboard-quad-grid/tests/DashboardQuadGrid.spec.ts} +25 -25
  82. package/app/components/01.atoms/content-wrappers/layout-grid/dashboard-stats-grid/CONSUMER-STYLING.md +41 -0
  83. package/app/components/01.atoms/content-wrappers/layout-grid/dashboard-stats-grid/DashboardStatsGrid.vue +133 -0
  84. package/app/components/{layout-grids/stories/LayoutGridB.stories.ts → 01.atoms/content-wrappers/layout-grid/dashboard-stats-grid/stories/DashboardStatsGrid.stories.ts} +24 -24
  85. package/app/components/{layout-grids/tests/LayoutGridB.spec.ts → 01.atoms/content-wrappers/layout-grid/dashboard-stats-grid/tests/DashboardStatsGrid.spec.ts} +23 -23
  86. package/app/components/01.atoms/display-tooltip/CONSUMER-STYLING.md +8 -8
  87. package/app/components/01.atoms/display-tooltip/DisplayTooltip.vue +8 -8
  88. package/app/components/01.atoms/pop-over/CONSUMER-STYLING.md +6 -6
  89. package/app/components/01.atoms/pop-over/PopOver.vue +6 -6
  90. package/app/components/01.atoms/ui-block-decorated/CONSUMER-STYLING.md +39 -0
  91. package/app/components/01.atoms/ui-block-decorated/UiBlockDecorated.vue +141 -0
  92. package/app/components/01.atoms/ui-block-decorated/stories/UiBlockDecorated.stories.ts +148 -0
  93. package/app/components/01.atoms/ui-block-decorated/tests/UiBlockDecorated.spec.ts +80 -0
  94. package/app/components/01.atoms/ui-block-decorated/tests/__snapshots__/UiBlockDecorated.spec.ts.snap +3 -0
  95. package/app/components/02.molecules/alert-masked-content/tests/AlertMaskedContent.spec.ts +6 -6
  96. package/app/components/02.molecules/display-theme-switch/CONSUMER-STYLING.md +34 -0
  97. package/app/components/02.molecules/display-theme-switch/DisplayThemeSwitch.vue +102 -0
  98. package/app/components/02.molecules/display-theme-switch/stories/DisplayThemeSwitch.stories.ts +115 -0
  99. package/app/components/02.molecules/display-theme-switch/tests/DisplayThemeSwitch.spec.ts +86 -0
  100. package/app/components/02.molecules/navigation/deep-expanding-menu/CONSUMER-STYLING.md +1 -1
  101. package/app/components/02.molecules/navigation/deep-expanding-menu/DeepExpandingMenu.vue +1 -1
  102. package/app/components/02.molecules/navigation/deep-expanding-menu-classic/CONSUMER-STYLING.md +1 -1
  103. package/app/components/02.molecules/navigation/deep-expanding-menu-classic/DeepExpandingMenuClassic.vue +1 -1
  104. package/app/components/02.molecules/select-menu/CONSUMER-STYLING.md +168 -0
  105. package/app/components/02.molecules/select-menu/SelectMenu.vue +384 -0
  106. package/app/components/02.molecules/select-menu/stories/SelectMenu.stories.ts +359 -0
  107. package/app/components/02.molecules/select-menu/tests/SelectMenu.spec.ts +476 -0
  108. package/app/components/02.molecules/select-menu/tests/__snapshots__/SelectMenu.spec.ts.snap +42 -0
  109. package/app/components/03.organisms/image-galleries/carousel-flip/CONSUMER-STYLING.md +46 -0
  110. package/app/components/{carousels → 03.organisms/image-galleries/carousel-flip}/CarouselFlip.vue +63 -42
  111. package/app/components/{carousels → 03.organisms/image-galleries/carousel-flip}/stories/CarouselFlip.stories.ts +114 -29
  112. package/app/components/{carousels → 03.organisms/image-galleries/carousel-flip}/tests/CarouselFlip.spec.ts +80 -0
  113. package/app/components/05.forms/form-field/FormField.vue +1 -1
  114. package/app/components/05.forms/form-wrapper/FormWrapper.vue +1 -1
  115. package/app/components/05.forms/input-button/CONSUMER-STYLING.md +2 -7
  116. package/app/components/05.forms/input-button/InputButtonCore.vue +1 -5
  117. package/app/components/05.forms/input-number/CONSUMER-STYLING.md +26 -6
  118. package/app/components/05.forms/input-number/InputNumberCore.vue +125 -85
  119. package/app/components/05.forms/input-number/stories/InputNumberCore.stories.ts +92 -0
  120. package/app/components/05.forms/input-number/tests/InputNumberCore.spec.ts +119 -0
  121. package/app/components/05.forms/input-number/variants/InputNumberDefault.vue +30 -22
  122. package/app/components/05.forms/input-number/variants/stories/InputNumberDefault.stories.ts +123 -0
  123. package/app/components/05.forms/input-number/variants/tests/InputNumberDefault.spec.ts +143 -0
  124. package/app/components/05.forms/input-range/CONSUMER-STYLING.md +45 -0
  125. package/app/components/05.forms/input-range/InputRangeCore.vue +79 -143
  126. package/app/components/05.forms/input-range/stories/InputRangeCore.stories.ts +126 -0
  127. package/app/components/05.forms/input-range/tests/InputRangeCore.spec.ts +124 -0
  128. package/app/components/05.forms/input-range/variants/InputRangeDefault.vue +9 -32
  129. package/app/components/05.forms/input-range/variants/stories/InputRangeDefault.stories.ts +108 -0
  130. package/app/components/05.forms/input-range/variants/tests/InputRangeDefault.spec.ts +140 -0
  131. package/app/components/05.forms/input-select/InputSelectCore.vue +23 -30
  132. package/app/components/05.forms/input-select/stories/InputSelectCore.stories.ts +2 -2
  133. package/app/components/05.forms/input-select/stories/InputSelectWithLabel.stories.ts +115 -0
  134. package/app/components/05.forms/input-select/tests/InputSelectCore.spec.ts +129 -0
  135. package/app/components/05.forms/input-select/variants/InputSelectWithLabel.vue +1 -1
  136. package/app/components/05.forms/input-select/variants/tests/InputSelectWithLabel.spec.ts +87 -0
  137. package/app/components/05.forms/input-text/tests/InputTextAsNumberWithLabel.spec.ts +14 -0
  138. package/app/components/05.forms/input-text/variants/InputTextAsNumberWithLabel.vue +1 -1
  139. package/app/components/05.forms/input-textarea/CONSUMER-STYLING.md +55 -0
  140. package/app/components/05.forms/input-textarea/InputTextareaCore.vue +24 -16
  141. package/app/components/05.forms/input-textarea/stories/InputTextareaWithLabel.stories.ts +1 -1
  142. package/app/components/05.forms/input-textarea/tests/InputTextareaCore.spec.ts +119 -0
  143. package/app/components/05.forms/input-textarea/variants/InputTextareaWithLabel.vue +3 -13
  144. package/app/components/05.forms/input-textarea/variants/tests/InputTextareaWithLabel.spec.ts +93 -0
  145. package/app/components/05.forms/patterns/stories/MigratedFieldsForm.stories.ts +220 -0
  146. package/app/components/05.forms/toggle-switch/CONSUMER-STYLING.md +29 -0
  147. package/app/components/05.forms/toggle-switch/ToggleSwitchCore.vue +120 -119
  148. package/app/components/05.forms/toggle-switch/stories/ToggleSwitchCore.stories.ts +1 -1
  149. package/app/components/05.forms/toggle-switch/stories/ToggleSwitchWithLabel.stories.ts +1 -1
  150. package/app/components/05.forms/toggle-switch/stories/ToggleSwitchWithLabelInline.stories.ts +2 -2
  151. package/app/components/05.forms/toggle-switch/tests/ToggleSwitchCore.spec.ts +101 -0
  152. package/app/components/05.forms/toggle-switch/variants/ToggleSwitchWithLabel.vue +3 -5
  153. package/app/components/05.forms/toggle-switch/variants/ToggleSwitchWithLabelInline.vue +1 -2
  154. package/app/components/05.forms/toggle-switch/variants/tests/ToggleSwitchWithLabel.spec.ts +77 -0
  155. package/app/components/05.forms/toggle-switch/variants/tests/ToggleSwitchWithLabelInline.spec.ts +66 -0
  156. package/app/components/05.forms/triple-toggle-switch/CONSUMER-STYLING.md +20 -6
  157. package/app/components/05.forms/triple-toggle-switch/TripleToggleSwitchCore.vue +12 -10
  158. package/app/types/components/container-glow.d.ts +8 -0
  159. package/app/types/components/index.ts +2 -1
  160. package/app/types/components/select-menu.d.ts +5 -0
  161. package/package.json +3 -2
  162. package/.vscode/srcdev-component-toggle-switch-core.code-snippets +0 -13
  163. package/app/components/05.forms/input-range-fancy/InputRangeFancyCore.vue +0 -426
  164. package/app/components/05.forms/input-range-fancy/InputRangeFancyWithLabel.vue +0 -94
  165. package/app/components/carousels/CarouselBasic.vue +0 -317
  166. package/app/components/carousels/CarouselInfinite.vue +0 -358
  167. package/app/components/container-glow/ContainerGlowCore.vue +0 -296
  168. package/app/components/container-glow/stories/ContainerGlowCore.stories.ts +0 -337
  169. package/app/components/display-theme-switch/DisplayThemeSwitch.vue +0 -189
  170. package/app/components/display-theme-switch/stories/DisplayThemeSwitch.stories.ts +0 -154
  171. package/app/components/glowing-border/GlowingBorder.vue +0 -142
  172. package/app/components/glowing-border/stories/GlowingBorder.stories.ts +0 -141
  173. package/app/components/layout-grids/LayoutGridB.vue +0 -134
  174. package/app/components/test-storybook/TestStorybook.vue +0 -49
  175. package/app/components/test-storybook/stories/TestStorybook.stories.ts +0 -28
  176. package/app/components/ui-block-decorated/UiBlockDecorated.vue +0 -167
  177. package/app/components/view-timeline/WipeAwayVertical.vue +0 -180
  178. package/app/types/components/carousel-basic.d.ts +0 -19
@@ -1,189 +0,0 @@
1
- <template>
2
- <ClientOnly>
3
- <TripleToggleSwitchCore
4
- v-model="colorModeVal"
5
- v-model:field-data="sampleFieldData"
6
- :style-class-passthrough="[`colour-scheme-select`, elementClasses]"
7
- />
8
- </ClientOnly>
9
- </template>
10
-
11
- <script setup lang="ts">
12
- import type { IFormMultipleOptions } from "~/types/forms/types.forms";
13
- interface Props {
14
- styleClassPassthrough?: string | string[];
15
- }
16
-
17
- const props = withDefaults(defineProps<Props>(), {
18
- styleClassPassthrough: () => [],
19
- });
20
-
21
- const { elementClasses } = useStyleClassPassthrough(props.styleClassPassthrough);
22
- // updateElementClasses(["colour-scheme-select"]);
23
-
24
- const sampleFieldData = ref<IFormMultipleOptions>({
25
- data: [
26
- {
27
- id: "system",
28
- name: "colorModeVal",
29
- value: "system",
30
- label: "System",
31
- icon: "material-symbols:night-sight-auto-sharp",
32
- },
33
- {
34
- id: "light",
35
- name: "colorModeVal",
36
- value: "light",
37
- label: "Light",
38
- icon: "radix-icons:sun",
39
- },
40
- {
41
- id: "dark",
42
- name: "colorModeVal",
43
- value: "dark",
44
- label: "Dark",
45
- icon: "radix-icons:moon",
46
- },
47
- ],
48
- total: 3,
49
- skip: 0,
50
- limit: 3,
51
- });
52
-
53
- const { colourScheme, setColourScheme } = useSettingsStore();
54
-
55
- const colorModeVal = ref(colourScheme);
56
- watch(colorModeVal, (val) => {
57
- setColourScheme(val);
58
- });
59
- </script>
60
-
61
- <style lang="css">
62
- @layer components {
63
- .colour-scheme-select {
64
- &.triple-toggle-switch {
65
- /* --_form-border-colour/--_form-outline-colour used to sit here referencing
66
- --theme-form-radio-border/-outline — dead tokens declared nowhere in the layer, and
67
- neither local var was itself ever read by any property below either; removed rather than
68
- migrated. --_select-scheme-group-background-color below is repointed at the new public
69
- --triple-toggle-switch-marker-surface token instead of the other dead reference it used
70
- to carry (--theme-form-checkbox-bg) — see TripleToggleSwitchCore.vue and
71
- theming-component-token-pattern.md. */
72
- --_form-items-gap: 0.4rem;
73
- --_form-padding: 0.4rem;
74
- --_select-scheme-group-padding: 0.4rem;
75
- --_scheme-icon-font-size: 2rem;
76
-
77
- &.small {
78
- --_form-items-gap: 0.2rem;
79
- --_form-padding: 0.2rem;
80
- --_select-scheme-group-padding: 0.2rem;
81
- --_scheme-icon-font-size: 1.6rem;
82
- }
83
-
84
- --_select-scheme-group-background-color: var(--triple-toggle-switch-marker-surface, var(--theme-input-surface));
85
- --_select-scheme-group-background-image: none;
86
-
87
- /* "system", matching sampleFieldData's actual id/value below — was "auto" here, which never
88
- matched (this component's own data never used it), so this gradient never fired for the
89
- system option in practice. */
90
- &:has(input[value="system"]:checked) {
91
- --_select-scheme-group-background-color: transparent;
92
- --_select-scheme-group-background-image: radial-gradient(
93
- circle,
94
- rgb(66, 180, 58) 0%,
95
- rgb(17, 199, 0) 27%,
96
- rgb(8, 117, 3) 100%
97
- );
98
- }
99
-
100
- &:has(input[value="light"]:checked) {
101
- --_select-scheme-group-background-color: transparent;
102
- --_select-scheme-group-background-image: radial-gradient(
103
- circle,
104
- rgba(180, 58, 91, 1) 0%,
105
- rgba(253, 29, 29, 1) 27%,
106
- rgba(252, 176, 69, 1) 100%
107
- );
108
- }
109
-
110
- &:has(input[value="dark"]:checked) {
111
- --_select-scheme-group-background-color: transparent;
112
- --_select-scheme-group-background-image: radial-gradient(
113
- circle,
114
- rgb(50, 20, 25) 0%,
115
- rgb(0, 0, 0) 27%,
116
- rgb(100, 100, 100) 100%
117
- );
118
- }
119
-
120
- .triple-toggle-switch-wrapper {
121
- background-color: var(--theme-input-surface);
122
- border: var(--form-element-border-width) solid var(--theme-border);
123
- outline: var(--form-element-outline-width) solid transparent;
124
- padding: var(--_form-padding);
125
-
126
- &:has(input:focus-visible) {
127
- outline: var(--form-element-outline-width) solid var(--theme-ring);
128
- outline-offset: 0.2rem;
129
- }
130
-
131
- .selected-option-marker-wrapper {
132
- .selected-option-marker {
133
- background-color: var(--_select-scheme-group-background-color);
134
- background-image: var(--_select-scheme-group-background-image);
135
- border: var(--form-element-border-width) solid light-dark(var(--slate-10), var(--slate-00));
136
- }
137
- }
138
-
139
- .option-group-wrapper {
140
- gap: var(--_form-items-gap);
141
- position: relative;
142
-
143
- .option-group {
144
- border: var(--form-element-border-width) solid light-dark(#00000025, #ffffff50);
145
- outline: var(--form-element-outline-width) solid transparent;
146
- border-radius: 50%;
147
- padding: var(--_select-scheme-group-padding);
148
-
149
- &:has(.option-icon:hover) {
150
- outline: var(--form-element-outline-width) solid light-dark(var(--slate-10), var(--slate-00));
151
- }
152
-
153
- &:has(input:focus-visible) {
154
- outline: var(--form-element-outline-width) solid var(--theme-ring);
155
- outline-offset: 0.2rem;
156
- }
157
-
158
- .option-icon {
159
- &.system {
160
- color: light-dark(var(--slate-10), var(--slate-03));
161
-
162
- &.active {
163
- color: var(--slate-00);
164
- }
165
- }
166
-
167
- &.light {
168
- color: light-dark(var(--slate-10), var(--slate-03));
169
-
170
- &.active {
171
- color: var(--slate-00);
172
- }
173
- }
174
-
175
- &.dark {
176
- color: light-dark(var(--slate-10), var(--slate-03));
177
-
178
- &.active {
179
- color: var(--slate-00);
180
- }
181
- }
182
- }
183
- }
184
- }
185
- }
186
- }
187
- }
188
- }
189
- </style>
@@ -1,154 +0,0 @@
1
- import type { Meta, StoryFn } from "@nuxtjs/storybook";
2
- import StorybookComponent from "../DisplayThemeSwitch.vue";
3
-
4
- interface DisplayThemeSwitchStoryArgs {
5
- styleClassPassthrough: string[];
6
- }
7
-
8
- export default {
9
- title: "Components/Display/DisplayThemeSwitch",
10
- component: StorybookComponent,
11
- argTypes: {
12
- // Styling
13
- styleClassPassthrough: {
14
- control: "object",
15
- description: "Additional CSS classes to pass through",
16
- table: {
17
- category: "Styling",
18
- },
19
- },
20
- },
21
- parameters: {
22
- docs: {
23
- description: {
24
- component:
25
- "A theme switching component that allows users to toggle between system, light, and dark color schemes. This component integrates with the app's color scheme settings and provides a smooth animated toggle interface.",
26
- },
27
- },
28
- },
29
- } as Meta<DisplayThemeSwitchStoryArgs>;
30
-
31
- const Template: StoryFn<DisplayThemeSwitchStoryArgs> = (_args, { argTypes }) => ({
32
- components: { StorybookComponent },
33
- props: Object.keys(argTypes),
34
- setup() {
35
- return { args: _args };
36
- },
37
- template: `
38
- <div style="padding: 2rem;">
39
- <div style="margin-bottom: 1.5rem;">
40
- <h3 style="margin: 0 0 0.5rem 0; font-size: 1.8rem;">Theme Selector</h3>
41
- <p style="margin: 0; color: #666; font-size: 1.4rem;">
42
- Choose your preferred color scheme. system mode follows your system preference.
43
- </p>
44
- </div>
45
-
46
- <StorybookComponent
47
- :style-class-passthrough="args.styleClassPassthrough"
48
- />
49
-
50
- <div style="margin-top: 1.5rem; padding: 1rem; background: var(--theme-surface); border-radius: 8px; border: 1px solid var(--theme-border);">
51
- <h4 style="margin: 0 0 0.5rem 0; font-size: 1.6rem;">Theme Preview</h4>
52
- <p style="margin: 0 0 1rem 0; color: var(--theme-text-secondary); font-size: 1.6rem;">
53
- This area demonstrates how the theme affects content appearance:
54
- </p>
55
- <div style="display: flex; gap: 1rem; flex-wrap: wrap;">
56
- <div style="padding: 0.75rem; background: var(--theme-primary); color: var(--theme-primary-text); border-radius: 4px; font-size: 1.4rem;">
57
- Primary Color
58
- </div>
59
- <div style="padding: 0.75rem; background: var(--theme-secondary); color: var(--theme-secondary-text); border-radius: 4px; font-size: 1.4rem;">
60
- Secondary Color
61
- </div>
62
- <div style="padding: 0.75rem; background: var(--theme-surface-variant); color: var(--theme-text); border-radius: 4px; border: 1px solid var(--theme-border); font-size: 1.4rem;">
63
- Surface Variant
64
- </div>
65
- </div>
66
- </div>
67
-
68
- <div style="margin-top: 1.5rem; font-size: 1.2rem; color: #666;">
69
- <strong>Usage:</strong> This component automatically syncs with your app's theme settings. Changes are persisted and applied globally.
70
- </div>
71
- </div>
72
- `,
73
- });
74
-
75
- export const Default = Template.bind({});
76
- Default.args = {
77
- styleClassPassthrough: [],
78
- };
79
- Default.parameters = {
80
- docs: {
81
- description: {
82
- story:
83
- "The default theme switch with system, light, and dark mode options. The component features smooth animations and integrates with the application's global theme state.",
84
- },
85
- },
86
- };
87
-
88
- export const WithCustomStyling = Template.bind({});
89
- WithCustomStyling.args = {
90
- styleClassPassthrough: ["small"],
91
- };
92
- WithCustomStyling.parameters = {
93
- docs: {
94
- description: {
95
- story:
96
- 'Theme switch with custom styling classes applied. The "small" class provides specialized styling for enhanced visual appearance.',
97
- },
98
- },
99
- };
100
-
101
- export const InNavigation = Template.bind({});
102
- InNavigation.args = {
103
- styleClassPassthrough: ["small"],
104
- };
105
-
106
- // Custom template for navigation context
107
- InNavigation.render = (args, { argTypes }) => ({
108
- components: { StorybookComponent },
109
- props: Object.keys(argTypes),
110
- setup() {
111
- return { args };
112
- },
113
- template: `
114
- <div style="background: var(--theme-surface); padding: 1rem;">
115
- <nav style="display: flex; align-items: center; justify-content: space-between; padding: 1rem 1.5rem; background: var(--theme-surface-variant); border-radius: 8px; border: 1px solid var(--theme-border);">
116
- <div style="display: flex; align-items: center; gap: 1rem;">
117
- <div style="font-weight: 600; color: var(--theme-text); font-size: 1.125rem;">
118
- My App
119
- </div>
120
- <div style="display: flex; gap: 0.5rem;">
121
- <a href="#" style="color: var(--theme-text-secondary); text-decoration: none; padding: 0.5rem; border-radius: 4px; font-size: 0.875rem;">Home</a>
122
- <a href="#" style="color: var(--theme-text-secondary); text-decoration: none; padding: 0.5rem; border-radius: 4px; font-size: 0.875rem;">About</a>
123
- <a href="#" style="color: var(--theme-text-secondary); text-decoration: none; padding: 0.5rem; border-radius: 4px; font-size: 0.875rem;">Contact</a>
124
- </div>
125
- </div>
126
-
127
- <div style="display: flex; align-items: center; gap: 1rem;">
128
- <span style="color: var(--theme-text-secondary); font-size: 0.875rem;">Theme:</span>
129
- <StorybookComponent :style-class-passthrough="args.styleClassPassthrough" />
130
- </div>
131
- </nav>
132
-
133
- <div style="margin-top: 1.5rem; padding: 1.5rem; background: var(--theme-surface-variant); border-radius: 8px; border: 1px solid var(--theme-border);">
134
- <h2 style="margin: 0 0 1rem 0; color: var(--theme-text);">Page Content</h2>
135
- <p style="margin: 0 0 1rem 0; color: var(--theme-text-secondary); line-height: 1.5;">
136
- This demonstrates how the theme switch works in a typical navigation context.
137
- The theme changes are applied immediately across all interface elements.
138
- </p>
139
- <div style="display: inline-flex; align-items: center; gap: 0.5rem; padding: 0.75rem 1rem; background: var(--theme-primary); color: var(--theme-primary-text); border-radius: 6px; font-size: 0.875rem; font-weight: 500;">
140
- <span>🎨</span>
141
- Dynamic Theming Active
142
- </div>
143
- </div>
144
- </div>
145
- `,
146
- });
147
- InNavigation.parameters = {
148
- docs: {
149
- description: {
150
- story:
151
- "Example of the theme switch integrated into a navigation bar context, showing how it works alongside other UI elements and how theme changes affect the entire interface.",
152
- },
153
- },
154
- };
@@ -1,142 +0,0 @@
1
- <template>
2
- <component :is="tag" class="glowing-border" :class="[elementClasses, variant]">
3
- <slot></slot>
4
- </component>
5
- </template>
6
-
7
- <script setup lang="ts">
8
- const props = defineProps({
9
- tag: {
10
- type: String,
11
- default: "div",
12
- validator(value: string) {
13
- return [
14
- "div",
15
- "p",
16
- "span",
17
- "section",
18
- "article",
19
- "aside",
20
- "header",
21
- "footer",
22
- "main",
23
- "nav",
24
- "ul",
25
- "ol",
26
- ].includes(value)
27
- },
28
- },
29
- variant: {
30
- type: String,
31
- default: "subtle",
32
- validator(value: string) {
33
- return ["subtle", "vivid", "silver", "steel"].includes(value)
34
- },
35
- },
36
- styleClassPassthrough: {
37
- type: [String, Array] as PropType<string | string[]>,
38
- default: () => [],
39
- },
40
- })
41
-
42
- const { elementClasses, resetElementClasses } = useStyleClassPassthrough(props.styleClassPassthrough)
43
-
44
- watch(
45
- () => props.styleClassPassthrough,
46
- () => {
47
- resetElementClasses(props.styleClassPassthrough)
48
- }
49
- )
50
- </script>
51
-
52
- <style scoped lang="css">
53
- @layer components {
54
- @property --glow-deg {
55
- syntax: "<angle>";
56
- inherits: true;
57
- initial-value: -90deg;
58
- }
59
-
60
- /* the colors don't need to be registed */
61
- @property --clr-1 {
62
- syntax: "<color>";
63
- inherits: true;
64
- initial-value: red;
65
- }
66
-
67
- @property --clr-2 {
68
- syntax: "<color>";
69
- inherits: true;
70
- initial-value: yellow;
71
- }
72
-
73
- @property --clr-3 {
74
- syntax: "<color>";
75
- inherits: true;
76
- initial-value: green;
77
- }
78
-
79
- @property --clr-4 {
80
- syntax: "<color>";
81
- inherits: true;
82
- initial-value: blue;
83
- }
84
-
85
- @property --clr-5 {
86
- syntax: "<color>";
87
- inherits: true;
88
- initial-value: purple;
89
- }
90
-
91
- .glowing-border {
92
- &.vivid {
93
- --clr-1: #ff0000;
94
- --clr-2: #ffa500;
95
- --clr-3: #ffff00;
96
- --clr-4: #008000;
97
- --clr-5: #0000ff;
98
- }
99
-
100
- &.subtle {
101
- --clr-1: #ff9a9e;
102
- --clr-2: #fad0c4;
103
- --clr-3: #fad0c4;
104
- --clr-4: #fbc2eb;
105
- --clr-5: #a18cd1;
106
- }
107
-
108
- &.silver {
109
- --clr-1: #d4d4d4;
110
- --clr-2: #e4e4e4;
111
- --clr-3: #f5f5f5;
112
- --clr-4: #e4e4e4;
113
- --clr-5: #d4d4d4;
114
- }
115
-
116
- &.steel {
117
- --clr-1: #434343;
118
- --clr-2: #5a5a5a;
119
- --clr-3: #6e6e6e;
120
- --clr-4: #5a5a5a;
121
- --clr-5: #434343;
122
- }
123
-
124
- --gradient-glow: var(--clr-1), var(--clr-2), var(--clr-3), var(--clr-4), var(--clr-5), var(--clr-1);
125
-
126
- border: var(--border-width, 3px) solid transparent;
127
- border-radius: 30px;
128
- background: linear-gradient(var(--surface, canvas) 0 0) padding-box,
129
- conic-gradient(from var(--glow-deg), var(--gradient-glow)) border-box;
130
-
131
- animation: glow 10s infinite linear;
132
-
133
- overflow: hidden;
134
- }
135
-
136
- @keyframes glow {
137
- 100% {
138
- --glow-deg: 270deg;
139
- }
140
- }
141
- }
142
- </style>
@@ -1,141 +0,0 @@
1
- import type { Meta, StoryFn } from "@nuxtjs/storybook";
2
- import StorybookComponent from "../GlowingBorder.vue";
3
-
4
- // Custom interface for story args
5
- interface GlowingBorderStoryArgs {
6
- variant: "vivid" | "subtle" | "silver" | "steel";
7
- content: string;
8
- showCardCore: boolean;
9
- cardCoreVariant: "solid" | "subtle" | "soft" | "outline";
10
- }
11
-
12
- export default {
13
- title: "Components/Effects/GlowingBorder",
14
- component: StorybookComponent,
15
- argTypes: {
16
- variant: {
17
- control: { type: "select" },
18
- options: ["vivid", "subtle", "silver", "steel"],
19
- description: "GlowingBorder visual variant",
20
- table: {
21
- category: "Appearance",
22
- },
23
- },
24
- content: {
25
- control: { type: "text" },
26
- description: "Content to display inside the glowing border",
27
- table: {
28
- category: "Content",
29
- },
30
- },
31
- showCardCore: {
32
- control: { type: "boolean" },
33
- description: "Show content wrapped in a CardCore component",
34
- table: {
35
- category: "Content",
36
- },
37
- },
38
- cardCoreVariant: {
39
- control: { type: "select" },
40
- options: ["solid", "subtle", "soft", "outline"],
41
- description: "CardCore variant when showCardCore is true",
42
- table: {
43
- category: "Content",
44
- },
45
- },
46
- // Hide internal props
47
- styleClassPassthrough: {
48
- table: {
49
- disable: true,
50
- },
51
- },
52
- },
53
- args: {
54
- variant: "vivid",
55
- content:
56
- "This is default slot content for the GlowingBorder component. As it's a slot, any HTML content can be placed here.",
57
- showCardCore: false,
58
- cardCoreVariant: "solid",
59
- },
60
- } as Meta<GlowingBorderStoryArgs>;
61
-
62
- const Template: StoryFn<GlowingBorderStoryArgs> = (args) => ({
63
- components: { StorybookComponent },
64
- setup() {
65
- return { args };
66
- },
67
- template: `
68
- <div style="padding: 40px; background-color: var(--slate-10);">
69
- <StorybookComponent
70
- :variant="args.variant"
71
- :style-class-passthrough="['storybook-demo']"
72
- >
73
- <div v-if="!args.showCardCore" style="padding: 20px; color: var(--slate-02);">
74
- <h3 style="margin: 0 0 12px 0; font-size: 1.5rem; font-weight: 600;">GlowingBorder Header</h3>
75
- <h4 style="margin: 0 0 16px 0; font-size: 1.25rem; font-weight: 500;">GlowingBorder Content</h4>
76
- <p style="margin: 0 0 12px 0; line-height: 1.6;">{{ args.content }}</p>
77
- <p style="margin: 0; font-size: 0.875rem; color: var(--slate-09);">GlowingBorder Footer</p>
78
- </div>
79
-
80
- <!-- CardCore version -->
81
- <CardCore
82
- v-else
83
- :variant="args.cardCoreVariant"
84
- :has-dividers="true"
85
- :no-outline="false"
86
- >
87
- <template #header>
88
- <h2 style="margin: 0; font-size: 1.5rem; font-weight: 600;">CardCore Header</h2>
89
- </template>
90
- <template #default>
91
- <h3 style="margin: 0 0 12px 0; font-size: 1.25rem; font-weight: 500; color: var(--slate-02);">CardCore Content</h3>
92
- <p style="margin: 0 0 12px 0; line-height: 1.6; color: var(--slate-02);">{{ args.content }}</p>
93
- <p style="margin: 0; line-height: 1.6; color: var(--slate-02);">This demonstrates how GlowingBorder can wrap other components.</p>
94
- </template>
95
- <template #footer>
96
- <p style="margin: 0; font-size: 0.875rem; color: var(--slate-02);">CardCore Footer</p>
97
- </template>
98
- </CardCore>
99
- </StorybookComponent>
100
- </div>
101
- `,
102
- });
103
-
104
- export const Default = Template.bind({});
105
-
106
- export const Vivid = Template.bind({});
107
- Vivid.args = {
108
- variant: "vivid",
109
- content:
110
- "Vivid variant creates a bright, attention-grabbing glow effect perfect for highlighting important content or call-to-action elements.",
111
- };
112
-
113
- export const Subtle = Template.bind({});
114
- Subtle.args = {
115
- variant: "subtle",
116
- content:
117
- "Subtle variant provides a gentle glow that adds visual interest without being overwhelming, ideal for elegant content presentation.",
118
- };
119
-
120
- export const Silver = Template.bind({});
121
- Silver.args = {
122
- variant: "silver",
123
- content:
124
- "Silver variant offers a metallic, sophisticated glow that works well in professional or modern design contexts.",
125
- };
126
-
127
- export const Steel = Template.bind({});
128
- Steel.args = {
129
- variant: "steel",
130
- content:
131
- "Steel variant provides a cool, industrial glow effect that's perfect for technical or utilitarian design themes.",
132
- };
133
-
134
- export const WithCardCore = Template.bind({});
135
- WithCardCore.args = {
136
- variant: "vivid",
137
- content:
138
- "This example shows how GlowingBorder can enhance other components like CardCore, creating layered visual effects.",
139
- showCardCore: true,
140
- cardCoreVariant: "solid",
141
- };