@nobak/design-system 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 (304) hide show
  1. package/LICENSE +73 -0
  2. package/README.md +142 -0
  3. package/lib/assets/icons.js +67 -0
  4. package/lib/components/AccountOverview/AccountOverview.js +122 -0
  5. package/lib/components/AdminPanel.js +58 -0
  6. package/lib/components/AssetExchange/AssetExchange.js +189 -0
  7. package/lib/components/AuthenticationFlow.js +216 -0
  8. package/lib/components/ConversationInterface/ConversationInterface.js +232 -0
  9. package/lib/components/DevFooter.js +38 -0
  10. package/lib/components/DevMenu.js +35 -0
  11. package/lib/components/DevSidebar.js +28 -0
  12. package/lib/components/DigitalDisplay.js +83 -0
  13. package/lib/components/Footer.js +45 -0
  14. package/lib/components/HeroContainer.js +10 -0
  15. package/lib/components/IntentRecognition/IntentRecognition.js +174 -0
  16. package/lib/components/Logo.js +259 -0
  17. package/lib/components/MenuBar.js +56 -0
  18. package/lib/components/NetworkSettings.js +223 -0
  19. package/lib/components/RecoverySetup/RecoverySetup.js +354 -0
  20. package/lib/components/RisingSun.js +122 -0
  21. package/lib/components/Symbol.js +226 -0
  22. package/lib/components/TransactionComposer/TransactionComposer.js +258 -0
  23. package/lib/components/TransactionConfirmation.js +184 -0
  24. package/lib/components/WalletMenu.js +33 -0
  25. package/lib/components/console/code/CodeBlock.js +150 -0
  26. package/lib/components/console/code/index.js +9 -0
  27. package/lib/components/console/data/DataTable.js +245 -0
  28. package/lib/components/console/data/MetricCard.js +79 -0
  29. package/lib/components/console/data/index.js +11 -0
  30. package/lib/components/console/documentation/index.js +10 -0
  31. package/lib/components/console/forms/APIKeyGenerator.js +261 -0
  32. package/lib/components/console/forms/SearchBar.js +210 -0
  33. package/lib/components/console/forms/index.js +10 -0
  34. package/lib/components/console/index.js +29 -0
  35. package/lib/components/console/layout/ConsoleCard.js +82 -0
  36. package/lib/components/console/layout/ConsoleLayout.js +86 -0
  37. package/lib/components/console/layout/index.js +10 -0
  38. package/lib/components/console/monitoring/StatusIndicator.js +128 -0
  39. package/lib/components/console/monitoring/index.js +9 -0
  40. package/lib/components/console/navigation/DevFooter.js +38 -0
  41. package/lib/components/console/navigation/DevMenu.js +35 -0
  42. package/lib/components/console/navigation/DevSidebar.js +28 -0
  43. package/lib/components/console/navigation/index.js +11 -0
  44. package/lib/components/console/settings/index.js +10 -0
  45. package/lib/components/index.js +12 -0
  46. package/lib/design/ColorPicker.stories.js +9 -0
  47. package/lib/design/HSLTool-V1.js +345 -0
  48. package/lib/design/HSLTool-V2.js +475 -0
  49. package/lib/design/HSLTool-V3.js +543 -0
  50. package/lib/design/HSLTool-V4.js +1139 -0
  51. package/lib/design/HSLTool.js +374 -0
  52. package/lib/design/OKLCHColorPicker.stories.js +24 -0
  53. package/lib/design/OKLCHTool.js +1014 -0
  54. package/lib/index.js +4 -0
  55. package/lib/shared/components/Avatar/Avatar.js +18 -0
  56. package/lib/shared/components/Avatar/index.js +1 -0
  57. package/lib/shared/components/Badge/Badge.js +34 -0
  58. package/lib/shared/components/Badge/index.js +1 -0
  59. package/lib/shared/components/Breadcrumb/Breadcrumb.js +13 -0
  60. package/lib/shared/components/Breadcrumb/index.js +1 -0
  61. package/lib/shared/components/Button/Button.js +184 -0
  62. package/lib/shared/components/Button/index.js +1 -0
  63. package/lib/shared/components/Calendar/Calendar.js +155 -0
  64. package/lib/shared/components/Calendar/CalendarDay.js +251 -0
  65. package/lib/shared/components/Calendar/CalendarHeader.js +88 -0
  66. package/lib/shared/components/Calendar/CalendarMonth.js +106 -0
  67. package/lib/shared/components/Calendar/CalendarWeek.js +267 -0
  68. package/lib/shared/components/Calendar/constants.js +73 -0
  69. package/lib/shared/components/Calendar/index.js +3 -0
  70. package/lib/shared/components/Calendar/types.d.js +0 -0
  71. package/lib/shared/components/Cartel/Cartel.js +44 -0
  72. package/lib/shared/components/Cartel/index.js +1 -0
  73. package/lib/shared/components/Cell/Cell.js +105 -0
  74. package/lib/shared/components/Cell/index.js +1 -0
  75. package/lib/shared/components/Checkbox/Checkbox.js +27 -0
  76. package/lib/shared/components/Checkbox/index.js +1 -0
  77. package/lib/shared/components/Clock/Clock.js +6 -0
  78. package/lib/shared/components/Clock/index.js +1 -0
  79. package/lib/shared/components/ColorChecker/ColorChecker.js +89 -0
  80. package/lib/shared/components/ColorChecker/index.js +2 -0
  81. package/lib/shared/components/ColorChecker/utils.js +159 -0
  82. package/lib/shared/components/Command/Command.js +95 -0
  83. package/lib/shared/components/Command/index.js +1 -0
  84. package/lib/shared/components/Container/Container.js +18 -0
  85. package/lib/shared/components/Container/index.js +1 -0
  86. package/lib/shared/components/Cover/Cover.js +17 -0
  87. package/lib/shared/components/Cover/index.js +1 -0
  88. package/lib/shared/components/DatePicker/DatePicker.js +52 -0
  89. package/lib/shared/components/DatePicker/components/Calendar.js +125 -0
  90. package/lib/shared/components/DatePicker/components/CalendarDay.js +23 -0
  91. package/lib/shared/components/DatePicker/components/DateWrapper.js +15 -0
  92. package/lib/shared/components/DatePicker/components/index.js +2 -0
  93. package/lib/shared/components/DatePicker/index.js +1 -0
  94. package/lib/shared/components/DateTime/DateTime.js +51 -0
  95. package/lib/shared/components/DateTime/index.js +1 -0
  96. package/lib/shared/components/Debug/Debug.js +12 -0
  97. package/lib/shared/components/Debug/index.js +1 -0
  98. package/lib/shared/components/Disclosure/Disclosure.js +31 -0
  99. package/lib/shared/components/Disclosure/index.js +1 -0
  100. package/lib/shared/components/Dropdown/Dropdown.js +91 -0
  101. package/lib/shared/components/Dropdown/index.js +1 -0
  102. package/lib/shared/components/EmptyState/EmptyState.js +40 -0
  103. package/lib/shared/components/EmptyState/index.js +1 -0
  104. package/lib/shared/components/Form/Form.js +41 -0
  105. package/lib/shared/components/Form/components/DynamicForm.js +66 -0
  106. package/lib/shared/components/Form/components/StepperForm.js +266 -0
  107. package/lib/shared/components/Form/components/index.js +2 -0
  108. package/lib/shared/components/Form/context/Form.js +164 -0
  109. package/lib/shared/components/Form/context/index.js +1 -0
  110. package/lib/shared/components/Form/index.js +1 -0
  111. package/lib/shared/components/Form/types.d.js +1 -0
  112. package/lib/shared/components/Form/utils/index.js +31 -0
  113. package/lib/shared/components/GroupItems/GroupItems.js +17 -0
  114. package/lib/shared/components/GroupItems/index.js +1 -0
  115. package/lib/shared/components/Header/Header.js +26 -0
  116. package/lib/shared/components/Header/index.js +1 -0
  117. package/lib/shared/components/Heading/Heading.js +5 -0
  118. package/lib/shared/components/Heading/index.js +1 -0
  119. package/lib/shared/components/Icon/Icon.js +28 -0
  120. package/lib/shared/components/Icon/index.js +1 -0
  121. package/lib/shared/components/Identicons/Identicons.js +6 -0
  122. package/lib/shared/components/Identicons/index.d.js +0 -0
  123. package/lib/shared/components/Identicons/index.js +1 -0
  124. package/lib/shared/components/Image/Image.js +22 -0
  125. package/lib/shared/components/Image/index.js +1 -0
  126. package/lib/shared/components/Input/Input.js +201 -0
  127. package/lib/shared/components/Input/components/CheckBoxInput.js +81 -0
  128. package/lib/shared/components/Input/components/DateInput.js +89 -0
  129. package/lib/shared/components/Input/components/DefaultInput.js +102 -0
  130. package/lib/shared/components/Input/components/FileReaderInput.js +88 -0
  131. package/lib/shared/components/Input/components/NumberInput.js +141 -0
  132. package/lib/shared/components/Input/components/PickerInput.js +122 -0
  133. package/lib/shared/components/Input/components/RCInput.js +112 -0
  134. package/lib/shared/components/Input/components/Radiobox/RadioboxBasic.js +56 -0
  135. package/lib/shared/components/Input/components/Radiobox/RadioboxCard.js +27 -0
  136. package/lib/shared/components/Input/components/Radiobox/RadioboxFull.js +44 -0
  137. package/lib/shared/components/Input/components/Radiobox/index.js +3 -0
  138. package/lib/shared/components/Input/components/RadioboxInput.js +102 -0
  139. package/lib/shared/components/Input/components/SelectInput.js +70 -0
  140. package/lib/shared/components/Input/components/TextAreaInput.js +67 -0
  141. package/lib/shared/components/Input/components/TextInput.js +139 -0
  142. package/lib/shared/components/Input/components/TimeInput.js +37 -0
  143. package/lib/shared/components/Input/components/UploadFileInput.js +123 -0
  144. package/lib/shared/components/Input/components/index.js +13 -0
  145. package/lib/shared/components/Input/components/types.d.js +0 -0
  146. package/lib/shared/components/Input/index.js +1 -0
  147. package/lib/shared/components/Input/types.d.js +0 -0
  148. package/lib/shared/components/Layout/Layout.js +13 -0
  149. package/lib/shared/components/Layout/index.js +1 -0
  150. package/lib/shared/components/List/List.js +30 -0
  151. package/lib/shared/components/List/index.js +1 -0
  152. package/lib/shared/components/Loader/Loader.js +27 -0
  153. package/lib/shared/components/Loader/index.js +1 -0
  154. package/lib/shared/components/Modal/Modal.js +102 -0
  155. package/lib/shared/components/Modal/index.js +1 -0
  156. package/lib/shared/components/Notification/Notification.js +39 -0
  157. package/lib/shared/components/Notification/index.js +1 -0
  158. package/lib/shared/components/Person/Person.js +81 -0
  159. package/lib/shared/components/Person/index.js +1 -0
  160. package/lib/shared/components/Popover/Popover.js +39 -0
  161. package/lib/shared/components/Popover/index.js +1 -0
  162. package/lib/shared/components/QRCode/QRCode.js +329 -0
  163. package/lib/shared/components/QRCode/index.js +1 -0
  164. package/lib/shared/components/RadioGroup/RadioGroup.js +35 -0
  165. package/lib/shared/components/RadioGroup/components/DefaultGroup.js +71 -0
  166. package/lib/shared/components/RadioGroup/components/VerticalGroup.js +83 -0
  167. package/lib/shared/components/RadioGroup/components/index.js +2 -0
  168. package/lib/shared/components/RadioGroup/index.js +1 -0
  169. package/lib/shared/components/Search/Search.js +12 -0
  170. package/lib/shared/components/Search/index.js +1 -0
  171. package/lib/shared/components/Select/Select.js +90 -0
  172. package/lib/shared/components/Select/index.js +1 -0
  173. package/lib/shared/components/Sidebar/Sidebar.js +42 -0
  174. package/lib/shared/components/Sidebar/index.js +1 -0
  175. package/lib/shared/components/SlideOver/SlideOver.js +81 -0
  176. package/lib/shared/components/SlideOver/index.js +1 -0
  177. package/lib/shared/components/Slider/Slider.js +80 -0
  178. package/lib/shared/components/Slider/index.js +1 -0
  179. package/lib/shared/components/Stepper/Stepper.js +32 -0
  180. package/lib/shared/components/Stepper/index.js +1 -0
  181. package/lib/shared/components/Steps/Steps.js +53 -0
  182. package/lib/shared/components/Steps/index.js +1 -0
  183. package/lib/shared/components/Switch/Switch.js +26 -0
  184. package/lib/shared/components/Switch/index.js +1 -0
  185. package/lib/shared/components/Tab/Tab.js +59 -0
  186. package/lib/shared/components/Tab/index.js +1 -0
  187. package/lib/shared/components/Table/Table.js +47 -0
  188. package/lib/shared/components/Table/index.js +1 -0
  189. package/lib/shared/components/Text/Text.js +11 -0
  190. package/lib/shared/components/Text/index.js +1 -0
  191. package/lib/shared/components/TextList/TextList.js +15 -0
  192. package/lib/shared/components/TextList/index.js +1 -0
  193. package/lib/shared/components/TimePicker/TimePicker.js +161 -0
  194. package/lib/shared/components/TimePicker/index.js +1 -0
  195. package/lib/shared/components/Tooltip/Tooltip.js +13 -0
  196. package/lib/shared/components/Tooltip/index.js +1 -0
  197. package/lib/shared/components/Uploader/Uploader.js +63 -0
  198. package/lib/shared/components/Uploader/index.js +1 -0
  199. package/lib/shared/components/Video/Video.js +20 -0
  200. package/lib/shared/components/Video/index.js +1 -0
  201. package/lib/shared/components/index.d.js +0 -0
  202. package/lib/shared/components/index.js +50 -0
  203. package/lib/shared/elements/Color/ColorPallet.js +20 -0
  204. package/lib/shared/elements/Color/index.js +1 -0
  205. package/lib/shared/elements/Text.js +37 -0
  206. package/lib/shared/elements/index.js +1 -0
  207. package/lib/shared/helpers/FakeLink.js +8 -0
  208. package/lib/shared/helpers/constants.js +359 -0
  209. package/lib/shared/helpers/index.js +2 -0
  210. package/lib/shared/helpers/isEqual.js +56 -0
  211. package/lib/shared/index.d.js +0 -0
  212. package/lib/shared/index.js +1 -0
  213. package/lib/shared/stories/components/Avatar.stories.js +17 -0
  214. package/lib/shared/stories/components/Badge.stories.dev.js +37 -0
  215. package/lib/shared/stories/components/Button.stories.js +553 -0
  216. package/lib/shared/stories/components/Calendar.stories.js +62 -0
  217. package/lib/shared/stories/components/Cartel.stories.js +32 -0
  218. package/lib/shared/stories/components/Checkbox.stories.js +15 -0
  219. package/lib/shared/stories/components/ColorChecker.stories.dev.js +16 -0
  220. package/lib/shared/stories/components/DateTime.stories.js +27 -0
  221. package/lib/shared/stories/components/Disclosure.stories.js +30 -0
  222. package/lib/shared/stories/components/Dropdown.stories.js +39 -0
  223. package/lib/shared/stories/components/Form/Default.stories.js +201 -0
  224. package/lib/shared/stories/components/Form/DummyForm.stories.js +48 -0
  225. package/lib/shared/stories/components/Form/DynamicForm.stories.js +155 -0
  226. package/lib/shared/stories/components/Form/StepperForm.stories.js +138 -0
  227. package/lib/shared/stories/components/Form/ValidateForm.stories.js +70 -0
  228. package/lib/shared/stories/components/Form/Validation.stories.js +184 -0
  229. package/lib/shared/stories/components/GroupItems.stories.js +23 -0
  230. package/lib/shared/stories/components/Header.stories.js +29 -0
  231. package/lib/shared/stories/components/Heading.stories.js +27 -0
  232. package/lib/shared/stories/components/Icon.stories.js +22 -0
  233. package/lib/shared/stories/components/Image.stories.js +23 -0
  234. package/lib/shared/stories/components/Input/Checkbox.stories.js +45 -0
  235. package/lib/shared/stories/components/Input/DatePicker.stories.js +23 -0
  236. package/lib/shared/stories/components/Input/Defaut.stories.js +24 -0
  237. package/lib/shared/stories/components/Input/Number.stories.js +24 -0
  238. package/lib/shared/stories/components/Input/RCI.stories.js +59 -0
  239. package/lib/shared/stories/components/Input/Radiobox.stories.dev.js +28 -0
  240. package/lib/shared/stories/components/Input/Select.stories.dev.js +27 -0
  241. package/lib/shared/stories/components/Input/SelectMultiple.stories.dev.js +510 -0
  242. package/lib/shared/stories/components/Input/Textarea.stories.js +24 -0
  243. package/lib/shared/stories/components/List.stories.js +34 -0
  244. package/lib/shared/stories/components/Loader.stories.js +15 -0
  245. package/lib/shared/stories/components/Modal.stories.js +50 -0
  246. package/lib/shared/stories/components/Notification.stories.js +22 -0
  247. package/lib/shared/stories/components/Person.stories.js +41 -0
  248. package/lib/shared/stories/components/Picker.stories.js +15 -0
  249. package/lib/shared/stories/components/Popover.stories.js +36 -0
  250. package/lib/shared/stories/components/QRCode.stories.js +20 -0
  251. package/lib/shared/stories/components/RadioGroup.stories.js +56 -0
  252. package/lib/shared/stories/components/Select.stories.js +50 -0
  253. package/lib/shared/stories/components/Sidebar.stories.js +35 -0
  254. package/lib/shared/stories/components/Slider.stories.dev.js +48 -0
  255. package/lib/shared/stories/components/Stepper/Stepper.stories.js +38 -0
  256. package/lib/shared/stories/components/Steps.stories.js +15 -0
  257. package/lib/shared/stories/components/Switch.stories.js +15 -0
  258. package/lib/shared/stories/components/Tab.stories.js +15 -0
  259. package/lib/shared/stories/components/Table.stories.js +95 -0
  260. package/lib/shared/stories/components/TextList.stories.js +23 -0
  261. package/lib/shared/stories/components/Tooltip.stories.dev.js +40 -0
  262. package/lib/shared/stories/elements/Color.stories.js +269 -0
  263. package/lib/shared/stories/elements/Text.stories.js +45 -0
  264. package/lib/shared/types/index.js +1 -0
  265. package/lib/stories/Foundation/BrandIdentity.prod.stories.js +510 -0
  266. package/lib/stories/Foundation/Logo.stories.js +19 -0
  267. package/lib/stories/Foundation/RisingSun.stories.js +16 -0
  268. package/lib/stories/Foundation/Shadows.stories.js +601 -0
  269. package/lib/stories/Foundation/Symbol.stories.js +18 -0
  270. package/lib/stories/HeroContainer.stories.js +18 -0
  271. package/lib/styles/accessibilityTokens.js +72 -0
  272. package/lib/styles/borderWidth.js +10 -0
  273. package/lib/styles/colors.js +303 -0
  274. package/lib/styles/elevation.js +240 -0
  275. package/lib/styles/icons.js +218 -0
  276. package/lib/styles/index.js +29 -0
  277. package/lib/styles/motion.js +668 -0
  278. package/lib/styles/opacity.js +10 -0
  279. package/lib/styles/radius.js +11 -0
  280. package/lib/styles/sizing.js +35 -0
  281. package/lib/styles/space.js +24 -0
  282. package/lib/styles/theme/darkTheme.js +471 -0
  283. package/lib/styles/theme/index.js +44 -0
  284. package/lib/styles/theme/lightTheme.js +480 -0
  285. package/lib/styles/theme/themeTypes.js +1 -0
  286. package/lib/styles/theme/themeUtils.js +63 -0
  287. package/lib/styles/typography-advanced.js +510 -0
  288. package/lib/styles/typography.js +1419 -0
  289. package/lib/styles/zIndex.js +19 -0
  290. package/lib/tokens/borders.js +161 -0
  291. package/lib/tokens/colors.js +426 -0
  292. package/lib/tokens/components.js +499 -0
  293. package/lib/tokens/index.js +84 -0
  294. package/lib/tokens/lighting.js +384 -0
  295. package/lib/tokens/motion.js +284 -0
  296. package/lib/tokens/semantic.js +367 -0
  297. package/lib/tokens/shadows.js +114 -0
  298. package/lib/tokens/spacing.js +189 -0
  299. package/lib/tokens/typography.js +268 -0
  300. package/package.json +176 -0
  301. package/styles/generated-tokens.css +677 -0
  302. package/styles/index.css +2 -0
  303. package/styles/main.css +610 -0
  304. package/tailwind.config.js +64 -0
