@seedgrid/fe-components 0.2.4

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 (270) hide show
  1. package/dist/blocked-email-domains.json +41 -0
  2. package/dist/buttons/SgButton.d.ts +43 -0
  3. package/dist/buttons/SgButton.d.ts.map +1 -0
  4. package/dist/buttons/SgButton.js +123 -0
  5. package/dist/buttons/SgFloatActionButton.d.ts +60 -0
  6. package/dist/buttons/SgFloatActionButton.d.ts.map +1 -0
  7. package/dist/buttons/SgFloatActionButton.js +532 -0
  8. package/dist/buttons/SgSpeedDial.d.ts +40 -0
  9. package/dist/buttons/SgSpeedDial.d.ts.map +1 -0
  10. package/dist/buttons/SgSpeedDial.js +149 -0
  11. package/dist/buttons/SgSplitButton.d.ts +32 -0
  12. package/dist/buttons/SgSplitButton.d.ts.map +1 -0
  13. package/dist/buttons/SgSplitButton.js +81 -0
  14. package/dist/clock/SgClock.d.ts +28 -0
  15. package/dist/clock/SgClock.d.ts.map +1 -0
  16. package/dist/clock/SgClock.js +280 -0
  17. package/dist/clock/SgTimeProvider.d.ts +13 -0
  18. package/dist/clock/SgTimeProvider.d.ts.map +1 -0
  19. package/dist/clock/SgTimeProvider.js +44 -0
  20. package/dist/clock/themes/SgClockThemePicker.d.ts +14 -0
  21. package/dist/clock/themes/SgClockThemePicker.d.ts.map +1 -0
  22. package/dist/clock/themes/SgClockThemePicker.js +71 -0
  23. package/dist/clock/themes/SgClockThemePreview.d.ts +7 -0
  24. package/dist/clock/themes/SgClockThemePreview.d.ts.map +1 -0
  25. package/dist/clock/themes/SgClockThemePreview.js +11 -0
  26. package/dist/clock/themes/builtins.d.ts +3 -0
  27. package/dist/clock/themes/builtins.d.ts.map +1 -0
  28. package/dist/clock/themes/builtins.js +241 -0
  29. package/dist/clock/themes/index.d.ts +9 -0
  30. package/dist/clock/themes/index.d.ts.map +1 -0
  31. package/dist/clock/themes/index.js +7 -0
  32. package/dist/clock/themes/provider.d.ts +19 -0
  33. package/dist/clock/themes/provider.d.ts.map +1 -0
  34. package/dist/clock/themes/provider.js +54 -0
  35. package/dist/clock/themes/registry.d.ts +9 -0
  36. package/dist/clock/themes/registry.d.ts.map +1 -0
  37. package/dist/clock/themes/registry.js +25 -0
  38. package/dist/clock/themes/renderTheme.d.ts +7 -0
  39. package/dist/clock/themes/renderTheme.d.ts.map +1 -0
  40. package/dist/clock/themes/renderTheme.js +41 -0
  41. package/dist/clock/themes/types.d.ts +21 -0
  42. package/dist/clock/themes/types.d.ts.map +1 -0
  43. package/dist/clock/themes/types.js +1 -0
  44. package/dist/clock/themes/urlThemeCache.d.ts +2 -0
  45. package/dist/clock/themes/urlThemeCache.d.ts.map +1 -0
  46. package/dist/clock/themes/urlThemeCache.js +11 -0
  47. package/dist/clock/themes/useDarkFlag.d.ts +2 -0
  48. package/dist/clock/themes/useDarkFlag.d.ts.map +1 -0
  49. package/dist/clock/themes/useDarkFlag.js +14 -0
  50. package/dist/commons/SgBadge.d.ts +51 -0
  51. package/dist/commons/SgBadge.d.ts.map +1 -0
  52. package/dist/commons/SgBadge.js +141 -0
  53. package/dist/commons/SgBadgeOverlay.d.ts +13 -0
  54. package/dist/commons/SgBadgeOverlay.d.ts.map +1 -0
  55. package/dist/commons/SgBadgeOverlay.js +20 -0
  56. package/dist/commons/SgButton.d.ts +39 -0
  57. package/dist/commons/SgButton.d.ts.map +1 -0
  58. package/dist/commons/SgButton.js +116 -0
  59. package/dist/commons/SgPopup.d.ts +42 -0
  60. package/dist/commons/SgPopup.d.ts.map +1 -0
  61. package/dist/commons/SgPopup.js +218 -0
  62. package/dist/commons/SgToast.d.ts +44 -0
  63. package/dist/commons/SgToast.d.ts.map +1 -0
  64. package/dist/commons/SgToast.js +97 -0
  65. package/dist/commons/SgToaster.d.ts +11 -0
  66. package/dist/commons/SgToaster.d.ts.map +1 -0
  67. package/dist/commons/SgToaster.js +85 -0
  68. package/dist/commons/common-passwords.d.ts +2 -0
  69. package/dist/commons/common-passwords.d.ts.map +1 -0
  70. package/dist/commons/common-passwords.js +167 -0
  71. package/dist/environment/SgEnvironmentProvider.d.ts +31 -0
  72. package/dist/environment/SgEnvironmentProvider.d.ts.map +1 -0
  73. package/dist/environment/SgEnvironmentProvider.js +120 -0
  74. package/dist/environment/persistence.d.ts +44 -0
  75. package/dist/environment/persistence.d.ts.map +1 -0
  76. package/dist/environment/persistence.js +149 -0
  77. package/dist/gadgets/clock/SgClock.d.ts +18 -0
  78. package/dist/gadgets/clock/SgClock.d.ts.map +1 -0
  79. package/dist/gadgets/clock/SgClock.js +407 -0
  80. package/dist/gadgets/clock/SgTimeProvider.d.ts +13 -0
  81. package/dist/gadgets/clock/SgTimeProvider.d.ts.map +1 -0
  82. package/dist/gadgets/clock/SgTimeProvider.js +44 -0
  83. package/dist/gadgets/clock/themes/SgClockThemePicker.d.ts +14 -0
  84. package/dist/gadgets/clock/themes/SgClockThemePicker.d.ts.map +1 -0
  85. package/dist/gadgets/clock/themes/SgClockThemePicker.js +71 -0
  86. package/dist/gadgets/clock/themes/SgClockThemePreview.d.ts +7 -0
  87. package/dist/gadgets/clock/themes/SgClockThemePreview.d.ts.map +1 -0
  88. package/dist/gadgets/clock/themes/SgClockThemePreview.js +11 -0
  89. package/dist/gadgets/clock/themes/builtins.d.ts +3 -0
  90. package/dist/gadgets/clock/themes/builtins.d.ts.map +1 -0
  91. package/dist/gadgets/clock/themes/builtins.js +241 -0
  92. package/dist/gadgets/clock/themes/index.d.ts +9 -0
  93. package/dist/gadgets/clock/themes/index.d.ts.map +1 -0
  94. package/dist/gadgets/clock/themes/index.js +7 -0
  95. package/dist/gadgets/clock/themes/provider.d.ts +19 -0
  96. package/dist/gadgets/clock/themes/provider.d.ts.map +1 -0
  97. package/dist/gadgets/clock/themes/provider.js +54 -0
  98. package/dist/gadgets/clock/themes/registry.d.ts +9 -0
  99. package/dist/gadgets/clock/themes/registry.d.ts.map +1 -0
  100. package/dist/gadgets/clock/themes/registry.js +25 -0
  101. package/dist/gadgets/clock/themes/renderTheme.d.ts +7 -0
  102. package/dist/gadgets/clock/themes/renderTheme.d.ts.map +1 -0
  103. package/dist/gadgets/clock/themes/renderTheme.js +41 -0
  104. package/dist/gadgets/clock/themes/types.d.ts +21 -0
  105. package/dist/gadgets/clock/themes/types.d.ts.map +1 -0
  106. package/dist/gadgets/clock/themes/types.js +1 -0
  107. package/dist/gadgets/clock/themes/urlThemeCache.d.ts +2 -0
  108. package/dist/gadgets/clock/themes/urlThemeCache.d.ts.map +1 -0
  109. package/dist/gadgets/clock/themes/urlThemeCache.js +11 -0
  110. package/dist/gadgets/clock/themes/useDarkFlag.d.ts +2 -0
  111. package/dist/gadgets/clock/themes/useDarkFlag.d.ts.map +1 -0
  112. package/dist/gadgets/clock/themes/useDarkFlag.js +14 -0
  113. package/dist/gadgets/flip-digit/SgFlipDigit.d.ts +23 -0
  114. package/dist/gadgets/flip-digit/SgFlipDigit.d.ts.map +1 -0
  115. package/dist/gadgets/flip-digit/SgFlipDigit.js +118 -0
  116. package/dist/gadgets/flip-digit/index.d.ts +3 -0
  117. package/dist/gadgets/flip-digit/index.d.ts.map +1 -0
  118. package/dist/gadgets/flip-digit/index.js +1 -0
  119. package/dist/i18n/en-US.json +76 -0
  120. package/dist/i18n/es.json +76 -0
  121. package/dist/i18n/index.d.ts +328 -0
  122. package/dist/i18n/index.d.ts.map +1 -0
  123. package/dist/i18n/index.js +87 -0
  124. package/dist/i18n/pt-BR.json +76 -0
  125. package/dist/i18n/pt-PT.json +76 -0
  126. package/dist/index.d.ts +88 -0
  127. package/dist/index.d.ts.map +1 -0
  128. package/dist/index.js +46 -0
  129. package/dist/inputs/FloatingInput.d.ts +13 -0
  130. package/dist/inputs/FloatingInput.d.ts.map +1 -0
  131. package/dist/inputs/FloatingInput.js +53 -0
  132. package/dist/inputs/FloatingSelect.d.ts +15 -0
  133. package/dist/inputs/FloatingSelect.d.ts.map +1 -0
  134. package/dist/inputs/FloatingSelect.js +52 -0
  135. package/dist/inputs/FloatingTextArea.d.ts +11 -0
  136. package/dist/inputs/FloatingTextArea.d.ts.map +1 -0
  137. package/dist/inputs/FloatingTextArea.js +34 -0
  138. package/dist/inputs/InputBirthDate.d.ts +13 -0
  139. package/dist/inputs/InputBirthDate.d.ts.map +1 -0
  140. package/dist/inputs/InputBirthDate.js +46 -0
  141. package/dist/inputs/InputDate.d.ts +8 -0
  142. package/dist/inputs/InputDate.d.ts.map +1 -0
  143. package/dist/inputs/InputDate.js +23 -0
  144. package/dist/inputs/InputEmail.d.ts +14 -0
  145. package/dist/inputs/InputEmail.d.ts.map +1 -0
  146. package/dist/inputs/InputEmail.js +43 -0
  147. package/dist/inputs/InputPassword.d.ts +12 -0
  148. package/dist/inputs/InputPassword.d.ts.map +1 -0
  149. package/dist/inputs/InputPassword.js +42 -0
  150. package/dist/inputs/MaskedInputs.d.ts +27 -0
  151. package/dist/inputs/MaskedInputs.d.ts.map +1 -0
  152. package/dist/inputs/MaskedInputs.js +161 -0
  153. package/dist/inputs/SgAutocomplete.d.ts +42 -0
  154. package/dist/inputs/SgAutocomplete.d.ts.map +1 -0
  155. package/dist/inputs/SgAutocomplete.js +241 -0
  156. package/dist/inputs/SgCurrencyEdit.d.ts +56 -0
  157. package/dist/inputs/SgCurrencyEdit.d.ts.map +1 -0
  158. package/dist/inputs/SgCurrencyEdit.js +496 -0
  159. package/dist/inputs/SgInputBirthDate.d.ts +13 -0
  160. package/dist/inputs/SgInputBirthDate.d.ts.map +1 -0
  161. package/dist/inputs/SgInputBirthDate.js +48 -0
  162. package/dist/inputs/SgInputCEP.d.ts +33 -0
  163. package/dist/inputs/SgInputCEP.d.ts.map +1 -0
  164. package/dist/inputs/SgInputCEP.js +117 -0
  165. package/dist/inputs/SgInputCNPJ.d.ts +20 -0
  166. package/dist/inputs/SgInputCNPJ.d.ts.map +1 -0
  167. package/dist/inputs/SgInputCNPJ.js +133 -0
  168. package/dist/inputs/SgInputCPF.d.ts +15 -0
  169. package/dist/inputs/SgInputCPF.d.ts.map +1 -0
  170. package/dist/inputs/SgInputCPF.js +70 -0
  171. package/dist/inputs/SgInputCPFCNPJ.d.ts +15 -0
  172. package/dist/inputs/SgInputCPFCNPJ.d.ts.map +1 -0
  173. package/dist/inputs/SgInputCPFCNPJ.js +92 -0
  174. package/dist/inputs/SgInputDate.d.ts +8 -0
  175. package/dist/inputs/SgInputDate.d.ts.map +1 -0
  176. package/dist/inputs/SgInputDate.js +120 -0
  177. package/dist/inputs/SgInputEmail.d.ts +16 -0
  178. package/dist/inputs/SgInputEmail.d.ts.map +1 -0
  179. package/dist/inputs/SgInputEmail.js +74 -0
  180. package/dist/inputs/SgInputFone.d.ts +15 -0
  181. package/dist/inputs/SgInputFone.d.ts.map +1 -0
  182. package/dist/inputs/SgInputFone.js +60 -0
  183. package/dist/inputs/SgInputMasked.d.ts +27 -0
  184. package/dist/inputs/SgInputMasked.d.ts.map +1 -0
  185. package/dist/inputs/SgInputMasked.js +161 -0
  186. package/dist/inputs/SgInputNumber.d.ts +49 -0
  187. package/dist/inputs/SgInputNumber.d.ts.map +1 -0
  188. package/dist/inputs/SgInputNumber.js +438 -0
  189. package/dist/inputs/SgInputPassword.d.ts +26 -0
  190. package/dist/inputs/SgInputPassword.d.ts.map +1 -0
  191. package/dist/inputs/SgInputPassword.js +278 -0
  192. package/dist/inputs/SgInputPhone.d.ts +15 -0
  193. package/dist/inputs/SgInputPhone.d.ts.map +1 -0
  194. package/dist/inputs/SgInputPhone.js +66 -0
  195. package/dist/inputs/SgInputPostalCode.d.ts +37 -0
  196. package/dist/inputs/SgInputPostalCode.d.ts.map +1 -0
  197. package/dist/inputs/SgInputPostalCode.js +193 -0
  198. package/dist/inputs/SgInputSelect.d.ts +16 -0
  199. package/dist/inputs/SgInputSelect.d.ts.map +1 -0
  200. package/dist/inputs/SgInputSelect.js +104 -0
  201. package/dist/inputs/SgInputText.d.ts +49 -0
  202. package/dist/inputs/SgInputText.d.ts.map +1 -0
  203. package/dist/inputs/SgInputText.js +336 -0
  204. package/dist/inputs/SgInputTextArea.d.ts +41 -0
  205. package/dist/inputs/SgInputTextArea.d.ts.map +1 -0
  206. package/dist/inputs/SgInputTextArea.js +216 -0
  207. package/dist/inputs/SgTextEditor.d.ts +27 -0
  208. package/dist/inputs/SgTextEditor.d.ts.map +1 -0
  209. package/dist/inputs/SgTextEditor.js +201 -0
  210. package/dist/integration/module.d.ts +39 -0
  211. package/dist/integration/module.d.ts.map +1 -0
  212. package/dist/integration/module.js +1 -0
  213. package/dist/layout/GroupBox.d.ts +10 -0
  214. package/dist/layout/GroupBox.d.ts.map +1 -0
  215. package/dist/layout/GroupBox.js +14 -0
  216. package/dist/layout/SgCard.d.ts +35 -0
  217. package/dist/layout/SgCard.d.ts.map +1 -0
  218. package/dist/layout/SgCard.js +106 -0
  219. package/dist/layout/SgDockLayout.d.ts +37 -0
  220. package/dist/layout/SgDockLayout.d.ts.map +1 -0
  221. package/dist/layout/SgDockLayout.js +101 -0
  222. package/dist/layout/SgDockZone.d.ts +12 -0
  223. package/dist/layout/SgDockZone.d.ts.map +1 -0
  224. package/dist/layout/SgDockZone.js +20 -0
  225. package/dist/layout/SgGrid.d.ts +18 -0
  226. package/dist/layout/SgGrid.d.ts.map +1 -0
  227. package/dist/layout/SgGrid.js +101 -0
  228. package/dist/layout/SgGroupBox.d.ts +10 -0
  229. package/dist/layout/SgGroupBox.d.ts.map +1 -0
  230. package/dist/layout/SgGroupBox.js +14 -0
  231. package/dist/layout/SgMainPanel.d.ts +11 -0
  232. package/dist/layout/SgMainPanel.d.ts.map +1 -0
  233. package/dist/layout/SgMainPanel.js +70 -0
  234. package/dist/layout/SgPanel.d.ts +22 -0
  235. package/dist/layout/SgPanel.d.ts.map +1 -0
  236. package/dist/layout/SgPanel.js +33 -0
  237. package/dist/layout/SgScreen.d.ts +11 -0
  238. package/dist/layout/SgScreen.d.ts.map +1 -0
  239. package/dist/layout/SgScreen.js +18 -0
  240. package/dist/layout/SgStack.d.ts +15 -0
  241. package/dist/layout/SgStack.d.ts.map +1 -0
  242. package/dist/layout/SgStack.js +32 -0
  243. package/dist/layout/SgToolBar.d.ts +46 -0
  244. package/dist/layout/SgToolBar.d.ts.map +1 -0
  245. package/dist/layout/SgToolBar.js +199 -0
  246. package/dist/layout/SgTreeView.d.ts +80 -0
  247. package/dist/layout/SgTreeView.d.ts.map +1 -0
  248. package/dist/layout/SgTreeView.js +338 -0
  249. package/dist/manifest.d.ts +3 -0
  250. package/dist/manifest.d.ts.map +1 -0
  251. package/dist/manifest.js +19 -0
  252. package/dist/masks.d.ts +14 -0
  253. package/dist/masks.d.ts.map +1 -0
  254. package/dist/masks.js +91 -0
  255. package/dist/overlay/SgDialog.d.ts +39 -0
  256. package/dist/overlay/SgDialog.d.ts.map +1 -0
  257. package/dist/overlay/SgDialog.js +177 -0
  258. package/dist/overlay/SgPopup.d.ts +42 -0
  259. package/dist/overlay/SgPopup.d.ts.map +1 -0
  260. package/dist/overlay/SgPopup.js +218 -0
  261. package/dist/rhf.d.ts +6 -0
  262. package/dist/rhf.d.ts.map +1 -0
  263. package/dist/rhf.js +1 -0
  264. package/dist/validators.d.ts +27 -0
  265. package/dist/validators.d.ts.map +1 -0
  266. package/dist/validators.js +218 -0
  267. package/dist/wizard/SGWizard.d.ts +28 -0
  268. package/dist/wizard/SGWizard.d.ts.map +1 -0
  269. package/dist/wizard/SGWizard.js +124 -0
  270. package/package.json +53 -0
