@giddaa-housing/ui 0.1.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (334) hide show
  1. package/README.md +18 -6
  2. package/css/base.css +37 -0
  3. package/css/components.css +135 -0
  4. package/css/generated/shared.css +1 -0
  5. package/css/giddaa.css +402 -0
  6. package/css/preset.css +77 -0
  7. package/css/styles.css +2 -0
  8. package/css/theme.css +255 -0
  9. package/dist/accordion.js +5 -35
  10. package/dist/accordion.js.map +1 -1
  11. package/dist/activity-timeline.d.ts +33 -0
  12. package/dist/activity-timeline.js +212 -0
  13. package/dist/activity-timeline.js.map +1 -0
  14. package/dist/alert.js +5 -35
  15. package/dist/alert.js.map +1 -1
  16. package/dist/auth-layout.d.ts +23 -0
  17. package/dist/auth-layout.js +304 -0
  18. package/dist/auth-layout.js.map +1 -0
  19. package/dist/avatar.js +10 -142
  20. package/dist/avatar.js.map +1 -1
  21. package/dist/badge.d.ts +3 -2
  22. package/dist/badge.js +6 -114
  23. package/dist/badge.js.map +1 -1
  24. package/dist/bar-chart.d.ts +101 -77
  25. package/dist/bar-chart.js +142 -220
  26. package/dist/bar-chart.js.map +1 -1
  27. package/dist/breadcrumb.js +5 -35
  28. package/dist/breadcrumb.js.map +1 -1
  29. package/dist/bullet-chart.js +15 -48
  30. package/dist/bullet-chart.js.map +1 -1
  31. package/dist/button-group.js +14 -90
  32. package/dist/button-group.js.map +1 -1
  33. package/dist/button.d.ts +5 -5
  34. package/dist/button.js +7 -140
  35. package/dist/button.js.map +1 -1
  36. package/dist/calendar.js +12 -287
  37. package/dist/calendar.js.map +1 -1
  38. package/dist/card.js +5 -35
  39. package/dist/card.js.map +1 -1
  40. package/dist/carousel.js +12 -386
  41. package/dist/carousel.js.map +1 -1
  42. package/dist/chart.js +16 -480
  43. package/dist/chart.js.map +1 -1
  44. package/dist/checkbox.d.ts +1 -1
  45. package/dist/checkbox.js +13 -48
  46. package/dist/checkbox.js.map +1 -1
  47. package/dist/chunk-322YCNVL.js +278 -0
  48. package/dist/chunk-322YCNVL.js.map +1 -0
  49. package/dist/chunk-3ACQVT7A.js +25 -0
  50. package/dist/chunk-3ACQVT7A.js.map +1 -0
  51. package/dist/chunk-3T65TLJX.js +334 -0
  52. package/dist/chunk-3T65TLJX.js.map +1 -0
  53. package/dist/chunk-6ZSGQHH2.js +192 -0
  54. package/dist/chunk-6ZSGQHH2.js.map +1 -0
  55. package/dist/chunk-7TBMLFGW.js +41 -0
  56. package/dist/chunk-7TBMLFGW.js.map +1 -0
  57. package/dist/chunk-B4H6RNDH.js +135 -0
  58. package/dist/chunk-B4H6RNDH.js.map +1 -0
  59. package/dist/chunk-BUXCGZ6X.js +219 -0
  60. package/dist/chunk-BUXCGZ6X.js.map +1 -0
  61. package/dist/chunk-CHII2QHH.js +58 -0
  62. package/dist/chunk-CHII2QHH.js.map +1 -0
  63. package/dist/chunk-DMNOXRRW.js +147 -0
  64. package/dist/chunk-DMNOXRRW.js.map +1 -0
  65. package/dist/chunk-EFSOSSIC.js +130 -0
  66. package/dist/chunk-EFSOSSIC.js.map +1 -0
  67. package/dist/chunk-FZDSVMKY.js +363 -0
  68. package/dist/chunk-FZDSVMKY.js.map +1 -0
  69. package/dist/chunk-GJOFIJS3.js +246 -0
  70. package/dist/chunk-GJOFIJS3.js.map +1 -0
  71. package/dist/chunk-HL3ZSYES.js +23 -0
  72. package/dist/chunk-HL3ZSYES.js.map +1 -0
  73. package/dist/chunk-JVLUBAPB.js +129 -0
  74. package/dist/chunk-JVLUBAPB.js.map +1 -0
  75. package/dist/chunk-KDPYSOYZ.js +64 -0
  76. package/dist/chunk-KDPYSOYZ.js.map +1 -0
  77. package/dist/chunk-KSMDANKI.js +43 -0
  78. package/dist/chunk-KSMDANKI.js.map +1 -0
  79. package/dist/chunk-MEKCCOP5.js +46 -0
  80. package/dist/chunk-MEKCCOP5.js.map +1 -0
  81. package/dist/chunk-NOFXVRWL.js +451 -0
  82. package/dist/chunk-NOFXVRWL.js.map +1 -0
  83. package/dist/chunk-PC5MHNVA.js +171 -0
  84. package/dist/chunk-PC5MHNVA.js.map +1 -0
  85. package/dist/chunk-QKAQZ2GU.js +122 -0
  86. package/dist/chunk-QKAQZ2GU.js.map +1 -0
  87. package/dist/chunk-QZHSHSVV.js +26 -0
  88. package/dist/chunk-QZHSHSVV.js.map +1 -0
  89. package/dist/chunk-RBMK26XD.js +19 -0
  90. package/dist/chunk-RBMK26XD.js.map +1 -0
  91. package/dist/chunk-SFNJGF6M.js +262 -0
  92. package/dist/chunk-SFNJGF6M.js.map +1 -0
  93. package/dist/chunk-UJJNLGTM.js +112 -0
  94. package/dist/chunk-UJJNLGTM.js.map +1 -0
  95. package/dist/chunk-VGR4ZWJ3.js +418 -0
  96. package/dist/chunk-VGR4ZWJ3.js.map +1 -0
  97. package/dist/chunk-XG47P6D4.js +99 -0
  98. package/dist/chunk-XG47P6D4.js.map +1 -0
  99. package/dist/chunk-XZZAHNVM.js +21 -0
  100. package/dist/chunk-XZZAHNVM.js.map +1 -0
  101. package/dist/chunk-Y4TTYVNE.js +36 -0
  102. package/dist/chunk-Y4TTYVNE.js.map +1 -0
  103. package/dist/chunk-YDWIHW6Q.js +69 -0
  104. package/dist/chunk-YDWIHW6Q.js.map +1 -0
  105. package/dist/collapsible.js +6 -35
  106. package/dist/collapsible.js.map +1 -1
  107. package/dist/combobox.js +26 -694
  108. package/dist/combobox.js.map +1 -1
  109. package/dist/cta.d.ts +66 -0
  110. package/dist/cta.js +358 -0
  111. package/dist/cta.js.map +1 -0
  112. package/dist/currency-selector.d.ts +42 -0
  113. package/dist/currency-selector.js +192 -0
  114. package/dist/currency-selector.js.map +1 -0
  115. package/dist/date-picker.d.ts +18 -10
  116. package/dist/date-picker.js +105 -430
  117. package/dist/date-picker.js.map +1 -1
  118. package/dist/details-card.d.ts +19 -0
  119. package/dist/details-card.js +267 -0
  120. package/dist/details-card.js.map +1 -0
  121. package/dist/dialog.js +36 -146
  122. package/dist/dialog.js.map +1 -1
  123. package/dist/dropdown-menu.d.ts +1 -1
  124. package/dist/dropdown-menu.js +20 -358
  125. package/dist/dropdown-menu.js.map +1 -1
  126. package/dist/dropzone.js +13 -40
  127. package/dist/dropzone.js.map +1 -1
  128. package/dist/editorial-card.d.ts +29 -0
  129. package/dist/editorial-card.js +311 -0
  130. package/dist/editorial-card.js.map +1 -0
  131. package/dist/empty-state.js +5 -35
  132. package/dist/empty-state.js.map +1 -1
  133. package/dist/field.js +30 -135
  134. package/dist/field.js.map +1 -1
  135. package/dist/footer.d.ts +47 -0
  136. package/dist/footer.js +430 -0
  137. package/dist/footer.js.map +1 -0
  138. package/dist/funnel-chart.js +42 -415
  139. package/dist/funnel-chart.js.map +1 -1
  140. package/dist/gallery-indicator.d.ts +18 -0
  141. package/dist/gallery-indicator.js +12 -0
  142. package/dist/gallery-indicator.js.map +1 -0
  143. package/dist/heatmap-chart.d.ts +98 -0
  144. package/dist/heatmap-chart.js +248 -0
  145. package/dist/heatmap-chart.js.map +1 -0
  146. package/dist/infotip.d.ts +11 -0
  147. package/dist/infotip.js +66 -0
  148. package/dist/infotip.js.map +1 -0
  149. package/dist/input-group.d.ts +2 -1
  150. package/dist/input-group.js +15 -371
  151. package/dist/input-group.js.map +1 -1
  152. package/dist/input-size-context.js +5 -19
  153. package/dist/input-size-context.js.map +1 -1
  154. package/dist/input.js +6 -78
  155. package/dist/input.js.map +1 -1
  156. package/dist/item.js +5 -35
  157. package/dist/item.js.map +1 -1
  158. package/dist/kpi-card.js +12 -52
  159. package/dist/kpi-card.js.map +1 -1
  160. package/dist/label.js +5 -64
  161. package/dist/label.js.map +1 -1
  162. package/dist/line-chart.js +9 -166
  163. package/dist/line-chart.js.map +1 -1
  164. package/dist/logo.js +4 -141
  165. package/dist/logo.js.map +1 -1
  166. package/dist/map-indicator.d.ts +13 -0
  167. package/dist/map-indicator.js +109 -0
  168. package/dist/map-indicator.js.map +1 -0
  169. package/dist/match.d.ts +16 -0
  170. package/dist/match.js +113 -0
  171. package/dist/match.js.map +1 -0
  172. package/dist/media-gallery-hero.d.ts +60 -0
  173. package/dist/media-gallery-hero.js +362 -0
  174. package/dist/media-gallery-hero.js.map +1 -0
  175. package/dist/media-player.d.ts +60 -0
  176. package/dist/media-player.js +1394 -0
  177. package/dist/media-player.js.map +1 -0
  178. package/dist/number-input.js +30 -325
  179. package/dist/number-input.js.map +1 -1
  180. package/dist/page-header.js +4 -32
  181. package/dist/page-header.js.map +1 -1
  182. package/dist/pagination.d.ts +1 -0
  183. package/dist/pagination.js +27 -161
  184. package/dist/pagination.js.map +1 -1
  185. package/dist/password-input.d.ts +1 -0
  186. package/dist/password-input.js +21 -319
  187. package/dist/password-input.js.map +1 -1
  188. package/dist/phone-input.d.ts +2 -1
  189. package/dist/phone-input.js +148 -359
  190. package/dist/phone-input.js.map +1 -1
  191. package/dist/photo-gallery.d.ts +1 -1
  192. package/dist/photo-gallery.js +97 -393
  193. package/dist/photo-gallery.js.map +1 -1
  194. package/dist/pie-chart.js +17 -52
  195. package/dist/pie-chart.js.map +1 -1
  196. package/dist/popover.js +13 -158
  197. package/dist/popover.js.map +1 -1
  198. package/dist/price-tag.d.ts +35 -0
  199. package/dist/price-tag.js +178 -0
  200. package/dist/price-tag.js.map +1 -0
  201. package/dist/progress.d.ts +5 -2
  202. package/dist/progress.js +14 -303
  203. package/dist/progress.js.map +1 -1
  204. package/dist/property-listing-card.d.ts +32 -0
  205. package/dist/property-listing-card.js +235 -0
  206. package/dist/property-listing-card.js.map +1 -0
  207. package/dist/radar-chart.d.ts +110 -0
  208. package/dist/radar-chart.js +147 -0
  209. package/dist/radar-chart.js.map +1 -0
  210. package/dist/radio-group.js +15 -50
  211. package/dist/radio-group.js.map +1 -1
  212. package/dist/review-block.d.ts +20 -0
  213. package/dist/review-block.js +10 -0
  214. package/dist/review-block.js.map +1 -0
  215. package/dist/rich-text-editor.js +172 -433
  216. package/dist/rich-text-editor.js.map +1 -1
  217. package/dist/scatter-chart.d.ts +142 -0
  218. package/dist/scatter-chart.js +252 -0
  219. package/dist/scatter-chart.js.map +1 -0
  220. package/dist/search-input.d.ts +1 -0
  221. package/dist/search-input.js +22 -320
  222. package/dist/search-input.js.map +1 -1
  223. package/dist/select.js +15 -292
  224. package/dist/select.js.map +1 -1
  225. package/dist/separator.js +5 -68
  226. package/dist/separator.js.map +1 -1
  227. package/dist/sheet.js +14 -271
  228. package/dist/sheet.js.map +1 -1
  229. package/dist/sidebar.d.ts +1 -1
  230. package/dist/sidebar.js +89 -494
  231. package/dist/sidebar.js.map +1 -1
  232. package/dist/size-context.js +5 -17
  233. package/dist/size-context.js.map +1 -1
  234. package/dist/skeleton.js +4 -44
  235. package/dist/skeleton.js.map +1 -1
  236. package/dist/slider.d.ts +28 -0
  237. package/dist/slider.js +152 -0
  238. package/dist/slider.js.map +1 -0
  239. package/dist/sparkline.js +33 -341
  240. package/dist/sparkline.js.map +1 -1
  241. package/dist/stepper.js +5 -35
  242. package/dist/stepper.js.map +1 -1
  243. package/dist/styles.css +9593 -2
  244. package/dist/switch.js +13 -48
  245. package/dist/switch.js.map +1 -1
  246. package/dist/tab-list.js +35 -306
  247. package/dist/tab-list.js.map +1 -1
  248. package/dist/table.js +5 -32
  249. package/dist/table.js.map +1 -1
  250. package/dist/tabs.js +10 -150
  251. package/dist/tabs.js.map +1 -1
  252. package/dist/tag.d.ts +7 -6
  253. package/dist/tag.js +101 -97
  254. package/dist/tag.js.map +1 -1
  255. package/dist/testimonial-block.d.ts +34 -0
  256. package/dist/testimonial-block.js +377 -0
  257. package/dist/testimonial-block.js.map +1 -0
  258. package/dist/textarea.js +6 -73
  259. package/dist/textarea.js.map +1 -1
  260. package/dist/time-picker.js +119 -279
  261. package/dist/time-picker.js.map +1 -1
  262. package/dist/toast.js +27 -132
  263. package/dist/toast.js.map +1 -1
  264. package/dist/tooltip.d.ts +5 -5
  265. package/dist/tooltip.js +7 -90
  266. package/dist/tooltip.js.map +1 -1
  267. package/dist/tree-map.js +41 -414
  268. package/dist/tree-map.js.map +1 -1
  269. package/dist/waterfall-chart.d.ts +129 -0
  270. package/dist/waterfall-chart.js +577 -0
  271. package/dist/waterfall-chart.js.map +1 -0
  272. package/package.json +98 -28
  273. package/dist/base.css +0 -32
  274. package/dist/files/red-hat-display-latin-300-italic.woff +0 -0
  275. package/dist/files/red-hat-display-latin-300-italic.woff2 +0 -0
  276. package/dist/files/red-hat-display-latin-300-normal.woff +0 -0
  277. package/dist/files/red-hat-display-latin-300-normal.woff2 +0 -0
  278. package/dist/files/red-hat-display-latin-400-italic.woff +0 -0
  279. package/dist/files/red-hat-display-latin-400-italic.woff2 +0 -0
  280. package/dist/files/red-hat-display-latin-400-normal.woff +0 -0
  281. package/dist/files/red-hat-display-latin-400-normal.woff2 +0 -0
  282. package/dist/files/red-hat-display-latin-500-italic.woff +0 -0
  283. package/dist/files/red-hat-display-latin-500-italic.woff2 +0 -0
  284. package/dist/files/red-hat-display-latin-500-normal.woff +0 -0
  285. package/dist/files/red-hat-display-latin-500-normal.woff2 +0 -0
  286. package/dist/files/red-hat-display-latin-600-italic.woff +0 -0
  287. package/dist/files/red-hat-display-latin-600-italic.woff2 +0 -0
  288. package/dist/files/red-hat-display-latin-600-normal.woff +0 -0
  289. package/dist/files/red-hat-display-latin-600-normal.woff2 +0 -0
  290. package/dist/files/red-hat-display-latin-700-italic.woff +0 -0
  291. package/dist/files/red-hat-display-latin-700-italic.woff2 +0 -0
  292. package/dist/files/red-hat-display-latin-700-normal.woff +0 -0
  293. package/dist/files/red-hat-display-latin-700-normal.woff2 +0 -0
  294. package/dist/files/red-hat-display-latin-800-italic.woff +0 -0
  295. package/dist/files/red-hat-display-latin-800-italic.woff2 +0 -0
  296. package/dist/files/red-hat-display-latin-800-normal.woff +0 -0
  297. package/dist/files/red-hat-display-latin-800-normal.woff2 +0 -0
  298. package/dist/files/red-hat-display-latin-900-italic.woff +0 -0
  299. package/dist/files/red-hat-display-latin-900-italic.woff2 +0 -0
  300. package/dist/files/red-hat-display-latin-900-normal.woff +0 -0
  301. package/dist/files/red-hat-display-latin-900-normal.woff2 +0 -0
  302. package/dist/files/red-hat-display-latin-ext-300-italic.woff +0 -0
  303. package/dist/files/red-hat-display-latin-ext-300-italic.woff2 +0 -0
  304. package/dist/files/red-hat-display-latin-ext-300-normal.woff +0 -0
  305. package/dist/files/red-hat-display-latin-ext-300-normal.woff2 +0 -0
  306. package/dist/files/red-hat-display-latin-ext-400-italic.woff +0 -0
  307. package/dist/files/red-hat-display-latin-ext-400-italic.woff2 +0 -0
  308. package/dist/files/red-hat-display-latin-ext-400-normal.woff +0 -0
  309. package/dist/files/red-hat-display-latin-ext-400-normal.woff2 +0 -0
  310. package/dist/files/red-hat-display-latin-ext-500-italic.woff +0 -0
  311. package/dist/files/red-hat-display-latin-ext-500-italic.woff2 +0 -0
  312. package/dist/files/red-hat-display-latin-ext-500-normal.woff +0 -0
  313. package/dist/files/red-hat-display-latin-ext-500-normal.woff2 +0 -0
  314. package/dist/files/red-hat-display-latin-ext-600-italic.woff +0 -0
  315. package/dist/files/red-hat-display-latin-ext-600-italic.woff2 +0 -0
  316. package/dist/files/red-hat-display-latin-ext-600-normal.woff +0 -0
  317. package/dist/files/red-hat-display-latin-ext-600-normal.woff2 +0 -0
  318. package/dist/files/red-hat-display-latin-ext-700-italic.woff +0 -0
  319. package/dist/files/red-hat-display-latin-ext-700-italic.woff2 +0 -0
  320. package/dist/files/red-hat-display-latin-ext-700-normal.woff +0 -0
  321. package/dist/files/red-hat-display-latin-ext-700-normal.woff2 +0 -0
  322. package/dist/files/red-hat-display-latin-ext-800-italic.woff +0 -0
  323. package/dist/files/red-hat-display-latin-ext-800-italic.woff2 +0 -0
  324. package/dist/files/red-hat-display-latin-ext-800-normal.woff +0 -0
  325. package/dist/files/red-hat-display-latin-ext-800-normal.woff2 +0 -0
  326. package/dist/files/red-hat-display-latin-ext-900-italic.woff +0 -0
  327. package/dist/files/red-hat-display-latin-ext-900-italic.woff2 +0 -0
  328. package/dist/files/red-hat-display-latin-ext-900-normal.woff +0 -0
  329. package/dist/files/red-hat-display-latin-ext-900-normal.woff2 +0 -0
  330. package/dist/index.d.ts +0 -87
  331. package/dist/index.js +0 -10448
  332. package/dist/index.js.map +0 -1
  333. package/dist/red-hat-display.css +0 -2
  334. package/dist/theme/giddaa.css +0 -2
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/ui/rich-text-editor.tsx","../src/lib/cn.ts","../src/components/ui/button.tsx","../src/components/ui/size-context.tsx","../src/components/ui/dropdown-menu.tsx","../src/components/ui/input.tsx","../src/components/ui/input-size-context.tsx","../src/components/ui/popover.tsx"],"sourcesContent":["\"use client\";\n\nimport { Color } from \"@tiptap/extension-color\";\nimport { Image } from \"@tiptap/extension-image\";\nimport { Placeholder } from \"@tiptap/extension-placeholder\";\nimport { TextAlign } from \"@tiptap/extension-text-align\";\nimport { TextStyle } from \"@tiptap/extension-text-style\";\nimport { EditorContent, useEditor, useEditorState } from \"@tiptap/react\";\nimport { StarterKit } from \"@tiptap/starter-kit\";\nimport {\n\tAlignCenter,\n\tAlignJustify,\n\tAlignLeft,\n\tAlignRight,\n\tBaseline,\n\tBold,\n\tChevronDown,\n\tCode2,\n\tImageIcon,\n\tItalic,\n\tLink2,\n\tList,\n\tListOrdered,\n\tQuote,\n\tRedo2,\n\tUnderline,\n\tUndo2,\n} from \"lucide-react\";\nimport * as React from \"react\";\n\nimport { cn } from \"../../lib/cn\";\nimport { Button } from \"./button\";\nimport {\n\tDropdownMenu,\n\tDropdownMenuContent,\n\tDropdownMenuRadioGroup,\n\tDropdownMenuRadioItem,\n\tDropdownMenuTrigger,\n} from \"./dropdown-menu\";\nimport { Input } from \"./input\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"./popover\";\nimport { type ComponentSize, useComponentSize } from \"./size-context\";\n\n// ─── Size configuration ───────────────────────────────────────────────────────\n// Toolbar density, text scale and padding step together across the three sizes.\n\ninterface SizeTokens {\n\twidth: string;\n\tcontent: string;\n\tcontentPad: string;\n\ttext: string;\n\ticon: string;\n\tbutton: string;\n\ttoolbarPad: string;\n\ttoolbarGap: string;\n\tdivider: string;\n}\n\nconst SIZES: Record<ComponentSize, SizeTokens> = {\n\tsm: {\n\t\twidth: \"max-w-[420px]\",\n\t\tcontent: \"min-h-[140px]\",\n\t\tcontentPad: \"px-4 py-3\",\n\t\ttext: \"text-gdt-xs\",\n\t\ticon: \"[&_svg:not([class*='size-'])]:size-3.5\",\n\t\tbutton: \"h-7 min-w-7 px-1\",\n\t\ttoolbarPad: \"px-2 py-1.5\",\n\t\ttoolbarGap: \"gap-0.5\",\n\t\tdivider: \"h-4\",\n\t},\n\tmd: {\n\t\twidth: \"max-w-[520px]\",\n\t\tcontent: \"min-h-[172px]\",\n\t\tcontentPad: \"px-5 py-4\",\n\t\ttext: \"text-gdt-sm\",\n\t\ticon: \"[&_svg:not([class*='size-'])]:size-4\",\n\t\tbutton: \"h-8 min-w-8 px-1.5\",\n\t\ttoolbarPad: \"px-2.5 py-2\",\n\t\ttoolbarGap: \"gap-0.5\",\n\t\tdivider: \"h-5\",\n\t},\n\tlg: {\n\t\twidth: \"max-w-[600px]\",\n\t\tcontent: \"min-h-[206px]\",\n\t\tcontentPad: \"px-6 py-5\",\n\t\ttext: \"text-gdt-md\",\n\t\ticon: \"[&_svg:not([class*='size-'])]:size-[18px]\",\n\t\tbutton: \"h-9 min-w-9 px-2\",\n\t\ttoolbarPad: \"px-3 py-2.5\",\n\t\ttoolbarGap: \"gap-1\",\n\t\tdivider: \"h-6\",\n\t},\n};\n\n// Text-colour swatches. The first entry clears any applied colour.\nconst TEXT_COLORS = [\n\t{ label: \"Default\", value: \"\" },\n\t{ label: \"Forest\", value: \"#2f5a2c\" },\n\t{ label: \"Brass\", value: \"#b8861a\" },\n\t{ label: \"Clay\", value: \"#b2542b\" },\n\t{ label: \"Moss\", value: \"#4e4d29\" },\n\t{ label: \"Stone\", value: \"#5c5648\" },\n\t{ label: \"Ink\", value: \"#1f1c18\" },\n] as const;\n\nconst BLOCK_OPTIONS = [\n\t{ value: \"paragraph\", label: \"Normal\" },\n\t{ value: \"h1\", label: \"Heading 1\" },\n\t{ value: \"h2\", label: \"Heading 2\" },\n\t{ value: \"h3\", label: \"Heading 3\" },\n] as const;\n\ntype BlockValue = (typeof BLOCK_OPTIONS)[number][\"value\"];\ntype AlignValue = \"left\" | \"center\" | \"right\" | \"justify\";\n\n// ─── Shared toolbar primitives ──────────────────────────────────────────────────\n\nfunction toolbarControlClass(tokens: SizeTokens, active?: boolean) {\n\treturn cn(\n\t\t\"inline-flex shrink-0 cursor-pointer items-center justify-center rounded-md font-medium text-fg-secondary outline-none transition-colors select-none\",\n\t\t\"hover:bg-action-tertiary-hover hover:text-fg-primary\",\n\t\t\"focus-visible:ring-2 focus-visible:ring-line-focus\",\n\t\t\"disabled:pointer-events-none disabled:opacity-40 data-disabled:pointer-events-none data-disabled:opacity-40\",\n\t\ttokens.button,\n\t\ttokens.icon,\n\t\ttokens.text,\n\t\tactive &&\n\t\t\t\"bg-action-primary text-fg-on-brand hover:bg-action-primary-hover hover:text-fg-on-brand\",\n\t);\n}\n\ninterface ToolbarButtonProps {\n\ttokens: SizeTokens;\n\tlabel: string;\n\tactive?: boolean;\n\tdisabled?: boolean;\n\tonClick: () => void;\n\tchildren: React.ReactNode;\n}\n\nfunction ToolbarButton({\n\ttokens,\n\tlabel,\n\tactive,\n\tdisabled,\n\tonClick,\n\tchildren,\n}: ToolbarButtonProps) {\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\taria-label={label}\n\t\t\ttitle={label}\n\t\t\taria-pressed={active}\n\t\t\tdisabled={disabled}\n\t\t\t// Keep the editor selection intact when interacting with the toolbar.\n\t\t\tonMouseDown={(event) => event.preventDefault()}\n\t\t\tonClick={onClick}\n\t\t\tclassName={toolbarControlClass(tokens, active)}\n\t\t>\n\t\t\t{children}\n\t\t</button>\n\t);\n}\n\nfunction ToolbarDivider({ tokens }: { tokens: SizeTokens }) {\n\treturn (\n\t\t<span\n\t\t\taria-hidden=\"true\"\n\t\t\tclassName={cn(\"mx-1 w-px shrink-0 self-center bg-line\", tokens.divider)}\n\t\t/>\n\t);\n}\n\n// ─── Block / heading select ──────────────────────────────────────────────────────\n\nfunction BlockControl({\n\ttokens,\n\tvalue,\n\tdisabled,\n\tonChange,\n}: {\n\ttokens: SizeTokens;\n\tvalue: BlockValue;\n\tdisabled?: boolean;\n\tonChange: (value: BlockValue) => void;\n}) {\n\tconst current = BLOCK_OPTIONS.find((option) => option.value === value);\n\n\treturn (\n\t\t<DropdownMenu>\n\t\t\t<DropdownMenuTrigger\n\t\t\t\tdisabled={disabled}\n\t\t\t\tonMouseDown={(event) => event.preventDefault()}\n\t\t\t\tclassName={cn(\n\t\t\t\t\ttoolbarControlClass(tokens),\n\t\t\t\t\t\"w-auto justify-between gap-1 px-2\",\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<span className=\"whitespace-nowrap\">{current?.label ?? \"Normal\"}</span>\n\t\t\t\t<ChevronDown className=\"size-3.5 opacity-70\" />\n\t\t\t</DropdownMenuTrigger>\n\t\t\t<DropdownMenuContent className=\"min-w-40\">\n\t\t\t\t<DropdownMenuRadioGroup\n\t\t\t\t\tvalue={value}\n\t\t\t\t\tonValueChange={(next) => onChange(next as BlockValue)}\n\t\t\t\t>\n\t\t\t\t\t{BLOCK_OPTIONS.map((option) => (\n\t\t\t\t\t\t<DropdownMenuRadioItem key={option.value} value={option.value}>\n\t\t\t\t\t\t\t{option.label}\n\t\t\t\t\t\t</DropdownMenuRadioItem>\n\t\t\t\t\t))}\n\t\t\t\t</DropdownMenuRadioGroup>\n\t\t\t</DropdownMenuContent>\n\t\t</DropdownMenu>\n\t);\n}\n\n// ─── Text-colour popover ─────────────────────────────────────────────────────────\n\nfunction ColorControl({\n\ttokens,\n\tvalue,\n\tdisabled,\n\tonChange,\n}: {\n\ttokens: SizeTokens;\n\tvalue: string;\n\tdisabled?: boolean;\n\tonChange: (value: string) => void;\n}) {\n\tconst [open, setOpen] = React.useState(false);\n\tconst active = value !== \"\";\n\n\treturn (\n\t\t<Popover open={open} onOpenChange={setOpen}>\n\t\t\t<PopoverTrigger\n\t\t\t\tdisabled={disabled}\n\t\t\t\taria-label=\"Text colour\"\n\t\t\t\ttitle=\"Text colour\"\n\t\t\t\tonMouseDown={(event) => event.preventDefault()}\n\t\t\t\tclassName={toolbarControlClass(tokens, false)}\n\t\t\t>\n\t\t\t\t<span className=\"relative inline-flex flex-col items-center\">\n\t\t\t\t\t<Baseline className={active ? \"text-fg-brand\" : undefined} />\n\t\t\t\t\t<span\n\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\tclassName=\"mt-px h-0.5 w-3 rounded-full\"\n\t\t\t\t\t\tstyle={{ backgroundColor: active ? value : \"currentColor\" }}\n\t\t\t\t\t/>\n\t\t\t\t</span>\n\t\t\t</PopoverTrigger>\n\t\t\t<PopoverContent\n\t\t\t\tshowArrow={false}\n\t\t\t\talign=\"start\"\n\t\t\t\tsideOffset={8}\n\t\t\t\tclassName=\"w-auto py-3\"\n\t\t\t>\n\t\t\t\t<div className=\"grid grid-cols-4 gap-2 px-4\">\n\t\t\t\t\t{TEXT_COLORS.map((color) => {\n\t\t\t\t\t\tconst isSelected = color.value === value;\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\tkey={color.label}\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\ttitle={color.label}\n\t\t\t\t\t\t\t\taria-label={color.label}\n\t\t\t\t\t\t\t\taria-pressed={isSelected}\n\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\tonChange(color.value);\n\t\t\t\t\t\t\t\t\tsetOpen(false);\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\"flex size-7 items-center justify-center rounded-full border transition-[box-shadow,border-color] outline-none\",\n\t\t\t\t\t\t\t\t\t\"hover:border-line-strong focus-visible:ring-2 focus-visible:ring-line-focus\",\n\t\t\t\t\t\t\t\t\tisSelected\n\t\t\t\t\t\t\t\t\t\t? \"border-line-focus ring-2 ring-line-focus/40\"\n\t\t\t\t\t\t\t\t\t\t: \"border-line\",\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\"flex size-5 items-center justify-center rounded-full text-gdt-xs font-bold\",\n\t\t\t\t\t\t\t\t\t\tcolor.value === \"\" && \"text-fg-secondary\",\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\tstyle={\n\t\t\t\t\t\t\t\t\t\tcolor.value\n\t\t\t\t\t\t\t\t\t\t\t? { backgroundColor: color.value, color: \"#fff\" }\n\t\t\t\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\tA\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t);\n\t\t\t\t\t})}\n\t\t\t\t</div>\n\t\t\t</PopoverContent>\n\t\t</Popover>\n\t);\n}\n\n// ─── Link popover ────────────────────────────────────────────────────────────────\n\nfunction LinkControl({\n\ttokens,\n\tactive,\n\tcurrentHref,\n\tdisabled,\n\tonApply,\n\tonRemove,\n}: {\n\ttokens: SizeTokens;\n\tactive: boolean;\n\tcurrentHref: string;\n\tdisabled?: boolean;\n\tonApply: (href: string) => void;\n\tonRemove: () => void;\n}) {\n\tconst [open, setOpen] = React.useState(false);\n\tconst [href, setHref] = React.useState(\"\");\n\n\tfunction handleOpenChange(next: boolean) {\n\t\tif (next) setHref(currentHref);\n\t\tsetOpen(next);\n\t}\n\n\tfunction handleSubmit(event: React.FormEvent) {\n\t\tevent.preventDefault();\n\t\tconst trimmed = href.trim();\n\t\tif (trimmed) onApply(trimmed);\n\t\telse onRemove();\n\t\tsetOpen(false);\n\t}\n\n\treturn (\n\t\t<Popover open={open} onOpenChange={handleOpenChange}>\n\t\t\t<PopoverTrigger\n\t\t\t\tdisabled={disabled}\n\t\t\t\taria-label=\"Insert link\"\n\t\t\t\ttitle=\"Insert link\"\n\t\t\t\taria-pressed={active}\n\t\t\t\tonMouseDown={(event) => event.preventDefault()}\n\t\t\t\tclassName={toolbarControlClass(tokens, active)}\n\t\t\t>\n\t\t\t\t<Link2 />\n\t\t\t</PopoverTrigger>\n\t\t\t<PopoverContent showArrow={false} align=\"start\" sideOffset={8}>\n\t\t\t\t<form className=\"flex flex-col gap-3 px-4\" onSubmit={handleSubmit}>\n\t\t\t\t\t<Input\n\t\t\t\t\t\tautoFocus\n\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\ttype=\"url\"\n\t\t\t\t\t\tplaceholder=\"https://example.com\"\n\t\t\t\t\t\tvalue={href}\n\t\t\t\t\t\tonChange={(event) => setHref(event.target.value)}\n\t\t\t\t\t/>\n\t\t\t\t\t<div className=\"flex items-center justify-between gap-2\">\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tvariant=\"tertiary-outline\"\n\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\tdisabled={!active}\n\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\tonRemove();\n\t\t\t\t\t\t\t\tsetOpen(false);\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tRemove\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t<Button type=\"submit\" size=\"sm\">\n\t\t\t\t\t\t\tApply\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</div>\n\t\t\t\t</form>\n\t\t\t</PopoverContent>\n\t\t</Popover>\n\t);\n}\n\n// ─── Alignment dropdown ──────────────────────────────────────────────────────────\n\nconst ALIGN_OPTIONS = [\n\t{ value: \"left\", label: \"Left\", Icon: AlignLeft },\n\t{ value: \"center\", label: \"Center\", Icon: AlignCenter },\n\t{ value: \"right\", label: \"Right\", Icon: AlignRight },\n\t{ value: \"justify\", label: \"Justify\", Icon: AlignJustify },\n] as const;\n\nfunction AlignControl({\n\ttokens,\n\tvalue,\n\tdisabled,\n\tonChange,\n}: {\n\ttokens: SizeTokens;\n\tvalue: AlignValue;\n\tdisabled?: boolean;\n\tonChange: (value: AlignValue) => void;\n}) {\n\tconst current = ALIGN_OPTIONS.find((option) => option.value === value);\n\tconst Icon = current?.Icon ?? AlignLeft;\n\n\treturn (\n\t\t<DropdownMenu>\n\t\t\t<DropdownMenuTrigger\n\t\t\t\tdisabled={disabled}\n\t\t\t\taria-label=\"Text alignment\"\n\t\t\t\ttitle=\"Text alignment\"\n\t\t\t\tonMouseDown={(event) => event.preventDefault()}\n\t\t\t\tclassName={toolbarControlClass(tokens, value !== \"left\")}\n\t\t\t>\n\t\t\t\t<Icon />\n\t\t\t</DropdownMenuTrigger>\n\t\t\t<DropdownMenuContent className=\"min-w-36\">\n\t\t\t\t<DropdownMenuRadioGroup\n\t\t\t\t\tvalue={value}\n\t\t\t\t\tonValueChange={(next) => onChange(next as AlignValue)}\n\t\t\t\t>\n\t\t\t\t\t{ALIGN_OPTIONS.map(\n\t\t\t\t\t\t({ value: optionValue, label, Icon: OptionIcon }) => (\n\t\t\t\t\t\t\t<DropdownMenuRadioItem key={optionValue} value={optionValue}>\n\t\t\t\t\t\t\t\t<OptionIcon />\n\t\t\t\t\t\t\t\t{label}\n\t\t\t\t\t\t\t</DropdownMenuRadioItem>\n\t\t\t\t\t\t),\n\t\t\t\t\t)}\n\t\t\t\t</DropdownMenuRadioGroup>\n\t\t\t</DropdownMenuContent>\n\t\t</DropdownMenu>\n\t);\n}\n\n// ─── RichTextEditor ──────────────────────────────────────────────────────────────\n\ninterface RichTextEditorProps {\n\tvalue?: string;\n\tdefaultValue?: string;\n\tonChange?: (html: string) => void;\n\tsize?: ComponentSize;\n\tplaceholder?: string;\n\tdisabled?: boolean;\n\tclassName?: string;\n\t\"aria-label\"?: string;\n}\n\nconst EMPTY_STATE = {\n\tblock: \"paragraph\" as BlockValue,\n\talign: \"left\" as AlignValue,\n\tcolor: \"\",\n\tlinkHref: \"\",\n\tisBold: false,\n\tisItalic: false,\n\tisUnderline: false,\n\tisBulletList: false,\n\tisOrderedList: false,\n\tisBlockquote: false,\n\tisCodeBlock: false,\n\tisLink: false,\n\tcanUndo: false,\n\tcanRedo: false,\n};\n\nfunction RichTextEditor({\n\tvalue,\n\tdefaultValue,\n\tonChange,\n\tsize,\n\tplaceholder = \"Start writing, or paste your content here. Format text and add lists, links, and images using the toolbar above.\",\n\tdisabled = false,\n\tclassName,\n\t\"aria-label\": ariaLabel = \"Rich text editor\",\n}: RichTextEditorProps) {\n\tconst resolvedSize = useComponentSize(size);\n\tconst tokens = SIZES[resolvedSize];\n\tconst [focused, setFocused] = React.useState(false);\n\n\tconst editor = useEditor({\n\t\timmediatelyRender: false,\n\t\teditable: !disabled,\n\t\tcontent: value ?? defaultValue ?? \"\",\n\t\textensions: [\n\t\t\tStarterKit.configure({\n\t\t\t\tlink: {\n\t\t\t\t\topenOnClick: false,\n\t\t\t\t\tHTMLAttributes: { rel: \"noopener noreferrer nofollow\" },\n\t\t\t\t},\n\t\t\t}),\n\t\t\tTextStyle,\n\t\t\tColor,\n\t\t\tTextAlign.configure({ types: [\"heading\", \"paragraph\"] }),\n\t\t\tImage.configure({ inline: false, allowBase64: true }),\n\t\t\tPlaceholder.configure({ placeholder }),\n\t\t],\n\t\teditorProps: {\n\t\t\tattributes: {\n\t\t\t\t\"aria-label\": ariaLabel,\n\t\t\t\trole: \"textbox\",\n\t\t\t\t\"aria-multiline\": \"true\",\n\t\t\t\tclass: cn(\"tiptap focus:outline-none\", tokens.text),\n\t\t\t},\n\t\t},\n\t\tonFocus: () => setFocused(true),\n\t\tonBlur: () => setFocused(false),\n\t\tonUpdate: ({ editor: instance }) => onChange?.(instance.getHTML()),\n\t});\n\n\t// Keep editability in sync with the disabled prop.\n\tReact.useEffect(() => {\n\t\teditor?.setEditable(!disabled);\n\t}, [editor, disabled]);\n\n\t// Sync external (controlled) value changes without disturbing the cursor.\n\tReact.useEffect(() => {\n\t\tif (!editor || value === undefined) return;\n\t\tif (value !== editor.getHTML()) {\n\t\t\teditor.commands.setContent(value, { emitUpdate: false });\n\t\t}\n\t}, [editor, value]);\n\n\tconst state = useEditorState({\n\t\teditor,\n\t\tselector: ({ editor: instance }) => {\n\t\t\tif (!instance) return EMPTY_STATE;\n\t\t\tconst block: BlockValue = instance.isActive(\"heading\", { level: 1 })\n\t\t\t\t? \"h1\"\n\t\t\t\t: instance.isActive(\"heading\", { level: 2 })\n\t\t\t\t\t? \"h2\"\n\t\t\t\t\t: instance.isActive(\"heading\", { level: 3 })\n\t\t\t\t\t\t? \"h3\"\n\t\t\t\t\t\t: \"paragraph\";\n\t\t\tconst align: AlignValue = instance.isActive({ textAlign: \"center\" })\n\t\t\t\t? \"center\"\n\t\t\t\t: instance.isActive({ textAlign: \"right\" })\n\t\t\t\t\t? \"right\"\n\t\t\t\t\t: instance.isActive({ textAlign: \"justify\" })\n\t\t\t\t\t\t? \"justify\"\n\t\t\t\t\t\t: \"left\";\n\t\t\treturn {\n\t\t\t\tblock,\n\t\t\t\talign,\n\t\t\t\tcolor: (instance.getAttributes(\"textStyle\").color as string) ?? \"\",\n\t\t\t\tlinkHref: (instance.getAttributes(\"link\").href as string) ?? \"\",\n\t\t\t\tisBold: instance.isActive(\"bold\"),\n\t\t\t\tisItalic: instance.isActive(\"italic\"),\n\t\t\t\tisUnderline: instance.isActive(\"underline\"),\n\t\t\t\tisBulletList: instance.isActive(\"bulletList\"),\n\t\t\t\tisOrderedList: instance.isActive(\"orderedList\"),\n\t\t\t\tisBlockquote: instance.isActive(\"blockquote\"),\n\t\t\t\tisCodeBlock: instance.isActive(\"codeBlock\"),\n\t\t\t\tisLink: instance.isActive(\"link\"),\n\t\t\t\tcanUndo: instance.can().undo(),\n\t\t\t\tcanRedo: instance.can().redo(),\n\t\t\t};\n\t\t},\n\t});\n\n\tconst s = state ?? EMPTY_STATE;\n\n\tfunction setBlock(next: BlockValue) {\n\t\tif (!editor) return;\n\t\tconst chain = editor.chain().focus();\n\t\tif (next === \"paragraph\") chain.setParagraph().run();\n\t\telse chain.toggleHeading({ level: Number(next[1]) as 1 | 2 | 3 }).run();\n\t}\n\n\tfunction setAlign(next: AlignValue) {\n\t\teditor?.chain().focus().setTextAlign(next).run();\n\t}\n\n\tfunction setColor(next: string) {\n\t\tif (!editor) return;\n\t\tif (next) editor.chain().focus().setColor(next).run();\n\t\telse editor.chain().focus().unsetColor().run();\n\t}\n\n\tfunction applyLink(href: string) {\n\t\teditor?.chain().focus().extendMarkRange(\"link\").setLink({ href }).run();\n\t}\n\n\tfunction removeLink() {\n\t\teditor?.chain().focus().extendMarkRange(\"link\").unsetLink().run();\n\t}\n\n\tfunction insertImage() {\n\t\tconst url = window.prompt(\"Image URL\");\n\t\tif (url) editor?.chain().focus().setImage({ src: url }).run();\n\t}\n\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"rich-text-editor\"\n\t\t\tdata-disabled={disabled || undefined}\n\t\t\tdata-focused={focused || undefined}\n\t\t\tclassName={cn(\n\t\t\t\t\"group/editor flex w-full flex-col overflow-hidden rounded-2xl border bg-surface text-fg-primary shadow-1 transition-[border-color,box-shadow]\",\n\t\t\t\tdisabled\n\t\t\t\t\t? \"border-line-subtle opacity-60\"\n\t\t\t\t\t: focused\n\t\t\t\t\t\t? \"border-line-focus ring-2 ring-line-focus/35\"\n\t\t\t\t\t\t: \"border-line hover:border-line-strong\",\n\t\t\t\ttokens.width,\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t{/* Toolbar — raised strip holding all formatting controls */}\n\t\t\t<div\n\t\t\t\trole=\"toolbar\"\n\t\t\t\taria-label=\"Formatting\"\n\t\t\t\taria-orientation=\"horizontal\"\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"flex flex-wrap items-center bg-surface-raised\",\n\t\t\t\t\ttokens.toolbarPad,\n\t\t\t\t\ttokens.toolbarGap,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<BlockControl\n\t\t\t\t\ttokens={tokens}\n\t\t\t\t\tvalue={s.block}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tonChange={setBlock}\n\t\t\t\t/>\n\t\t\t\t<ToolbarButton\n\t\t\t\t\ttokens={tokens}\n\t\t\t\t\tlabel=\"Bold\"\n\t\t\t\t\tactive={s.isBold}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tonClick={() => editor?.chain().focus().toggleBold().run()}\n\t\t\t\t>\n\t\t\t\t\t<Bold />\n\t\t\t\t</ToolbarButton>\n\t\t\t\t<ToolbarButton\n\t\t\t\t\ttokens={tokens}\n\t\t\t\t\tlabel=\"Italic\"\n\t\t\t\t\tactive={s.isItalic}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tonClick={() => editor?.chain().focus().toggleItalic().run()}\n\t\t\t\t>\n\t\t\t\t\t<Italic />\n\t\t\t\t</ToolbarButton>\n\t\t\t\t<ToolbarButton\n\t\t\t\t\ttokens={tokens}\n\t\t\t\t\tlabel=\"Underline\"\n\t\t\t\t\tactive={s.isUnderline}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tonClick={() => editor?.chain().focus().toggleUnderline().run()}\n\t\t\t\t>\n\t\t\t\t\t<Underline />\n\t\t\t\t</ToolbarButton>\n\t\t\t\t<ColorControl\n\t\t\t\t\ttokens={tokens}\n\t\t\t\t\tvalue={s.color}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tonChange={setColor}\n\t\t\t\t/>\n\n\t\t\t\t<ToolbarDivider tokens={tokens} />\n\n\t\t\t\t<ToolbarButton\n\t\t\t\t\ttokens={tokens}\n\t\t\t\t\tlabel=\"Numbered list\"\n\t\t\t\t\tactive={s.isOrderedList}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tonClick={() => editor?.chain().focus().toggleOrderedList().run()}\n\t\t\t\t>\n\t\t\t\t\t<ListOrdered />\n\t\t\t\t</ToolbarButton>\n\t\t\t\t<ToolbarButton\n\t\t\t\t\ttokens={tokens}\n\t\t\t\t\tlabel=\"Bullet list\"\n\t\t\t\t\tactive={s.isBulletList}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tonClick={() => editor?.chain().focus().toggleBulletList().run()}\n\t\t\t\t>\n\t\t\t\t\t<List />\n\t\t\t\t</ToolbarButton>\n\t\t\t\t<AlignControl\n\t\t\t\t\ttokens={tokens}\n\t\t\t\t\tvalue={s.align}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tonChange={setAlign}\n\t\t\t\t/>\n\n\t\t\t\t<ToolbarDivider tokens={tokens} />\n\n\t\t\t\t<LinkControl\n\t\t\t\t\ttokens={tokens}\n\t\t\t\t\tactive={s.isLink}\n\t\t\t\t\tcurrentHref={s.linkHref}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tonApply={applyLink}\n\t\t\t\t\tonRemove={removeLink}\n\t\t\t\t/>\n\t\t\t\t<ToolbarButton\n\t\t\t\t\ttokens={tokens}\n\t\t\t\t\tlabel=\"Quote\"\n\t\t\t\t\tactive={s.isBlockquote}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tonClick={() => editor?.chain().focus().toggleBlockquote().run()}\n\t\t\t\t>\n\t\t\t\t\t<Quote />\n\t\t\t\t</ToolbarButton>\n\t\t\t\t<ToolbarButton\n\t\t\t\t\ttokens={tokens}\n\t\t\t\t\tlabel=\"Code block\"\n\t\t\t\t\tactive={s.isCodeBlock}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tonClick={() => editor?.chain().focus().toggleCodeBlock().run()}\n\t\t\t\t>\n\t\t\t\t\t<Code2 />\n\t\t\t\t</ToolbarButton>\n\t\t\t\t<ToolbarButton\n\t\t\t\t\ttokens={tokens}\n\t\t\t\t\tlabel=\"Insert image\"\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tonClick={insertImage}\n\t\t\t\t>\n\t\t\t\t\t<ImageIcon />\n\t\t\t\t</ToolbarButton>\n\n\t\t\t\t<ToolbarDivider tokens={tokens} />\n\n\t\t\t\t<ToolbarButton\n\t\t\t\t\ttokens={tokens}\n\t\t\t\t\tlabel=\"Undo\"\n\t\t\t\t\tdisabled={disabled || !s.canUndo}\n\t\t\t\t\tonClick={() => editor?.chain().focus().undo().run()}\n\t\t\t\t>\n\t\t\t\t\t<Undo2 />\n\t\t\t\t</ToolbarButton>\n\t\t\t\t<ToolbarButton\n\t\t\t\t\ttokens={tokens}\n\t\t\t\t\tlabel=\"Redo\"\n\t\t\t\t\tdisabled={disabled || !s.canRedo}\n\t\t\t\t\tonClick={() => editor?.chain().focus().redo().run()}\n\t\t\t\t>\n\t\t\t\t\t<Redo2 />\n\t\t\t\t</ToolbarButton>\n\t\t\t</div>\n\n\t\t\t{/* Divider — border-subtle line separating the toolbar from the content */}\n\t\t\t<div className=\"h-px w-full shrink-0 bg-line-subtle\" />\n\n\t\t\t{/* Content area — editable surface */}\n\t\t\t<EditorContent\n\t\t\t\teditor={editor}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"gdt-rich-text min-w-0 flex-1 overflow-y-auto\",\n\t\t\t\t\ttokens.content,\n\t\t\t\t\ttokens.contentPad,\n\t\t\t\t)}\n\t\t\t/>\n\t\t</div>\n\t);\n}\n\nexport { RichTextEditor };\nexport type { RichTextEditorProps };\n","import { type ClassValue, clsx } from \"clsx\";\nimport { extendTailwindMerge } from \"tailwind-merge\";\n\nconst twMerge = extendTailwindMerge({\n\textend: {\n\t\tclassGroups: {\n\t\t\t\"font-size\": [\n\t\t\t\t{\n\t\t\t\t\ttext: [\n\t\t\t\t\t\t\"gdt-display\",\n\t\t\t\t\t\t\"gdt-h1\",\n\t\t\t\t\t\t\"gdt-h2\",\n\t\t\t\t\t\t\"gdt-h3\",\n\t\t\t\t\t\t\"gdt-h4\",\n\t\t\t\t\t\t\"gdt-h5\",\n\t\t\t\t\t\t\"gdt-xl\",\n\t\t\t\t\t\t\"gdt-lg\",\n\t\t\t\t\t\t\"gdt-md\",\n\t\t\t\t\t\t\"gdt-sm\",\n\t\t\t\t\t\t\"gdt-xs\",\n\t\t\t\t\t\t\"gdt-subtext\",\n\t\t\t\t\t\t\"gdt-capitalized\",\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t},\n});\n\nexport function cn(...inputs: ClassValue[]) {\n\treturn twMerge(clsx(inputs));\n}\n","import { Button as ButtonPrimitive } from \"@base-ui/react/button\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { Loader } from \"lucide-react\";\nimport type * as React from \"react\";\nimport { cn } from \"../../lib/cn\";\nimport { useComponentSize } from \"./size-context\";\n\nconst buttonVariants = cva(\n\t\"group/button inline-flex shrink-0 items-center justify-center rounded-full bg-clip-padding whitespace-nowrap font-bold transition-[background-color,color,border-color,box-shadow,transform] outline-none select-none focus-visible:border-line-focus focus-visible:shadow-[0px_0px_0px_2px_var(--color-line-focus)] active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 aria-invalid:border-line-danger aria-invalid:ring-3 aria-invalid:ring-destructive/20 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n\t{\n\t\tvariants: {\n\t\t\tvariant: {\n\t\t\t\tprimary:\n\t\t\t\t\t\"bg-action-primary text-fg-on-brand hover:bg-action-primary-hover active:bg-action-primary-pressed\",\n\t\t\t\t\"primary-outline\":\n\t\t\t\t\t\"border-2 border-action-primary bg-transparent text-fg-brand hover:bg-surface-brand-subtle active:bg-surface-brand-subtle data-focused:bg-surface-brand-subtle data-pressed:bg-surface-brand-subtle\",\n\t\t\t\tsecondary:\n\t\t\t\t\t\"bg-surface-brand-subtle text-fg-brand hover:bg-action-primary-hover hover:text-fg-on-brand active:bg-action-primary-pressed active:text-fg-on-brand data-focused:bg-action-primary-hover data-pressed:bg-action-primary-pressed data-focused:text-fg-on-brand data-pressed:text-fg-on-brand\",\n\t\t\t\t\"secondary-outline\":\n\t\t\t\t\t\"border-2 border-action-secondary bg-transparent text-fg-brand hover:bg-surface-brand-subtle active:bg-surface-brand-subtle data-focused:bg-surface-brand-subtle data-pressed:bg-surface-brand-subtle\",\n\t\t\t\ttertiary:\n\t\t\t\t\t\"bg-action-tertiary text-fg-primary hover:bg-action-tertiary-hover active:bg-action-tertiary-pressed data-focused:bg-action-tertiary-hover data-pressed:bg-action-tertiary-pressed\",\n\t\t\t\t\"tertiary-outline\":\n\t\t\t\t\t\"border border-line-strong bg-transparent text-fg-primary hover:bg-surface active:bg-surface-raised data-focused:bg-surface data-pressed:bg-surface-raised\",\n\t\t\t\tghost:\n\t\t\t\t\t\"bg-transparent text-fg-primary hover:bg-surface active:bg-surface-raised data-focused:bg-surface data-pressed:bg-surface-raised\",\n\t\t\t\tdanger:\n\t\t\t\t\t\"bg-action-danger text-fg-on-brand hover:bg-action-danger-hover active:bg-action-danger-pressed data-focused:bg-action-danger-hover data-pressed:bg-action-danger-pressed\",\n\t\t\t\t\"glass-overlay\": \"bg-surface-glass-overlay-button text-fg-on-brand\",\n\t\t\t\t\"link-brand\":\n\t\t\t\t\t\"border-transparent bg-transparent px-0 text-fg-brand hover:underline active:underline active:opacity-70\",\n\t\t\t\t\"link-neutral\":\n\t\t\t\t\t\"border-transparent bg-transparent px-0 text-fg-secondary hover:underline active:underline active:opacity-70\",\n\t\t\t},\n\t\t\tsize: {\n\t\t\t\tsm: \"h-8 gap-2 px-3.5 text-gdt-xs has-data-[icon=inline-end]:pr-3 has-data-[icon=inline-start]:pl-3 [&_svg:not([class*='size-'])]:size-3.5\",\n\t\t\t\tmd: \"h-10 gap-2 px-4.5 text-gdt-sm has-data-[icon=inline-end]:pr-4 has-data-[icon=inline-start]:pl-4\",\n\t\t\t\tlg: \"h-12.5 gap-2.5 px-5.5 text-gdt-md has-data-[icon=inline-end]:pr-5 has-data-[icon=inline-start]:pl-5 [&_svg:not([class*='size-'])]:size-4.5\",\n\t\t\t\txl: \"h-14 gap-3 px-6.5 text-gdt-lg has-data-[icon=inline-end]:pr-6 has-data-[icon=inline-start]:pl-6 [&_svg:not([class*='size-'])]:size-5\",\n\t\t\t\ticon: \"size-10\",\n\t\t\t\t\"icon-xs\": \"size-6 text-gdt-xs [&_svg:not([class*='size-'])]:size-3\",\n\t\t\t\t\"icon-sm\": \"size-8 text-gdt-sm [&_svg:not([class*='size-'])]:size-3.5\",\n\t\t\t\t\"icon-lg\":\n\t\t\t\t\t\"size-12.5 text-gdt-md [&_svg:not([class*='size-'])]:size-4.5\",\n\t\t\t\t\"icon-xl\": \"size-14 text-gdt-lg [&_svg:not([class*='size-'])]:size-5\",\n\t\t\t},\n\t\t},\n\t\tdefaultVariants: {\n\t\t\tvariant: \"primary\",\n\t\t\tsize: \"md\",\n\t\t},\n\t},\n);\n\ntype ButtonSize = NonNullable<VariantProps<typeof buttonVariants>[\"size\"]>;\n\nfunction Button({\n\tclassName,\n\tvariant = \"primary\",\n\tsize,\n\tisLoading = false,\n\tchildren,\n\tdisabled = false,\n\t...props\n}: ButtonPrimitive.Props &\n\tVariantProps<typeof buttonVariants> & { isLoading?: boolean }) {\n\tconst inheritedSize = useComponentSize();\n\tconst resolvedSize = size ?? inheritedSize;\n\tconst _disabled = disabled || isLoading;\n\treturn (\n\t\t<ButtonPrimitive\n\t\t\tdata-slot=\"button\"\n\t\t\tclassName={cn(buttonVariants({ variant, size: resolvedSize, className }))}\n\t\t\tdisabled={_disabled}\n\t\t\t{...props}\n\t\t>\n\t\t\t{isLoading && <Loader className=\"size-4 animate-spin\" />} {children}\n\t\t</ButtonPrimitive>\n\t);\n}\n\ntype ButtonLinkProps = Omit<React.ComponentProps<\"a\">, \"href\"> &\n\tVariantProps<typeof buttonVariants> & {\n\t\tdisabled?: boolean;\n\t\thref: string;\n\t};\n\nfunction ButtonLink({\n\tclassName,\n\thref,\n\tvariant = \"primary\",\n\tsize,\n\tdisabled = false,\n\tonClick,\n\t...props\n}: ButtonLinkProps) {\n\tconst inheritedSize = useComponentSize();\n\tconst resolvedSize: ButtonSize = size ?? inheritedSize;\n\n\treturn (\n\t\t<a\n\t\t\tdata-slot=\"button-link\"\n\t\t\thref={href}\n\t\t\taria-disabled={disabled}\n\t\t\ttabIndex={disabled ? -1 : props.tabIndex}\n\t\t\tclassName={cn(buttonVariants({ variant, size: resolvedSize, className }))}\n\t\t\tonClick={(event) => {\n\t\t\t\tif (disabled) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tonClick?.(event);\n\t\t\t}}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nexport { Button, ButtonLink, buttonVariants };\n","\"use client\";\n\nimport { createContext, type ReactNode, useContext } from \"react\";\n\ntype ComponentSize = \"sm\" | \"md\" | \"lg\";\n\nconst SizeContext = createContext<ComponentSize | undefined>(undefined);\n\nfunction SizeProvider({\n\tchildren,\n\tsize,\n}: {\n\tchildren: ReactNode;\n\tsize?: ComponentSize | null;\n}) {\n\tif (!size) {\n\t\treturn <>{children}</>;\n\t}\n\n\treturn <SizeContext.Provider value={size}>{children}</SizeContext.Provider>;\n}\n\nfunction useComponentSize(\n\tsize?: ComponentSize | null,\n\tfallback: ComponentSize = \"md\",\n) {\n\tconst inheritedSize = useContext(SizeContext);\n\treturn size ?? inheritedSize ?? fallback;\n}\n\nexport { SizeProvider, useComponentSize, type ComponentSize };\n","\"use client\";\n\nimport { Menu as MenuPrimitive } from \"@base-ui/react/menu\";\nimport { cva } from \"class-variance-authority\";\nimport { CheckIcon, ChevronRightIcon } from \"lucide-react\";\nimport type * as React from \"react\";\n\nimport { cn } from \"../../lib/cn\";\nimport {\n\ttype ComponentSize,\n\tSizeProvider,\n\tuseComponentSize,\n} from \"./size-context\";\n\ntype DropdownMenuSize = ComponentSize;\n\nfunction DropdownMenu({\n\tchildren,\n\tsize,\n\t...props\n}: MenuPrimitive.Root.Props & {\n\tsize?: DropdownMenuSize;\n}) {\n\treturn (\n\t\t<SizeProvider size={size}>\n\t\t\t<MenuPrimitive.Root data-slot=\"dropdown-menu\" {...props}>\n\t\t\t\t{children}\n\t\t\t</MenuPrimitive.Root>\n\t\t</SizeProvider>\n\t);\n}\n\nfunction DropdownMenuPortal({ ...props }: MenuPrimitive.Portal.Props) {\n\treturn <MenuPrimitive.Portal data-slot=\"dropdown-menu-portal\" {...props} />;\n}\n\nfunction DropdownMenuTrigger({ ...props }: MenuPrimitive.Trigger.Props) {\n\treturn <MenuPrimitive.Trigger data-slot=\"dropdown-menu-trigger\" {...props} />;\n}\n\nconst dropdownMenuContentVariants = cva(\n\t\"relative isolate z-50 max-h-(--available-height) w-(--anchor-width) min-w-36 origin-(--transform-origin) overflow-x-hidden overflow-y-auto border border-line-subtle bg-canvas text-fg-primary shadow-(--elevation-e1-shadow) duration-100 outline-none data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:overflow-hidden data-closed:fade-out-0 data-closed:zoom-out-95\",\n\t{\n\t\tvariants: {\n\t\t\tsize: {\n\t\t\t\tsm: \"rounded-lg p-1\",\n\t\t\t\tmd: \"rounded-xl p-1.5\",\n\t\t\t\tlg: \"rounded-[18px] p-2\",\n\t\t\t},\n\t\t},\n\t\tdefaultVariants: {\n\t\t\tsize: \"md\",\n\t\t},\n\t},\n);\n\nconst dropdownMenuItemVariants = cva(\n\t\"group/dropdown-menu-item relative flex w-full cursor-pointer items-center font-normal text-fg-primary outline-none transition-colors select-none focus:bg-surface focus:text-fg-primary data-highlighted:bg-surface data-highlighted:text-fg-primary data-[variant=destructive]:text-fg-danger data-[variant=destructive]:focus:bg-surface-danger-subtle data-[variant=destructive]:focus:text-fg-danger data-[variant=destructive]:data-highlighted:bg-surface-danger-subtle data-[variant=destructive]:data-highlighted:text-fg-danger data-disabled:pointer-events-none data-disabled:text-fg-caption-placeholder data-disabled:opacity-100 [&_svg]:pointer-events-none [&_svg]:shrink-0 data-[variant=destructive]:[&_svg]:text-fg-danger\",\n\t{\n\t\tvariants: {\n\t\t\tsize: {\n\t\t\t\tsm: \"gap-1.5 rounded-md px-3 py-1.5 text-gdt-xs [&_svg:not([class*='size-'])]:size-3.5\",\n\t\t\t\tmd: \"gap-2 rounded-md px-4 py-2 text-gdt-sm [&_svg:not([class*='size-'])]:size-4\",\n\t\t\t\tlg: \"gap-2.5 rounded-md px-4 py-2.5 text-gdt-md [&_svg:not([class*='size-'])]:size-4.5\",\n\t\t\t},\n\t\t},\n\t\tdefaultVariants: {\n\t\t\tsize: \"md\",\n\t\t},\n\t},\n);\n\nconst dropdownMenuLabelVariants = cva(\n\t\"font-medium text-fg-secondary data-inset:pl-8\",\n\t{\n\t\tvariants: {\n\t\t\tsize: {\n\t\t\t\tsm: \"px-3 py-1 text-gdt-xs\",\n\t\t\t\tmd: \"px-3 py-1 text-gdt-xs\",\n\t\t\t\tlg: \"px-4 py-1.5 text-gdt-sm\",\n\t\t\t},\n\t\t},\n\t\tdefaultVariants: {\n\t\t\tsize: \"md\",\n\t\t},\n\t},\n);\n\nfunction DropdownMenuContent({\n\talign = \"start\",\n\talignOffset = 0,\n\tside = \"bottom\",\n\tsideOffset = 6,\n\tclassName,\n\t...props\n}: MenuPrimitive.Popup.Props &\n\tPick<\n\t\tMenuPrimitive.Positioner.Props,\n\t\t\"align\" | \"alignOffset\" | \"side\" | \"sideOffset\"\n\t>) {\n\tconst resolvedSize = useComponentSize();\n\n\treturn (\n\t\t<MenuPrimitive.Portal>\n\t\t\t<MenuPrimitive.Positioner\n\t\t\t\tclassName=\"isolate z-50 outline-none\"\n\t\t\t\talign={align}\n\t\t\t\talignOffset={alignOffset}\n\t\t\t\tside={side}\n\t\t\t\tsideOffset={sideOffset}\n\t\t\t>\n\t\t\t\t<MenuPrimitive.Popup\n\t\t\t\t\tdata-slot=\"dropdown-menu-content\"\n\t\t\t\t\tdata-size={resolvedSize}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\tdropdownMenuContentVariants({ size: resolvedSize }),\n\t\t\t\t\t\tclassName,\n\t\t\t\t\t)}\n\t\t\t\t\t{...props}\n\t\t\t\t/>\n\t\t\t</MenuPrimitive.Positioner>\n\t\t</MenuPrimitive.Portal>\n\t);\n}\n\nfunction DropdownMenuGroup({ className, ...props }: MenuPrimitive.Group.Props) {\n\treturn (\n\t\t<MenuPrimitive.Group\n\t\t\tdata-slot=\"dropdown-menu-group\"\n\t\t\tclassName={cn(\"scroll-my-1 space-y-0.5\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction DropdownMenuLabel({\n\tclassName,\n\tinset,\n\t...props\n}: MenuPrimitive.GroupLabel.Props & {\n\tinset?: boolean;\n}) {\n\tconst resolvedSize = useComponentSize();\n\n\treturn (\n\t\t<MenuPrimitive.GroupLabel\n\t\t\tdata-slot=\"dropdown-menu-label\"\n\t\t\tdata-inset={inset}\n\t\t\tclassName={cn(\n\t\t\t\tdropdownMenuLabelVariants({ size: resolvedSize }),\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction DropdownMenuItem({\n\tclassName,\n\tinset,\n\tvariant = \"default\",\n\t...props\n}: MenuPrimitive.Item.Props & {\n\tinset?: boolean;\n\tvariant?: \"default\" | \"destructive\";\n}) {\n\tconst resolvedSize = useComponentSize();\n\n\treturn (\n\t\t<MenuPrimitive.Item\n\t\t\tdata-slot=\"dropdown-menu-item\"\n\t\t\tdata-inset={inset}\n\t\t\tdata-size={resolvedSize}\n\t\t\tdata-variant={variant}\n\t\t\tclassName={cn(\n\t\t\t\tdropdownMenuItemVariants({ size: resolvedSize }),\n\t\t\t\t\"data-inset:pl-8\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction DropdownMenuSub({ ...props }: MenuPrimitive.SubmenuRoot.Props) {\n\treturn <MenuPrimitive.SubmenuRoot data-slot=\"dropdown-menu-sub\" {...props} />;\n}\n\nfunction DropdownMenuSubTrigger({\n\tclassName,\n\tinset,\n\tchildren,\n\t...props\n}: MenuPrimitive.SubmenuTrigger.Props & {\n\tinset?: boolean;\n}) {\n\tconst resolvedSize = useComponentSize();\n\n\treturn (\n\t\t<MenuPrimitive.SubmenuTrigger\n\t\t\tdata-slot=\"dropdown-menu-sub-trigger\"\n\t\t\tdata-inset={inset}\n\t\t\tdata-size={resolvedSize}\n\t\t\tclassName={cn(\n\t\t\t\tdropdownMenuItemVariants({ size: resolvedSize }),\n\t\t\t\t\"data-inset:pl-8 data-open:bg-surface data-open:text-fg-primary data-popup-open:bg-surface data-popup-open:text-fg-primary\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{children}\n\t\t\t<ChevronRightIcon className=\"cn-rtl-flip ml-auto\" />\n\t\t</MenuPrimitive.SubmenuTrigger>\n\t);\n}\n\nfunction DropdownMenuSubContent({\n\talign = \"start\",\n\talignOffset = -3,\n\tside = \"right\",\n\tsideOffset = 4,\n\tclassName,\n\t...props\n}: React.ComponentProps<typeof DropdownMenuContent>) {\n\treturn (\n\t\t<DropdownMenuContent\n\t\t\tdata-slot=\"dropdown-menu-sub-content\"\n\t\t\tclassName={cn(\n\t\t\t\t\"w-auto min-w-28 shadow-(--elevation-e2-shadow)\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\talign={align}\n\t\t\talignOffset={alignOffset}\n\t\t\tside={side}\n\t\t\tsideOffset={sideOffset}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction DropdownMenuCheckboxItem({\n\tclassName,\n\tchildren,\n\tchecked,\n\tinset,\n\t...props\n}: MenuPrimitive.CheckboxItem.Props & {\n\tinset?: boolean;\n}) {\n\tconst resolvedSize = useComponentSize();\n\n\treturn (\n\t\t<MenuPrimitive.CheckboxItem\n\t\t\tdata-slot=\"dropdown-menu-checkbox-item\"\n\t\t\tdata-inset={inset}\n\t\t\tdata-size={resolvedSize}\n\t\t\tclassName={cn(\n\t\t\t\tdropdownMenuItemVariants({ size: resolvedSize }),\n\t\t\t\t\"pr-10 data-inset:pl-8\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\tchecked={checked}\n\t\t\t{...props}\n\t\t>\n\t\t\t<span\n\t\t\t\tclassName=\"pointer-events-none absolute right-3 flex items-center justify-center text-fg-brand\"\n\t\t\t\tdata-slot=\"dropdown-menu-checkbox-item-indicator\"\n\t\t\t>\n\t\t\t\t<MenuPrimitive.CheckboxItemIndicator>\n\t\t\t\t\t<CheckIcon />\n\t\t\t\t</MenuPrimitive.CheckboxItemIndicator>\n\t\t\t</span>\n\t\t\t{children}\n\t\t</MenuPrimitive.CheckboxItem>\n\t);\n}\n\nfunction DropdownMenuRadioGroup({ ...props }: MenuPrimitive.RadioGroup.Props) {\n\treturn (\n\t\t<MenuPrimitive.RadioGroup\n\t\t\tdata-slot=\"dropdown-menu-radio-group\"\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction DropdownMenuRadioItem({\n\tclassName,\n\tchildren,\n\tinset,\n\t...props\n}: MenuPrimitive.RadioItem.Props & {\n\tinset?: boolean;\n}) {\n\tconst resolvedSize = useComponentSize();\n\n\treturn (\n\t\t<MenuPrimitive.RadioItem\n\t\t\tdata-slot=\"dropdown-menu-radio-item\"\n\t\t\tdata-inset={inset}\n\t\t\tdata-size={resolvedSize}\n\t\t\tclassName={cn(\n\t\t\t\tdropdownMenuItemVariants({ size: resolvedSize }),\n\t\t\t\t\"pr-10 data-inset:pl-8\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t<span\n\t\t\t\tclassName=\"pointer-events-none absolute right-3 flex items-center justify-center text-fg-brand\"\n\t\t\t\tdata-slot=\"dropdown-menu-radio-item-indicator\"\n\t\t\t>\n\t\t\t\t<MenuPrimitive.RadioItemIndicator>\n\t\t\t\t\t<CheckIcon />\n\t\t\t\t</MenuPrimitive.RadioItemIndicator>\n\t\t\t</span>\n\t\t\t{children}\n\t\t</MenuPrimitive.RadioItem>\n\t);\n}\n\nfunction DropdownMenuSeparator({\n\tclassName,\n\t...props\n}: MenuPrimitive.Separator.Props) {\n\treturn (\n\t\t<MenuPrimitive.Separator\n\t\t\tdata-slot=\"dropdown-menu-separator\"\n\t\t\tclassName={cn(\"pointer-events-none my-1 h-px bg-line-subtle\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction DropdownMenuShortcut({\n\tclassName,\n\t...props\n}: React.ComponentProps<\"span\">) {\n\treturn (\n\t\t<span\n\t\t\tdata-slot=\"dropdown-menu-shortcut\"\n\t\t\tclassName={cn(\n\t\t\t\t\"ml-auto text-gdt-xs tracking-widest text-fg-secondary group-focus/dropdown-menu-item:text-fg-primary group-data-highlighted/dropdown-menu-item:text-fg-primary\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nexport {\n\tDropdownMenu,\n\tDropdownMenuPortal,\n\tDropdownMenuTrigger,\n\tDropdownMenuContent,\n\tDropdownMenuGroup,\n\tDropdownMenuLabel,\n\tDropdownMenuItem,\n\tDropdownMenuCheckboxItem,\n\tDropdownMenuRadioGroup,\n\tDropdownMenuRadioItem,\n\tDropdownMenuSeparator,\n\tDropdownMenuShortcut,\n\tDropdownMenuSub,\n\tDropdownMenuSubTrigger,\n\tDropdownMenuSubContent,\n\ttype DropdownMenuSize,\n};\n","import { Input as InputPrimitive } from \"@base-ui/react/input\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport type * as React from \"react\";\n\nimport { cn } from \"../../lib/cn\";\nimport {\n\ttype InputComponentSize,\n\tuseInputComponentSize,\n} from \"./input-size-context\";\n\nconst inputVariants = cva(\n\t\"flex w-full min-w-0 rounded-full border border-line bg-canvas text-fg-primary transition-[background-color,border-color,box-shadow,color] outline-none file:inline-flex file:border-0 file:bg-transparent file:font-normal file:text-fg-primary placeholder:text-fg-muted hover:border-line-strong focus-visible:border-line-focus focus-visible:inset-ring-1 inset-ring-line-focus disabled:pointer-events-none disabled:cursor-not-allowed disabled:border-line-subtle disabled:bg-surface disabled:text-fg-muted disabled:placeholder:text-fg-muted aria-invalid:border-line-danger aria-invalid:text-fg-danger aria-invalid:placeholder:text-fg-danger aria-invalid:shadow-none\",\n\t{\n\t\tvariants: {\n\t\t\tsize: {\n\t\t\t\tsm: \"h-8 px-3 text-gdt-xs font-normal file:text-gdt-xs\",\n\t\t\t\tmd: \"h-10 px-3.5 text-gdt-sm font-normal file:text-gdt-sm\",\n\t\t\t\tlg: \"h-12 px-4 text-gdt-md font-normal file:text-gdt-md\",\n\t\t\t\txl: \"h-14 px-4.5 text-gdt-lg font-normal file:text-gdt-lg\",\n\t\t\t},\n\t\t},\n\t\tdefaultVariants: {\n\t\t\tsize: \"md\",\n\t\t},\n\t},\n);\n\ntype InputProps = Omit<React.ComponentProps<\"input\">, \"size\"> &\n\tVariantProps<typeof inputVariants>;\n\ntype InputSize = InputComponentSize;\n\nfunction Input({ className, size, type, ...props }: InputProps) {\n\tconst resolvedSize = useInputComponentSize(size);\n\n\treturn (\n\t\t<InputPrimitive\n\t\t\ttype={type}\n\t\t\tdata-slot=\"input\"\n\t\t\tdata-size={resolvedSize}\n\t\t\tclassName={cn(inputVariants({ size: resolvedSize }), className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nexport { Input, inputVariants, type InputSize };\n","\"use client\";\n\nimport { createContext, type ReactNode, useContext } from \"react\";\n\ntype InputComponentSize = \"sm\" | \"md\" | \"lg\" | \"xl\";\n\nconst InputSizeContext = createContext<InputComponentSize | undefined>(\n\tundefined,\n);\n\nfunction InputSizeProvider({\n\tchildren,\n\tsize,\n}: {\n\tchildren: ReactNode;\n\tsize?: InputComponentSize | null;\n}) {\n\tif (!size) {\n\t\treturn <>{children}</>;\n\t}\n\n\treturn (\n\t\t<InputSizeContext.Provider value={size}>\n\t\t\t{children}\n\t\t</InputSizeContext.Provider>\n\t);\n}\n\nfunction useInputComponentSize(\n\tsize?: InputComponentSize | null,\n\tfallback: InputComponentSize = \"md\",\n) {\n\tconst inheritedSize = useContext(InputSizeContext);\n\treturn size ?? inheritedSize ?? fallback;\n}\n\nexport { InputSizeProvider, useInputComponentSize, type InputComponentSize };\n","\"use client\";\n\nimport { Popover as PopoverPrimitive } from \"@base-ui/react/popover\";\nimport type * as React from \"react\";\n\nimport { cn } from \"../../lib/cn\";\nimport { type ComponentSize, SizeProvider } from \"./size-context\";\n\nfunction Popover({ ...props }: PopoverPrimitive.Root.Props) {\n\treturn <PopoverPrimitive.Root data-slot=\"popover\" {...props} />;\n}\n\nfunction PopoverTrigger({ ...props }: PopoverPrimitive.Trigger.Props) {\n\treturn <PopoverPrimitive.Trigger data-slot=\"popover-trigger\" {...props} />;\n}\n\ntype PopoverContentProps = PopoverPrimitive.Popup.Props &\n\tPick<\n\t\tPopoverPrimitive.Positioner.Props,\n\t\t\"align\" | \"alignOffset\" | \"side\" | \"sideOffset\"\n\t> & {\n\t\tshowArrow?: boolean;\n\t\tsize?: ComponentSize;\n\t};\n\nfunction PopoverContent({\n\tclassName,\n\talign = \"center\",\n\talignOffset = 0,\n\tside = \"bottom\",\n\tsideOffset = 6,\n\tshowArrow = true,\n\tsize = \"md\",\n\tchildren,\n\t...props\n}: PopoverContentProps) {\n\treturn (\n\t\t<PopoverPrimitive.Portal>\n\t\t\t<PopoverPrimitive.Positioner\n\t\t\t\talign={align}\n\t\t\t\talignOffset={alignOffset}\n\t\t\t\tside={side}\n\t\t\t\tsideOffset={sideOffset}\n\t\t\t\tclassName=\"isolate z-50\"\n\t\t\t>\n\t\t\t\t<PopoverPrimitive.Popup\n\t\t\t\t\tdata-slot=\"popover-content\"\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"z-50 relative flex w-72 max-w-[calc(100vw-2rem)] origin-(--transform-origin) flex-col rounded-lg border-0 bg-surface-overlay py-4 text-gdt-sm text-fg-primary shadow-2 outline-hidden duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95 has-[&_[data-slot=popover-footer]]:pb-0\",\n\t\t\t\t\t\tclassName,\n\t\t\t\t\t)}\n\t\t\t\t\t{...props}\n\t\t\t\t>\n\t\t\t\t\t<SizeProvider size={size}>{children}</SizeProvider>\n\t\t\t\t\t{showArrow ? (\n\t\t\t\t\t\t<PopoverPrimitive.Arrow className=\"relative block w-3 h-1.5 overflow-clip data-[side=bottom]:top-[-6px] data-[side=left]:right-[-9px] data-[side=left]:rotate-90 data-[side=right]:left-[-9px] data-[side=right]:-rotate-90 data-[side=top]:bottom-[-6px] data-[side=top]:rotate-180 before:content-[''] before:absolute before:bottom-0 before:left-1/2 before:w-[calc(6px*sqrt(2))] before:h-[calc(6px*sqrt(2))] before:bg-surface-overlay before:border before:border-line before:[transform:translate(-50%,50%)_rotate(45deg)]\" />\n\t\t\t\t\t) : null}\n\t\t\t\t</PopoverPrimitive.Popup>\n\t\t\t</PopoverPrimitive.Positioner>\n\t\t</PopoverPrimitive.Portal>\n\t);\n}\n\nfunction PopoverHeader({\n\tclassName,\n\tborder,\n\t...props\n}: React.ComponentProps<\"div\"> & { border?: boolean }) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"popover-header\"\n\t\t\tclassName={cn(\n\t\t\t\t\"flex flex-col gap-0.5 px-4\",\n\t\t\t\tborder && \"border-b border-line-subtle pb-3\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction PopoverBody({ className, ...props }: React.ComponentProps<\"div\">) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"popover-body\"\n\t\t\tclassName={cn(\"px-4 py-2\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction PopoverFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"popover-footer\"\n\t\t\tclassName={cn(\n\t\t\t\t\"flex flex-row items-center gap-2 px-4 border-t border-line-subtle pt-3\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction PopoverTitle({ className, ...props }: PopoverPrimitive.Title.Props) {\n\treturn (\n\t\t<PopoverPrimitive.Title\n\t\t\tdata-slot=\"popover-title\"\n\t\t\tclassName={cn(\"text-gdt-sm font-semibold text-fg-primary\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction PopoverDescription({\n\tclassName,\n\t...props\n}: PopoverPrimitive.Description.Props) {\n\treturn (\n\t\t<PopoverPrimitive.Description\n\t\t\tdata-slot=\"popover-description\"\n\t\t\tclassName={cn(\"text-gdt-xs font-normal text-fg-secondary\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nexport {\n\tPopover,\n\tPopoverContent,\n\tPopoverDescription,\n\tPopoverHeader,\n\tPopoverTitle,\n\tPopoverTrigger,\n\tPopoverBody,\n\tPopoverFooter,\n};\n"],"mappings":"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","names":["jsx","cva","jsx","jsxs","jsx","cva","jsx","jsxs","cva","createContext","useContext","Fragment","jsx","useContext","jsx","cva","jsx","jsxs","jsx","jsxs"]}
1
+ {"version":3,"sources":["../src/rich-text-editor.tsx"],"sourcesContent":["\"use client\";\n\nimport { Color } from \"@tiptap/extension-color\";\nimport { Image } from \"@tiptap/extension-image\";\nimport { Placeholder } from \"@tiptap/extension-placeholder\";\nimport { TextAlign } from \"@tiptap/extension-text-align\";\nimport { TextStyle } from \"@tiptap/extension-text-style\";\nimport { EditorContent, useEditor, useEditorState } from \"@tiptap/react\";\nimport { StarterKit } from \"@tiptap/starter-kit\";\nimport {\n\tAlignCenter,\n\tAlignJustify,\n\tAlignLeft,\n\tAlignRight,\n\tBaseline,\n\tBold,\n\tChevronDown,\n\tCode2,\n\tImageIcon,\n\tItalic,\n\tLink2,\n\tList,\n\tListOrdered,\n\tQuote,\n\tRedo2,\n\tUnderline,\n\tUndo2,\n} from \"lucide-react\";\nimport * as React from \"react\";\nimport { Button } from \"./button\";\nimport {\n\tDropdownMenu,\n\tDropdownMenuContent,\n\tDropdownMenuRadioGroup,\n\tDropdownMenuRadioItem,\n\tDropdownMenuTrigger,\n} from \"./dropdown-menu\";\nimport { Input } from \"./input\";\nimport { cn } from \"./lib/cn\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"./popover\";\nimport { type ComponentSize, useComponentSize } from \"./size-context\";\n\n// ─── Size configuration ───────────────────────────────────────────────────────\n// Toolbar density, text scale and padding step together across the three sizes.\n\ninterface SizeTokens {\n\twidth: string;\n\tcontent: string;\n\tcontentPad: string;\n\ttext: string;\n\ticon: string;\n\tbutton: string;\n\ttoolbarPad: string;\n\ttoolbarGap: string;\n\tdivider: string;\n}\n\nconst SIZES: Record<ComponentSize, SizeTokens> = {\n\tsm: {\n\t\twidth: \"max-w-[420px]\",\n\t\tcontent: \"min-h-[140px]\",\n\t\tcontentPad: \"px-4 py-3\",\n\t\ttext: \"text-gdt-xs\",\n\t\ticon: \"[&_svg:not([class*='size-'])]:size-3.5\",\n\t\tbutton: \"h-7 min-w-7 px-1\",\n\t\ttoolbarPad: \"px-2 py-1.5\",\n\t\ttoolbarGap: \"gap-0.5\",\n\t\tdivider: \"h-4\",\n\t},\n\tmd: {\n\t\twidth: \"max-w-[520px]\",\n\t\tcontent: \"min-h-[172px]\",\n\t\tcontentPad: \"px-5 py-4\",\n\t\ttext: \"text-gdt-sm\",\n\t\ticon: \"[&_svg:not([class*='size-'])]:size-4\",\n\t\tbutton: \"h-8 min-w-8 px-1.5\",\n\t\ttoolbarPad: \"px-2.5 py-2\",\n\t\ttoolbarGap: \"gap-0.5\",\n\t\tdivider: \"h-5\",\n\t},\n\tlg: {\n\t\twidth: \"max-w-[600px]\",\n\t\tcontent: \"min-h-[206px]\",\n\t\tcontentPad: \"px-6 py-5\",\n\t\ttext: \"text-gdt-md\",\n\t\ticon: \"[&_svg:not([class*='size-'])]:size-[18px]\",\n\t\tbutton: \"h-9 min-w-9 px-2\",\n\t\ttoolbarPad: \"px-3 py-2.5\",\n\t\ttoolbarGap: \"gap-1\",\n\t\tdivider: \"h-6\",\n\t},\n};\n\n// Text-colour swatches. The first entry clears any applied colour.\nconst TEXT_COLORS = [\n\t{ label: \"Default\", value: \"\", swatch: \"\" },\n\t{ label: \"Forest\", value: \"#2f5a2c\", swatch: \"var(--color-forest-500)\" },\n\t{ label: \"Brass\", value: \"#b8861a\", swatch: \"var(--color-brass-400)\" },\n\t{ label: \"Clay\", value: \"#b2542b\", swatch: \"var(--color-clay-500)\" },\n\t{ label: \"Moss\", value: \"#4e4d29\", swatch: \"var(--color-moss-500)\" },\n\t{ label: \"Stone\", value: \"#5c5648\", swatch: \"var(--color-stone-600)\" },\n\t{ label: \"Ink\", value: \"#1f1c18\", swatch: \"var(--color-stone-900)\" },\n] as const;\n\nconst BLOCK_OPTIONS = [\n\t{ value: \"paragraph\", label: \"Normal\" },\n\t{ value: \"h1\", label: \"Heading 1\" },\n\t{ value: \"h2\", label: \"Heading 2\" },\n\t{ value: \"h3\", label: \"Heading 3\" },\n] as const;\n\ntype BlockValue = (typeof BLOCK_OPTIONS)[number][\"value\"];\ntype AlignValue = \"left\" | \"center\" | \"right\" | \"justify\";\n\n// ─── Shared toolbar primitives ──────────────────────────────────────────────────\n\nfunction toolbarControlClass(tokens: SizeTokens, active?: boolean) {\n\treturn cn(\n\t\t\"inline-flex shrink-0 cursor-pointer items-center justify-center rounded-md font-medium text-fg-secondary outline-none transition-colors select-none\",\n\t\t\"hover:bg-action-tertiary-hover hover:text-fg-primary\",\n\t\t\"focus-visible:ring-2 focus-visible:ring-line-focus\",\n\t\t\"disabled:pointer-events-none disabled:opacity-40 data-disabled:pointer-events-none data-disabled:opacity-40\",\n\t\ttokens.button,\n\t\ttokens.icon,\n\t\ttokens.text,\n\t\tactive &&\n\t\t\t\"bg-action-primary text-fg-on-brand hover:bg-action-primary-hover hover:text-fg-on-brand\",\n\t);\n}\n\ninterface ToolbarButtonProps {\n\ttokens: SizeTokens;\n\tlabel: string;\n\tactive?: boolean;\n\tdisabled?: boolean;\n\tonClick: () => void;\n\tchildren: React.ReactNode;\n}\n\nfunction ToolbarButton({\n\ttokens,\n\tlabel,\n\tactive,\n\tdisabled,\n\tonClick,\n\tchildren,\n}: ToolbarButtonProps) {\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\taria-label={label}\n\t\t\ttitle={label}\n\t\t\taria-pressed={active}\n\t\t\tdisabled={disabled}\n\t\t\t// Keep the editor selection intact when interacting with the toolbar.\n\t\t\tonMouseDown={(event) => event.preventDefault()}\n\t\t\tonClick={onClick}\n\t\t\tclassName={toolbarControlClass(tokens, active)}\n\t\t>\n\t\t\t{children}\n\t\t</button>\n\t);\n}\n\nfunction ToolbarDivider({ tokens }: { tokens: SizeTokens }) {\n\treturn (\n\t\t<span\n\t\t\taria-hidden=\"true\"\n\t\t\tclassName={cn(\"mx-1 w-px shrink-0 self-center bg-line\", tokens.divider)}\n\t\t/>\n\t);\n}\n\n// ─── Block / heading select ──────────────────────────────────────────────────────\n\nfunction BlockControl({\n\ttokens,\n\tvalue,\n\tdisabled,\n\tonChange,\n}: {\n\ttokens: SizeTokens;\n\tvalue: BlockValue;\n\tdisabled?: boolean;\n\tonChange: (value: BlockValue) => void;\n}) {\n\tconst current = BLOCK_OPTIONS.find((option) => option.value === value);\n\n\treturn (\n\t\t<DropdownMenu>\n\t\t\t{/* No mousedown-preventDefault here: base-ui menus track the pointer\n\t\t\t press, and cancelling it strands the popup's inert backdrop. The\n\t\t\t block commands re-focus the editor themselves. */}\n\t\t\t<DropdownMenuTrigger\n\t\t\t\tdisabled={disabled}\n\t\t\t\tclassName={cn(\n\t\t\t\t\ttoolbarControlClass(tokens),\n\t\t\t\t\t\"w-auto justify-between gap-1 px-2\",\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<span className=\"whitespace-nowrap\">{current?.label ?? \"Normal\"}</span>\n\t\t\t\t<ChevronDown className=\"size-3.5 opacity-70\" />\n\t\t\t</DropdownMenuTrigger>\n\t\t\t<DropdownMenuContent className=\"min-w-40\">\n\t\t\t\t<DropdownMenuRadioGroup\n\t\t\t\t\tvalue={value}\n\t\t\t\t\tonValueChange={(next) => onChange(next as BlockValue)}\n\t\t\t\t>\n\t\t\t\t\t{BLOCK_OPTIONS.map((option) => (\n\t\t\t\t\t\t// closeOnClick: radio items keep the menu open by default, which\n\t\t\t\t\t\t// leaves the popup backdrop blocking the toolbar after a pick.\n\t\t\t\t\t\t<DropdownMenuRadioItem\n\t\t\t\t\t\t\tkey={option.value}\n\t\t\t\t\t\t\tvalue={option.value}\n\t\t\t\t\t\t\tcloseOnClick\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{option.label}\n\t\t\t\t\t\t</DropdownMenuRadioItem>\n\t\t\t\t\t))}\n\t\t\t\t</DropdownMenuRadioGroup>\n\t\t\t</DropdownMenuContent>\n\t\t</DropdownMenu>\n\t);\n}\n\n// ─── Text-colour popover ─────────────────────────────────────────────────────────\n\nfunction ColorControl({\n\ttokens,\n\tvalue,\n\tdisabled,\n\tonChange,\n}: {\n\ttokens: SizeTokens;\n\tvalue: string;\n\tdisabled?: boolean;\n\tonChange: (value: string) => void;\n}) {\n\tconst [open, setOpen] = React.useState(false);\n\tconst active = value !== \"\";\n\n\treturn (\n\t\t<Popover open={open} onOpenChange={setOpen}>\n\t\t\t<PopoverTrigger\n\t\t\t\tdisabled={disabled}\n\t\t\t\taria-label=\"Text colour\"\n\t\t\t\ttitle=\"Text colour\"\n\t\t\t\tonMouseDown={(event) => event.preventDefault()}\n\t\t\t\tclassName={toolbarControlClass(tokens, false)}\n\t\t\t>\n\t\t\t\t<span className=\"relative inline-flex flex-col items-center\">\n\t\t\t\t\t<Baseline className={active ? \"text-fg-brand\" : undefined} />\n\t\t\t\t\t<span\n\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\tclassName=\"mt-px h-0.5 w-3 rounded-full\"\n\t\t\t\t\t\tstyle={{ backgroundColor: active ? value : \"currentColor\" }}\n\t\t\t\t\t/>\n\t\t\t\t</span>\n\t\t\t</PopoverTrigger>\n\t\t\t<PopoverContent\n\t\t\t\tshowArrow={false}\n\t\t\t\talign=\"start\"\n\t\t\t\tsideOffset={8}\n\t\t\t\tclassName=\"w-auto py-3\"\n\t\t\t>\n\t\t\t\t<div className=\"grid grid-cols-4 gap-2 px-4\">\n\t\t\t\t\t{TEXT_COLORS.map((color) => {\n\t\t\t\t\t\tconst isSelected = color.value === value;\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\tkey={color.label}\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\ttitle={color.label}\n\t\t\t\t\t\t\t\taria-label={color.label}\n\t\t\t\t\t\t\t\taria-pressed={isSelected}\n\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\tonChange(color.value);\n\t\t\t\t\t\t\t\t\tsetOpen(false);\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\"flex size-7 items-center justify-center rounded-full border transition-[box-shadow,border-color] outline-none\",\n\t\t\t\t\t\t\t\t\t\"hover:border-line-strong focus-visible:ring-2 focus-visible:ring-line-focus\",\n\t\t\t\t\t\t\t\t\tisSelected\n\t\t\t\t\t\t\t\t\t\t? \"border-line-focus ring-2 ring-line-focus/40\"\n\t\t\t\t\t\t\t\t\t\t: \"border-line\",\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\"flex size-5 items-center justify-center rounded-full text-gdt-xs font-bold\",\n\t\t\t\t\t\t\t\t\t\tcolor.value === \"\" && \"text-fg-secondary\",\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\tstyle={\n\t\t\t\t\t\t\t\t\t\tcolor.value\n\t\t\t\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\t\t\t\tbackgroundColor: color.swatch,\n\t\t\t\t\t\t\t\t\t\t\t\t\tcolor: \"var(--color-stone-0, #fff)\",\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\tA\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t);\n\t\t\t\t\t})}\n\t\t\t\t</div>\n\t\t\t</PopoverContent>\n\t\t</Popover>\n\t);\n}\n\n// ─── Link popover ────────────────────────────────────────────────────────────────\n\nfunction LinkControl({\n\ttokens,\n\tactive,\n\tcurrentHref,\n\tdisabled,\n\tonApply,\n\tonRemove,\n}: {\n\ttokens: SizeTokens;\n\tactive: boolean;\n\tcurrentHref: string;\n\tdisabled?: boolean;\n\tonApply: (href: string) => void;\n\tonRemove: () => void;\n}) {\n\tconst [open, setOpen] = React.useState(false);\n\tconst [href, setHref] = React.useState(\"\");\n\n\tfunction handleOpenChange(next: boolean) {\n\t\tif (next) setHref(currentHref);\n\t\tsetOpen(next);\n\t}\n\n\tfunction handleSubmit(event: React.FormEvent) {\n\t\tevent.preventDefault();\n\t\tconst trimmed = href.trim();\n\t\tif (trimmed) onApply(trimmed);\n\t\telse onRemove();\n\t\tsetOpen(false);\n\t}\n\n\treturn (\n\t\t<Popover open={open} onOpenChange={handleOpenChange}>\n\t\t\t<PopoverTrigger\n\t\t\t\tdisabled={disabled}\n\t\t\t\taria-label=\"Insert link\"\n\t\t\t\ttitle=\"Insert link\"\n\t\t\t\taria-pressed={active}\n\t\t\t\tonMouseDown={(event) => event.preventDefault()}\n\t\t\t\tclassName={toolbarControlClass(tokens, active)}\n\t\t\t>\n\t\t\t\t<Link2 />\n\t\t\t</PopoverTrigger>\n\t\t\t<PopoverContent showArrow={false} align=\"start\" sideOffset={8}>\n\t\t\t\t<form className=\"flex flex-col gap-3 px-4\" onSubmit={handleSubmit}>\n\t\t\t\t\t<Input\n\t\t\t\t\t\tautoFocus\n\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\ttype=\"url\"\n\t\t\t\t\t\tplaceholder=\"https://example.com\"\n\t\t\t\t\t\tvalue={href}\n\t\t\t\t\t\tonChange={(event) => setHref(event.target.value)}\n\t\t\t\t\t/>\n\t\t\t\t\t<div className=\"flex items-center justify-between gap-2\">\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tvariant=\"tertiary-outline\"\n\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\tdisabled={!active}\n\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\tonRemove();\n\t\t\t\t\t\t\t\tsetOpen(false);\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tRemove\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t<Button type=\"submit\" size=\"sm\">\n\t\t\t\t\t\t\tApply\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</div>\n\t\t\t\t</form>\n\t\t\t</PopoverContent>\n\t\t</Popover>\n\t);\n}\n\n// ─── Image popover ───────────────────────────────────────────────────────────────\n\nfunction ImageControl({\n\ttokens,\n\tdisabled,\n\tonInsert,\n}: {\n\ttokens: SizeTokens;\n\tdisabled?: boolean;\n\tonInsert: (src: string) => void;\n}) {\n\tconst [open, setOpen] = React.useState(false);\n\tconst [src, setSrc] = React.useState(\"\");\n\n\tfunction handleOpenChange(next: boolean) {\n\t\tif (next) setSrc(\"\");\n\t\tsetOpen(next);\n\t}\n\n\tfunction handleSubmit(event: React.FormEvent) {\n\t\tevent.preventDefault();\n\t\tconst trimmed = src.trim();\n\t\tif (trimmed) onInsert(trimmed);\n\t\tsetOpen(false);\n\t}\n\n\treturn (\n\t\t<Popover open={open} onOpenChange={handleOpenChange}>\n\t\t\t<PopoverTrigger\n\t\t\t\tdisabled={disabled}\n\t\t\t\taria-label=\"Insert image\"\n\t\t\t\ttitle=\"Insert image\"\n\t\t\t\tonMouseDown={(event) => event.preventDefault()}\n\t\t\t\tclassName={toolbarControlClass(tokens, false)}\n\t\t\t>\n\t\t\t\t<ImageIcon />\n\t\t\t</PopoverTrigger>\n\t\t\t<PopoverContent showArrow={false} align=\"start\" sideOffset={8}>\n\t\t\t\t<form className=\"flex flex-col gap-3 px-4\" onSubmit={handleSubmit}>\n\t\t\t\t\t<Input\n\t\t\t\t\t\tautoFocus\n\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\ttype=\"url\"\n\t\t\t\t\t\tplaceholder=\"https://example.com/image.jpg\"\n\t\t\t\t\t\tvalue={src}\n\t\t\t\t\t\tonChange={(event) => setSrc(event.target.value)}\n\t\t\t\t\t/>\n\t\t\t\t\t<div className=\"flex items-center justify-end\">\n\t\t\t\t\t\t<Button type=\"submit\" size=\"sm\" disabled={!src.trim()}>\n\t\t\t\t\t\t\tInsert\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</div>\n\t\t\t\t</form>\n\t\t\t</PopoverContent>\n\t\t</Popover>\n\t);\n}\n\n// ─── Alignment dropdown ──────────────────────────────────────────────────────────\n\nconst ALIGN_OPTIONS = [\n\t{ value: \"left\", label: \"Left\", Icon: AlignLeft },\n\t{ value: \"center\", label: \"Center\", Icon: AlignCenter },\n\t{ value: \"right\", label: \"Right\", Icon: AlignRight },\n\t{ value: \"justify\", label: \"Justify\", Icon: AlignJustify },\n] as const;\n\nfunction AlignControl({\n\ttokens,\n\tvalue,\n\tdisabled,\n\tonChange,\n}: {\n\ttokens: SizeTokens;\n\tvalue: AlignValue;\n\tdisabled?: boolean;\n\tonChange: (value: AlignValue) => void;\n}) {\n\tconst current = ALIGN_OPTIONS.find((option) => option.value === value);\n\tconst Icon = current?.Icon ?? AlignLeft;\n\n\treturn (\n\t\t<DropdownMenu>\n\t\t\t<DropdownMenuTrigger\n\t\t\t\tdisabled={disabled}\n\t\t\t\taria-label=\"Text alignment\"\n\t\t\t\ttitle=\"Text alignment\"\n\t\t\t\tclassName={toolbarControlClass(tokens, value !== \"left\")}\n\t\t\t>\n\t\t\t\t<Icon />\n\t\t\t</DropdownMenuTrigger>\n\t\t\t<DropdownMenuContent className=\"min-w-36\">\n\t\t\t\t<DropdownMenuRadioGroup\n\t\t\t\t\tvalue={value}\n\t\t\t\t\tonValueChange={(next) => onChange(next as AlignValue)}\n\t\t\t\t>\n\t\t\t\t\t{ALIGN_OPTIONS.map(\n\t\t\t\t\t\t({ value: optionValue, label, Icon: OptionIcon }) => (\n\t\t\t\t\t\t\t<DropdownMenuRadioItem\n\t\t\t\t\t\t\t\tkey={optionValue}\n\t\t\t\t\t\t\t\tvalue={optionValue}\n\t\t\t\t\t\t\t\tcloseOnClick\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<OptionIcon />\n\t\t\t\t\t\t\t\t{label}\n\t\t\t\t\t\t\t</DropdownMenuRadioItem>\n\t\t\t\t\t\t),\n\t\t\t\t\t)}\n\t\t\t\t</DropdownMenuRadioGroup>\n\t\t\t</DropdownMenuContent>\n\t\t</DropdownMenu>\n\t);\n}\n\n// ─── RichTextEditor ──────────────────────────────────────────────────────────────\n\ninterface RichTextEditorProps {\n\tvalue?: string;\n\tdefaultValue?: string;\n\tonChange?: (html: string) => void;\n\tsize?: ComponentSize;\n\tplaceholder?: string;\n\tdisabled?: boolean;\n\tclassName?: string;\n\t\"aria-label\"?: string;\n}\n\nconst EMPTY_STATE = {\n\tblock: \"paragraph\" as BlockValue,\n\talign: \"left\" as AlignValue,\n\tcolor: \"\",\n\tlinkHref: \"\",\n\tisBold: false,\n\tisItalic: false,\n\tisUnderline: false,\n\tisBulletList: false,\n\tisOrderedList: false,\n\tisBlockquote: false,\n\tisCodeBlock: false,\n\tisLink: false,\n\tcanUndo: false,\n\tcanRedo: false,\n};\n\nfunction RichTextEditor({\n\tvalue,\n\tdefaultValue,\n\tonChange,\n\tsize,\n\tplaceholder = \"Start writing, or paste your content here. Format text and add lists, links, and images using the toolbar above.\",\n\tdisabled = false,\n\tclassName,\n\t\"aria-label\": ariaLabel = \"Rich text editor\",\n}: RichTextEditorProps) {\n\tconst resolvedSize = useComponentSize(size);\n\tconst tokens = SIZES[resolvedSize];\n\tconst [focused, setFocused] = React.useState(false);\n\n\tconst editor = useEditor({\n\t\timmediatelyRender: false,\n\t\teditable: !disabled,\n\t\tcontent: value ?? defaultValue ?? \"\",\n\t\textensions: [\n\t\t\tStarterKit.configure({\n\t\t\t\tlink: {\n\t\t\t\t\topenOnClick: false,\n\t\t\t\t\tHTMLAttributes: { rel: \"noopener noreferrer nofollow\" },\n\t\t\t\t},\n\t\t\t}),\n\t\t\tTextStyle,\n\t\t\tColor,\n\t\t\tTextAlign.configure({ types: [\"heading\", \"paragraph\"] }),\n\t\t\tImage.configure({ inline: false, allowBase64: true }),\n\t\t\tPlaceholder.configure({ placeholder }),\n\t\t],\n\t\teditorProps: {\n\t\t\tattributes: {\n\t\t\t\t\"aria-label\": ariaLabel,\n\t\t\t\trole: \"textbox\",\n\t\t\t\t\"aria-multiline\": \"true\",\n\t\t\t\tclass: cn(\"tiptap focus:outline-none\", tokens.text),\n\t\t\t},\n\t\t},\n\t\tonFocus: () => setFocused(true),\n\t\tonBlur: () => setFocused(false),\n\t\tonUpdate: ({ editor: instance }) => onChange?.(instance.getHTML()),\n\t});\n\n\t// Keep editability in sync with the disabled prop.\n\tReact.useEffect(() => {\n\t\teditor?.setEditable(!disabled);\n\t}, [editor, disabled]);\n\n\t// Sync external (controlled) value changes without disturbing the cursor.\n\tReact.useEffect(() => {\n\t\tif (!editor || value === undefined) return;\n\t\tif (value !== editor.getHTML()) {\n\t\t\teditor.commands.setContent(value, { emitUpdate: false });\n\t\t}\n\t}, [editor, value]);\n\n\tconst state = useEditorState({\n\t\teditor,\n\t\tselector: ({ editor: instance }) => {\n\t\t\tif (!instance) return EMPTY_STATE;\n\t\t\tconst block: BlockValue = instance.isActive(\"heading\", { level: 1 })\n\t\t\t\t? \"h1\"\n\t\t\t\t: instance.isActive(\"heading\", { level: 2 })\n\t\t\t\t\t? \"h2\"\n\t\t\t\t\t: instance.isActive(\"heading\", { level: 3 })\n\t\t\t\t\t\t? \"h3\"\n\t\t\t\t\t\t: \"paragraph\";\n\t\t\tconst align: AlignValue = instance.isActive({ textAlign: \"center\" })\n\t\t\t\t? \"center\"\n\t\t\t\t: instance.isActive({ textAlign: \"right\" })\n\t\t\t\t\t? \"right\"\n\t\t\t\t\t: instance.isActive({ textAlign: \"justify\" })\n\t\t\t\t\t\t? \"justify\"\n\t\t\t\t\t\t: \"left\";\n\t\t\treturn {\n\t\t\t\tblock,\n\t\t\t\talign,\n\t\t\t\tcolor: (instance.getAttributes(\"textStyle\").color as string) ?? \"\",\n\t\t\t\tlinkHref: (instance.getAttributes(\"link\").href as string) ?? \"\",\n\t\t\t\tisBold: instance.isActive(\"bold\"),\n\t\t\t\tisItalic: instance.isActive(\"italic\"),\n\t\t\t\tisUnderline: instance.isActive(\"underline\"),\n\t\t\t\tisBulletList: instance.isActive(\"bulletList\"),\n\t\t\t\tisOrderedList: instance.isActive(\"orderedList\"),\n\t\t\t\tisBlockquote: instance.isActive(\"blockquote\"),\n\t\t\t\tisCodeBlock: instance.isActive(\"codeBlock\"),\n\t\t\t\tisLink: instance.isActive(\"link\"),\n\t\t\t\tcanUndo: instance.can().undo(),\n\t\t\t\tcanRedo: instance.can().redo(),\n\t\t\t};\n\t\t},\n\t});\n\n\tconst s = state ?? EMPTY_STATE;\n\n\tfunction setBlock(next: BlockValue) {\n\t\tif (!editor) return;\n\t\tconst chain = editor.chain().focus();\n\t\tif (next === \"paragraph\") chain.setParagraph().run();\n\t\telse chain.toggleHeading({ level: Number(next[1]) as 1 | 2 | 3 }).run();\n\t}\n\n\tfunction setAlign(next: AlignValue) {\n\t\teditor?.chain().focus().setTextAlign(next).run();\n\t}\n\n\tfunction setColor(next: string) {\n\t\tif (!editor) return;\n\t\tif (next) editor.chain().focus().setColor(next).run();\n\t\telse editor.chain().focus().unsetColor().run();\n\t}\n\n\tfunction applyLink(href: string) {\n\t\teditor?.chain().focus().extendMarkRange(\"link\").setLink({ href }).run();\n\t}\n\n\tfunction removeLink() {\n\t\teditor?.chain().focus().extendMarkRange(\"link\").unsetLink().run();\n\t}\n\n\tfunction insertImage(src: string) {\n\t\teditor?.chain().focus().setImage({ src }).run();\n\t}\n\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"rich-text-editor\"\n\t\t\tdata-disabled={disabled || undefined}\n\t\t\tdata-focused={focused || undefined}\n\t\t\tclassName={cn(\n\t\t\t\t\"group/editor flex w-full flex-col overflow-hidden rounded-2xl border bg-surface text-fg-primary shadow-1 transition-[border-color,box-shadow]\",\n\t\t\t\tdisabled\n\t\t\t\t\t? \"border-line-subtle opacity-60\"\n\t\t\t\t\t: focused\n\t\t\t\t\t\t? \"border-line-focus ring-2 ring-line-focus/35\"\n\t\t\t\t\t\t: \"border-line hover:border-line-strong\",\n\t\t\t\ttokens.width,\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t{/* Toolbar — raised strip holding all formatting controls */}\n\t\t\t<div\n\t\t\t\trole=\"toolbar\"\n\t\t\t\taria-label=\"Formatting\"\n\t\t\t\taria-orientation=\"horizontal\"\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"flex flex-wrap items-center bg-surface-raised\",\n\t\t\t\t\ttokens.toolbarPad,\n\t\t\t\t\ttokens.toolbarGap,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<BlockControl\n\t\t\t\t\ttokens={tokens}\n\t\t\t\t\tvalue={s.block}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tonChange={setBlock}\n\t\t\t\t/>\n\t\t\t\t<ToolbarButton\n\t\t\t\t\ttokens={tokens}\n\t\t\t\t\tlabel=\"Bold\"\n\t\t\t\t\tactive={s.isBold}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tonClick={() => editor?.chain().focus().toggleBold().run()}\n\t\t\t\t>\n\t\t\t\t\t<Bold />\n\t\t\t\t</ToolbarButton>\n\t\t\t\t<ToolbarButton\n\t\t\t\t\ttokens={tokens}\n\t\t\t\t\tlabel=\"Italic\"\n\t\t\t\t\tactive={s.isItalic}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tonClick={() => editor?.chain().focus().toggleItalic().run()}\n\t\t\t\t>\n\t\t\t\t\t<Italic />\n\t\t\t\t</ToolbarButton>\n\t\t\t\t<ToolbarButton\n\t\t\t\t\ttokens={tokens}\n\t\t\t\t\tlabel=\"Underline\"\n\t\t\t\t\tactive={s.isUnderline}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tonClick={() => editor?.chain().focus().toggleUnderline().run()}\n\t\t\t\t>\n\t\t\t\t\t<Underline />\n\t\t\t\t</ToolbarButton>\n\t\t\t\t<ColorControl\n\t\t\t\t\ttokens={tokens}\n\t\t\t\t\tvalue={s.color}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tonChange={setColor}\n\t\t\t\t/>\n\n\t\t\t\t<ToolbarDivider tokens={tokens} />\n\n\t\t\t\t<ToolbarButton\n\t\t\t\t\ttokens={tokens}\n\t\t\t\t\tlabel=\"Numbered list\"\n\t\t\t\t\tactive={s.isOrderedList}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tonClick={() => editor?.chain().focus().toggleOrderedList().run()}\n\t\t\t\t>\n\t\t\t\t\t<ListOrdered />\n\t\t\t\t</ToolbarButton>\n\t\t\t\t<ToolbarButton\n\t\t\t\t\ttokens={tokens}\n\t\t\t\t\tlabel=\"Bullet list\"\n\t\t\t\t\tactive={s.isBulletList}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tonClick={() => editor?.chain().focus().toggleBulletList().run()}\n\t\t\t\t>\n\t\t\t\t\t<List />\n\t\t\t\t</ToolbarButton>\n\t\t\t\t<AlignControl\n\t\t\t\t\ttokens={tokens}\n\t\t\t\t\tvalue={s.align}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tonChange={setAlign}\n\t\t\t\t/>\n\n\t\t\t\t<ToolbarDivider tokens={tokens} />\n\n\t\t\t\t<LinkControl\n\t\t\t\t\ttokens={tokens}\n\t\t\t\t\tactive={s.isLink}\n\t\t\t\t\tcurrentHref={s.linkHref}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tonApply={applyLink}\n\t\t\t\t\tonRemove={removeLink}\n\t\t\t\t/>\n\t\t\t\t<ToolbarButton\n\t\t\t\t\ttokens={tokens}\n\t\t\t\t\tlabel=\"Quote\"\n\t\t\t\t\tactive={s.isBlockquote}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tonClick={() => editor?.chain().focus().toggleBlockquote().run()}\n\t\t\t\t>\n\t\t\t\t\t<Quote />\n\t\t\t\t</ToolbarButton>\n\t\t\t\t<ToolbarButton\n\t\t\t\t\ttokens={tokens}\n\t\t\t\t\tlabel=\"Code block\"\n\t\t\t\t\tactive={s.isCodeBlock}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tonClick={() => editor?.chain().focus().toggleCodeBlock().run()}\n\t\t\t\t>\n\t\t\t\t\t<Code2 />\n\t\t\t\t</ToolbarButton>\n\t\t\t\t<ImageControl\n\t\t\t\t\ttokens={tokens}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tonInsert={insertImage}\n\t\t\t\t/>\n\n\t\t\t\t<ToolbarDivider tokens={tokens} />\n\n\t\t\t\t<ToolbarButton\n\t\t\t\t\ttokens={tokens}\n\t\t\t\t\tlabel=\"Undo\"\n\t\t\t\t\tdisabled={disabled || !s.canUndo}\n\t\t\t\t\tonClick={() => editor?.chain().focus().undo().run()}\n\t\t\t\t>\n\t\t\t\t\t<Undo2 />\n\t\t\t\t</ToolbarButton>\n\t\t\t\t<ToolbarButton\n\t\t\t\t\ttokens={tokens}\n\t\t\t\t\tlabel=\"Redo\"\n\t\t\t\t\tdisabled={disabled || !s.canRedo}\n\t\t\t\t\tonClick={() => editor?.chain().focus().redo().run()}\n\t\t\t\t>\n\t\t\t\t\t<Redo2 />\n\t\t\t\t</ToolbarButton>\n\t\t\t</div>\n\n\t\t\t{/* Divider — border-subtle line separating the toolbar from the content */}\n\t\t\t<div className=\"h-px w-full shrink-0 bg-line-subtle\" />\n\n\t\t\t{/* Content area — editable surface */}\n\t\t\t<EditorContent\n\t\t\t\teditor={editor}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"gdt-rich-text min-w-0 flex-1 overflow-y-auto\",\n\t\t\t\t\ttokens.content,\n\t\t\t\t\ttokens.contentPad,\n\t\t\t\t)}\n\t\t\t/>\n\t\t</div>\n\t);\n}\n\nexport { RichTextEditor };\nexport type { RichTextEditorProps };\n"],"mappings":"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","names":[]}
@@ -0,0 +1,142 @@
1
+ import * as React from 'react';
2
+ import { ScatterChart as ScatterChart$1, CartesianGrid, Scatter, XAxis, YAxis } from 'recharts';
3
+ import { Payload } from 'recharts/types/component/DefaultTooltipContent';
4
+ import { ChartConfig } from './chart.js';
5
+ import { ComponentSize } from './size-context.js';
6
+ import 'class-variance-authority/types';
7
+ import 'class-variance-authority';
8
+
9
+ /**
10
+ * Scatter charts are composable wrappers over the recharts cartesian
11
+ * primitives. recharts 3 registers graphical items through context when they
12
+ * render, so the primitives CAN be wrapped in our own components. Each
13
+ * wrapper bakes in the giddaa defaults (tokens, size-scaled type, mark specs)
14
+ * and forwards every recharts prop, so anything can be overridden in place or
15
+ * replaced with the raw recharts element.
16
+ *
17
+ * Anatomy: `ScatterChart` is the plot root (frame + responsive box + recharts
18
+ * chart); compose the grid, axes, series, and the shared overlays from
19
+ * `./chart` as children. Unlike `BarChart`/`RadarChart`, each series carries
20
+ * its own `data` (an array of `{ x, y }` pairs) rather than sharing one row
21
+ * per category.
22
+ *
23
+ * @example
24
+ * <ChartCard size="md">
25
+ * <ChartHeader>
26
+ * <ChartTitle>Price vs. size</ChartTitle>
27
+ * <ChartDescription>Lekki listings · ₦m by sqm</ChartDescription>
28
+ * </ChartHeader>
29
+ * <ScatterChart config={config}>
30
+ * <ScatterChartGrid />
31
+ * <ScatterChartXAxis dataKey="size" name="Size" unit="sqm" />
32
+ * <ScatterChartYAxis dataKey="price" name="Price" unit="₦m" />
33
+ * <ChartTooltip content={<ScatterChartTooltipContent />} />
34
+ * <ScatterChartSeries data={data} name="Lekki" />
35
+ * </ScatterChart>
36
+ * </ChartCard>
37
+ */
38
+ /**
39
+ * Categorical series palette — the theme-aware `chart-1`…`chart-3` tokens.
40
+ * Assign colours in this fixed order, never cycled: a fourth series folds into
41
+ * "Other" or becomes a second chart.
42
+ */
43
+ declare const SCATTER_CHART_PALETTE: readonly ["var(--color-chart-1)", "var(--color-chart-2)", "var(--color-chart-3)"];
44
+ type ScatterChartLayout = {
45
+ /** Plot height in px. Width stays fluid via the ResponsiveContainer. */
46
+ height: number;
47
+ /** Outer margin around the plot. */
48
+ margin: {
49
+ top: number;
50
+ right: number;
51
+ bottom: number;
52
+ left: number;
53
+ };
54
+ /** Axis tick label font size. */
55
+ tickFontSize: number;
56
+ /** Space between an axis and its tick labels. */
57
+ tickMargin: number;
58
+ /** Reserved width for the value axis. */
59
+ yAxisWidth: number;
60
+ /** Radius of a resting point, in px (r ≥ 4 keeps the ≥8px marker floor). */
61
+ dotRadius: number;
62
+ /** Radius of the active (hover) point. */
63
+ activeDotRadius: number;
64
+ };
65
+ declare const SCATTER_CHART_LAYOUT: Record<ComponentSize, ScatterChartLayout>;
66
+ type ScatterChartProps = Omit<React.ComponentProps<typeof ScatterChart$1>, "width" | "height"> & {
67
+ /** Series labels/icons for the shared tooltip and legend (see `ChartConfig`). */
68
+ config?: ChartConfig;
69
+ /** Plot scale; inherited from the nearest `SizeProvider` when omitted. */
70
+ size?: ComponentSize;
71
+ /** Applied to the responsive plot box, e.g. to override its height. */
72
+ className?: string;
73
+ };
74
+ /**
75
+ * Plot root — wraps the shared `ChartContainer` (tooltip/legend theming,
76
+ * responsive box) around the recharts `ScatterChart` with a size-scaled
77
+ * height and margin. `size` also flows to the child primitives through
78
+ * `SizeProvider`. Extra props reach the recharts chart (`data`, `syncId`,
79
+ * `margin`, …).
80
+ */
81
+ declare function ScatterChart({ config, size, className, children, ...props }: ScatterChartProps): React.JSX.Element;
82
+ type ScatterChartGridProps = React.ComponentProps<typeof CartesianGrid>;
83
+ /**
84
+ * Value reference lines — recharts `CartesianGrid` painted with the `line`
85
+ * token (`line-subtle` matches the chart card surface in both themes, so it
86
+ * would vanish). Both axes are quantitative in a scatter plot, so horizontal
87
+ * and vertical lines render by default; pass `vertical={false}` to thin it out.
88
+ */
89
+ declare function ScatterChartGrid(props: ScatterChartGridProps): React.JSX.Element;
90
+ type ScatterChartXAxisProps = React.ComponentProps<typeof XAxis> & {
91
+ /** Explicit axis scale; otherwise inherited from the chart's `size`. */
92
+ size?: ComponentSize;
93
+ };
94
+ /**
95
+ * Value axis — recharts `XAxis` defaulting to `type="number"` (a scatter axis
96
+ * is continuous, not categorical), with no axis/tick lines, size-scaled tick
97
+ * margin, and caption-placeholder tick ink. Pass `name`/`unit` to label this
98
+ * axis in the tooltip. Passing your own `tick` replaces the default styling
99
+ * entirely.
100
+ */
101
+ declare function ScatterChartXAxis({ size, type, tick, ...props }: ScatterChartXAxisProps): React.JSX.Element;
102
+ type ScatterChartYAxisProps = React.ComponentProps<typeof YAxis> & {
103
+ /** Explicit axis scale; otherwise inherited from the chart's `size`. */
104
+ size?: ComponentSize;
105
+ };
106
+ /**
107
+ * Value axis — recharts `YAxis` defaulting to `type="number"`, with no
108
+ * axis/tick lines, size-scaled tick type, and reserved width for value
109
+ * labels. Pass `name`/`unit` to label this axis in the tooltip. Override
110
+ * `width` for long tick labels.
111
+ */
112
+ declare function ScatterChartYAxis({ size, type, tick, ...props }: ScatterChartYAxisProps): React.JSX.Element;
113
+ type ScatterChartTooltipContentProps = {
114
+ active?: boolean;
115
+ payload?: ReadonlyArray<Payload<string | number, string | number>>;
116
+ className?: string;
117
+ };
118
+ /**
119
+ * Hover tooltip for a scatter point. Unlike the shared `ChartTooltipContent`
120
+ * (built for a single hero value), a scatter point carries one value per
121
+ * axis, so this lists every axis entry — each labelled by its `XAxis`/
122
+ * `YAxis` `name` and `unit` — under one series dot, on the same elevated
123
+ * overlay (bg-surface-overlay, shadow-2, border-subtle) as the rest of the
124
+ * chart library.
125
+ */
126
+ declare function ScatterChartTooltipContent({ active, payload, className, }: ScatterChartTooltipContentProps): React.JSX.Element | null;
127
+ type ScatterChartSeriesProps = React.ComponentProps<typeof Scatter> & {
128
+ /** Series colour for the points. Defaults to the first categorical chart token. */
129
+ color?: string;
130
+ /** Explicit mark scale; otherwise inherited from the chart's `size`. */
131
+ size?: ComponentSize;
132
+ };
133
+ /**
134
+ * One data series — recharts `Scatter` with the giddaa mark spec: solid
135
+ * resting points at a size-scaled radius (r ≥ 4, the ≥8px marker floor) and a
136
+ * larger active point ringed in `surface-raised` so overlapping series stay
137
+ * separable. `color` drives both shapes at once; `shape`/`activeShape` still
138
+ * win when passed directly.
139
+ */
140
+ declare function ScatterChartSeries({ color, size, shape, activeShape, ...props }: ScatterChartSeriesProps): React.JSX.Element;
141
+
142
+ export { SCATTER_CHART_LAYOUT, SCATTER_CHART_PALETTE, ScatterChart, ScatterChartGrid, type ScatterChartGridProps, type ScatterChartLayout, type ScatterChartProps, ScatterChartSeries, type ScatterChartSeriesProps, ScatterChartTooltipContent, type ScatterChartTooltipContentProps, ScatterChartXAxis, type ScatterChartXAxisProps, ScatterChartYAxis, type ScatterChartYAxisProps };