@coywolf/emdash 0.0.0-stage → 0.35.13

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 (261) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +201 -2
  3. package/package.json +70 -5
  4. package/src/admin/admin-css.ts +57 -0
  5. package/src/admin/ai.tsx +915 -0
  6. package/src/admin/backups.tsx +613 -0
  7. package/src/admin/breadcrumbs.tsx +542 -0
  8. package/src/admin/codeBlocks.tsx +204 -0
  9. package/src/admin/customBlocks.tsx +321 -0
  10. package/src/admin/dirty.ts +20 -0
  11. package/src/admin/discovery.tsx +463 -0
  12. package/src/admin/download.ts +28 -0
  13. package/src/admin/feature-switches.tsx +124 -0
  14. package/src/admin/features.tsx +142 -0
  15. package/src/admin/files.tsx +791 -0
  16. package/src/admin/formUploads.tsx +445 -0
  17. package/src/admin/guides.tsx +18 -0
  18. package/src/admin/headings.tsx +262 -0
  19. package/src/admin/images.tsx +825 -0
  20. package/src/admin/index.tsx +62 -0
  21. package/src/admin/links.tsx +980 -0
  22. package/src/admin/performance.tsx +330 -0
  23. package/src/admin/preview.tsx +63 -0
  24. package/src/admin/redirects-removed.tsx +266 -0
  25. package/src/admin/redirects.tsx +470 -0
  26. package/src/admin/reviews.tsx +232 -0
  27. package/src/admin/robots-bots.tsx +647 -0
  28. package/src/admin/robots-shared.tsx +109 -0
  29. package/src/admin/robots-wizard.tsx +748 -0
  30. package/src/admin/robots.tsx +911 -0
  31. package/src/admin/save-bar.tsx +134 -0
  32. package/src/admin/schema.tsx +1187 -0
  33. package/src/admin/search.tsx +355 -0
  34. package/src/admin/settings-ui.tsx +87 -0
  35. package/src/admin/trash-prompt-core.ts +135 -0
  36. package/src/admin/trash-prompt.tsx +156 -0
  37. package/src/admin/usage.tsx +301 -0
  38. package/src/admin/videos-display.tsx +248 -0
  39. package/src/admin/videos.tsx +1202 -0
  40. package/src/admin/wpImport.tsx +1516 -0
  41. package/src/ai/entities.ts +59 -0
  42. package/src/ai/export.ts +61 -0
  43. package/src/ai/logic.test.ts +187 -0
  44. package/src/ai/logic.ts +606 -0
  45. package/src/ai/pack.ts +121 -0
  46. package/src/ai/prompts.ts +87 -0
  47. package/src/ai/providers.ts +276 -0
  48. package/src/ai/queue.test.ts +97 -0
  49. package/src/ai/routes.ts +359 -0
  50. package/src/ai/store.ts +301 -0
  51. package/src/ai/wikidata.test.ts +184 -0
  52. package/src/ai/wikidata.ts +87 -0
  53. package/src/ai/worker.ts +530 -0
  54. package/src/astro/astro-modules.d.ts +6 -0
  55. package/src/astro/breadcrumbs/Breadcrumbs.astro +129 -0
  56. package/src/astro/breadcrumbs/BreadcrumbsBlock.astro +12 -0
  57. package/src/astro/codeBlocks/CodeBlock.astro +62 -0
  58. package/src/astro/codeBlocks/EmDashCode.astro +61 -0
  59. package/src/astro/customBlocks/CustomBlock.astro +64 -0
  60. package/src/astro/customBlocks/Details.astro +8 -0
  61. package/src/astro/customBlocks/Disclosure.astro +8 -0
  62. package/src/astro/customBlocks/Note.astro +8 -0
  63. package/src/astro/customBlocks/Podcast.astro +8 -0
  64. package/src/astro/customBlocks/Quote.astro +8 -0
  65. package/src/astro/customBlocks/Testimonial.astro +8 -0
  66. package/src/astro/files/FileCard.astro +103 -0
  67. package/src/astro/headings/HeadingBlock.astro +129 -0
  68. package/src/astro/headings/TableOfContents.astro +45 -0
  69. package/src/astro/headings/request.ts +19 -0
  70. package/src/astro/images/ResponsiveImage.astro +60 -0
  71. package/src/astro/index.ts +84 -0
  72. package/src/astro/reviews/CoywolfReview.astro +27 -0
  73. package/src/astro/reviews/Review.astro +49 -0
  74. package/src/astro/search/SearchBox.astro +61 -0
  75. package/src/astro/search/SearchBoxForm.astro +509 -0
  76. package/src/astro/tables/CaptionedTable.astro +72 -0
  77. package/src/astro/videos/CoywolfVideo.astro +448 -0
  78. package/src/backups/download.ts +112 -0
  79. package/src/backups/dump.test.mjs +287 -0
  80. package/src/backups/dump.ts +288 -0
  81. package/src/backups/module.ts +276 -0
  82. package/src/backups/pack.ts +33 -0
  83. package/src/backups/restore.test.mjs +103 -0
  84. package/src/backups/restore.ts +209 -0
  85. package/src/backups/store.ts +409 -0
  86. package/src/breadcrumbs/pack.ts +113 -0
  87. package/src/breadcrumbs/settings.ts +102 -0
  88. package/src/breadcrumbs/stamp.ts +40 -0
  89. package/src/breadcrumbs/trail.ts +123 -0
  90. package/src/codeBlocks/contrast.ts +179 -0
  91. package/src/codeBlocks/hljs.d.ts +5 -0
  92. package/src/codeBlocks/pack.ts +110 -0
  93. package/src/codeBlocks/render.test.ts +152 -0
  94. package/src/codeBlocks/render.ts +304 -0
  95. package/src/codeBlocks/settings.ts +18 -0
  96. package/src/codeBlocks/themes.generated.ts +304 -0
  97. package/src/codeBlocks/themes.ts +114 -0
  98. package/src/core/compose.ts +244 -0
  99. package/src/core/content-url.ts +888 -0
  100. package/src/core/csv.ts +119 -0
  101. package/src/core/d1-batch.ts +65 -0
  102. package/src/core/entry-docs.ts +175 -0
  103. package/src/core/features-module.ts +48 -0
  104. package/src/core/features.ts +392 -0
  105. package/src/core/generation.ts +88 -0
  106. package/src/core/guide-content.ts +166 -0
  107. package/src/core/module.ts +104 -0
  108. package/src/core/read-failures.ts +57 -0
  109. package/src/core/request-memo.ts +71 -0
  110. package/src/core/secrets.ts +83 -0
  111. package/src/core/settings-enhance.ts +74 -0
  112. package/src/core/site.ts +36 -0
  113. package/src/core/storage.ts +27 -0
  114. package/src/customBlocks/pack.ts +260 -0
  115. package/src/customBlocks/render.ts +424 -0
  116. package/src/customBlocks/rich.ts +313 -0
  117. package/src/customBlocks/settings.ts +46 -0
  118. package/src/discovery/build.ts +252 -0
  119. package/src/discovery/feed-build.ts +217 -0
  120. package/src/discovery/feed.ts +172 -0
  121. package/src/discovery/indexnow.ts +114 -0
  122. package/src/discovery/llms.ts +79 -0
  123. package/src/discovery/markdown.ts +294 -0
  124. package/src/discovery/memory-cache.ts +97 -0
  125. package/src/discovery/middleware.ts +186 -0
  126. package/src/discovery/module.ts +353 -0
  127. package/src/discovery/news.ts +99 -0
  128. package/src/discovery/pack.ts +58 -0
  129. package/src/discovery/settings.ts +91 -0
  130. package/src/discovery/urls.ts +35 -0
  131. package/src/env.d.ts +10 -0
  132. package/src/files/card.ts +231 -0
  133. package/src/files/counts.test.ts +114 -0
  134. package/src/files/counts.ts +60 -0
  135. package/src/files/export.ts +44 -0
  136. package/src/files/format.test.ts +93 -0
  137. package/src/files/format.ts +163 -0
  138. package/src/files/module.ts +596 -0
  139. package/src/files/pack.ts +92 -0
  140. package/src/files/r2-rules.test.ts +30 -0
  141. package/src/files/r2-rules.ts +41 -0
  142. package/src/files/range.ts +50 -0
  143. package/src/files/s3.ts +114 -0
  144. package/src/files/serve.ts +141 -0
  145. package/src/files/sigv4.test.ts +64 -0
  146. package/src/files/sigv4.ts +160 -0
  147. package/src/files/site.ts +137 -0
  148. package/src/files/walker.ts +58 -0
  149. package/src/formUploads/lib.ts +266 -0
  150. package/src/formUploads/pack.ts +55 -0
  151. package/src/formUploads/wrap.ts +592 -0
  152. package/src/forms.ts +16 -0
  153. package/src/headings/headings.test.ts +159 -0
  154. package/src/headings/pack.ts +154 -0
  155. package/src/headings/render.ts +139 -0
  156. package/src/headings/settings.ts +117 -0
  157. package/src/headings/slug.ts +68 -0
  158. package/src/headings/stamp.ts +142 -0
  159. package/src/headings/test-hooks.mjs +14 -0
  160. package/src/headings/toc.ts +48 -0
  161. package/src/images/cloudflare.ts +329 -0
  162. package/src/images/lib.ts +221 -0
  163. package/src/images/module.ts +372 -0
  164. package/src/images/pack.ts +804 -0
  165. package/src/images/pending.ts +37 -0
  166. package/src/images/settings.ts +48 -0
  167. package/src/images/setup.ts +192 -0
  168. package/src/images/variants-estimate.ts +162 -0
  169. package/src/images/variants-store.ts +475 -0
  170. package/src/images/variants.ts +311 -0
  171. package/src/index.ts +143 -0
  172. package/src/links/check.ts +101 -0
  173. package/src/links/classify.ts +270 -0
  174. package/src/links/export.ts +59 -0
  175. package/src/links/module.ts +652 -0
  176. package/src/links/pack.ts +43 -0
  177. package/src/links/pt.ts +325 -0
  178. package/src/links/store.ts +704 -0
  179. package/src/middleware.ts +287 -0
  180. package/src/modules.ts +53 -0
  181. package/src/options.ts +66 -0
  182. package/src/pageCache/lib.test.mjs +224 -0
  183. package/src/pageCache/lib.ts +274 -0
  184. package/src/pageCache/pack.ts +240 -0
  185. package/src/pageCache/usage-core.ts +152 -0
  186. package/src/pageCache/usage.ts +262 -0
  187. package/src/pageCache/warm.test.mjs +670 -0
  188. package/src/pageCache/warm.ts +722 -0
  189. package/src/redirects/middleware.ts +169 -0
  190. package/src/redirects/module.ts +124 -0
  191. package/src/redirects/pack.ts +89 -0
  192. package/src/redirects/removed-core.ts +151 -0
  193. package/src/redirects/removed.ts +293 -0
  194. package/src/redirects/rules.ts +355 -0
  195. package/src/redirects/slug-changes.ts +207 -0
  196. package/src/redirects/slug-core.test.ts +50 -0
  197. package/src/redirects/slug-core.ts +49 -0
  198. package/src/redirects/transfer.ts +92 -0
  199. package/src/reviews/lib.ts +624 -0
  200. package/src/reviews/pack.ts +135 -0
  201. package/src/reviews/schema.ts +128 -0
  202. package/src/reviews/settings.ts +26 -0
  203. package/src/robots/bots.ts +321 -0
  204. package/src/robots/data/bots.json +696 -0
  205. package/src/robots/data/verified.json +582 -0
  206. package/src/robots/directory.ts +26 -0
  207. package/src/robots/explain.ts +191 -0
  208. package/src/robots/guided.ts +300 -0
  209. package/src/robots/importer.ts +263 -0
  210. package/src/robots/middleware.ts +151 -0
  211. package/src/robots/module.ts +446 -0
  212. package/src/robots/pack.ts +69 -0
  213. package/src/robots/radar.ts +129 -0
  214. package/src/robots/rep.test.ts +335 -0
  215. package/src/robots/rep.ts +362 -0
  216. package/src/robots/rules.test.ts +251 -0
  217. package/src/robots/rules.ts +883 -0
  218. package/src/robots/transfer.ts +45 -0
  219. package/src/robots/validate.ts +524 -0
  220. package/src/schema/catalog.ts +146 -0
  221. package/src/schema/graph.test.mjs +522 -0
  222. package/src/schema/graph.ts +791 -0
  223. package/src/schema/module.ts +1138 -0
  224. package/src/schema/og-image.ts +100 -0
  225. package/src/schema/pack.ts +58 -0
  226. package/src/search/engine.ts +578 -0
  227. package/src/search/fallback.ts +80 -0
  228. package/src/search/live-cache.ts +116 -0
  229. package/src/search/live-client.ts +770 -0
  230. package/src/search/live-serve.ts +282 -0
  231. package/src/search/module.ts +261 -0
  232. package/src/search/pack.ts +57 -0
  233. package/src/search/query.ts +132 -0
  234. package/src/search/ratelimit-core.ts +118 -0
  235. package/src/search/ratelimit.ts +79 -0
  236. package/src/search/snippet.ts +135 -0
  237. package/src/search/title-index.ts +139 -0
  238. package/src/search/title-match.ts +192 -0
  239. package/src/shared.ts +71 -0
  240. package/src/version.ts +2 -0
  241. package/src/videos/date.ts +40 -0
  242. package/src/videos/engagement.ts +75 -0
  243. package/src/videos/lib.ts +679 -0
  244. package/src/videos/module.ts +1160 -0
  245. package/src/videos/pack.ts +187 -0
  246. package/src/videos/pause.ts +42 -0
  247. package/src/videos/poster.ts +324 -0
  248. package/src/videos/render.ts +336 -0
  249. package/src/videos/store.ts +551 -0
  250. package/src/videos/stream.ts +134 -0
  251. package/src/wpImport/convert.ts +702 -0
  252. package/src/wpImport/guests.ts +329 -0
  253. package/src/wpImport/gutenberg.ts +157 -0
  254. package/src/wpImport/markers.ts +66 -0
  255. package/src/wpImport/pack.ts +451 -0
  256. package/src/wpImport/parents.ts +202 -0
  257. package/src/wpImport/prepare.ts +592 -0
  258. package/src/wpImport/redirects.ts +358 -0
  259. package/src/wpImport/sources.ts +67 -0
  260. package/src/wpImport/stream.ts +160 -0
  261. package/src/wpImport/urls.ts +354 -0