@@ -0,0 +1,241 @@
1
+ "use client";
2
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ function round(n) {
5
+ return Math.round(n * 1000) / 1000;
6
+ }
7
+ function polar(r, a) {
8
+ return { x: round(50 + r * Math.sin(a)), y: round(50 - r * Math.cos(a)) };
9
+ }
10
+ const SEGMENTS = {
11
+ "0": [
12
+ { x: 1, y: 0, w: 4, h: 1 },
13
+ { x: 5, y: 1, w: 1, h: 4 },
14
+ { x: 5, y: 5, w: 1, h: 4 },
15
+ { x: 1, y: 9, w: 4, h: 1 },
16
+ { x: 0, y: 5, w: 1, h: 4 },
17
+ { x: 0, y: 1, w: 1, h: 4 }
18
+ ],
19
+ "1": [
20
+ { x: 5, y: 1, w: 1, h: 4 },
21
+ { x: 5, y: 5, w: 1, h: 4 }
22
+ ],
23
+ "2": [
24
+ { x: 1, y: 0, w: 4, h: 1 },
25
+ { x: 5, y: 1, w: 1, h: 4 },
26
+ { x: 1, y: 4.5, w: 4, h: 1 },
27
+ { x: 0, y: 5, w: 1, h: 4 },
28
+ { x: 1, y: 9, w: 4, h: 1 }
29
+ ],
30
+ "3": [
31
+ { x: 1, y: 0, w: 4, h: 1 },
32
+ { x: 5, y: 1, w: 1, h: 4 },
33
+ { x: 1, y: 4.5, w: 4, h: 1 },
34
+ { x: 5, y: 5, w: 1, h: 4 },
35
+ { x: 1, y: 9, w: 4, h: 1 }
36
+ ],
37
+ "4": [
38
+ { x: 0, y: 1, w: 1, h: 4 },
39
+ { x: 5, y: 1, w: 1, h: 4 },
40
+ { x: 1, y: 4.5, w: 4, h: 1 },
41
+ { x: 5, y: 5, w: 1, h: 4 }
42
+ ],
43
+ "5": [
44
+ { x: 1, y: 0, w: 4, h: 1 },
45
+ { x: 0, y: 1, w: 1, h: 4 },
46
+ { x: 1, y: 4.5, w: 4, h: 1 },
47
+ { x: 5, y: 5, w: 1, h: 4 },
48
+ { x: 1, y: 9, w: 4, h: 1 }
49
+ ],
50
+ "6": [
51
+ { x: 1, y: 0, w: 4, h: 1 },
52
+ { x: 0, y: 1, w: 1, h: 4 },
53
+ { x: 1, y: 4.5, w: 4, h: 1 },
54
+ { x: 0, y: 5, w: 1, h: 4 },
55
+ { x: 5, y: 5, w: 1, h: 4 },
56
+ { x: 1, y: 9, w: 4, h: 1 }
57
+ ],
58
+ "7": [
59
+ { x: 1, y: 0, w: 4, h: 1 },
60
+ { x: 5, y: 1, w: 1, h: 4 },
61
+ { x: 5, y: 5, w: 1, h: 4 }
62
+ ],
63
+ "8": [
64
+ { x: 1, y: 0, w: 4, h: 1 },
65
+ { x: 5, y: 1, w: 1, h: 4 },
66
+ { x: 5, y: 5, w: 1, h: 4 },
67
+ { x: 1, y: 9, w: 4, h: 1 },
68
+ { x: 0, y: 5, w: 1, h: 4 },
69
+ { x: 0, y: 1, w: 1, h: 4 },
70
+ { x: 1, y: 4.5, w: 4, h: 1 }
71
+ ],
72
+ "9": [
73
+ { x: 1, y: 0, w: 4, h: 1 },
74
+ { x: 5, y: 1, w: 1, h: 4 },
75
+ { x: 5, y: 5, w: 1, h: 4 },
76
+ { x: 1, y: 9, w: 4, h: 1 },
77
+ { x: 0, y: 1, w: 1, h: 4 },
78
+ { x: 1, y: 4.5, w: 4, h: 1 }
79
+ ]
80
+ };
81
+ function renderSevenSegDigit(digit, x, y, scale) {
82
+ const segs = SEGMENTS[digit] ?? [];
83
+ return segs.map((s, idx) => (_jsx("rect", { x: round(x + s.x * scale), y: round(y + s.y * scale), width: round(s.w * scale), height: round(s.h * scale), className: "fill-neutral-700 dark:fill-neutral-300", rx: round(0.3 * scale) }, `${digit}-${idx}`)));
84
+ }
85
+ function renderSevenSegNumber(num, cx, cy, scale) {
86
+ const digits = String(num).split("");
87
+ const w = 6 * scale;
88
+ const gap = 1.2 * scale;
89
+ const total = digits.length * w + (digits.length - 1) * gap;
90
+ const startX = cx - total / 2;
91
+ const startY = cy - (10 * scale) / 2;
92
+ return digits.map((d, i) => (_jsx("g", { children: renderSevenSegDigit(d, startX + i * (w + gap), startY, scale) }, `${num}-${i}`)));
93
+ }
94
+ const ThemeClassic = () => (_jsxs(_Fragment, { children: [_jsx("circle", { cx: "50", cy: "50", r: "48", className: "fill-neutral-100 dark:fill-neutral-900" }), _jsx("circle", { cx: "50", cy: "50", r: "47", className: "fill-none stroke-neutral-300 dark:stroke-neutral-700" }), Array.from({ length: 60 }).map((_, i) => {
95
+ const major = i % 5 === 0;
96
+ const len = major ? 4 : 2;
97
+ const r1 = 46;
98
+ const r2 = r1 - len;
99
+ const a = (i * Math.PI) / 30;
100
+ const p1 = polar(r1, a);
101
+ const p2 = polar(r2, a);
102
+ return (_jsx("line", { x1: p1.x, y1: p1.y, x2: p2.x, y2: p2.y, className: major ? "stroke-neutral-400 stroke-[0.9]" : "stroke-neutral-400 stroke-[0.6]", strokeLinecap: "round" }, i));
103
+ }), Array.from({ length: 12 }).map((_, idx) => {
104
+ const n = idx + 1;
105
+ const a = (n * Math.PI) / 6;
106
+ const r = 34;
107
+ const p = polar(r, a);
108
+ return (_jsx("text", { x: p.x, y: round(p.y + 3), textAnchor: "middle", className: "fill-neutral-800 text-[6px] font-semibold dark:fill-neutral-200", children: n }, n));
109
+ })] }));
110
+ const ThemeMinimal = () => (_jsxs(_Fragment, { children: [_jsx("circle", { cx: "50", cy: "50", r: "48", className: "fill-white dark:fill-neutral-950" }), _jsx("circle", { cx: "50", cy: "50", r: "47", className: "fill-none stroke-neutral-200 dark:stroke-neutral-800" }), Array.from({ length: 12 }).map((_, i) => {
111
+ const a = (i * Math.PI) / 6;
112
+ const r1 = 46;
113
+ const r2 = 42;
114
+ const p1 = polar(r1, a);
115
+ const p2 = polar(r2, a);
116
+ return (_jsx("line", { x1: p1.x, y1: p1.y, x2: p2.x, y2: p2.y, className: "stroke-neutral-400 dark:stroke-neutral-600 stroke-[1.1]", strokeLinecap: "round" }, i));
117
+ })] }));
118
+ const ThemeDark = () => (_jsxs(_Fragment, { children: [_jsx("defs", { children: _jsxs("radialGradient", { id: "sgClockDarkGrad", cx: "50%", cy: "45%", r: "60%", children: [_jsx("stop", { offset: "0%", stopColor: "rgb(30 41 59)" }), _jsx("stop", { offset: "100%", stopColor: "rgb(2 6 23)" })] }) }), _jsx("circle", { cx: "50", cy: "50", r: "48", fill: "url(#sgClockDarkGrad)" }), _jsx("circle", { cx: "50", cy: "50", r: "47", className: "fill-none stroke-neutral-700" }), Array.from({ length: 60 }).map((_, i) => {
119
+ const major = i % 5 === 0;
120
+ const len = major ? 4 : 2;
121
+ const r1 = 46;
122
+ const r2 = r1 - len;
123
+ const a = (i * Math.PI) / 30;
124
+ const p1 = polar(r1, a);
125
+ const p2 = polar(r2, a);
126
+ return (_jsx("line", { x1: p1.x, y1: p1.y, x2: p2.x, y2: p2.y, className: major ? "stroke-neutral-400 stroke-[0.9]" : "stroke-neutral-600 stroke-[0.6]", strokeLinecap: "round" }, i));
127
+ }), Array.from({ length: 12 }).map((_, idx) => {
128
+ const n = idx + 1;
129
+ const a = (n * Math.PI) / 6;
130
+ const r = 34;
131
+ const p = polar(r, a);
132
+ return (_jsx("text", { x: p.x, y: round(p.y + 3), textAnchor: "middle", className: "fill-neutral-200 text-[6px] font-medium", children: n }, n));
133
+ })] }));
134
+ const ThemeSeedGrid = () => (_jsxs(_Fragment, { children: [_jsx("circle", { cx: "50", cy: "50", r: "48", className: "fill-white dark:fill-neutral-950" }), _jsx("circle", { cx: "50", cy: "50", r: "47", className: "fill-none stroke-neutral-200 dark:stroke-neutral-800" }), Array.from({ length: 6 }).map((_, i) => {
135
+ const p = 22 + i * 6;
136
+ return (_jsxs(React.Fragment, { children: [_jsx("line", { x1: p, y1: 18, x2: p, y2: 82, className: "stroke-neutral-100 dark:stroke-neutral-900 stroke-[0.7]" }), _jsx("line", { x1: 18, y1: p, x2: 82, y2: p, className: "stroke-neutral-100 dark:stroke-neutral-900 stroke-[0.7]" })] }, i));
137
+ }), Array.from({ length: 12 }).map((_, i) => {
138
+ const a = (i * Math.PI) / 6;
139
+ const r1 = 46;
140
+ const r2 = 40;
141
+ const p1 = polar(r1, a);
142
+ const p2 = polar(r2, a);
143
+ return (_jsx("line", { x1: p1.x, y1: p1.y, x2: p2.x, y2: p2.y, className: "stroke-neutral-400 dark:stroke-neutral-600 stroke-[1.2]", strokeLinecap: "round" }, i));
144
+ }), _jsx("text", { x: "50", y: "56", textAnchor: "middle", className: "fill-neutral-200 text-[10px] font-semibold dark:fill-neutral-800", children: "SG" })] }));
145
+ const ThemeMusic = () => (_jsxs(_Fragment, { children: [_jsx("circle", { cx: "50", cy: "50", r: "48", className: "fill-neutral-50 dark:fill-neutral-950" }), _jsx("circle", { cx: "50", cy: "50", r: "47", className: "fill-none stroke-neutral-200 dark:stroke-neutral-800" }), Array.from({ length: 5 }).map((_, i) => {
146
+ const y = 38 + i * 4;
147
+ return (_jsx("line", { x1: 20, y1: y, x2: 80, y2: y, className: "stroke-neutral-200 dark:stroke-neutral-800 stroke-[0.8]" }, i));
148
+ }), _jsxs("g", { className: "fill-neutral-300 dark:fill-neutral-800", children: [_jsx("circle", { cx: "32", cy: "44", r: "2.2" }), _jsx("rect", { x: "33.7", y: "32", width: "1", height: "12", rx: "0.5" }), _jsx("circle", { cx: "68", cy: "52", r: "2.2" }), _jsx("rect", { x: "69.7", y: "40", width: "1", height: "12", rx: "0.5" })] }), Array.from({ length: 12 }).map((_, i) => {
149
+ const a = (i * Math.PI) / 6;
150
+ const r1 = 46;
151
+ const r2 = 42;
152
+ const p1 = polar(r1, a);
153
+ const p2 = polar(r2, a);
154
+ return (_jsx("line", { x1: p1.x, y1: p1.y, x2: p2.x, y2: p2.y, className: "stroke-neutral-400 dark:stroke-neutral-600 stroke-[1.1]", strokeLinecap: "round" }, i));
155
+ })] }));
156
+ const ThemeMusicNotes = () => (_jsxs(_Fragment, { children: [_jsx("circle", { cx: "50", cy: "50", r: "48", className: "fill-white dark:fill-neutral-950" }), _jsx("circle", { cx: "50", cy: "50", r: "47", className: "fill-none stroke-neutral-300 dark:stroke-neutral-700" }), Array.from({ length: 12 }).map((_, i) => {
157
+ const a = (i * Math.PI) / 6;
158
+ const r1 = 46;
159
+ const r2 = 40;
160
+ const p1 = polar(r1, a);
161
+ const p2 = polar(r2, a);
162
+ return (_jsx("line", { x1: p1.x, y1: p1.y, x2: p2.x, y2: p2.y, className: "stroke-neutral-400 dark:stroke-neutral-600 stroke-[1.1]", strokeLinecap: "round" }, i));
163
+ }), Array.from({ length: 12 }).map((_, i) => {
164
+ const a = (i * Math.PI) / 6;
165
+ const r = 36;
166
+ const p = polar(r, a);
167
+ const up = i % 2 === 0;
168
+ return (_jsxs("g", { transform: `translate(${round(p.x - 2.5)} ${round(p.y - 2.5)})`, children: [_jsx("ellipse", { cx: "2.5", cy: "3.2", rx: "2.2", ry: "1.6", className: "fill-neutral-800 dark:fill-neutral-200" }), _jsx("rect", { x: up ? 4.3 : 0.6, y: -6, width: "0.8", height: "7", className: "fill-neutral-800 dark:fill-neutral-200" })] }, i));
169
+ }), _jsx("text", { x: "50", y: "68", textAnchor: "middle", className: "fill-neutral-300 text-[7px] font-semibold tracking-[2px] dark:fill-neutral-700", children: "MUSICA" })] }));
170
+ const ThemeMusicStaff = () => (_jsxs(_Fragment, { children: [_jsx("circle", { cx: "50", cy: "50", r: "48", className: "fill-white dark:fill-neutral-950" }), _jsx("circle", { cx: "50", cy: "50", r: "47", className: "fill-none stroke-neutral-300 dark:stroke-neutral-700" }), _jsx("circle", { cx: "50", cy: "50", r: "38", className: "fill-none stroke-neutral-300 dark:stroke-neutral-700 stroke-[0.8]" }), _jsx("circle", { cx: "50", cy: "50", r: "42", className: "fill-none stroke-neutral-300 dark:stroke-neutral-700 stroke-[0.8]" }), Array.from({ length: 5 }).map((_, i) => {
171
+ const y = 30 + i * 4;
172
+ return (_jsx("line", { x1: 18, y1: y, x2: 82, y2: y, className: "stroke-neutral-300 dark:stroke-neutral-700 stroke-[0.8]" }, i));
173
+ }), _jsxs("g", { className: "fill-neutral-700 dark:fill-neutral-300", children: [_jsx("circle", { cx: "30", cy: "38", r: "1.8" }), _jsx("rect", { x: "31.5", y: "28", width: "0.8", height: "10", rx: "0.4" }), _jsx("circle", { cx: "66", cy: "46", r: "1.8" }), _jsx("rect", { x: "67.5", y: "36", width: "0.8", height: "10", rx: "0.4" }), _jsx("path", { d: "M55 34c2-2 4-2 6 0", className: "stroke-neutral-700 dark:stroke-neutral-300", strokeWidth: "0.8", fill: "none" })] }), Array.from({ length: 60 }).map((_, i) => {
174
+ if (i % 5 !== 0)
175
+ return null;
176
+ const a = (i * Math.PI) / 30;
177
+ const r1 = 46;
178
+ const r2 = 42;
179
+ const p1 = polar(r1, a);
180
+ const p2 = polar(r2, a);
181
+ return (_jsx("line", { x1: p1.x, y1: p1.y, x2: p2.x, y2: p2.y, className: "stroke-neutral-400 dark:stroke-neutral-600 stroke-[1]", strokeLinecap: "round" }, i));
182
+ })] }));
183
+ const ThemeRomanClassic = () => (_jsxs(_Fragment, { children: [_jsx("circle", { cx: "50", cy: "50", r: "48", className: "fill-[#f2e9dc] dark:fill-neutral-900" }), _jsx("circle", { cx: "50", cy: "50", r: "47", className: "fill-none stroke-neutral-600/60 dark:stroke-neutral-600" }), _jsx("circle", { cx: "50", cy: "50", r: "36", className: "fill-none stroke-neutral-500/40 dark:stroke-neutral-700" }), Array.from({ length: 60 }).map((_, i) => {
184
+ const major = i % 5 === 0;
185
+ const len = major ? 4 : 2;
186
+ const r1 = 46;
187
+ const r2 = r1 - len;
188
+ const a = (i * Math.PI) / 30;
189
+ const p1 = polar(r1, a);
190
+ const p2 = polar(r2, a);
191
+ return (_jsx("line", { x1: p1.x, y1: p1.y, x2: p2.x, y2: p2.y, className: major ? "stroke-neutral-700 stroke-[1]" : "stroke-neutral-600/70 stroke-[0.6]", strokeLinecap: "round" }, i));
192
+ }), ["XII", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX", "X", "XI"].map((n, idx) => {
193
+ const a = ((idx + 1) * Math.PI) / 6;
194
+ const r = 32;
195
+ const p = polar(r, a);
196
+ return (_jsx("text", { x: p.x, y: round(p.y + 3), textAnchor: "middle", className: "fill-neutral-800 text-[7px] font-semibold dark:fill-neutral-200", children: n }, n));
197
+ })] }));
198
+ const ThemeRomanOrnate = () => (_jsxs(_Fragment, { children: [_jsx("circle", { cx: "50", cy: "50", r: "48", className: "fill-white dark:fill-neutral-950" }), _jsx("circle", { cx: "50", cy: "50", r: "47", className: "fill-none stroke-neutral-700 dark:stroke-neutral-600" }), _jsx("circle", { cx: "50", cy: "50", r: "44", className: "fill-none stroke-neutral-700/60 dark:stroke-neutral-700" }), Array.from({ length: 48 }).map((_, i) => {
199
+ const a = (i * Math.PI) / 24;
200
+ const r = 46.5;
201
+ const p = polar(r, a);
202
+ return _jsx("circle", { cx: p.x, cy: p.y, r: "0.6", className: "fill-neutral-700/70 dark:fill-neutral-600" }, i);
203
+ }), ["XII", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX", "X", "XI"].map((n, idx) => {
204
+ const a = ((idx + 1) * Math.PI) / 6;
205
+ const r = 32;
206
+ const p = polar(r, a);
207
+ return (_jsx("text", { x: p.x, y: round(p.y + 3), textAnchor: "middle", className: "fill-neutral-800 text-[7px] font-semibold dark:fill-neutral-200", children: n }, n));
208
+ }), Array.from({ length: 12 }).map((_, i) => {
209
+ const a = (i * Math.PI) / 6;
210
+ const r = 40;
211
+ const p = polar(r, a);
212
+ return (_jsx("rect", { x: round(p.x - 1), y: round(p.y - 1), width: "2", height: "2", className: "fill-neutral-700 dark:fill-neutral-500" }, i));
213
+ })] }));
214
+ const ThemeSegment = () => (_jsxs(_Fragment, { children: [_jsx("circle", { cx: "50", cy: "50", r: "48", className: "fill-white dark:fill-neutral-950" }), _jsx("circle", { cx: "50", cy: "50", r: "47", className: "fill-none stroke-neutral-300 dark:stroke-neutral-700" }), Array.from({ length: 60 }).map((_, i) => {
215
+ const major = i % 5 === 0;
216
+ const len = major ? 4 : 2;
217
+ const r1 = 46;
218
+ const r2 = r1 - len;
219
+ const a = (i * Math.PI) / 30;
220
+ const p1 = polar(r1, a);
221
+ const p2 = polar(r2, a);
222
+ return (_jsx("line", { x1: p1.x, y1: p1.y, x2: p2.x, y2: p2.y, className: major ? "stroke-neutral-400 stroke-[0.9]" : "stroke-neutral-400/60 stroke-[0.6]", strokeLinecap: "round" }, i));
223
+ }), Array.from({ length: 12 }).map((_, idx) => {
224
+ const n = idx + 1;
225
+ const a = (n * Math.PI) / 6;
226
+ const r = 32;
227
+ const p = polar(r, a);
228
+ return _jsx("g", { children: renderSevenSegNumber(n, p.x, p.y, 0.7) }, n);
229
+ })] }));
230
+ export const sgClockThemesBuiltIn = [
231
+ { id: "classic", label: "Classic", render: () => _jsx(ThemeClassic, {}), order: 1 },
232
+ { id: "minimal", label: "Minimal", render: () => _jsx(ThemeMinimal, {}), order: 2 },
233
+ { id: "dark", label: "Dark", render: () => _jsx(ThemeDark, {}), order: 3 },
234
+ { id: "seedgrid", label: "SeedGrid", render: () => _jsx(ThemeSeedGrid, {}), order: 4 },
235
+ { id: "music", label: "Music", render: () => _jsx(ThemeMusic, {}), order: 5 },
236
+ { id: "music-notes", label: "Music Notes", render: () => _jsx(ThemeMusicNotes, {}), order: 6 },
237
+ { id: "music-staff", label: "Music Staff", render: () => _jsx(ThemeMusicStaff, {}), order: 8 },
238
+ { id: "roman-classic", label: "Roman Classic", render: () => _jsx(ThemeRomanClassic, {}), order: 9 },
239
+ { id: "roman-ornate", label: "Roman Ornate", render: () => _jsx(ThemeRomanOrnate, {}), order: 10 },
240
+ { id: "segment", label: "Segment", render: () => _jsx(ThemeSegment, {}), order: 11 }
241
+ ];
@@ -0,0 +1,9 @@
1
+ export { registerTheme, registerThemes, getTheme, hasTheme, listThemes, unregisterTheme, clearThemes } from "./registry";
2
+ export { createThemeResolver, SgClockThemeProvider, useSgClockThemeResolver } from "./provider";
3
+ export { ThemeLayer, resolveTheme } from "./renderTheme";
4
+ export { useDarkFlag } from "./useDarkFlag";
5
+ export { SgClockThemePicker } from "./SgClockThemePicker";
6
+ export { SgClockThemePreview } from "./SgClockThemePreview";
7
+ export { sgClockThemesBuiltIn } from "./builtins";
8
+ export type { SgClockTheme, SgClockThemeRenderArgs, SgClockThemeResolveMode, SgClockThemeResolver } from "./types";
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/gadgets/clock/themes/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,cAAc,EACd,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,eAAe,EACf,WAAW,EACZ,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAChG,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAClD,YAAY,EACV,YAAY,EACZ,sBAAsB,EACtB,uBAAuB,EACvB,oBAAoB,EACrB,MAAM,SAAS,CAAC"}
@@ -0,0 +1,7 @@
1
+ export { registerTheme, registerThemes, getTheme, hasTheme, listThemes, unregisterTheme, clearThemes } from "./registry";
2
+ export { createThemeResolver, SgClockThemeProvider, useSgClockThemeResolver } from "./provider";
3
+ export { ThemeLayer, resolveTheme } from "./renderTheme";
4
+ export { useDarkFlag } from "./useDarkFlag";
5
+ export { SgClockThemePicker } from "./SgClockThemePicker";
6
+ export { SgClockThemePreview } from "./SgClockThemePreview";
7
+ export { sgClockThemesBuiltIn } from "./builtins";
@@ -0,0 +1,19 @@
1
+ import * as React from "react";
2
+ import type { SgClockTheme, SgClockThemeResolveMode, SgClockThemeResolver } from "./types";
3
+ type SgClockThemeProviderValue = {
4
+ mode?: SgClockThemeResolveMode;
5
+ fallbackThemeId?: string;
6
+ themes?: SgClockTheme[];
7
+ };
8
+ export declare function useSgClockThemeResolver(): SgClockThemeResolver | null;
9
+ export declare function createThemeResolver(params?: {
10
+ mode?: SgClockThemeResolveMode;
11
+ fallbackThemeId?: string;
12
+ localThemes?: SgClockTheme[];
13
+ }): SgClockThemeResolver;
14
+ export declare function SgClockThemeProvider({ value, children }: {
15
+ value?: SgClockThemeProviderValue;
16
+ children: React.ReactNode;
17
+ }): import("react/jsx-runtime").JSX.Element;
18
+ export {};
19
+ //# sourceMappingURL=provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../../src/gadgets/clock/themes/provider.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EAAE,YAAY,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAG3F,KAAK,yBAAyB,GAAG;IAC/B,IAAI,CAAC,EAAE,uBAAuB,CAAC;IAC/B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,MAAM,CAAC,EAAE,YAAY,EAAE,CAAC;CACzB,CAAC;AAIF,wBAAgB,uBAAuB,gCAEtC;AAED,wBAAgB,mBAAmB,CAAC,MAAM,CAAC,EAAE;IAC3C,IAAI,CAAC,EAAE,uBAAuB,CAAC;IAC/B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,YAAY,EAAE,CAAC;CAC9B,GAAG,oBAAoB,CAkCvB;AAED,wBAAgB,oBAAoB,CAAC,EACnC,KAAK,EACL,QAAQ,EACT,EAAE;IACD,KAAK,CAAC,EAAE,yBAAyB,CAAC;IAClC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B,2CAUA"}
@@ -0,0 +1,54 @@
1
+ "use client";
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import { getTheme, listThemes as listGlobalThemes } from "./registry";
5
+ const SgClockThemeContext = React.createContext(null);
6
+ export function useSgClockThemeResolver() {
7
+ return React.useContext(SgClockThemeContext);
8
+ }
9
+ export function createThemeResolver(params) {
10
+ const mode = params?.mode ?? "fallback";
11
+ const fallbackThemeId = params?.fallbackThemeId ?? "classic";
12
+ const localMap = new Map();
13
+ (params?.localThemes ?? []).forEach((t) => localMap.set(t.id, t));
14
+ const resolveStrict = (id) => localMap.get(id) ?? getTheme(id);
15
+ return {
16
+ resolve(id) {
17
+ const found = resolveStrict(id);
18
+ if (found)
19
+ return found;
20
+ if (mode === "strict")
21
+ return null;
22
+ if (id !== fallbackThemeId)
23
+ return resolveStrict(fallbackThemeId);
24
+ return null;
25
+ },
26
+ list() {
27
+ const merged = new Map();
28
+ for (const g of listGlobalThemes())
29
+ merged.set(g.id, g);
30
+ for (const [k, v] of localMap.entries())
31
+ merged.set(k, v);
32
+ return Array.from(merged.values()).sort((a, b) => (a.order ?? 999) - (b.order ?? 999));
33
+ },
34
+ registerLocal(theme) {
35
+ if (!theme?.id)
36
+ throw new Error("registerLocal: theme.id is required");
37
+ localMap.set(theme.id, theme);
38
+ },
39
+ registerManyLocal(themes) {
40
+ for (const t of themes)
41
+ this.registerLocal(t);
42
+ }
43
+ };
44
+ }
45
+ export function SgClockThemeProvider({ value, children }) {
46
+ const resolver = React.useMemo(() => {
47
+ return createThemeResolver({
48
+ mode: value?.mode ?? "fallback",
49
+ fallbackThemeId: value?.fallbackThemeId ?? "classic",
50
+ localThemes: value?.themes ?? []
51
+ });
52
+ }, [value?.mode, value?.fallbackThemeId, value?.themes]);
53
+ return _jsx(SgClockThemeContext.Provider, { value: resolver, children: children });
54
+ }
@@ -0,0 +1,9 @@
1
+ import type { SgClockTheme } from "./types";
2
+ export declare function registerTheme(theme: SgClockTheme): void;
3
+ export declare function registerThemes(themes: SgClockTheme[]): void;
4
+ export declare function getTheme(id: string): SgClockTheme | null;
5
+ export declare function hasTheme(id: string): boolean;
6
+ export declare function listThemes(): SgClockTheme[];
7
+ export declare function unregisterTheme(id: string): void;
8
+ export declare function clearThemes(): void;
9
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../../src/gadgets/clock/themes/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAI5C,wBAAgB,aAAa,CAAC,KAAK,EAAE,YAAY,QAGhD;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,YAAY,EAAE,QAEpD;AAED,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAExD;AAED,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAE5C;AAED,wBAAgB,UAAU,IAAI,YAAY,EAAE,CAE3C;AAED,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,QAEzC;AAED,wBAAgB,WAAW,SAE1B"}
@@ -0,0 +1,25 @@
1
+ const globalMap = new Map();
2
+ export function registerTheme(theme) {
3
+ if (!theme?.id)
4
+ throw new Error("registerTheme: theme.id is required");
5
+ globalMap.set(theme.id, theme);
6
+ }
7
+ export function registerThemes(themes) {
8
+ for (const theme of themes)
9
+ registerTheme(theme);
10
+ }
11
+ export function getTheme(id) {
12
+ return globalMap.get(id) ?? null;
13
+ }
14
+ export function hasTheme(id) {
15
+ return globalMap.has(id);
16
+ }
17
+ export function listThemes() {
18
+ return Array.from(globalMap.values()).sort((a, b) => (a.order ?? 999) - (b.order ?? 999));
19
+ }
20
+ export function unregisterTheme(id) {
21
+ globalMap.delete(id);
22
+ }
23
+ export function clearThemes() {
24
+ globalMap.clear();
25
+ }
@@ -0,0 +1,7 @@
1
+ import type { SgClockTheme, SgClockThemeRenderArgs, SgClockThemeResolver } from "./types";
2
+ export declare function ThemeLayer({ theme, args }: {
3
+ theme: SgClockTheme;
4
+ args: SgClockThemeRenderArgs;
5
+ }): import("react/jsx-runtime").JSX.Element;
6
+ export declare function resolveTheme(resolver: SgClockThemeResolver | null, themeId: string, fallbackThemeId: string): SgClockTheme | null;
7
+ //# sourceMappingURL=renderTheme.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderTheme.d.ts","sourceRoot":"","sources":["../../../../src/gadgets/clock/themes/renderTheme.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAQ1F,wBAAgB,UAAU,CAAC,EACzB,KAAK,EACL,IAAI,EACL,EAAE;IACD,KAAK,EAAE,YAAY,CAAC;IACpB,IAAI,EAAE,sBAAsB,CAAC;CAC9B,2CA+BA;AAED,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,oBAAoB,GAAG,IAAI,EACrC,OAAO,EAAE,MAAM,EACf,eAAe,EAAE,MAAM,GACtB,YAAY,GAAG,IAAI,CAKrB"}
@@ -0,0 +1,41 @@
1
+ "use client";
2
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import { loadSvgText } from "./urlThemeCache";
5
+ function extractInnerSvg(svgText) {
6
+ const match = svgText.match(/<svg[\s\S]*?>([\s\S]*?)<\/svg>/i);
7
+ return match?.[1] ?? svgText;
8
+ }
9
+ export function ThemeLayer({ theme, args }) {
10
+ const [inner, setInner] = React.useState(null);
11
+ const url = theme.url;
12
+ React.useEffect(() => {
13
+ let alive = true;
14
+ setInner(null);
15
+ if (!url)
16
+ return;
17
+ loadSvgText(url)
18
+ .then((txt) => {
19
+ if (!alive)
20
+ return;
21
+ setInner(extractInnerSvg(txt));
22
+ })
23
+ .catch(() => {
24
+ if (!alive)
25
+ return;
26
+ setInner(null);
27
+ });
28
+ return () => {
29
+ alive = false;
30
+ };
31
+ }, [url]);
32
+ return (_jsxs(_Fragment, { children: [theme.render?.(args), url && inner && _jsx("g", { dangerouslySetInnerHTML: { __html: inner } })] }));
33
+ }
34
+ export function resolveTheme(resolver, themeId, fallbackThemeId) {
35
+ const t = resolver?.resolve(themeId) ?? null;
36
+ if (t)
37
+ return t;
38
+ if (themeId !== fallbackThemeId)
39
+ return resolver?.resolve(fallbackThemeId) ?? null;
40
+ return null;
41
+ }
@@ -0,0 +1,21 @@
1
+ import type React from "react";
2
+ export type SgClockThemeRenderArgs = {
3
+ size: number;
4
+ dark: boolean;
5
+ };
6
+ export type SgClockTheme = {
7
+ id: string;
8
+ label?: string;
9
+ tags?: string[];
10
+ render?: (args: SgClockThemeRenderArgs) => React.ReactNode;
11
+ url?: string;
12
+ order?: number;
13
+ };
14
+ export type SgClockThemeResolveMode = "strict" | "fallback";
15
+ export type SgClockThemeResolver = {
16
+ resolve: (id: string) => SgClockTheme | null;
17
+ list: () => SgClockTheme[];
18
+ registerLocal: (theme: SgClockTheme) => void;
19
+ registerManyLocal: (themes: SgClockTheme[]) => void;
20
+ };
21
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/gadgets/clock/themes/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,MAAM,MAAM,sBAAsB,GAAG;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,sBAAsB,KAAK,KAAK,CAAC,SAAS,CAAC;IAC3D,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG,QAAQ,GAAG,UAAU,CAAC;AAE5D,MAAM,MAAM,oBAAoB,GAAG;IACjC,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,YAAY,GAAG,IAAI,CAAC;IAC7C,IAAI,EAAE,MAAM,YAAY,EAAE,CAAC;IAC3B,aAAa,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;IAC7C,iBAAiB,EAAE,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,IAAI,CAAC;CACrD,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,2 @@
1
+ export declare function loadSvgText(url: string): Promise<string>;
2
+ //# sourceMappingURL=urlThemeCache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"urlThemeCache.d.ts","sourceRoot":"","sources":["../../../../src/gadgets/clock/themes/urlThemeCache.ts"],"names":[],"mappings":"AAEA,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAWxD"}
@@ -0,0 +1,11 @@
1
+ const svgTextCache = new Map();
2
+ export function loadSvgText(url) {
3
+ if (!svgTextCache.has(url)) {
4
+ svgTextCache.set(url, fetch(url, { method: "GET", cache: "force-cache" }).then((res) => {
5
+ if (!res.ok)
6
+ throw new Error(`Failed to load svg: ${url} (${res.status})`);
7
+ return res.text();
8
+ }));
9
+ }
10
+ return svgTextCache.get(url);
11
+ }
@@ -0,0 +1,2 @@
1
+ export declare function useDarkFlag(): boolean;
2
+ //# sourceMappingURL=useDarkFlag.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useDarkFlag.d.ts","sourceRoot":"","sources":["../../../../src/gadgets/clock/themes/useDarkFlag.ts"],"names":[],"mappings":"AAIA,wBAAgB,WAAW,YAgB1B"}
@@ -0,0 +1,14 @@
1
+ "use client";
2
+ import * as React from "react";
3
+ export function useDarkFlag() {
4
+ const [dark, setDark] = React.useState(false);
5
+ React.useEffect(() => {
6
+ const root = document.documentElement;
7
+ const compute = () => setDark(root.classList.contains("dark"));
8
+ compute();
9
+ const obs = new MutationObserver(() => compute());
10
+ obs.observe(root, { attributes: true, attributeFilter: ["class"] });
11
+ return () => obs.disconnect();
12
+ }, []);
13
+ return dark;
14
+ }
@@ -0,0 +1,23 @@
1
+ export type SgFlipDigitProps = {
2
+ /** The character to display (single char) */
3
+ value: string;
4
+ /** Width in pixels */
5
+ width?: number;
6
+ /** Height in pixels */
7
+ height?: number;
8
+ /** Font size in pixels */
9
+ fontSize?: number;
10
+ /** Additional CSS classes */
11
+ className?: string;
12
+ };
13
+ /**
14
+ * SgFlipDigit - Animated flip card for single character display
15
+ *
16
+ * @example
17
+ * ```tsx
18
+ * const [digit, setDigit] = useState("0");
19
+ * <SgFlipDigit value={digit} />
20
+ * ```
21
+ */
22
+ export declare function SgFlipDigit({ value, width, height, fontSize, className }: SgFlipDigitProps): import("react/jsx-runtime").JSX.Element;
23
+ //# sourceMappingURL=SgFlipDigit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SgFlipDigit.d.ts","sourceRoot":"","sources":["../../../src/gadgets/flip-digit/SgFlipDigit.tsx"],"names":[],"mappings":"AAMA,MAAM,MAAM,gBAAgB,GAAG;IAC7B,6CAA6C;IAC7C,KAAK,EAAE,MAAM,CAAC;IACd,sBAAsB;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uBAAuB;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,0BAA0B;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,6BAA6B;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,KAAU,EACV,MAAY,EACZ,QAAa,EACb,SAAS,EACV,EAAE,gBAAgB,2CA8KlB"}