pilothub 0.0.1

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 (272) hide show
  1. package/.env.local.example +19 -0
  2. package/.github/workflows/ci.yml +40 -0
  3. package/.oxlintrc.json +3 -0
  4. package/AGENTS.md +45 -0
  5. package/CHANGELOG.md +138 -0
  6. package/DEPRECATIONS.md +7 -0
  7. package/LICENSE +21 -0
  8. package/README.md +150 -0
  9. package/biome.json +41 -0
  10. package/convex/_generated/api.d.ts +153 -0
  11. package/convex/_generated/api.js +23 -0
  12. package/convex/_generated/dataModel.d.ts +60 -0
  13. package/convex/_generated/server.d.ts +143 -0
  14. package/convex/_generated/server.js +93 -0
  15. package/convex/auth.config.ts +8 -0
  16. package/convex/auth.ts +19 -0
  17. package/convex/comments.ts +88 -0
  18. package/convex/crons.ts +34 -0
  19. package/convex/devSeed.ts +459 -0
  20. package/convex/devSeedExtra.ts +541 -0
  21. package/convex/downloads.ts +78 -0
  22. package/convex/githubBackups.ts +170 -0
  23. package/convex/githubBackupsNode.ts +183 -0
  24. package/convex/githubImport.ts +317 -0
  25. package/convex/githubSoulBackups.ts +170 -0
  26. package/convex/githubSoulBackupsNode.ts +186 -0
  27. package/convex/http.ts +194 -0
  28. package/convex/httpApi.handlers.test.ts +488 -0
  29. package/convex/httpApi.test.ts +70 -0
  30. package/convex/httpApi.ts +305 -0
  31. package/convex/httpApiV1.handlers.test.ts +584 -0
  32. package/convex/httpApiV1.ts +1172 -0
  33. package/convex/leaderboards.ts +39 -0
  34. package/convex/lib/access.ts +36 -0
  35. package/convex/lib/apiTokenAuth.ts +36 -0
  36. package/convex/lib/badges.ts +50 -0
  37. package/convex/lib/changelog.test.ts +34 -0
  38. package/convex/lib/changelog.ts +278 -0
  39. package/convex/lib/embeddings.ts +38 -0
  40. package/convex/lib/githubBackup.ts +443 -0
  41. package/convex/lib/githubImport.test.ts +247 -0
  42. package/convex/lib/githubImport.ts +425 -0
  43. package/convex/lib/githubSoulBackup.ts +443 -0
  44. package/convex/lib/leaderboards.ts +103 -0
  45. package/convex/lib/moderation.ts +42 -0
  46. package/convex/lib/public.ts +89 -0
  47. package/convex/lib/searchText.test.ts +46 -0
  48. package/convex/lib/searchText.ts +27 -0
  49. package/convex/lib/skillBackfill.test.ts +34 -0
  50. package/convex/lib/skillBackfill.ts +67 -0
  51. package/convex/lib/skillPublish.test.ts +28 -0
  52. package/convex/lib/skillPublish.ts +284 -0
  53. package/convex/lib/skillStats.ts +80 -0
  54. package/convex/lib/skills.test.ts +197 -0
  55. package/convex/lib/skills.ts +273 -0
  56. package/convex/lib/soulChangelog.ts +273 -0
  57. package/convex/lib/soulPublish.ts +236 -0
  58. package/convex/lib/tokens.test.ts +33 -0
  59. package/convex/lib/tokens.ts +51 -0
  60. package/convex/lib/webhooks.test.ts +91 -0
  61. package/convex/lib/webhooks.ts +112 -0
  62. package/convex/maintenance.test.ts +270 -0
  63. package/convex/maintenance.ts +840 -0
  64. package/convex/rateLimits.ts +50 -0
  65. package/convex/schema.ts +472 -0
  66. package/convex/search.test.ts +12 -0
  67. package/convex/search.ts +254 -0
  68. package/convex/seed.test.ts +37 -0
  69. package/convex/seed.ts +254 -0
  70. package/convex/seedSouls.ts +111 -0
  71. package/convex/skillStatEvents.ts +568 -0
  72. package/convex/skills.ts +1606 -0
  73. package/convex/soulComments.ts +88 -0
  74. package/convex/soulDownloads.ts +14 -0
  75. package/convex/soulStars.ts +71 -0
  76. package/convex/souls.ts +570 -0
  77. package/convex/stars.ts +108 -0
  78. package/convex/statsMaintenance.ts +205 -0
  79. package/convex/telemetry.ts +434 -0
  80. package/convex/tokens.ts +88 -0
  81. package/convex/tsconfig.json +7 -0
  82. package/convex/uploads.ts +20 -0
  83. package/convex/users.ts +122 -0
  84. package/convex/webhooks.ts +50 -0
  85. package/convex.json +3 -0
  86. package/docs/README.md +32 -0
  87. package/docs/api.md +51 -0
  88. package/docs/architecture.md +61 -0
  89. package/docs/auth.md +54 -0
  90. package/docs/cli.md +117 -0
  91. package/docs/deploy.md +78 -0
  92. package/docs/diffing.md +84 -0
  93. package/docs/github-import.md +171 -0
  94. package/docs/http-api.md +187 -0
  95. package/docs/manual-testing.md +64 -0
  96. package/docs/mintlify.md +43 -0
  97. package/docs/quickstart.md +120 -0
  98. package/docs/skill-format.md +58 -0
  99. package/docs/soul-format.md +37 -0
  100. package/docs/spec.md +177 -0
  101. package/docs/telemetry.md +91 -0
  102. package/docs/troubleshooting.md +49 -0
  103. package/docs/webhook.md +51 -0
  104. package/e2e/menu-smoke.pw.test.ts +49 -0
  105. package/e2e/pilothub.e2e.test.ts +494 -0
  106. package/e2e/search-exact.pw.test.ts +97 -0
  107. package/package.json +84 -0
  108. package/packages/pilothub/LICENSE +22 -0
  109. package/packages/pilothub/README.md +57 -0
  110. package/packages/pilothub/bin/pilothub.js +2 -0
  111. package/packages/pilothub/package.json +41 -0
  112. package/packages/pilothub/src/browserAuth.test.ts +96 -0
  113. package/packages/pilothub/src/browserAuth.ts +174 -0
  114. package/packages/pilothub/src/cli/buildInfo.ts +94 -0
  115. package/packages/pilothub/src/cli/commands/auth.ts +97 -0
  116. package/packages/pilothub/src/cli/commands/delete.test.ts +73 -0
  117. package/packages/pilothub/src/cli/commands/delete.ts +83 -0
  118. package/packages/pilothub/src/cli/commands/publish.test.ts +122 -0
  119. package/packages/pilothub/src/cli/commands/publish.ts +108 -0
  120. package/packages/pilothub/src/cli/commands/skills.test.ts +191 -0
  121. package/packages/pilothub/src/cli/commands/skills.ts +380 -0
  122. package/packages/pilothub/src/cli/commands/star.ts +46 -0
  123. package/packages/pilothub/src/cli/commands/sync.test.ts +310 -0
  124. package/packages/pilothub/src/cli/commands/sync.ts +200 -0
  125. package/packages/pilothub/src/cli/commands/syncHelpers.test.ts +26 -0
  126. package/packages/pilothub/src/cli/commands/syncHelpers.ts +427 -0
  127. package/packages/pilothub/src/cli/commands/syncTypes.ts +27 -0
  128. package/packages/pilothub/src/cli/commands/unstar.ts +48 -0
  129. package/packages/pilothub/src/cli/helpStyle.ts +45 -0
  130. package/packages/pilothub/src/cli/pilotbotConfig.test.ts +159 -0
  131. package/packages/pilothub/src/cli/pilotbotConfig.ts +147 -0
  132. package/packages/pilothub/src/cli/registry.test.ts +63 -0
  133. package/packages/pilothub/src/cli/registry.ts +43 -0
  134. package/packages/pilothub/src/cli/scanSkills.test.ts +64 -0
  135. package/packages/pilothub/src/cli/scanSkills.ts +84 -0
  136. package/packages/pilothub/src/cli/slug.ts +16 -0
  137. package/packages/pilothub/src/cli/types.ts +12 -0
  138. package/packages/pilothub/src/cli/ui.ts +75 -0
  139. package/packages/pilothub/src/cli.ts +311 -0
  140. package/packages/pilothub/src/config.ts +36 -0
  141. package/packages/pilothub/src/discovery.test.ts +75 -0
  142. package/packages/pilothub/src/discovery.ts +19 -0
  143. package/packages/pilothub/src/http.test.ts +156 -0
  144. package/packages/pilothub/src/http.ts +301 -0
  145. package/packages/pilothub/src/schema/ark.ts +29 -0
  146. package/packages/pilothub/src/schema/index.ts +5 -0
  147. package/packages/pilothub/src/schema/routes.ts +22 -0
  148. package/packages/pilothub/src/schema/schemas.ts +260 -0
  149. package/packages/pilothub/src/schema/textFiles.test.ts +23 -0
  150. package/packages/pilothub/src/schema/textFiles.ts +66 -0
  151. package/packages/pilothub/src/skills.test.ts +191 -0
  152. package/packages/pilothub/src/skills.ts +172 -0
  153. package/packages/pilothub/src/types.ts +10 -0
  154. package/packages/pilothub/tsconfig.json +14 -0
  155. package/packages/schema/README.md +3 -0
  156. package/packages/schema/dist/ark.d.ts +4 -0
  157. package/packages/schema/dist/ark.js +26 -0
  158. package/packages/schema/dist/ark.js.map +1 -0
  159. package/packages/schema/dist/index.d.ts +5 -0
  160. package/packages/schema/dist/index.js +5 -0
  161. package/packages/schema/dist/index.js.map +1 -0
  162. package/packages/schema/dist/routes.d.ts +21 -0
  163. package/packages/schema/dist/routes.js +22 -0
  164. package/packages/schema/dist/routes.js.map +1 -0
  165. package/packages/schema/dist/schemas.d.ts +297 -0
  166. package/packages/schema/dist/schemas.js +243 -0
  167. package/packages/schema/dist/schemas.js.map +1 -0
  168. package/packages/schema/dist/textFiles.d.ts +5 -0
  169. package/packages/schema/dist/textFiles.js +66 -0
  170. package/packages/schema/dist/textFiles.js.map +1 -0
  171. package/packages/schema/package.json +26 -0
  172. package/packages/schema/src/ark.ts +29 -0
  173. package/packages/schema/src/index.ts +5 -0
  174. package/packages/schema/src/routes.ts +22 -0
  175. package/packages/schema/src/schemas.test.ts +123 -0
  176. package/packages/schema/src/schemas.ts +287 -0
  177. package/packages/schema/src/textFiles.test.ts +23 -0
  178. package/packages/schema/src/textFiles.ts +66 -0
  179. package/packages/schema/tsconfig.json +15 -0
  180. package/pilothub +46 -0
  181. package/playwright.config.ts +33 -0
  182. package/public/.well-known/pilothub.json +6 -0
  183. package/public/api/v1/openapi.json +379 -0
  184. package/public/favicon.ico +0 -0
  185. package/public/logo192.png +0 -0
  186. package/public/logo512.png +0 -0
  187. package/public/manifest.json +25 -0
  188. package/public/og.png +0 -0
  189. package/public/og.svg +98 -0
  190. package/public/pilot-logo.png +0 -0
  191. package/public/pilot-mark.png +0 -0
  192. package/public/robots.txt +3 -0
  193. package/public/tanstack-circle-logo.png +0 -0
  194. package/public/tanstack-word-logo-white.svg +1 -0
  195. package/scripts/check-peer-deps.ts +56 -0
  196. package/scripts/docs-list.ts +148 -0
  197. package/scripts/run-playwright-local.sh +14 -0
  198. package/server/og/fetchSkillOgMeta.ts +27 -0
  199. package/server/og/fetchSoulOgMeta.ts +27 -0
  200. package/server/og/ogAssets.ts +80 -0
  201. package/server/og/skillOgSvg.test.ts +59 -0
  202. package/server/og/skillOgSvg.ts +258 -0
  203. package/server/og/soulOgSvg.ts +209 -0
  204. package/server/routes/og/skill.png.ts +103 -0
  205. package/server/routes/og/soul.png.ts +111 -0
  206. package/src/__tests__/skill-detail-page.test.tsx +86 -0
  207. package/src/__tests__/skills-index.test.tsx +145 -0
  208. package/src/__tests__/upload.route.test.tsx +228 -0
  209. package/src/components/AppProviders.tsx +19 -0
  210. package/src/components/ClientOnly.tsx +18 -0
  211. package/src/components/Footer.tsx +29 -0
  212. package/src/components/Header.tsx +295 -0
  213. package/src/components/InstallSwitcher.tsx +53 -0
  214. package/src/components/SkillCard.tsx +36 -0
  215. package/src/components/SkillDetailPage.tsx +817 -0
  216. package/src/components/SkillDiffCard.tsx +485 -0
  217. package/src/components/SoulCard.tsx +19 -0
  218. package/src/components/SoulDetailPage.tsx +263 -0
  219. package/src/components/UserBootstrap.tsx +18 -0
  220. package/src/components/ui/dropdown-menu.tsx +67 -0
  221. package/src/components/ui/toggle-group.tsx +35 -0
  222. package/src/convex/client.ts +3 -0
  223. package/src/lib/badges.ts +29 -0
  224. package/src/lib/diffing.test.ts +163 -0
  225. package/src/lib/diffing.ts +106 -0
  226. package/src/lib/gravatar.test.ts +9 -0
  227. package/src/lib/gravatar.ts +158 -0
  228. package/src/lib/og.test.ts +142 -0
  229. package/src/lib/og.ts +156 -0
  230. package/src/lib/publicUser.ts +39 -0
  231. package/src/lib/roles.ts +19 -0
  232. package/src/lib/site.test.ts +130 -0
  233. package/src/lib/site.ts +84 -0
  234. package/src/lib/theme-transition.test.ts +134 -0
  235. package/src/lib/theme-transition.ts +134 -0
  236. package/src/lib/theme.test.tsx +88 -0
  237. package/src/lib/theme.ts +43 -0
  238. package/src/lib/uploadFiles.jsdom.test.ts +33 -0
  239. package/src/lib/uploadFiles.test.ts +123 -0
  240. package/src/lib/uploadFiles.ts +245 -0
  241. package/src/lib/uploadUtils.test.ts +78 -0
  242. package/src/lib/uploadUtils.ts +93 -0
  243. package/src/lib/useAuthStatus.ts +12 -0
  244. package/src/lib/utils.test.ts +9 -0
  245. package/src/lib/utils.ts +6 -0
  246. package/src/logo.svg +12 -0
  247. package/src/routeTree.gen.ts +345 -0
  248. package/src/router.tsx +17 -0
  249. package/src/routes/$owner/$slug.tsx +55 -0
  250. package/src/routes/__root.tsx +136 -0
  251. package/src/routes/admin.tsx +11 -0
  252. package/src/routes/cli/auth.tsx +168 -0
  253. package/src/routes/dashboard.tsx +97 -0
  254. package/src/routes/import.tsx +415 -0
  255. package/src/routes/index.tsx +252 -0
  256. package/src/routes/management.tsx +529 -0
  257. package/src/routes/settings.tsx +203 -0
  258. package/src/routes/skills/index.tsx +422 -0
  259. package/src/routes/souls/$slug.tsx +55 -0
  260. package/src/routes/souls/index.tsx +243 -0
  261. package/src/routes/stars.tsx +68 -0
  262. package/src/routes/u/$handle.tsx +307 -0
  263. package/src/routes/upload/utils.ts +81 -0
  264. package/src/routes/upload.tsx +499 -0
  265. package/src/styles.css +2718 -0
  266. package/tsconfig.json +24 -0
  267. package/tsconfig.oxlint.json +16 -0
  268. package/vercel.json +8 -0
  269. package/vite.config.ts +48 -0
  270. package/vitest.config.ts +47 -0
  271. package/vitest.e2e.config.ts +11 -0
  272. package/vitest.setup.ts +1 -0