@@ -0,0 +1,248 @@
1
+ /**
2
+ * Videos → Settings: Views & likes and Appearance (Video Manager's settings),
3
+ * with a live preview of the unsaved draft beside them. The preview prints
4
+ * the block's own CSS and markup (src/videos/render.ts).
5
+ */
6
+ import { Checkbox, Input, Select } from "@cloudflare/kumo";
7
+ import * as React from "react";
8
+
9
+ import { DISPLAY_DEFAULTS, FONT_WEIGHTS, VIDEO_CSS, VIDEO_PREVIEW_CSS, type VideoDisplay, normalizeDisplay, renderVideoPreviewHtml } from "../videos/render.js";
10
+ import { PreviewSection } from "./preview.js";
11
+ import { SettingsSection } from "./settings-ui.js";
12
+
13
+ const NUMBERS = ["radius", "borderWidth", "titleSize", "metaSize"] as const;
14
+ type NumberKey = (typeof NUMBERS)[number];
15
+
16
+ /** The form's copy of the display settings: number fields as typed text. */
17
+ export type DisplayDraft = Omit<VideoDisplay, NumberKey> & Record<NumberKey, string>;
18
+
19
+ export const toDisplayDraft = (d: VideoDisplay): DisplayDraft => ({ ...d, radius: String(d.radius), borderWidth: String(d.borderWidth), titleSize: String(d.titleSize), metaSize: String(d.metaSize) });
20
+
21
+ /** The draft as settings (anything not a valid number falls back to its default; ranges are clamped). */
22
+ export function fromDisplayDraft(draft: DisplayDraft): VideoDisplay {
23
+ const n = (key: NumberKey) => {
24
+ const value = Number.parseFloat(draft[key]);
25
+ return Number.isFinite(value) ? value : DISPLAY_DEFAULTS[key];
26
+ };
27
+ return normalizeDisplay({ ...draft, radius: n("radius"), borderWidth: n("borderWidth"), titleSize: n("titleSize"), metaSize: n("metaSize") });
28
+ }
29
+
30
+ const ALIGN = [
31
+ { value: "left", label: "Left" },
32
+ { value: "center", label: "Center" },
33
+ { value: "right", label: "Right" },
34
+ ];
35
+ const WEIGHTS = [{ value: "default", label: "Default" }, ...FONT_WEIGHTS.map((w) => ({ value: w, label: w }))];
36
+
37
+ /** A hex color: typed, or picked with the browser's color picker. Empty keeps the default. */
38
+ function ColorField(props: { label: string; value: string; placeholder: string; disabled?: boolean; onChange: (value: string) => void }) {
39
+ const swatch = /^#[0-9a-f]{6}$/i.test(props.value) ? props.value : /^#[0-9a-f]{6}$/i.test(props.placeholder) ? props.placeholder : "#000000";
40
+ return (
41
+ <div className="flex items-end gap-2">
42
+ <div className="min-w-0 flex-1">
43
+ <Input
44
+ label={props.label}
45
+ placeholder={props.placeholder}
46
+ value={props.value}
47
+ disabled={props.disabled}
48
+ onChange={(e: React.ChangeEvent<HTMLInputElement>) => props.onChange(e.target.value)}
49
+ />
50
+ </div>
51
+ <input
52
+ type="color"
53
+ className="h-9 w-10 shrink-0 cursor-pointer rounded border border-kumo-line bg-transparent p-0.5"
54
+ aria-label={`Pick ${props.label.toLowerCase()}`}
55
+ value={swatch}
56
+ disabled={props.disabled}
57
+ onChange={(e) => props.onChange(e.target.value)}
58
+ />
59
+ </div>
60
+ );
61
+ }
62
+
63
+ function Group(props: { title: string; description?: string; children: React.ReactNode }) {
64
+ return (
65
+ <fieldset className="space-y-3 border-t border-kumo-line pt-4 first:border-t-0 first:pt-0">
66
+ <legend className="text-sm font-semibold">{props.title}</legend>
67
+ {props.description && <p className="text-sm text-kumo-subtle">{props.description}</p>}
68
+ {props.children}
69
+ </fieldset>
70
+ );
71
+ }
72
+
73
+ export function DisplaySettings(props: {
74
+ draft: DisplayDraft;
75
+ background: string;
76
+ disabled?: boolean;
77
+ onChange: (patch: Partial<DisplayDraft>) => void;
78
+ onBackground: (value: string) => void;
79
+ }) {
80
+ const { draft, disabled, onChange: set } = props;
81
+ const check = (key: "showPlays" | "showLikes" | "showLikeCount" | "showDate" | "showName" | "showDescription" | "followSiteDefaults" | "border", label: string) => (
82
+ <Checkbox label={label} checked={draft[key]} disabled={disabled} onCheckedChange={(checked: boolean) => set({ [key]: checked })} />
83
+ );
84
+ const color = (key: "titleColor" | "likeColor" | "likeBg" | "likeActiveColor" | "likeActiveBg" | "metaColor" | "borderColor", label: string, placeholder: string) => (
85
+ <ColorField label={label} placeholder={placeholder} value={draft[key]} disabled={disabled} onChange={(value) => set({ [key]: value })} />
86
+ );
87
+ const number = (key: NumberKey, label: string, attrs: { min: number; max: number; step: number }, description?: string) => (
88
+ <Input
89
+ type="number"
90
+ label={label}
91
+ description={description}
92
+ {...attrs}
93
+ value={draft[key]}
94
+ disabled={disabled}
95
+ onChange={(e: React.ChangeEvent<HTMLInputElement>) => set({ [key]: e.target.value })}
96
+ />
97
+ );
98
+ const html = renderVideoPreviewHtml(fromDisplayDraft(draft), /^#(?:[0-9a-f]{3}|[0-9a-f]{6})$/i.test(props.background.trim()) ? props.background.trim() : null);
99
+
100
+ return (
101
+ <div className="grid gap-6 cw-lg-cols-fill-24">
102
+ <div className="min-w-0 space-y-6">
103
+ <SettingsSection
104
+ id="videos-engagement"
105
+ title="Views & likes"
106
+ description="What shows beneath each video. Each Coywolf Video block can override these (Show or Hide); blocks left on Site default follow them. Views and likes also need Plays and likes turned on under Plugins → Coywolf Pack."
107
+ >
108
+ <div className="grid gap-2">
109
+ {check("showPlays", "Show the number of views")}
110
+ {check("showLikes", "Show a like button")}
111
+ {check("showLikeCount", "Show the number of likes")}
112
+ {check("showDate", "Show the date the video was uploaded")}
113
+ </div>
114
+ <Select
115
+ label="Date style"
116
+ value={draft.dateStyle}
117
+ disabled={disabled}
118
+ onValueChange={(value: string | null) => set({ dateStyle: value === "relative" ? "relative" : "absolute" })}
119
+ items={[
120
+ { value: "absolute", label: "Date (Oct 6, 2026)" },
121
+ { value: "relative", label: "Time ago (7 months ago)" },
122
+ ]}
123
+ />
124
+ <p className="text-sm text-kumo-subtle">
125
+ The view count and upload date are always included in the video schema and sitemap, even when hidden here.
126
+ </p>
127
+ <div className="rounded-md bg-kumo-tint/50 p-3">
128
+ {check("followSiteDefaults", "Make all video blocks follow the site defaults")}
129
+ <p className="mt-1 cw-ps-6 text-sm text-kumo-subtle">
130
+ Blocks added before these settings existed, and blocks imported from WordPress before this version, saved their own on/off choices for the
131
+ name, description, views, likes and date. Turn this on to ignore those older choices so they follow the settings here. Blocks set to Show or
132
+ Hide still override.
133
+ </p>
134
+ </div>
135
+ </SettingsSection>
136
+
137
+ <SettingsSection
138
+ id="videos-appearance"
139
+ title="Appearance"
140
+ description="Style the video name, like button, and views and date shown beneath each video. Leave a color empty to keep the default; the preview updates as you change things."
141
+ >
142
+ <Group title="Color scheme">
143
+ <Select
144
+ label="Color scheme"
145
+ value={draft.scheme}
146
+ disabled={disabled}
147
+ onValueChange={(value: string | null) => set({ scheme: value === "light" || value === "dark" || value === "off" ? value : "auto" })}
148
+ items={[
149
+ { value: "auto", label: "Auto — follow the visitor's system" },
150
+ { value: "light", label: "Always light" },
151
+ { value: "dark", label: "Always dark" },
152
+ { value: "off", label: "Off — use the theme's text color" },
153
+ ]}
154
+ />
155
+ <p className="text-sm text-kumo-subtle">Light and dark set the gray text and the like color for light or dark pages. Any color you set below overrides the scheme.</p>
156
+ </Group>
157
+ <Group title="Alignment" description="Your theme's CSS can also align these; it wins over this setting.">
158
+ <div className="grid gap-4 sm:grid-cols-2">
159
+ <Select label="Name & description" value={draft.align} disabled={disabled} onValueChange={(value: string | null) => set({ align: value === "center" || value === "right" ? value : "left" })} items={ALIGN} />
160
+ <Select
161
+ label="Like / views / date row"
162
+ value={draft.metaAlign}
163
+ disabled={disabled}
164
+ onValueChange={(value: string | null) => set({ metaAlign: value === "center" || value === "right" ? value : "left" })}
165
+ items={ALIGN}
166
+ />
167
+ </div>
168
+ </Group>
169
+ <Group title="Player">
170
+ <div className="grid gap-4 sm:grid-cols-2">
171
+ {number("radius", "Corner radius (px)", { min: 0, max: 48, step: 1 }, "0 is square corners. GIF-style videos stay square unless you change this.")}
172
+ <ColorField label="Background color" placeholder="transparent" value={props.background} disabled={disabled} onChange={props.onBackground} />
173
+ </div>
174
+ <p className="text-sm text-kumo-subtle">The background shows behind the player, including the letterboxing around videos that don't fill the frame. Empty is transparent.</p>
175
+ {check("border", "Add a border around the player")}
176
+ {draft.border && (
177
+ <div className="grid gap-4 sm:grid-cols-2">
178
+ {number("borderWidth", "Border width (px)", { min: 0, max: 20, step: 1 })}
179
+ {color("borderColor", "Border color", "#eeeeee")}
180
+ </div>
181
+ )}
182
+ </Group>
183
+ <Group title="Name & description" description="The description comes from the block, or the video's Edit dialog.">
184
+ <div className="grid gap-2">
185
+ {check("showName", "Show the video name")}
186
+ {check("showDescription", "Show the video description")}
187
+ </div>
188
+ <div className="grid gap-4 sm:grid-cols-2">
189
+ {color("titleColor", "Text color", "inherit")}
190
+ {number("titleSize", "Font size (em)", { min: 0.5, max: 4, step: 0.05 })}
191
+ <Select
192
+ label="Name font weight"
193
+ value={draft.titleWeight || "default"}
194
+ disabled={disabled}
195
+ onValueChange={(value: string | null) => set({ titleWeight: value && value !== "default" ? value : "" })}
196
+ items={WEIGHTS}
197
+ />
198
+ <Select
199
+ label="Description font weight"
200
+ value={draft.descWeight || "default"}
201
+ disabled={disabled}
202
+ onValueChange={(value: string | null) => set({ descWeight: value && value !== "default" ? value : "" })}
203
+ items={WEIGHTS}
204
+ />
205
+ </div>
206
+ </Group>
207
+ <Group
208
+ title="Like button"
209
+ description="When unclicked, hovering previews the clicked colors; when clicked, hovering previews the unclicked colors. Leave the clicked colors empty for the default red (and the unclicked background)."
210
+ >
211
+ <Select
212
+ label="Icon"
213
+ value={draft.likeIcon}
214
+ disabled={disabled}
215
+ onValueChange={(value: string | null) => set({ likeIcon: value === "thumbs" || value === "star" ? value : "heart" })}
216
+ items={[
217
+ { value: "heart", label: "Heart" },
218
+ { value: "thumbs", label: "Thumbs up" },
219
+ { value: "star", label: "Star" },
220
+ ]}
221
+ />
222
+ <div className="grid gap-4 sm:grid-cols-2">
223
+ {color("likeColor", "Unclicked color", "inherit")}
224
+ {color("likeBg", "Unclicked background color", "none")}
225
+ {color("likeActiveColor", "Clicked color", "#d1242f")}
226
+ {color("likeActiveBg", "Clicked background color", "none")}
227
+ </div>
228
+ </Group>
229
+ <Group title="Views & date text">
230
+ <div className="grid gap-4 sm:grid-cols-2">
231
+ {color("metaColor", "Text color", "#57606a")}
232
+ {number("metaSize", "Font size (em)", { min: 0.5, max: 4, step: 0.05 })}
233
+ </div>
234
+ </Group>
235
+ </SettingsSection>
236
+ </div>
237
+ <div className="min-w-0 cw-lg-sticky">
238
+ <PreviewSection
239
+ id="videos-display-preview"
240
+ title="Video preview"
241
+ css={`${VIDEO_CSS}\n${VIDEO_PREVIEW_CSS}`}
242
+ html={html}
243
+ note="A sample video with these settings. Hover the like button to see its hover colors. Your theme's fonts and CSS also apply on the site."
244
+ />
245
+ </div>
246
+ </div>
247
+ );
248
+ }