slidev-theme-watabegg 1.0.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.
Files changed (141) hide show
  1. package/README.ja.md +132 -0
  2. package/README.md +142 -0
  3. package/components/KaTexReveal.vue +64 -0
  4. package/components/QuestionList.vue +252 -0
  5. package/components/TextBox.vue +109 -0
  6. package/dist/404.html +22 -0
  7. package/dist/_redirects +1 -0
  8. package/dist/assets/404-DpjNfLw1.css +1 -0
  9. package/dist/assets/DrawingControls-Cxk9a9ub.css +1 -0
  10. package/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  11. package/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  12. package/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  13. package/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  14. package/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  15. package/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  16. package/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  17. package/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  18. package/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  19. package/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  20. package/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  21. package/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  22. package/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  23. package/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  24. package/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  25. package/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  26. package/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  27. package/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  28. package/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  29. package/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  30. package/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  31. package/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  32. package/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  33. package/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  34. package/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  35. package/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  36. package/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  37. package/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  38. package/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  39. package/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  40. package/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  41. package/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  42. package/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  43. package/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  44. package/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  45. package/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  46. package/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  47. package/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  48. package/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  49. package/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  50. package/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  51. package/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  52. package/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  53. package/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  54. package/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  55. package/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  56. package/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  57. package/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  58. package/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  59. package/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  60. package/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  61. package/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  62. package/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  63. package/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  64. package/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  65. package/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  66. package/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  67. package/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  68. package/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  69. package/dist/assets/KaTexReveal-CPYYcbYL.js +261 -0
  70. package/dist/assets/KaTexReveal-DIQR78zC.css +1 -0
  71. package/dist/assets/NoteDisplay-DcLBOPDP.css +1 -0
  72. package/dist/assets/QuestionList-C2CV4WSw.js +56 -0
  73. package/dist/assets/QuestionList-CJKXL5Yq.css +1 -0
  74. package/dist/assets/SlideWrapper-B94O8a9G.css +1 -0
  75. package/dist/assets/entry-DeH8BBA6.css +1 -0
  76. package/dist/assets/index-BVsB-lMI.js +76 -0
  77. package/dist/assets/index-FlrlSOFu.css +1 -0
  78. package/dist/assets/link-Vmiqc0hc.js +1 -0
  79. package/dist/assets/logo-BYkHSa_O.png +0 -0
  80. package/dist/assets/md-8VraByb9.js +1 -0
  81. package/dist/assets/md-Bby241ZI.js +1 -0
  82. package/dist/assets/md-BqJwdePd.js +1 -0
  83. package/dist/assets/md-C0a547wx.js +3 -0
  84. package/dist/assets/md-C3C29Y15.css +1 -0
  85. package/dist/assets/md-CBmwngYy.js +1 -0
  86. package/dist/assets/md-DrNACvG6.js +3 -0
  87. package/dist/assets/md-DyJRgKOq.css +1 -0
  88. package/dist/assets/md-FY1NEgjs.js +1 -0
  89. package/dist/assets/md-RVqvqjSV.js +1 -0
  90. package/dist/assets/md-Un85CPx3.js +1 -0
  91. package/dist/assets/md-fq9C6Jm7.js +1 -0
  92. package/dist/assets/md-lcsTx_QH.css +1 -0
  93. package/dist/assets/md-nHLnZfr4.js +1 -0
  94. package/dist/assets/md-nyxGgl0C.js +1 -0
  95. package/dist/assets/md-rpN_jFpy.css +1 -0
  96. package/dist/assets/md-tn0RQdqM.css +0 -0
  97. package/dist/assets/modules/file-saver-BQwH87cS.js +1 -0
  98. package/dist/assets/modules/shiki-CNnpvYpa.js +1 -0
  99. package/dist/assets/modules/shiki-CozCpemh.css +1 -0
  100. package/dist/assets/modules/unplugin-icons-D4kCmVGc.js +1 -0
  101. package/dist/assets/modules/vue--QWtT9ew.js +40 -0
  102. package/dist/assets/play-D_7yfuao.css +1 -0
  103. package/dist/assets/presenter-BM7ZLO4O.css +1 -0
  104. package/dist/assets/shortcuts-DMsk7WYF.css +1 -0
  105. package/dist/assets/slidev/404-DWvVMASK.js +1 -0
  106. package/dist/assets/slidev/CodeBlockWrapper.vue_vue_type_script_setup_true_lang-DTUx4GGs.js +1 -0
  107. package/dist/assets/slidev/DrawingControls-kHEnsAlc.js +1 -0
  108. package/dist/assets/slidev/DrawingControls.vue_vue_type_style_index_0_lang-Bci_r_Jk.js +1 -0
  109. package/dist/assets/slidev/DrawingLayer-BGgDMhMm.js +1 -0
  110. package/dist/assets/slidev/IconButton.vue_vue_type_script_setup_true_lang-Di5pfAKC.js +1 -0
  111. package/dist/assets/slidev/NoteDisplay.vue_vue_type_style_index_0_lang-B00W6JVQ.js +1 -0
  112. package/dist/assets/slidev/SlideWrapper-n2BtjyCi.js +1 -0
  113. package/dist/assets/slidev/context-Db_2Hcpr.js +1 -0
  114. package/dist/assets/slidev/default-By-tXFz1.js +1 -0
  115. package/dist/assets/slidev/entry-BWgjvGUN.js +1 -0
  116. package/dist/assets/slidev/md-wS_Ed_8x.js +1 -0
  117. package/dist/assets/slidev/notes-Dv602Bu1.js +1 -0
  118. package/dist/assets/slidev/overview-BDs3_v07.js +1 -0
  119. package/dist/assets/slidev/play-CQ4qi9O0.js +2 -0
  120. package/dist/assets/slidev/presenter-CA_kPq3V.js +1 -0
  121. package/dist/assets/slidev/shortcuts-nzRDDQcI.js +4 -0
  122. package/dist/assets/useThemePalette-CeNaXTPl.js +1 -0
  123. package/dist/index.html +22 -0
  124. package/example.md +191 -0
  125. package/global-bottom.vue +70 -0
  126. package/layouts/cover.vue +64 -0
  127. package/layouts/end.vue +33 -0
  128. package/layouts/image-scroll.vue +138 -0
  129. package/layouts/image.vue +22 -0
  130. package/layouts/two-cols.vue +23 -0
  131. package/package.json +43 -0
  132. package/setup/shiki.ts +11 -0
  133. package/setup/shortcuts.ts +18 -0
  134. package/slidev-theme-watabegg-1.0.0.tgz +0 -0
  135. package/styles/globals.css +160 -0
  136. package/styles/index.ts +5 -0
  137. package/styles/layout.css +142 -0
  138. package/utils/colors.ts +57 -0
  139. package/utils/link.ts +17 -0
  140. package/utils/render.ts +5 -0
  141. package/utils/useThemePalette.ts +49 -0
