@flikk/ui 1.0.0-beta.31 → 1.0.0-beta.32

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 (428) hide show
  1. package/CHANGELOG.md +295 -22
  2. package/dist/components/ai/AgentRequest/AgentRequest.animations.d.ts +25 -0
  3. package/dist/components/ai/AgentRequest/AgentRequest.animations.js +81 -0
  4. package/dist/components/ai/AgentRequest/AgentRequest.d.ts +3 -0
  5. package/dist/components/ai/AgentRequest/AgentRequest.js +435 -0
  6. package/dist/components/ai/AgentRequest/AgentRequest.theme.d.ts +2 -0
  7. package/dist/components/ai/AgentRequest/AgentRequest.theme.js +106 -0
  8. package/dist/components/ai/AgentRequest/AgentRequest.types.d.ts +241 -0
  9. package/dist/components/ai/AgentRequest/index.d.ts +3 -0
  10. package/dist/components/ai/CodeBlock/CodeBlock.theme.js +1 -1
  11. package/dist/components/ai/PromptInput/PromptInput.js +2 -2
  12. package/dist/components/ai/PromptInput/PromptInput.theme.js +2 -2
  13. package/dist/components/ai/PromptSuggestion/PromptSuggestion.theme.js +2 -2
  14. package/dist/components/ai/Reasoning/Reasoning.js +27 -3
  15. package/dist/components/ai/Reasoning/Reasoning.theme.d.ts +6 -0
  16. package/dist/components/ai/Reasoning/Reasoning.theme.js +36 -0
  17. package/dist/components/ai/Reasoning/Reasoning.types.d.ts +58 -5
  18. package/dist/components/ai/Reasoning/ReasoningTrace.d.ts +11 -0
  19. package/dist/components/ai/Reasoning/ReasoningTrace.js +84 -0
  20. package/dist/components/ai/Reasoning/index.d.ts +2 -1
  21. package/dist/components/ai/StreamingResponse/AnimatedText.d.ts +7 -0
  22. package/dist/components/ai/StreamingResponse/AnimatedText.js +8 -7
  23. package/dist/components/ai/StreamingResponse/MarkdownRenderer.d.ts +5 -0
  24. package/dist/components/ai/StreamingResponse/MarkdownRenderer.js +4 -4
  25. package/dist/components/ai/StreamingResponse/StreamingCursor.d.ts +2 -2
  26. package/dist/components/ai/StreamingResponse/StreamingCursor.js +10 -7
  27. package/dist/components/ai/StreamingResponse/StreamingResponse.animations.d.ts +10 -0
  28. package/dist/components/ai/StreamingResponse/StreamingResponse.animations.js +59 -33
  29. package/dist/components/ai/StreamingResponse/StreamingResponse.js +13 -7
  30. package/dist/components/ai/StreamingResponse/StreamingResponse.types.d.ts +33 -2
  31. package/dist/components/ai/StreamingResponse/StreamingSurface.d.ts +13 -0
  32. package/dist/components/ai/StreamingResponse/StreamingSurface.js +38 -0
  33. package/dist/components/ai/StreamingResponse/WordAnimationContext.d.ts +5 -0
  34. package/dist/components/ai/StreamingResponse/WordAnimationContext.js +5 -4
  35. package/dist/components/ai/StreamingResponse/index.d.ts +4 -2
  36. package/dist/components/ai/TokenCounter/TokenCounter.theme.js +1 -1
  37. package/dist/components/ai/index.d.ts +3 -2
  38. package/dist/components/ai/index.js +4 -0
  39. package/dist/components/canvas/BaseNode.js +1 -1
  40. package/dist/components/canvas/CanvasToolbar.js +0 -1
  41. package/dist/components/canvas/Edge.js +2 -2
  42. package/dist/components/canvas/NodeControls.js +0 -1
  43. package/dist/components/canvas/NodeRenderer.js +2 -2
  44. package/dist/components/charts/ActivityRings/ActivityRings.js +2 -2
  45. package/dist/components/charts/ActivityRings/ActivityRings.theme.js +1 -1
  46. package/dist/components/charts/AreaChart/AreaChart.js +3 -3
  47. package/dist/components/charts/AreaChart/AreaChart.theme.js +3 -3
  48. package/dist/components/charts/BarChart/BarChart.js +4 -4
  49. package/dist/components/charts/ComboChart/BarRenderer.js +2 -2
  50. package/dist/components/charts/ComboChart/BarRenderer.types.d.ts +1 -1
  51. package/dist/components/charts/ComboChart/ComboChartCanvas.js +1 -1
  52. package/dist/components/charts/ComboChart/LineRenderer.js +1 -1
  53. package/dist/components/charts/ComboChart/LineRenderer.types.d.ts +1 -1
  54. package/dist/components/charts/DonutChart/DonutChart.theme.js +4 -4
  55. package/dist/components/charts/DonutChart/MultiSegmentDonutChart.theme.js +1 -1
  56. package/dist/components/charts/Heatmap/Heatmap.js +49 -42
  57. package/dist/components/charts/Heatmap/Heatmap.theme.d.ts +6 -2
  58. package/dist/components/charts/Heatmap/Heatmap.theme.js +20 -8
  59. package/dist/components/charts/Heatmap/Heatmap.types.d.ts +49 -82
  60. package/dist/components/charts/Heatmap/HeatmapCell.js +30 -81
  61. package/dist/components/charts/Heatmap/HeatmapLegend.d.ts +7 -6
  62. package/dist/components/charts/Heatmap/HeatmapLegend.js +6 -6
  63. package/dist/components/charts/Heatmap/index.d.ts +1 -1
  64. package/dist/components/charts/Heatmap/utils/heatmapUtils.d.ts +7 -12
  65. package/dist/components/charts/Heatmap/utils/heatmapUtils.js +16 -61
  66. package/dist/components/charts/Heatmap/utils/heatmapUtils.test.d.ts +1 -0
  67. package/dist/components/charts/HorizontalBarChart/HorizontalBarChart.js +1 -1
  68. package/dist/components/charts/LineChart/LineChart.js +2 -2
  69. package/dist/components/charts/LollipopChart/LollipopChart.js +1 -1
  70. package/dist/components/charts/RadarChart/RadarChart.js +1 -1
  71. package/dist/components/charts/StackedBarChart/StackedBarChart.js +3 -3
  72. package/dist/components/charts/hooks/useChartAccessibility.js +9 -6
  73. package/dist/components/charts/index.d.ts +4 -8
  74. package/dist/components/charts/index.js +2 -4
  75. package/dist/components/charts/shared/ChartText/ChartText.theme.js +1 -1
  76. package/dist/components/charts/shared/index.d.ts +1 -1
  77. package/dist/components/charts/theme/chart.theme.js +3 -3
  78. package/dist/components/charts/utils/animation-utils.d.ts +12 -7
  79. package/dist/components/charts/utils/animation-utils.js +19 -19
  80. package/dist/components/core/Accordion/Accordion.theme.js +1 -1
  81. package/dist/components/core/Alert/Alert.animations.d.ts +11 -4
  82. package/dist/components/core/Alert/Alert.animations.js +11 -4
  83. package/dist/components/core/Alert/Alert.js +16 -2
  84. package/dist/components/core/Alert/Alert.theme.js +1 -1
  85. package/dist/components/core/Alert/Alert.types.d.ts +4 -2
  86. package/dist/components/core/AlertDialog/AlertDialog.js +2 -2
  87. package/dist/components/core/Avatar/Avatar.theme.js +1 -1
  88. package/dist/components/core/Badge/Badge.animations.d.ts +0 -5
  89. package/dist/components/core/Badge/Badge.animations.js +5 -84
  90. package/dist/components/core/Badge/Badge.d.ts +7 -4
  91. package/dist/components/core/Badge/Badge.js +27 -64
  92. package/dist/components/core/Badge/Badge.theme.js +8 -12
  93. package/dist/components/core/Badge/Badge.types.d.ts +18 -34
  94. package/dist/components/core/Breadcrumbs/Breadcrumbs.theme.js +4 -4
  95. package/dist/components/core/Button/Button.js +7 -43
  96. package/dist/components/core/Button/Button.theme.js +2 -2
  97. package/dist/components/core/Button/Button.types.d.ts +8 -12
  98. package/dist/components/core/Button/index.d.ts +0 -2
  99. package/dist/components/core/Calendar/Calendar.theme.js +1 -1
  100. package/dist/components/core/Calendar/CalendarMini/CalendarMini.theme.js +2 -2
  101. package/dist/components/core/Card/Card.js +7 -2
  102. package/dist/components/core/Card/Card.theme.js +29 -1
  103. package/dist/components/core/Card/Card.types.d.ts +20 -0
  104. package/dist/components/core/Card/CardBody.js +9 -1
  105. package/dist/components/core/Card/CardContext.d.ts +13 -0
  106. package/dist/components/core/Card/CardContext.js +14 -0
  107. package/dist/components/core/Card/CardHeader.js +4 -1
  108. package/dist/components/core/ContextMenu/ContextMenu.theme.js +4 -3
  109. package/dist/components/core/ContextMenu/ContextMenu.types.d.ts +8 -1
  110. package/dist/components/core/ContextMenu/ContextMenuSub.d.ts +11 -1
  111. package/dist/components/core/ContextMenu/ContextMenuSub.js +35 -22
  112. package/dist/components/core/ContextMenu/ContextMenuSubBody.js +14 -3
  113. package/dist/components/core/ContextMenu/ContextMenuSubTrigger.js +21 -8
  114. package/dist/components/core/DragDrop/DragDrop.theme.js +2 -2
  115. package/dist/components/core/Drawer/Drawer.theme.js +1 -1
  116. package/dist/components/core/Drawer/DrawerHeader.js +0 -1
  117. package/dist/components/core/Dropdown/DropdownMenu.js +22 -7
  118. package/dist/components/core/Link/Link.js +1 -1
  119. package/dist/components/core/Masonry/Masonry.theme.js +1 -1
  120. package/dist/components/core/MenuItem/MenuItem.js +2 -1
  121. package/dist/components/core/MenuItem/MenuItem.theme.js +13 -1
  122. package/dist/components/core/Message/Message.js +2 -0
  123. package/dist/components/core/Message/Message.theme.js +3 -3
  124. package/dist/components/core/Modal/Modal.animations.d.ts +1 -1
  125. package/dist/components/core/Modal/Modal.animations.js +50 -11
  126. package/dist/components/core/Modal/Modal.js +5 -1
  127. package/dist/components/core/Modal/Modal.theme.js +1 -1
  128. package/dist/components/core/Modal/ModalHeader.js +0 -1
  129. package/dist/components/core/ModalStack/ModalStackModal.js +3 -1
  130. package/dist/components/core/NavItem/NavItem.js +3 -2
  131. package/dist/components/core/NavItem/NavItem.theme.js +1 -1
  132. package/dist/components/core/OfflineIndicator/OfflineIndicator.theme.js +4 -2
  133. package/dist/components/core/PageHeading/PageHeading.theme.js +1 -1
  134. package/dist/components/core/Pagination/Pagination.theme.js +2 -2
  135. package/dist/components/core/Pill/Pill.js +2 -1
  136. package/dist/components/core/Pill/Pill.theme.js +4 -2
  137. package/dist/components/core/Popover/PopoverBody.js +16 -5
  138. package/dist/components/core/Progress/Progress.d.ts +0 -25
  139. package/dist/components/core/Progress/Progress.js +79 -11
  140. package/dist/components/core/Progress/Progress.theme.js +17 -0
  141. package/dist/components/core/Progress/Progress.types.d.ts +47 -1
  142. package/dist/components/core/Rating/Rating.theme.js +1 -1
  143. package/dist/components/core/Rating/Rating.types.d.ts +3 -2
  144. package/dist/components/core/ScrollArea/ScrollArea.js +1 -1
  145. package/dist/components/core/ScrollArea/ScrollArea.theme.js +1 -1
  146. package/dist/components/core/Segmented/Segmented.theme.js +3 -3
  147. package/dist/components/core/Segmented/SegmentedContext.js +1 -0
  148. package/dist/components/core/Sidebar/Sidebar.js +5 -2
  149. package/dist/components/core/Sidebar/Sidebar.theme.js +2 -2
  150. package/dist/components/core/Sidebar/SidebarContent.js +1 -1
  151. package/dist/components/core/Sidebar/SidebarHeader.js +1 -1
  152. package/dist/components/core/Sidebar/SidebarSearch.js +2 -2
  153. package/dist/components/core/Sidebar/SidebarToggle.js +1 -1
  154. package/dist/components/core/Sidebar/SidebarUserProfile.js +1 -1
  155. package/dist/components/core/Sortable/Sortable.theme.js +1 -1
  156. package/dist/components/core/Tabs/Tabs.theme.js +1 -1
  157. package/dist/components/core/Tag/Tag.theme.js +1 -1
  158. package/dist/components/core/Toast/ToastProvider.js +1 -1
  159. package/dist/components/core/Tree/Tree.theme.js +1 -1
  160. package/dist/components/core/index.d.ts +0 -2
  161. package/dist/components/core/index.js +0 -4
  162. package/dist/components/core/shared/ChartTooltip/ChartTooltip.animations.d.ts +4 -0
  163. package/dist/components/core/shared/ChartTooltip/ChartTooltip.animations.js +20 -0
  164. package/dist/components/{charts → core}/shared/ChartTooltip/ChartTooltip.js +1 -1
  165. package/dist/components/core/shared/Ripple.d.ts +16 -0
  166. package/dist/components/core/shared/Ripple.js +141 -0
  167. package/dist/components/data-display/GanttChart/GanttChart.theme.js +6 -6
  168. package/dist/components/data-display/GanttChart/GanttTaskBar.js +1 -1
  169. package/dist/components/data-display/GanttChart/GanttTimelineHeader.js +1 -1
  170. package/dist/components/data-display/GanttChart/GanttToolbar.js +0 -1
  171. package/dist/components/data-display/KPI/KPI.js +11 -20
  172. package/dist/components/data-display/KPI/KPI.theme.js +8 -4
  173. package/dist/components/data-display/Metric/Metric.theme.js +4 -4
  174. package/dist/components/data-display/Table/Table.theme.js +2 -2
  175. package/dist/components/data-display/Table/TableColumnManager.js +1 -2
  176. package/dist/components/data-display/Table/TableContext.js +1 -0
  177. package/dist/components/data-display/Table/TableFilter.js +9 -2
  178. package/dist/components/data-display/Table/TableSelectionHeader.js +1 -1
  179. package/dist/components/data-display/Timeline/Timeline.theme.js +1 -1
  180. package/dist/components/effects/CustomCursor/CustomCursor.d.ts +1 -1
  181. package/dist/components/effects/CustomCursor/CustomCursor.js +1 -1
  182. package/dist/components/effects/CustomCursor/CustomCursor.theme.js +4 -4
  183. package/dist/components/effects/Neumorphic/InsetCircleButton.js +1 -1
  184. package/dist/components/effects/Overlay/Overlay.js +7 -3
  185. package/dist/components/effects/index.d.ts +0 -32
  186. package/dist/components/effects/index.js +0 -16
  187. package/dist/components/effects/shared/ShaderCanvas/ShaderCanvas.d.ts +0 -2
  188. package/dist/components/effects/shared/ShaderCanvas/ShaderCanvas.js +1 -93
  189. package/dist/components/effects/shared/ShaderCanvas/ShaderCanvas.types.d.ts +0 -10
  190. package/dist/components/effects/shared/ShaderCanvas/index.d.ts +1 -1
  191. package/dist/components/effects/shared/index.d.ts +1 -3
  192. package/dist/components/effects/shared/shaderNoise.glsl.d.ts +1 -1
  193. package/dist/components/effects/shared/shaderNoise.glsl.js +2 -11
  194. package/dist/components/forms/Checkbox/Checkbox.theme.js +1 -1
  195. package/dist/components/forms/ColorPicker/ColorPickerHeader.js +1 -1
  196. package/dist/components/forms/ColorPicker/ColorPickerImage.js +1 -1
  197. package/dist/components/forms/Combobox/Combobox.js +2 -0
  198. package/dist/components/forms/DateRangePicker/DateRangePicker.theme.js +1 -1
  199. package/dist/components/forms/DateRangePicker/DateRangePickerContext.js +1 -0
  200. package/dist/components/forms/FileUpload/FileUpload.theme.js +2 -2
  201. package/dist/components/forms/FileUpload/FileUploadProgress.theme.js +1 -1
  202. package/dist/components/forms/InputAddress/InputAddress.types.d.ts +2 -2
  203. package/dist/components/forms/Radio/Radio.theme.js +1 -1
  204. package/dist/components/forms/RichTextEditor/RichTextEditor.d.ts +12 -16
  205. package/dist/components/forms/RichTextEditor/RichTextEditor.js +165 -1680
  206. package/dist/components/forms/RichTextEditor/RichTextEditor.theme.d.ts +12 -56
  207. package/dist/components/forms/RichTextEditor/RichTextEditor.theme.js +60 -118
  208. package/dist/components/forms/RichTextEditor/RichTextEditor.types.d.ts +62 -126
  209. package/dist/components/forms/RichTextEditor/RichTextLinkField.d.ts +18 -0
  210. package/dist/components/forms/RichTextEditor/RichTextLinkField.js +46 -0
  211. package/dist/components/forms/RichTextEditor/RichTextToolbar.d.ts +15 -0
  212. package/dist/components/forms/RichTextEditor/RichTextToolbar.js +93 -0
  213. package/dist/components/forms/RichTextEditor/editorCommands.d.ts +50 -0
  214. package/dist/components/forms/RichTextEditor/editorCommands.js +58 -0
  215. package/dist/components/forms/RichTextEditor/editorState.d.ts +19 -0
  216. package/dist/components/forms/RichTextEditor/editorState.js +103 -0
  217. package/dist/components/forms/RichTextEditor/index.d.ts +5 -3
  218. package/dist/components/forms/RichTextEditor/sanitizeHtml.d.ts +38 -0
  219. package/dist/components/forms/RichTextEditor/sanitizeHtml.js +179 -0
  220. package/dist/components/forms/RichTextEditor/sanitizeHtml.test.d.ts +1 -0
  221. package/dist/components/forms/Select/Select.js +4 -4
  222. package/dist/components/forms/Select/Select.types.d.ts +70 -7
  223. package/dist/components/forms/Select/useSelectState.d.ts +9 -3
  224. package/dist/components/forms/Select/useSelectState.js +4 -1
  225. package/dist/components/forms/SelectableCard/SelectableCard.js +2 -1
  226. package/dist/components/forms/SelectableCard/SelectableCard.theme.js +1 -1
  227. package/dist/components/forms/Switch/Switch.theme.js +2 -2
  228. package/dist/components/forms/TimePicker/TimePicker.theme.js +1 -1
  229. package/dist/components/forms/TimePicker/TimePickerTrigger.js +1 -1
  230. package/dist/components/forms/forms.theme.js +19 -5
  231. package/dist/components/forms/index.js +1 -0
  232. package/dist/components/generative/FormShell.d.ts +22 -0
  233. package/dist/components/generative/FormShell.js +102 -0
  234. package/dist/components/generative/GenerativeView.d.ts +52 -1
  235. package/dist/components/generative/GenerativeView.js +203 -11
  236. package/dist/components/generative/actions.d.ts +5 -0
  237. package/dist/components/generative/ai-sdk/index.d.ts +1 -0
  238. package/dist/components/generative/ai-sdk/index.js +1 -0
  239. package/dist/components/generative/ai-sdk/useGenerativeChat.d.ts +52 -0
  240. package/dist/components/generative/ai-sdk/useGenerativeChat.js +73 -0
  241. package/dist/components/generative/ai-sdk/useGenerativeChat.test.d.ts +1 -0
  242. package/dist/components/generative/fieldBinding.d.ts +31 -0
  243. package/dist/components/generative/fieldBinding.js +33 -0
  244. package/dist/components/generative/fieldBinding.test.d.ts +1 -0
  245. package/dist/components/generative/formScope.d.ts +71 -0
  246. package/dist/components/generative/formScope.js +135 -0
  247. package/dist/components/generative/index.d.ts +4 -0
  248. package/dist/components/generative/index.js +4 -0
  249. package/dist/components/generative/registry.d.ts +2 -0
  250. package/dist/components/generative/registry.js +10 -10
  251. package/dist/components/generative/schema.generated.js +178 -292
  252. package/dist/components/generative/toToolResult.d.ts +21 -0
  253. package/dist/components/generative/toToolResult.js +15 -0
  254. package/dist/components/generative/toToolResult.test.d.ts +1 -0
  255. package/dist/components/generative/validate.d.ts +10 -1
  256. package/dist/components/generative/validate.js +126 -11
  257. package/dist/components/layout/Grid/Grid.js +1 -0
  258. package/dist/components/layout/Section/Section.theme.js +1 -1
  259. package/dist/components/layout/Stack/Stack.js +1 -0
  260. package/dist/generative.schema.json +178 -292
  261. package/dist/index.js +1 -4
  262. package/dist/registry.json +2599 -2375
  263. package/dist/shadcn-compat.css +5 -5
  264. package/dist/styles/theme.test.d.ts +1 -0
  265. package/dist/styles.css +1 -1
  266. package/dist/test/render.d.ts +17 -0
  267. package/dist/themes/precision.css +232 -0
  268. package/dist/tools.json +179 -294
  269. package/dist/utils/index.d.ts +0 -1
  270. package/package.json +31 -1
  271. package/src/global.scss +21 -28
  272. package/src/styles/theme.css +124 -41
  273. package/src/styles/theme.test.ts +119 -0
  274. package/tailwind.preset.cjs +30 -20
  275. package/dist/components/charts/FunnelChart/FunnelChart.animations.d.ts +0 -35
  276. package/dist/components/charts/FunnelChart/FunnelChart.animations.js +0 -59
  277. package/dist/components/charts/FunnelChart/FunnelChart.d.ts +0 -8
  278. package/dist/components/charts/FunnelChart/FunnelChart.js +0 -410
  279. package/dist/components/charts/FunnelChart/FunnelChart.theme.d.ts +0 -2
  280. package/dist/components/charts/FunnelChart/FunnelChart.theme.js +0 -12
  281. package/dist/components/charts/FunnelChart/FunnelChart.types.d.ts +0 -105
  282. package/dist/components/charts/FunnelChart/index.d.ts +0 -4
  283. package/dist/components/charts/ScatterPlot/ScatterPlot.d.ts +0 -9
  284. package/dist/components/charts/ScatterPlot/ScatterPlot.js +0 -208
  285. package/dist/components/charts/ScatterPlot/ScatterPlot.theme.d.ts +0 -18
  286. package/dist/components/charts/ScatterPlot/ScatterPlot.theme.js +0 -42
  287. package/dist/components/charts/ScatterPlot/ScatterPlot.types.d.ts +0 -60
  288. package/dist/components/charts/ScatterPlot/ScatterPlot.types.js +0 -19
  289. package/dist/components/charts/ScatterPlot/index.d.ts +0 -3
  290. package/dist/components/core/Button/Button.ripple.d.ts +0 -71
  291. package/dist/components/core/Button/Button.ripple.js +0 -236
  292. package/dist/components/core/Calendar/CalendarEvent/CalendarEvent.d.ts +0 -4
  293. package/dist/components/core/Calendar/CalendarEvent/CalendarEvent.theme.d.ts +0 -12
  294. package/dist/components/core/Calendar/CalendarEvent/CalendarEvent.types.d.ts +0 -23
  295. package/dist/components/core/Calendar/CalendarEvent/index.d.ts +0 -2
  296. package/dist/components/core/CardStack/CardStack.animations.d.ts +0 -47
  297. package/dist/components/core/CardStack/CardStack.d.ts +0 -3
  298. package/dist/components/core/CardStack/CardStack.js +0 -187
  299. package/dist/components/core/CardStack/CardStack.theme.d.ts +0 -6
  300. package/dist/components/core/CardStack/CardStack.theme.js +0 -33
  301. package/dist/components/core/CardStack/CardStack.types.d.ts +0 -139
  302. package/dist/components/core/CardStack/index.d.ts +0 -7
  303. package/dist/components/core/Carousel/Carousel.d.ts +0 -3
  304. package/dist/components/core/Carousel/Carousel.js +0 -83
  305. package/dist/components/core/Carousel/Carousel.theme.d.ts +0 -10
  306. package/dist/components/core/Carousel/Carousel.theme.js +0 -20
  307. package/dist/components/core/Carousel/Carousel.types.d.ts +0 -113
  308. package/dist/components/core/Carousel/CarouselBody.d.ts +0 -4
  309. package/dist/components/core/Carousel/CarouselBody.js +0 -59
  310. package/dist/components/core/Carousel/CarouselContext.d.ts +0 -3
  311. package/dist/components/core/Carousel/CarouselContext.js +0 -13
  312. package/dist/components/core/Carousel/CarouselItem.d.ts +0 -4
  313. package/dist/components/core/Carousel/CarouselItem.js +0 -11
  314. package/dist/components/core/Carousel/CarouselNext.d.ts +0 -4
  315. package/dist/components/core/Carousel/CarouselNext.js +0 -16
  316. package/dist/components/core/Carousel/CarouselPrevious.d.ts +0 -4
  317. package/dist/components/core/Carousel/CarouselPrevious.js +0 -16
  318. package/dist/components/core/Carousel/index.d.ts +0 -3
  319. package/dist/components/effects/ColorPanels/ColorPanels.d.ts +0 -8
  320. package/dist/components/effects/ColorPanels/ColorPanels.js +0 -66
  321. package/dist/components/effects/ColorPanels/ColorPanels.shaders.d.ts +0 -12
  322. package/dist/components/effects/ColorPanels/ColorPanels.shaders.js +0 -218
  323. package/dist/components/effects/ColorPanels/ColorPanels.types.d.ts +0 -29
  324. package/dist/components/effects/ColorPanels/ColorPanels.types.js +0 -3
  325. package/dist/components/effects/ColorPanels/index.d.ts +0 -2
  326. package/dist/components/effects/FlutedGlass/FlutedGlass.d.ts +0 -9
  327. package/dist/components/effects/FlutedGlass/FlutedGlass.js +0 -80
  328. package/dist/components/effects/FlutedGlass/FlutedGlass.shaders.d.ts +0 -12
  329. package/dist/components/effects/FlutedGlass/FlutedGlass.shaders.js +0 -335
  330. package/dist/components/effects/FlutedGlass/FlutedGlass.types.d.ts +0 -61
  331. package/dist/components/effects/FlutedGlass/FlutedGlass.types.js +0 -16
  332. package/dist/components/effects/FlutedGlass/index.d.ts +0 -3
  333. package/dist/components/effects/GlassEffect/GlassEffect.d.ts +0 -15
  334. package/dist/components/effects/GlassEffect/GlassEffect.js +0 -38
  335. package/dist/components/effects/GlassEffect/GlassEffect.types.d.ts +0 -19
  336. package/dist/components/effects/GlassEffect/index.d.ts +0 -2
  337. package/dist/components/effects/GlassSurface/GlassSurface.d.ts +0 -8
  338. package/dist/components/effects/GlassSurface/GlassSurface.js +0 -250
  339. package/dist/components/effects/GlassSurface/GlassSurface.types.d.ts +0 -66
  340. package/dist/components/effects/GlassSurface/index.d.ts +0 -2
  341. package/dist/components/effects/GodRays/GodRays.d.ts +0 -8
  342. package/dist/components/effects/GodRays/GodRays.js +0 -68
  343. package/dist/components/effects/GodRays/GodRays.shaders.d.ts +0 -10
  344. package/dist/components/effects/GodRays/GodRays.shaders.js +0 -128
  345. package/dist/components/effects/GodRays/GodRays.types.d.ts +0 -25
  346. package/dist/components/effects/GodRays/GodRays.types.js +0 -3
  347. package/dist/components/effects/GodRays/index.d.ts +0 -2
  348. package/dist/components/effects/GridPattern/GridPattern.d.ts +0 -18
  349. package/dist/components/effects/GridPattern/GridPattern.js +0 -65
  350. package/dist/components/effects/GridPattern/GridPattern.types.d.ts +0 -47
  351. package/dist/components/effects/GridPattern/index.d.ts +0 -2
  352. package/dist/components/effects/HalftoneCmyk/HalftoneCmyk.d.ts +0 -10
  353. package/dist/components/effects/HalftoneCmyk/HalftoneCmyk.js +0 -78
  354. package/dist/components/effects/HalftoneCmyk/HalftoneCmyk.shaders.d.ts +0 -22
  355. package/dist/components/effects/HalftoneCmyk/HalftoneCmyk.shaders.js +0 -239
  356. package/dist/components/effects/HalftoneCmyk/HalftoneCmyk.types.d.ts +0 -52
  357. package/dist/components/effects/HalftoneCmyk/index.d.ts +0 -2
  358. package/dist/components/effects/HalftoneDots/HalftoneDots.d.ts +0 -9
  359. package/dist/components/effects/HalftoneDots/HalftoneDots.js +0 -68
  360. package/dist/components/effects/HalftoneDots/HalftoneDots.shaders.d.ts +0 -13
  361. package/dist/components/effects/HalftoneDots/HalftoneDots.shaders.js +0 -296
  362. package/dist/components/effects/HalftoneDots/HalftoneDots.types.d.ts +0 -43
  363. package/dist/components/effects/HalftoneDots/HalftoneDots.types.js +0 -12
  364. package/dist/components/effects/HalftoneDots/index.d.ts +0 -3
  365. package/dist/components/effects/ImageDithering/ImageDithering.d.ts +0 -9
  366. package/dist/components/effects/ImageDithering/ImageDithering.js +0 -68
  367. package/dist/components/effects/ImageDithering/ImageDithering.shaders.d.ts +0 -12
  368. package/dist/components/effects/ImageDithering/ImageDithering.shaders.js +0 -117
  369. package/dist/components/effects/ImageDithering/ImageDithering.types.d.ts +0 -30
  370. package/dist/components/effects/ImageDithering/ImageDithering.types.js +0 -8
  371. package/dist/components/effects/ImageDithering/index.d.ts +0 -3
  372. package/dist/components/effects/MagneticElement/MagneticElement.d.ts +0 -30
  373. package/dist/components/effects/MagneticElement/MagneticElement.js +0 -111
  374. package/dist/components/effects/MagneticElement/MagneticElement.types.d.ts +0 -44
  375. package/dist/components/effects/MagneticElement/index.d.ts +0 -2
  376. package/dist/components/effects/Metaballs/Metaballs.d.ts +0 -8
  377. package/dist/components/effects/Metaballs/Metaballs.js +0 -59
  378. package/dist/components/effects/Metaballs/Metaballs.shaders.d.ts +0 -10
  379. package/dist/components/effects/Metaballs/Metaballs.shaders.js +0 -102
  380. package/dist/components/effects/Metaballs/Metaballs.types.d.ts +0 -16
  381. package/dist/components/effects/Metaballs/Metaballs.types.js +0 -3
  382. package/dist/components/effects/Metaballs/index.d.ts +0 -2
  383. package/dist/components/effects/PaperTexture/PaperTexture.d.ts +0 -9
  384. package/dist/components/effects/PaperTexture/PaperTexture.js +0 -61
  385. package/dist/components/effects/PaperTexture/PaperTexture.shaders.d.ts +0 -22
  386. package/dist/components/effects/PaperTexture/PaperTexture.shaders.js +0 -145
  387. package/dist/components/effects/PaperTexture/PaperTexture.types.d.ts +0 -19
  388. package/dist/components/effects/PaperTexture/index.d.ts +0 -2
  389. package/dist/components/effects/PulsingBorder/PulsingBorder.d.ts +0 -27
  390. package/dist/components/effects/PulsingBorder/PulsingBorder.js +0 -174
  391. package/dist/components/effects/PulsingBorder/PulsingBorder.shaders.d.ts +0 -14
  392. package/dist/components/effects/PulsingBorder/PulsingBorder.shaders.js +0 -258
  393. package/dist/components/effects/PulsingBorder/PulsingBorder.types.d.ts +0 -75
  394. package/dist/components/effects/PulsingBorder/PulsingBorder.types.js +0 -3
  395. package/dist/components/effects/PulsingBorder/index.d.ts +0 -2
  396. package/dist/components/effects/SmokeRing/SmokeRing.d.ts +0 -8
  397. package/dist/components/effects/SmokeRing/SmokeRing.js +0 -62
  398. package/dist/components/effects/SmokeRing/SmokeRing.shaders.d.ts +0 -14
  399. package/dist/components/effects/SmokeRing/SmokeRing.shaders.js +0 -130
  400. package/dist/components/effects/SmokeRing/SmokeRing.types.d.ts +0 -22
  401. package/dist/components/effects/SmokeRing/SmokeRing.types.js +0 -3
  402. package/dist/components/effects/SmokeRing/index.d.ts +0 -2
  403. package/dist/components/effects/StaticGradientMesh/StaticGradientMesh.d.ts +0 -9
  404. package/dist/components/effects/StaticGradientMesh/StaticGradientMesh.js +0 -59
  405. package/dist/components/effects/StaticGradientMesh/StaticGradientMesh.shaders.d.ts +0 -14
  406. package/dist/components/effects/StaticGradientMesh/StaticGradientMesh.shaders.js +0 -129
  407. package/dist/components/effects/StaticGradientMesh/StaticGradientMesh.types.d.ts +0 -23
  408. package/dist/components/effects/StaticGradientMesh/StaticGradientMesh.types.js +0 -3
  409. package/dist/components/effects/StaticGradientMesh/index.d.ts +0 -2
  410. package/dist/components/effects/Water/Water.d.ts +0 -9
  411. package/dist/components/effects/Water/Water.js +0 -65
  412. package/dist/components/effects/Water/Water.shaders.d.ts +0 -11
  413. package/dist/components/effects/Water/Water.shaders.js +0 -123
  414. package/dist/components/effects/Water/Water.types.d.ts +0 -25
  415. package/dist/components/effects/Water/index.d.ts +0 -2
  416. package/dist/components/effects/shared/bayerMatrices.glsl.d.ts +0 -10
  417. package/dist/components/effects/shared/bayerMatrices.glsl.js +0 -44
  418. package/dist/components/effects/shared/imageUV.glsl.d.ts +0 -12
  419. package/dist/components/effects/shared/imageUV.glsl.js +0 -26
  420. package/dist/components/forms/RichTextEditor/RichTextEditor.animations.d.ts +0 -7
  421. package/dist/components/forms/RichTextEditor/RichTextEditor.animations.js +0 -32
  422. package/dist/utils/calendarUtils.d.ts +0 -60
  423. /package/dist/components/{charts → core}/shared/ChartTooltip/ChartTooltip.d.ts +0 -0
  424. /package/dist/components/{charts → core}/shared/ChartTooltip/ChartTooltip.theme.d.ts +0 -0
  425. /package/dist/components/{charts → core}/shared/ChartTooltip/ChartTooltip.theme.js +0 -0
  426. /package/dist/components/{charts → core}/shared/ChartTooltip/ChartTooltip.types.d.ts +0 -0
  427. /package/dist/components/{charts → core}/shared/ChartTooltip/ChartTooltipContent.d.ts +0 -0
  428. /package/dist/components/{charts → core}/shared/ChartTooltip/index.d.ts +0 -0
