@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.
- package/dist/blocked-email-domains.json +41 -0
- package/dist/buttons/SgButton.d.ts +43 -0
- package/dist/buttons/SgButton.d.ts.map +1 -0
- package/dist/buttons/SgButton.js +123 -0
- package/dist/buttons/SgFloatActionButton.d.ts +60 -0
- package/dist/buttons/SgFloatActionButton.d.ts.map +1 -0
- package/dist/buttons/SgFloatActionButton.js +532 -0
- package/dist/buttons/SgSpeedDial.d.ts +40 -0
- package/dist/buttons/SgSpeedDial.d.ts.map +1 -0
- package/dist/buttons/SgSpeedDial.js +149 -0
- package/dist/buttons/SgSplitButton.d.ts +32 -0
- package/dist/buttons/SgSplitButton.d.ts.map +1 -0
- package/dist/buttons/SgSplitButton.js +81 -0
- package/dist/clock/SgClock.d.ts +28 -0
- package/dist/clock/SgClock.d.ts.map +1 -0
- package/dist/clock/SgClock.js +280 -0
- package/dist/clock/SgTimeProvider.d.ts +13 -0
- package/dist/clock/SgTimeProvider.d.ts.map +1 -0
- package/dist/clock/SgTimeProvider.js +44 -0
- package/dist/clock/themes/SgClockThemePicker.d.ts +14 -0
- package/dist/clock/themes/SgClockThemePicker.d.ts.map +1 -0
- package/dist/clock/themes/SgClockThemePicker.js +71 -0
- package/dist/clock/themes/SgClockThemePreview.d.ts +7 -0
- package/dist/clock/themes/SgClockThemePreview.d.ts.map +1 -0
- package/dist/clock/themes/SgClockThemePreview.js +11 -0
- package/dist/clock/themes/builtins.d.ts +3 -0
- package/dist/clock/themes/builtins.d.ts.map +1 -0
- package/dist/clock/themes/builtins.js +241 -0
- package/dist/clock/themes/index.d.ts +9 -0
- package/dist/clock/themes/index.d.ts.map +1 -0
- package/dist/clock/themes/index.js +7 -0
- package/dist/clock/themes/provider.d.ts +19 -0
- package/dist/clock/themes/provider.d.ts.map +1 -0
- package/dist/clock/themes/provider.js +54 -0
- package/dist/clock/themes/registry.d.ts +9 -0
- package/dist/clock/themes/registry.d.ts.map +1 -0
- package/dist/clock/themes/registry.js +25 -0
- package/dist/clock/themes/renderTheme.d.ts +7 -0
- package/dist/clock/themes/renderTheme.d.ts.map +1 -0
- package/dist/clock/themes/renderTheme.js +41 -0
- package/dist/clock/themes/types.d.ts +21 -0
- package/dist/clock/themes/types.d.ts.map +1 -0
- package/dist/clock/themes/types.js +1 -0
- package/dist/clock/themes/urlThemeCache.d.ts +2 -0
- package/dist/clock/themes/urlThemeCache.d.ts.map +1 -0
- package/dist/clock/themes/urlThemeCache.js +11 -0
- package/dist/clock/themes/useDarkFlag.d.ts +2 -0
- package/dist/clock/themes/useDarkFlag.d.ts.map +1 -0
- package/dist/clock/themes/useDarkFlag.js +14 -0
- package/dist/commons/SgBadge.d.ts +51 -0
- package/dist/commons/SgBadge.d.ts.map +1 -0
- package/dist/commons/SgBadge.js +141 -0
- package/dist/commons/SgBadgeOverlay.d.ts +13 -0
- package/dist/commons/SgBadgeOverlay.d.ts.map +1 -0
- package/dist/commons/SgBadgeOverlay.js +20 -0
- package/dist/commons/SgButton.d.ts +39 -0
- package/dist/commons/SgButton.d.ts.map +1 -0
- package/dist/commons/SgButton.js +116 -0
- package/dist/commons/SgPopup.d.ts +42 -0
- package/dist/commons/SgPopup.d.ts.map +1 -0
- package/dist/commons/SgPopup.js +218 -0
- package/dist/commons/SgToast.d.ts +44 -0
- package/dist/commons/SgToast.d.ts.map +1 -0
- package/dist/commons/SgToast.js +97 -0
- package/dist/commons/SgToaster.d.ts +11 -0
- package/dist/commons/SgToaster.d.ts.map +1 -0
- package/dist/commons/SgToaster.js +85 -0
- package/dist/commons/common-passwords.d.ts +2 -0
- package/dist/commons/common-passwords.d.ts.map +1 -0
- package/dist/commons/common-passwords.js +167 -0
- package/dist/environment/SgEnvironmentProvider.d.ts +31 -0
- package/dist/environment/SgEnvironmentProvider.d.ts.map +1 -0
- package/dist/environment/SgEnvironmentProvider.js +120 -0
- package/dist/environment/persistence.d.ts +44 -0
- package/dist/environment/persistence.d.ts.map +1 -0
- package/dist/environment/persistence.js +149 -0
- package/dist/gadgets/clock/SgClock.d.ts +18 -0
- package/dist/gadgets/clock/SgClock.d.ts.map +1 -0
- package/dist/gadgets/clock/SgClock.js +407 -0
- package/dist/gadgets/clock/SgTimeProvider.d.ts +13 -0
- package/dist/gadgets/clock/SgTimeProvider.d.ts.map +1 -0
- package/dist/gadgets/clock/SgTimeProvider.js +44 -0
- package/dist/gadgets/clock/themes/SgClockThemePicker.d.ts +14 -0
- package/dist/gadgets/clock/themes/SgClockThemePicker.d.ts.map +1 -0
- package/dist/gadgets/clock/themes/SgClockThemePicker.js +71 -0
- package/dist/gadgets/clock/themes/SgClockThemePreview.d.ts +7 -0
- package/dist/gadgets/clock/themes/SgClockThemePreview.d.ts.map +1 -0
- package/dist/gadgets/clock/themes/SgClockThemePreview.js +11 -0
- package/dist/gadgets/clock/themes/builtins.d.ts +3 -0
- package/dist/gadgets/clock/themes/builtins.d.ts.map +1 -0
- package/dist/gadgets/clock/themes/builtins.js +241 -0
- package/dist/gadgets/clock/themes/index.d.ts +9 -0
- package/dist/gadgets/clock/themes/index.d.ts.map +1 -0
- package/dist/gadgets/clock/themes/index.js +7 -0
- package/dist/gadgets/clock/themes/provider.d.ts +19 -0
- package/dist/gadgets/clock/themes/provider.d.ts.map +1 -0
- package/dist/gadgets/clock/themes/provider.js +54 -0
- package/dist/gadgets/clock/themes/registry.d.ts +9 -0
- package/dist/gadgets/clock/themes/registry.d.ts.map +1 -0
- package/dist/gadgets/clock/themes/registry.js +25 -0
- package/dist/gadgets/clock/themes/renderTheme.d.ts +7 -0
- package/dist/gadgets/clock/themes/renderTheme.d.ts.map +1 -0
- package/dist/gadgets/clock/themes/renderTheme.js +41 -0
- package/dist/gadgets/clock/themes/types.d.ts +21 -0
- package/dist/gadgets/clock/themes/types.d.ts.map +1 -0
- package/dist/gadgets/clock/themes/types.js +1 -0
- package/dist/gadgets/clock/themes/urlThemeCache.d.ts +2 -0
- package/dist/gadgets/clock/themes/urlThemeCache.d.ts.map +1 -0
- package/dist/gadgets/clock/themes/urlThemeCache.js +11 -0
- package/dist/gadgets/clock/themes/useDarkFlag.d.ts +2 -0
- package/dist/gadgets/clock/themes/useDarkFlag.d.ts.map +1 -0
- package/dist/gadgets/clock/themes/useDarkFlag.js +14 -0
- package/dist/gadgets/flip-digit/SgFlipDigit.d.ts +23 -0
- package/dist/gadgets/flip-digit/SgFlipDigit.d.ts.map +1 -0
- package/dist/gadgets/flip-digit/SgFlipDigit.js +118 -0
- package/dist/gadgets/flip-digit/index.d.ts +3 -0
- package/dist/gadgets/flip-digit/index.d.ts.map +1 -0
- package/dist/gadgets/flip-digit/index.js +1 -0
- package/dist/i18n/en-US.json +76 -0
- package/dist/i18n/es.json +76 -0
- package/dist/i18n/index.d.ts +328 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/index.js +87 -0
- package/dist/i18n/pt-BR.json +76 -0
- package/dist/i18n/pt-PT.json +76 -0
- package/dist/index.d.ts +88 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +46 -0
- package/dist/inputs/FloatingInput.d.ts +13 -0
- package/dist/inputs/FloatingInput.d.ts.map +1 -0
- package/dist/inputs/FloatingInput.js +53 -0
- package/dist/inputs/FloatingSelect.d.ts +15 -0
- package/dist/inputs/FloatingSelect.d.ts.map +1 -0
- package/dist/inputs/FloatingSelect.js +52 -0
- package/dist/inputs/FloatingTextArea.d.ts +11 -0
- package/dist/inputs/FloatingTextArea.d.ts.map +1 -0
- package/dist/inputs/FloatingTextArea.js +34 -0
- package/dist/inputs/InputBirthDate.d.ts +13 -0
- package/dist/inputs/InputBirthDate.d.ts.map +1 -0
- package/dist/inputs/InputBirthDate.js +46 -0
- package/dist/inputs/InputDate.d.ts +8 -0
- package/dist/inputs/InputDate.d.ts.map +1 -0
- package/dist/inputs/InputDate.js +23 -0
- package/dist/inputs/InputEmail.d.ts +14 -0
- package/dist/inputs/InputEmail.d.ts.map +1 -0
- package/dist/inputs/InputEmail.js +43 -0
- package/dist/inputs/InputPassword.d.ts +12 -0
- package/dist/inputs/InputPassword.d.ts.map +1 -0
- package/dist/inputs/InputPassword.js +42 -0
- package/dist/inputs/MaskedInputs.d.ts +27 -0
- package/dist/inputs/MaskedInputs.d.ts.map +1 -0
- package/dist/inputs/MaskedInputs.js +161 -0
- package/dist/inputs/SgAutocomplete.d.ts +42 -0
- package/dist/inputs/SgAutocomplete.d.ts.map +1 -0
- package/dist/inputs/SgAutocomplete.js +241 -0
- package/dist/inputs/SgCurrencyEdit.d.ts +56 -0
- package/dist/inputs/SgCurrencyEdit.d.ts.map +1 -0
- package/dist/inputs/SgCurrencyEdit.js +496 -0
- package/dist/inputs/SgInputBirthDate.d.ts +13 -0
- package/dist/inputs/SgInputBirthDate.d.ts.map +1 -0
- package/dist/inputs/SgInputBirthDate.js +48 -0
- package/dist/inputs/SgInputCEP.d.ts +33 -0
- package/dist/inputs/SgInputCEP.d.ts.map +1 -0
- package/dist/inputs/SgInputCEP.js +117 -0
- package/dist/inputs/SgInputCNPJ.d.ts +20 -0
- package/dist/inputs/SgInputCNPJ.d.ts.map +1 -0
- package/dist/inputs/SgInputCNPJ.js +133 -0
- package/dist/inputs/SgInputCPF.d.ts +15 -0
- package/dist/inputs/SgInputCPF.d.ts.map +1 -0
- package/dist/inputs/SgInputCPF.js +70 -0
- package/dist/inputs/SgInputCPFCNPJ.d.ts +15 -0
- package/dist/inputs/SgInputCPFCNPJ.d.ts.map +1 -0
- package/dist/inputs/SgInputCPFCNPJ.js +92 -0
- package/dist/inputs/SgInputDate.d.ts +8 -0
- package/dist/inputs/SgInputDate.d.ts.map +1 -0
- package/dist/inputs/SgInputDate.js +120 -0
- package/dist/inputs/SgInputEmail.d.ts +16 -0
- package/dist/inputs/SgInputEmail.d.ts.map +1 -0
- package/dist/inputs/SgInputEmail.js +74 -0
- package/dist/inputs/SgInputFone.d.ts +15 -0
- package/dist/inputs/SgInputFone.d.ts.map +1 -0
- package/dist/inputs/SgInputFone.js +60 -0
- package/dist/inputs/SgInputMasked.d.ts +27 -0
- package/dist/inputs/SgInputMasked.d.ts.map +1 -0
- package/dist/inputs/SgInputMasked.js +161 -0
- package/dist/inputs/SgInputNumber.d.ts +49 -0
- package/dist/inputs/SgInputNumber.d.ts.map +1 -0
- package/dist/inputs/SgInputNumber.js +438 -0
- package/dist/inputs/SgInputPassword.d.ts +26 -0
- package/dist/inputs/SgInputPassword.d.ts.map +1 -0
- package/dist/inputs/SgInputPassword.js +278 -0
- package/dist/inputs/SgInputPhone.d.ts +15 -0
- package/dist/inputs/SgInputPhone.d.ts.map +1 -0
- package/dist/inputs/SgInputPhone.js +66 -0
- package/dist/inputs/SgInputPostalCode.d.ts +37 -0
- package/dist/inputs/SgInputPostalCode.d.ts.map +1 -0
- package/dist/inputs/SgInputPostalCode.js +193 -0
- package/dist/inputs/SgInputSelect.d.ts +16 -0
- package/dist/inputs/SgInputSelect.d.ts.map +1 -0
- package/dist/inputs/SgInputSelect.js +104 -0
- package/dist/inputs/SgInputText.d.ts +49 -0
- package/dist/inputs/SgInputText.d.ts.map +1 -0
- package/dist/inputs/SgInputText.js +336 -0
- package/dist/inputs/SgInputTextArea.d.ts +41 -0
- package/dist/inputs/SgInputTextArea.d.ts.map +1 -0
- package/dist/inputs/SgInputTextArea.js +216 -0
- package/dist/inputs/SgTextEditor.d.ts +27 -0
- package/dist/inputs/SgTextEditor.d.ts.map +1 -0
- package/dist/inputs/SgTextEditor.js +201 -0
- package/dist/integration/module.d.ts +39 -0
- package/dist/integration/module.d.ts.map +1 -0
- package/dist/integration/module.js +1 -0
- package/dist/layout/GroupBox.d.ts +10 -0
- package/dist/layout/GroupBox.d.ts.map +1 -0
- package/dist/layout/GroupBox.js +14 -0
- package/dist/layout/SgCard.d.ts +35 -0
- package/dist/layout/SgCard.d.ts.map +1 -0
- package/dist/layout/SgCard.js +106 -0
- package/dist/layout/SgDockLayout.d.ts +37 -0
- package/dist/layout/SgDockLayout.d.ts.map +1 -0
- package/dist/layout/SgDockLayout.js +101 -0
- package/dist/layout/SgDockZone.d.ts +12 -0
- package/dist/layout/SgDockZone.d.ts.map +1 -0
- package/dist/layout/SgDockZone.js +20 -0
- package/dist/layout/SgGrid.d.ts +18 -0
- package/dist/layout/SgGrid.d.ts.map +1 -0
- package/dist/layout/SgGrid.js +101 -0
- package/dist/layout/SgGroupBox.d.ts +10 -0
- package/dist/layout/SgGroupBox.d.ts.map +1 -0
- package/dist/layout/SgGroupBox.js +14 -0
- package/dist/layout/SgMainPanel.d.ts +11 -0
- package/dist/layout/SgMainPanel.d.ts.map +1 -0
- package/dist/layout/SgMainPanel.js +70 -0
- package/dist/layout/SgPanel.d.ts +22 -0
- package/dist/layout/SgPanel.d.ts.map +1 -0
- package/dist/layout/SgPanel.js +33 -0
- package/dist/layout/SgScreen.d.ts +11 -0
- package/dist/layout/SgScreen.d.ts.map +1 -0
- package/dist/layout/SgScreen.js +18 -0
- package/dist/layout/SgStack.d.ts +15 -0
- package/dist/layout/SgStack.d.ts.map +1 -0
- package/dist/layout/SgStack.js +32 -0
- package/dist/layout/SgToolBar.d.ts +46 -0
- package/dist/layout/SgToolBar.d.ts.map +1 -0
- package/dist/layout/SgToolBar.js +199 -0
- package/dist/layout/SgTreeView.d.ts +80 -0
- package/dist/layout/SgTreeView.d.ts.map +1 -0
- package/dist/layout/SgTreeView.js +338 -0
- package/dist/manifest.d.ts +3 -0
- package/dist/manifest.d.ts.map +1 -0
- package/dist/manifest.js +19 -0
- package/dist/masks.d.ts +14 -0
- package/dist/masks.d.ts.map +1 -0
- package/dist/masks.js +91 -0
- package/dist/overlay/SgDialog.d.ts +39 -0
- package/dist/overlay/SgDialog.d.ts.map +1 -0
- package/dist/overlay/SgDialog.js +177 -0
- package/dist/overlay/SgPopup.d.ts +42 -0
- package/dist/overlay/SgPopup.d.ts.map +1 -0
- package/dist/overlay/SgPopup.js +218 -0
- package/dist/rhf.d.ts +6 -0
- package/dist/rhf.d.ts.map +1 -0
- package/dist/rhf.js +1 -0
- package/dist/validators.d.ts +27 -0
- package/dist/validators.d.ts.map +1 -0
- package/dist/validators.js +218 -0
- package/dist/wizard/SGWizard.d.ts +28 -0
- package/dist/wizard/SGWizard.d.ts.map +1 -0
- package/dist/wizard/SGWizard.js +124 -0
- 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 @@
|
|
|
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 @@
|
|
|
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"}
|