voxflow 1.15.6 → 1.17.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 (595) hide show
  1. package/README.md +2 -2
  2. package/dist/index.js +1 -1
  3. package/dist/remotion-bundle/bundle.js +0 -1
  4. package/dist/remotion-bundle/bundle.js.map +1 -1
  5. package/lib/commands/_registry.js +1 -0
  6. package/lib/commands/card-render.js +520 -0
  7. package/lib/commands/card.js +57 -0
  8. package/lib/commands/skills.js +3 -3
  9. package/lib/commands/slice-fork.js +4 -4
  10. package/lib/commands/slice.js +1 -1
  11. package/lib/core/ffmpeg.js +74 -11
  12. package/package.json +5 -2
  13. package/skills/.claude-plugin/marketplace.json +2 -2
  14. package/skills/.claude-plugin/plugin.json +3 -2
  15. package/skills/README.md +9 -7
  16. package/skills/card/SKILL.md +486 -0
  17. package/skills/card/assets/fonts/MANIFEST.md +29 -0
  18. package/skills/card/assets/fonts/css/cabinet-grotesk.css +2 -0
  19. package/skills/card/assets/fonts/css/geist-mono.css +29 -0
  20. package/skills/card/assets/fonts/css/geist.css +29 -0
  21. package/skills/card/assets/fonts/css/general-sans.css +2 -0
  22. package/skills/card/assets/fonts/css/ibm-plex-mono-500.css +49 -0
  23. package/skills/card/assets/fonts/css/ibm-plex-mono-600.css +49 -0
  24. package/skills/card/assets/fonts/css/ibm-plex-mono.css +49 -0
  25. package/skills/card/assets/fonts/css/libre-caslon-display.css +19 -0
  26. package/skills/card/assets/fonts/css/newsreader.css +29 -0
  27. package/skills/card/assets/fonts/css/noto-sans-sc.css +1009 -0
  28. package/skills/card/assets/fonts/css/noto-serif-sc.css +1009 -0
  29. package/skills/card/assets/fonts/css/satoshi.css +2 -0
  30. package/skills/card/assets/fonts/css/source-serif-4.css +59 -0
  31. package/skills/card/assets/fonts/css/space-grotesk.css +29 -0
  32. package/skills/card/assets/fonts/css/spectral-600.css +49 -0
  33. package/skills/card/assets/fonts/css/spectral-800.css +49 -0
  34. package/skills/card/assets/fonts/css/spectral.css +49 -0
  35. package/skills/card/assets/fonts/fonts.css +25 -0
  36. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-100.woff2 +0 -0
  37. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-101.woff2 +0 -0
  38. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-102.woff2 +0 -0
  39. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-103.woff2 +0 -0
  40. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-104.woff2 +0 -0
  41. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-105.woff2 +0 -0
  42. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-106.woff2 +0 -0
  43. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-107.woff2 +0 -0
  44. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-108.woff2 +0 -0
  45. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-109.woff2 +0 -0
  46. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-110.woff2 +0 -0
  47. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-111.woff2 +0 -0
  48. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-112.woff2 +0 -0
  49. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-113.woff2 +0 -0
  50. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-114.woff2 +0 -0
  51. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-115.woff2 +0 -0
  52. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-116.woff2 +0 -0
  53. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-117.woff2 +0 -0
  54. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-118.woff2 +0 -0
  55. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-119.woff2 +0 -0
  56. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-21.woff2 +0 -0
  57. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-22.woff2 +0 -0
  58. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-23.woff2 +0 -0
  59. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-24.woff2 +0 -0
  60. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-25.woff2 +0 -0
  61. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-26.woff2 +0 -0
  62. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-27.woff2 +0 -0
  63. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-28.woff2 +0 -0
  64. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-29.woff2 +0 -0
  65. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-30.woff2 +0 -0
  66. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-31.woff2 +0 -0
  67. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-32.woff2 +0 -0
  68. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-33.woff2 +0 -0
  69. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-34.woff2 +0 -0
  70. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-35.woff2 +0 -0
  71. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-36.woff2 +0 -0
  72. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-37.woff2 +0 -0
  73. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-38.woff2 +0 -0
  74. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-39.woff2 +0 -0
  75. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-4.woff2 +0 -0
  76. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-40.woff2 +0 -0
  77. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-41.woff2 +0 -0
  78. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-42.woff2 +0 -0
  79. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-43.woff2 +0 -0
  80. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-44.woff2 +0 -0
  81. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-45.woff2 +0 -0
  82. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-46.woff2 +0 -0
  83. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-47.woff2 +0 -0
  84. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-48.woff2 +0 -0
  85. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-49.woff2 +0 -0
  86. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-5.woff2 +0 -0
  87. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-50.woff2 +0 -0
  88. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-51.woff2 +0 -0
  89. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-52.woff2 +0 -0
  90. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-53.woff2 +0 -0
  91. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-54.woff2 +0 -0
  92. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-55.woff2 +0 -0
  93. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-56.woff2 +0 -0
  94. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-57.woff2 +0 -0
  95. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-58.woff2 +0 -0
  96. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-59.woff2 +0 -0
  97. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-6.woff2 +0 -0
  98. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-60.woff2 +0 -0
  99. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-61.woff2 +0 -0
  100. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-62.woff2 +0 -0
  101. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-63.woff2 +0 -0
  102. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-64.woff2 +0 -0
  103. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-65.woff2 +0 -0
  104. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-66.woff2 +0 -0
  105. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-67.woff2 +0 -0
  106. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-68.woff2 +0 -0
  107. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-69.woff2 +0 -0
  108. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-70.woff2 +0 -0
  109. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-71.woff2 +0 -0
  110. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-72.woff2 +0 -0
  111. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-73.woff2 +0 -0
  112. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-74.woff2 +0 -0
  113. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-75.woff2 +0 -0
  114. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-76.woff2 +0 -0
  115. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-77.woff2 +0 -0
  116. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-78.woff2 +0 -0
  117. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-79.woff2 +0 -0
  118. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-80.woff2 +0 -0
  119. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-81.woff2 +0 -0
  120. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-82.woff2 +0 -0
  121. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-83.woff2 +0 -0
  122. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-84.woff2 +0 -0
  123. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-85.woff2 +0 -0
  124. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-86.woff2 +0 -0
  125. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-87.woff2 +0 -0
  126. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-88.woff2 +0 -0
  127. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-89.woff2 +0 -0
  128. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-90.woff2 +0 -0
  129. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-91.woff2 +0 -0
  130. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-97.woff2 +0 -0
  131. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-98.woff2 +0 -0
  132. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-bold-subset-99.woff2 +0 -0
  133. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-100.woff2 +0 -0
  134. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-101.woff2 +0 -0
  135. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-102.woff2 +0 -0
  136. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-103.woff2 +0 -0
  137. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-104.woff2 +0 -0
  138. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-105.woff2 +0 -0
  139. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-106.woff2 +0 -0
  140. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-107.woff2 +0 -0
  141. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-108.woff2 +0 -0
  142. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-109.woff2 +0 -0
  143. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-110.woff2 +0 -0
  144. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-111.woff2 +0 -0
  145. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-112.woff2 +0 -0
  146. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-113.woff2 +0 -0
  147. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-114.woff2 +0 -0
  148. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-115.woff2 +0 -0
  149. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-116.woff2 +0 -0
  150. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-117.woff2 +0 -0
  151. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-118.woff2 +0 -0
  152. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-119.woff2 +0 -0
  153. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-21.woff2 +0 -0
  154. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-22.woff2 +0 -0
  155. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-23.woff2 +0 -0
  156. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-24.woff2 +0 -0
  157. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-25.woff2 +0 -0
  158. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-26.woff2 +0 -0
  159. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-27.woff2 +0 -0
  160. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-28.woff2 +0 -0
  161. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-29.woff2 +0 -0
  162. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-30.woff2 +0 -0
  163. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-31.woff2 +0 -0
  164. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-32.woff2 +0 -0
  165. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-33.woff2 +0 -0
  166. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-34.woff2 +0 -0
  167. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-35.woff2 +0 -0
  168. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-36.woff2 +0 -0
  169. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-37.woff2 +0 -0
  170. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-38.woff2 +0 -0
  171. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-39.woff2 +0 -0
  172. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-4.woff2 +0 -0
  173. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-40.woff2 +0 -0
  174. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-41.woff2 +0 -0
  175. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-42.woff2 +0 -0
  176. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-43.woff2 +0 -0
  177. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-44.woff2 +0 -0
  178. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-45.woff2 +0 -0
  179. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-46.woff2 +0 -0
  180. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-47.woff2 +0 -0
  181. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-48.woff2 +0 -0
  182. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-49.woff2 +0 -0
  183. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-5.woff2 +0 -0
  184. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-50.woff2 +0 -0
  185. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-51.woff2 +0 -0
  186. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-52.woff2 +0 -0
  187. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-53.woff2 +0 -0
  188. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-54.woff2 +0 -0
  189. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-55.woff2 +0 -0
  190. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-56.woff2 +0 -0
  191. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-57.woff2 +0 -0
  192. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-58.woff2 +0 -0
  193. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-59.woff2 +0 -0
  194. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-6.woff2 +0 -0
  195. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-60.woff2 +0 -0
  196. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-61.woff2 +0 -0
  197. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-62.woff2 +0 -0
  198. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-63.woff2 +0 -0
  199. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-64.woff2 +0 -0
  200. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-65.woff2 +0 -0
  201. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-66.woff2 +0 -0
  202. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-67.woff2 +0 -0
  203. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-68.woff2 +0 -0
  204. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-69.woff2 +0 -0
  205. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-70.woff2 +0 -0
  206. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-71.woff2 +0 -0
  207. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-72.woff2 +0 -0
  208. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-73.woff2 +0 -0
  209. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-74.woff2 +0 -0
  210. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-75.woff2 +0 -0
  211. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-76.woff2 +0 -0
  212. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-77.woff2 +0 -0
  213. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-78.woff2 +0 -0
  214. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-79.woff2 +0 -0
  215. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-80.woff2 +0 -0
  216. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-81.woff2 +0 -0
  217. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-82.woff2 +0 -0
  218. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-83.woff2 +0 -0
  219. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-84.woff2 +0 -0
  220. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-85.woff2 +0 -0
  221. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-86.woff2 +0 -0
  222. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-87.woff2 +0 -0
  223. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-88.woff2 +0 -0
  224. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-89.woff2 +0 -0
  225. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-90.woff2 +0 -0
  226. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-91.woff2 +0 -0
  227. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-97.woff2 +0 -0
  228. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-98.woff2 +0 -0
  229. package/skills/card/assets/fonts/packages/lxgw-wenkai/files/lxgwwenkailite-regular-subset-99.woff2 +0 -0
  230. package/skills/card/assets/fonts/packages/lxgw-wenkai/lxgwwenkailite-bold.css +873 -0
  231. package/skills/card/assets/fonts/packages/lxgw-wenkai/lxgwwenkailite-regular.css +873 -0
  232. package/skills/card/assets/fonts/packages/lxgw-wenkai/style.css +2 -0
  233. package/skills/card/assets/fonts/packages/smiley-sans/L1_4e00_192.woff2 +0 -0
  234. package/skills/card/assets/fonts/packages/smiley-sans/L1_4fea_192.woff2 +0 -0
  235. package/skills/card/assets/fonts/packages/smiley-sans/L1_5268_192.woff2 +0 -0
  236. package/skills/card/assets/fonts/packages/smiley-sans/L1_543c_192.woff2 +0 -0
  237. package/skills/card/assets/fonts/packages/smiley-sans/L1_5784_192.woff2 +0 -0
  238. package/skills/card/assets/fonts/packages/smiley-sans/L1_5b6c_192.woff2 +0 -0
  239. package/skills/card/assets/fonts/packages/smiley-sans/L1_5e37_192.woff2 +0 -0
  240. package/skills/card/assets/fonts/packages/smiley-sans/L1_60d2_192.woff2 +0 -0
  241. package/skills/card/assets/fonts/packages/smiley-sans/L1_6326_192.woff2 +0 -0
  242. package/skills/card/assets/fonts/packages/smiley-sans/L1_65b1_192.woff2 +0 -0
  243. package/skills/card/assets/fonts/packages/smiley-sans/L1_68a8_192.woff2 +0 -0
  244. package/skills/card/assets/fonts/packages/smiley-sans/L1_6cba_192.woff2 +0 -0
  245. package/skills/card/assets/fonts/packages/smiley-sans/L1_6fa2_192.woff2 +0 -0
  246. package/skills/card/assets/fonts/packages/smiley-sans/L1_73ce_192.woff2 +0 -0
  247. package/skills/card/assets/fonts/packages/smiley-sans/L1_77e4_192.woff2 +0 -0
  248. package/skills/card/assets/fonts/packages/smiley-sans/L1_7b78_192.woff2 +0 -0
  249. package/skills/card/assets/fonts/packages/smiley-sans/L1_7eee_192.woff2 +0 -0
  250. package/skills/card/assets/fonts/packages/smiley-sans/L1_81c1_192.woff2 +0 -0
  251. package/skills/card/assets/fonts/packages/smiley-sans/L1_8608_192.woff2 +0 -0
  252. package/skills/card/assets/fonts/packages/smiley-sans/L1_8aa4_192.woff2 +0 -0
  253. package/skills/card/assets/fonts/packages/smiley-sans/L1_8d20_192.woff2 +0 -0
  254. package/skills/card/assets/fonts/packages/smiley-sans/L1_8feb_192.woff2 +0 -0
  255. package/skills/card/assets/fonts/packages/smiley-sans/L1_94aa_192.woff2 +0 -0
  256. package/skills/card/assets/fonts/packages/smiley-sans/L1_97cd_266.woff2 +0 -0
  257. package/skills/card/assets/fonts/packages/smiley-sans/L2_3918_96.woff2 +0 -0
  258. package/skills/card/assets/fonts/packages/smiley-sans/L2_5081_96.woff2 +0 -0
  259. package/skills/card/assets/fonts/packages/smiley-sans/L2_5467_96.woff2 +0 -0
  260. package/skills/card/assets/fonts/packages/smiley-sans/L2_55ed_96.woff2 +0 -0
  261. package/skills/card/assets/fonts/packages/smiley-sans/L2_57f0_96.woff2 +0 -0
  262. package/skills/card/assets/fonts/packages/smiley-sans/L2_5ae4_96.woff2 +0 -0
  263. package/skills/card/assets/fonts/packages/smiley-sans/L2_5e15_96.woff2 +0 -0
  264. package/skills/card/assets/fonts/packages/smiley-sans/L2_609b_96.woff2 +0 -0
  265. package/skills/card/assets/fonts/packages/smiley-sans/L2_63e1_96.woff2 +0 -0
  266. package/skills/card/assets/fonts/packages/smiley-sans/L2_66dd_96.woff2 +0 -0
  267. package/skills/card/assets/fonts/packages/smiley-sans/L2_696c_96.woff2 +0 -0
  268. package/skills/card/assets/fonts/packages/smiley-sans/L2_6c75_96.woff2 +0 -0
  269. package/skills/card/assets/fonts/packages/smiley-sans/L2_6e73_96.woff2 +0 -0
  270. package/skills/card/assets/fonts/packages/smiley-sans/L2_7114_96.woff2 +0 -0
  271. package/skills/card/assets/fonts/packages/smiley-sans/L2_7392_96.woff2 +0 -0
  272. package/skills/card/assets/fonts/packages/smiley-sans/L2_7580_96.woff2 +0 -0
  273. package/skills/card/assets/fonts/packages/smiley-sans/L2_7769_96.woff2 +0 -0
  274. package/skills/card/assets/fonts/packages/smiley-sans/L2_7a71_96.woff2 +0 -0
  275. package/skills/card/assets/fonts/packages/smiley-sans/L2_7e21_96.woff2 +0 -0
  276. package/skills/card/assets/fonts/packages/smiley-sans/L2_7fcd_96.woff2 +0 -0
  277. package/skills/card/assets/fonts/packages/smiley-sans/L2_8203_96.woff2 +0 -0
  278. package/skills/card/assets/fonts/packages/smiley-sans/L2_8393_96.woff2 +0 -0
  279. package/skills/card/assets/fonts/packages/smiley-sans/L2_85b8_96.woff2 +0 -0
  280. package/skills/card/assets/fonts/packages/smiley-sans/L2_87cb_96.woff2 +0 -0
  281. package/skills/card/assets/fonts/packages/smiley-sans/L2_8bb5_96.woff2 +0 -0
  282. package/skills/card/assets/fonts/packages/smiley-sans/L2_8db6_96.woff2 +0 -0
  283. package/skills/card/assets/fonts/packages/smiley-sans/L2_9022_96.woff2 +0 -0
  284. package/skills/card/assets/fonts/packages/smiley-sans/L2_91ea_96.woff2 +0 -0
  285. package/skills/card/assets/fonts/packages/smiley-sans/L2_9504_96.woff2 +0 -0
  286. package/skills/card/assets/fonts/packages/smiley-sans/L2_9655_96.woff2 +0 -0
  287. package/skills/card/assets/fonts/packages/smiley-sans/L2_996a_96.woff2 +0 -0
  288. package/skills/card/assets/fonts/packages/smiley-sans/L2_9c95_133.woff2 +0 -0
  289. package/skills/card/assets/fonts/packages/smiley-sans/L3_101_64.woff2 +0 -0
  290. package/skills/card/assets/fonts/packages/smiley-sans/L3_148_64.woff2 +0 -0
  291. package/skills/card/assets/fonts/packages/smiley-sans/L3_1d4_64.woff2 +0 -0
  292. package/skills/card/assets/fonts/packages/smiley-sans/L3_1e86_64.woff2 +0 -0
  293. package/skills/card/assets/fonts/packages/smiley-sans/L3_1edf_64.woff2 +0 -0
  294. package/skills/card/assets/fonts/packages/smiley-sans/L3_20_64.woff2 +0 -0
  295. package/skills/card/assets/fonts/packages/smiley-sans/L3_2172_64.woff2 +0 -0
  296. package/skills/card/assets/fonts/packages/smiley-sans/L3_2495_64.woff2 +0 -0
  297. package/skills/card/assets/fonts/packages/smiley-sans/L3_3067_64.woff2 +0 -0
  298. package/skills/card/assets/fonts/packages/smiley-sans/L3_30b3_64.woff2 +0 -0
  299. package/skills/card/assets/fonts/packages/smiley-sans/L3_30f3_64.woff2 +0 -0
  300. package/skills/card/assets/fonts/packages/smiley-sans/L3_3a9_64.woff2 +0 -0
  301. package/skills/card/assets/fonts/packages/smiley-sans/L3_421_64.woff2 +0 -0
  302. package/skills/card/assets/fonts/packages/smiley-sans/L3_536a_64.woff2 +0 -0
  303. package/skills/card/assets/fonts/packages/smiley-sans/L3_60_64.woff2 +0 -0
  304. package/skills/card/assets/fonts/packages/smiley-sans/L3_61b8_64.woff2 +0 -0
  305. package/skills/card/assets/fonts/packages/smiley-sans/L3_706d_64.woff2 +0 -0
  306. package/skills/card/assets/fonts/packages/smiley-sans/L3_7b7c_64.woff2 +0 -0
  307. package/skills/card/assets/fonts/packages/smiley-sans/L3_836e_64.woff2 +0 -0
  308. package/skills/card/assets/fonts/packages/smiley-sans/L3_9124_64.woff2 +0 -0
  309. package/skills/card/assets/fonts/packages/smiley-sans/L3_9795_64.woff2 +0 -0
  310. package/skills/card/assets/fonts/packages/smiley-sans/L3_c1_64.woff2 +0 -0
  311. package/skills/card/assets/fonts/packages/smiley-sans/L3_fe3a_64.woff2 +0 -0
  312. package/skills/card/assets/fonts/packages/smiley-sans/L3_ff16_79.woff2 +0 -0
  313. package/skills/card/assets/fonts/packages/smiley-sans/font.css +80 -0
  314. package/skills/card/assets/fonts/woff2/fontshare/cabinet-grotesk.woff2 +0 -0
  315. package/skills/card/assets/fonts/woff2/fontshare/general-sans.woff2 +0 -0
  316. package/skills/card/assets/fonts/woff2/fontshare/satoshi.woff2 +0 -0
  317. package/skills/card/assets/fonts/woff2/geist/geist-cyrillic-wght-normal.woff2 +0 -0
  318. package/skills/card/assets/fonts/woff2/geist/geist-latin-ext-wght-normal.woff2 +0 -0
  319. package/skills/card/assets/fonts/woff2/geist/geist-latin-wght-normal.woff2 +0 -0
  320. package/skills/card/assets/fonts/woff2/geist-mono/geist-mono-cyrillic-wght-normal.woff2 +0 -0
  321. package/skills/card/assets/fonts/woff2/geist-mono/geist-mono-latin-ext-wght-normal.woff2 +0 -0
  322. package/skills/card/assets/fonts/woff2/geist-mono/geist-mono-latin-wght-normal.woff2 +0 -0
  323. package/skills/card/assets/fonts/woff2/ibm-plex-mono/ibm-plex-mono-cyrillic-400-normal.woff2 +0 -0
  324. package/skills/card/assets/fonts/woff2/ibm-plex-mono/ibm-plex-mono-cyrillic-ext-400-normal.woff2 +0 -0
  325. package/skills/card/assets/fonts/woff2/ibm-plex-mono/ibm-plex-mono-latin-400-normal.woff2 +0 -0
  326. package/skills/card/assets/fonts/woff2/ibm-plex-mono/ibm-plex-mono-latin-ext-400-normal.woff2 +0 -0
  327. package/skills/card/assets/fonts/woff2/ibm-plex-mono/ibm-plex-mono-vietnamese-400-normal.woff2 +0 -0
  328. package/skills/card/assets/fonts/woff2/ibm-plex-mono-500/ibm-plex-mono-cyrillic-500-normal.woff2 +0 -0
  329. package/skills/card/assets/fonts/woff2/ibm-plex-mono-500/ibm-plex-mono-cyrillic-ext-500-normal.woff2 +0 -0
  330. package/skills/card/assets/fonts/woff2/ibm-plex-mono-500/ibm-plex-mono-latin-500-normal.woff2 +0 -0
  331. package/skills/card/assets/fonts/woff2/ibm-plex-mono-500/ibm-plex-mono-latin-ext-500-normal.woff2 +0 -0
  332. package/skills/card/assets/fonts/woff2/ibm-plex-mono-500/ibm-plex-mono-vietnamese-500-normal.woff2 +0 -0
  333. package/skills/card/assets/fonts/woff2/ibm-plex-mono-600/ibm-plex-mono-cyrillic-600-normal.woff2 +0 -0
  334. package/skills/card/assets/fonts/woff2/ibm-plex-mono-600/ibm-plex-mono-cyrillic-ext-600-normal.woff2 +0 -0
  335. package/skills/card/assets/fonts/woff2/ibm-plex-mono-600/ibm-plex-mono-latin-600-normal.woff2 +0 -0
  336. package/skills/card/assets/fonts/woff2/ibm-plex-mono-600/ibm-plex-mono-latin-ext-600-normal.woff2 +0 -0
  337. package/skills/card/assets/fonts/woff2/ibm-plex-mono-600/ibm-plex-mono-vietnamese-600-normal.woff2 +0 -0
  338. package/skills/card/assets/fonts/woff2/libre-caslon-display/libre-caslon-display-latin-400-normal.woff2 +0 -0
  339. package/skills/card/assets/fonts/woff2/libre-caslon-display/libre-caslon-display-latin-ext-400-normal.woff2 +0 -0
  340. package/skills/card/assets/fonts/woff2/newsreader/newsreader-latin-ext-wght-normal.woff2 +0 -0
  341. package/skills/card/assets/fonts/woff2/newsreader/newsreader-latin-wght-normal.woff2 +0 -0
  342. package/skills/card/assets/fonts/woff2/newsreader/newsreader-vietnamese-wght-normal.woff2 +0 -0
  343. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-100-wght-normal.woff2 +0 -0
  344. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-101-wght-normal.woff2 +0 -0
  345. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-102-wght-normal.woff2 +0 -0
  346. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-103-wght-normal.woff2 +0 -0
  347. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-104-wght-normal.woff2 +0 -0
  348. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-105-wght-normal.woff2 +0 -0
  349. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-106-wght-normal.woff2 +0 -0
  350. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-107-wght-normal.woff2 +0 -0
  351. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-108-wght-normal.woff2 +0 -0
  352. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-109-wght-normal.woff2 +0 -0
  353. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-110-wght-normal.woff2 +0 -0
  354. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-111-wght-normal.woff2 +0 -0
  355. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-112-wght-normal.woff2 +0 -0
  356. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-113-wght-normal.woff2 +0 -0
  357. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-114-wght-normal.woff2 +0 -0
  358. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-115-wght-normal.woff2 +0 -0
  359. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-116-wght-normal.woff2 +0 -0
  360. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-117-wght-normal.woff2 +0 -0
  361. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-118-wght-normal.woff2 +0 -0
  362. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-119-wght-normal.woff2 +0 -0
  363. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-21-wght-normal.woff2 +0 -0
  364. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-22-wght-normal.woff2 +0 -0
  365. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-23-wght-normal.woff2 +0 -0
  366. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-24-wght-normal.woff2 +0 -0
  367. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-25-wght-normal.woff2 +0 -0
  368. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-26-wght-normal.woff2 +0 -0
  369. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-27-wght-normal.woff2 +0 -0
  370. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-28-wght-normal.woff2 +0 -0
  371. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-29-wght-normal.woff2 +0 -0
  372. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-30-wght-normal.woff2 +0 -0
  373. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-31-wght-normal.woff2 +0 -0
  374. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-32-wght-normal.woff2 +0 -0
  375. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-33-wght-normal.woff2 +0 -0
  376. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-34-wght-normal.woff2 +0 -0
  377. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-35-wght-normal.woff2 +0 -0
  378. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-36-wght-normal.woff2 +0 -0
  379. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-37-wght-normal.woff2 +0 -0
  380. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-38-wght-normal.woff2 +0 -0
  381. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-39-wght-normal.woff2 +0 -0
  382. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-4-wght-normal.woff2 +0 -0
  383. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-40-wght-normal.woff2 +0 -0
  384. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-41-wght-normal.woff2 +0 -0
  385. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-42-wght-normal.woff2 +0 -0
  386. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-43-wght-normal.woff2 +0 -0
  387. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-44-wght-normal.woff2 +0 -0
  388. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-45-wght-normal.woff2 +0 -0
  389. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-46-wght-normal.woff2 +0 -0
  390. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-47-wght-normal.woff2 +0 -0
  391. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-48-wght-normal.woff2 +0 -0
  392. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-49-wght-normal.woff2 +0 -0
  393. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-5-wght-normal.woff2 +0 -0
  394. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-50-wght-normal.woff2 +0 -0
  395. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-51-wght-normal.woff2 +0 -0
  396. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-52-wght-normal.woff2 +0 -0
  397. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-53-wght-normal.woff2 +0 -0
  398. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-54-wght-normal.woff2 +0 -0
  399. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-55-wght-normal.woff2 +0 -0
  400. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-56-wght-normal.woff2 +0 -0
  401. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-57-wght-normal.woff2 +0 -0
  402. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-58-wght-normal.woff2 +0 -0
  403. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-59-wght-normal.woff2 +0 -0
  404. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-6-wght-normal.woff2 +0 -0
  405. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-60-wght-normal.woff2 +0 -0
  406. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-61-wght-normal.woff2 +0 -0
  407. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-62-wght-normal.woff2 +0 -0
  408. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-63-wght-normal.woff2 +0 -0
  409. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-64-wght-normal.woff2 +0 -0
  410. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-65-wght-normal.woff2 +0 -0
  411. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-66-wght-normal.woff2 +0 -0
  412. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-67-wght-normal.woff2 +0 -0
  413. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-68-wght-normal.woff2 +0 -0
  414. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-69-wght-normal.woff2 +0 -0
  415. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-70-wght-normal.woff2 +0 -0
  416. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-71-wght-normal.woff2 +0 -0
  417. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-72-wght-normal.woff2 +0 -0
  418. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-73-wght-normal.woff2 +0 -0
  419. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-74-wght-normal.woff2 +0 -0
  420. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-75-wght-normal.woff2 +0 -0
  421. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-76-wght-normal.woff2 +0 -0
  422. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-77-wght-normal.woff2 +0 -0
  423. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-78-wght-normal.woff2 +0 -0
  424. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-79-wght-normal.woff2 +0 -0
  425. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-80-wght-normal.woff2 +0 -0
  426. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-81-wght-normal.woff2 +0 -0
  427. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-82-wght-normal.woff2 +0 -0
  428. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-83-wght-normal.woff2 +0 -0
  429. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-84-wght-normal.woff2 +0 -0
  430. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-85-wght-normal.woff2 +0 -0
  431. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-86-wght-normal.woff2 +0 -0
  432. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-87-wght-normal.woff2 +0 -0
  433. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-88-wght-normal.woff2 +0 -0
  434. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-89-wght-normal.woff2 +0 -0
  435. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-90-wght-normal.woff2 +0 -0
  436. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-91-wght-normal.woff2 +0 -0
  437. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-97-wght-normal.woff2 +0 -0
  438. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-98-wght-normal.woff2 +0 -0
  439. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-99-wght-normal.woff2 +0 -0
  440. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-cyrillic-wght-normal.woff2 +0 -0
  441. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-latin-ext-wght-normal.woff2 +0 -0
  442. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-latin-wght-normal.woff2 +0 -0
  443. package/skills/card/assets/fonts/woff2/noto-sans-sc/noto-sans-sc-vietnamese-wght-normal.woff2 +0 -0
  444. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-100-wght-normal.woff2 +0 -0
  445. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-101-wght-normal.woff2 +0 -0
  446. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-102-wght-normal.woff2 +0 -0
  447. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-103-wght-normal.woff2 +0 -0
  448. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-104-wght-normal.woff2 +0 -0
  449. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-105-wght-normal.woff2 +0 -0
  450. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-106-wght-normal.woff2 +0 -0
  451. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-107-wght-normal.woff2 +0 -0
  452. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-108-wght-normal.woff2 +0 -0
  453. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-109-wght-normal.woff2 +0 -0
  454. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-110-wght-normal.woff2 +0 -0
  455. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-111-wght-normal.woff2 +0 -0
  456. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-112-wght-normal.woff2 +0 -0
  457. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-113-wght-normal.woff2 +0 -0
  458. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-114-wght-normal.woff2 +0 -0
  459. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-115-wght-normal.woff2 +0 -0
  460. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-116-wght-normal.woff2 +0 -0
  461. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-117-wght-normal.woff2 +0 -0
  462. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-118-wght-normal.woff2 +0 -0
  463. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-119-wght-normal.woff2 +0 -0
  464. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-21-wght-normal.woff2 +0 -0
  465. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-22-wght-normal.woff2 +0 -0
  466. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-23-wght-normal.woff2 +0 -0
  467. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-24-wght-normal.woff2 +0 -0
  468. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-25-wght-normal.woff2 +0 -0
  469. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-26-wght-normal.woff2 +0 -0
  470. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-27-wght-normal.woff2 +0 -0
  471. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-28-wght-normal.woff2 +0 -0
  472. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-29-wght-normal.woff2 +0 -0
  473. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-30-wght-normal.woff2 +0 -0
  474. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-31-wght-normal.woff2 +0 -0
  475. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-32-wght-normal.woff2 +0 -0
  476. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-33-wght-normal.woff2 +0 -0
  477. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-34-wght-normal.woff2 +0 -0
  478. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-35-wght-normal.woff2 +0 -0
  479. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-36-wght-normal.woff2 +0 -0
  480. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-37-wght-normal.woff2 +0 -0
  481. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-38-wght-normal.woff2 +0 -0
  482. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-39-wght-normal.woff2 +0 -0
  483. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-4-wght-normal.woff2 +0 -0
  484. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-40-wght-normal.woff2 +0 -0
  485. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-41-wght-normal.woff2 +0 -0
  486. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-42-wght-normal.woff2 +0 -0
  487. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-43-wght-normal.woff2 +0 -0
  488. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-44-wght-normal.woff2 +0 -0
  489. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-45-wght-normal.woff2 +0 -0
  490. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-46-wght-normal.woff2 +0 -0
  491. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-47-wght-normal.woff2 +0 -0
  492. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-48-wght-normal.woff2 +0 -0
  493. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-49-wght-normal.woff2 +0 -0
  494. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-5-wght-normal.woff2 +0 -0
  495. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-50-wght-normal.woff2 +0 -0
  496. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-51-wght-normal.woff2 +0 -0
  497. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-52-wght-normal.woff2 +0 -0
  498. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-53-wght-normal.woff2 +0 -0
  499. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-54-wght-normal.woff2 +0 -0
  500. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-55-wght-normal.woff2 +0 -0
  501. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-56-wght-normal.woff2 +0 -0
  502. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-57-wght-normal.woff2 +0 -0
  503. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-58-wght-normal.woff2 +0 -0
  504. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-59-wght-normal.woff2 +0 -0
  505. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-6-wght-normal.woff2 +0 -0
  506. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-60-wght-normal.woff2 +0 -0
  507. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-61-wght-normal.woff2 +0 -0
  508. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-62-wght-normal.woff2 +0 -0
  509. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-63-wght-normal.woff2 +0 -0
  510. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-64-wght-normal.woff2 +0 -0
  511. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-65-wght-normal.woff2 +0 -0
  512. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-66-wght-normal.woff2 +0 -0
  513. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-67-wght-normal.woff2 +0 -0
  514. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-68-wght-normal.woff2 +0 -0
  515. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-69-wght-normal.woff2 +0 -0
  516. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-70-wght-normal.woff2 +0 -0
  517. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-71-wght-normal.woff2 +0 -0
  518. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-72-wght-normal.woff2 +0 -0
  519. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-73-wght-normal.woff2 +0 -0
  520. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-74-wght-normal.woff2 +0 -0
  521. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-75-wght-normal.woff2 +0 -0
  522. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-76-wght-normal.woff2 +0 -0
  523. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-77-wght-normal.woff2 +0 -0
  524. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-78-wght-normal.woff2 +0 -0
  525. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-79-wght-normal.woff2 +0 -0
  526. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-80-wght-normal.woff2 +0 -0
  527. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-81-wght-normal.woff2 +0 -0
  528. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-82-wght-normal.woff2 +0 -0
  529. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-83-wght-normal.woff2 +0 -0
  530. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-84-wght-normal.woff2 +0 -0
  531. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-85-wght-normal.woff2 +0 -0
  532. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-86-wght-normal.woff2 +0 -0
  533. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-87-wght-normal.woff2 +0 -0
  534. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-88-wght-normal.woff2 +0 -0
  535. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-89-wght-normal.woff2 +0 -0
  536. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-90-wght-normal.woff2 +0 -0
  537. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-91-wght-normal.woff2 +0 -0
  538. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-97-wght-normal.woff2 +0 -0
  539. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-98-wght-normal.woff2 +0 -0
  540. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-99-wght-normal.woff2 +0 -0
  541. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-cyrillic-wght-normal.woff2 +0 -0
  542. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-latin-ext-wght-normal.woff2 +0 -0
  543. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-latin-wght-normal.woff2 +0 -0
  544. package/skills/card/assets/fonts/woff2/noto-serif-sc/noto-serif-sc-vietnamese-wght-normal.woff2 +0 -0
  545. package/skills/card/assets/fonts/woff2/source-serif-4/source-serif-4-cyrillic-ext-wght-normal.woff2 +0 -0
  546. package/skills/card/assets/fonts/woff2/source-serif-4/source-serif-4-cyrillic-wght-normal.woff2 +0 -0
  547. package/skills/card/assets/fonts/woff2/source-serif-4/source-serif-4-greek-wght-normal.woff2 +0 -0
  548. package/skills/card/assets/fonts/woff2/source-serif-4/source-serif-4-latin-ext-wght-normal.woff2 +0 -0
  549. package/skills/card/assets/fonts/woff2/source-serif-4/source-serif-4-latin-wght-normal.woff2 +0 -0
  550. package/skills/card/assets/fonts/woff2/source-serif-4/source-serif-4-vietnamese-wght-normal.woff2 +0 -0
  551. package/skills/card/assets/fonts/woff2/space-grotesk/space-grotesk-latin-ext-wght-normal.woff2 +0 -0
  552. package/skills/card/assets/fonts/woff2/space-grotesk/space-grotesk-latin-wght-normal.woff2 +0 -0
  553. package/skills/card/assets/fonts/woff2/space-grotesk/space-grotesk-vietnamese-wght-normal.woff2 +0 -0
  554. package/skills/card/assets/fonts/woff2/spectral/spectral-cyrillic-400-normal.woff2 +0 -0
  555. package/skills/card/assets/fonts/woff2/spectral/spectral-cyrillic-ext-400-normal.woff2 +0 -0
  556. package/skills/card/assets/fonts/woff2/spectral/spectral-latin-400-normal.woff2 +0 -0
  557. package/skills/card/assets/fonts/woff2/spectral/spectral-latin-ext-400-normal.woff2 +0 -0
  558. package/skills/card/assets/fonts/woff2/spectral/spectral-vietnamese-400-normal.woff2 +0 -0
  559. package/skills/card/assets/fonts/woff2/spectral-600/spectral-cyrillic-600-normal.woff2 +0 -0
  560. package/skills/card/assets/fonts/woff2/spectral-600/spectral-cyrillic-ext-600-normal.woff2 +0 -0
  561. package/skills/card/assets/fonts/woff2/spectral-600/spectral-latin-600-normal.woff2 +0 -0
  562. package/skills/card/assets/fonts/woff2/spectral-600/spectral-latin-ext-600-normal.woff2 +0 -0
  563. package/skills/card/assets/fonts/woff2/spectral-600/spectral-vietnamese-600-normal.woff2 +0 -0
  564. package/skills/card/assets/fonts/woff2/spectral-800/spectral-cyrillic-800-normal.woff2 +0 -0
  565. package/skills/card/assets/fonts/woff2/spectral-800/spectral-cyrillic-ext-800-normal.woff2 +0 -0
  566. package/skills/card/assets/fonts/woff2/spectral-800/spectral-latin-800-normal.woff2 +0 -0
  567. package/skills/card/assets/fonts/woff2/spectral-800/spectral-latin-ext-800-normal.woff2 +0 -0
  568. package/skills/card/assets/fonts/woff2/spectral-800/spectral-vietnamese-800-normal.woff2 +0 -0
  569. package/skills/card/references/design-languages/cinematic-still.md +57 -0
  570. package/skills/card/references/design-languages/data-poster.md +57 -0
  571. package/skills/card/references/design-languages/editorial-artifact.md +58 -0
  572. package/skills/card/references/design-languages/field-notes.md +58 -0
  573. package/skills/card/references/design-languages/image-led-magazine.md +57 -0
  574. package/skills/card/references/design-languages/newsroom-poster.md +58 -0
  575. package/skills/card/references/design-languages/product-catalog.md +57 -0
  576. package/skills/card/references/design-languages/swiss-poster.md +60 -0
  577. package/skills/card/references/design-languages.md +168 -0
  578. package/skills/card/references/fonts-preview.html +450 -0
  579. package/skills/card/references/fonts.md +151 -0
  580. package/skills/card/references/layouts/card-layouts.md +268 -0
  581. package/skills/card/references/magazine-card-adaptations.md +154 -0
  582. package/skills/card/references/taste.md +121 -0
  583. package/skills/card/references/themes/presets.md +314 -0
  584. package/skills/card/scripts/download-fonts.sh +240 -0
  585. package/skills/card/scripts/render-cards.mjs +219 -0
  586. package/skills/voxflow-slice/SKILL.md +0 -415
  587. package/skills/voxflow-slice/examples/article.md +0 -13
  588. package/skills/voxflow-slice/examples/expected-deck.json +0 -39
  589. package/skills/voxflow-slice/examples/validate.mjs +0 -46
  590. /package/skills/{voxflow-slice → slice}/templates/data-finding/deck.json +0 -0
  591. /package/skills/{voxflow-slice → slice}/templates/founder-lesson/deck.json +0 -0
  592. /package/skills/{voxflow-slice → slice}/templates/incident-review/deck.json +0 -0
  593. /package/skills/{voxflow-slice → slice}/templates/manifest.json +0 -0
  594. /package/skills/{voxflow-slice → slice}/templates/product-launch/deck.json +0 -0
  595. /package/skills/{voxflow-slice → slice}/templates/quiet-essay/deck.json +0 -0