@@ -0,0 +1,475 @@
1
+ function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
2
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
3
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
4
+ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
5
+ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
6
+ function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
7
+ import React, { useState, useRef, useCallback } from 'react';
8
+ import { rgbToHex } from "../shared/components/ColorChecker/utils";
9
+
10
+ // Helper: Convert HSL to RGB
11
+ function hslToRgb(h, s, l) {
12
+ // Clamp lightness to 0-100 before conversion
13
+ l = Math.max(0, Math.min(100, l));
14
+ s /= 100;
15
+ l /= 100;
16
+ var c = (1 - Math.abs(2 * l - 1)) * s;
17
+ var x = c * (1 - Math.abs(h / 60 % 2 - 1));
18
+ var m = l - c / 2;
19
+ var r = 0,
20
+ g = 0,
21
+ b = 0;
22
+ if (0 <= h && h < 60) {
23
+ r = c;
24
+ g = x;
25
+ b = 0;
26
+ } else if (60 <= h && h < 120) {
27
+ r = x;
28
+ g = c;
29
+ b = 0;
30
+ } else if (120 <= h && h < 180) {
31
+ r = 0;
32
+ g = c;
33
+ b = x;
34
+ } else if (180 <= h && h < 240) {
35
+ r = 0;
36
+ g = x;
37
+ b = c;
38
+ } else if (240 <= h && h < 300) {
39
+ r = x;
40
+ g = 0;
41
+ b = c;
42
+ } else if (300 <= h && h < 360) {
43
+ r = c;
44
+ g = 0;
45
+ b = x;
46
+ }
47
+ return {
48
+ r: Math.round((r + m) * 255),
49
+ g: Math.round((g + m) * 255),
50
+ b: Math.round((b + m) * 255)
51
+ };
52
+ }
53
+
54
+ // Helper: Cubic Bezier interpolation
55
+ function cubicBezier(t, p0, c1, c2, p3) {
56
+ var x = Math.pow(1 - t, 3) * p0[0] + 3 * Math.pow(1 - t, 2) * t * c1[0] + 3 * (1 - t) * Math.pow(t, 2) * c2[0] + Math.pow(t, 3) * p3[0];
57
+ var y = Math.pow(1 - t, 3) * p0[1] + 3 * Math.pow(1 - t, 2) * t * c1[1] + 3 * (1 - t) * Math.pow(t, 2) * c2[1] + Math.pow(t, 3) * p3[1];
58
+ return [x, y];
59
+ }
60
+ export var HSLTool = function HSLTool() {
61
+ var width = 1200;
62
+ var height = 480;
63
+ var lightnessRange = 70; // +/- 35 from baseLightness
64
+ var maxTotalPoints = 99;
65
+
66
+ // State
67
+ var _useState = useState(220),
68
+ _useState2 = _slicedToArray(_useState, 2),
69
+ hue = _useState2[0],
70
+ setHue = _useState2[1];
71
+ var _useState3 = useState(80),
72
+ _useState4 = _slicedToArray(_useState3, 2),
73
+ sat = _useState4[0],
74
+ setSat = _useState4[1];
75
+ var _useState5 = useState(50),
76
+ _useState6 = _slicedToArray(_useState5, 2),
77
+ baseLightness = _useState6[0],
78
+ setBaseLightness = _useState6[1]; // Base Lightness
79
+ var _useState7 = useState(5),
80
+ _useState8 = _slicedToArray(_useState7, 2),
81
+ baseColorCount = _useState8[0],
82
+ setBaseColorCount = _useState8[1]; // Base colors (3, 5, or 7)
83
+ var _useState9 = useState(1),
84
+ _useState0 = _slicedToArray(_useState9, 2),
85
+ multiplier = _useState0[0],
86
+ setMultiplier = _useState0[1]; // Multiplier (1x, 2x, 3x, 4x)
87
+
88
+ // Curve control points (A, C, and Handles for Cubic Bezier) - Default to half-circle shape
89
+ var _useState1 = useState([0, height]),
90
+ _useState10 = _slicedToArray(_useState1, 2),
91
+ start = _useState10[0],
92
+ setStart = _useState10[1]; // A (P0) - Bottom Left
93
+ var _useState11 = useState([width, height]),
94
+ _useState12 = _slicedToArray(_useState11, 2),
95
+ end = _useState12[0],
96
+ setEnd = _useState12[1]; // C (P3) - Bottom Right
97
+ var _useState13 = useState([width * 0.3, 0]),
98
+ _useState14 = _slicedToArray(_useState13, 2),
99
+ handle1 = _useState14[0],
100
+ setHandle1 = _useState14[1]; // C1 - Pulls up near A
101
+ var _useState15 = useState([width * 0.7, 0]),
102
+ _useState16 = _slicedToArray(_useState15, 2),
103
+ handle2 = _useState16[0],
104
+ setHandle2 = _useState16[1]; // C2 - Pulls up near C
105
+
106
+ // Drag state
107
+ var dragRef = useRef({
108
+ point: null
109
+ });
110
+
111
+ // Clipboard feedback state
112
+ var _useState17 = useState(null),
113
+ _useState18 = _slicedToArray(_useState17, 2),
114
+ copiedHex = _useState18[0],
115
+ setCopiedHex = _useState18[1];
116
+ var copyTimeoutRef = useRef(null);
117
+
118
+ // Derived Calculations
119
+ var calculatedTotalPoints = baseColorCount * multiplier;
120
+ var totalPoints = Math.max(3, Math.min(maxTotalPoints, calculatedTotalPoints)); // Ensure at least 3 points, max 99
121
+ var pointsT = Array.from({
122
+ length: totalPoints
123
+ }, function (_, i) {
124
+ return i / (totalPoints - 1);
125
+ }); // Parameter t for each point
126
+
127
+ // Find middle index for the single primary ascendant color
128
+ var middleIndex = Math.floor(totalPoints / 2);
129
+ // Find the offset for secondary middle points within each base group
130
+ var baseMiddleOffset = Math.ceil(baseColorCount / 2);
131
+
132
+ // Generate color swatches data
133
+ var colorSwatches = pointsT.map(function (t, i) {
134
+ var _cubicBezier = cubicBezier(t, start, handle1, handle2, end),
135
+ _cubicBezier2 = _slicedToArray(_cubicBezier, 2),
136
+ px = _cubicBezier2[0],
137
+ py = _cubicBezier2[1];
138
+ var clampedPy = Math.max(0, Math.min(height, py)); // Clamp y within bounds
139
+ // Calculate lightness based on curve position, centered around baseLightness
140
+ var l = baseLightness + (0.5 - clampedPy / height) * lightnessRange;
141
+ var finalL = Math.max(0, Math.min(100, l)); // Clamp lightness 0-100
142
+
143
+ var rgb = hslToRgb(hue, sat, finalL); // Use current H, S, and calculated L
144
+ var hex = rgbToHex(rgb.r, rgb.g, rgb.b);
145
+
146
+ // Determine border status
147
+ var isPrimaryMiddle = i === middleIndex;
148
+ // Check if it's a secondary middle *and not* the primary middle
149
+ var isSecondaryMiddle = (i + 1) % baseColorCount === baseMiddleOffset && !isPrimaryMiddle;
150
+ return {
151
+ t: t,
152
+ hex: hex,
153
+ l: finalL,
154
+ isPrimaryMiddle: isPrimaryMiddle,
155
+ isSecondaryMiddle: isSecondaryMiddle
156
+ }; // Include border flags
157
+ });
158
+
159
+ // Event Handlers
160
+ var handleDragStart = useCallback(function (point, e) {
161
+ e.preventDefault();
162
+ e.stopPropagation();
163
+ dragRef.current.point = point;
164
+ document.body.style.cursor = 'grabbing';
165
+ }, []);
166
+ var handleDrag = useCallback(function (e) {
167
+ if (!dragRef.current.point) return;
168
+ var svg = e.currentTarget;
169
+ var CTM = svg.getScreenCTM();
170
+ if (!CTM) return;
171
+ var pt = svg.createSVGPoint();
172
+ pt.x = e.clientX;
173
+ pt.y = e.clientY;
174
+ pt = pt.matrixTransform(CTM.inverse());
175
+ var x = pt.x;
176
+ var y = pt.y;
177
+
178
+ // Clamp to bounds (allow Y to go slightly outside for handles)
179
+ x = Math.max(0, Math.min(width, x));
180
+ y = Math.max(-32, Math.min(height + 32, y)); // Allow handles to go slightly above/below
181
+
182
+ switch (dragRef.current.point) {
183
+ case 'A':
184
+ setStart([x, y]);
185
+ break;
186
+ case 'C':
187
+ setEnd([x, y]);
188
+ break;
189
+ case 'HANDLE1':
190
+ setHandle1([x, y]);
191
+ break;
192
+ // Update Handle 1
193
+ case 'HANDLE2':
194
+ setHandle2([x, y]);
195
+ break;
196
+ // Update Handle 2
197
+ }
198
+ }, [width, height]);
199
+ var handleDragEnd = useCallback(function () {
200
+ if (dragRef.current.point) {
201
+ dragRef.current.point = null;
202
+ document.body.style.cursor = '';
203
+ }
204
+ }, []);
205
+
206
+ // Copy to clipboard handler
207
+ var handleCopyHex = useCallback(function (hex) {
208
+ navigator.clipboard.writeText(hex).then(function () {
209
+ setCopiedHex(hex);
210
+ if (copyTimeoutRef.current) {
211
+ clearTimeout(copyTimeoutRef.current);
212
+ }
213
+ copyTimeoutRef.current = setTimeout(function () {
214
+ setCopiedHex(null);
215
+ copyTimeoutRef.current = null;
216
+ }, 1500);
217
+ })["catch"](function (err) {
218
+ console.error('Failed to copy hex:', err);
219
+ });
220
+ }, []);
221
+
222
+ // Cleanup timeout on unmount
223
+ React.useEffect(function () {
224
+ return function () {
225
+ if (copyTimeoutRef.current) {
226
+ clearTimeout(copyTimeoutRef.current);
227
+ }
228
+ };
229
+ }, []);
230
+
231
+ // Bezier path string (Cubic)
232
+ var pathD = "M ".concat(start[0], " ").concat(start[1], " C ").concat(handle1[0], " ").concat(handle1[1], " ").concat(handle2[0], " ").concat(handle2[1], " ").concat(end[0], " ").concat(end[1]);
233
+ return /*#__PURE__*/React.createElement("div", {
234
+ className: "p-4"
235
+ }, /*#__PURE__*/React.createElement("div", {
236
+ className: "flex flex-wrap justify-center items-center gap-x-6 gap-y-3 mb-4"
237
+ }, /*#__PURE__*/React.createElement("label", {
238
+ className: "flex items-center gap-1"
239
+ }, /*#__PURE__*/React.createElement("span", {
240
+ className: "text-sm font-medium w-10"
241
+ }, "Hue:"), /*#__PURE__*/React.createElement("input", {
242
+ type: "range",
243
+ min: "0",
244
+ max: "360",
245
+ value: hue,
246
+ onChange: function onChange(e) {
247
+ return setHue(Number(e.target.value));
248
+ },
249
+ className: "w-32"
250
+ }), /*#__PURE__*/React.createElement("span", {
251
+ className: "text-sm w-8 text-right"
252
+ }, hue, "\xB0")), /*#__PURE__*/React.createElement("label", {
253
+ className: "flex items-center gap-1"
254
+ }, /*#__PURE__*/React.createElement("span", {
255
+ className: "text-sm font-medium w-10"
256
+ }, "Sat:"), /*#__PURE__*/React.createElement("input", {
257
+ type: "range",
258
+ min: "0",
259
+ max: "100",
260
+ value: sat,
261
+ onChange: function onChange(e) {
262
+ return setSat(Number(e.target.value));
263
+ },
264
+ className: "w-24"
265
+ }), /*#__PURE__*/React.createElement("span", {
266
+ className: "text-sm w-8 text-right"
267
+ }, sat, "%")), /*#__PURE__*/React.createElement("label", {
268
+ className: "flex items-center gap-1"
269
+ }, /*#__PURE__*/React.createElement("span", {
270
+ className: "text-sm font-medium w-10"
271
+ }, "Light:"), /*#__PURE__*/React.createElement("input", {
272
+ type: "range",
273
+ min: "0",
274
+ max: "100",
275
+ value: baseLightness,
276
+ onChange: function onChange(e) {
277
+ return setBaseLightness(Number(e.target.value));
278
+ },
279
+ className: "w-24"
280
+ }), /*#__PURE__*/React.createElement("span", {
281
+ className: "text-sm w-8 text-right"
282
+ }, baseLightness, "%")), /*#__PURE__*/React.createElement("div", {
283
+ className: "flex items-center gap-2"
284
+ }, /*#__PURE__*/React.createElement("span", {
285
+ className: "text-sm font-medium"
286
+ }, "Base Colors:"), [3, 5, 7].map(function (numCols) {
287
+ return /*#__PURE__*/React.createElement("label", {
288
+ key: numCols,
289
+ className: "flex items-center gap-1 cursor-pointer"
290
+ }, /*#__PURE__*/React.createElement("input", {
291
+ type: "radio",
292
+ name: "baseColorCount",
293
+ value: numCols,
294
+ checked: baseColorCount === numCols,
295
+ onChange: function onChange() {
296
+ return setBaseColorCount(numCols);
297
+ }
298
+ }), /*#__PURE__*/React.createElement("span", {
299
+ className: "text-sm ".concat(baseColorCount === numCols ? 'font-semibold' : '')
300
+ }, numCols));
301
+ })), /*#__PURE__*/React.createElement("div", {
302
+ className: "flex items-center gap-2"
303
+ }, /*#__PURE__*/React.createElement("span", {
304
+ className: "text-sm font-medium"
305
+ }, "Multiplier:"), [1, 2, 3, 4].map(function (multi) {
306
+ return /*#__PURE__*/React.createElement("label", {
307
+ key: multi,
308
+ className: "flex items-center gap-1 cursor-pointer"
309
+ }, /*#__PURE__*/React.createElement("input", {
310
+ type: "radio",
311
+ name: "multiplier",
312
+ value: multi,
313
+ checked: multiplier === multi,
314
+ onChange: function onChange() {
315
+ return setMultiplier(multi);
316
+ }
317
+ }), /*#__PURE__*/React.createElement("span", {
318
+ className: "text-sm ".concat(multiplier === multi ? 'font-semibold' : '')
319
+ }, multi, "x"));
320
+ })), /*#__PURE__*/React.createElement("div", {
321
+ className: "text-sm font-medium text-gray-600"
322
+ }, "Total Points: ", totalPoints)), /*#__PURE__*/React.createElement("div", {
323
+ className: "flex justify-center mb-4"
324
+ }, /*#__PURE__*/React.createElement("svg", {
325
+ width: width,
326
+ height: height,
327
+ viewBox: "0 0 ".concat(width, " ").concat(height),
328
+ style: {
329
+ display: 'block',
330
+ overflow: 'visible',
331
+ border: '1px solid #ccc',
332
+ userSelect: 'none'
333
+ },
334
+ onMouseMove: handleDrag,
335
+ onMouseUp: handleDragEnd,
336
+ onMouseLeave: handleDragEnd
337
+ }, /*#__PURE__*/React.createElement("rect", {
338
+ x: "0",
339
+ y: "0",
340
+ width: width,
341
+ height: height,
342
+ fill: "#f8f8f8"
343
+ }), /*#__PURE__*/React.createElement("line", {
344
+ x1: start[0],
345
+ y1: start[1],
346
+ x2: handle1[0],
347
+ y2: handle1[1],
348
+ stroke: "rgba(0,0,0,0.4)",
349
+ strokeWidth: 1,
350
+ strokeDasharray: "4 2"
351
+ }), /*#__PURE__*/React.createElement("line", {
352
+ x1: end[0],
353
+ y1: end[1],
354
+ x2: handle2[0],
355
+ y2: handle2[1],
356
+ stroke: "rgba(0,0,0,0.4)",
357
+ strokeWidth: 1,
358
+ strokeDasharray: "4 2"
359
+ }), /*#__PURE__*/React.createElement("path", {
360
+ d: pathD,
361
+ stroke: "rgba(0,0,0,0.6)",
362
+ strokeWidth: 2,
363
+ fill: "none"
364
+ }), pointsT.map(function (t, i) {
365
+ // Use cubicBezier helper
366
+ var _cubicBezier3 = cubicBezier(t, start, handle1, handle2, end),
367
+ _cubicBezier4 = _slicedToArray(_cubicBezier3, 2),
368
+ px = _cubicBezier4[0],
369
+ py = _cubicBezier4[1];
370
+ // Clamp Y position *within SVG bounds* for lightness calculation
371
+ var clampedPy = Math.max(0, Math.min(height, py));
372
+ // Modulate baseLightness using curve position and range
373
+ // (0.5 - clampedPy / height) gives a value from +0.5 (top) to -0.5 (bottom)
374
+ var l = baseLightness + (0.5 - clampedPy / height) * lightnessRange;
375
+ // Final color uses calculated H, S, L (hslToRgb clamps L)
376
+ var _hslToRgb = hslToRgb(hue, sat, l),
377
+ r = _hslToRgb.r,
378
+ g = _hslToRgb.g,
379
+ b = _hslToRgb.b;
380
+ var isAscendant = i === middleIndex;
381
+ return /*#__PURE__*/React.createElement("circle", {
382
+ key: i,
383
+ cx: px,
384
+ cy: py // Render circle at actual curve position
385
+ ,
386
+ r: isAscendant ? 7 : 4,
387
+ fill: "rgb(".concat(r, ",").concat(g, ",").concat(b, ")"),
388
+ stroke: isAscendant ? "gold" : "rgba(0,0,0,0.5)",
389
+ strokeWidth: isAscendant ? 2 : 1
390
+ });
391
+ }), /*#__PURE__*/React.createElement("circle", {
392
+ cx: start[0],
393
+ cy: start[1],
394
+ r: 12,
395
+ fill: "#fff",
396
+ stroke: "#3498db",
397
+ strokeWidth: 3,
398
+ style: {
399
+ cursor: 'grab'
400
+ },
401
+ onMouseDown: function onMouseDown(e) {
402
+ return handleDragStart('A', e);
403
+ }
404
+ }), /*#__PURE__*/React.createElement("circle", {
405
+ cx: end[0],
406
+ cy: end[1],
407
+ r: 12,
408
+ fill: "#fff",
409
+ stroke: "#e74c3c",
410
+ strokeWidth: 3,
411
+ style: {
412
+ cursor: 'grab'
413
+ },
414
+ onMouseDown: function onMouseDown(e) {
415
+ return handleDragStart('C', e);
416
+ }
417
+ }), /*#__PURE__*/React.createElement("circle", {
418
+ cx: handle1[0],
419
+ cy: handle1[1],
420
+ r: 9,
421
+ fill: "#f9e7c0",
422
+ stroke: "#f39c12",
423
+ strokeWidth: 2,
424
+ style: {
425
+ cursor: 'grab'
426
+ },
427
+ onMouseDown: function onMouseDown(e) {
428
+ return handleDragStart('HANDLE1', e);
429
+ }
430
+ }), /*#__PURE__*/React.createElement("circle", {
431
+ cx: handle2[0],
432
+ cy: handle2[1],
433
+ r: 9,
434
+ fill: "#f9e7c0",
435
+ stroke: "#f39c12",
436
+ strokeWidth: 2,
437
+ style: {
438
+ cursor: 'grab'
439
+ },
440
+ onMouseDown: function onMouseDown(e) {
441
+ return handleDragStart('HANDLE2', e);
442
+ }
443
+ }))), /*#__PURE__*/React.createElement("div", {
444
+ className: "flex justify-center flex-wrap gap-1 mt-4"
445
+ }, colorSwatches.map(function (_ref, i) {
446
+ var t = _ref.t,
447
+ hex = _ref.hex,
448
+ l = _ref.l,
449
+ isPrimaryMiddle = _ref.isPrimaryMiddle,
450
+ isSecondaryMiddle = _ref.isSecondaryMiddle;
451
+ var borderColorClass = isPrimaryMiddle ? 'border-2 border-black shadow-md' // Primary middle border
452
+ : isSecondaryMiddle ? 'border border-gray-500' // Secondary middle border
453
+ : 'border border-transparent'; // No special border
454
+ return /*#__PURE__*/React.createElement("div", {
455
+ key: t // Use t for key stability if totalPoints changes
456
+ ,
457
+ className: "relative w-10 h-16 rounded overflow-hidden cursor-pointer ".concat(borderColorClass),
458
+ title: "L: ".concat(l.toFixed(1), "%\nClick to copy ").concat(hex),
459
+ onClick: function onClick() {
460
+ return handleCopyHex(hex);
461
+ }
462
+ }, /*#__PURE__*/React.createElement("div", {
463
+ className: "absolute inset-0",
464
+ style: {
465
+ backgroundColor: hex
466
+ }
467
+ }), /*#__PURE__*/React.createElement("div", {
468
+ className: "absolute bottom-0 left-0 right-0 bg-black bg-opacity-50 text-white text-[10px] text-center py-0.5"
469
+ }, hex), copiedHex === hex && /*#__PURE__*/React.createElement("div", {
470
+ className: "absolute inset-0 bg-white bg-opacity-75 flex items-center justify-center text-xs font-bold text-green-600"
471
+ }, "Copied!"));
472
+ })), /*#__PURE__*/React.createElement("div", {
473
+ className: "mt-6 text-sm text-gray-600 text-center"
474
+ }, /*#__PURE__*/React.createElement("b", null, "How it works:"), " Adjust H, S, L. Set Base Colors & Multiplier (1x-4x, max ", maxTotalPoints, " total). Drag handles (A, C, Yellow) to shape lightness curve. Middle point gets black border, secondary middles get gray border. Click hex to copy."));
475
+ };