@@ -0,0 +1,160 @@
1
+ /* Google Fonts Import */
2
+ @import url('https://fonts.googleapis.com/css2?family=M+PLUS+2:wght@100;200;300;400;500;600;700;800;900&display=swap');
3
+
4
+ /* Global Variables */
5
+ :root {
6
+ --slidev-theme-primary: #448f47;
7
+ --cover-gradient-start: #A5D6A7;
8
+ --cover-gradient-end: #2b702e;
9
+ --cover-accent: #215724;
10
+ --slidev-theme-background: #FFFFFF;
11
+ --slidev-theme-text: #333333;
12
+ --slidev-theme-text-secondary: #666666;
13
+ --slidev-theme-border: #E0E0E0;
14
+ --slidev-theme-shadow: rgba(0, 0, 0, 0.1);
15
+
16
+ /* Font settings */
17
+ --slidev-font-family: 'M PLUS 2', 'Roboto', sans-serif;
18
+ --slidev-font-mono: 'Fira Code', 'Courier New', monospace;
19
+ --slidev-font-size-base: 24px;
20
+ --slidev-line-height: 1.4;
21
+ }
22
+
23
+ /* Global Layout Styles */
24
+ .slidev-layout {
25
+ background: var(--slidev-theme-background);
26
+ font-family: var(--slidev-font-family);
27
+ font-size: var(--slidev-font-size-base);
28
+ line-height: var(--slidev-line-height);
29
+ color: var(--slidev-theme-text);
30
+
31
+ /* Common spacing */
32
+ padding: 2rem;
33
+
34
+ /* Ensure consistent typography */
35
+ h1, h2, h3, h4, h5, h6 {
36
+ font-family: var(--slidev-font-family);
37
+ font-weight: 600;
38
+ color: var(--slidev-theme-text);
39
+ }
40
+
41
+ h1 {
42
+ font-size: 2.5rem;
43
+ margin-bottom: 1.5rem;
44
+ border-bottom: 3px solid var(--slidev-theme-primary);
45
+ padding-bottom: 0.5rem;
46
+ }
47
+
48
+ h2 {
49
+ font-size: 2rem;
50
+ margin-bottom: 1rem;
51
+ color: var(--slidev-theme-primary);
52
+ }
53
+
54
+ h3 {
55
+ font-size: 1.5rem;
56
+ margin-bottom: 0.75rem;
57
+ }
58
+
59
+ /* Lists */
60
+ ul, ol {
61
+ margin: 1rem 0;
62
+ padding-left: 2rem;
63
+ }
64
+
65
+ li {
66
+ margin: 0.5rem 0;
67
+ }
68
+
69
+ /* Code */
70
+ code {
71
+ font-family: var(--slidev-font-mono);
72
+ background: #f5f5f5;
73
+ padding: 0.2rem 0.4rem;
74
+ border-radius: 0.25rem;
75
+ font-size: 0.9em;
76
+ }
77
+
78
+ pre {
79
+ font-family: var(--slidev-font-mono);
80
+ background: #f8f8f8;
81
+ padding: 1rem;
82
+ border-radius: 0.5rem;
83
+ overflow-x: auto;
84
+ border-left: 4px solid var(--slidev-theme-primary);
85
+ }
86
+
87
+ /* Links */
88
+ a {
89
+ color: var(--slidev-theme-primary);
90
+ text-decoration: none;
91
+ border-bottom: 1px solid transparent;
92
+ transition: border-color 0.2s;
93
+ }
94
+
95
+ a:hover {
96
+ border-bottom-color: var(--slidev-theme-primary);
97
+ }
98
+ }
99
+
100
+ .slidev-layout:not(.cover, .image, .image-scroll) {
101
+ position: relative;
102
+ padding-bottom: 4rem;
103
+ }
104
+
105
+ .slidev-layout:not(.cover, .image, .image-scroll)::after {
106
+ content: '';
107
+ position: absolute;
108
+ bottom: 0;
109
+ left: 0;
110
+ right: 0;
111
+ height: 3rem;
112
+ border-top: 1px solid var(--slidev-theme-border);
113
+ background: var(--slidev-theme-background);
114
+ }
115
+
116
+ /* Global header positioning for non-cover layouts */
117
+ .slidev-layout:not(.cover, .image, .image-scroll) h1:first-child {
118
+ position: fixed;
119
+ top: 2rem;
120
+ left: 2rem;
121
+ right: 2rem;
122
+ margin: 0;
123
+ padding-bottom: 0.5rem;
124
+ background: var(--slidev-theme-background);
125
+ z-index: 10;
126
+ border-bottom: 3px solid var(--slidev-theme-primary);
127
+ }
128
+
129
+ .slidev-layout:not(.cover) {
130
+ padding-top: 6rem; /* Space for fixed header */
131
+ }
132
+
133
+ /* Animation utilities */
134
+ .slide-enter-active,
135
+ .slide-leave-active {
136
+ transition: all 0.3s ease;
137
+ }
138
+
139
+ .slide-enter-from {
140
+ opacity: 0;
141
+ transform: translateX(20px);
142
+ }
143
+
144
+ .slide-leave-to {
145
+ opacity: 0;
146
+ transform: translateX(-20px);
147
+ }
148
+
149
+ /* Utility classes */
150
+ .text-highlight {
151
+ background: linear-gradient(transparent 60%, #ffeb3b 60%);
152
+ padding: 0 0.2rem;
153
+ }
154
+
155
+ .card {
156
+ background: white;
157
+ border-radius: 0.5rem;
158
+ padding: 1.5rem;
159
+ border: 1px solid var(--slidev-theme-border);
160
+ }
@@ -0,0 +1,5 @@
1
+ // inherit from base layouts, remove it to get full customizations
2
+ // Google Fonts import for M PLUS 2
3
+ import '@slidev/client/styles/layouts-base.css'
4
+ import './layout.css'
5
+ import './globals.css'
@@ -0,0 +1,142 @@
1
+ /* Layout-specific styles */
2
+
3
+ /* Cover layout */
4
+ .slidev-layout.cover {
5
+ @apply h-full grid place-items-center text-center relative;
6
+ background: #FFFFFF;
7
+
8
+
9
+ h1 {
10
+ @apply text-7xl leading-tight mb-6;
11
+ color: white;
12
+ position: static;
13
+ border: none;
14
+ padding: 0;
15
+ margin-bottom: 1.5rem;
16
+ z-index: 10;
17
+ position: relative;
18
+ }
19
+
20
+ h2 {
21
+ @apply text-3xl opacity-90 mb-8;
22
+ color: white;
23
+ z-index: 10;
24
+ position: relative;
25
+ }
26
+
27
+ .author {
28
+ position: absolute;
29
+ bottom: 2rem;
30
+ right: 2rem;
31
+ color: var(--cover-accent, #2E7D32);
32
+ font-weight: 600;
33
+ font-size: 1.2rem;
34
+ z-index: 10;
35
+ }
36
+
37
+ .date {
38
+ position: absolute;
39
+ bottom: 2rem;
40
+ left: 2rem;
41
+ color: #ffffff;
42
+ font-weight: 600;
43
+ font-size: 1.2rem;
44
+ z-index: 10;
45
+ }
46
+ }
47
+
48
+ /* Intro layout */
49
+ .slidev-layout.intro {
50
+ @apply h-full grid place-items-center text-center;
51
+
52
+ h1 {
53
+ @apply text-6xl leading-20 mb-6;
54
+ position: static;
55
+ border: none;
56
+ }
57
+
58
+ h1 + p {
59
+ @apply -mt-2 opacity-70 mb-4 text-xl;
60
+ }
61
+
62
+ p + h2,
63
+ ul + h2,
64
+ table + h2 {
65
+ @apply mt-10;
66
+ }
67
+ }
68
+
69
+ /* Two columns layout */
70
+ .slidev-layout.two-cols {
71
+ .slidev-grid-container {
72
+ @apply grid grid-cols-2 gap-8 h-full;
73
+ }
74
+
75
+ .col-left, .col-right {
76
+ @apply flex flex-col justify-start;
77
+ }
78
+ }
79
+
80
+ /* Answer layout styles are now handled by the QuestionList component */
81
+
82
+ /* Image layout */
83
+ .slidev-layout.image {
84
+ position: relative;
85
+ padding: 0;
86
+
87
+ .background-image {
88
+ position: absolute;
89
+ top: 0;
90
+ left: 0;
91
+ width: 100%;
92
+ height: 100%;
93
+ object-fit: cover;
94
+ z-index: 0;
95
+ }
96
+
97
+ .content {
98
+ position: relative;
99
+ z-index: 1;
100
+ height: 100%;
101
+ padding: 2rem;
102
+ }
103
+
104
+ h1 {
105
+ position: relative;
106
+ background-color: rgba(255, 255, 255, 0);
107
+ }
108
+
109
+ }
110
+
111
+ /* Image scroll layout */
112
+ .slidev-layout.image-scroll {
113
+ position: relative;
114
+ padding: 0;
115
+ overflow: hidden;
116
+
117
+ .image-layer {
118
+ position: absolute;
119
+ inset: 0;
120
+ cursor: grab;
121
+ overflow: hidden;
122
+ }
123
+
124
+ .image-layer.is-panning {
125
+ cursor: grabbing;
126
+ }
127
+
128
+ .image-layer img {
129
+ width: 100%;
130
+ height: 100%;
131
+ object-fit: cover;
132
+ will-change: transform;
133
+ transition: transform 80ms ease-out;
134
+ }
135
+
136
+ .content {
137
+ position: relative;
138
+ z-index: 1;
139
+ height: 100%;
140
+ padding: 2rem;
141
+ }
142
+ }
@@ -0,0 +1,57 @@
1
+ export type ThemeColorKey = 'red' | 'yellow' | 'green' | 'blue' | 'purple'
2
+
3
+ export interface ThemePalette {
4
+ primary: string
5
+ gradientStart: string
6
+ gradientEnd: string
7
+ accent: string
8
+ }
9
+
10
+ export const defaultThemeColor: ThemeColorKey = 'green'
11
+
12
+ export const themePalettes: Record<ThemeColorKey, ThemePalette> = {
13
+ red: {
14
+ primary: '#E53935',
15
+ gradientStart: '#EF9A9A',
16
+ gradientEnd: '#B71C1C',
17
+ accent: '#B71C1C',
18
+ },
19
+ yellow: {
20
+ primary: '#FBC02D',
21
+ gradientStart: '#FFF59D',
22
+ gradientEnd: '#F57F17',
23
+ accent: '#F57F17',
24
+ },
25
+ green: {
26
+ primary: '#448f47',
27
+ gradientStart: '#A5D6A7',
28
+ gradientEnd: '#2b702e',
29
+ accent: '#215724',
30
+ },
31
+ blue: {
32
+ primary: '#1E88E5',
33
+ gradientStart: '#90CAF9',
34
+ gradientEnd: '#0D47A1',
35
+ accent: '#0D47A1',
36
+ },
37
+ purple: {
38
+ primary: '#8E24AA',
39
+ gradientStart: '#CE93D8',
40
+ gradientEnd: '#4A148C',
41
+ accent: '#4A148C',
42
+ },
43
+ }
44
+
45
+ export function resolveThemeColor(rawValue: unknown): ThemeColorKey {
46
+ if (typeof rawValue !== 'string')
47
+ return defaultThemeColor
48
+
49
+ const normalized = rawValue.trim().toLowerCase() as ThemeColorKey
50
+ return normalized in themePalettes ? normalized : defaultThemeColor
51
+ }
52
+
53
+ export function getThemePalette(rawValue: unknown): ThemePalette {
54
+ const key = resolveThemeColor(rawValue)
55
+ return themePalettes[key]
56
+ }
57
+
package/utils/link.ts ADDED
@@ -0,0 +1,17 @@
1
+ const getLink = ({
2
+ frontmatter,
3
+ slidevConfigs,
4
+ }: {
5
+ frontmatter: Record<string, unknown>
6
+ slidevConfigs: Record<string, unknown> | undefined
7
+ }) => {
8
+ if (typeof frontmatter.link === 'string' && frontmatter.link.length > 0)
9
+ return frontmatter.link
10
+
11
+ const globalLink = slidevConfigs?.['link']
12
+ return typeof globalLink === 'string' && globalLink.length > 0
13
+ ? globalLink
14
+ : undefined
15
+ }
16
+
17
+ export default getLink
@@ -0,0 +1,5 @@
1
+ import { marked } from 'marked';
2
+
3
+ export const renderMarkdown = (text: string) => ({
4
+ template: `<div class="inline-block">${marked.parse(text)}</div>`
5
+ });
@@ -0,0 +1,49 @@
1
+ import { computed, ref, watchEffect } from 'vue'
2
+
3
+ import {
4
+ defaultThemeColor,
5
+ resolveThemeColor,
6
+ themePalettes,
7
+ type ThemeColorKey,
8
+ type ThemePalette,
9
+ } from './colors'
10
+
11
+ const activeColorKey = ref<ThemeColorKey>(defaultThemeColor)
12
+
13
+ function normalizeColor(value: unknown): ThemeColorKey | undefined {
14
+ if (value === undefined)
15
+ return undefined
16
+
17
+ if (value === null)
18
+ return defaultThemeColor
19
+
20
+ if (typeof value === 'string') {
21
+ const trimmed = value.trim()
22
+ if (!trimmed)
23
+ return defaultThemeColor
24
+
25
+ return resolveThemeColor(trimmed)
26
+ }
27
+
28
+ return defaultThemeColor
29
+ }
30
+
31
+ export function useActiveThemePalette(source: () => unknown) {
32
+ watchEffect(() => {
33
+ const normalized = normalizeColor(source())
34
+ if (normalized !== undefined)
35
+ activeColorKey.value = normalized
36
+ })
37
+
38
+ const palette = computed<ThemePalette>(() => themePalettes[activeColorKey.value])
39
+
40
+ return {
41
+ palette,
42
+ colorKey: computed(() => activeColorKey.value),
43
+ }
44
+ }
45
+
46
+ export function getActiveThemePalette(): ThemePalette {
47
+ return themePalettes[activeColorKey.value]
48
+ }
49
+