@@ -1,65 +0,0 @@
1
- "use client";
2
- import { jsxs, jsx } from 'react/jsx-runtime';
3
- import React__default, { useId, useMemo } from 'react';
4
- import { useReducedMotion, motion } from 'motion/react';
5
- import { cn } from '../../../utils/cn.js';
6
-
7
- /**
8
- * Build a CSS mask-image value for the given fade direction and size.
9
- */
10
- function buildMaskImage(direction, fadeSize) {
11
- const stop = Math.max(0, Math.min(100, fadeSize));
12
- if (direction === "radial") {
13
- return `radial-gradient(ellipse at center, black ${100 - stop}%, transparent 100%)`;
14
- }
15
- const directionMap = {
16
- top: "to top",
17
- bottom: "to bottom",
18
- left: "to left",
19
- right: "to right",
20
- };
21
- return `linear-gradient(${directionMap[direction]}, black ${100 - stop}%, transparent 100%)`;
22
- }
23
- /**
24
- * GridPattern renders an SVG-based grid background pattern.
25
- *
26
- * Use it as an absolute-positioned decorative background inside a container
27
- * with `position: relative`. The pattern is fully non-interactive
28
- * (`pointer-events: none`) and sits at `z-index: 0` by default.
29
- *
30
- * @example
31
- * ```tsx
32
- * <div className="relative overflow-hidden h-96">
33
- * <GridPattern size={48} color="var(--color-border)" fade animated />
34
- * <div className="relative z-10">Your content here</div>
35
- * </div>
36
- * ```
37
- */
38
- const GridPattern = React__default.forwardRef(({ size = 40, strokeWidth = 1, color = "var(--color-border)", fade = true, fadeDirection = "radial", fadeSize = 50, animated = false, className, style, ...rest }, ref) => {
39
- const patternId = useId();
40
- const shouldReduceMotion = useReducedMotion();
41
- const enableAnimation = animated && !shouldReduceMotion;
42
- const maskImage = useMemo(() => (fade ? buildMaskImage(fadeDirection, fadeSize) : undefined), [fade, fadeDirection, fadeSize]);
43
- const containerStyle = {
44
- ...style,
45
- ...(maskImage
46
- ? {
47
- maskImage,
48
- WebkitMaskImage: maskImage,
49
- }
50
- : {}),
51
- };
52
- const svgContent = (jsxs("svg", { "aria-hidden": "true", className: "absolute inset-0 w-full h-full", children: [jsx("defs", { children: jsxs("pattern", { id: patternId, x: "0", y: "0", width: size, height: size, patternUnits: "userSpaceOnUse", children: [jsx("line", { x1: size, y1: "0", x2: size, y2: size, stroke: color, strokeWidth: strokeWidth }), jsx("line", { x1: "0", y1: size, x2: size, y2: size, stroke: color, strokeWidth: strokeWidth })] }) }), jsx("rect", { width: "100%", height: "100%", fill: `url(#${patternId})` })] }));
53
- const animatedSvgContent = enableAnimation ? (jsxs(motion.svg, { "aria-hidden": "true", className: "absolute inset-0 w-full h-full", animate: {
54
- x: [0, size],
55
- y: [0, size],
56
- }, transition: {
57
- duration: 20,
58
- ease: "linear",
59
- repeat: Infinity,
60
- }, children: [jsx("defs", { children: jsxs("pattern", { id: patternId, x: "0", y: "0", width: size, height: size, patternUnits: "userSpaceOnUse", children: [jsx("line", { x1: size, y1: "0", x2: size, y2: size, stroke: color, strokeWidth: strokeWidth }), jsx("line", { x1: "0", y1: size, x2: size, y2: size, stroke: color, strokeWidth: strokeWidth })] }) }), jsx("rect", { x: -size, y: -size, width: `calc(100% + ${size * 2}px)`, height: `calc(100% + ${size * 2}px)`, fill: `url(#${patternId})` })] })) : null;
61
- return (jsx("div", { ref: ref, className: cn("absolute inset-0 pointer-events-none z-0 overflow-hidden", className), style: containerStyle, ...rest, children: enableAnimation ? animatedSvgContent : svgContent }));
62
- });
63
- GridPattern.displayName = "GridPattern";
64
-
65
- export { GridPattern };
@@ -1,47 +0,0 @@
1
- import React from "react";
2
- /** Direction for the fade gradient mask */
3
- export type GridPatternFadeDirection = "radial" | "top" | "bottom" | "left" | "right";
4
- export interface GridPatternProps extends React.HTMLAttributes<HTMLDivElement> {
5
- /**
6
- * Grid cell size in pixels.
7
- * @default 40
8
- */
9
- size?: number;
10
- /**
11
- * Stroke width of the grid lines in pixels.
12
- * @default 1
13
- */
14
- strokeWidth?: number;
15
- /**
16
- * Stroke color of the grid lines.
17
- * Accepts any valid CSS color value or CSS variable.
18
- * @default "var(--color-border)"
19
- */
20
- color?: string;
21
- /**
22
- * Whether to apply a gradient mask that fades the pattern at the edges.
23
- * @default true
24
- */
25
- fade?: boolean;
26
- /**
27
- * Direction of the fade gradient.
28
- * - "radial" fades from center outward
29
- * - "top" | "bottom" | "left" | "right" fades toward that edge
30
- * @default "radial"
31
- */
32
- fadeDirection?: GridPatternFadeDirection;
33
- /**
34
- * Size of the fade area as a percentage (0-100).
35
- * Higher values create a larger transparent region.
36
- * @default 50
37
- */
38
- fadeSize?: number;
39
- /**
40
- * Whether to apply a subtle drift animation to the grid pattern.
41
- * Respects prefers-reduced-motion automatically.
42
- * @default false
43
- */
44
- animated?: boolean;
45
- /** Additional className for style overrides (shadcn pattern). */
46
- className?: string;
47
- }
@@ -1,2 +0,0 @@
1
- export { GridPattern } from "./GridPattern";
2
- export type { GridPatternProps, GridPatternFadeDirection, } from "./GridPattern.types";
@@ -1,10 +0,0 @@
1
- import React from "react";
2
- import type { HalftoneCmykProps } from "./HalftoneCmyk.types";
3
- /**
4
- * CMYK halftone image filter — separates a source image into 4 classic
5
- * print-screen-angled ink dot layers (cyan/magenta/yellow/black). WebGL2-
6
- * powered; falls back to the plain source image (via `object-fit: cover`)
7
- * when WebGL2 is unavailable. The most GPU-expensive effect in this
8
- * library — avoid using it as a full-page background at low `size` values.
9
- */
10
- export declare const HalftoneCmyk: React.FC<HalftoneCmykProps>;
@@ -1,78 +0,0 @@
1
- "use client";
2
- import { jsx } from 'react/jsx-runtime';
3
- import { useState, useMemo, useRef, useCallback } from 'react';
4
- import { useIsClient } from '../../../hooks/useIsClient.js';
5
- import 'motion/react';
6
- import { useDarkMode } from '../../../hooks/useDarkMode.js';
7
- import { cn } from '../../../utils/cn.js';
8
- import { ShaderCanvas } from '../shared/ShaderCanvas/ShaderCanvas.js';
9
- import { resolveShaderColor } from '../shared/resolveShaderColor.js';
10
- import { halftoneCmykFragmentShader } from './HalftoneCmyk.shaders.js';
11
-
12
- const DEFAULT_COLOR_BACK = "var(--color-background)";
13
- const DEFAULT_COLOR_C = "#00b7eb";
14
- const DEFAULT_COLOR_M = "#e4007c";
15
- const DEFAULT_COLOR_Y = "#ffe800";
16
- const DEFAULT_COLOR_K = "var(--color-text-primary)";
17
- function useWebgl2Supported() {
18
- return useMemo(() => {
19
- if (typeof document === "undefined")
20
- return false;
21
- try {
22
- return !!document.createElement("canvas").getContext("webgl2");
23
- }
24
- catch (_a) {
25
- return false;
26
- }
27
- }, []);
28
- }
29
- /**
30
- * CMYK halftone image filter — separates a source image into 4 classic
31
- * print-screen-angled ink dot layers (cyan/magenta/yellow/black). WebGL2-
32
- * powered; falls back to the plain source image (via `object-fit: cover`)
33
- * when WebGL2 is unavailable. The most GPU-expensive effect in this
34
- * library — avoid using it as a full-page background at low `size` values.
35
- */
36
- const HalftoneCmyk = ({ image, colorBack = DEFAULT_COLOR_BACK, colorC = DEFAULT_COLOR_C, colorM = DEFAULT_COLOR_M, colorY = DEFAULT_COLOR_Y, colorK = DEFAULT_COLOR_K, size = 0.6, contrast = 1, softness = 0.3, gridNoise = 0.1, grainSize = 0.5, grainMixer = 0, grainOverlay = 0, floodC = 0, floodM = 0, floodY = 0, floodK = 0, gainC = 0, gainM = 0, gainY = 0, gainK = 0, className, style, ...props }) => {
37
- const isClient = useIsClient();
38
- const isDark = useDarkMode();
39
- const webglSupported = useWebgl2Supported();
40
- const [imageAspectRatio, setImageAspectRatio] = useState(16 / 9);
41
- const resolvedBack = useMemo(() => resolveShaderColor(colorBack), [colorBack, isDark]); // eslint-disable-line react-hooks/exhaustive-deps
42
- const resolvedC = useMemo(() => resolveShaderColor(colorC), [colorC, isDark]); // eslint-disable-line react-hooks/exhaustive-deps
43
- const resolvedM = useMemo(() => resolveShaderColor(colorM), [colorM, isDark]); // eslint-disable-line react-hooks/exhaustive-deps
44
- const resolvedY = useMemo(() => resolveShaderColor(colorY), [colorY, isDark]); // eslint-disable-line react-hooks/exhaustive-deps
45
- const resolvedK = useMemo(() => resolveShaderColor(colorK), [colorK, isDark]); // eslint-disable-line react-hooks/exhaustive-deps
46
- const texturesRef = useRef({ u_image: image });
47
- texturesRef.current.u_image = image;
48
- const handleTextureLoad = useCallback((name, aspectRatio) => {
49
- if (name === "u_image")
50
- setImageAspectRatio(aspectRatio);
51
- }, []);
52
- const uniformsRef = useRef({});
53
- uniformsRef.current.u_colorBack = resolvedBack;
54
- uniformsRef.current.u_colorC = resolvedC;
55
- uniformsRef.current.u_colorM = resolvedM;
56
- uniformsRef.current.u_colorY = resolvedY;
57
- uniformsRef.current.u_colorK = resolvedK;
58
- uniformsRef.current.u_imageAspectRatio = imageAspectRatio;
59
- uniformsRef.current.u_size = size;
60
- uniformsRef.current.u_contrast = contrast;
61
- uniformsRef.current.u_softness = softness;
62
- uniformsRef.current.u_gridNoise = gridNoise;
63
- uniformsRef.current.u_grainSize = grainSize;
64
- uniformsRef.current.u_grainMixer = grainMixer;
65
- uniformsRef.current.u_grainOverlay = grainOverlay;
66
- uniformsRef.current.u_floodC = floodC;
67
- uniformsRef.current.u_floodM = floodM;
68
- uniformsRef.current.u_floodY = floodY;
69
- uniformsRef.current.u_floodK = floodK;
70
- uniformsRef.current.u_gainC = gainC;
71
- uniformsRef.current.u_gainM = gainM;
72
- uniformsRef.current.u_gainY = gainY;
73
- uniformsRef.current.u_gainK = gainK;
74
- const imageSrc = typeof image === "string" ? image : image.src;
75
- return (jsx("div", { className: cn("absolute inset-0 overflow-hidden pointer-events-none select-none", className), style: style, "aria-hidden": "true", ...props, children: isClient && webglSupported ? (jsx(ShaderCanvas, { fragmentShader: halftoneCmykFragmentShader, uniformsRef: uniformsRef, texturesRef: texturesRef, onTextureLoad: handleTextureLoad })) : (jsx("img", { src: imageSrc, alt: "", className: "absolute inset-0 w-full h-full object-cover" })) }));
76
- };
77
-
78
- export { HalftoneCmyk };
@@ -1,22 +0,0 @@
1
- /**
2
- * HalftoneCmyk fragment shader — adapted from paper-design/shaders'
3
- * `halftone-cmyk.ts` (https://github.com/paper-design/shaders, Apache
4
- * License 2.0). An image filter: separates a source image into 4
5
- * classic-print-screen-angled CMYK halftone dot layers.
6
- *
7
- * Highest-complexity/cost effect in this port (up to ~36 texture reads per
8
- * pixel across 4 channels × a 3×3 cell neighborhood) — build/verify last,
9
- * most scrutiny, and keep the default `size` conservative.
10
- *
11
- * Trimmed for v1: paper-design's `ink`/`sharp` modes are omitted — this
12
- * ships the `dots` mode only (separate, discrete halftone dots; the
13
- * classic print look), which also lets this port drop the entire
14
- * single-pixel-sample "sharp" code path and its `RGBAtoCMYK`/contrast
15
- * machinery, cutting real per-pixel cost, not just API surface.
16
- *
17
- * Simplified from the original: image UV computed via the shared
18
- * `getImageCoverUV` cover-fit helper (see shared/imageUV.glsl.ts) instead of
19
- * paper-design's ShaderSizingParams fit engine; pure-hash GLSL instead of
20
- * pre-generated noise-texture sampling.
21
- */
22
- export declare const halftoneCmykFragmentShader = "#version 300 es\nprecision mediump float;\n\nuniform vec2 iResolution;\n\nuniform sampler2D u_image;\nuniform float u_imageAspectRatio;\n\nuniform vec4 u_colorBack;\nuniform vec4 u_colorC;\nuniform vec4 u_colorM;\nuniform vec4 u_colorY;\nuniform vec4 u_colorK;\nuniform float u_size;\nuniform float u_contrast;\nuniform float u_grainSize;\nuniform float u_grainMixer;\nuniform float u_grainOverlay;\nuniform float u_gridNoise;\nuniform float u_softness;\nuniform float u_floodC;\nuniform float u_floodM;\nuniform float u_floodY;\nuniform float u_floodK;\nuniform float u_gainC;\nuniform float u_gainM;\nuniform float u_gainY;\nuniform float u_gainK;\n\nout vec4 fragColor;\n\nconst float shiftC = -.5;\nconst float shiftM = -.25;\nconst float shiftY = .2;\nconst float shiftK = 0.;\n\nconst float cosC = 0.9659258;\nconst float sinC = 0.2588190;\nconst float cosM = 0.2588190;\nconst float sinM = 0.9659258;\nconst float cosY = 1.0;\nconst float sinY = 0.0;\nconst float cosK = 0.7071068;\nconst float sinK = 0.7071068;\n\n\nvec2 randomGB(vec2 st) {\n return vec2(\n fract(sin(dot(st, vec2(12.9898, 78.233))) * 43758.5453123),\n fract(sin(dot(st, vec2(93.9898, 67.345))) * 24634.6345123)\n );\n}\n\n\nvec2 getImageCoverUV(vec2 fragUV, vec2 resolution, float imageAspectRatio) {\n float containerAspect = resolution.x / resolution.y;\n // Container wider (relative to its height) than the image: sample a\n // narrower vertical slice of the image (crop top/bottom) so it fills the\n // container width with no letterboxing. Container narrower/taller than\n // the image: sample a narrower horizontal slice (crop left/right) instead.\n vec2 scale = containerAspect > imageAspectRatio\n ? vec2(1.0, imageAspectRatio / containerAspect)\n : vec2(containerAspect / imageAspectRatio, 1.0);\n return (fragUV - 0.5) * scale + 0.5;\n}\n\n\nvec3 hash23(vec2 p) {\n vec3 p3 = fract(vec3(p.xyx) * vec3(0.3183099, 0.3678794, 0.3141592)) + 0.1;\n p3 += dot(p3, p3.yzx + 19.19);\n return fract(vec3(p3.x * p3.y, p3.y * p3.z, p3.z * p3.x));\n}\n\nfloat sst(float edge0, float edge1, float x) {\n return smoothstep(edge0, edge1, x);\n}\n\nvec3 valueNoise3(vec2 st) {\n vec2 i = floor(st);\n vec2 f = fract(st);\n vec3 a = hash23(i);\n vec3 b = hash23(i + vec2(1.0, 0.0));\n vec3 c = hash23(i + vec2(0.0, 1.0));\n vec3 d = hash23(i + vec2(1.0, 1.0));\n vec2 u = f * f * (3.0 - 2.0 * f);\n vec3 x1 = mix(a, b, u.x);\n vec3 x2 = mix(c, d, u.x);\n return mix(x1, x2, u.y);\n}\n\nfloat getUvFrame(vec2 uv, vec2 pad) {\n float left = smoothstep(-pad.x, 0., uv.x);\n float right = smoothstep(1. + pad.x, 1., uv.x);\n float bottom = smoothstep(-pad.y, 0., uv.y);\n float top = smoothstep(1. + pad.y, 1., uv.y);\n return left * right * bottom * top;\n}\n\nfloat getCyan(vec4 rgba) {\n vec3 c = clamp((rgba.rgb - 0.5) * u_contrast + 0.5, 0.0, 1.0);\n float maxRGB = max(max(c.r, c.g), c.b);\n return (maxRGB > 1e-5 ? (maxRGB - c.r) / maxRGB : 0.) * rgba.a;\n}\nfloat getMagenta(vec4 rgba) {\n vec3 c = clamp((rgba.rgb - 0.5) * u_contrast + 0.5, 0.0, 1.0);\n float maxRGB = max(max(c.r, c.g), c.b);\n return (maxRGB > 1e-5 ? (maxRGB - c.g) / maxRGB : 0.) * rgba.a;\n}\nfloat getYellow(vec4 rgba) {\n vec3 c = clamp((rgba.rgb - 0.5) * u_contrast + 0.5, 0.0, 1.0);\n float maxRGB = max(max(c.r, c.g), c.b);\n return (maxRGB > 1e-5 ? (maxRGB - c.b) / maxRGB : 0.) * rgba.a;\n}\nfloat getBlack(vec4 rgba) {\n vec3 c = clamp((rgba.rgb - 0.5) * u_contrast + 0.5, 0.0, 1.0);\n return (1. - max(max(c.r, c.g), c.b)) * rgba.a;\n}\n\nvec2 cellCenterPos(vec2 uv, vec2 cellOffset, float channelIdx) {\n vec2 cellCenter = floor(uv) + .5 + cellOffset;\n return cellCenter + (randomGB(cellCenter + channelIdx * 50.) - .5) * u_gridNoise;\n}\n\nvec2 gridToImageUV(vec2 cellCenter, float cosA, float sinA, float shift, vec2 pad) {\n vec2 uvGridToImage = mat2(cosA, -sinA, sinA, cosA) * (cellCenter - shift);\n return uvGridToImage * pad + 0.5;\n}\n\nvoid colorMask(vec2 pos, vec2 cellCenter, float rad, float transparency, float grain, float channelAddon, float channelgain, float generalComp, inout float outMask) {\n float dist = length(pos - cellCenter);\n\n float radius = rad;\n radius *= (1. + generalComp);\n radius += (.15 + channelgain * radius);\n radius = max(0., radius);\n radius = mix(0., radius, transparency);\n radius += channelAddon;\n radius *= (1. - grain);\n\n float mask = 1. - sst(0., radius, dist);\n mask = sst(.5 - .5 * u_softness, .51 + .49 * u_softness, mask);\n mask *= mix(1., mix(.5, 1., 1.5 * radius), u_softness);\n outMask += mask;\n}\n\nvec3 applyInk(vec3 paper, vec3 inkColor, float cov) {\n vec3 inkEffect = mix(vec3(1.0), inkColor, clamp(cov, 0.0, 1.0));\n return paper * inkEffect;\n}\n\nvoid main() {\n vec2 fragUV = gl_FragCoord.xy / iResolution.xy;\n vec2 uv = getImageCoverUV(fragUV, iResolution, u_imageAspectRatio);\n\n float cellsPerSide = mix(400.0, 7.0, pow(u_size, 0.7));\n float cellSizeY = 1.0 / cellsPerSide;\n vec2 pad = cellSizeY * vec2(1.0 / u_imageAspectRatio, 1.0);\n vec2 uvGrid = (uv - .5) / pad;\n float insideImageBox = getUvFrame(uv, pad);\n\n float generalComp = .1 * u_softness + .1 * u_gridNoise + .15;\n\n vec2 uvC = mat2(cosC, sinC, -sinC, cosC) * uvGrid + shiftC;\n vec2 uvM = mat2(cosM, sinM, -sinM, cosM) * uvGrid + shiftM;\n vec2 uvY = mat2(cosY, sinY, -sinY, cosY) * uvGrid + shiftY;\n vec2 uvK = mat2(cosK, sinK, -sinK, cosK) * uvGrid + shiftK;\n\n vec2 grainSize = mix(2000., 200., u_grainSize) * vec2(1., 1. / u_imageAspectRatio);\n vec2 grainUV = (fragUV - .5) * grainSize + .5;\n vec3 noiseValues = valueNoise3(grainUV);\n float grain = sst(.55, 1., noiseValues.r);\n grain *= u_grainMixer;\n\n vec4 outMask = vec4(0.);\n\n for (int dy = -1; dy <= 1; dy++) {\n for (int dx = -1; dx <= 1; dx++) {\n vec2 cellOffset = vec2(float(dx), float(dy));\n\n vec2 cellCenterC = cellCenterPos(uvC, cellOffset, 0.);\n vec4 texC = texture(u_image, gridToImageUV(cellCenterC, cosC, sinC, shiftC, pad));\n colorMask(uvC, cellCenterC, getCyan(texC), insideImageBox * texC.a, grain, u_floodC, u_gainC, generalComp, outMask[0]);\n\n vec2 cellCenterM = cellCenterPos(uvM, cellOffset, 1.);\n vec4 texM = texture(u_image, gridToImageUV(cellCenterM, cosM, sinM, shiftM, pad));\n colorMask(uvM, cellCenterM, getMagenta(texM), insideImageBox * texM.a, grain, u_floodM, u_gainM, generalComp, outMask[1]);\n\n vec2 cellCenterY = cellCenterPos(uvY, cellOffset, 2.);\n vec4 texY = texture(u_image, gridToImageUV(cellCenterY, cosY, sinY, shiftY, pad));\n colorMask(uvY, cellCenterY, getYellow(texY), insideImageBox * texY.a, grain, u_floodY, u_gainY, generalComp, outMask[2]);\n\n vec2 cellCenterK = cellCenterPos(uvK, cellOffset, 3.);\n vec4 texK = texture(u_image, gridToImageUV(cellCenterK, cosK, sinK, shiftK, pad));\n colorMask(uvK, cellCenterK, getBlack(texK), insideImageBox * texK.a, grain, u_floodK, u_gainK, generalComp, outMask[3]);\n }\n }\n\n float C = outMask[0] * u_colorC.a;\n float M = outMask[1] * u_colorM.a;\n float Y = outMask[2] * u_colorY.a;\n float K = outMask[3] * u_colorK.a;\n\n vec3 ink = vec3(1.);\n ink = applyInk(ink, u_colorK.rgb, K);\n ink = applyInk(ink, u_colorC.rgb, C);\n ink = applyInk(ink, u_colorM.rgb, M);\n ink = applyInk(ink, u_colorY.rgb, Y);\n\n float shape = clamp(max(max(C, M), max(Y, K)), 0., 1.);\n\n vec3 color = u_colorBack.rgb * u_colorBack.a;\n float opacity = u_colorBack.a;\n color = mix(color, ink, shape);\n opacity += shape;\n opacity = clamp(opacity, 0., 1.);\n\n float grainOverlay = mix(noiseValues.g, noiseValues.b, .5);\n grainOverlay = pow(grainOverlay, 1.3);\n float grainOverlayV = grainOverlay * 2. - 1.;\n vec3 grainOverlayColor = vec3(step(0., grainOverlayV));\n float grainOverlayStrength = u_grainOverlay * abs(grainOverlayV);\n grainOverlayStrength = pow(grainOverlayStrength, .8);\n color = mix(color, grainOverlayColor, .5 * grainOverlayStrength);\n\n opacity += .5 * grainOverlayStrength;\n opacity = clamp(opacity, 0., 1.);\n\n fragColor = vec4(color, opacity);\n}\n";
@@ -1,239 +0,0 @@
1
- import 'react/jsx-runtime';
2
- import 'react';
3
- import { glslHashVec2 } from '../shared/shaderNoise.glsl.js';
4
- import { glslImageCoverUV } from '../shared/imageUV.glsl.js';
5
-
6
- /**
7
- * HalftoneCmyk fragment shader — adapted from paper-design/shaders'
8
- * `halftone-cmyk.ts` (https://github.com/paper-design/shaders, Apache
9
- * License 2.0). An image filter: separates a source image into 4
10
- * classic-print-screen-angled CMYK halftone dot layers.
11
- *
12
- * Highest-complexity/cost effect in this port (up to ~36 texture reads per
13
- * pixel across 4 channels × a 3×3 cell neighborhood) — build/verify last,
14
- * most scrutiny, and keep the default `size` conservative.
15
- *
16
- * Trimmed for v1: paper-design's `ink`/`sharp` modes are omitted — this
17
- * ships the `dots` mode only (separate, discrete halftone dots; the
18
- * classic print look), which also lets this port drop the entire
19
- * single-pixel-sample "sharp" code path and its `RGBAtoCMYK`/contrast
20
- * machinery, cutting real per-pixel cost, not just API surface.
21
- *
22
- * Simplified from the original: image UV computed via the shared
23
- * `getImageCoverUV` cover-fit helper (see shared/imageUV.glsl.ts) instead of
24
- * paper-design's ShaderSizingParams fit engine; pure-hash GLSL instead of
25
- * pre-generated noise-texture sampling.
26
- */
27
- const halftoneCmykFragmentShader = `#version 300 es
28
- precision mediump float;
29
-
30
- uniform vec2 iResolution;
31
-
32
- uniform sampler2D u_image;
33
- uniform float u_imageAspectRatio;
34
-
35
- uniform vec4 u_colorBack;
36
- uniform vec4 u_colorC;
37
- uniform vec4 u_colorM;
38
- uniform vec4 u_colorY;
39
- uniform vec4 u_colorK;
40
- uniform float u_size;
41
- uniform float u_contrast;
42
- uniform float u_grainSize;
43
- uniform float u_grainMixer;
44
- uniform float u_grainOverlay;
45
- uniform float u_gridNoise;
46
- uniform float u_softness;
47
- uniform float u_floodC;
48
- uniform float u_floodM;
49
- uniform float u_floodY;
50
- uniform float u_floodK;
51
- uniform float u_gainC;
52
- uniform float u_gainM;
53
- uniform float u_gainY;
54
- uniform float u_gainK;
55
-
56
- out vec4 fragColor;
57
-
58
- const float shiftC = -.5;
59
- const float shiftM = -.25;
60
- const float shiftY = .2;
61
- const float shiftK = 0.;
62
-
63
- const float cosC = 0.9659258;
64
- const float sinC = 0.2588190;
65
- const float cosM = 0.2588190;
66
- const float sinM = 0.9659258;
67
- const float cosY = 1.0;
68
- const float sinY = 0.0;
69
- const float cosK = 0.7071068;
70
- const float sinK = 0.7071068;
71
-
72
- ${glslHashVec2}
73
- ${glslImageCoverUV}
74
-
75
- vec3 hash23(vec2 p) {
76
- vec3 p3 = fract(vec3(p.xyx) * vec3(0.3183099, 0.3678794, 0.3141592)) + 0.1;
77
- p3 += dot(p3, p3.yzx + 19.19);
78
- return fract(vec3(p3.x * p3.y, p3.y * p3.z, p3.z * p3.x));
79
- }
80
-
81
- float sst(float edge0, float edge1, float x) {
82
- return smoothstep(edge0, edge1, x);
83
- }
84
-
85
- vec3 valueNoise3(vec2 st) {
86
- vec2 i = floor(st);
87
- vec2 f = fract(st);
88
- vec3 a = hash23(i);
89
- vec3 b = hash23(i + vec2(1.0, 0.0));
90
- vec3 c = hash23(i + vec2(0.0, 1.0));
91
- vec3 d = hash23(i + vec2(1.0, 1.0));
92
- vec2 u = f * f * (3.0 - 2.0 * f);
93
- vec3 x1 = mix(a, b, u.x);
94
- vec3 x2 = mix(c, d, u.x);
95
- return mix(x1, x2, u.y);
96
- }
97
-
98
- float getUvFrame(vec2 uv, vec2 pad) {
99
- float left = smoothstep(-pad.x, 0., uv.x);
100
- float right = smoothstep(1. + pad.x, 1., uv.x);
101
- float bottom = smoothstep(-pad.y, 0., uv.y);
102
- float top = smoothstep(1. + pad.y, 1., uv.y);
103
- return left * right * bottom * top;
104
- }
105
-
106
- float getCyan(vec4 rgba) {
107
- vec3 c = clamp((rgba.rgb - 0.5) * u_contrast + 0.5, 0.0, 1.0);
108
- float maxRGB = max(max(c.r, c.g), c.b);
109
- return (maxRGB > 1e-5 ? (maxRGB - c.r) / maxRGB : 0.) * rgba.a;
110
- }
111
- float getMagenta(vec4 rgba) {
112
- vec3 c = clamp((rgba.rgb - 0.5) * u_contrast + 0.5, 0.0, 1.0);
113
- float maxRGB = max(max(c.r, c.g), c.b);
114
- return (maxRGB > 1e-5 ? (maxRGB - c.g) / maxRGB : 0.) * rgba.a;
115
- }
116
- float getYellow(vec4 rgba) {
117
- vec3 c = clamp((rgba.rgb - 0.5) * u_contrast + 0.5, 0.0, 1.0);
118
- float maxRGB = max(max(c.r, c.g), c.b);
119
- return (maxRGB > 1e-5 ? (maxRGB - c.b) / maxRGB : 0.) * rgba.a;
120
- }
121
- float getBlack(vec4 rgba) {
122
- vec3 c = clamp((rgba.rgb - 0.5) * u_contrast + 0.5, 0.0, 1.0);
123
- return (1. - max(max(c.r, c.g), c.b)) * rgba.a;
124
- }
125
-
126
- vec2 cellCenterPos(vec2 uv, vec2 cellOffset, float channelIdx) {
127
- vec2 cellCenter = floor(uv) + .5 + cellOffset;
128
- return cellCenter + (randomGB(cellCenter + channelIdx * 50.) - .5) * u_gridNoise;
129
- }
130
-
131
- vec2 gridToImageUV(vec2 cellCenter, float cosA, float sinA, float shift, vec2 pad) {
132
- vec2 uvGridToImage = mat2(cosA, -sinA, sinA, cosA) * (cellCenter - shift);
133
- return uvGridToImage * pad + 0.5;
134
- }
135
-
136
- void colorMask(vec2 pos, vec2 cellCenter, float rad, float transparency, float grain, float channelAddon, float channelgain, float generalComp, inout float outMask) {
137
- float dist = length(pos - cellCenter);
138
-
139
- float radius = rad;
140
- radius *= (1. + generalComp);
141
- radius += (.15 + channelgain * radius);
142
- radius = max(0., radius);
143
- radius = mix(0., radius, transparency);
144
- radius += channelAddon;
145
- radius *= (1. - grain);
146
-
147
- float mask = 1. - sst(0., radius, dist);
148
- mask = sst(.5 - .5 * u_softness, .51 + .49 * u_softness, mask);
149
- mask *= mix(1., mix(.5, 1., 1.5 * radius), u_softness);
150
- outMask += mask;
151
- }
152
-
153
- vec3 applyInk(vec3 paper, vec3 inkColor, float cov) {
154
- vec3 inkEffect = mix(vec3(1.0), inkColor, clamp(cov, 0.0, 1.0));
155
- return paper * inkEffect;
156
- }
157
-
158
- void main() {
159
- vec2 fragUV = gl_FragCoord.xy / iResolution.xy;
160
- vec2 uv = getImageCoverUV(fragUV, iResolution, u_imageAspectRatio);
161
-
162
- float cellsPerSide = mix(400.0, 7.0, pow(u_size, 0.7));
163
- float cellSizeY = 1.0 / cellsPerSide;
164
- vec2 pad = cellSizeY * vec2(1.0 / u_imageAspectRatio, 1.0);
165
- vec2 uvGrid = (uv - .5) / pad;
166
- float insideImageBox = getUvFrame(uv, pad);
167
-
168
- float generalComp = .1 * u_softness + .1 * u_gridNoise + .15;
169
-
170
- vec2 uvC = mat2(cosC, sinC, -sinC, cosC) * uvGrid + shiftC;
171
- vec2 uvM = mat2(cosM, sinM, -sinM, cosM) * uvGrid + shiftM;
172
- vec2 uvY = mat2(cosY, sinY, -sinY, cosY) * uvGrid + shiftY;
173
- vec2 uvK = mat2(cosK, sinK, -sinK, cosK) * uvGrid + shiftK;
174
-
175
- vec2 grainSize = mix(2000., 200., u_grainSize) * vec2(1., 1. / u_imageAspectRatio);
176
- vec2 grainUV = (fragUV - .5) * grainSize + .5;
177
- vec3 noiseValues = valueNoise3(grainUV);
178
- float grain = sst(.55, 1., noiseValues.r);
179
- grain *= u_grainMixer;
180
-
181
- vec4 outMask = vec4(0.);
182
-
183
- for (int dy = -1; dy <= 1; dy++) {
184
- for (int dx = -1; dx <= 1; dx++) {
185
- vec2 cellOffset = vec2(float(dx), float(dy));
186
-
187
- vec2 cellCenterC = cellCenterPos(uvC, cellOffset, 0.);
188
- vec4 texC = texture(u_image, gridToImageUV(cellCenterC, cosC, sinC, shiftC, pad));
189
- colorMask(uvC, cellCenterC, getCyan(texC), insideImageBox * texC.a, grain, u_floodC, u_gainC, generalComp, outMask[0]);
190
-
191
- vec2 cellCenterM = cellCenterPos(uvM, cellOffset, 1.);
192
- vec4 texM = texture(u_image, gridToImageUV(cellCenterM, cosM, sinM, shiftM, pad));
193
- colorMask(uvM, cellCenterM, getMagenta(texM), insideImageBox * texM.a, grain, u_floodM, u_gainM, generalComp, outMask[1]);
194
-
195
- vec2 cellCenterY = cellCenterPos(uvY, cellOffset, 2.);
196
- vec4 texY = texture(u_image, gridToImageUV(cellCenterY, cosY, sinY, shiftY, pad));
197
- colorMask(uvY, cellCenterY, getYellow(texY), insideImageBox * texY.a, grain, u_floodY, u_gainY, generalComp, outMask[2]);
198
-
199
- vec2 cellCenterK = cellCenterPos(uvK, cellOffset, 3.);
200
- vec4 texK = texture(u_image, gridToImageUV(cellCenterK, cosK, sinK, shiftK, pad));
201
- colorMask(uvK, cellCenterK, getBlack(texK), insideImageBox * texK.a, grain, u_floodK, u_gainK, generalComp, outMask[3]);
202
- }
203
- }
204
-
205
- float C = outMask[0] * u_colorC.a;
206
- float M = outMask[1] * u_colorM.a;
207
- float Y = outMask[2] * u_colorY.a;
208
- float K = outMask[3] * u_colorK.a;
209
-
210
- vec3 ink = vec3(1.);
211
- ink = applyInk(ink, u_colorK.rgb, K);
212
- ink = applyInk(ink, u_colorC.rgb, C);
213
- ink = applyInk(ink, u_colorM.rgb, M);
214
- ink = applyInk(ink, u_colorY.rgb, Y);
215
-
216
- float shape = clamp(max(max(C, M), max(Y, K)), 0., 1.);
217
-
218
- vec3 color = u_colorBack.rgb * u_colorBack.a;
219
- float opacity = u_colorBack.a;
220
- color = mix(color, ink, shape);
221
- opacity += shape;
222
- opacity = clamp(opacity, 0., 1.);
223
-
224
- float grainOverlay = mix(noiseValues.g, noiseValues.b, .5);
225
- grainOverlay = pow(grainOverlay, 1.3);
226
- float grainOverlayV = grainOverlay * 2. - 1.;
227
- vec3 grainOverlayColor = vec3(step(0., grainOverlayV));
228
- float grainOverlayStrength = u_grainOverlay * abs(grainOverlayV);
229
- grainOverlayStrength = pow(grainOverlayStrength, .8);
230
- color = mix(color, grainOverlayColor, .5 * grainOverlayStrength);
231
-
232
- opacity += .5 * grainOverlayStrength;
233
- opacity = clamp(opacity, 0., 1.);
234
-
235
- fragColor = vec4(color, opacity);
236
- }
237
- `;
238
-
239
- export { halftoneCmykFragmentShader };
@@ -1,52 +0,0 @@
1
- import type React from "react";
2
- import type { ShaderTextureSource } from "../shared";
3
- export interface HalftoneCmykProps extends React.HTMLAttributes<HTMLDivElement> {
4
- /** Source image (URL or an existing HTMLImageElement). Required. */
5
- image: ShaderTextureSource;
6
- /** Background CSS color (paper color). Default: 'var(--color-background)'. */
7
- colorBack?: string;
8
- /** Cyan ink color. Default: '#00b7eb' (print cyan). */
9
- colorC?: string;
10
- /** Magenta ink color. Default: '#e4007c' (print magenta). */
11
- colorM?: string;
12
- /** Yellow ink color. Default: '#ffe800' (print yellow). */
13
- colorY?: string;
14
- /** Black ink color. Default: 'var(--color-text-primary)'. */
15
- colorK?: string;
16
- /**
17
- * Dot grid density, 0-1 (lower = finer/denser grid = significantly more
18
- * GPU cost, up to ~36 texture reads/pixel across 4 channels). Default:
19
- * 0.6 — a deliberately conservative default; avoid using this effect as
20
- * a full-page background at low `size` values.
21
- */
22
- size?: number;
23
- /** Per-channel contrast, 0-1+. Default: 1. */
24
- contrast?: number;
25
- /** Dot edge softness, 0-1. Default: 0.3. */
26
- softness?: number;
27
- /** Per-cell dot-center jitter, 0-1. Default: 0.1. */
28
- gridNoise?: number;
29
- /** Grain texture scale, 0-1. Default: 0.5. */
30
- grainSize?: number;
31
- /** Grain influence on dot radii, 0-1. Default: 0. */
32
- grainMixer?: number;
33
- /** Post-composite grain overlay strength, 0-1. Default: 0. */
34
- grainOverlay?: number;
35
- /** Minimum-coverage flood for the cyan channel, 0-1. Default: 0. */
36
- floodC?: number;
37
- /** Minimum-coverage flood for the magenta channel, 0-1. Default: 0. */
38
- floodM?: number;
39
- /** Minimum-coverage flood for the yellow channel, 0-1. Default: 0. */
40
- floodY?: number;
41
- /** Minimum-coverage flood for the black channel, 0-1. Default: 0. */
42
- floodK?: number;
43
- /** Dot-size gain for the cyan channel, 0-1. Default: 0. */
44
- gainC?: number;
45
- /** Dot-size gain for the magenta channel, 0-1. Default: 0. */
46
- gainM?: number;
47
- /** Dot-size gain for the yellow channel, 0-1. Default: 0. */
48
- gainY?: number;
49
- /** Dot-size gain for the black channel, 0-1. Default: 0. */
50
- gainK?: number;
51
- className?: string;
52
- }
@@ -1,2 +0,0 @@
1
- export { HalftoneCmyk } from "./HalftoneCmyk";
2
- export type { HalftoneCmykProps } from "./HalftoneCmyk.types";
@@ -1,9 +0,0 @@
1
- import React from "react";
2
- import type { HalftoneDotsProps } from "./HalftoneDots.types";
3
- /**
4
- * Halftone-dot image filter — renders a source image as a luminance-driven
5
- * dot grid (classic/gooey/holes/soft ball styles, square or hex grid).
6
- * WebGL2-powered; falls back to the plain source image (via
7
- * `object-fit: cover`) when WebGL2 is unavailable.
8
- */
9
- export declare const HalftoneDots: React.FC<HalftoneDotsProps>;
@@ -1,68 +0,0 @@
1
- "use client";
2
- import { jsx } from 'react/jsx-runtime';
3
- import { useState, useMemo, useRef, useCallback } from 'react';
4
- import { useIsClient } from '../../../hooks/useIsClient.js';
5
- import 'motion/react';
6
- import { useDarkMode } from '../../../hooks/useDarkMode.js';
7
- import { cn } from '../../../utils/cn.js';
8
- import { ShaderCanvas } from '../shared/ShaderCanvas/ShaderCanvas.js';
9
- import { resolveShaderColor } from '../shared/resolveShaderColor.js';
10
- import { halftoneDotsFragmentShader } from './HalftoneDots.shaders.js';
11
- import { HALFTONE_DOTS_TYPES, HALFTONE_DOTS_GRIDS } from './HalftoneDots.types.js';
12
-
13
- const DEFAULT_COLOR_FRONT = "var(--color-text-primary)";
14
- const DEFAULT_COLOR_BACK = "var(--color-background)";
15
- function useWebgl2Supported() {
16
- return useMemo(() => {
17
- if (typeof document === "undefined")
18
- return false;
19
- try {
20
- return !!document.createElement("canvas").getContext("webgl2");
21
- }
22
- catch (_a) {
23
- return false;
24
- }
25
- }, []);
26
- }
27
- /**
28
- * Halftone-dot image filter — renders a source image as a luminance-driven
29
- * dot grid (classic/gooey/holes/soft ball styles, square or hex grid).
30
- * WebGL2-powered; falls back to the plain source image (via
31
- * `object-fit: cover`) when WebGL2 is unavailable.
32
- */
33
- const HalftoneDots = ({ image, colorFront = DEFAULT_COLOR_FRONT, colorBack = DEFAULT_COLOR_BACK, type = "classic", grid = "square", size = 0.6, radius = 0.8, contrast = 0.5, originalColors = false, inverted = false, grainMixer = 0, grainOverlay = 0, grainSize = 0.5, className, style, ...props }) => {
34
- const isClient = useIsClient();
35
- const isDark = useDarkMode();
36
- const webglSupported = useWebgl2Supported();
37
- const [imageAspectRatio, setImageAspectRatio] = useState(16 / 9);
38
- const resolvedFront = useMemo(() => resolveShaderColor(colorFront),
39
- // eslint-disable-next-line react-hooks/exhaustive-deps
40
- [colorFront, isDark]);
41
- const resolvedBack = useMemo(() => resolveShaderColor(colorBack),
42
- // eslint-disable-next-line react-hooks/exhaustive-deps
43
- [colorBack, isDark]);
44
- const texturesRef = useRef({ u_image: image });
45
- texturesRef.current.u_image = image;
46
- const handleTextureLoad = useCallback((name, aspectRatio) => {
47
- if (name === "u_image")
48
- setImageAspectRatio(aspectRatio);
49
- }, []);
50
- const uniformsRef = useRef({});
51
- uniformsRef.current.u_colorFront = resolvedFront;
52
- uniformsRef.current.u_colorBack = resolvedBack;
53
- uniformsRef.current.u_imageAspectRatio = imageAspectRatio;
54
- uniformsRef.current.u_type = HALFTONE_DOTS_TYPES[type];
55
- uniformsRef.current.u_grid = HALFTONE_DOTS_GRIDS[grid];
56
- uniformsRef.current.u_size = size;
57
- uniformsRef.current.u_radius = radius;
58
- uniformsRef.current.u_contrast = contrast;
59
- uniformsRef.current.u_originalColors = originalColors ? 1 : 0;
60
- uniformsRef.current.u_inverted = inverted ? 1 : 0;
61
- uniformsRef.current.u_grainMixer = grainMixer;
62
- uniformsRef.current.u_grainOverlay = grainOverlay;
63
- uniformsRef.current.u_grainSize = grainSize;
64
- const imageSrc = typeof image === "string" ? image : image.src;
65
- return (jsx("div", { className: cn("absolute inset-0 overflow-hidden pointer-events-none select-none", className), style: style, "aria-hidden": "true", ...props, children: isClient && webglSupported ? (jsx(ShaderCanvas, { fragmentShader: halftoneDotsFragmentShader, uniformsRef: uniformsRef, texturesRef: texturesRef, onTextureLoad: handleTextureLoad })) : (jsx("img", { src: imageSrc, alt: "", className: "absolute inset-0 w-full h-full object-cover" })) }));
66
- };
67
-
68
- export { HalftoneDots };
@@ -1,13 +0,0 @@
1
- /**
2
- * HalftoneDots fragment shader — adapted from paper-design/shaders'
3
- * `halftone-dots.ts` (https://github.com/paper-design/shaders, Apache
4
- * License 2.0). An image filter: renders a source image as a luminance-
5
- * driven halftone dot grid (classic/gooey/holes/soft ball styles, square or
6
- * hex grid).
7
- *
8
- * Simplified from the original: image UV computed via the shared
9
- * `getImageCoverUV` cover-fit helper (see shared/imageUV.glsl.ts) instead of
10
- * paper-design's ShaderSizingParams fit engine; pure-hash GLSL instead of
11
- * pre-generated noise-texture sampling.
12
- */
13
- export declare const halftoneDotsFragmentShader = "#version 300 es\nprecision mediump float;\n\nuniform vec2 iResolution;\n\nuniform vec4 u_colorFront;\nuniform vec4 u_colorBack;\nuniform float u_radius;\nuniform float u_contrast;\n\nuniform sampler2D u_image;\nuniform float u_imageAspectRatio;\n\nuniform float u_size;\nuniform float u_grainMixer;\nuniform float u_grainOverlay;\nuniform float u_grainSize;\nuniform float u_grid;\nuniform float u_originalColors;\nuniform float u_inverted;\nuniform float u_type;\n\nout vec4 fragColor;\n\n\nconst float PI = 3.14159265359;\nconst float TWO_PI = 6.28318530718;\n\n\nfloat randomR(vec2 st) {\n return fract(sin(dot(st, vec2(12.9898, 78.233))) * 43758.5453123);\n}\n\n\nvec2 getImageCoverUV(vec2 fragUV, vec2 resolution, float imageAspectRatio) {\n float containerAspect = resolution.x / resolution.y;\n // Container wider (relative to its height) than the image: sample a\n // narrower vertical slice of the image (crop top/bottom) so it fills the\n // container width with no letterboxing. Container narrower/taller than\n // the image: sample a narrower horizontal slice (crop left/right) instead.\n vec2 scale = containerAspect > imageAspectRatio\n ? vec2(1.0, imageAspectRatio / containerAspect)\n : vec2(containerAspect / imageAspectRatio, 1.0);\n return (fragUV - 0.5) * scale + 0.5;\n}\n\n\nfloat hash21(vec2 n) {\n return randomR(n);\n}\n\nfloat valueNoise(vec2 st) {\n vec2 i = floor(st);\n vec2 f = fract(st);\n float a = hash21(i);\n float b = hash21(i + vec2(1.0, 0.0));\n float c = hash21(i + vec2(0.0, 1.0));\n float d = hash21(i + vec2(1.0, 1.0));\n vec2 u = f * f * (3.0 - 2.0 * f);\n float x1 = mix(a, b, u.x);\n float x2 = mix(c, d, u.x);\n return mix(x1, x2, u.y);\n}\n\nfloat lst(float edge0, float edge1, float x) {\n return clamp((x - edge0) / (edge1 - edge0), 0.0, 1.0);\n}\n\nfloat sst(float edge0, float edge1, float x) {\n return smoothstep(edge0, edge1, x);\n}\n\nfloat getCircle(vec2 uv, float r, float baseR) {\n r = mix(.25 * baseR, 0., r);\n float d = length(uv - .5);\n float aa = fwidth(d);\n return 1. - smoothstep(r - aa, r + aa, d);\n}\n\nfloat getCell(vec2 uv) {\n float insideX = step(0.0, uv.x) * (1.0 - step(1.0, uv.x));\n float insideY = step(0.0, uv.y) * (1.0 - step(1.0, uv.y));\n return insideX * insideY;\n}\n\nfloat getCircleWithHole(vec2 uv, float r, float baseR) {\n float cell = getCell(uv);\n r = mix(.75 * baseR, 0., r);\n float rMod = mod(r, .5);\n float d = length(uv - .5);\n float aa = fwidth(d);\n float circle = 1. - smoothstep(rMod - aa, rMod + aa, d);\n if (r < .5) {\n return circle;\n } else {\n return cell - circle;\n }\n}\n\nfloat getGooeyBall(vec2 uv, float r, float baseR) {\n float d = length(uv - .5);\n float sizeRadius = .3;\n if (u_grid == 1.) {\n sizeRadius = .42;\n }\n sizeRadius = mix(sizeRadius * baseR, 0., r);\n d = 1. - sst(0., sizeRadius, d);\n d = pow(d, 2. + baseR);\n return d;\n}\n\nfloat getSoftBall(vec2 uv, float r, float baseR) {\n float d = length(uv - .5);\n float sizeRadius = clamp(baseR, 0., 1.);\n sizeRadius = mix(.5 * sizeRadius, 0., r);\n d = 1. - lst(0., sizeRadius, d);\n float powRadius = 1. - lst(0., 2., baseR);\n d = pow(d, 4. + 3. * powRadius);\n return d;\n}\n\nfloat getUvFrame(vec2 uv, vec2 pad) {\n float aa = 0.0001;\n float left = smoothstep(-pad.x, -pad.x + aa, uv.x);\n float right = smoothstep(1.0 + pad.x, 1.0 + pad.x - aa, uv.x);\n float bottom = smoothstep(-pad.y, -pad.y + aa, uv.y);\n float top = smoothstep(1.0 + pad.y, 1.0 + pad.y - aa, uv.y);\n return left * right * bottom * top;\n}\n\nfloat sigmoid(float x, float k) {\n return 1.0 / (1.0 + exp(-k * (x - 0.5)));\n}\n\nfloat getLumAtPx(vec2 uv, float contrast) {\n vec4 tex = texture(u_image, uv);\n vec3 c = vec3(sigmoid(tex.r, contrast), sigmoid(tex.g, contrast), sigmoid(tex.b, contrast));\n float lum = dot(vec3(0.2126, 0.7152, 0.0722), c);\n lum = mix(1., lum, tex.a);\n lum = mix(lum, 1. - lum, u_inverted);\n return lum;\n}\n\nfloat getLumBall(vec2 p, vec2 pad, vec2 inCellOffset, float contrast, float baseR, float stepSize, out vec4 ballColor) {\n p += inCellOffset;\n vec2 uv_i = floor(p);\n vec2 uv_f = fract(p);\n vec2 samplingUV = (uv_i + .5 - inCellOffset) * pad + vec2(.5);\n float outOfFrame = getUvFrame(samplingUV, pad * stepSize);\n\n float lum = getLumAtPx(samplingUV, contrast);\n ballColor = texture(u_image, samplingUV);\n ballColor.rgb *= ballColor.a;\n ballColor *= outOfFrame;\n\n float ball = 0.;\n if (u_type == 0.) {\n ball = getCircle(uv_f, lum, baseR);\n } else if (u_type == 1.) {\n ball = getGooeyBall(uv_f, lum, baseR);\n } else if (u_type == 2.) {\n ball = getCircleWithHole(uv_f, lum, baseR);\n } else if (u_type == 3.) {\n ball = getSoftBall(uv_f, lum, baseR);\n }\n\n return ball * outOfFrame;\n}\n\nvoid main() {\n float stepMultiplier = 1.;\n if (u_type == 0.) {\n stepMultiplier = 2.;\n } else if (u_type == 1. || u_type == 3.) {\n stepMultiplier = 6.;\n }\n\n float cellsPerSide = mix(300., 7., pow(u_size, .7));\n cellsPerSide /= stepMultiplier;\n float cellSizeY = 1. / cellsPerSide;\n vec2 pad = cellSizeY * vec2(1. / u_imageAspectRatio, 1.);\n if (u_type == 1. && u_grid == 1.) {\n pad *= .7;\n }\n\n vec2 fragUV = gl_FragCoord.xy / iResolution.xy;\n vec2 uv = getImageCoverUV(fragUV, iResolution, u_imageAspectRatio);\n uv -= vec2(.5);\n uv /= pad;\n\n float contrast = mix(0., 15., pow(u_contrast, 1.5));\n float baseRadius = u_radius;\n if (u_originalColors > 0.5) {\n contrast = mix(.1, 4., pow(u_contrast, 2.));\n baseRadius = 2. * pow(.5 * u_radius, .3);\n }\n\n float totalShape = 0.;\n vec3 totalColor = vec3(0.);\n float totalOpacity = 0.;\n\n vec4 ballColor;\n float shape;\n float stepSize = 1. / stepMultiplier;\n for (float x = -0.5; x < 0.5; x += stepSize) {\n for (float y = -0.5; y < 0.5; y += stepSize) {\n vec2 offset = vec2(x, y);\n\n if (u_grid == 1.) {\n float rowIndex = floor((y + .5) / stepSize);\n float colIndex = floor((x + .5) / stepSize);\n if (stepSize == 1.) {\n rowIndex = floor(uv.y + y + 1.);\n if (u_type == 1.) {\n colIndex = floor(uv.x + x + 1.);\n }\n }\n if (u_type == 1.) {\n if (mod(rowIndex + colIndex, 2.) == 1.) {\n continue;\n }\n } else {\n if (mod(rowIndex, 2.) == 1.) {\n offset.x += .5 * stepSize;\n }\n }\n }\n\n shape = getLumBall(uv, pad, offset, contrast, baseRadius, stepSize, ballColor);\n totalColor += ballColor.rgb * shape;\n totalShape += shape;\n totalOpacity += shape;\n }\n }\n\n const float eps = 1e-4;\n totalColor /= max(totalShape, eps);\n totalOpacity /= max(totalShape, eps);\n\n float finalShape = 0.;\n if (u_type == 0.) {\n finalShape = min(1., totalShape);\n } else if (u_type == 1.) {\n float aa = fwidth(totalShape);\n float th = .5;\n finalShape = smoothstep(th - aa, th + aa, totalShape);\n } else if (u_type == 2.) {\n finalShape = min(1., totalShape);\n } else if (u_type == 3.) {\n finalShape = totalShape;\n }\n\n vec2 grainSize = mix(2000., 200., u_grainSize) * vec2(1., 1. / u_imageAspectRatio);\n vec2 grainUV = fragUV - .5;\n grainUV *= grainSize;\n grainUV += .5;\n float grain = valueNoise(grainUV);\n grain = smoothstep(.55, .7 + .2 * u_grainMixer, grain);\n grain *= u_grainMixer;\n finalShape = mix(finalShape, 0., grain);\n\n vec3 color = vec3(0.);\n float opacity = 0.;\n\n if (u_originalColors > 0.5) {\n color = totalColor * finalShape;\n opacity = totalOpacity * finalShape;\n vec3 bgColor = u_colorBack.rgb * u_colorBack.a;\n color = color + bgColor * (1. - opacity);\n opacity = opacity + u_colorBack.a * (1. - opacity);\n } else {\n vec3 fgColor = u_colorFront.rgb * u_colorFront.a;\n float fgOpacity = u_colorFront.a;\n vec3 bgColor = u_colorBack.rgb * u_colorBack.a;\n float bgOpacity = u_colorBack.a;\n\n color = fgColor * finalShape;\n opacity = fgOpacity * finalShape;\n color += bgColor * (1. - opacity);\n opacity += bgOpacity * (1. - opacity);\n }\n\n float grainOverlay = valueNoise(grainUV + vec2(3.));\n grainOverlay = mix(grainOverlay, valueNoise(grainUV * 1.4 + vec2(-1.)), .5);\n grainOverlay = pow(grainOverlay, 1.3);\n float grainOverlayV = grainOverlay * 2. - 1.;\n vec3 grainOverlayColor = vec3(step(0., grainOverlayV));\n float grainOverlayStrength = u_grainOverlay * abs(grainOverlayV);\n grainOverlayStrength = pow(grainOverlayStrength, .8);\n color = mix(color, grainOverlayColor, .5 * grainOverlayStrength);\n opacity += .5 * grainOverlayStrength;\n opacity = clamp(opacity, 0., 1.);\n\n fragColor = vec4(color, opacity);\n}\n";