@@ -0,0 +1,219 @@
1
+ #!/usr/bin/env node
2
+ import { mkdir, readdir, writeFile } from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ import { pathToFileURL } from 'node:url';
5
+
6
+ const RATIOS = {
7
+ '1:1': { width: 1080, height: 1080 },
8
+ '3:4': { width: 1080, height: 1440 },
9
+ '4:5': { width: 1080, height: 1350 },
10
+ '9:16': { width: 1080, height: 1920 },
11
+ '16:9': { width: 1920, height: 1080 },
12
+ };
13
+
14
+ function usage() {
15
+ console.log(`Usage:
16
+ node render-cards.mjs --input <html-dir> --output <png-dir> [--ratio 1:1|3:4|9:16] [--size 1080x1920] [--selector .card] [--scale 2]
17
+
18
+ Options:
19
+ --input Directory containing card-*.html files, or any .html files.
20
+ --output Directory for PNG exports and audit.json.
21
+ --ratio Aspect ratio. Defaults to 1:1. Supports known ratios or custom a:b.
22
+ --size Exact viewport size in WIDTHxHEIGHT. Overrides --ratio.
23
+ --selector Element to screenshot when present. Defaults to .card.
24
+ --scale deviceScaleFactor. Defaults to 2 for retina-quality exports.
25
+ --wait Milliseconds to wait after load. Defaults to 250.
26
+ `);
27
+ }
28
+
29
+ function parseArgs(argv) {
30
+ const args = {
31
+ ratio: '1:1',
32
+ selector: '.card',
33
+ scale: 2,
34
+ wait: 250,
35
+ };
36
+
37
+ for (let i = 0; i < argv.length; i += 1) {
38
+ const token = argv[i];
39
+ if (token === '--help' || token === '-h') {
40
+ args.help = true;
41
+ continue;
42
+ }
43
+ if (!token.startsWith('--')) {
44
+ throw new Error(`Unexpected argument: ${token}`);
45
+ }
46
+ const key = token.slice(2);
47
+ const value = argv[i + 1];
48
+ if (!value || value.startsWith('--')) {
49
+ throw new Error(`Missing value for ${token}`);
50
+ }
51
+ args[key] = value;
52
+ i += 1;
53
+ }
54
+
55
+ return args;
56
+ }
57
+
58
+ function viewportFromArgs(args) {
59
+ if (args.size) {
60
+ const match = String(args.size).match(/^(\d+)x(\d+)$/i);
61
+ if (!match) throw new Error('--size must be WIDTHxHEIGHT, for example 1080x1920');
62
+ return { width: Number(match[1]), height: Number(match[2]) };
63
+ }
64
+
65
+ if (RATIOS[args.ratio]) return RATIOS[args.ratio];
66
+
67
+ const match = String(args.ratio).match(/^(\d+(?:\.\d+)?):(\d+(?:\.\d+)?)$/);
68
+ if (!match) throw new Error(`Unsupported ratio: ${args.ratio}`);
69
+
70
+ const a = Number(match[1]);
71
+ const b = Number(match[2]);
72
+ if (a <= 0 || b <= 0) throw new Error(`Invalid ratio: ${args.ratio}`);
73
+
74
+ const width = 1080;
75
+ return { width, height: Math.round((width * b) / a) };
76
+ }
77
+
78
+ async function htmlFiles(inputDir) {
79
+ const entries = await readdir(inputDir, { withFileTypes: true });
80
+ return entries
81
+ .filter((entry) => entry.isFile() && entry.name.toLowerCase().endsWith('.html'))
82
+ .map((entry) => path.join(inputDir, entry.name))
83
+ .sort((a, b) => a.localeCompare(b, undefined, { numeric: true }));
84
+ }
85
+
86
+ async function auditPage(page) {
87
+ return page.evaluate(() => {
88
+ const viewport = {
89
+ width: window.innerWidth,
90
+ height: window.innerHeight,
91
+ scrollWidth: document.documentElement.scrollWidth,
92
+ scrollHeight: document.documentElement.scrollHeight,
93
+ };
94
+
95
+ const visibleElements = Array.from(document.querySelectorAll('body *')).filter((element) => {
96
+ const style = window.getComputedStyle(element);
97
+ const rect = element.getBoundingClientRect();
98
+ return style.visibility !== 'hidden' && style.display !== 'none' && rect.width > 0 && rect.height > 0;
99
+ });
100
+
101
+ const outOfBounds = [];
102
+ const overflow = [];
103
+
104
+ for (const element of visibleElements) {
105
+ const rect = element.getBoundingClientRect();
106
+ const label = element.id ? `#${element.id}` : element.className ? `.${String(element.className).trim().split(/\s+/).join('.')}` : element.tagName.toLowerCase();
107
+
108
+ if (rect.left < -1 || rect.top < -1 || rect.right > window.innerWidth + 1 || rect.bottom > window.innerHeight + 1) {
109
+ outOfBounds.push({
110
+ element: label,
111
+ rect: {
112
+ left: Math.round(rect.left),
113
+ top: Math.round(rect.top),
114
+ right: Math.round(rect.right),
115
+ bottom: Math.round(rect.bottom),
116
+ },
117
+ });
118
+ }
119
+
120
+ if (element.scrollWidth > element.clientWidth + 1 || element.scrollHeight > element.clientHeight + 1) {
121
+ overflow.push({
122
+ element: label,
123
+ scrollWidth: element.scrollWidth,
124
+ clientWidth: element.clientWidth,
125
+ scrollHeight: element.scrollHeight,
126
+ clientHeight: element.clientHeight,
127
+ });
128
+ }
129
+ }
130
+
131
+ return {
132
+ viewport,
133
+ hasHorizontalScroll: viewport.scrollWidth > viewport.width + 1,
134
+ hasVerticalScroll: viewport.scrollHeight > viewport.height + 1,
135
+ outOfBounds,
136
+ overflow,
137
+ };
138
+ });
139
+ }
140
+
141
+ async function main() {
142
+ const args = parseArgs(process.argv.slice(2));
143
+ if (args.help) {
144
+ usage();
145
+ return;
146
+ }
147
+
148
+ if (!args.input || !args.output) {
149
+ usage();
150
+ throw new Error('--input and --output are required');
151
+ }
152
+
153
+ const viewport = viewportFromArgs(args);
154
+ const inputDir = path.resolve(args.input);
155
+ const outputDir = path.resolve(args.output);
156
+ const files = await htmlFiles(inputDir);
157
+ if (files.length === 0) throw new Error(`No .html files found in ${inputDir}`);
158
+
159
+ let chromium;
160
+ try {
161
+ ({ chromium } = await import('playwright'));
162
+ } catch {
163
+ throw new Error('Playwright is not installed. Run: npm install -D playwright && npx playwright install chromium');
164
+ }
165
+
166
+ await mkdir(outputDir, { recursive: true });
167
+
168
+ const browser = await chromium.launch();
169
+ const audit = [];
170
+
171
+ try {
172
+ for (let index = 0; index < files.length; index += 1) {
173
+ const file = files[index];
174
+ const page = await browser.newPage({
175
+ viewport,
176
+ deviceScaleFactor: Number(args.scale),
177
+ });
178
+
179
+ await page.goto(pathToFileURL(file).href, { waitUntil: 'load' });
180
+ // Wait for locally embedded fonts to finish loading before screenshotting,
181
+ // otherwise the capture can show fallback glyphs / font swap.
182
+ await page.evaluate(() => document.fonts && document.fonts.ready).catch(() => {});
183
+ await page.waitForTimeout(Number(args.wait));
184
+
185
+ const handle = await page.$(args.selector);
186
+ const baseName = path.basename(file, path.extname(file));
187
+ const outputPath = path.join(outputDir, `${baseName}.png`);
188
+
189
+ if (handle) {
190
+ await handle.screenshot({ path: outputPath });
191
+ } else {
192
+ await page.screenshot({ path: outputPath, fullPage: false });
193
+ }
194
+
195
+ const pageAudit = await auditPage(page);
196
+ audit.push({
197
+ file,
198
+ output: outputPath,
199
+ selector: handle ? args.selector : null,
200
+ viewport,
201
+ ...pageAudit,
202
+ });
203
+
204
+ await page.close();
205
+ console.log(`Rendered ${index + 1}/${files.length}: ${outputPath}`);
206
+ }
207
+ } finally {
208
+ await browser.close();
209
+ }
210
+
211
+ const auditPath = path.join(outputDir, 'audit.json');
212
+ await writeFile(auditPath, `${JSON.stringify(audit, null, 2)}\n`);
213
+ console.log(`Audit: ${auditPath}`);
214
+ }
215
+
216
+ main().catch((error) => {
217
+ console.error(error.message);
218
+ process.exitCode = 1;
219
+ });
@@ -1,415 +0,0 @@
1
- ---
2
- name: voxflow-slice
3
- description: "Author + iterate on a VoxFlow Slice card video (1080×1920 vertical, 33 themes) locally in Claude Code / Cursor — the user's own Claude does the work, no VoxFlow API call to slice (0 quota). Full multi-turn workflow: (1) fork a curated template via `voxflow slice fork <id>` OR slice an article into a deck.json by hand; (2) edit deck.json fields in place with Edit/Write tools while `voxflow slice preview deck.json` is running (browser hot-reloads in ~50ms); (3) audition voice per card with ▶ in the browser (proxies /api/tts/synthesize, content-hash cached); (4) regenerate AI images per card with 🎨 (card.images: [{id, prompt, aspect, quality}], proxies hunyuan-image, content-hash cached); (5) render mp4 with `voxflow slice render deck.json` — audio + AI images baked in by default, --no-audio / --no-images opt out, --legacy silent fallback. Schema gains: per-card `voiceover` (voiceId/text/rate/enabled), per-card `images` registry, V2 LayoutTree `el: \"raw-html\"` escape hatch (4096 char cap). Loop rules: edit only the fields the user asked about (preserve diff highlight), never re-run `voxflow slice <article>` during iteration (overwrites edits), don't restart the preview server, don't call /api/audition or /api/imagine yourself (user-driven via ▶/🎨). Pick this skill for ANY iterative Slice work — even when the user has a token; the iteration loop is faster + cheaper than the one-shot cloud route. Triggers: slice / paper-slide / paperslide / card video / 卡片视频 / 切片视频 / 知识卡片 / 文章转视频 / 抖音知识号 / 小红书图文转视频 / 知乎长文转视频 / 公众号转视频 / iterate slice / multi-turn slice / 多轮编辑切片 / 迭代切片 / fork template / slice fork / 模板 / 模板市场 / template gallery / audition card / play voiceover / 试听口播 / 试听卡片 / regenerate image / 生图 / image-gen card / raw-html slice / custom panel / offline slice / local slice / 离线切片 / 本地切片 / 不联网 / no-cloud slice. For the one-shot cloud route (calls /api/slice/deck, 200 quota, no iteration), use the `slice` skill instead."
4
- ---
5
-
6
- # voxflow-slice — Article → deck.json (offline)
7
-
8
- This skill owns the **slicing workflow** for VoxFlow Slice in pure local mode: you read an article the user points at, then write a `deck.json` that picks ONE of the 33 curated Remotion themes and fills in card fields. The user's own Claude does the work — there is no VoxFlow API call, no JWT, no quota deduction.
9
-
10
- Compare with the broader `voxflow:slice` skill (which routes between web app, `voxflow slice` cloud command, and `voxflow slice stage` preview). This skill is the local-only alternative: when the user has no token, wants to iterate freely, or asks for an offline slice — slice here, hand off to `voxflow slice preview deck.json` for visual review.
11
-
12
- ## Hard rules
13
-
14
- 1. **Write exactly one file**: `deck.json` in the directory the user points at (or the current working directory if they don't specify). Never write `.tsx`, `.css`, `.jsx`, or any React/Remotion source — themes are fixed; you only fill in card fields.
15
- 2. **Pick ONE theme from the registry** (see Theme catalog below). Do not invent themes. Typo'd theme ids are hard-rejected by the validator.
16
- 3. **5–8 cards inclusive.** First card must be `kind: "title"`. An optional `kind: "outro"` may appear *only as the last card* (server-side BrandKit usually appends this — leave it off unless the user explicitly asks for a CTA card).
17
- 4. **No images you didn't already have.** Don't `WebFetch` or generate stock-photo URLs. `imageUrl` is only valid when the user explicitly provides a public http(s) URL and the chosen theme supports it (`photo-feature` / `atmospheric`).
18
- 5. **`figureKeyword` must come from the controlled list** in the Card shapes section below. Invented keywords render as a default arrow.
19
- 6. **No `narration` ≥ 60 zh chars and no `caption` ≥ 16 zh chars** — these are hard validator caps; the renderer's text-box clips overflows silently.
20
- 7. **Captions must NOT end with punctuation** (no 。!?…)— they are subtitles, not prose.
21
- 8. **Do not call any VoxFlow API.** This skill is offline. The user pays nothing.
22
-
23
- ## When to use this skill vs `voxflow:slice`
24
-
25
- | Situation | Pick |
26
- |---|---|
27
- | User wants a `deck.json` produced locally, no quota cost | **this skill** |
28
- | User asks "切一下这篇文章" and is logged in via `voxflow login` | `voxflow:slice` → uses `voxflow slice <file>` (200 quota) |
29
- | User wants the mp4 too | `voxflow:slice` → web app |
30
- | User wants to iterate visually on an existing deck | hand off to `voxflow slice preview deck.json` (after this skill writes the file) |
31
-
32
- ## Step 1 — Locate the article
33
-
34
- The user will give you one of:
35
- - a path to a `.md` / `.txt` / `.mdx` file (read it with the Read tool)
36
- - raw text pasted into the chat
37
- - a URL — only fetch it if the user is on a system with network access *and* explicitly asked you to fetch; otherwise ask them to paste the text
38
-
39
- Minimum content: **80 characters** (validator floor). If shorter, ask for more material before slicing.
40
-
41
- ## Step 2 — Pick a theme
42
-
43
- Confirm with the user once. Default is `paper-slide` (good for 抖音 / 视频号 / 小红书 knowledge-card content). If they have a target platform in mind, suggest the matching theme from the catalog below. **Only pick from the 33 registered ids** — anything else is rejected by `backend/services/paper-slide/deck-validator.js:148`.
44
-
45
- ## Step 3 — Plan the structure
46
-
47
- Sketch the deck as a list before writing JSON. Default arc:
48
-
49
- | Slot | Kind | Purpose |
50
- |---|---|---|
51
- | 1 | `title` | Hook line (反差 / 悬念 / 数字), 2 short rows |
52
- | 2 | `body` | The setup — first idea, one sentence |
53
- | 3 | `body` | Pivot or evidence — second idea |
54
- | 4 | `body` | Payoff — third idea |
55
- | 5 | `body` | Closing point — last idea (or a `data` / `quote` / `list` swap-in) |
56
-
57
- Rules of thumb:
58
- - One idea per card. Don't cram two into one `body`.
59
- - Vary adjacent `figureKeyword` — never two consecutive `thinking` / `evidence-board` etc.
60
- - A `quote` card is only justified if the article literally contains a stand-out line (≤30 zh chars).
61
- - A `data` card is only justified if the article cites a memorable number.
62
- - A `list` card is only justified if the article has an explicit 2–4 point structure.
63
- - Each rich kind (quote / data / list) appears **at most once per deck**.
64
-
65
- ## Step 4 — Write `deck.json`
66
-
67
- Use the schemas in the next section. The validator lives at `backend/services/paper-slide/deck-validator.js` and is the source of truth — when in doubt, read it.
68
-
69
- ## Deck schema (V1 — the shape this skill produces)
70
-
71
- ```jsonc
72
- {
73
- "header": "顶部小字,≤22 zh chars", // required, non-empty string
74
- "seriesTitle": "系列名,≤10 zh chars", // required, will be wrapped in 【】 by some themes
75
- "seriesTagline": "底部斜体副标题,≤22 zh chars", // required
76
- "theme": "paper-slide", // optional but recommended — must be in catalog
77
- "coverHookCaption": "封面钩子,≤18 zh chars", // optional; falls back to first body's caption
78
- "coverFigureKeyword": "growth-system", // optional; falls back to first body's figureKeyword
79
- "cards": [ /* 2–9 entries; first must be title; outro only last */ ]
80
- }
81
- ```
82
-
83
- ### Card shapes by `kind`
84
-
85
- All cards require a non-empty `narration` string (TTS reads this; 30–60 zh chars, ends with 。).
86
-
87
- ```jsonc
88
- // kind: "title" — first card only
89
- {
90
- "kind": "title",
91
- "title": ["第一行 ≤14 zh chars", "第二行 ≤14 zh chars"], // non-empty array
92
- "narration": "30–60 zh chars 开场白,自然口语。"
93
- }
94
-
95
- // kind: "body" — default for ideas
96
- {
97
- "kind": "body",
98
- "caption": "一句金句字幕,≤16 zh chars,结尾无标点", // required
99
- "figureKeyword": "problem-framing", // pick from controlled list below
100
- "narration": "30–60 zh chars 配音稿,自然口语。"
101
- }
102
-
103
- // kind: "quote" — quote card (max 1 per deck)
104
- {
105
- "kind": "quote",
106
- "quote": {
107
- "text": "≤60 chars 引文,结尾无标点",
108
- "attribution": "出处或人名(可省略),≤30 chars"
109
- },
110
- "narration": "30–60 zh chars 配音稿。"
111
- }
112
-
113
- // kind: "data" — number card (max 1 per deck)
114
- {
115
- "kind": "data",
116
- "data": {
117
- "value": "≤12 chars,如 80 / 3x / 240万+",
118
- "unit": "≤8 chars(可省略),如 % / 倍 / 年",
119
- "label": "≤30 chars 数字解释"
120
- },
121
- "narration": "30–60 zh chars 配音稿。"
122
- }
123
-
124
- // kind: "list" — 2–4 items (max 1 per deck)
125
- {
126
- "kind": "list",
127
- "list": {
128
- "items": [
129
- { "text": "≤30 chars 短句", "glyph": "✦" }, // glyph is optional emoji/char
130
- { "text": "≤30 chars 短句" },
131
- { "text": "≤30 chars 短句" }
132
- ]
133
- },
134
- "narration": "30–60 zh chars 配音稿。"
135
- }
136
-
137
- // kind: "outro" — only allowed as LAST card; usually server-appended
138
- {
139
- "kind": "outro",
140
- "narration": "8–60 chars 关注语口播。",
141
- "outro": {
142
- "cta": "关注 + 系列名,看下集",
143
- "handle": "@voxflow(可省略)"
144
- }
145
- }
146
- ```
147
-
148
- ### Optional per-card `images` registry (Phase B)
149
-
150
- Any card kind may carry an `images: [{ id, prompt, aspect?, quality? }]`
151
- array of AI-generation recipes. The stage UI's 🎨 button resolves each
152
- entry through `/api/imagine` (proxies hunyuan-image, content-hash cached
153
- at `~/.config/voxflow/stage-image-cache/`); the first entry's resolved
154
- URL is used as the card's `slide.imageUrl` at render time, overriding any
155
- external `card.imageUrl`.
156
-
157
- ```jsonc
158
- {
159
- "kind": "body",
160
- "caption": "...",
161
- "narration": "...",
162
- "figureKeyword": "growth-system",
163
- "images": [
164
- {
165
- "id": "hero", // stable id ([a-zA-Z0-9_-]+, ≤64 chars, unique on card)
166
- "prompt": "晨雾中的山脉,水墨风", // ≤1000 chars
167
- "aspect": "portrait", // portrait | landscape | square (default: portrait)
168
- "quality": "fast" // fast (200 quota) | hd (500 quota)
169
- }
170
- ]
171
- }
172
- ```
173
-
174
- Validator caps: `prompt` ≤ 1000 chars, `id` ≤ 64 chars matching `[a-zA-Z0-9_-]+`,
175
- at most 8 images per card, unique `id` within a card.
176
-
177
- ### Optional per-card `el: "raw-html"` element (Phase C)
178
-
179
- V2 LayoutTree decks may carry a `{ el: "raw-html", html: "..." }` child to
180
- escape into arbitrary markup. The validator accepts strings up to 4096
181
- chars and `normalizeV2Children` maps the first occurrence to a `rawHtml`
182
- field on the V1 normalized output. **PaperSlide composition rendering of
183
- arbitrary HTML lands in a follow-up PR** — for now the composition
184
- silently skips the element, so a deck with raw-html validates + saves +
185
- edits cleanly but renders blank visually until the JSX side is updated.
186
-
187
- ```jsonc
188
- {
189
- "kind": "body",
190
- "narration": "...",
191
- "children": [
192
- { "el": "heading", "text": "Custom panel" },
193
- { "el": "raw-html", "html": "<div style='font-size:48px'>★</div>" }
194
- ]
195
- }
196
- ```
197
-
198
- On a body card, exactly one of `paper-figure` OR `raw-html` is required
199
- (both is rejected). Other kinds (title / quote / data / list) allow
200
- `raw-html` as a supplementary element.
201
-
202
- ### Optional per-card `voiceover` override
203
-
204
- Any card kind may carry a nested `voiceover` object to tune its audio
205
- track. All four sub-fields are optional inside an optional object —
206
- absent ⇒ the renderer uses the job-level default voice with
207
- `card.narration` at 1× speed (back-compat with Phase 0 silent decks).
208
-
209
- ```jsonc
210
- {
211
- "kind": "body",
212
- "caption": "短字幕",
213
- "narration": "默认是 TTS 朗读的文本",
214
- "voiceover": {
215
- "enabled": true, // false → this card is silent in the mp4
216
- "voiceId": "v-female-R2s4N9qJ", // overrides the job-level default voice
217
- "text": "口播稿可以跟字幕不一样", // overrides narration for TTS only (visible caption unaffected)
218
- "rate": 1.1 // [0.5, 2.0], default 1.0
219
- }
220
- }
221
- ```
222
-
223
- Validator caps: `voiceover.text` ≤ 500 chars; `rate ∈ [0.5, 2.0]`.
224
- Render-time resolution precedence:
225
- `voiceover.voiceId → card.voiceId → job-level default`.
226
-
227
- > **Source of truth**: `backend/services/paper-slide/deck-validator.js` — caps live at lines 39–46 (QUOTE_TEXT_MAX, DATA_VALUE_MAX, LIST_ITEM_MAX_LEN, etc.). Read it if anything below seems ambiguous.
228
-
229
- ### Controlled `figureKeyword` list
230
-
231
- Pick from these (mirrors `backend/services/paper-slide/prompt.js:31–61`). Anything else renders as a default arrow.
232
-
233
- **Narrative scenes** (best for paper-slide / daisy-pastel / showa-catalog / photo-feature / atmospheric / hand-lettered):
234
- `problem-framing` · `evidence-board` · `customer-pain` · `timeline-review` · `owner-deadline` · `risk-guardrail` · `cashflow-ledger` · `team-alignment` · `before-after` · `learning-loop` · `decision-fork` · `growth-system`
235
-
236
- **Pose / mood** (paper-slide family only):
237
- `climbing` · `thinking` · `stuck` · `running` · `celebrating`
238
-
239
- **Single-symbol Lucide glyphs** (use these for all other themes — see Theme catalog for which themes are Lucide-only):
240
- `briefcase` · `users` · `target` · `trending-up` · `dollar-sign` · `clock` · `message-circle` · `flame` · `lightbulb` · `chart-bar` · `rocket` · `bell`
241
-
242
- ## Theme catalog (33 themes)
243
-
244
- All ids are valid for `deck.theme`. The "figure mode" column tells you which `figureKeyword` vocabulary to draw from — themes marked **Lucide** ignore narrative scene keywords.
245
-
246
- | Theme id | Vibe (1 line) | Platform fit | Figure mode |
247
- |---|---|---|---|
248
- | `paper-slide` | 泛黄纸纹 + 衬线红字 + 手绘印章 | 抖音 / 视频号 / 小红书 | narrative |
249
- | `editorial-mag` | 米白页面 + 衬线斜体 + 杂志感留白 | 知乎 / 公众号 / LinkedIn | Lucide |
250
- | `bold-poster` | 左侧 accent 条 + 黑体超粗大字 + 红方块数字 | X / Threads / LinkedIn | Lucide |
251
- | `notion-card` | 纯白底 + 暖灰墨 + 蓝色 accent + 页面图标 | 公众号 / 飞书 / 知识星球 | Lucide |
252
- | `brutalist` | 黑白纯色 + 粗边框 + NO.NN 标签 + raw 排版 | X / Mastodon / 播客 | Lucide |
253
- | `glass-dark` | 深色渐变 + 紫色发光 + 玻璃拟态 + 短视频感 | 抖音 / 视频号 / TikTok | Lucide |
254
- | `broadsheet` | FT 三文鱼底 + 重磅衬线 + 首字下沉 + DATELINE | LinkedIn / 知乎 / 雪球 | Lucide |
255
- | `blueprint` | 青底 + 白色网格 + 橙色尺寸标 + 工程图纸感 | 少数派 / 知乎 / GitHub | Lucide |
256
- | `daisy-pastel` | 奶油底 + 手绘雏菊 + 星星 + 粉嫩可爱 | 小红书 / 微博 / 即刻 | narrative |
257
- | `showa-catalog` | 70s city-pop + 彩虹斜条 + 太阳印章 | 小红书 / B 站 / 播客 | narrative |
258
- | `photo-feature` | 全屏摄影 + 渐变压底 + 重磅衬线(needs `imageUrl`) | 小红书 / 知乎 / 微博 | narrative |
259
- | `atmospheric` | 黑底 + 一束暖光 + 衬线粉红 italic + 深夜散文 | 微博 / 即刻 / 播客 | narrative |
260
- | `art-mag` | 颗粒感色块 + 大字衬线 + 几何球 + 艺术画廊感 | 小红书 / 播客 / 即刻 | Lucide |
261
- | `tome-noir` | 纯黑画布 + humanist sans + 60/40 非对称 + 暖光晕 | X / LinkedIn / 即刻 | Lucide |
262
- | `flomo-mute` | #fafafa Muji 纸面 + IBM Plex + 苹方 + 绿色细线 | 小红书 / 即刻 / 微博 | Lucide |
263
- | `substack-drop` | 米色衬线 + 首字下沉 + 章节分隔 + 阅读时间 chip | 公众号 / 知乎 / 少数派 | Lucide |
264
- | `ink-scroll` | 米黄宣纸 + 楷体竖排 + 印章红 + 水墨边缘 | 小红书 / 微博 / B 站国创 | Lucide |
265
- | `podcast-clip` | 封面渐变 + 圆形封面 + 大字幕 + 波形底栏 | 小宇宙 / 即刻 / 抖音 | Lucide |
266
- | `ink-wash` | 宣纸 + 思源宋体 + 横排单字 + 笔触 + 朱印 + 留白 | 知乎长文 / 小红书 / 公众号 | Lucide |
267
- | `morandi-calm` | 低饱和粉褐 / 灰绿 / 灰蓝色块 + 苹方 Light | 小红书 / 公众号 / 即刻 | Lucide |
268
- | `douyin-data` | 纯黑底 + 抖音品红 + 湖蓝 + RGB 色差 + 大数字 | 抖音 / 视频号 / 小红书 | Lucide |
269
- | `highlighter-note` | 奶油格纸 + 印刷体黑字 + Caveat 手写 + 黄色荧光笔 | 小红书 / B 站 / 知乎 | Lucide |
270
- | `memphis-design` | 奶油 + 原色块 + 波浪线 + 锯齿 + 实心圆 + 1986 后现代 | 即刻 / 小红书 / 播客 | Lucide |
271
- | `bauhaus-grid` | 奶油纸 + 红黄蓝原色 + 圆方三角 + 1923 包豪斯几何 | LinkedIn / 设计博客 / 知乎 | Lucide |
272
- | `riso-print` | 荧光粉 + 钴蓝错版 + 网点 + 噪点 + Risograph | 独立开发 / 设计 newsletter | Lucide |
273
- | `chrome-y2k` | 镀铬全息 + 像素栅 + 双径向辉光 + Y2K Bratz/iPod | 小红书 girlie / 抖音 Z / TikTok | Lucide |
274
- | `botanical-press` | 羊皮纸 + Cormorant 斜体 + 拉丁学名 + 18 世纪植物标本 | 茶道 / 园艺 / 慢生活 | Lucide |
275
- | `art-nouveau` | Mucha 曲线 + 烫金 + 装饰边框 + 1900 巴黎沙龙海报 | 艺术评论 / 美术志 / 插画家 | Lucide |
276
- | `tabloid-print` | 红色 BREAKING + Anton 巨字 + 半调 + 双栏 + 小报头条 | 行业八卦 / 争议事件 / 独立专栏 | Lucide |
277
- | `arcade-pixel` | CRT 扫描线 + 8-bit 像素 + RGB 色差 + 80s 街机标题屏 | 独立游戏 / 像素艺术 / 90s 复古 | Lucide |
278
- | `hand-lettered` | 黑板绿底 + 粉笔白字 + Caveat 手写 + 咖啡馆菜单板 | 咖啡馆菜单 / 教师笔记 / 生活感 | narrative |
279
- | `stamp-collector` | 齿孔 + 邮戳 + 面额 + 复古集邮册标本页 | 旅行游记 / 收藏品 / 怀旧专栏 | Lucide |
280
- | `tropical-postcard` | 落日渐变 + 椰影 + 浪潮线 + 60s 旅游海报明信片 | 旅行游记 / 夏日散文 / 小红书 vlog | Lucide |
281
-
282
- ### Per-theme caption voice (quick guide)
283
-
284
- The slicing prompt at `backend/services/paper-slide/prompt.js:94–237` defines per-theme caption tone. Highlights:
285
-
286
- - `paper-slide`: 短、实、有冲击;反差/悬念/痛点钩子
287
- - `bold-poster`: 数字 + 硬观点,≤12 字最佳
288
- - `glass-dark`: 未来 / tech 感,断句多
289
- - `broadsheet`: 财经评论调,开篇即判断 + 数字
290
- - `ink-scroll` / `ink-wash`: 文言短句 / 现代东方意味
291
- - `douyin-data`: "你不知道的…" / "%/倍/前 N" 爆款句式
292
- - `morandi-calm`: 安静、克制、像周报作者写给自己
293
- - `hand-lettered`: 温暖、随手、像便签上一句话
294
-
295
- When picking caption vocabulary, match the theme's register. The user's own LLM (you) is doing the slicing — read the relevant block in `prompt.js` for the chosen theme if precision matters.
296
-
297
- ## Top schema invariants you MUST enforce
298
-
299
- These are the most common failure modes. The validator surfaces a clean error, but it's faster to get them right the first time.
300
-
301
- 1. **First card is `kind: "title"`** — `deck-validator.js:198–200`. Reordering would push a body to slot 0; the renderer assumes title at slot 0 for cover-card composition.
302
- 2. **Card count 2–9 inclusive** — `deck-validator.js:195–197`. Target 5 cards; never exceed 8 (BrandKit may append an outro server-side, room for 1 more).
303
- 3. **`caption` must not end with punctuation** for body cards — implicit in V2 at `deck-validator.js:323` and prompt rule line 425. Trailing 。!?…)leaks into subtitles.
304
- 4. **`figureKeyword`** has no validator check on the keyword string itself (only that it's a string if present) — but **unknown keywords render as a default arrow**. Always pick from the controlled list.
305
- 5. **`outro` card invariant** — at most one, must be last. `deck-validator.js:204–208`. Multiple outros = wiring bug, mid-deck outro = bug.
306
-
307
- ## Quick start with curated templates
308
-
309
- When the user is new to Slice and wants something to copy from, point them
310
- at the curated gallery. Five hand-picked decks ship with the CLI and
311
- match the most common content shapes (product launch, founder lesson,
312
- data finding, incident review, quiet essay).
313
-
314
- ```bash
315
- voxflow slice fork --list # browse the gallery
316
- voxflow slice fork product-launch # copy the deck.json to cwd
317
- voxflow slice preview product-launch-deck.json # iterate
318
- ```
319
-
320
- The same gallery is browsable at `voxflow.studio/apps/slice/templates`.
321
-
322
- ## Hand-off
323
-
324
- After writing `deck.json`, tell the user:
325
-
326
- ```
327
- Wrote deck.json (<N> cards, theme: <theme-id>). Next:
328
-
329
- voxflow slice preview deck.json # browser preview + per-card audition + 🎨 + render
330
- voxflow slice render deck.json --output out.mp4 # one-shot mp4 from the terminal
331
- ```
332
-
333
- Do not run either command yourself unless the user asks.
334
-
335
- Both commands work fully offline for the visual side. **Audio (per-card
336
- TTS audition + render audio track) requires `voxflow login`** — 100 quota
337
- per unique `(voice, text)` clip, then cached at
338
- `~/.config/voxflow/stage-tts-cache/`. With no login, both commands fall
339
- back silently to a Phase-0-style silent video; pass `--no-audio` to
340
- `render` to suppress the audio pass entirely.
341
-
342
- ## Multi-turn editing loop (Claude Code / Cursor / native `Edit`)
343
-
344
- When the user is iterating — "shorten card 2", "swap order", "different
345
- voice for card 3", "hear card 1 again" — they are **NOT** asking for a
346
- regen. Stay in this loop:
347
-
348
- ```bash
349
- # Run once at the start of the session; auto-opens http://127.0.0.1:5180.
350
- # The page hot-reloads on every save of deck.json (~50 ms fs watcher).
351
- voxflow slice preview deck.json &
352
- ```
353
-
354
- Then for every follow-up:
355
-
356
- | User intent | Your move | Cost |
357
- |---|---|---|
358
- | "card N is too long" | `Edit` `cards[N-1].caption` / `.narration` — page hot-reloads | 0 |
359
- | "swap card 2 and 3" | `Edit` the `cards` array order | 0 |
360
- | "different voice for card 3" | `Edit` `cards[2].voiceover.voiceId` — or tell user to paste a voiceId in the toolbar voice picker | 0 (Edit) |
361
- | "make card 4 silent" | `Edit` `cards[3].voiceover = { "enabled": false }` | 0 |
362
- | "口播说点不一样的" | `Edit` `cards[i].voiceover.text` so TTS reads override while caption stays | 0 |
363
- | "I want to hear card 3" | Tell user to click ▶ on card 3 in the browser; the toolbar shows cache hit / quota cost / error | 100 (first time per clip), 0 (cached) |
364
- | "regenerate the image on card 2" | `Edit` `cards[1].images[0].prompt` — user clicks 🎨 in stage to see the new variant | 200 (first time per prompt), 0 (cached) |
365
- | "give me a custom panel on card 4" | `Edit` `cards[3].children` to swap `paper-figure` for `raw-html` (V2 LayoutTree only) | 0 |
366
- | "render mp4" | Tell user: click **Render mp4 (local)** in the browser, OR `voxflow slice render deck.json` | TTS + image pass (cached if seen) + render |
367
-
368
- ### Loop rules
369
-
370
- 1. **Edit only the fields the user asked about.** Other cards must stay
371
- byte-identical — the stage UI's diff highlight is the user's "what
372
- changed" indicator. Touching extra fields breaks that signal.
373
- 2. **Never re-run `voxflow slice <article>` during iteration** — that
374
- costs 200 quota AND overwrites every user edit with a fresh LLM draft.
375
- 3. **Re-validate after every save** by re-reading the file. If the user
376
- says "page shows old content" or "red banner appeared", the JSON has a
377
- syntax error (trailing comma, unbalanced quote) — open, fix, save.
378
- 4. **Don't restart the preview server.** One process handles the whole
379
- session; restarting wipes snapshot history.
380
- 5. **Don't call `/api/audition` yourself.** It's user-driven via the ▶
381
- button. Editing `cards[i].voiceover.voiceId` is enough — the next ▶
382
- click picks up the new voice.
383
-
384
- ## Self-review checklist
385
-
386
- Before declaring the slice done:
387
-
388
- - [ ] `deck.json` parses as JSON (no trailing commas, no comments)
389
- - [ ] `theme` is one of the 33 registered ids
390
- - [ ] 5–8 cards (target 5; max 8 without outro, 9 with)
391
- - [ ] First card is `title`, with `title` as a non-empty array of 1–2 short strings
392
- - [ ] Every card has a non-empty `narration`
393
- - [ ] No `caption` ends with 。!?…
394
- - [ ] Every `figureKeyword` is in the controlled list
395
- - [ ] No `caption` exceeds 16 zh chars; no `narration` exceeds 60 zh chars
396
- - [ ] At most one of each rich kind (quote / data / list)
397
- - [ ] If the theme is `photo-feature` or `atmospheric` and the user provided per-card images, `imageUrl` starts with `https://`
398
- - [ ] No outro card unless the user explicitly asked for one
399
- - [ ] No React, TSX, or CSS files were created
400
- - [ ] If any card has a `voiceover` object, every key inside it (`enabled` / `voiceId` / `text` / `rate`) matches the schema (boolean / non-empty string ≤128 / string ≤500 / number in [0.5, 2.0])
401
-
402
- ## Anti-patterns
403
-
404
- - ❌ Inventing themes ("modern-clean", "tech-blue"). Only the 33 registered ids work.
405
- - ❌ Writing TSX / React / CSS — the renderer is fixed; you only fill in card fields.
406
- - ❌ `narration` longer than 60 zh chars — gets clipped silently by the TTS-text-box constraint.
407
- - ❌ `caption` ending in 。!?— these are subtitles, not prose.
408
- - ❌ Two consecutive `figureKeyword: "thinking"` — visually repetitive.
409
- - ❌ Adding a `kind: "outro"` card on your own — the server's BrandKit usually appends it.
410
- - ❌ Calling `voxflow slice <file>` to do the work — this skill is the **offline** path.
411
- - ❌ Fetching arbitrary image URLs into `imageUrl` — only public http(s) URLs the user explicitly provided.
412
-
413
- ## Examples
414
-
415
- See `examples/article.md` for a representative input and `examples/expected-deck.json` for the matching output that validates cleanly. Run `node examples/validate.mjs` to verify any deck against the real backend validator.
@@ -1,13 +0,0 @@
1
- # 为什么远程办公提升了生产力
2
-
3
- 我做了五年远程办公,从最初被全公司怀疑"在家肯定摸鱼",到现在团队整体效率比坐班时期高出 30%。这五年我换过三家公司,从 8 人创业团队到 200 人 SaaS,结论高度一致:远程办公不是没人监督就摸鱼,而是把"坐在工位"这个伪指标,换成了"交付的具体东西"。
4
-
5
- 第一个变化是会议变少了。坐班时同事一抬眼就能拉你聊五分钟,五个五分钟一天就废了。远程之后大家默认异步沟通,能发文档就不开会,能 Slack 就不视频。我现在每周开会时间从 15 小时降到 4 小时,省下来的 11 小时全部用在写代码、写文档、做深度思考。
6
-
7
- 第二个变化是通勤消失了。我以前在上海每天通勤来回 3 小时,地铁上根本没法做任何有质量的工作。现在这 3 小时变成 1.5 小时锻炼 + 1.5 小时早晨 deep work。整个人精神状态完全不一样,下午也不会累瘫。
8
-
9
- 第三个变化是产出可被衡量。坐班时管理者看的是"在不在工位"——这是个伪指标。远程必须看 PR、看文档、看 demo,结果反而是真正的好员工更容易被看到。我团队里两个内向的工程师,坐班三年一直没存在感,远程半年成了团队顶梁柱,因为他们的 PR 质量本来就最高。
10
-
11
- 最后一个变化是招聘半径变大了。我们最近一年招的 8 个人里,有 4 个不在公司所在城市。这意味着我们能挑全国最合适的人,不再被"必须搬来上海"这个门槛卡住。同样的薪资能买到的人才质量直接提升一档。
12
-
13
- 所以远程办公提升生产力,不是因为人变勤奋了,而是因为把"看起来在工作"换成了"实际交付了什么"。把伪指标换成真指标,效率自然会上来。这个转变对管理者要求其实更高——但回报也大得多。