@seedgrid/fe-components 0.2.9 → 2026.3.1

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 (155) hide show
  1. package/dist/buttons/SgFloatActionButton.d.ts.map +1 -1
  2. package/dist/buttons/SgFloatActionButton.js +168 -38
  3. package/dist/commons/SgAvatar.d.ts +66 -0
  4. package/dist/commons/SgAvatar.d.ts.map +1 -0
  5. package/dist/commons/SgAvatar.js +136 -0
  6. package/dist/commons/SgSkeleton.d.ts +16 -0
  7. package/dist/commons/SgSkeleton.d.ts.map +1 -0
  8. package/dist/commons/SgSkeleton.js +58 -0
  9. package/dist/commons/SgToaster.d.ts +9 -0
  10. package/dist/commons/SgToaster.d.ts.map +1 -1
  11. package/dist/commons/SgToaster.js +86 -17
  12. package/dist/digits/discard-digit/SgDiscardDigit.d.ts +39 -0
  13. package/dist/digits/discard-digit/SgDiscardDigit.d.ts.map +1 -0
  14. package/dist/digits/discard-digit/SgDiscardDigit.js +303 -0
  15. package/dist/digits/discard-digit/index.d.ts +3 -0
  16. package/dist/digits/discard-digit/index.d.ts.map +1 -0
  17. package/dist/digits/discard-digit/index.js +1 -0
  18. package/dist/digits/fade-digit/SgFadeDigit.d.ts +27 -0
  19. package/dist/digits/fade-digit/SgFadeDigit.d.ts.map +1 -0
  20. package/dist/digits/fade-digit/SgFadeDigit.js +85 -0
  21. package/dist/digits/fade-digit/index.d.ts +3 -0
  22. package/dist/digits/fade-digit/index.d.ts.map +1 -0
  23. package/dist/digits/fade-digit/index.js +1 -0
  24. package/dist/digits/flip-digit/SgFlipDigit.d.ts +27 -0
  25. package/dist/digits/flip-digit/SgFlipDigit.d.ts.map +1 -0
  26. package/dist/digits/flip-digit/SgFlipDigit.js +70 -0
  27. package/dist/digits/flip-digit/index.d.ts.map +1 -0
  28. package/dist/digits/matrix-digit/SgMatrixDigit.d.ts +32 -0
  29. package/dist/digits/matrix-digit/SgMatrixDigit.d.ts.map +1 -0
  30. package/dist/digits/matrix-digit/SgMatrixDigit.js +86 -0
  31. package/dist/digits/matrix-digit/index.d.ts +3 -0
  32. package/dist/digits/matrix-digit/index.d.ts.map +1 -0
  33. package/dist/digits/matrix-digit/index.js +1 -0
  34. package/dist/digits/neon-digit/SgNeonDigit.d.ts +37 -0
  35. package/dist/digits/neon-digit/SgNeonDigit.d.ts.map +1 -0
  36. package/dist/digits/neon-digit/SgNeonDigit.js +59 -0
  37. package/dist/digits/neon-digit/index.d.ts +3 -0
  38. package/dist/digits/neon-digit/index.d.ts.map +1 -0
  39. package/dist/digits/neon-digit/index.js +1 -0
  40. package/dist/digits/roller3d-digit/SgRoller3DDigit.d.ts +37 -0
  41. package/dist/digits/roller3d-digit/SgRoller3DDigit.d.ts.map +1 -0
  42. package/dist/digits/roller3d-digit/SgRoller3DDigit.js +47 -0
  43. package/dist/digits/roller3d-digit/index.d.ts +3 -0
  44. package/dist/digits/roller3d-digit/index.d.ts.map +1 -0
  45. package/dist/digits/roller3d-digit/index.js +1 -0
  46. package/dist/environment/SgEnvironmentProvider.d.ts +1 -0
  47. package/dist/environment/SgEnvironmentProvider.d.ts.map +1 -1
  48. package/dist/environment/SgEnvironmentProvider.js +51 -12
  49. package/dist/gadgets/clock/SgClock.d.ts +3 -1
  50. package/dist/gadgets/clock/SgClock.d.ts.map +1 -1
  51. package/dist/gadgets/clock/SgClock.js +111 -180
  52. package/dist/gadgets/clock/SgTimeProvider.d.ts +1 -0
  53. package/dist/gadgets/clock/SgTimeProvider.d.ts.map +1 -1
  54. package/dist/gadgets/clock/SgTimeProvider.js +11 -4
  55. package/dist/gadgets/gauge/SgLinearGauge.d.ts +59 -0
  56. package/dist/gadgets/gauge/SgLinearGauge.d.ts.map +1 -0
  57. package/dist/gadgets/gauge/SgLinearGauge.js +258 -0
  58. package/dist/gadgets/gauge/SgRadialGauge.d.ts +73 -0
  59. package/dist/gadgets/gauge/SgRadialGauge.d.ts.map +1 -0
  60. package/dist/gadgets/gauge/SgRadialGauge.js +311 -0
  61. package/dist/gadgets/gauge/index.d.ts +5 -0
  62. package/dist/gadgets/gauge/index.d.ts.map +1 -0
  63. package/dist/gadgets/gauge/index.js +2 -0
  64. package/dist/gadgets/qr-code/SgQRCode.d.ts +25 -0
  65. package/dist/gadgets/qr-code/SgQRCode.d.ts.map +1 -0
  66. package/dist/gadgets/qr-code/SgQRCode.js +75 -0
  67. package/dist/gadgets/qr-code/index.d.ts +3 -0
  68. package/dist/gadgets/qr-code/index.d.ts.map +1 -0
  69. package/dist/gadgets/qr-code/index.js +1 -0
  70. package/dist/gadgets/string-animator/SgStringAnimator.d.ts +91 -0
  71. package/dist/gadgets/string-animator/SgStringAnimator.d.ts.map +1 -0
  72. package/dist/gadgets/string-animator/SgStringAnimator.js +145 -0
  73. package/dist/gadgets/string-animator/index.d.ts +3 -0
  74. package/dist/gadgets/string-animator/index.d.ts.map +1 -0
  75. package/dist/gadgets/string-animator/index.js +1 -0
  76. package/dist/i18n/en-US.json +9 -1
  77. package/dist/i18n/es.json +55 -47
  78. package/dist/i18n/index.d.ts +32 -0
  79. package/dist/i18n/index.d.ts.map +1 -1
  80. package/dist/i18n/pt-BR.json +9 -1
  81. package/dist/i18n/pt-PT.json +9 -1
  82. package/dist/index.d.ts +53 -5
  83. package/dist/index.d.ts.map +1 -1
  84. package/dist/index.js +25 -1
  85. package/dist/inputs/SgAutocomplete.js +21 -5
  86. package/dist/inputs/SgCombobox.d.ts +26 -0
  87. package/dist/inputs/SgCombobox.d.ts.map +1 -0
  88. package/dist/inputs/SgCombobox.js +354 -0
  89. package/dist/inputs/SgInputOTP.d.ts.map +1 -1
  90. package/dist/inputs/SgInputOTP.js +9 -2
  91. package/dist/inputs/SgRadioGroup.d.ts +37 -0
  92. package/dist/inputs/SgRadioGroup.d.ts.map +1 -0
  93. package/dist/inputs/SgRadioGroup.js +139 -0
  94. package/dist/inputs/SgRating.d.ts +55 -0
  95. package/dist/inputs/SgRating.d.ts.map +1 -0
  96. package/dist/inputs/SgRating.js +135 -0
  97. package/dist/inputs/SgSlider.d.ts +20 -0
  98. package/dist/inputs/SgSlider.d.ts.map +1 -0
  99. package/dist/inputs/SgSlider.js +40 -0
  100. package/dist/inputs/SgStepperInput.d.ts +22 -0
  101. package/dist/inputs/SgStepperInput.d.ts.map +1 -0
  102. package/dist/inputs/SgStepperInput.js +51 -0
  103. package/dist/inputs/SgTextEditor.d.ts +1 -0
  104. package/dist/inputs/SgTextEditor.d.ts.map +1 -1
  105. package/dist/inputs/SgTextEditor.js +19 -3
  106. package/dist/inputs/SgToggleSwitch.d.ts +36 -0
  107. package/dist/inputs/SgToggleSwitch.d.ts.map +1 -0
  108. package/dist/inputs/SgToggleSwitch.js +174 -0
  109. package/dist/layout/SgAccordion.d.ts +39 -0
  110. package/dist/layout/SgAccordion.d.ts.map +1 -0
  111. package/dist/layout/SgAccordion.js +116 -0
  112. package/dist/layout/SgBreadcrumb.d.ts +33 -0
  113. package/dist/layout/SgBreadcrumb.d.ts.map +1 -0
  114. package/dist/layout/SgBreadcrumb.js +121 -0
  115. package/dist/layout/SgCarousel.d.ts +43 -0
  116. package/dist/layout/SgCarousel.d.ts.map +1 -0
  117. package/dist/layout/SgCarousel.js +166 -0
  118. package/dist/layout/SgDockLayout.d.ts +14 -0
  119. package/dist/layout/SgDockLayout.d.ts.map +1 -1
  120. package/dist/layout/SgDockLayout.js +145 -13
  121. package/dist/layout/SgDockScreen.d.ts +15 -0
  122. package/dist/layout/SgDockScreen.d.ts.map +1 -0
  123. package/dist/layout/SgDockScreen.js +13 -0
  124. package/dist/layout/SgDockZone.d.ts.map +1 -1
  125. package/dist/layout/SgDockZone.js +36 -2
  126. package/dist/layout/SgExpandablePanel.d.ts +50 -0
  127. package/dist/layout/SgExpandablePanel.d.ts.map +1 -0
  128. package/dist/layout/SgExpandablePanel.js +302 -0
  129. package/dist/layout/SgMainPanel.d.ts.map +1 -1
  130. package/dist/layout/SgMainPanel.js +36 -14
  131. package/dist/layout/SgMenu.d.ts +91 -0
  132. package/dist/layout/SgMenu.d.ts.map +1 -0
  133. package/dist/layout/SgMenu.js +939 -0
  134. package/dist/layout/SgPageControl.d.ts +49 -0
  135. package/dist/layout/SgPageControl.d.ts.map +1 -0
  136. package/dist/layout/SgPageControl.js +152 -0
  137. package/dist/layout/SgPanel.d.ts.map +1 -1
  138. package/dist/layout/SgPanel.js +10 -1
  139. package/dist/layout/SgScreen.d.ts +2 -0
  140. package/dist/layout/SgScreen.d.ts.map +1 -1
  141. package/dist/layout/SgScreen.js +4 -2
  142. package/dist/layout/SgToolBar.d.ts +9 -3
  143. package/dist/layout/SgToolBar.d.ts.map +1 -1
  144. package/dist/layout/SgToolBar.js +461 -55
  145. package/dist/menus/SgDockMenu.d.ts +62 -0
  146. package/dist/menus/SgDockMenu.d.ts.map +1 -0
  147. package/dist/menus/SgDockMenu.js +480 -0
  148. package/dist/others/SgPlayground.js +73 -73
  149. package/package.json +72 -57
  150. package/dist/gadgets/flip-digit/SgFlipDigit.d.ts +0 -23
  151. package/dist/gadgets/flip-digit/SgFlipDigit.d.ts.map +0 -1
  152. package/dist/gadgets/flip-digit/SgFlipDigit.js +0 -118
  153. package/dist/gadgets/flip-digit/index.d.ts.map +0 -1
  154. /package/dist/{gadgets → digits}/flip-digit/index.d.ts +0 -0
  155. /package/dist/{gadgets → digits}/flip-digit/index.js +0 -0