package/src/styles.css ADDED
@@ -0,0 +1,2718 @@
1
+ @import "tailwindcss";
2
+ @import "@fontsource/bricolage-grotesque/latin.css";
3
+ @import "@fontsource/manrope/latin.css";
4
+ @import "@fontsource/ibm-plex-mono/latin.css";
5
+
6
+ :root {
7
+ color-scheme: light dark;
8
+ --bg: #f8f5ef;
9
+ --bg-soft: #fdfaf4;
10
+ --bg-glow-1: #fff1d8;
11
+ --bg-glow-2: #ffe8e0;
12
+ --surface: #ffffff;
13
+ --surface-muted: #fff6f1;
14
+ --nav-bg: rgba(248, 245, 239, 0.85);
15
+ --ink: #1d1a17;
16
+ --ink-soft: #4c463f;
17
+ --accent: #ff6b4a;
18
+ --accent-deep: #e54f31;
19
+ --seafoam: #2bc6a4;
20
+ --gold: #f0c46a;
21
+ --line: rgba(29, 26, 23, 0.12);
22
+ --shadow: 0 24px 60px rgba(29, 26, 23, 0.1);
23
+ --radius-lg: 28px;
24
+ --radius-md: 18px;
25
+ --radius-sm: 12px;
26
+ --font-display: "Bricolage Grotesque", "Manrope", sans-serif;
27
+ --font-body: "Manrope", "Bricolage Grotesque", sans-serif;
28
+ --font-mono:
29
+ "IBM Plex Mono", ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono",
30
+ "Courier New", monospace;
31
+ }
32
+
33
+ [data-theme="dark"] {
34
+ color-scheme: dark;
35
+ --bg: #14110f;
36
+ --bg-soft: #1d1916;
37
+ --bg-glow-1: #2b1a15;
38
+ --bg-glow-2: #231713;
39
+ --surface: #201b18;
40
+ --surface-muted: #241f1b;
41
+ --nav-bg: rgba(20, 17, 15, 0.85);
42
+ --ink: #f6efe4;
43
+ --ink-soft: #c6b8a8;
44
+ --accent: #e86a47;
45
+ --accent-deep: #c24a2f;
46
+ --seafoam: #4ad8b7;
47
+ --gold: #f3c97a;
48
+ --line: rgba(255, 255, 255, 0.12);
49
+ --shadow: 0 24px 60px rgba(0, 0, 0, 0.5);
50
+ }
51
+
52
+ * {
53
+ box-sizing: border-box;
54
+ }
55
+
56
+ body {
57
+ margin: 0;
58
+ font-family: var(--font-body);
59
+ color: var(--ink);
60
+ background:
61
+ radial-gradient(1200px 800px at 20% -10%, var(--bg-glow-1) 0%, transparent 60%),
62
+ radial-gradient(900px 600px at 90% 10%, var(--bg-glow-2) 0%, transparent 60%), var(--bg);
63
+ min-height: 100vh;
64
+ -webkit-font-smoothing: antialiased;
65
+ -moz-osx-font-smoothing: grayscale;
66
+ }
67
+
68
+ a {
69
+ color: inherit;
70
+ text-decoration: none;
71
+ }
72
+
73
+ code {
74
+ font-family: var(--font-mono);
75
+ }
76
+
77
+ .app-shell {
78
+ min-height: 100vh;
79
+ display: flex;
80
+ flex-direction: column;
81
+ }
82
+
83
+ .app-shell main {
84
+ flex: 1;
85
+ }
86
+
87
+ .site-footer {
88
+ padding: 0 24px 40px;
89
+ }
90
+
91
+ .site-footer-inner {
92
+ max-width: 1200px;
93
+ margin: 0 auto;
94
+ }
95
+
96
+ .site-footer-divider {
97
+ height: 1px;
98
+ background: var(--line);
99
+ opacity: 0.6;
100
+ margin: 18px 0 16px;
101
+ }
102
+
103
+ .site-footer-row {
104
+ display: flex;
105
+ align-items: center;
106
+ justify-content: center;
107
+ gap: 16px;
108
+ }
109
+
110
+ .site-footer-copy {
111
+ font-size: 0.85rem;
112
+ color: var(--ink-soft);
113
+ opacity: 0.72;
114
+ text-align: center;
115
+ max-width: 720px;
116
+ }
117
+
118
+ .site-footer-copy a {
119
+ color: inherit;
120
+ text-decoration: underline;
121
+ text-decoration-color: rgba(255, 107, 74, 0.32);
122
+ text-underline-offset: 3px;
123
+ transition:
124
+ color 0.2s ease,
125
+ text-decoration-color 0.2s ease;
126
+ }
127
+
128
+ .site-footer-copy a:hover {
129
+ color: var(--ink);
130
+ text-decoration-color: rgba(255, 107, 74, 0.6);
131
+ }
132
+
133
+ .section-cta {
134
+ display: flex;
135
+ justify-content: flex-end;
136
+ margin-top: 18px;
137
+ }
138
+
139
+ .navbar {
140
+ position: sticky;
141
+ top: 0;
142
+ z-index: 10;
143
+ background: var(--nav-bg);
144
+ backdrop-filter: blur(18px);
145
+ border-bottom: 1px solid var(--line);
146
+ }
147
+
148
+ .navbar-inner {
149
+ max-width: 1200px;
150
+ margin: 0 auto;
151
+ padding: 20px 24px;
152
+ display: flex;
153
+ align-items: center;
154
+ gap: 20px;
155
+ }
156
+
157
+ .brand {
158
+ font-family: var(--font-display);
159
+ font-size: 1.4rem;
160
+ letter-spacing: -0.03em;
161
+ display: flex;
162
+ align-items: center;
163
+ gap: 10px;
164
+ }
165
+
166
+ .brand-name {
167
+ display: inline-flex;
168
+ }
169
+
170
+ .brand-mark {
171
+ width: 36px;
172
+ height: 36px;
173
+ border-radius: 50%;
174
+ background: radial-gradient(circle at 30% 30%, #ffd3c2 0%, #ff6b4a 60%, #d1492f 100%);
175
+ box-shadow: inset 0 0 0 4px rgba(255, 255, 255, 0.5);
176
+ display: grid;
177
+ place-items: center;
178
+ overflow: hidden;
179
+ }
180
+
181
+ .brand-mark img {
182
+ width: 70%;
183
+ height: 70%;
184
+ object-fit: cover;
185
+ border-radius: 50%;
186
+ }
187
+
188
+ .nav-links {
189
+ display: flex;
190
+ gap: 16px;
191
+ font-size: 0.95rem;
192
+ color: var(--ink-soft);
193
+ }
194
+
195
+ .nav-mobile {
196
+ display: none;
197
+ }
198
+
199
+ .nav-mobile-trigger {
200
+ width: 40px;
201
+ height: 40px;
202
+ border-radius: 999px;
203
+ border: 1px solid var(--line);
204
+ background: var(--surface);
205
+ display: grid;
206
+ place-items: center;
207
+ cursor: pointer;
208
+ transition:
209
+ transform 0.2s ease,
210
+ box-shadow 0.2s ease;
211
+ }
212
+
213
+ .nav-mobile-trigger:hover {
214
+ transform: translateY(-1px);
215
+ box-shadow: 0 10px 18px rgba(255, 107, 74, 0.18);
216
+ }
217
+
218
+ .nav-mobile-trigger:focus-visible {
219
+ outline: 3px solid rgba(255, 107, 74, 0.35);
220
+ outline-offset: 3px;
221
+ }
222
+
223
+ .nav-actions {
224
+ margin-left: auto;
225
+ display: flex;
226
+ gap: 12px;
227
+ align-items: center;
228
+ }
229
+
230
+ .theme-toggle {
231
+ display: inline-flex;
232
+ }
233
+
234
+ .user-trigger {
235
+ display: inline-flex;
236
+ align-items: center;
237
+ gap: 10px;
238
+ border: 1px solid var(--line);
239
+ background: var(--surface);
240
+ padding: 6px 12px 6px 6px;
241
+ border-radius: 999px;
242
+ cursor: pointer;
243
+ }
244
+
245
+ .user-trigger img,
246
+ .user-menu-fallback {
247
+ width: 34px;
248
+ height: 34px;
249
+ border-radius: 50%;
250
+ display: grid;
251
+ place-items: center;
252
+ background: rgba(255, 107, 74, 0.2);
253
+ color: var(--accent-deep);
254
+ font-weight: 700;
255
+ font-size: 0.9rem;
256
+ }
257
+
258
+ .user-menu-chevron {
259
+ font-size: 0.8rem;
260
+ color: var(--ink-soft);
261
+ }
262
+
263
+ .btn {
264
+ border: 1px solid var(--line);
265
+ padding: 10px 16px;
266
+ border-radius: 999px;
267
+ background: var(--surface);
268
+ font-weight: 600;
269
+ display: inline-flex;
270
+ align-items: center;
271
+ gap: 8px;
272
+ transition:
273
+ transform 0.2s ease,
274
+ box-shadow 0.2s ease,
275
+ border 0.2s ease;
276
+ }
277
+
278
+ .btn:hover {
279
+ transform: translateY(-1px);
280
+ box-shadow: 0 10px 20px rgba(29, 26, 23, 0.12);
281
+ }
282
+
283
+ .btn:disabled {
284
+ cursor: not-allowed;
285
+ opacity: 0.6;
286
+ box-shadow: none;
287
+ transform: none;
288
+ }
289
+
290
+ .btn-primary {
291
+ background: linear-gradient(135deg, var(--accent), var(--accent-deep));
292
+ color: white;
293
+ border: none;
294
+ }
295
+
296
+ .hero {
297
+ position: relative;
298
+ overflow: hidden;
299
+ padding: 80px 24px 60px;
300
+ }
301
+
302
+ .hero-inner {
303
+ max-width: 1200px;
304
+ margin: 0 auto;
305
+ display: grid;
306
+ grid-template-columns: minmax(0, 1.15fr) minmax(0, 1fr);
307
+ gap: 40px;
308
+ align-items: center;
309
+ transition:
310
+ grid-template-columns 0.45s cubic-bezier(0.2, 0.9, 0.2, 1),
311
+ gap 0.45s cubic-bezier(0.2, 0.9, 0.2, 1);
312
+ }
313
+
314
+ .hero-copy {
315
+ max-height: 640px;
316
+ overflow: hidden;
317
+ min-width: 0;
318
+ transition:
319
+ opacity 0.35s ease,
320
+ transform 0.35s ease,
321
+ max-height 0.35s ease;
322
+ }
323
+
324
+ .hero.search-mode .hero-inner {
325
+ grid-template-columns: 0fr minmax(0, 1fr);
326
+ gap: 0px;
327
+ }
328
+
329
+ .hero.search-mode .hero-copy {
330
+ opacity: 0;
331
+ transform: translateY(-12px);
332
+ max-height: 0;
333
+ pointer-events: none;
334
+ }
335
+
336
+ .hero-title {
337
+ font-family: var(--font-display);
338
+ font-size: clamp(2.6rem, 4vw, 4rem);
339
+ letter-spacing: -0.03em;
340
+ margin-bottom: 16px;
341
+ }
342
+
343
+ .hero-subtitle {
344
+ font-size: 1.1rem;
345
+ color: var(--ink-soft);
346
+ line-height: 1.6;
347
+ }
348
+
349
+ .hero-card {
350
+ background: var(--bg-soft);
351
+ border-radius: var(--radius-lg);
352
+ padding: 28px;
353
+ box-shadow: var(--shadow);
354
+ border: 1px solid rgba(255, 107, 74, 0.15);
355
+ }
356
+
357
+ .hero-search-card {
358
+ transition:
359
+ transform 0.35s ease,
360
+ box-shadow 0.35s ease;
361
+ }
362
+
363
+ .hero.search-mode .hero-search-card {
364
+ transform: scale(1.01);
365
+ box-shadow: 0 22px 46px rgba(29, 26, 23, 0.16);
366
+ }
367
+
368
+ .hero-badge {
369
+ display: inline-flex;
370
+ align-items: center;
371
+ gap: 8px;
372
+ background: rgba(255, 107, 74, 0.12);
373
+ color: var(--accent-deep);
374
+ border-radius: 999px;
375
+ padding: 6px 14px;
376
+ font-weight: 600;
377
+ font-size: 0.85rem;
378
+ }
379
+
380
+ .section {
381
+ width: 100%;
382
+ max-width: 1200px;
383
+ margin: 0 auto;
384
+ padding: 32px 24px 72px;
385
+ box-sizing: border-box;
386
+ }
387
+
388
+ .upload-shell {
389
+ position: relative;
390
+ }
391
+
392
+ .upload-header {
393
+ display: flex;
394
+ align-items: flex-end;
395
+ justify-content: space-between;
396
+ gap: 24px;
397
+ margin-bottom: 28px;
398
+ }
399
+
400
+ .upload-kicker {
401
+ display: inline-flex;
402
+ align-items: center;
403
+ gap: 8px;
404
+ font-weight: 600;
405
+ color: var(--accent-deep);
406
+ text-transform: uppercase;
407
+ letter-spacing: 0.16em;
408
+ font-size: 0.7rem;
409
+ }
410
+
411
+ .upload-title {
412
+ font-family: var(--font-display);
413
+ font-size: clamp(2.2rem, 3.5vw, 3rem);
414
+ letter-spacing: -0.03em;
415
+ margin: 8px 0 10px;
416
+ }
417
+
418
+ .upload-subtitle {
419
+ color: var(--ink-soft);
420
+ max-width: 560px;
421
+ line-height: 1.6;
422
+ margin: 0;
423
+ }
424
+
425
+ .upload-badge {
426
+ background: linear-gradient(140deg, #ffddc9, #ffe9df);
427
+ color: #9a3a24;
428
+ border-radius: 999px;
429
+ padding: 12px 18px;
430
+ font-weight: 700;
431
+ box-shadow: 0 12px 24px rgba(255, 107, 74, 0.18);
432
+ text-align: center;
433
+ display: flex;
434
+ flex-direction: column;
435
+ gap: 4px;
436
+ }
437
+
438
+ .upload-badge-sub {
439
+ font-size: 0.7rem;
440
+ letter-spacing: 0.08em;
441
+ text-transform: uppercase;
442
+ }
443
+
444
+ .upload-card {
445
+ background: linear-gradient(180deg, var(--surface) 0%, var(--surface-muted) 100%);
446
+ border-radius: calc(var(--radius-lg) + 6px);
447
+ border: 1px solid rgba(255, 107, 74, 0.18);
448
+ padding: 28px;
449
+ box-shadow: 0 24px 60px rgba(29, 26, 23, 0.12);
450
+ display: flex;
451
+ flex-direction: column;
452
+ gap: 24px;
453
+ }
454
+
455
+ .upload-grid {
456
+ display: grid;
457
+ grid-template-columns: minmax(0, 1.1fr) minmax(260px, 0.7fr);
458
+ gap: 28px;
459
+ }
460
+
461
+ .upload-fields {
462
+ display: grid;
463
+ gap: 14px;
464
+ }
465
+
466
+ .upload-field {
467
+ display: grid;
468
+ gap: 10px;
469
+ font-weight: 600;
470
+ }
471
+
472
+ .upload-field-header {
473
+ display: flex;
474
+ align-items: baseline;
475
+ justify-content: space-between;
476
+ gap: 12px;
477
+ }
478
+
479
+ .upload-field span {
480
+ font-size: 0.9rem;
481
+ color: var(--ink-soft);
482
+ }
483
+
484
+ .upload-field-hint {
485
+ font-size: 0.82rem;
486
+ color: rgba(92, 85, 78, 0.8);
487
+ font-weight: 500;
488
+ }
489
+
490
+ [data-theme="dark"] .upload-field-hint {
491
+ color: rgba(198, 184, 168, 0.72);
492
+ }
493
+
494
+ .upload-input {
495
+ border: 1px solid rgba(29, 26, 23, 0.18);
496
+ border-radius: 14px;
497
+ padding: 12px 14px;
498
+ background: #fffdf9;
499
+ box-shadow:
500
+ inset 0 0 0 1px rgba(255, 255, 255, 0.85),
501
+ inset 0 1px 6px rgba(255, 107, 74, 0.08);
502
+ }
503
+
504
+ [data-theme="dark"] .upload-input {
505
+ background: rgba(28, 23, 20, 0.95);
506
+ border-color: rgba(255, 255, 255, 0.12);
507
+ color: var(--ink);
508
+ box-shadow:
509
+ inset 0 0 0 1px rgba(255, 255, 255, 0.05),
510
+ inset 0 1px 6px rgba(0, 0, 0, 0.2);
511
+ }
512
+
513
+ [data-theme="dark"] .upload-input::placeholder {
514
+ color: rgba(198, 184, 168, 0.7);
515
+ }
516
+
517
+ .upload-input:focus {
518
+ border-color: rgba(255, 107, 74, 0.6);
519
+ box-shadow:
520
+ 0 0 0 2px rgba(255, 107, 74, 0.2),
521
+ inset 0 0 0 1px rgba(255, 255, 255, 0.8);
522
+ }
523
+
524
+ .upload-row {
525
+ display: grid;
526
+ grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
527
+ gap: 16px;
528
+ }
529
+
530
+ .upload-side {
531
+ display: grid;
532
+ gap: 16px;
533
+ align-content: start;
534
+ }
535
+
536
+ .dropzone {
537
+ border: 2px dashed rgba(255, 107, 74, 0.5);
538
+ border-radius: 24px;
539
+ padding: 20px;
540
+ background: radial-gradient(circle at top, #fff3ec 0%, #ffffff 65%);
541
+ display: grid;
542
+ gap: 12px;
543
+ text-align: center;
544
+ cursor: pointer;
545
+ transition:
546
+ transform 0.2s ease,
547
+ box-shadow 0.2s ease,
548
+ border-color 0.2s ease;
549
+ }
550
+
551
+ [data-theme="dark"] .dropzone {
552
+ background: radial-gradient(circle at top, rgba(35, 26, 22, 0.9) 0%, rgba(20, 17, 15, 0.9) 70%);
553
+ border-color: rgba(255, 131, 95, 0.5);
554
+ color: var(--ink);
555
+ }
556
+
557
+ .dropzone:hover {
558
+ transform: translateY(-2px);
559
+ box-shadow: 0 18px 30px rgba(255, 107, 74, 0.15);
560
+ }
561
+
562
+ [data-theme="dark"] .dropzone:hover {
563
+ box-shadow: 0 20px 36px rgba(0, 0, 0, 0.45);
564
+ }
565
+
566
+ .dropzone.is-dragging {
567
+ border-color: var(--accent);
568
+ box-shadow: 0 20px 40px rgba(255, 107, 74, 0.25);
569
+ background: radial-gradient(circle at top, #ffe1d3 0%, #fff6f1 70%);
570
+ }
571
+
572
+ [data-theme="dark"] .dropzone.is-dragging {
573
+ box-shadow: 0 20px 40px rgba(255, 131, 95, 0.25);
574
+ background: radial-gradient(circle at top, rgba(66, 35, 28, 0.9) 0%, rgba(24, 19, 16, 0.9) 70%);
575
+ }
576
+
577
+ .dropzone-icon {
578
+ width: 54px;
579
+ height: 54px;
580
+ border-radius: 16px;
581
+ margin: 0 auto;
582
+ display: grid;
583
+ place-items: center;
584
+ font-size: 1.4rem;
585
+ background: linear-gradient(160deg, #ff6b4a, #f08b5f);
586
+ color: white;
587
+ box-shadow: inset 0 0 0 3px rgba(255, 255, 255, 0.4);
588
+ }
589
+
590
+ [data-theme="dark"] .dropzone-icon {
591
+ box-shadow: inset 0 0 0 3px rgba(255, 255, 255, 0.12);
592
+ }
593
+
594
+ .dropzone-input {
595
+ display: none;
596
+ }
597
+
598
+ .dropzone-button {
599
+ all: unset;
600
+ display: grid;
601
+ gap: 12px;
602
+ text-align: center;
603
+ cursor: pointer;
604
+ width: 100%;
605
+ height: 100%;
606
+ }
607
+
608
+ .dropzone-button:focus-visible {
609
+ outline: 3px solid rgba(255, 107, 74, 0.35);
610
+ outline-offset: 6px;
611
+ border-radius: 18px;
612
+ }
613
+
614
+ .upload-summary {
615
+ border-radius: 20px;
616
+ background: rgba(255, 255, 255, 0.7);
617
+ border: 1px solid rgba(29, 26, 23, 0.08);
618
+ padding: 16px;
619
+ display: grid;
620
+ gap: 10px;
621
+ font-size: 0.9rem;
622
+ }
623
+
624
+ [data-theme="dark"] .upload-summary {
625
+ background: rgba(20, 17, 15, 0.7);
626
+ border-color: rgba(255, 255, 255, 0.08);
627
+ }
628
+
629
+ .upload-requirement {
630
+ padding: 6px 12px;
631
+ border-radius: 999px;
632
+ background: rgba(255, 107, 74, 0.12);
633
+ color: #9a3a24;
634
+ font-weight: 600;
635
+ width: fit-content;
636
+ }
637
+
638
+ .upload-requirement.ok {
639
+ background: rgba(43, 198, 164, 0.18);
640
+ color: #1a6b5b;
641
+ }
642
+
643
+ .upload-filelist {
644
+ display: grid;
645
+ gap: 6px;
646
+ max-height: 220px;
647
+ overflow: auto;
648
+ }
649
+
650
+ .upload-filelist .upload-file {
651
+ display: flex;
652
+ align-items: center;
653
+ gap: 12px;
654
+ font-size: 0.85rem;
655
+ color: var(--ink-soft);
656
+ }
657
+
658
+ .upload-file span:first-child {
659
+ flex: 1;
660
+ overflow: hidden;
661
+ text-overflow: ellipsis;
662
+ white-space: nowrap;
663
+ }
664
+
665
+ .upload-remove {
666
+ border: none;
667
+ background: transparent;
668
+ color: var(--accent-deep);
669
+ font-weight: 600;
670
+ cursor: pointer;
671
+ }
672
+
673
+ .upload-remove:hover {
674
+ text-decoration: underline;
675
+ }
676
+
677
+ .upload-more {
678
+ font-size: 0.8rem;
679
+ color: var(--ink-soft);
680
+ }
681
+
682
+ .upload-muted {
683
+ color: var(--ink-soft);
684
+ margin: 0;
685
+ }
686
+
687
+ .upload-notes {
688
+ background: #fff8f3;
689
+ border: 1px solid rgba(255, 107, 74, 0.12);
690
+ border-radius: 18px;
691
+ padding: 16px;
692
+ font-size: 0.85rem;
693
+ color: var(--ink-soft);
694
+ }
695
+
696
+ [data-theme="dark"] .upload-notes {
697
+ background: rgba(32, 27, 24, 0.6);
698
+ }
699
+
700
+ .upload-notes ul {
701
+ padding-left: 18px;
702
+ margin: 8px 0 0;
703
+ display: grid;
704
+ gap: 6px;
705
+ }
706
+
707
+ .upload-footer {
708
+ display: flex;
709
+ align-items: center;
710
+ gap: 16px;
711
+ flex-wrap: wrap;
712
+ }
713
+
714
+ .upload-validation {
715
+ display: grid;
716
+ gap: 6px;
717
+ font-size: 0.85rem;
718
+ color: #9a3a24;
719
+ }
720
+
721
+ .upload-validation-item {
722
+ display: flex;
723
+ align-items: center;
724
+ gap: 8px;
725
+ }
726
+
727
+ .upload-validation-item::before {
728
+ content: "•";
729
+ }
730
+
731
+ .upload-ready {
732
+ font-size: 0.9rem;
733
+ font-weight: 600;
734
+ color: #1a6b5b;
735
+ }
736
+
737
+ .upload-error {
738
+ color: #b84a3a;
739
+ }
740
+
741
+ .section-title {
742
+ font-family: var(--font-display);
743
+ font-size: 1.8rem;
744
+ letter-spacing: -0.02em;
745
+ margin-bottom: 10px;
746
+ }
747
+
748
+ .section-subtitle {
749
+ color: var(--ink-soft);
750
+ margin-bottom: 24px;
751
+ }
752
+
753
+ .grid {
754
+ display: grid;
755
+ grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
756
+ gap: 20px;
757
+ }
758
+
759
+ .skills-header {
760
+ display: flex;
761
+ align-items: flex-end;
762
+ justify-content: space-between;
763
+ gap: 14px;
764
+ flex-wrap: wrap;
765
+ margin-bottom: 22px;
766
+ }
767
+
768
+ .skills-toolbar {
769
+ display: grid;
770
+ gap: 10px;
771
+ padding: 14px 16px;
772
+ border-radius: 18px;
773
+ border: 1px solid rgba(255, 107, 74, 0.18);
774
+ background: linear-gradient(135deg, var(--surface), var(--surface-muted));
775
+ min-width: min(520px, 100%);
776
+ }
777
+
778
+ .skills-search {
779
+ display: flex;
780
+ align-items: center;
781
+ border-radius: 999px;
782
+ border: 1px solid rgba(255, 107, 74, 0.2);
783
+ background: rgba(255, 255, 255, 0.45);
784
+ padding: 10px 14px;
785
+ }
786
+
787
+ [data-theme="dark"] .skills-search {
788
+ background: rgba(24, 19, 16, 0.55);
789
+ border-color: rgba(255, 131, 95, 0.35);
790
+ }
791
+
792
+ .skills-search-input {
793
+ border: none;
794
+ outline: none;
795
+ width: 100%;
796
+ font-size: 0.95rem;
797
+ background: transparent;
798
+ }
799
+
800
+ .skills-toolbar-row {
801
+ display: flex;
802
+ align-items: center;
803
+ justify-content: flex-end;
804
+ gap: 10px;
805
+ flex-wrap: wrap;
806
+ }
807
+
808
+ .skills-sort {
809
+ appearance: none;
810
+ border: 1px solid rgba(255, 107, 74, 0.2);
811
+ border-radius: 999px;
812
+ padding: 10px 14px;
813
+ background: rgba(255, 255, 255, 0.45);
814
+ color: var(--ink);
815
+ font-weight: 650;
816
+ font-size: 0.9rem;
817
+ cursor: pointer;
818
+ }
819
+
820
+ [data-theme="dark"] .skills-sort {
821
+ background: rgba(24, 19, 16, 0.55);
822
+ border-color: rgba(255, 131, 95, 0.35);
823
+ }
824
+
825
+ .skills-dir,
826
+ .skills-view {
827
+ border: 1px solid rgba(255, 107, 74, 0.2);
828
+ border-radius: 999px;
829
+ padding: 10px 12px;
830
+ background: rgba(255, 255, 255, 0.45);
831
+ color: var(--ink);
832
+ font-weight: 700;
833
+ cursor: pointer;
834
+ }
835
+
836
+ [data-theme="dark"] .skills-dir,
837
+ [data-theme="dark"] .skills-view {
838
+ background: rgba(24, 19, 16, 0.55);
839
+ border-color: rgba(255, 131, 95, 0.35);
840
+ }
841
+
842
+ .skills-view.is-active {
843
+ background: rgba(255, 107, 74, 0.16);
844
+ border-color: rgba(255, 107, 74, 0.32);
845
+ color: var(--accent-deep);
846
+ }
847
+
848
+ .skills-list {
849
+ display: grid;
850
+ gap: 0;
851
+ border-radius: var(--radius-md);
852
+ border: 1px solid var(--line);
853
+ overflow: hidden;
854
+ background: var(--surface);
855
+ }
856
+
857
+ .skills-row {
858
+ display: grid;
859
+ grid-template-columns: minmax(0, 1fr) auto;
860
+ gap: 14px;
861
+ padding: 14px 18px;
862
+ text-decoration: none;
863
+ color: inherit;
864
+ border-bottom: 1px solid var(--line);
865
+ transition: background 0.15s ease;
866
+ }
867
+
868
+ .skills-row:last-child {
869
+ border-bottom: none;
870
+ }
871
+
872
+ .skills-row:hover {
873
+ background: rgba(255, 107, 74, 0.07);
874
+ }
875
+
876
+ [data-theme="dark"] .skills-row:hover {
877
+ background: rgba(232, 106, 71, 0.11);
878
+ }
879
+
880
+ .skills-row-main {
881
+ display: grid;
882
+ gap: 6px;
883
+ min-width: 0;
884
+ }
885
+
886
+ .skills-row-title {
887
+ display: flex;
888
+ align-items: baseline;
889
+ gap: 10px;
890
+ flex-wrap: wrap;
891
+ font-family: var(--font-display);
892
+ font-size: 1.1rem;
893
+ letter-spacing: -0.02em;
894
+ }
895
+
896
+ .skills-row-slug {
897
+ font-family: var(--font-mono);
898
+ font-size: 0.85rem;
899
+ color: var(--ink-soft);
900
+ }
901
+
902
+ .skills-row-summary {
903
+ color: var(--ink-soft);
904
+ font-size: 0.95rem;
905
+ line-height: 1.45;
906
+ overflow: hidden;
907
+ text-overflow: ellipsis;
908
+ display: -webkit-box;
909
+ -webkit-line-clamp: 2;
910
+ -webkit-box-orient: vertical;
911
+ }
912
+
913
+ .skills-row-metrics {
914
+ display: flex;
915
+ align-items: center;
916
+ justify-content: flex-end;
917
+ gap: 14px;
918
+ font-family: var(--font-mono);
919
+ font-size: 0.85rem;
920
+ color: var(--ink-soft);
921
+ white-space: nowrap;
922
+ }
923
+
924
+ .skills-row-metrics span {
925
+ display: inline-flex;
926
+ gap: 6px;
927
+ align-items: center;
928
+ }
929
+
930
+ .card {
931
+ width: 100%;
932
+ background: var(--surface);
933
+ border-radius: var(--radius-md);
934
+ border: 1px solid var(--line);
935
+ padding: 20px;
936
+ display: flex;
937
+ flex-direction: column;
938
+ gap: 12px;
939
+ box-sizing: border-box;
940
+ transition:
941
+ transform 0.2s ease,
942
+ box-shadow 0.2s ease;
943
+ }
944
+
945
+ .loading-indicator {
946
+ display: inline-flex;
947
+ align-items: center;
948
+ gap: 10px;
949
+ font-weight: 650;
950
+ color: var(--ink-soft);
951
+ }
952
+
953
+ .loading-indicator::before {
954
+ content: "";
955
+ width: 14px;
956
+ height: 14px;
957
+ border-radius: 999px;
958
+ border: 2px solid rgba(255, 107, 74, 0.25);
959
+ border-top-color: var(--accent);
960
+ animation: spin 0.9s linear infinite;
961
+ }
962
+
963
+ .skill-card {
964
+ min-height: 176px;
965
+ }
966
+
967
+ .skill-card-tags {
968
+ display: flex;
969
+ flex-wrap: wrap;
970
+ gap: 6px;
971
+ }
972
+
973
+ .tag-compact {
974
+ padding: 3px 10px;
975
+ font-size: 0.72rem;
976
+ }
977
+
978
+ .skills-row-meta {
979
+ font-size: 0.82rem;
980
+ color: var(--ink-soft);
981
+ }
982
+
983
+ .skill-card-title {
984
+ font-family: var(--font-display);
985
+ font-size: 1.2rem;
986
+ letter-spacing: -0.02em;
987
+ margin: 0;
988
+ display: -webkit-box;
989
+ -webkit-line-clamp: 2;
990
+ -webkit-box-orient: vertical;
991
+ overflow: hidden;
992
+ }
993
+
994
+ .skill-card-summary {
995
+ margin: 0;
996
+ color: var(--ink-soft);
997
+ font-size: 0.95rem;
998
+ line-height: 1.45;
999
+ display: -webkit-box;
1000
+ -webkit-line-clamp: 3;
1001
+ -webkit-box-orient: vertical;
1002
+ overflow: hidden;
1003
+ }
1004
+
1005
+ .skill-card-footer {
1006
+ margin-top: auto;
1007
+ }
1008
+
1009
+ .skill-card-footer-inline {
1010
+ display: flex;
1011
+ align-items: center;
1012
+ justify-content: space-between;
1013
+ gap: 12px;
1014
+ }
1015
+
1016
+ .hero-install {
1017
+ display: grid;
1018
+ gap: 10px;
1019
+ }
1020
+
1021
+ .install-switcher {
1022
+ display: grid;
1023
+ gap: 10px;
1024
+ }
1025
+
1026
+ .install-switcher-row {
1027
+ display: flex;
1028
+ align-items: center;
1029
+ justify-content: space-between;
1030
+ gap: 14px;
1031
+ flex-wrap: wrap;
1032
+ }
1033
+
1034
+ .install-switcher-toggle {
1035
+ display: inline-flex;
1036
+ border-radius: 999px;
1037
+ padding: 4px;
1038
+ border: 1px solid rgba(255, 107, 74, 0.22);
1039
+ background: rgba(255, 107, 74, 0.06);
1040
+ }
1041
+
1042
+ [data-theme="dark"] .install-switcher-toggle {
1043
+ border-color: rgba(232, 106, 71, 0.32);
1044
+ background: rgba(232, 106, 71, 0.12);
1045
+ }
1046
+
1047
+ .install-switcher-pill {
1048
+ appearance: none;
1049
+ border: none;
1050
+ background: transparent;
1051
+ color: var(--ink-soft);
1052
+ font: inherit;
1053
+ font-weight: 650;
1054
+ font-size: 0.85rem;
1055
+ padding: 6px 10px;
1056
+ border-radius: 999px;
1057
+ cursor: pointer;
1058
+ transition:
1059
+ background 0.18s ease,
1060
+ color 0.18s ease,
1061
+ transform 0.18s ease;
1062
+ }
1063
+
1064
+ .install-switcher-pill:hover {
1065
+ color: var(--ink);
1066
+ transform: translateY(-1px);
1067
+ }
1068
+
1069
+ .install-switcher-pill.is-active {
1070
+ background: rgba(255, 107, 74, 0.18);
1071
+ color: var(--accent-deep);
1072
+ }
1073
+
1074
+ [data-theme="dark"] .install-switcher-pill.is-active {
1075
+ background: rgba(232, 106, 71, 0.22);
1076
+ color: #ffd0bf;
1077
+ }
1078
+
1079
+ .hero-install-code {
1080
+ border: 1px solid rgba(255, 107, 74, 0.2);
1081
+ border-left: 3px solid var(--accent-deep);
1082
+ background: linear-gradient(180deg, rgba(255, 255, 255, 0.92), rgba(255, 250, 247, 0.9));
1083
+ border-radius: 12px;
1084
+ padding: 12px 14px;
1085
+ font-size: 0.9rem;
1086
+ line-height: 1.55;
1087
+ color: var(--ink);
1088
+ font-family: var(--font-mono);
1089
+ overflow-x: auto;
1090
+ -webkit-overflow-scrolling: touch;
1091
+ margin: 0;
1092
+ text-align: left;
1093
+ font-variant-ligatures: none;
1094
+ font-feature-settings:
1095
+ "liga" 0,
1096
+ "calt" 0;
1097
+ white-space: pre;
1098
+ tab-size: 2;
1099
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.7);
1100
+ }
1101
+
1102
+ [data-theme="dark"] .hero-install-code {
1103
+ border-color: rgba(232, 106, 71, 0.35);
1104
+ background: linear-gradient(180deg, rgba(26, 20, 18, 0.9), rgba(20, 16, 14, 0.85));
1105
+ color: #f5e9e3;
1106
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.05);
1107
+ }
1108
+
1109
+ .tag {
1110
+ display: inline-flex;
1111
+ align-items: center;
1112
+ gap: 6px;
1113
+ padding: 4px 12px;
1114
+ border-radius: 999px;
1115
+ background: rgba(43, 198, 164, 0.16);
1116
+ color: #1a6b5b;
1117
+ font-size: 0.8rem;
1118
+ font-weight: 600;
1119
+ }
1120
+
1121
+ [data-theme="dark"] .tag {
1122
+ background: rgba(232, 106, 71, 0.2);
1123
+ color: #ffd0bf;
1124
+ }
1125
+
1126
+ .skill-actions {
1127
+ display: flex;
1128
+ gap: 10px;
1129
+ flex-wrap: wrap;
1130
+ align-items: center;
1131
+ }
1132
+
1133
+ .star-toggle {
1134
+ width: 36px;
1135
+ height: 36px;
1136
+ border-radius: 50%;
1137
+ border: 1px solid rgba(255, 107, 74, 0.35);
1138
+ background: rgba(255, 107, 74, 0.12);
1139
+ color: var(--accent-deep);
1140
+ display: grid;
1141
+ place-items: center;
1142
+ cursor: pointer;
1143
+ transition:
1144
+ transform 0.2s ease,
1145
+ box-shadow 0.2s ease,
1146
+ background 0.2s ease;
1147
+ }
1148
+
1149
+ .star-toggle span {
1150
+ font-size: 1.1rem;
1151
+ }
1152
+
1153
+ .star-toggle:hover {
1154
+ transform: translateY(-1px);
1155
+ box-shadow: 0 10px 18px rgba(255, 107, 74, 0.2);
1156
+ }
1157
+
1158
+ .star-toggle.is-active {
1159
+ background: var(--accent);
1160
+ color: white;
1161
+ border-color: var(--accent-deep);
1162
+ }
1163
+
1164
+ .star-toggle:focus-visible {
1165
+ outline: 3px solid rgba(255, 107, 74, 0.35);
1166
+ outline-offset: 3px;
1167
+ }
1168
+
1169
+ [data-theme="dark"] .star-toggle {
1170
+ border-color: rgba(232, 106, 71, 0.45);
1171
+ background: rgba(232, 106, 71, 0.16);
1172
+ color: #ffd0bf;
1173
+ }
1174
+
1175
+ .highlight-toggle {
1176
+ width: 36px;
1177
+ height: 36px;
1178
+ border-radius: 50%;
1179
+ border: 1px solid rgba(43, 198, 164, 0.45);
1180
+ background: rgba(43, 198, 164, 0.14);
1181
+ color: #1a6b5b;
1182
+ display: grid;
1183
+ place-items: center;
1184
+ cursor: pointer;
1185
+ transition:
1186
+ transform 0.2s ease,
1187
+ box-shadow 0.2s ease,
1188
+ background 0.2s ease;
1189
+ }
1190
+
1191
+ .highlight-toggle span {
1192
+ font-size: 1.05rem;
1193
+ }
1194
+
1195
+ .highlight-toggle:hover {
1196
+ transform: translateY(-1px);
1197
+ box-shadow: 0 10px 18px rgba(43, 198, 164, 0.2);
1198
+ }
1199
+
1200
+ .highlight-toggle.is-active {
1201
+ background: rgba(43, 198, 164, 0.28);
1202
+ border-color: rgba(43, 198, 164, 0.7);
1203
+ }
1204
+
1205
+ .highlight-toggle:focus-visible {
1206
+ outline: 3px solid rgba(43, 198, 164, 0.3);
1207
+ outline-offset: 3px;
1208
+ }
1209
+
1210
+ [data-theme="dark"] .highlight-toggle {
1211
+ border-color: rgba(255, 131, 95, 0.45);
1212
+ background: rgba(255, 131, 95, 0.12);
1213
+ color: #ffd0bf;
1214
+ }
1215
+
1216
+ [data-theme="dark"] .highlight-toggle.is-active {
1217
+ background: rgba(255, 131, 95, 0.22);
1218
+ border-color: rgba(255, 131, 95, 0.55);
1219
+ }
1220
+
1221
+ .stat {
1222
+ display: flex;
1223
+ gap: 10px;
1224
+ align-items: center;
1225
+ font-size: 0.9rem;
1226
+ color: var(--ink-soft);
1227
+ }
1228
+
1229
+ .search-bar {
1230
+ display: flex;
1231
+ gap: 12px;
1232
+ padding: 14px 16px;
1233
+ border-radius: 16px;
1234
+ border: 1px solid var(--line);
1235
+ background: var(--surface);
1236
+ align-items: center;
1237
+ }
1238
+
1239
+ .hero.search-mode .search-bar {
1240
+ padding: 18px 20px;
1241
+ }
1242
+
1243
+ .hero.search-mode .search-input {
1244
+ font-size: 1.1rem;
1245
+ }
1246
+
1247
+ @media (max-width: 860px) {
1248
+ .hero-inner {
1249
+ grid-template-columns: 1fr;
1250
+ transition: none;
1251
+ }
1252
+
1253
+ .hero.search-mode .hero-inner {
1254
+ grid-template-columns: 1fr;
1255
+ gap: 24px;
1256
+ }
1257
+ }
1258
+
1259
+ .skill-detail-stack {
1260
+ display: grid;
1261
+ gap: 16px;
1262
+ }
1263
+
1264
+ .skill-hero {
1265
+ gap: 14px;
1266
+ }
1267
+
1268
+ .skill-hero-header {
1269
+ display: flex;
1270
+ flex-wrap: wrap;
1271
+ align-items: flex-start;
1272
+ justify-content: space-between;
1273
+ gap: 24px;
1274
+ }
1275
+
1276
+ @media (max-width: 960px) {
1277
+ .skill-hero-top.has-plugin {
1278
+ grid-template-columns: 1fr;
1279
+ }
1280
+ }
1281
+
1282
+ .skill-hero-title {
1283
+ display: grid;
1284
+ gap: 10px;
1285
+ min-width: min(100%, 320px);
1286
+ flex: 1 1 360px;
1287
+ }
1288
+
1289
+ .skill-hero-title-row {
1290
+ display: flex;
1291
+ align-items: baseline;
1292
+ gap: 12px;
1293
+ flex-wrap: wrap;
1294
+ }
1295
+
1296
+ .skill-hero-note {
1297
+ font-size: 0.9rem;
1298
+ color: var(--ink);
1299
+ max-width: 560px;
1300
+ padding: 8px 12px;
1301
+ border-radius: 12px;
1302
+ background: rgba(255, 107, 74, 0.08);
1303
+ border: 1px solid rgba(255, 107, 74, 0.18);
1304
+ }
1305
+
1306
+ [data-theme="dark"] .skill-hero-note {
1307
+ background: rgba(232, 106, 71, 0.16);
1308
+ border-color: rgba(232, 106, 71, 0.3);
1309
+ }
1310
+
1311
+ .tag-accent {
1312
+ background: rgba(255, 107, 74, 0.16);
1313
+ color: var(--accent-deep);
1314
+ }
1315
+
1316
+ .skill-hero-top {
1317
+ display: grid;
1318
+ gap: 16px;
1319
+ }
1320
+
1321
+ .skill-hero-top.has-plugin {
1322
+ grid-template-columns: minmax(0, 1fr) minmax(320px, 420px);
1323
+ align-items: start;
1324
+ }
1325
+
1326
+ .skill-hero-content {
1327
+ display: grid;
1328
+ gap: 16px;
1329
+ }
1330
+
1331
+ .bundle-card {
1332
+ border: 1px solid rgba(255, 107, 74, 0.35);
1333
+ border-radius: 18px;
1334
+ padding: 18px;
1335
+ background: linear-gradient(135deg, rgba(255, 107, 74, 0.1), rgba(255, 255, 255, 0.7));
1336
+ box-shadow: 0 18px 30px rgba(37, 31, 26, 0.08);
1337
+ }
1338
+
1339
+ [data-theme="dark"] .bundle-card {
1340
+ background: linear-gradient(135deg, rgba(232, 106, 71, 0.2), rgba(24, 19, 16, 0.7));
1341
+ border-color: rgba(232, 106, 71, 0.5);
1342
+ box-shadow: 0 18px 30px rgba(0, 0, 0, 0.35);
1343
+ }
1344
+
1345
+ [data-theme="dark"] .tag-accent {
1346
+ background: rgba(232, 106, 71, 0.24);
1347
+ color: #ffd0bf;
1348
+ }
1349
+
1350
+ .bundle-header {
1351
+ display: grid;
1352
+ gap: 6px;
1353
+ }
1354
+
1355
+ .bundle-title {
1356
+ font-family: var(--font-display);
1357
+ font-size: 1.05rem;
1358
+ letter-spacing: -0.015em;
1359
+ }
1360
+
1361
+ .bundle-subtitle {
1362
+ font-size: 0.88rem;
1363
+ color: var(--ink-soft);
1364
+ }
1365
+
1366
+ .bundle-includes {
1367
+ display: flex;
1368
+ flex-wrap: wrap;
1369
+ gap: 8px;
1370
+ }
1371
+
1372
+ .bundle-includes span {
1373
+ padding: 6px 12px;
1374
+ border-radius: 999px;
1375
+ background: rgba(255, 107, 74, 0.16);
1376
+ color: var(--accent-deep);
1377
+ font-size: 0.76rem;
1378
+ font-weight: 650;
1379
+ letter-spacing: 0.01em;
1380
+ }
1381
+
1382
+ [data-theme="dark"] .bundle-includes span {
1383
+ background: rgba(232, 106, 71, 0.22);
1384
+ color: #ffd0bf;
1385
+ }
1386
+
1387
+ .bundle-section {
1388
+ display: grid;
1389
+ gap: 8px;
1390
+ padding: 10px 12px;
1391
+ border-radius: 14px;
1392
+ background: rgba(255, 255, 255, 0.6);
1393
+ border: 1px solid rgba(255, 107, 74, 0.12);
1394
+ }
1395
+
1396
+ .bundle-card .hero-install-code {
1397
+ white-space: pre-wrap;
1398
+ overflow-wrap: anywhere;
1399
+ word-break: break-word;
1400
+ text-align: left;
1401
+ font-variant-ligatures: none;
1402
+ font-feature-settings:
1403
+ "liga" 0,
1404
+ "calt" 0;
1405
+ }
1406
+
1407
+ [data-theme="dark"] .bundle-section {
1408
+ background: rgba(30, 24, 20, 0.6);
1409
+ border-color: rgba(232, 106, 71, 0.2);
1410
+ }
1411
+
1412
+ .bundle-section-title {
1413
+ font-size: 0.9rem;
1414
+ font-weight: 650;
1415
+ }
1416
+
1417
+ .bundle-meta {
1418
+ display: grid;
1419
+ gap: 6px;
1420
+ }
1421
+
1422
+ .bundle-details summary {
1423
+ cursor: pointer;
1424
+ font-weight: 650;
1425
+ list-style: none;
1426
+ }
1427
+
1428
+ .bundle-details summary::-webkit-details-marker {
1429
+ display: none;
1430
+ }
1431
+
1432
+ .bundle-details summary::before {
1433
+ content: "▸";
1434
+ display: inline-block;
1435
+ margin-right: 8px;
1436
+ color: var(--accent-deep);
1437
+ }
1438
+
1439
+ .bundle-details[open] summary::before {
1440
+ content: "▾";
1441
+ }
1442
+
1443
+ .skill-hero-cta {
1444
+ display: flex;
1445
+ flex-direction: column;
1446
+ align-items: flex-end;
1447
+ gap: 10px;
1448
+ }
1449
+
1450
+ .skill-version-pill {
1451
+ display: grid;
1452
+ gap: 4px;
1453
+ padding: 10px 14px;
1454
+ border-radius: 16px;
1455
+ border: 1px solid var(--line);
1456
+ background: var(--surface-muted);
1457
+ text-align: right;
1458
+ min-width: 150px;
1459
+ }
1460
+
1461
+ .skill-version-label {
1462
+ font-size: 0.68rem;
1463
+ letter-spacing: 0.12em;
1464
+ text-transform: uppercase;
1465
+ color: var(--ink-soft);
1466
+ }
1467
+
1468
+ .skill-tag-row {
1469
+ display: flex;
1470
+ flex-wrap: wrap;
1471
+ gap: 8px;
1472
+ align-items: center;
1473
+ }
1474
+
1475
+ .tag-meta {
1476
+ font-size: 0.72rem;
1477
+ font-weight: 600;
1478
+ color: inherit;
1479
+ opacity: 0.7;
1480
+ }
1481
+
1482
+ .tag-form {
1483
+ display: grid;
1484
+ grid-template-columns: minmax(140px, 1fr) minmax(160px, 1fr) auto;
1485
+ gap: 10px;
1486
+ align-items: center;
1487
+ }
1488
+
1489
+ .skill-hero-panels {
1490
+ display: grid;
1491
+ gap: 14px;
1492
+ grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
1493
+ }
1494
+
1495
+ .skill-panel {
1496
+ display: grid;
1497
+ gap: 10px;
1498
+ padding: 14px;
1499
+ border-radius: 16px;
1500
+ border: 1px solid var(--line);
1501
+ background: var(--surface-muted);
1502
+ }
1503
+
1504
+ .skill-panel-body {
1505
+ display: grid;
1506
+ gap: 8px;
1507
+ }
1508
+
1509
+ .diff-card {
1510
+ gap: 16px;
1511
+ }
1512
+
1513
+ .diff-card-embedded {
1514
+ padding: 0;
1515
+ background: transparent;
1516
+ border: none;
1517
+ }
1518
+
1519
+ .diff-header {
1520
+ display: flex;
1521
+ justify-content: space-between;
1522
+ align-items: center;
1523
+ gap: 16px;
1524
+ flex-wrap: wrap;
1525
+ }
1526
+
1527
+ .diff-toggle-group {
1528
+ display: inline-flex;
1529
+ align-items: center;
1530
+ gap: 6px;
1531
+ padding: 4px;
1532
+ border-radius: 999px;
1533
+ border: 1px solid var(--line);
1534
+ background: var(--surface-muted);
1535
+ margin: 0;
1536
+ min-inline-size: 0;
1537
+ }
1538
+
1539
+ .diff-toggle {
1540
+ border: none;
1541
+ background: transparent;
1542
+ padding: 8px 14px;
1543
+ border-radius: 999px;
1544
+ font-weight: 600;
1545
+ color: var(--ink-soft);
1546
+ cursor: pointer;
1547
+ }
1548
+
1549
+ .diff-toggle.is-active {
1550
+ background: var(--surface);
1551
+ color: var(--ink);
1552
+ box-shadow: 0 8px 18px rgba(29, 26, 23, 0.12);
1553
+ }
1554
+
1555
+ .diff-controls {
1556
+ display: grid;
1557
+ grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr);
1558
+ gap: 12px;
1559
+ align-items: end;
1560
+ }
1561
+
1562
+ .diff-select {
1563
+ display: grid;
1564
+ gap: 6px;
1565
+ }
1566
+
1567
+ .diff-select label {
1568
+ font-size: 0.7rem;
1569
+ text-transform: uppercase;
1570
+ letter-spacing: 0.08em;
1571
+ color: var(--ink-soft);
1572
+ }
1573
+
1574
+ .diff-swap {
1575
+ align-self: end;
1576
+ }
1577
+
1578
+ .diff-meta {
1579
+ display: flex;
1580
+ justify-content: space-between;
1581
+ gap: 12px;
1582
+ color: var(--ink-soft);
1583
+ font-size: 0.85rem;
1584
+ flex-wrap: wrap;
1585
+ }
1586
+
1587
+ .diff-layout {
1588
+ display: grid;
1589
+ grid-template-columns: minmax(180px, 240px) minmax(0, 1fr);
1590
+ gap: 16px;
1591
+ align-items: start;
1592
+ }
1593
+
1594
+ .diff-files {
1595
+ display: grid;
1596
+ gap: 8px;
1597
+ max-height: 420px;
1598
+ overflow: auto;
1599
+ padding-right: 4px;
1600
+ }
1601
+
1602
+ .diff-file {
1603
+ border: 1px solid var(--line);
1604
+ background: var(--surface-muted);
1605
+ border-radius: 14px;
1606
+ padding: 10px 12px;
1607
+ text-align: left;
1608
+ display: grid;
1609
+ gap: 6px;
1610
+ transition:
1611
+ transform 0.2s ease,
1612
+ box-shadow 0.2s ease,
1613
+ border 0.2s ease;
1614
+ }
1615
+
1616
+ .diff-file:hover {
1617
+ transform: translateY(-1px);
1618
+ box-shadow: 0 10px 20px rgba(29, 26, 23, 0.12);
1619
+ }
1620
+
1621
+ .diff-file.is-active {
1622
+ border-color: rgba(255, 107, 74, 0.45);
1623
+ box-shadow: 0 12px 24px rgba(255, 107, 74, 0.2);
1624
+ }
1625
+
1626
+ .diff-file-name {
1627
+ font-size: 0.9rem;
1628
+ color: var(--ink);
1629
+ font-family: var(--font-mono);
1630
+ word-break: break-all;
1631
+ }
1632
+
1633
+ .diff-pill {
1634
+ display: inline-flex;
1635
+ align-items: center;
1636
+ gap: 6px;
1637
+ font-size: 0.7rem;
1638
+ text-transform: uppercase;
1639
+ letter-spacing: 0.08em;
1640
+ font-weight: 700;
1641
+ padding: 4px 8px;
1642
+ border-radius: 999px;
1643
+ align-self: start;
1644
+ }
1645
+
1646
+ .diff-pill-added {
1647
+ background: rgba(43, 198, 164, 0.18);
1648
+ color: #0b6b58;
1649
+ }
1650
+
1651
+ .diff-pill-removed {
1652
+ background: rgba(255, 107, 74, 0.18);
1653
+ color: #9b3a25;
1654
+ }
1655
+
1656
+ .diff-pill-changed {
1657
+ background: rgba(240, 196, 106, 0.22);
1658
+ color: #8a5b14;
1659
+ }
1660
+
1661
+ .diff-pill-same {
1662
+ background: rgba(29, 26, 23, 0.08);
1663
+ color: var(--ink-soft);
1664
+ }
1665
+
1666
+ .diff-view {
1667
+ position: relative;
1668
+ min-height: 360px;
1669
+ }
1670
+
1671
+ .diff-monaco {
1672
+ height: 420px;
1673
+ border-radius: 18px;
1674
+ border: 1px solid var(--line);
1675
+ overflow: hidden;
1676
+ background: var(--surface);
1677
+ }
1678
+
1679
+ .diff-empty {
1680
+ border-radius: 16px;
1681
+ border: 1px dashed var(--line);
1682
+ padding: 20px;
1683
+ color: var(--ink-soft);
1684
+ background: var(--surface-muted);
1685
+ font-size: 0.9rem;
1686
+ }
1687
+
1688
+ .diff-loading {
1689
+ position: absolute;
1690
+ bottom: 12px;
1691
+ right: 16px;
1692
+ font-size: 0.8rem;
1693
+ color: var(--ink-soft);
1694
+ background: rgba(255, 255, 255, 0.8);
1695
+ border-radius: 999px;
1696
+ padding: 6px 10px;
1697
+ border: 1px solid var(--line);
1698
+ }
1699
+
1700
+ .tab-card {
1701
+ gap: 14px;
1702
+ }
1703
+
1704
+ .tab-header {
1705
+ display: inline-flex;
1706
+ align-items: center;
1707
+ gap: 6px;
1708
+ padding: 4px;
1709
+ border-radius: 999px;
1710
+ border: 1px solid var(--line);
1711
+ background: var(--surface-muted);
1712
+ align-self: flex-start;
1713
+ }
1714
+
1715
+ .tab-button {
1716
+ border: none;
1717
+ background: transparent;
1718
+ padding: 8px 16px;
1719
+ border-radius: 999px;
1720
+ font-weight: 650;
1721
+ color: var(--ink-soft);
1722
+ cursor: pointer;
1723
+ }
1724
+
1725
+ .tab-button.is-active {
1726
+ background: var(--surface);
1727
+ color: var(--ink);
1728
+ box-shadow: 0 8px 18px rgba(29, 26, 23, 0.12);
1729
+ }
1730
+
1731
+ .tab-body {
1732
+ display: grid;
1733
+ gap: 20px;
1734
+ }
1735
+
1736
+ .file-list {
1737
+ display: grid;
1738
+ gap: 12px;
1739
+ padding-top: 8px;
1740
+ border-top: 1px solid var(--line);
1741
+ }
1742
+
1743
+ .file-list-header {
1744
+ display: flex;
1745
+ align-items: baseline;
1746
+ justify-content: space-between;
1747
+ gap: 10px;
1748
+ }
1749
+
1750
+ .file-list-body {
1751
+ display: grid;
1752
+ gap: 8px;
1753
+ max-height: 260px;
1754
+ overflow: auto;
1755
+ padding-right: 4px;
1756
+ }
1757
+
1758
+ .version-scroll {
1759
+ max-height: 320px;
1760
+ overflow: auto;
1761
+ padding-right: 4px;
1762
+ }
1763
+
1764
+ .file-row {
1765
+ display: flex;
1766
+ align-items: center;
1767
+ justify-content: space-between;
1768
+ gap: 12px;
1769
+ padding: 10px 12px;
1770
+ border-radius: 12px;
1771
+ border: 1px solid var(--line);
1772
+ background: var(--surface-muted);
1773
+ }
1774
+
1775
+ .file-path {
1776
+ font-family: var(--font-mono);
1777
+ font-size: 0.9rem;
1778
+ color: var(--ink);
1779
+ word-break: break-all;
1780
+ }
1781
+
1782
+ .file-meta {
1783
+ font-size: 0.8rem;
1784
+ color: var(--ink-soft);
1785
+ white-space: nowrap;
1786
+ }
1787
+
1788
+ .comment-form {
1789
+ display: grid;
1790
+ gap: 12px;
1791
+ margin-top: 12px;
1792
+ }
1793
+
1794
+ .comment-input {
1795
+ border-radius: 16px;
1796
+ border: 1px solid var(--line);
1797
+ padding: 14px 16px;
1798
+ font-size: 1rem;
1799
+ background: var(--surface-muted);
1800
+ color: var(--ink);
1801
+ font-family: var(--font-body);
1802
+ min-height: 120px;
1803
+ resize: vertical;
1804
+ }
1805
+
1806
+ .comment-input:focus-visible {
1807
+ outline: 3px solid rgba(255, 107, 74, 0.25);
1808
+ outline-offset: 3px;
1809
+ }
1810
+
1811
+ .comment-submit {
1812
+ justify-self: start;
1813
+ padding: 8px 14px;
1814
+ font-size: 0.9rem;
1815
+ }
1816
+
1817
+ .sidebar-card {
1818
+ gap: 20px;
1819
+ }
1820
+
1821
+ .sidebar-section {
1822
+ display: grid;
1823
+ gap: 12px;
1824
+ }
1825
+
1826
+ .sidebar-stack {
1827
+ display: grid;
1828
+ gap: 8px;
1829
+ }
1830
+
1831
+ .sidebar-divider {
1832
+ height: 1px;
1833
+ background: var(--line);
1834
+ opacity: 0.6;
1835
+ }
1836
+
1837
+ .sidebar-scroll {
1838
+ max-height: 260px;
1839
+ overflow: auto;
1840
+ padding-right: 4px;
1841
+ }
1842
+
1843
+ .sidebar-form {
1844
+ display: grid;
1845
+ gap: 10px;
1846
+ margin-top: 12px;
1847
+ }
1848
+
1849
+ .version-list {
1850
+ display: grid;
1851
+ gap: 14px;
1852
+ }
1853
+
1854
+ .version-row {
1855
+ display: grid;
1856
+ grid-template-columns: minmax(0, 1fr) auto;
1857
+ gap: 16px;
1858
+ align-items: center;
1859
+ padding: 6px 0;
1860
+ }
1861
+
1862
+ .version-info {
1863
+ display: grid;
1864
+ gap: 6px;
1865
+ color: var(--ink-soft);
1866
+ font-size: 0.9rem;
1867
+ }
1868
+
1869
+ .version-actions {
1870
+ display: grid;
1871
+ align-items: center;
1872
+ }
1873
+
1874
+ .version-zip {
1875
+ justify-self: end;
1876
+ }
1877
+
1878
+ [data-theme="dark"] .diff-pill-added {
1879
+ color: #72f0d3;
1880
+ }
1881
+
1882
+ [data-theme="dark"] .diff-pill-removed {
1883
+ color: #ffc1b1;
1884
+ }
1885
+
1886
+ [data-theme="dark"] .diff-pill-changed {
1887
+ color: #ffd494;
1888
+ }
1889
+
1890
+ [data-theme="dark"] .diff-loading {
1891
+ background: rgba(32, 27, 24, 0.85);
1892
+ }
1893
+
1894
+ @media (max-width: 760px) {
1895
+ .navbar-inner {
1896
+ padding: 16px 16px;
1897
+ gap: 14px;
1898
+ }
1899
+
1900
+ .nav-links {
1901
+ display: none;
1902
+ }
1903
+
1904
+ .nav-mobile {
1905
+ display: inline-flex;
1906
+ }
1907
+
1908
+ .theme-toggle {
1909
+ display: none;
1910
+ }
1911
+
1912
+ .hero {
1913
+ padding: 64px 18px 46px;
1914
+ }
1915
+
1916
+ .section {
1917
+ padding: 28px 18px 64px;
1918
+ }
1919
+
1920
+ .section-cta {
1921
+ justify-content: flex-start;
1922
+ }
1923
+
1924
+ .skill-hero-header {
1925
+ flex-direction: column;
1926
+ align-items: stretch;
1927
+ }
1928
+
1929
+ .skill-hero-cta {
1930
+ align-items: flex-start;
1931
+ }
1932
+
1933
+ .tag-form {
1934
+ grid-template-columns: 1fr;
1935
+ align-items: stretch;
1936
+ }
1937
+
1938
+ .diff-controls {
1939
+ grid-template-columns: 1fr;
1940
+ }
1941
+
1942
+ .diff-layout {
1943
+ grid-template-columns: 1fr;
1944
+ }
1945
+
1946
+ .diff-files {
1947
+ grid-auto-flow: column;
1948
+ grid-auto-columns: minmax(180px, 1fr);
1949
+ overflow-x: auto;
1950
+ padding-bottom: 6px;
1951
+ max-height: none;
1952
+ }
1953
+
1954
+ .skills-row {
1955
+ grid-template-columns: 1fr;
1956
+ gap: 10px;
1957
+ }
1958
+
1959
+ .skills-row-metrics {
1960
+ justify-content: flex-start;
1961
+ white-space: normal;
1962
+ flex-wrap: wrap;
1963
+ row-gap: 8px;
1964
+ }
1965
+ }
1966
+
1967
+ @media (max-width: 520px) {
1968
+ .brand {
1969
+ font-size: 1.25rem;
1970
+ }
1971
+
1972
+ .nav-actions {
1973
+ gap: 10px;
1974
+ }
1975
+
1976
+ .navbar .btn {
1977
+ padding: 9px 12px;
1978
+ font-size: 0.95rem;
1979
+ }
1980
+
1981
+ .sign-in-provider {
1982
+ display: none;
1983
+ }
1984
+
1985
+ .user-trigger .mono,
1986
+ .user-menu-chevron {
1987
+ display: none;
1988
+ }
1989
+
1990
+ .search-bar {
1991
+ flex-wrap: wrap;
1992
+ gap: 10px;
1993
+ }
1994
+
1995
+ .search-bar > .mono {
1996
+ display: none;
1997
+ }
1998
+
1999
+ .search-input {
2000
+ flex: 1 1 180px;
2001
+ min-width: 0;
2002
+ }
2003
+
2004
+ .search-filter-button {
2005
+ width: 100%;
2006
+ justify-content: center;
2007
+ }
2008
+
2009
+ .install-switcher-row {
2010
+ align-items: flex-start;
2011
+ flex-direction: column;
2012
+ gap: 10px;
2013
+ }
2014
+
2015
+ .site-footer {
2016
+ padding: 0 18px 36px;
2017
+ }
2018
+ }
2019
+
2020
+ .search-filter-button {
2021
+ border-radius: 999px;
2022
+ border: 1px solid rgba(255, 107, 74, 0.3);
2023
+ padding: 10px 14px;
2024
+ background: var(--surface-muted);
2025
+ color: var(--ink);
2026
+ font-weight: 600;
2027
+ cursor: pointer;
2028
+ transition:
2029
+ border 0.2s ease,
2030
+ box-shadow 0.2s ease,
2031
+ background 0.2s ease,
2032
+ color 0.2s ease;
2033
+ }
2034
+
2035
+ .search-filter-button[aria-pressed="true"] {
2036
+ background: var(--accent);
2037
+ border-color: var(--accent-deep);
2038
+ color: white;
2039
+ box-shadow: 0 10px 20px rgba(255, 107, 74, 0.3);
2040
+ }
2041
+
2042
+ .search-filter-button:focus-visible {
2043
+ outline: 3px solid rgba(255, 107, 74, 0.3);
2044
+ outline-offset: 3px;
2045
+ }
2046
+
2047
+ .search-filter {
2048
+ display: inline-flex;
2049
+ align-items: center;
2050
+ gap: 12px;
2051
+ padding: 10px 14px;
2052
+ border-radius: 999px;
2053
+ border: 1px solid rgba(255, 107, 74, 0.2);
2054
+ background: var(--surface-muted);
2055
+ color: var(--ink);
2056
+ font-weight: 600;
2057
+ }
2058
+
2059
+ .search-filter-input {
2060
+ appearance: none;
2061
+ width: 20px;
2062
+ height: 20px;
2063
+ border-radius: 6px;
2064
+ border: 2px solid rgba(255, 107, 74, 0.4);
2065
+ display: grid;
2066
+ place-items: center;
2067
+ background: transparent;
2068
+ transition:
2069
+ border 0.2s ease,
2070
+ box-shadow 0.2s ease,
2071
+ background 0.2s ease;
2072
+ }
2073
+
2074
+ .search-filter-input::after {
2075
+ content: "";
2076
+ width: 10px;
2077
+ height: 10px;
2078
+ border-radius: 3px;
2079
+ background: white;
2080
+ transform: scale(0);
2081
+ transition: transform 0.15s ease;
2082
+ }
2083
+
2084
+ .search-filter-input:checked {
2085
+ background: var(--accent);
2086
+ border-color: var(--accent-deep);
2087
+ box-shadow: 0 8px 16px rgba(255, 107, 74, 0.3);
2088
+ }
2089
+
2090
+ .search-filter-input:checked::after {
2091
+ transform: scale(1);
2092
+ }
2093
+
2094
+ .search-filter-input:focus-visible {
2095
+ outline: 3px solid rgba(255, 107, 74, 0.3);
2096
+ outline-offset: 3px;
2097
+ }
2098
+
2099
+ [data-theme="dark"] .search-filter {
2100
+ background: rgba(36, 31, 27, 0.9);
2101
+ border-color: rgba(255, 131, 95, 0.35);
2102
+ }
2103
+
2104
+ [data-theme="dark"] .search-filter-button {
2105
+ background: rgba(36, 31, 27, 0.9);
2106
+ border-color: rgba(255, 131, 95, 0.35);
2107
+ }
2108
+
2109
+ [data-theme="dark"] .search-filter-input {
2110
+ border-color: rgba(255, 131, 95, 0.6);
2111
+ }
2112
+
2113
+ .search-input {
2114
+ border: none;
2115
+ outline: none;
2116
+ flex: 1;
2117
+ font-size: 1rem;
2118
+ background: transparent;
2119
+ }
2120
+
2121
+ .settings-shell {
2122
+ display: grid;
2123
+ gap: 20px;
2124
+ }
2125
+
2126
+ .settings-profile {
2127
+ display: flex;
2128
+ align-items: center;
2129
+ gap: 14px;
2130
+ background: linear-gradient(135deg, var(--surface), var(--surface-muted));
2131
+ }
2132
+
2133
+ .settings-avatar {
2134
+ width: 72px;
2135
+ height: 72px;
2136
+ border-radius: 22px;
2137
+ background: rgba(255, 107, 74, 0.14);
2138
+ border: 1px solid rgba(255, 107, 74, 0.3);
2139
+ display: grid;
2140
+ place-items: center;
2141
+ font-weight: 700;
2142
+ color: var(--accent-deep);
2143
+ overflow: hidden;
2144
+ }
2145
+
2146
+ .settings-avatar img {
2147
+ width: 100%;
2148
+ height: 100%;
2149
+ object-fit: cover;
2150
+ }
2151
+
2152
+ .settings-profile-body {
2153
+ display: grid;
2154
+ gap: 4px;
2155
+ }
2156
+
2157
+ .settings-name {
2158
+ font-size: 1.25rem;
2159
+ font-weight: 700;
2160
+ }
2161
+
2162
+ .settings-handle {
2163
+ color: var(--ink-soft);
2164
+ }
2165
+
2166
+ .settings-email {
2167
+ font-size: 0.95rem;
2168
+ color: var(--ink-soft);
2169
+ }
2170
+
2171
+ .profile-tabs {
2172
+ display: flex;
2173
+ align-items: center;
2174
+ gap: 10px;
2175
+ flex-wrap: wrap;
2176
+ margin: 0 0 18px;
2177
+ }
2178
+
2179
+ .profile-tab {
2180
+ border: 1px solid rgba(255, 107, 74, 0.2);
2181
+ background: rgba(255, 255, 255, 0.45);
2182
+ color: var(--ink-soft);
2183
+ padding: 10px 14px;
2184
+ border-radius: 999px;
2185
+ font-weight: 650;
2186
+ cursor: pointer;
2187
+ transition:
2188
+ transform 0.18s ease,
2189
+ background 0.18s ease,
2190
+ border-color 0.18s ease,
2191
+ color 0.18s ease;
2192
+ }
2193
+
2194
+ [data-theme="dark"] .profile-tab {
2195
+ background: rgba(24, 19, 16, 0.55);
2196
+ border-color: rgba(255, 131, 95, 0.35);
2197
+ }
2198
+
2199
+ .profile-tab:hover {
2200
+ transform: translateY(-1px);
2201
+ color: var(--ink);
2202
+ }
2203
+
2204
+ .profile-tab.is-active {
2205
+ background: rgba(255, 107, 74, 0.16);
2206
+ border-color: rgba(255, 107, 74, 0.32);
2207
+ color: var(--accent-deep);
2208
+ }
2209
+
2210
+ .profile-actions {
2211
+ display: flex;
2212
+ align-items: center;
2213
+ gap: 10px;
2214
+ flex-wrap: wrap;
2215
+ margin-bottom: 18px;
2216
+ }
2217
+
2218
+ .telemetry-root-header {
2219
+ display: flex;
2220
+ align-items: flex-start;
2221
+ justify-content: space-between;
2222
+ gap: 12px;
2223
+ flex-wrap: wrap;
2224
+ }
2225
+
2226
+ .telemetry-root-title {
2227
+ font-weight: 750;
2228
+ letter-spacing: -0.01em;
2229
+ }
2230
+
2231
+ .telemetry-root-meta {
2232
+ font-size: 0.9rem;
2233
+ color: var(--ink-soft);
2234
+ margin-top: 4px;
2235
+ }
2236
+
2237
+ .telemetry-skill-list {
2238
+ display: grid;
2239
+ gap: 10px;
2240
+ margin-top: 10px;
2241
+ }
2242
+
2243
+ .telemetry-skill-row {
2244
+ display: flex;
2245
+ align-items: baseline;
2246
+ justify-content: space-between;
2247
+ gap: 12px;
2248
+ flex-wrap: wrap;
2249
+ }
2250
+
2251
+ .telemetry-skill-link {
2252
+ display: inline-flex;
2253
+ align-items: baseline;
2254
+ gap: 10px;
2255
+ min-width: 0;
2256
+ }
2257
+
2258
+ .telemetry-skill-slug {
2259
+ font-family: var(--font-mono);
2260
+ font-size: 0.85rem;
2261
+ color: var(--ink-soft);
2262
+ }
2263
+
2264
+ .telemetry-skill-meta {
2265
+ color: var(--ink-soft);
2266
+ white-space: nowrap;
2267
+ }
2268
+
2269
+ .settings-card {
2270
+ display: grid;
2271
+ gap: 16px;
2272
+ }
2273
+
2274
+ .settings-field {
2275
+ display: grid;
2276
+ gap: 8px;
2277
+ font-weight: 600;
2278
+ color: var(--ink);
2279
+ }
2280
+
2281
+ .settings-input {
2282
+ width: 100%;
2283
+ border-radius: 14px;
2284
+ border: 1px solid rgba(255, 107, 74, 0.2);
2285
+ background: var(--surface-muted);
2286
+ padding: 12px 14px;
2287
+ font-size: 1rem;
2288
+ color: var(--ink);
2289
+ outline: none;
2290
+ transition:
2291
+ border 0.2s ease,
2292
+ box-shadow 0.2s ease;
2293
+ }
2294
+
2295
+ .settings-input:focus {
2296
+ border-color: rgba(255, 107, 74, 0.5);
2297
+ box-shadow: 0 0 0 3px rgba(255, 107, 74, 0.15);
2298
+ }
2299
+
2300
+ .settings-actions {
2301
+ display: flex;
2302
+ align-items: center;
2303
+ gap: 12px;
2304
+ }
2305
+
2306
+ .settings-save {
2307
+ padding: 10px 22px;
2308
+ }
2309
+
2310
+ .danger-card {
2311
+ margin-top: 8px;
2312
+ border: 1px solid rgba(255, 107, 74, 0.28);
2313
+ background: linear-gradient(135deg, rgba(255, 107, 74, 0.08), transparent);
2314
+ }
2315
+
2316
+ .danger-title {
2317
+ margin: 0 0 6px;
2318
+ font-size: 1.2rem;
2319
+ }
2320
+
2321
+ .btn-danger {
2322
+ background: linear-gradient(135deg, #ff5b5b, #d62a2a);
2323
+ border: none;
2324
+ color: #fff;
2325
+ }
2326
+
2327
+ [data-theme="dark"] .settings-input {
2328
+ background: #251f1b;
2329
+ border-color: rgba(255, 131, 95, 0.25);
2330
+ }
2331
+
2332
+ [data-theme="dark"] .settings-input:focus {
2333
+ box-shadow: 0 0 0 3px rgba(255, 131, 95, 0.2);
2334
+ }
2335
+
2336
+ @media (max-width: 900px) {
2337
+ .upload-header {
2338
+ flex-direction: column;
2339
+ align-items: flex-start;
2340
+ }
2341
+
2342
+ .upload-grid {
2343
+ grid-template-columns: 1fr;
2344
+ }
2345
+ }
2346
+
2347
+ .mono {
2348
+ font-family: var(--font-mono);
2349
+ }
2350
+
2351
+ .markdown {
2352
+ line-height: 1.7;
2353
+ color: #3f3a34;
2354
+ }
2355
+
2356
+ [data-theme="dark"] .markdown {
2357
+ color: rgba(246, 239, 228, 0.9);
2358
+ }
2359
+
2360
+ .markdown h1,
2361
+ .markdown h2,
2362
+ .markdown h3 {
2363
+ font-family: var(--font-display);
2364
+ margin-top: 1.4rem;
2365
+ }
2366
+
2367
+ .markdown a {
2368
+ color: var(--accent-deep);
2369
+ }
2370
+
2371
+ .markdown :not(pre) > code {
2372
+ background: rgba(255, 107, 74, 0.12);
2373
+ padding: 2px 6px;
2374
+ border-radius: 8px;
2375
+ }
2376
+
2377
+ .markdown pre {
2378
+ white-space: pre;
2379
+ overflow-x: auto;
2380
+ -webkit-overflow-scrolling: touch;
2381
+ background: linear-gradient(180deg, rgba(255, 255, 255, 0.9), rgba(255, 250, 247, 0.88));
2382
+ border: 1px solid rgba(255, 107, 74, 0.18);
2383
+ border-left: 3px solid var(--accent-deep);
2384
+ border-radius: 12px;
2385
+ padding: 14px 16px;
2386
+ font-family: var(--font-mono);
2387
+ font-size: 0.9rem;
2388
+ line-height: 1.55;
2389
+ tab-size: 2;
2390
+ color: var(--ink);
2391
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.7);
2392
+ }
2393
+
2394
+ .markdown pre code {
2395
+ background: transparent;
2396
+ padding: 0;
2397
+ border-radius: 0;
2398
+ white-space: inherit;
2399
+ font-family: inherit;
2400
+ color: inherit;
2401
+ }
2402
+
2403
+ [data-theme="dark"] .markdown pre {
2404
+ background: linear-gradient(180deg, rgba(26, 20, 18, 0.9), rgba(20, 16, 14, 0.85));
2405
+ border: 1px solid rgba(232, 106, 71, 0.28);
2406
+ border-left-color: rgba(232, 106, 71, 0.8);
2407
+ color: #f5e9e3;
2408
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.05);
2409
+ }
2410
+
2411
+ [data-theme="dark"] .markdown :not(pre) > code {
2412
+ background: rgba(255, 131, 95, 0.2);
2413
+ color: #ffe9de;
2414
+ }
2415
+
2416
+ [data-theme="dark"] .markdown pre code {
2417
+ background: transparent;
2418
+ color: inherit;
2419
+ }
2420
+
2421
+ .fade-up {
2422
+ animation: fadeUp 0.6s ease forwards;
2423
+ opacity: 0;
2424
+ transform: translateY(12px);
2425
+ }
2426
+
2427
+ .fade-up[data-delay="1"] {
2428
+ animation-delay: 0.1s;
2429
+ }
2430
+
2431
+ .fade-up[data-delay="2"] {
2432
+ animation-delay: 0.2s;
2433
+ }
2434
+
2435
+ .fade-up[data-delay="3"] {
2436
+ animation-delay: 0.3s;
2437
+ }
2438
+
2439
+ @keyframes fadeUp {
2440
+ to {
2441
+ opacity: 1;
2442
+ transform: translateY(0);
2443
+ }
2444
+ }
2445
+
2446
+ @keyframes spin {
2447
+ to {
2448
+ transform: rotate(360deg);
2449
+ }
2450
+ }
2451
+
2452
+ @keyframes theme-circle-transition {
2453
+ 0% {
2454
+ clip-path: circle(0% at var(--theme-switch-x, 50%) var(--theme-switch-y, 50%));
2455
+ }
2456
+ 100% {
2457
+ clip-path: circle(150% at var(--theme-switch-x, 50%) var(--theme-switch-y, 50%));
2458
+ }
2459
+ }
2460
+
2461
+ html.theme-transition {
2462
+ view-transition-name: theme;
2463
+ }
2464
+
2465
+ /* biome-ignore lint/correctness/noUnknownTypeSelector: Custom view-transition pseudo-element for theme switch. */
2466
+ html.theme-transition::view-transition-old(theme) {
2467
+ mix-blend-mode: normal;
2468
+ animation: none;
2469
+ z-index: 1;
2470
+ }
2471
+
2472
+ /* biome-ignore lint/correctness/noUnknownTypeSelector: Custom view-transition pseudo-element for theme switch. */
2473
+ html.theme-transition::view-transition-new(theme) {
2474
+ mix-blend-mode: normal;
2475
+ z-index: 2;
2476
+ animation: theme-circle-transition 0.45s ease-out forwards;
2477
+ }
2478
+
2479
+ @media (prefers-reduced-motion: reduce) {
2480
+ /* biome-ignore lint/correctness/noUnknownTypeSelector: Custom view-transition pseudo-element for theme switch. */
2481
+ html.theme-transition::view-transition-old(theme) {
2482
+ /* biome-ignore lint/complexity/noImportantStyles: reduce-motion override */
2483
+ animation: none !important;
2484
+ }
2485
+
2486
+ /* biome-ignore lint/correctness/noUnknownTypeSelector: Custom view-transition pseudo-element for theme switch. */
2487
+ html.theme-transition::view-transition-new(theme) {
2488
+ /* biome-ignore lint/complexity/noImportantStyles: reduce-motion override */
2489
+ animation: none !important;
2490
+ }
2491
+ }
2492
+
2493
+ /* Dashboard styles */
2494
+ .dashboard-header {
2495
+ display: flex;
2496
+ justify-content: space-between;
2497
+ align-items: center;
2498
+ margin-bottom: 24px;
2499
+ }
2500
+
2501
+ .dashboard-header h1 {
2502
+ font-size: 1.5rem;
2503
+ font-weight: 600;
2504
+ margin: 0;
2505
+ }
2506
+
2507
+ .dashboard-empty {
2508
+ display: flex;
2509
+ flex-direction: column;
2510
+ align-items: center;
2511
+ justify-content: center;
2512
+ text-align: center;
2513
+ padding: 48px 24px;
2514
+ gap: 16px;
2515
+ }
2516
+
2517
+ .dashboard-empty h2 {
2518
+ font-size: 1.25rem;
2519
+ font-weight: 600;
2520
+ margin: 0;
2521
+ }
2522
+
2523
+ .dashboard-empty p {
2524
+ color: var(--color-muted);
2525
+ margin: 0;
2526
+ }
2527
+
2528
+ .dashboard-grid {
2529
+ display: flex;
2530
+ flex-direction: column;
2531
+ gap: 12px;
2532
+ }
2533
+
2534
+ .dashboard-skill-card {
2535
+ display: flex;
2536
+ justify-content: space-between;
2537
+ align-items: flex-start;
2538
+ gap: 16px;
2539
+ padding: 16px 20px;
2540
+ background: var(--card-bg);
2541
+ border: 1px solid var(--card-border);
2542
+ border-radius: 12px;
2543
+ transition: border-color 0.15s ease;
2544
+ }
2545
+
2546
+ .dashboard-skill-card:hover {
2547
+ border-color: var(--color-accent);
2548
+ }
2549
+
2550
+ .dashboard-skill-info {
2551
+ flex: 1;
2552
+ min-width: 0;
2553
+ }
2554
+
2555
+ .dashboard-skill-name {
2556
+ font-weight: 600;
2557
+ font-size: 1.1rem;
2558
+ color: var(--color-text);
2559
+ text-decoration: none;
2560
+ }
2561
+
2562
+ .dashboard-skill-name:hover {
2563
+ color: var(--color-accent);
2564
+ }
2565
+
2566
+ .dashboard-skill-slug {
2567
+ font-family: var(--font-mono);
2568
+ font-size: 0.85rem;
2569
+ color: var(--color-muted);
2570
+ margin-left: 8px;
2571
+ }
2572
+
2573
+ .dashboard-skill-description {
2574
+ font-size: 0.9rem;
2575
+ color: var(--color-muted);
2576
+ margin: 8px 0 0;
2577
+ line-height: 1.4;
2578
+ display: -webkit-box;
2579
+ -webkit-line-clamp: 2;
2580
+ -webkit-box-orient: vertical;
2581
+ overflow: hidden;
2582
+ }
2583
+
2584
+ .dashboard-skill-stats {
2585
+ display: flex;
2586
+ gap: 12px;
2587
+ margin-top: 8px;
2588
+ font-size: 0.8rem;
2589
+ color: var(--color-muted);
2590
+ }
2591
+
2592
+ .dashboard-skill-actions {
2593
+ display: flex;
2594
+ gap: 8px;
2595
+ flex-shrink: 0;
2596
+ }
2597
+
2598
+ .btn-sm {
2599
+ padding: 6px 12px;
2600
+ font-size: 0.85rem;
2601
+ gap: 4px;
2602
+ }
2603
+
2604
+ .btn-ghost {
2605
+ background: transparent;
2606
+ border: 1px solid var(--card-border);
2607
+ color: var(--color-text);
2608
+ }
2609
+
2610
+ .btn-ghost:hover {
2611
+ background: var(--card-bg);
2612
+ border-color: var(--color-accent);
2613
+ }
2614
+
2615
+ @media (max-width: 640px) {
2616
+ .dashboard-skill-card {
2617
+ flex-direction: column;
2618
+ gap: 12px;
2619
+ }
2620
+
2621
+ .dashboard-skill-actions {
2622
+ width: 100%;
2623
+ }
2624
+
2625
+ .dashboard-skill-actions .btn {
2626
+ flex: 1;
2627
+ justify-content: center;
2628
+ }
2629
+ }
2630
+
2631
+ .management-list {
2632
+ display: grid;
2633
+ gap: 16px;
2634
+ margin-top: 12px;
2635
+ }
2636
+
2637
+ .management-item {
2638
+ display: grid;
2639
+ gap: 16px;
2640
+ padding: 16px;
2641
+ border-radius: 16px;
2642
+ border: 1px solid var(--line);
2643
+ background: var(--surface);
2644
+ grid-template-columns: minmax(0, 1fr) auto;
2645
+ align-items: start;
2646
+ }
2647
+
2648
+ .management-item-main {
2649
+ display: grid;
2650
+ gap: 6px;
2651
+ min-width: 0;
2652
+ }
2653
+
2654
+ .management-actions {
2655
+ display: flex;
2656
+ flex-wrap: wrap;
2657
+ gap: 10px;
2658
+ justify-content: flex-end;
2659
+ }
2660
+
2661
+ .management-tags {
2662
+ display: flex;
2663
+ flex-wrap: wrap;
2664
+ gap: 6px;
2665
+ }
2666
+
2667
+ .management-controls {
2668
+ display: flex;
2669
+ flex-wrap: wrap;
2670
+ gap: 10px;
2671
+ align-items: center;
2672
+ }
2673
+
2674
+ .management-control {
2675
+ display: flex;
2676
+ flex-wrap: wrap;
2677
+ gap: 8px;
2678
+ align-items: center;
2679
+ }
2680
+
2681
+ .management-control .mono {
2682
+ font-size: 12px;
2683
+ color: var(--ink-soft);
2684
+ }
2685
+
2686
+ .management-control input {
2687
+ min-width: 180px;
2688
+ }
2689
+
2690
+ .management-sublist {
2691
+ display: grid;
2692
+ gap: 8px;
2693
+ margin-top: 10px;
2694
+ padding-left: 12px;
2695
+ border-left: 1px solid var(--line);
2696
+ }
2697
+
2698
+ .management-subitem {
2699
+ display: flex;
2700
+ flex-wrap: wrap;
2701
+ gap: 10px;
2702
+ align-items: center;
2703
+ justify-content: space-between;
2704
+ }
2705
+
2706
+ @media (max-width: 900px) {
2707
+ .management-item {
2708
+ grid-template-columns: 1fr;
2709
+ }
2710
+
2711
+ .management-actions {
2712
+ justify-content: flex-start;
2713
+ }
2714
+
2715
+ .management-subitem {
2716
+ justify-content: flex-start;
2717
+ }
2718
+ }