@@ -1,20 +1,53 @@
1
1
  "use client";
2
2
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
3
  import * as React from "react";
4
- import { useSgTime } from "./SgTimeProvider";
4
+ import { useSgTimeContext } from "./SgTimeProvider";
5
5
  import { useSgClockThemeResolver } from "./themes/provider";
6
6
  import { ThemeLayer, resolveTheme } from "./themes/renderTheme";
7
7
  import { useDarkFlag } from "./themes/useDarkFlag";
8
8
  import { getTheme } from "./themes/registry";
9
+ import { SgFlipDigit } from "../../digits/flip-digit";
10
+ import { SgRoller3DDigit } from "../../digits/roller3d-digit";
11
+ import { SgFadeDigit } from "../../digits/fade-digit";
12
+ import { SgMatrixDigit } from "../../digits/matrix-digit";
13
+ import { SgNeonDigit } from "../../digits/neon-digit";
14
+ import { SgDiscardDigit } from "../../digits/discard-digit";
9
15
  function cn(...parts) {
10
16
  return parts.filter(Boolean).join(" ");
11
17
  }
12
- function useSecondTick() {
18
+ function useSecondTick(enabled = true) {
13
19
  const [, setTick] = React.useState(0);
14
20
  React.useEffect(() => {
21
+ if (!enabled)
22
+ return;
15
23
  const id = window.setInterval(() => setTick((v) => v + 1), 1000);
16
24
  return () => window.clearInterval(id);
25
+ }, [enabled]);
26
+ }
27
+ function parseInitialServerMs(initialServerTime) {
28
+ if (!initialServerTime)
29
+ return Date.now();
30
+ const parsed = Date.parse(initialServerTime);
31
+ return Number.isFinite(parsed) ? parsed : Date.now();
32
+ }
33
+ function useClockNowMs(initialServerTime) {
34
+ const ctx = useSgTimeContext();
35
+ const [seedMs] = React.useState(() => parseInitialServerMs(initialServerTime));
36
+ const perfStartMsRef = React.useRef(0);
37
+ const [hydrated, setHydrated] = React.useState(false);
38
+ React.useEffect(() => {
39
+ perfStartMsRef.current = performance.now();
40
+ setHydrated(true);
17
41
  }, []);
42
+ const nowMs = React.useCallback(() => {
43
+ if (ctx)
44
+ return ctx.nowMs();
45
+ if (!hydrated)
46
+ return seedMs;
47
+ const delta = performance.now() - perfStartMsRef.current;
48
+ return seedMs + delta;
49
+ }, [ctx, hydrated, seedMs]);
50
+ return { nowMs, hasProvider: Boolean(ctx), providerTick: ctx?.tick ?? 0 };
18
51
  }
19
52
  function getHmsForTimezone(date, locale, timeZone) {
20
53
  const parts = new Intl.DateTimeFormat(locale, {
@@ -49,12 +82,6 @@ function digitalSizeToNumber(size) {
49
82
  return 28;
50
83
  return 16;
51
84
  }
52
- function getPrevNext(value, min, max) {
53
- const range = max - min + 1;
54
- const prev = ((value - 1 - min + range) % range) + min;
55
- const next = ((value + 1 - min) % range) + min;
56
- return { prev, next };
57
- }
58
85
  function buildRange(min, max) {
59
86
  const out = [];
60
87
  for (let i = min; i <= max; i += 1)
@@ -169,35 +196,10 @@ function renderSegmentText(text, sizePx) {
169
196
  });
170
197
  return { width, height, nodes };
171
198
  }
172
- function wrapRange(value, start, end) {
173
- const size = end - start + 1;
174
- const v = ((value - start) % size + size) % size;
175
- return start + v;
176
- }
177
- function getTimeValue(date, locale, timeZone, mode, smooth) {
178
- const { h, m, s } = getHmsForTimezone(date, locale, timeZone);
179
- const ms = date.getMilliseconds();
180
- if (mode === "hours") {
181
- if (!smooth)
182
- return { base: h, frac: 0 };
183
- const value = h + m / 60 + s / 3600;
184
- return { base: Math.floor(value), frac: value - Math.floor(value) };
185
- }
186
- if (mode === "minutes") {
187
- if (!smooth)
188
- return { base: m, frac: 0 };
189
- const value = m + s / 60;
190
- return { base: Math.floor(value), frac: value - Math.floor(value) };
191
- }
192
- if (!smooth)
193
- return { base: s, frac: 0 };
194
- const value = s + ms / 1000;
195
- return { base: Math.floor(value), frac: value - Math.floor(value) };
196
- }
197
- function AnalogClock({ size = 280, timezone, locale = "pt-BR", showSeconds = true, secondHandMode = "step", themeId = "classic", theme, className, centerOverlay }) {
198
- const { tick, nowMs } = useSgTime();
199
- void tick;
200
- useSecondTick();
199
+ function AnalogClock({ size = 280, initialServerTime, timezone, locale = "pt-BR", showSeconds = true, secondHandMode = "step", themeId = "classic", theme, className, centerOverlay }) {
200
+ const { nowMs, hasProvider, providerTick } = useClockNowMs(initialServerTime);
201
+ void providerTick;
202
+ useSecondTick(!hasProvider);
201
203
  const resolver = useSgClockThemeResolver();
202
204
  const dark = useDarkFlag();
203
205
  const date = new Date(nowMs());
@@ -211,76 +213,10 @@ function AnalogClock({ size = 280, timezone, locale = "pt-BR", showSeconds = tru
211
213
  (resolver ? resolveTheme(resolver, themeId, "classic") : getTheme(themeId) ?? getTheme("classic"));
212
214
  return (_jsx("div", { className: className, children: _jsxs("svg", { width: size, height: size, viewBox: "0 0 100 100", className: "block", "aria-label": "Analog clock", children: [_jsx("g", { id: "theme", children: themeObj ? _jsx(ThemeLayer, { theme: themeObj, args: { size, dark } }) : null }), _jsxs("g", { id: "hands", children: [_jsx("g", { transform: `rotate(${hourDeg} 50 50)`, children: _jsx("line", { x1: "50", y1: "50", x2: "50", y2: "28", className: "stroke-neutral-800 dark:stroke-neutral-200", strokeWidth: "2.6", strokeLinecap: "round" }) }), _jsx("g", { transform: `rotate(${minDeg} 50 50)`, children: _jsx("line", { x1: "50", y1: "50", x2: "50", y2: "18", className: "stroke-neutral-800 dark:stroke-neutral-200", strokeWidth: "1.7", strokeLinecap: "round" }) }), showSeconds && (_jsx("g", { transform: `rotate(${secDeg} 50 50)`, children: _jsx("line", { x1: "50", y1: "54", x2: "50", y2: "14", className: "stroke-rose-500", strokeWidth: "0.9", strokeLinecap: "round" }) }))] }), _jsx("circle", { cx: "50", cy: "50", r: "2.2", className: "fill-neutral-800 dark:fill-neutral-200" }), showSeconds ? _jsx("circle", { cx: "50", cy: "50", r: "1.1", className: "fill-rose-500" }) : null, centerOverlay ? (_jsx("foreignObject", { x: "35", y: "35", width: "30", height: "30", children: _jsx("div", { className: "flex h-full w-full items-center justify-center", children: centerOverlay }) })) : null] }) }));
213
215
  }
214
- function FlipDigitCard({ ch, w, h, digitFont }) {
215
- const prevRef = React.useRef(ch);
216
- const [prev, setPrev] = React.useState(ch);
217
- const [flip, setFlip] = React.useState(false);
218
- const [animKey, setAnimKey] = React.useState(0);
219
- React.useEffect(() => {
220
- if (ch === prevRef.current)
221
- return;
222
- setPrev(prevRef.current);
223
- setFlip(false);
224
- const raf = window.requestAnimationFrame(() => {
225
- setAnimKey((v) => v + 1);
226
- setFlip(true);
227
- });
228
- const id = window.setTimeout(() => {
229
- setFlip(false);
230
- prevRef.current = ch;
231
- }, 1200);
232
- return () => {
233
- window.cancelAnimationFrame(raf);
234
- window.clearTimeout(id);
235
- };
236
- }, [ch]);
237
- const panel = "relative overflow-hidden rounded-lg bg-neutral-900 text-white shadow-[0_10px_24px_rgba(0,0,0,0.4)]";
238
- const seam = "absolute left-0 right-0 top-1/2 z-10 h-[3px] bg-gradient-to-b from-black/70 to-transparent shadow-[0_3px_8px_rgba(0,0,0,0.7),0_-2px_6px_rgba(255,255,255,0.25)]";
239
- const half = "absolute left-0 w-full overflow-hidden";
240
- const glossTop = "before:absolute before:inset-0 before:bg-gradient-to-b before:from-white/10 before:to-transparent before:content-['']";
241
- const glossBottom = "after:absolute after:inset-0 after:bg-gradient-to-t after:from-black/30 after:to-transparent after:content-['']";
242
- return (_jsxs("div", { className: cn(panel, glossTop, glossBottom), style: { width: w, height: h, transformStyle: "preserve-3d", perspective: "1000px" }, children: [_jsx("div", { className: seam }), _jsx("div", { className: cn(half, "top-0"), style: { height: h / 2 }, children: _jsx("div", { className: "absolute flex items-center justify-center font-bold font-mono", style: {
243
- fontSize: digitFont,
244
- lineHeight: 1,
245
- width: "100%",
246
- height: h,
247
- top: 0,
248
- left: 0
249
- }, children: flip ? prev : ch }) }), _jsx("div", { className: cn(half, "bottom-0"), style: { height: h / 2 }, children: _jsx("div", { className: "absolute flex items-center justify-center font-bold font-mono", style: {
250
- fontSize: digitFont,
251
- lineHeight: 1,
252
- width: "100%",
253
- height: h,
254
- top: `-${h / 2}px`,
255
- left: 0
256
- }, children: ch }) }), flip ? (_jsxs(_Fragment, { children: [_jsx("div", { className: "absolute left-0 top-0 z-20 w-full overflow-hidden rounded-t-lg", style: { height: h / 2 }, children: _jsx("div", { className: "flip-top", style: {
257
- transformOrigin: "center bottom",
258
- height: "100%",
259
- width: "100%"
260
- }, children: _jsx("div", { className: "absolute flex items-center justify-center font-bold font-mono", style: {
261
- fontSize: digitFont,
262
- lineHeight: 1,
263
- width: "100%",
264
- height: h,
265
- top: 0,
266
- left: 0
267
- }, children: prev }) }, `top-${animKey}`) }), _jsx("div", { className: "absolute bottom-0 left-0 z-20 w-full overflow-hidden rounded-b-lg", style: { height: h / 2 }, children: _jsx("div", { className: "flip-bottom", style: {
268
- transformOrigin: "center top",
269
- height: "100%",
270
- width: "100%"
271
- }, children: _jsx("div", { className: "absolute flex items-center justify-center font-bold font-mono", style: {
272
- fontSize: digitFont,
273
- lineHeight: 1,
274
- width: "100%",
275
- height: h,
276
- top: `-${h / 2}px`,
277
- left: 0
278
- }, children: ch }) }, `bottom-${animKey}`) })] })) : null] }));
279
- }
280
- function DigitalClock({ timezone, locale = "pt-BR", format = "24h", showSeconds = true, size = "md", digitalStyle = "default", className }) {
281
- const { tick, nowMs } = useSgTime();
282
- void tick;
283
- useSecondTick();
216
+ function DigitalClock({ initialServerTime, timezone, locale = "pt-BR", format = "24h", showSeconds = true, size = "md", digitalStyle = "default", className }) {
217
+ const { nowMs, hasProvider, providerTick } = useClockNowMs(initialServerTime);
218
+ void providerTick;
219
+ useSecondTick(!hasProvider);
284
220
  const d = new Date(nowMs());
285
221
  const parts = new Intl.DateTimeFormat(locale, {
286
222
  timeZone: timezone,
@@ -302,6 +238,7 @@ function DigitalClock({ timezone, locale = "pt-BR", format = "24h", showSeconds
302
238
  const classSize = sizeToClass(size);
303
239
  const fontSize = typeof size === "number" ? { fontSize: `${size}px`, lineHeight: 1 } : undefined;
304
240
  const sizePx = digitalSizeToNumber(size);
241
+ const withPeriod = format === "12h" && dayPeriod ? `${text} ${dayPeriod.toUpperCase()}` : text;
305
242
  if (digitalStyle === "flip") {
306
243
  const hNum = Number.parseInt(hour, 10) || 0;
307
244
  const mNum = Number.parseInt(minute, 10) || 0;
@@ -310,55 +247,17 @@ function DigitalClock({ timezone, locale = "pt-BR", format = "24h", showSeconds
310
247
  const hh = String(safeHour).padStart(2, "0");
311
248
  const mm = String(mNum).padStart(2, "0");
312
249
  const ss = String(sNum).padStart(2, "0");
313
- const w = Math.round(sizePx * 1.62);
314
- const h = Math.round(sizePx * 2.35);
250
+ // fontSize drives all sizing in SgFlipDigit/@pqina/flip
315
251
  const digitFont = Math.round(sizePx * 1.4);
316
- const panel = "relative overflow-hidden rounded-lg bg-neutral-900 text-white shadow-[0_10px_24px_rgba(0,0,0,0.4)]";
317
- const glossTop = "before:absolute before:inset-0 before:bg-gradient-to-b before:from-white/10 before:to-transparent before:content-['']";
318
- const glossBottom = "after:absolute after:inset-0 after:bg-gradient-to-t after:from-black/30 after:to-transparent after:content-['']";
319
- const Colon = () => (_jsxs("div", { className: "flex flex-col items-center justify-center", style: { height: h }, children: [_jsx("div", { className: "h-2 w-2 rounded-full bg-white/80" }), _jsx("div", { className: "mt-2 h-2 w-2 rounded-full bg-white/80" })] }));
320
- const PeriodCell = ({ value }) => (_jsx("div", { className: cn(panel, glossTop, glossBottom, "flex items-center justify-center"), style: { width: Math.round(w * 1.35), height: h }, children: _jsx("span", { className: "font-semibold text-white/90", style: { fontSize: Math.round(sizePx * 1.05), lineHeight: 1 }, children: value }) }));
321
- return (_jsxs("div", { className: cn("flex items-center gap-2", className), "aria-label": "Digital clock", children: [_jsx("style", { children: `
322
- .flip-top {
323
- background: #1a1a1a;
324
- border-radius: 8px 8px 0 0;
325
- animation: sgFlipTop 0.6s cubic-bezier(0.4, 0.0, 0.2, 1) both;
326
- backface-visibility: hidden;
327
- transform-style: preserve-3d;
328
- will-change: transform;
329
- box-shadow: 0 2px 8px rgba(0,0,0,0.3), inset 0 -2px 4px rgba(0,0,0,0.2);
330
- }
331
- .flip-bottom {
332
- background: #1a1a1a;
333
- border-radius: 0 0 8px 8px;
334
- animation: sgFlipBottom 0.6s cubic-bezier(0.4, 0.0, 0.2, 1) both;
335
- animation-delay: 0.6s;
336
- backface-visibility: hidden;
337
- transform-style: preserve-3d;
338
- will-change: transform;
339
- box-shadow: 0 -2px 8px rgba(0,0,0,0.3), inset 0 2px 4px rgba(0,0,0,0.2);
340
- }
341
- @keyframes sgFlipTop {
342
- 0% {
343
- transform: rotateX(0deg);
344
- z-index: 30;
345
- }
346
- 100% {
347
- transform: rotateX(-180deg);
348
- z-index: 5;
349
- }
350
- }
351
- @keyframes sgFlipBottom {
352
- 0% {
353
- transform: rotateX(180deg);
354
- z-index: 5;
355
- }
356
- 100% {
357
- transform: rotateX(0deg);
358
- z-index: 30;
359
- }
360
- }
361
- ` }), _jsx(FlipDigitCard, { ch: hh.charAt(0), w: w, h: h, digitFont: digitFont }), _jsx(FlipDigitCard, { ch: hh.charAt(1), w: w, h: h, digitFont: digitFont }), _jsx(Colon, {}), _jsx(FlipDigitCard, { ch: mm.charAt(0), w: w, h: h, digitFont: digitFont }), _jsx(FlipDigitCard, { ch: mm.charAt(1), w: w, h: h, digitFont: digitFont }), showSeconds ? (_jsxs(_Fragment, { children: [_jsx(Colon, {}), _jsx(FlipDigitCard, { ch: ss.charAt(0), w: w, h: h, digitFont: digitFont }), _jsx(FlipDigitCard, { ch: ss.charAt(1), w: w, h: h, digitFont: digitFont })] })) : null, format === "12h" && dayPeriod ? _jsx(PeriodCell, { value: dayPeriod.toUpperCase() }) : null] }));
252
+ // Approx card height: fontSize * line-height(1.4) from the library CSS
253
+ const cardH = Math.round(digitFont * 1.4);
254
+ const Colon = () => (_jsxs("div", { className: "flex flex-col items-center justify-center gap-2", style: { height: cardH }, children: [_jsx("div", { className: "h-2 w-2 rounded-full bg-[#edebeb]/80" }), _jsx("div", { className: "h-2 w-2 rounded-full bg-[#edebeb]/80" })] }));
255
+ const PeriodCell = ({ value }) => (_jsx("div", { className: "flex items-center justify-center rounded bg-[#333232]", style: {
256
+ height: cardH,
257
+ padding: `0 ${Math.round(sizePx * 0.4)}px`,
258
+ boxShadow: "0 .125em .3125em rgba(0,0,0,.25)",
259
+ }, children: _jsx("span", { style: { fontSize: Math.round(sizePx * 0.9), color: "#edebeb", fontWeight: 700, lineHeight: 1 }, children: value }) }));
260
+ return (_jsxs("div", { className: cn("flex items-center gap-2", className), "aria-label": "Digital clock", children: [_jsx(SgFlipDigit, { value: hh.charAt(0), fontSize: digitFont }), _jsx(SgFlipDigit, { value: hh.charAt(1), fontSize: digitFont }), _jsx(Colon, {}), _jsx(SgFlipDigit, { value: mm.charAt(0), fontSize: digitFont }), _jsx(SgFlipDigit, { value: mm.charAt(1), fontSize: digitFont }), showSeconds ? (_jsxs(_Fragment, { children: [_jsx(Colon, {}), _jsx(SgFlipDigit, { value: ss.charAt(0), fontSize: digitFont }), _jsx(SgFlipDigit, { value: ss.charAt(1), fontSize: digitFont })] })) : null, format === "12h" && dayPeriod ? _jsx(PeriodCell, { value: dayPeriod.toUpperCase() }) : null] }));
362
261
  }
363
262
  if (digitalStyle === "roller3d") {
364
263
  const hNum = Number.parseInt(hour, 10) || 0;
@@ -367,29 +266,61 @@ function DigitalClock({ timezone, locale = "pt-BR", format = "24h", showSeconds
367
266
  const hourMax = format === "12h" ? 12 : 23;
368
267
  const hourMin = format === "12h" ? 1 : 0;
369
268
  const safeHour = format === "12h" ? (hNum === 0 ? 12 : hNum) : hNum;
370
- const hours = buildRange(hourMin, hourMax);
371
- const minutes = buildRange(0, 59);
372
- const seconds = buildRange(0, 59);
373
- const periodList = ["AM", "PM"];
374
- const w = Math.round(sizePx * 2.8);
375
- const h = Math.round(sizePx * 3.6);
376
- const itemH = Math.round(sizePx * 1.6);
377
- const glow = "shadow-[inset_0_0_28px_rgba(0,0,0,0.08),0_8px_28px_rgba(0,0,0,0.12)]";
378
- const face = "relative overflow-hidden rounded-2xl bg-white text-neutral-900 ring-1 ring-black/5";
379
- const topShade = "before:absolute before:inset-0 before:bg-gradient-to-b before:from-black/6 before:to-transparent before:content-['']";
380
- const bottomShade = "after:absolute after:inset-0 after:bg-gradient-to-t after:from-black/12 after:to-transparent after:content-['']";
381
- const divider = "absolute left-0 right-0 top-1/2 h-px bg-red-500/70";
382
- const mask = "[mask-image:linear-gradient(to_bottom,transparent,black_22%,black_78%,transparent)]";
383
- const renderRoll = (list, value, pad = 2) => {
384
- const idx = typeof value === "string" ? list.indexOf(value) : list.indexOf(value);
385
- const translateY = -idx * itemH + h / 2 - itemH / 2;
386
- return (_jsxs("div", { className: cn("relative", glow, face, topShade, bottomShade), style: { width: w, height: h }, children: [_jsx("div", { className: divider }), _jsx("div", { className: cn("absolute left-0 top-0 w-full transition-transform duration-500 [transition-timing-function:cubic-bezier(0.22,1,0.36,1)]", mask), style: { transform: `translateY(${translateY}px)` }, children: list.map((v, i) => (_jsx("div", { className: "flex h-[var(--sg-roll-h)] items-center justify-center font-medium tabular-nums text-neutral-400", style: {
387
- height: itemH,
388
- fontSize: Math.round(sizePx * 1.35),
389
- color: i === idx ? "rgb(30 30 34)" : "rgb(163 163 170)"
390
- }, children: typeof v === "number" ? String(v).padStart(pad, "0") : v }, `${v}-${i}`))) })] }));
269
+ const hourItems = buildRange(hourMin, hourMax).map((n) => String(n).padStart(2, "0"));
270
+ const minuteItems = buildRange(0, 59).map((n) => String(n).padStart(2, "0"));
271
+ const secondItems = buildRange(0, 59).map((n) => String(n).padStart(2, "0"));
272
+ const periodItems = ["AM", "PM"];
273
+ const digitFont = Math.round(sizePx * 1.35);
274
+ const hh = String(safeHour).padStart(2, "0");
275
+ const mm = String(mNum).padStart(2, "0");
276
+ const ss = String(sNum).padStart(2, "0");
277
+ return (_jsxs("div", { className: cn("flex items-center gap-4", className), style: fontSize, "aria-label": "Digital clock", children: [_jsx(SgRoller3DDigit, { value: hh, items: hourItems, fontSize: digitFont }), _jsx(SgRoller3DDigit, { value: mm, items: minuteItems, fontSize: digitFont }), showSeconds ? _jsx(SgRoller3DDigit, { value: ss, items: secondItems, fontSize: digitFont }) : null, format === "12h" && dayPeriod ? (_jsx(SgRoller3DDigit, { value: dayPeriod.toUpperCase(), items: periodItems, fontSize: digitFont })) : null] }));
278
+ }
279
+ if (digitalStyle === "fade") {
280
+ const hNum = Number.parseInt(hour, 10) || 0;
281
+ const mNum = Number.parseInt(minute, 10) || 0;
282
+ const sNum = Number.parseInt(second || "0", 10) || 0;
283
+ const safeHour = format === "12h" ? (hNum === 0 ? 12 : hNum) : hNum;
284
+ const hh = String(safeHour).padStart(2, "0");
285
+ const mm = String(mNum).padStart(2, "0");
286
+ const ss = String(sNum).padStart(2, "0");
287
+ const digitFont = Math.round(sizePx * 1.35);
288
+ const cardH = Math.round(digitFont * 1.4);
289
+ const Colon = () => (_jsxs("div", { className: "flex flex-col items-center justify-center gap-2", style: { height: cardH }, children: [_jsx("div", { className: "h-2 w-2 rounded-full bg-neutral-500/70" }), _jsx("div", { className: "h-2 w-2 rounded-full bg-neutral-500/70" })] }));
290
+ return (_jsxs("div", { className: cn("flex items-center gap-2", className), "aria-label": "Digital clock", children: [_jsx(SgFadeDigit, { value: hh.charAt(0), fontSize: digitFont }), _jsx(SgFadeDigit, { value: hh.charAt(1), fontSize: digitFont }), _jsx(Colon, {}), _jsx(SgFadeDigit, { value: mm.charAt(0), fontSize: digitFont }), _jsx(SgFadeDigit, { value: mm.charAt(1), fontSize: digitFont }), showSeconds ? (_jsxs(_Fragment, { children: [_jsx(Colon, {}), _jsx(SgFadeDigit, { value: ss.charAt(0), fontSize: digitFont }), _jsx(SgFadeDigit, { value: ss.charAt(1), fontSize: digitFont })] })) : null, format === "12h" && dayPeriod ? (_jsx("span", { className: "text-xs font-semibold text-muted-foreground", children: dayPeriod.toUpperCase() })) : null] }));
291
+ }
292
+ if (digitalStyle === "discard") {
293
+ const hNum = Number.parseInt(hour, 10) || 0;
294
+ const mNum = Number.parseInt(minute, 10) || 0;
295
+ const sNum = Number.parseInt(second || "0", 10) || 0;
296
+ const safeHour = format === "12h" ? (hNum === 0 ? 12 : hNum) : hNum;
297
+ const hh = String(safeHour).padStart(2, "0");
298
+ const mm = String(mNum).padStart(2, "0");
299
+ const ss = String(sNum).padStart(2, "0");
300
+ const digitFont = typeof size === "number"
301
+ ? Math.max(36, Math.round(sizePx * 2.2))
302
+ : size === "sm"
303
+ ? 38
304
+ : size === "lg"
305
+ ? 56
306
+ : 44;
307
+ const pagesForDigit = (digit) => {
308
+ const n = Number.parseInt(digit, 10);
309
+ if (!Number.isFinite(n))
310
+ return 1;
311
+ return Math.max(1, Math.min(30, n));
391
312
  };
392
- return (_jsxs("div", { className: cn("flex items-center gap-4", className), style: fontSize, "aria-label": "Digital clock", children: [renderRoll(hours, safeHour), renderRoll(minutes, mNum), showSeconds ? renderRoll(seconds, sNum) : null, format === "12h" && dayPeriod ? renderRoll(periodList, dayPeriod.toUpperCase(), 0) : null] }));
313
+ const Colon = () => (_jsx(SgDiscardDigit, { value: ":", fontSize: Math.max(26, Math.round(digitFont * 0.72)), totalNumberPages: 1, transitionMs: 560, animateOnChange: false }));
314
+ const PeriodCell = ({ value }) => (_jsx(SgDiscardDigit, { value: value, fontSize: Math.max(20, Math.round(digitFont * 0.52)), totalNumberPages: 1, transitionMs: 560, animateOnChange: false }));
315
+ return (_jsxs("div", { className: cn("flex items-end gap-2", className), "aria-label": "Digital clock", children: [_jsx(SgDiscardDigit, { value: hh.charAt(0), fontSize: digitFont, totalNumberPages: pagesForDigit(hh.charAt(0)), transitionMs: 560, changeAnimationMode: "incoming" }), _jsx(SgDiscardDigit, { value: hh.charAt(1), fontSize: digitFont, totalNumberPages: pagesForDigit(hh.charAt(1)), transitionMs: 560, changeAnimationMode: "incoming" }), _jsx(Colon, {}), _jsx(SgDiscardDigit, { value: mm.charAt(0), fontSize: digitFont, totalNumberPages: pagesForDigit(mm.charAt(0)), transitionMs: 560, changeAnimationMode: "incoming" }), _jsx(SgDiscardDigit, { value: mm.charAt(1), fontSize: digitFont, totalNumberPages: pagesForDigit(mm.charAt(1)), transitionMs: 560, changeAnimationMode: "incoming" }), showSeconds ? (_jsxs(_Fragment, { children: [_jsx(Colon, {}), _jsx(SgDiscardDigit, { value: ss.charAt(0), fontSize: digitFont, totalNumberPages: pagesForDigit(ss.charAt(0)), transitionMs: 560, changeAnimationMode: "incoming" }), _jsx(SgDiscardDigit, { value: ss.charAt(1), fontSize: digitFont, totalNumberPages: pagesForDigit(ss.charAt(1)), transitionMs: 560, changeAnimationMode: "incoming" })] })) : null, format === "12h" && dayPeriod ? _jsx(PeriodCell, { value: dayPeriod.toUpperCase() }) : null] }));
316
+ }
317
+ if (digitalStyle === "matrix") {
318
+ const dotSize = Math.max(3, Math.round(sizePx * 0.32));
319
+ return (_jsx("div", { className: cn("flex items-center", className), "aria-label": "Digital clock", children: _jsx(SgMatrixDigit, { value: withPeriod, dotSize: dotSize, gap: Math.max(1, Math.round(dotSize * 0.35)), charGap: Math.max(3, Math.round(dotSize * 0.9)), padding: Math.max(6, Math.round(dotSize * 1.3)), rounded: Math.max(8, Math.round(dotSize * 1.1)) }) }));
320
+ }
321
+ if (digitalStyle === "neon") {
322
+ const neonFont = Math.max(18, Math.round(sizePx * 1.35));
323
+ return (_jsx("div", { className: cn("flex items-center", className), "aria-label": "Digital clock", children: _jsx(SgNeonDigit, { value: withPeriod, fontSize: neonFont, padding: Math.max(8, Math.round(sizePx * 0.6)), rounded: Math.max(10, Math.round(sizePx * 0.45)) }) }));
393
324
  }
394
325
  if (digitalStyle === "segment") {
395
326
  const seg = renderSegmentText(text, sizePx);
@@ -398,10 +329,10 @@ function DigitalClock({ timezone, locale = "pt-BR", format = "24h", showSeconds
398
329
  return (_jsxs("div", { className: cn("font-mono tabular-nums", classSize, className), style: fontSize, children: [text, format === "12h" && dayPeriod ? (_jsx("span", { className: "ml-2 align-top text-xs font-semibold text-muted-foreground", children: dayPeriod })) : null] }));
399
330
  }
400
331
  export function SgClock(props) {
401
- const { variant = "digital", size = "md", timezone, locale = "pt-BR", format = "24h", showSeconds = true, digitalStyle = "default", secondHandMode = "step", themeId = "classic", theme, className, centerOverlay } = props;
332
+ const { variant = "digital", size = "md", initialServerTime, timezone, locale = "pt-BR", format = "24h", showSeconds = true, digitalStyle = "default", secondHandMode = "step", themeId = "classic", theme, className, centerOverlay } = props;
402
333
  if (variant === "analog") {
403
334
  const analogSize = typeof size === "number" ? size : size === "sm" ? 140 : size === "lg" ? 320 : 240;
404
- return (_jsx(AnalogClock, { size: analogSize, themeId: themeId, theme: theme, timezone: timezone, locale: locale, showSeconds: showSeconds, secondHandMode: secondHandMode, className: className, centerOverlay: centerOverlay }));
335
+ return (_jsx(AnalogClock, { size: analogSize, initialServerTime: initialServerTime, themeId: themeId, theme: theme, timezone: timezone, locale: locale, showSeconds: showSeconds, secondHandMode: secondHandMode, className: className, centerOverlay: centerOverlay }));
405
336
  }
406
- return (_jsx(DigitalClock, { timezone: timezone, locale: locale, format: format, showSeconds: showSeconds, size: size, digitalStyle: digitalStyle, className: className }));
337
+ return (_jsx(DigitalClock, { timezone: timezone, initialServerTime: initialServerTime, locale: locale, format: format, showSeconds: showSeconds, size: size, digitalStyle: digitalStyle, className: className }));
407
338
  }
@@ -5,6 +5,7 @@ export type SgTimeContextValue = {
5
5
  tick: number;
6
6
  nowMs: () => number;
7
7
  };
8
+ export declare function useSgTimeContext(): SgTimeContextValue | null;
8
9
  export declare function useSgTime(): SgTimeContextValue;
9
10
  export declare function SgTimeProvider({ initialServerTime, children }: {
10
11
  initialServerTime: string;
@@ -1 +1 @@
1
- {"version":3,"file":"SgTimeProvider.d.ts","sourceRoot":"","sources":["../../../src/gadgets/clock/SgTimeProvider.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,MAAM,MAAM,kBAAkB,GAAG;IAC/B,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,MAAM,CAAC;CACrB,CAAC;AAIF,wBAAgB,SAAS,uBAIxB;AAED,wBAAgB,cAAc,CAAC,EAC7B,iBAAiB,EACjB,QAAQ,EACT,EAAE;IACD,iBAAiB,EAAE,MAAM,CAAC;IAC1B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B,2CAyCA"}
1
+ {"version":3,"file":"SgTimeProvider.d.ts","sourceRoot":"","sources":["../../../src/gadgets/clock/SgTimeProvider.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,MAAM,MAAM,kBAAkB,GAAG;IAC/B,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,MAAM,CAAC;CACrB,CAAC;AAIF,wBAAgB,gBAAgB,8BAE/B;AAED,wBAAgB,SAAS,uBAYxB;AAED,wBAAgB,cAAc,CAAC,EAC7B,iBAAiB,EACjB,QAAQ,EACT,EAAE;IACD,iBAAiB,EAAE,MAAM,CAAC;IAC1B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B,2CAyCA"}
@@ -2,11 +2,18 @@
2
2
  import { jsx as _jsx } from "react/jsx-runtime";
3
3
  import * as React from "react";
4
4
  const SgTimeContext = React.createContext(null);
5
+ export function useSgTimeContext() {
6
+ return React.useContext(SgTimeContext);
7
+ }
5
8
  export function useSgTime() {
6
- const ctx = React.useContext(SgTimeContext);
7
- if (!ctx)
8
- throw new Error("useSgTime must be used within <SgTimeProvider />");
9
- return ctx;
9
+ const ctx = useSgTimeContext();
10
+ const localFallback = React.useMemo(() => ({
11
+ serverStartMs: Date.now(),
12
+ perfStartMs: 0,
13
+ tick: 0,
14
+ nowMs: () => Date.now()
15
+ }), []);
16
+ return ctx ?? localFallback;
10
17
  }
11
18
  export function SgTimeProvider({ initialServerTime, children }) {
12
19
  const serverStartMsRef = React.useRef(Date.parse(initialServerTime));
@@ -0,0 +1,59 @@
1
+ import * as React from "react";
2
+ export type SgLinearGaugeRange = {
3
+ start: number;
4
+ end: number;
5
+ color?: string;
6
+ thickness?: number;
7
+ opacity?: number;
8
+ label?: React.ReactNode;
9
+ };
10
+ export type SgLinearGaugePointerShape = "triangle" | "inverted-triangle" | "circle" | "diamond" | "rect";
11
+ export type SgLinearGaugePointer = {
12
+ id?: string;
13
+ value: number;
14
+ color?: string;
15
+ size?: number;
16
+ shape?: SgLinearGaugePointerShape;
17
+ draggable?: boolean;
18
+ onValueChange?: (value: number) => void;
19
+ label?: React.ReactNode;
20
+ };
21
+ export type SgLinearGaugeProps = {
22
+ min?: number;
23
+ max?: number;
24
+ value?: number;
25
+ defaultValue?: number;
26
+ onValueChange?: (value: number) => void;
27
+ pointers?: SgLinearGaugePointer[];
28
+ onPointerValueChange?: (pointerId: string, value: number, pointer: SgLinearGaugePointer) => void;
29
+ ranges?: SgLinearGaugeRange[];
30
+ orientation?: "horizontal" | "vertical";
31
+ isAxisInversed?: boolean;
32
+ showPrimaryPointer?: boolean;
33
+ primaryPointerShape?: SgLinearGaugePointerShape;
34
+ primaryPointerColor?: string;
35
+ primaryPointerSize?: number;
36
+ primaryPointerDraggable?: boolean;
37
+ barPointer?: boolean;
38
+ barColor?: string;
39
+ barThickness?: number;
40
+ showTicks?: boolean;
41
+ showLabels?: boolean;
42
+ majorTickCount?: number;
43
+ minorTicksPerInterval?: number;
44
+ labelFormatter?: (value: number) => React.ReactNode;
45
+ axisColor?: string;
46
+ axisThickness?: number;
47
+ width?: number;
48
+ height?: number;
49
+ animate?: boolean;
50
+ animationDuration?: number;
51
+ className?: string;
52
+ style?: React.CSSProperties;
53
+ ariaLabel?: string;
54
+ };
55
+ export declare function SgLinearGauge(props: Readonly<SgLinearGaugeProps>): import("react/jsx-runtime").JSX.Element;
56
+ export declare namespace SgLinearGauge {
57
+ var displayName: string;
58
+ }
59
+ //# sourceMappingURL=SgLinearGauge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SgLinearGauge.d.ts","sourceRoot":"","sources":["../../../src/gadgets/gauge/SgLinearGauge.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAc/B,MAAM,MAAM,kBAAkB,GAAG;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,yBAAyB,GACjC,UAAU,GACV,mBAAmB,GACnB,QAAQ,GACR,SAAS,GACT,MAAM,CAAC;AAEX,MAAM,MAAM,oBAAoB,GAAG;IACjC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,yBAAyB,CAAC;IAClC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAExC,QAAQ,CAAC,EAAE,oBAAoB,EAAE,CAAC;IAClC,oBAAoB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,KAAK,IAAI,CAAC;IAEjG,MAAM,CAAC,EAAE,kBAAkB,EAAE,CAAC;IAE9B,WAAW,CAAC,EAAE,YAAY,GAAG,UAAU,CAAC;IACxC,cAAc,CAAC,EAAE,OAAO,CAAC;IAEzB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,mBAAmB,CAAC,EAAE,yBAAyB,CAAC;IAChD,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAElC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,KAAK,CAAC,SAAS,CAAC;IAEpD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAWF,wBAAgB,aAAa,CAAC,KAAK,EAAE,QAAQ,CAAC,kBAAkB,CAAC,2CAogBhE;yBApgBe,aAAa"}