singularity-components 0.1.193 → 0.1.195

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 (80) hide show
  1. package/dist/components/blocks/cards/blogpost-card.d.ts +2 -2
  2. package/dist/components/blocks/cards/card.d.ts +7 -8
  3. package/dist/components/blocks/empty-state/EmptyState.d.ts +2 -2
  4. package/dist/components/blocks/index.d.ts +1 -1
  5. package/dist/components/blocks/index.js +1 -0
  6. package/dist/components/blocks/index.js.map +1 -1
  7. package/dist/components/blocks/login/login.d.ts +78 -0
  8. package/dist/components/blocks/login/login.js +95 -0
  9. package/dist/components/blocks/login/login.js.map +1 -0
  10. package/dist/components/blocks/post-list/post-filters.d.ts +2 -2
  11. package/dist/components/blocks/post-list/post-list-with-filters.d.ts +2 -2
  12. package/dist/components/index.d.ts +2 -2
  13. package/dist/components/pages/admin/admin-page.d.ts +2 -2
  14. package/dist/components/pages/blogpost/blogpost.d.ts +2 -2
  15. package/dist/components/pages/category/category-page.d.ts +2 -2
  16. package/dist/components/pages/chat/chat-page.d.ts +2 -2
  17. package/dist/components/pages/index.d.ts +1 -1
  18. package/dist/components/pages/login/login-page.d.ts +2 -2
  19. package/dist/components/pages/login/login-page.js +19 -69
  20. package/dist/components/pages/login/login-page.js.map +1 -1
  21. package/dist/components/pages/maintenance/maintenance-page.d.ts +2 -2
  22. package/dist/components/pages/not-found/not-found.d.ts +2 -2
  23. package/dist/components/pages/privacy/privacy-page.d.ts +2 -2
  24. package/dist/components/pages/search/search-page.d.ts +2 -2
  25. package/dist/components/pages/startpage/startpage.d.ts +2 -2
  26. package/dist/components/pages/terms/terms-page.d.ts +2 -2
  27. package/dist/components/primitives/accordion/accordion.d.ts +5 -5
  28. package/dist/components/primitives/alert/alert.d.ts +4 -5
  29. package/dist/components/primitives/avatar/avatar.d.ts +6 -7
  30. package/dist/components/primitives/badge/badges.d.ts +1 -2
  31. package/dist/components/primitives/buttons/button.d.ts +2 -2
  32. package/dist/components/primitives/buttons/icon-button.d.ts +2 -2
  33. package/dist/components/primitives/buttons/link-button.d.ts +2 -3
  34. package/dist/components/primitives/collapsible/collapsible.d.ts +3 -4
  35. package/dist/components/primitives/dropdown-menu/dropdown-menu.d.ts +1 -2
  36. package/dist/components/primitives/forms/checkbox.d.ts +2 -2
  37. package/dist/components/primitives/forms/field.d.ts +11 -12
  38. package/dist/components/primitives/forms/input.d.ts +1 -2
  39. package/dist/components/primitives/forms/select.d.ts +7 -8
  40. package/dist/components/primitives/forms/textarea.d.ts +1 -2
  41. package/dist/components/primitives/icon/icon.d.ts +1 -2
  42. package/dist/components/primitives/index.d.ts +2 -3
  43. package/dist/components/primitives/label/label.d.ts +1 -2
  44. package/dist/components/primitives/layout/layout.d.ts +4 -3
  45. package/dist/components/primitives/layout/layout.js.map +1 -1
  46. package/dist/components/primitives/link/link.d.ts +2 -3
  47. package/dist/components/primitives/separator/separator.d.ts +2 -2
  48. package/dist/components/primitives/sheet/sheet.d.ts +2 -3
  49. package/dist/components/primitives/skeleton/skeleton.d.ts +2 -2
  50. package/dist/components/primitives/sonner/sonner.d.ts +2 -2
  51. package/dist/components/primitives/spinner/spinner.d.ts +2 -2
  52. package/dist/components/primitives/stack/stack.d.ts +45 -1
  53. package/dist/components/primitives/stack/stack.js +44 -42
  54. package/dist/components/primitives/stack/stack.js.map +1 -1
  55. package/dist/components/primitives/text/heading.d.ts +2 -3
  56. package/dist/components/primitives/text/internal/text-element.d.ts +1 -2
  57. package/dist/components/primitives/text/text-code.d.ts +2 -2
  58. package/dist/components/primitives/text/text-div.d.ts +2 -3
  59. package/dist/components/primitives/text/text-span.d.ts +2 -3
  60. package/dist/components/primitives/text/text-time.d.ts +2 -3
  61. package/dist/components/primitives/text/text.d.ts +2 -3
  62. package/dist/components/primitives/ui-image/ui-image.d.ts +2 -3
  63. package/dist/components/primitives/ui-link/ui-link.d.ts +2 -3
  64. package/dist/components/providers/SingularityContext.d.ts +0 -1
  65. package/dist/components/providers/auth-provider.d.ts +2 -2
  66. package/dist/components/providers/index.d.ts +0 -1
  67. package/dist/components/providers/theme-provider.d.ts +1 -2
  68. package/dist/components/templates/container/container.d.ts +4 -5
  69. package/dist/components/templates/footer/footer.d.ts +2 -2
  70. package/dist/components/templates/form/form.d.ts +2 -2
  71. package/dist/components/templates/hero/hero.d.ts +2 -2
  72. package/dist/components/templates/hero/hero.js +2 -2
  73. package/dist/components/templates/hero/hero.js.map +1 -1
  74. package/dist/components/templates/index.d.ts +0 -1
  75. package/dist/components/templates/navigation/header.d.ts +1 -2
  76. package/dist/components/templates/navigation/index.d.ts +0 -1
  77. package/dist/index.d.ts +2 -2
  78. package/dist/main.css +50 -32
  79. package/dist/main.css.map +1 -1
  80. package/package.json +52 -39
@@ -1,4 +1,4 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
1
+ import * as React$1 from 'react';
2
2
  import * as class_variance_authority_types from 'class-variance-authority/types';
3
3
  import { VariantProps } from 'class-variance-authority';
4
4
 
@@ -21,6 +21,6 @@ declare const textCodeVariantsProps: (props?: ({
21
21
  } & class_variance_authority_types.ClassProp) | undefined) => string;
22
22
  interface TextCodeProps extends React.HTMLAttributes<HTMLElement>, VariantProps<typeof textCodeVariantsProps> {
23
23
  }
24
- declare const TextCode: ({ children, size, className, ...props }: TextCodeProps) => react_jsx_runtime.JSX.Element;
24
+ declare const TextCode: ({ children, size, className, ...props }: TextCodeProps) => React$1.JSX.Element;
25
25
 
26
26
  export { TextCode, type TextCodeProps, textCodeVariants, textCodeVariantsProps };
@@ -1,10 +1,9 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
1
+ import * as React from 'react';
2
2
  import { OmitClassProperty } from '../../../lib/types.js';
3
3
  import { TextElementProps } from './internal/text-element.js';
4
4
  import 'class-variance-authority/types';
5
- import 'react';
6
5
  import 'class-variance-authority';
7
6
 
8
- declare const TextDiv: ({ children, size, foreground, fontweight, className, ...props }: OmitClassProperty<TextElementProps, "as">) => react_jsx_runtime.JSX.Element;
7
+ declare const TextDiv: ({ children, size, foreground, fontweight, className, ...props }: OmitClassProperty<TextElementProps, "as">) => React.JSX.Element;
9
8
 
10
9
  export { TextDiv };
@@ -1,10 +1,9 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
1
+ import * as React from 'react';
2
2
  import { OmitClassProperty } from '../../../lib/types.js';
3
3
  import { TextElementProps } from './internal/text-element.js';
4
4
  import 'class-variance-authority/types';
5
- import 'react';
6
5
  import 'class-variance-authority';
7
6
 
8
- declare const TextSpan: ({ children, size, foreground, fontweight, className, ...props }: OmitClassProperty<TextElementProps, "as">) => react_jsx_runtime.JSX.Element;
7
+ declare const TextSpan: ({ children, size, foreground, fontweight, className, ...props }: OmitClassProperty<TextElementProps, "as">) => React.JSX.Element;
9
8
 
10
9
  export { TextSpan };
@@ -1,10 +1,9 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
1
+ import * as React from 'react';
2
2
  import { TextElementProps } from './internal/text-element.js';
3
3
  import { OmitClassProperty } from '../../../lib/types.js';
4
4
  import 'class-variance-authority/types';
5
- import 'react';
6
5
  import 'class-variance-authority';
7
6
 
8
- declare const TextTime: ({ children, size, foreground, fontweight, className, ...props }: OmitClassProperty<TextElementProps, "as">) => react_jsx_runtime.JSX.Element;
7
+ declare const TextTime: ({ children, size, foreground, fontweight, className, ...props }: OmitClassProperty<TextElementProps, "as">) => React.JSX.Element;
9
8
 
10
9
  export { TextTime };
@@ -1,8 +1,7 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
1
+ import * as React from 'react';
2
2
  import * as class_variance_authority_types from 'class-variance-authority/types';
3
3
  import { OmitClassProperty } from '../../../lib/types.js';
4
4
  import { TextElementProps } from './internal/text-element.js';
5
- import 'react';
6
5
  import 'class-variance-authority';
7
6
 
8
7
  declare const textVariants: {
@@ -11,6 +10,6 @@ declare const textVariants: {
11
10
  declare const textVariantsProps: (props?: ({
12
11
  variant?: null | undefined;
13
12
  } & class_variance_authority_types.ClassProp) | undefined) => string;
14
- declare const Text: ({ children, size, foreground, fontweight, className, ...props }: OmitClassProperty<TextElementProps, "as">) => react_jsx_runtime.JSX.Element;
13
+ declare const Text: ({ children, size, foreground, fontweight, className, ...props }: OmitClassProperty<TextElementProps, "as">) => React.JSX.Element;
15
14
 
16
15
  export { Text, textVariants, textVariantsProps };
@@ -1,10 +1,9 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
1
+ import * as React from 'react';
2
2
  import { BaseImageProps } from '../../providers/ImageContext.js';
3
- import 'react';
4
3
 
5
4
  type Props = {
6
5
  showServerSideDefaultImageComponent?: boolean;
7
6
  } & BaseImageProps;
8
- declare function UiImage({ showServerSideDefaultImageComponent, ...props }: Props): react_jsx_runtime.JSX.Element;
7
+ declare function UiImage({ showServerSideDefaultImageComponent, ...props }: Props): React.JSX.Element;
9
8
 
10
9
  export { UiImage };
@@ -1,8 +1,7 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
1
+ import * as React from 'react';
2
2
  import { BaseLinkProps } from '../../providers/LinkContext.js';
3
- import 'react';
4
3
 
5
4
  type Props = BaseLinkProps;
6
- declare const UiLink: ({ ...props }: Props) => react_jsx_runtime.JSX.Element;
5
+ declare const UiLink: ({ ...props }: Props) => React.JSX.Element;
7
6
 
8
7
  export { UiLink };
@@ -2,7 +2,6 @@ import React__default, { ReactNode } from 'react';
2
2
  import { ImageComponentType } from './ImageContext.js';
3
3
  import { LinkComponentType } from './LinkContext.js';
4
4
  import { Theme } from './theme-provider.js';
5
- import 'react/jsx-runtime';
6
5
 
7
6
  interface SingularityProviderProps {
8
7
  ImageComponent?: ImageComponentType;
@@ -1,4 +1,4 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
1
+ import * as React from 'react';
2
2
  import { ReactNode } from 'react';
3
3
 
4
4
  interface AuthContextType {
@@ -9,7 +9,7 @@ interface AuthContextType {
9
9
  }
10
10
  declare function AuthProvider({ children }: {
11
11
  children: ReactNode;
12
- }): react_jsx_runtime.JSX.Element;
12
+ }): React.JSX.Element;
13
13
  declare const useAuth: () => AuthContextType;
14
14
 
15
15
  export { AuthProvider, useAuth };
@@ -4,4 +4,3 @@ export { SingularityProvider } from './SingularityContext.js';
4
4
  export { AuthProvider, useAuth } from './auth-provider.js';
5
5
  export { Theme, ThemeProvider, ThemeProviderProps, ThemeProviderState, useTheme } from './theme-provider.js';
6
6
  import 'react';
7
- import 'react/jsx-runtime';
@@ -1,4 +1,3 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
2
1
  import * as React from 'react';
3
2
 
4
3
  type Theme = "dark" | "light" | "system";
@@ -18,7 +17,7 @@ type ThemeProviderState = {
18
17
  * Supports "light", "dark", and "system" modes.
19
18
  * Default is "system" with a fallback to "dark".
20
19
  */
21
- declare function ThemeProvider({ children, defaultTheme, ...props }: ThemeProviderProps): react_jsx_runtime.JSX.Element;
20
+ declare function ThemeProvider({ children, defaultTheme, ...props }: ThemeProviderProps): React.JSX.Element;
22
21
  /**
23
22
  * Hook to access the current theme and setTheme function.
24
23
  */
@@ -1,4 +1,3 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
2
1
  import * as React from 'react';
3
2
  import { PropsWithChildren } from 'react';
4
3
 
@@ -6,11 +5,11 @@ type Prop = {
6
5
  children?: React.ReactNode;
7
6
  as?: "body" | "div";
8
7
  } & React.HTMLAttributes<HTMLElement>;
9
- declare function Container({ children, as: Component, className, ...rest }: PropsWithChildren<Prop>): react_jsx_runtime.JSX.Element;
8
+ declare function Container({ children, as: Component, className, ...rest }: PropsWithChildren<Prop>): React.JSX.Element;
10
9
  declare namespace Container {
11
- var Header: ({ children, as: Component, ...props }: ChildProp) => react_jsx_runtime.JSX.Element;
12
- var Content: ({ children, as: Component, ...props }: ChildProp) => react_jsx_runtime.JSX.Element;
13
- var Footer: ({ children, as: Component, ...props }: ChildProp) => react_jsx_runtime.JSX.Element;
10
+ var Header: ({ children, as: Component, ...props }: ChildProp) => React.JSX.Element;
11
+ var Content: ({ children, as: Component, ...props }: ChildProp) => React.JSX.Element;
12
+ var Footer: ({ children, as: Component, ...props }: ChildProp) => React.JSX.Element;
14
13
  }
15
14
  type ChildProp = {
16
15
  children?: React.ReactNode;
@@ -1,5 +1,5 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
1
+ import * as React from 'react';
2
2
 
3
- declare function Footer(): react_jsx_runtime.JSX.Element;
3
+ declare function Footer(): React.JSX.Element;
4
4
 
5
5
  export { Footer };
@@ -1,5 +1,5 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
1
+ import * as React from 'react';
2
2
 
3
- declare function Form(): react_jsx_runtime.JSX.Element;
3
+ declare function Form(): React.JSX.Element;
4
4
 
5
5
  export { Form as default };
@@ -1,4 +1,4 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
1
+ import * as React$1 from 'react';
2
2
 
3
3
  interface HeroProps {
4
4
  title?: React.ReactNode;
@@ -13,6 +13,6 @@ interface HeroProps {
13
13
  href: string;
14
14
  };
15
15
  }
16
- declare function Hero({ title, titleAccent, description, primaryCTA, secondaryCTA, }: HeroProps): react_jsx_runtime.JSX.Element;
16
+ declare function Hero({ title, titleAccent, description, primaryCTA, secondaryCTA, }: HeroProps): React$1.JSX.Element;
17
17
 
18
18
  export { Hero as default };
@@ -266,7 +266,7 @@ function Hero({
266
266
  primaryCTA && /* @__PURE__ */ jsx(
267
267
  LinkButton,
268
268
  {
269
- buttonSize: "lg",
269
+ size: "lg",
270
270
  to: primaryCTA.href,
271
271
  className: "sg:z-1",
272
272
  children: primaryCTA.label
@@ -276,7 +276,7 @@ function Hero({
276
276
  LinkButton,
277
277
  {
278
278
  variant: "secondary",
279
- buttonSize: "lg",
279
+ size: "lg",
280
280
  to: secondaryCTA.href,
281
281
  className: "sg:z-1",
282
282
  children: secondaryCTA.label
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/templates/hero/hero.tsx"],"sourcesContent":["\"use client\";\r\nimport {\r\n Layout,\r\n LinkButton,\r\n Stack,\r\n Heading,\r\n Text,\r\n TextSpan,\r\n} from \"../../primitives/index\";\r\nimport { useCallback, useMemo, useRef, useState } from \"react\";\r\n\r\nfunction seededRandom(seed: number) {\r\n const x = Math.sin(seed * 9999) * 10000;\r\n return x - Math.floor(x);\r\n}\r\n\r\nfunction round(num: number, decimals = 4) {\r\n return Number(num.toFixed(decimals));\r\n}\r\n\r\nfunction generateSparkles(count: number) {\r\n return Array.from({ length: count }, (_, i) => ({\r\n id: i,\r\n left: round(seededRandom(i) * 100),\r\n top: round(seededRandom(i + 1) * 100),\r\n size: round(seededRandom(i + 2) * 4 + 2),\r\n delay: round(seededRandom(i + 3) * 5),\r\n duration: round(seededRandom(i + 4) * 2 + 1.5),\r\n }));\r\n}\r\n\r\ninterface BurstParticle {\r\n id: number;\r\n x: number;\r\n y: number;\r\n angle: number;\r\n speed: number;\r\n hue: number;\r\n size: number;\r\n}\r\n\r\ninterface HeroProps {\r\n title?: React.ReactNode;\r\n titleAccent?: string;\r\n description?: string;\r\n primaryCTA?: { label: string; href: string };\r\n secondaryCTA?: { label: string; href: string };\r\n}\r\n\r\nexport default function Hero({\r\n title,\r\n titleAccent,\r\n description,\r\n primaryCTA,\r\n secondaryCTA,\r\n}: HeroProps) {\r\n const heroRef = useRef<HTMLElement>(null);\r\n const [mouse, setMouse] = useState({ x: 0.5, y: 0.5 });\r\n const [mousePixel, setMousePixel] = useState({ x: 0, y: 0 });\r\n const sparkles = useMemo(() => generateSparkles(40), []);\r\n const [bursts, setBursts] = useState<BurstParticle[]>([]);\r\n const burstIdRef = useRef(0);\r\n\r\n const handleMouseMove = useCallback((e: React.MouseEvent<HTMLElement>) => {\r\n const rect = heroRef.current?.getBoundingClientRect();\r\n if (!rect) return;\r\n setMouse({\r\n x: (e.clientX - rect.left) / rect.width,\r\n y: (e.clientY - rect.top) / rect.height,\r\n });\r\n setMousePixel({\r\n x: e.clientX - rect.left,\r\n y: e.clientY - rect.top,\r\n });\r\n }, []);\r\n\r\n const handleClick = useCallback((e: React.MouseEvent<HTMLElement>) => {\r\n const rect = heroRef.current?.getBoundingClientRect();\r\n if (!rect) return;\r\n const cx = e.clientX - rect.left;\r\n const cy = e.clientY - rect.top;\r\n const count = 18;\r\n\r\n const newBursts: BurstParticle[] = Array.from(\r\n { length: count },\r\n (_, i) => ({\r\n id: burstIdRef.current++,\r\n x: cx,\r\n y: cy,\r\n angle: (360 / count) * i + Math.random() * 20 - 10,\r\n speed: Math.random() * 120 + 60,\r\n hue: Math.random() * 360,\r\n size: Math.random() * 5 + 3,\r\n }),\r\n );\r\n\r\n setBursts((prev) => [...prev, ...newBursts]);\r\n setTimeout(() => {\r\n setBursts((prev) => prev.filter((b) => !newBursts.includes(b)));\r\n }, 800);\r\n }, []);\r\n\r\n return (\r\n <Layout type=\"container\">\r\n <Layout.Col1 hideDiv>\r\n <section\r\n ref={heroRef}\r\n onMouseMove={handleMouseMove}\r\n onClick={handleClick}\r\n onKeyDown={(e) => {\r\n if (e.key === \"Enter\" || e.key === \" \") {\r\n e.preventDefault();\r\n handleClick(e as any);\r\n }\r\n }}\r\n role=\"button\"\r\n tabIndex={0}\r\n data-testid=\"hero-section\"\r\n className=\"sg:relative sg:overflow-hidden sg:bg-background sg:cursor-crosshair sg:focus-visible:outline-none sg:focus-visible:ring-2 sg:focus-visible:ring-primary sg:focus-visible:ring-offset-2\"\r\n >\r\n {/* Colorful gradient blobs — follow mouse */}\r\n <div\r\n className=\"sg:absolute sg:inset-0 sg:overflow-hidden sg:pointer-events-none\"\r\n aria-hidden=\"true\"\r\n >\r\n {/* Hot pink / magenta */}\r\n <div\r\n className=\"sg:absolute sg:h-175 sg:w-175 sg:rounded-full sg:opacity-35 sg:blur-[90px] sg:transition-transform sg:duration-500 sg:ease-out\"\r\n style={{\r\n background: \"hsl(330, 90%, 55%)\",\r\n transform: `translate(${mouse.x * 70 - 35}%, ${mouse.y * 60 - 50}%)`,\r\n top: \"-10%\",\r\n right: \"-5%\",\r\n }}\r\n />\r\n {/* Electric blue */}\r\n <div\r\n className=\"sg:absolute sg:h-150 sg:w-150 sg:rounded-full sg:opacity-30 sg:blur-[80px] sg:transition-transform sg:duration-700 sg:ease-out\"\r\n style={{\r\n background: \"hsl(220, 95%, 55%)\",\r\n transform: `translate(${mouse.x * -60 + 30}%, ${mouse.y * 50 - 25}%)`,\r\n top: \"20%\",\r\n left: \"-8%\",\r\n }}\r\n />\r\n {/* Vivid orange */}\r\n <div\r\n className=\"sg:absolute sg:h-137.5 sg:w-137.5 sg:rounded-full sg:opacity-30 sg:blur-[70px] sg:transition-transform sg:duration-900 sg:ease-out\"\r\n style={{\r\n background: \"hsl(25, 95%, 55%)\",\r\n transform: `translate(${mouse.x * 55 - 28}%, ${mouse.y * -55 + 28}%)`,\r\n bottom: \"-5%\",\r\n right: \"15%\",\r\n }}\r\n />\r\n {/* Lime / green */}\r\n <div\r\n className=\"sg:absolute sg:h-100 sg:w-100 sg:rounded-full sg:opacity-25 sg:blur-[60px] sg:transition-transform sg:duration-400 sg:ease-out\"\r\n style={{\r\n background: \"hsl(145, 80%, 45%)\",\r\n transform: `translate(${mouse.x * 80 - 40}%, ${mouse.y * 80 - 40}%)`,\r\n top: \"5%\",\r\n left: \"20%\",\r\n }}\r\n />\r\n {/* Purple / violet */}\r\n <div\r\n className=\"sg:absolute sg:h-125 sg:w-125 sg:rounded-full sg:opacity-25 sg:blur-[75px] sg:transition-transform sg:duration-600 sg:ease-out\"\r\n style={{\r\n background: \"hsl(270, 85%, 55%)\",\r\n transform: `translate(${mouse.x * -45 + 22}%, ${mouse.y * 65 - 32}%)`,\r\n bottom: \"10%\",\r\n left: \"30%\",\r\n }}\r\n />\r\n {/* Yellow / gold accent */}\r\n <div\r\n className=\"sg:absolute sg:h-87.5 sg:w-87.5 sg:rounded-full sg:opacity-20 sg:blur-[50px] sg:transition-transform sg:duration-350 sg:ease-out\"\r\n style={{\r\n background: \"hsl(50, 95%, 55%)\",\r\n transform: `translate(${mouse.x * 90 - 45}%, ${mouse.y * -70 + 35}%)`,\r\n top: \"40%\",\r\n right: \"5%\",\r\n }}\r\n />\r\n </div>\r\n\r\n {/* Sparkle / glitter particles */}\r\n <div\r\n className=\"sg:absolute sg:inset-0 sg:overflow-hidden sg:pointer-events-none\"\r\n aria-hidden=\"true\"\r\n >\r\n {sparkles.map((s) => (\r\n <div\r\n key={s.id}\r\n className=\"sg:absolute sg:rounded-full\"\r\n style={{\r\n left: `${s.left}%`,\r\n top: `${s.top}%`,\r\n width: s.size,\r\n height: s.size,\r\n background: `hsl(${(s.id * 47) % 360}, 90%, 70%)`,\r\n boxShadow: `0 0 ${s.size * 2}px hsl(${(s.id * 47) % 360}, 90%, 70%)`,\r\n animation: `sparkle ${s.duration}s ${s.delay}s ease-in-out infinite`,\r\n transform: `translate(${(mouse.x - 0.5) * s.size * 8}px, ${(mouse.y - 0.5) * s.size * 8}px)`,\r\n transition: \"transform 0.3s ease-out\",\r\n }}\r\n />\r\n ))}\r\n </div>\r\n\r\n {/* Cursor spotlight */}\r\n <div\r\n className=\"sg:absolute sg:pointer-events-none\"\r\n style={{\r\n left: mousePixel.x - 150,\r\n top: mousePixel.y - 150,\r\n width: 300,\r\n height: 300,\r\n background:\r\n \"radial-gradient(circle, hsla(0, 0%, 100%, 0.15) 0%, transparent 60%)\",\r\n transition: \"left 0.1s ease-out, top 0.1s ease-out\",\r\n }}\r\n aria-hidden=\"true\"\r\n />\r\n\r\n {/* Click burst particles */}\r\n <div\r\n className=\"sg:absolute sg:inset-0 sg:pointer-events-none sg:overflow-hidden\"\r\n aria-hidden=\"true\"\r\n >\r\n {bursts.map((b) => (\r\n <div\r\n key={b.id}\r\n className=\"sg:absolute sg:rounded-full\"\r\n style={\r\n {\r\n left: b.x,\r\n top: b.y,\r\n width: b.size,\r\n height: b.size,\r\n background: `hsl(${b.hue}, 90%, 65%)`,\r\n boxShadow: `0 0 ${b.size * 3}px hsl(${b.hue}, 90%, 65%)`,\r\n animation: `burst 0.7s ease-out forwards`,\r\n \"--burst-x\": `${Math.cos((b.angle * Math.PI) / 180) * b.speed}px`,\r\n \"--burst-y\": `${Math.sin((b.angle * Math.PI) / 180) * b.speed}px`,\r\n } as React.CSSProperties\r\n }\r\n />\r\n ))}\r\n </div>\r\n\r\n {/* Subtle grain texture overlay */}\r\n <div\r\n className=\"sg:absolute sg:inset-0 sg:opacity-[0.02] sg:dark:opacity-[0.04] sg:pointer-events-none\"\r\n style={{\r\n backgroundImage:\r\n \"url(\\\"data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noise'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noise)'/%3E%3C/svg%3E\\\")\",\r\n }}\r\n aria-hidden=\"true\"\r\n />\r\n\r\n <Layout type=\"col\" className=\"sg:py-20 sg:md:py-32\">\r\n <Layout.Col1 hideDiv>\r\n {(title || titleAccent) && (\r\n <Heading variant=\"h1\">\r\n {title}{\" \"}\r\n {titleAccent && (\r\n <TextSpan size=\"4xl\" foreground=\"primary\">\r\n {titleAccent}\r\n </TextSpan>\r\n )}\r\n </Heading>\r\n )}\r\n\r\n {description && (\r\n <Text\r\n size=\"lg\"\r\n foreground=\"muted-foreground\"\r\n className=\"sg:mt-6 sg:max-w-xl\"\r\n >\r\n {description}\r\n </Text>\r\n )}\r\n\r\n {(primaryCTA || secondaryCTA) && (\r\n <Stack gap={3} direction=\"row\" wrap=\"wrap\" className=\"sg:mt-8\">\r\n {primaryCTA && (\r\n <LinkButton\r\n buttonSize=\"lg\"\r\n to={primaryCTA.href}\r\n className=\"sg:z-1\"\r\n >\r\n {primaryCTA.label}\r\n </LinkButton>\r\n )}\r\n {secondaryCTA && (\r\n <LinkButton\r\n variant=\"secondary\"\r\n buttonSize=\"lg\"\r\n to={secondaryCTA.href}\r\n className=\"sg:z-1\"\r\n >\r\n {secondaryCTA.label}\r\n </LinkButton>\r\n )}\r\n </Stack>\r\n )}\r\n </Layout.Col1>\r\n </Layout>\r\n\r\n {/* Bottom fade to background */}\r\n <div\r\n className=\"sg:absolute sg:bottom-0 sg:left-0 sg:right-0 sg:h-32 sg:bg-linear-to-t sg:from-background sg:to-transparent sg:pointer-events-none\"\r\n aria-hidden=\"true\"\r\n />\r\n </section>\r\n </Layout.Col1>\r\n </Layout>\r\n );\r\n}\r\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../../src/components/templates/hero/hero.tsx"],"sourcesContent":["\"use client\";\r\nimport {\r\n Layout,\r\n LinkButton,\r\n Stack,\r\n Heading,\r\n Text,\r\n TextSpan,\r\n} from \"../../primitives/index\";\r\nimport { useCallback, useMemo, useRef, useState } from \"react\";\r\n\r\nfunction seededRandom(seed: number) {\r\n const x = Math.sin(seed * 9999) * 10000;\r\n return x - Math.floor(x);\r\n}\r\n\r\nfunction round(num: number, decimals = 4) {\r\n return Number(num.toFixed(decimals));\r\n}\r\n\r\nfunction generateSparkles(count: number) {\r\n return Array.from({ length: count }, (_, i) => ({\r\n id: i,\r\n left: round(seededRandom(i) * 100),\r\n top: round(seededRandom(i + 1) * 100),\r\n size: round(seededRandom(i + 2) * 4 + 2),\r\n delay: round(seededRandom(i + 3) * 5),\r\n duration: round(seededRandom(i + 4) * 2 + 1.5),\r\n }));\r\n}\r\n\r\ninterface BurstParticle {\r\n id: number;\r\n x: number;\r\n y: number;\r\n angle: number;\r\n speed: number;\r\n hue: number;\r\n size: number;\r\n}\r\n\r\ninterface HeroProps {\r\n title?: React.ReactNode;\r\n titleAccent?: string;\r\n description?: string;\r\n primaryCTA?: { label: string; href: string };\r\n secondaryCTA?: { label: string; href: string };\r\n}\r\n\r\nexport default function Hero({\r\n title,\r\n titleAccent,\r\n description,\r\n primaryCTA,\r\n secondaryCTA,\r\n}: HeroProps) {\r\n const heroRef = useRef<HTMLElement>(null);\r\n const [mouse, setMouse] = useState({ x: 0.5, y: 0.5 });\r\n const [mousePixel, setMousePixel] = useState({ x: 0, y: 0 });\r\n const sparkles = useMemo(() => generateSparkles(40), []);\r\n const [bursts, setBursts] = useState<BurstParticle[]>([]);\r\n const burstIdRef = useRef(0);\r\n\r\n const handleMouseMove = useCallback((e: React.MouseEvent<HTMLElement>) => {\r\n const rect = heroRef.current?.getBoundingClientRect();\r\n if (!rect) return;\r\n setMouse({\r\n x: (e.clientX - rect.left) / rect.width,\r\n y: (e.clientY - rect.top) / rect.height,\r\n });\r\n setMousePixel({\r\n x: e.clientX - rect.left,\r\n y: e.clientY - rect.top,\r\n });\r\n }, []);\r\n\r\n const handleClick = useCallback((e: React.MouseEvent<HTMLElement>) => {\r\n const rect = heroRef.current?.getBoundingClientRect();\r\n if (!rect) return;\r\n const cx = e.clientX - rect.left;\r\n const cy = e.clientY - rect.top;\r\n const count = 18;\r\n\r\n const newBursts: BurstParticle[] = Array.from(\r\n { length: count },\r\n (_, i) => ({\r\n id: burstIdRef.current++,\r\n x: cx,\r\n y: cy,\r\n angle: (360 / count) * i + Math.random() * 20 - 10,\r\n speed: Math.random() * 120 + 60,\r\n hue: Math.random() * 360,\r\n size: Math.random() * 5 + 3,\r\n }),\r\n );\r\n\r\n setBursts((prev) => [...prev, ...newBursts]);\r\n setTimeout(() => {\r\n setBursts((prev) => prev.filter((b) => !newBursts.includes(b)));\r\n }, 800);\r\n }, []);\r\n\r\n return (\r\n <Layout type=\"container\">\r\n <Layout.Col1 hideDiv>\r\n <section\r\n ref={heroRef}\r\n onMouseMove={handleMouseMove}\r\n onClick={handleClick}\r\n onKeyDown={(e) => {\r\n if (e.key === \"Enter\" || e.key === \" \") {\r\n e.preventDefault();\r\n handleClick(e as any);\r\n }\r\n }}\r\n role=\"button\"\r\n tabIndex={0}\r\n data-testid=\"hero-section\"\r\n className=\"sg:relative sg:overflow-hidden sg:bg-background sg:cursor-crosshair sg:focus-visible:outline-none sg:focus-visible:ring-2 sg:focus-visible:ring-primary sg:focus-visible:ring-offset-2\"\r\n >\r\n {/* Colorful gradient blobs — follow mouse */}\r\n <div\r\n className=\"sg:absolute sg:inset-0 sg:overflow-hidden sg:pointer-events-none\"\r\n aria-hidden=\"true\"\r\n >\r\n {/* Hot pink / magenta */}\r\n <div\r\n className=\"sg:absolute sg:h-175 sg:w-175 sg:rounded-full sg:opacity-35 sg:blur-[90px] sg:transition-transform sg:duration-500 sg:ease-out\"\r\n style={{\r\n background: \"hsl(330, 90%, 55%)\",\r\n transform: `translate(${mouse.x * 70 - 35}%, ${mouse.y * 60 - 50}%)`,\r\n top: \"-10%\",\r\n right: \"-5%\",\r\n }}\r\n />\r\n {/* Electric blue */}\r\n <div\r\n className=\"sg:absolute sg:h-150 sg:w-150 sg:rounded-full sg:opacity-30 sg:blur-[80px] sg:transition-transform sg:duration-700 sg:ease-out\"\r\n style={{\r\n background: \"hsl(220, 95%, 55%)\",\r\n transform: `translate(${mouse.x * -60 + 30}%, ${mouse.y * 50 - 25}%)`,\r\n top: \"20%\",\r\n left: \"-8%\",\r\n }}\r\n />\r\n {/* Vivid orange */}\r\n <div\r\n className=\"sg:absolute sg:h-137.5 sg:w-137.5 sg:rounded-full sg:opacity-30 sg:blur-[70px] sg:transition-transform sg:duration-900 sg:ease-out\"\r\n style={{\r\n background: \"hsl(25, 95%, 55%)\",\r\n transform: `translate(${mouse.x * 55 - 28}%, ${mouse.y * -55 + 28}%)`,\r\n bottom: \"-5%\",\r\n right: \"15%\",\r\n }}\r\n />\r\n {/* Lime / green */}\r\n <div\r\n className=\"sg:absolute sg:h-100 sg:w-100 sg:rounded-full sg:opacity-25 sg:blur-[60px] sg:transition-transform sg:duration-400 sg:ease-out\"\r\n style={{\r\n background: \"hsl(145, 80%, 45%)\",\r\n transform: `translate(${mouse.x * 80 - 40}%, ${mouse.y * 80 - 40}%)`,\r\n top: \"5%\",\r\n left: \"20%\",\r\n }}\r\n />\r\n {/* Purple / violet */}\r\n <div\r\n className=\"sg:absolute sg:h-125 sg:w-125 sg:rounded-full sg:opacity-25 sg:blur-[75px] sg:transition-transform sg:duration-600 sg:ease-out\"\r\n style={{\r\n background: \"hsl(270, 85%, 55%)\",\r\n transform: `translate(${mouse.x * -45 + 22}%, ${mouse.y * 65 - 32}%)`,\r\n bottom: \"10%\",\r\n left: \"30%\",\r\n }}\r\n />\r\n {/* Yellow / gold accent */}\r\n <div\r\n className=\"sg:absolute sg:h-87.5 sg:w-87.5 sg:rounded-full sg:opacity-20 sg:blur-[50px] sg:transition-transform sg:duration-350 sg:ease-out\"\r\n style={{\r\n background: \"hsl(50, 95%, 55%)\",\r\n transform: `translate(${mouse.x * 90 - 45}%, ${mouse.y * -70 + 35}%)`,\r\n top: \"40%\",\r\n right: \"5%\",\r\n }}\r\n />\r\n </div>\r\n\r\n {/* Sparkle / glitter particles */}\r\n <div\r\n className=\"sg:absolute sg:inset-0 sg:overflow-hidden sg:pointer-events-none\"\r\n aria-hidden=\"true\"\r\n >\r\n {sparkles.map((s) => (\r\n <div\r\n key={s.id}\r\n className=\"sg:absolute sg:rounded-full\"\r\n style={{\r\n left: `${s.left}%`,\r\n top: `${s.top}%`,\r\n width: s.size,\r\n height: s.size,\r\n background: `hsl(${(s.id * 47) % 360}, 90%, 70%)`,\r\n boxShadow: `0 0 ${s.size * 2}px hsl(${(s.id * 47) % 360}, 90%, 70%)`,\r\n animation: `sparkle ${s.duration}s ${s.delay}s ease-in-out infinite`,\r\n transform: `translate(${(mouse.x - 0.5) * s.size * 8}px, ${(mouse.y - 0.5) * s.size * 8}px)`,\r\n transition: \"transform 0.3s ease-out\",\r\n }}\r\n />\r\n ))}\r\n </div>\r\n\r\n {/* Cursor spotlight */}\r\n <div\r\n className=\"sg:absolute sg:pointer-events-none\"\r\n style={{\r\n left: mousePixel.x - 150,\r\n top: mousePixel.y - 150,\r\n width: 300,\r\n height: 300,\r\n background:\r\n \"radial-gradient(circle, hsla(0, 0%, 100%, 0.15) 0%, transparent 60%)\",\r\n transition: \"left 0.1s ease-out, top 0.1s ease-out\",\r\n }}\r\n aria-hidden=\"true\"\r\n />\r\n\r\n {/* Click burst particles */}\r\n <div\r\n className=\"sg:absolute sg:inset-0 sg:pointer-events-none sg:overflow-hidden\"\r\n aria-hidden=\"true\"\r\n >\r\n {bursts.map((b) => (\r\n <div\r\n key={b.id}\r\n className=\"sg:absolute sg:rounded-full\"\r\n style={\r\n {\r\n left: b.x,\r\n top: b.y,\r\n width: b.size,\r\n height: b.size,\r\n background: `hsl(${b.hue}, 90%, 65%)`,\r\n boxShadow: `0 0 ${b.size * 3}px hsl(${b.hue}, 90%, 65%)`,\r\n animation: `burst 0.7s ease-out forwards`,\r\n \"--burst-x\": `${Math.cos((b.angle * Math.PI) / 180) * b.speed}px`,\r\n \"--burst-y\": `${Math.sin((b.angle * Math.PI) / 180) * b.speed}px`,\r\n } as React.CSSProperties\r\n }\r\n />\r\n ))}\r\n </div>\r\n\r\n {/* Subtle grain texture overlay */}\r\n <div\r\n className=\"sg:absolute sg:inset-0 sg:opacity-[0.02] sg:dark:opacity-[0.04] sg:pointer-events-none\"\r\n style={{\r\n backgroundImage:\r\n \"url(\\\"data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noise'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noise)'/%3E%3C/svg%3E\\\")\",\r\n }}\r\n aria-hidden=\"true\"\r\n />\r\n\r\n <Layout type=\"col\" className=\"sg:py-20 sg:md:py-32\">\r\n <Layout.Col1 hideDiv>\r\n {(title || titleAccent) && (\r\n <Heading variant=\"h1\">\r\n {title}{\" \"}\r\n {titleAccent && (\r\n <TextSpan size=\"4xl\" foreground=\"primary\">\r\n {titleAccent}\r\n </TextSpan>\r\n )}\r\n </Heading>\r\n )}\r\n\r\n {description && (\r\n <Text\r\n size=\"lg\"\r\n foreground=\"muted-foreground\"\r\n className=\"sg:mt-6 sg:max-w-xl\"\r\n >\r\n {description}\r\n </Text>\r\n )}\r\n\r\n {(primaryCTA || secondaryCTA) && (\r\n <Stack gap={3} direction=\"row\" wrap=\"wrap\" className=\"sg:mt-8\">\r\n {primaryCTA && (\r\n <LinkButton\r\n size=\"lg\"\r\n to={primaryCTA.href}\r\n className=\"sg:z-1\"\r\n >\r\n {primaryCTA.label}\r\n </LinkButton>\r\n )}\r\n {secondaryCTA && (\r\n <LinkButton\r\n variant=\"secondary\"\r\n size=\"lg\"\r\n to={secondaryCTA.href}\r\n className=\"sg:z-1\"\r\n >\r\n {secondaryCTA.label}\r\n </LinkButton>\r\n )}\r\n </Stack>\r\n )}\r\n </Layout.Col1>\r\n </Layout>\r\n\r\n {/* Bottom fade to background */}\r\n <div\r\n className=\"sg:absolute sg:bottom-0 sg:left-0 sg:right-0 sg:h-32 sg:bg-linear-to-t sg:from-background sg:to-transparent sg:pointer-events-none\"\r\n aria-hidden=\"true\"\r\n />\r\n </section>\r\n </Layout.Col1>\r\n </Layout>\r\n );\r\n}\r\n"],"mappings":"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","names":[]}
@@ -1,5 +1,4 @@
1
1
  export { Container } from './container/container.js';
2
2
  export { Footer } from './footer/footer.js';
3
3
  export { Header, HeaderProps, NavLink } from './navigation/header.js';
4
- import 'react/jsx-runtime';
5
4
  import 'react';
@@ -1,4 +1,3 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
2
1
  import * as React from 'react';
3
2
 
4
3
  interface NavLink {
@@ -14,6 +13,6 @@ interface HeaderProps {
14
13
  loginLabel?: string;
15
14
  extrasLabel?: string;
16
15
  }
17
- declare function Header({ navLinks, extrasLinks, logo, currentPath, loginPath, loginLabel, extrasLabel, }: HeaderProps): react_jsx_runtime.JSX.Element;
16
+ declare function Header({ navLinks, extrasLinks, logo, currentPath, loginPath, loginLabel, extrasLabel, }: HeaderProps): React.JSX.Element;
18
17
 
19
18
  export { Header, type HeaderProps, type NavLink };
@@ -1,3 +1,2 @@
1
1
  export { Header, HeaderProps, NavLink } from './header.js';
2
- import 'react/jsx-runtime';
3
2
  import 'react';
package/dist/index.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  export { Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from './components/blocks/cards/card.js';
2
+ export { Login, LoginCredentials, LoginProps } from './components/blocks/login/login.js';
2
3
  export { PostListWithFilters } from './components/blocks/post-list/post-list-with-filters.js';
3
4
  export { AdminPage, AdminPageProps } from './components/pages/admin/admin-page.js';
4
5
  export { BlogPost } from './components/pages/blogpost/blogpost.js';
@@ -32,7 +33,7 @@ export { Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHe
32
33
  export { Skeleton } from './components/primitives/skeleton/skeleton.js';
33
34
  export { Toaster } from './components/primitives/sonner/sonner.js';
34
35
  export { Spinner } from './components/primitives/spinner/spinner.js';
35
- export { Stack, StackProps, stackVariants } from './components/primitives/stack/stack.js';
36
+ export { Stack, StackProps, stackVariantOptions, stackVariants } from './components/primitives/stack/stack.js';
36
37
  export { Heading, HeadingProps, headingVariants, headingVariantsProps } from './components/primitives/text/heading.js';
37
38
  export { TextCode, TextCodeProps, textCodeVariants, textCodeVariantsProps } from './components/primitives/text/text-code.js';
38
39
  export { TextDiv } from './components/primitives/text/text-div.js';
@@ -50,7 +51,6 @@ export { Container } from './components/templates/container/container.js';
50
51
  export { Footer } from './components/templates/footer/footer.js';
51
52
  export { Header, HeaderProps, NavLink } from './components/templates/navigation/header.js';
52
53
  export { toast } from 'sonner';
53
- import 'react/jsx-runtime';
54
54
  import 'react';
55
55
  import './data/posts.js';
56
56
  import '@base-ui/react/accordion';
package/dist/main.css CHANGED
@@ -1,4 +1,4 @@
1
- /*! tailwindcss v4.2.4 | MIT License | https://tailwindcss.com */
1
+ /*! tailwindcss v4.3.1 | MIT License | https://tailwindcss.com */
2
2
  @layer properties;
3
3
  :root {
4
4
  --sg-black: oklch(0.25 0 0);
@@ -84,6 +84,7 @@
84
84
  :root,
85
85
  :host {
86
86
  --sg-spacing: 0.25rem;
87
+ --sg-container-xs: 20rem;
87
88
  --sg-container-sm: 24rem;
88
89
  --sg-container-md: 28rem;
89
90
  --sg-container-lg: 32rem;
@@ -354,13 +355,13 @@
354
355
  position: sticky;
355
356
  }
356
357
  .sg\:inset-0 {
357
- inset: calc(var(--sg-spacing) * 0);
358
+ inset: 0;
358
359
  }
359
360
  .sg\:inset-x-0 {
360
- inset-inline: calc(var(--sg-spacing) * 0);
361
+ inset-inline: 0;
361
362
  }
362
363
  .sg\:inset-y-0 {
363
- inset-block: calc(var(--sg-spacing) * 0);
364
+ inset-block: 0;
364
365
  }
365
366
  .sg\:end-3 {
366
367
  inset-inline-end: calc(var(--sg-spacing) * 3);
@@ -369,7 +370,7 @@
369
370
  top: calc(var(--sg-spacing) * -1.5);
370
371
  }
371
372
  .sg\:top-0 {
372
- top: calc(var(--sg-spacing) * 0);
373
+ top: 0;
373
374
  }
374
375
  .sg\:top-1\/2 {
375
376
  top: calc(1 / 2 * 100%);
@@ -387,16 +388,16 @@
387
388
  right: calc(var(--sg-spacing) * -1.5);
388
389
  }
389
390
  .sg\:right-0 {
390
- right: calc(var(--sg-spacing) * 0);
391
+ right: 0;
391
392
  }
392
393
  .sg\:right-4 {
393
394
  right: calc(var(--sg-spacing) * 4);
394
395
  }
395
396
  .sg\:bottom-0 {
396
- bottom: calc(var(--sg-spacing) * 0);
397
+ bottom: 0;
397
398
  }
398
399
  .sg\:left-0 {
399
- left: calc(var(--sg-spacing) * 0);
400
+ left: 0;
400
401
  }
401
402
  .sg\:left-2 {
402
403
  left: calc(var(--sg-spacing) * 2);
@@ -456,7 +457,7 @@
456
457
  margin-block: calc(var(--sg-spacing) * -2);
457
458
  }
458
459
  .sg\:my-1 {
459
- margin-block: calc(var(--sg-spacing) * 1);
460
+ margin-block: var(--sg-spacing);
460
461
  }
461
462
  .sg\:my-4 {
462
463
  margin-block: calc(var(--sg-spacing) * 4);
@@ -465,7 +466,7 @@
465
466
  margin-top: calc(var(--sg-spacing) * 0.5);
466
467
  }
467
468
  .sg\:mt-1 {
468
- margin-top: calc(var(--sg-spacing) * 1);
469
+ margin-top: var(--sg-spacing);
469
470
  }
470
471
  .sg\:mt-1\.5 {
471
472
  margin-top: calc(var(--sg-spacing) * 1.5);
@@ -501,13 +502,13 @@
501
502
  margin-top: auto;
502
503
  }
503
504
  .sg\:mr-1 {
504
- margin-right: calc(var(--sg-spacing) * 1);
505
+ margin-right: var(--sg-spacing);
505
506
  }
506
507
  .sg\:mr-2 {
507
508
  margin-right: calc(var(--sg-spacing) * 2);
508
509
  }
509
510
  .sg\:mb-1 {
510
- margin-bottom: calc(var(--sg-spacing) * 1);
511
+ margin-bottom: var(--sg-spacing);
511
512
  }
512
513
  .sg\:mb-2 {
513
514
  margin-bottom: calc(var(--sg-spacing) * 2);
@@ -531,7 +532,7 @@
531
532
  margin-bottom: calc(var(--sg-spacing) * 12);
532
533
  }
533
534
  .sg\:ml-1 {
534
- margin-left: calc(var(--sg-spacing) * 1);
535
+ margin-left: var(--sg-spacing);
535
536
  }
536
537
  .sg\:ml-4 {
537
538
  margin-left: calc(var(--sg-spacing) * 4);
@@ -623,7 +624,7 @@
623
624
  height: var(--accordion-panel-height);
624
625
  }
625
626
  .sg\:h-1 {
626
- height: calc(var(--sg-spacing) * 1);
627
+ height: var(--sg-spacing);
627
628
  }
628
629
  .sg\:h-2 {
629
630
  height: calc(var(--sg-spacing) * 2);
@@ -658,6 +659,9 @@
658
659
  .sg\:h-32 {
659
660
  height: calc(var(--sg-spacing) * 32);
660
661
  }
662
+ .sg\:h-48 {
663
+ height: calc(var(--sg-spacing) * 48);
664
+ }
661
665
  .sg\:h-56 {
662
666
  height: calc(var(--sg-spacing) * 56);
663
667
  }
@@ -695,7 +699,10 @@
695
699
  max-height: var(--available-height);
696
700
  }
697
701
  .sg\:min-h-0 {
698
- min-height: calc(var(--sg-spacing) * 0);
702
+ min-height: 0;
703
+ }
704
+ .sg\:min-h-\[24rem\] {
705
+ min-height: 24rem;
699
706
  }
700
707
  .sg\:min-h-\[60vh\] {
701
708
  min-height: 60vh;
@@ -713,7 +720,7 @@
713
720
  width: var(--anchor-width);
714
721
  }
715
722
  .sg\:w-1 {
716
- width: calc(var(--sg-spacing) * 1);
723
+ width: var(--sg-spacing);
717
724
  }
718
725
  .sg\:w-1\/2 {
719
726
  width: calc(1 / 2 * 100%);
@@ -820,8 +827,11 @@
820
827
  .sg\:max-w-xl {
821
828
  max-width: var(--sg-container-xl);
822
829
  }
830
+ .sg\:max-w-xs {
831
+ max-width: var(--sg-container-xs);
832
+ }
823
833
  .sg\:min-w-0 {
824
- min-width: calc(var(--sg-spacing) * 0);
834
+ min-width: 0;
825
835
  }
826
836
  .sg\:min-w-6 {
827
837
  min-width: calc(var(--sg-spacing) * 6);
@@ -951,7 +961,7 @@
951
961
  gap: calc(var(--sg-spacing) * 0.5);
952
962
  }
953
963
  .sg\:gap-1 {
954
- gap: calc(var(--sg-spacing) * 1);
964
+ gap: var(--sg-spacing);
955
965
  }
956
966
  .sg\:gap-1\.5 {
957
967
  gap: calc(var(--sg-spacing) * 1.5);
@@ -1004,8 +1014,8 @@
1004
1014
  .sg\:space-y-1 {
1005
1015
  :where(& > :not(:last-child)) {
1006
1016
  --tw-space-y-reverse: 0;
1007
- margin-block-start: calc(calc(var(--sg-spacing) * 1) * var(--tw-space-y-reverse));
1008
- margin-block-end: calc(calc(var(--sg-spacing) * 1) * calc(1 - var(--tw-space-y-reverse)));
1017
+ margin-block-start: calc(var(--sg-spacing) * var(--tw-space-y-reverse));
1018
+ margin-block-end: calc(var(--sg-spacing) * calc(1 - var(--tw-space-y-reverse)));
1009
1019
  }
1010
1020
  }
1011
1021
  .sg\:space-y-1\.5 {
@@ -1270,7 +1280,7 @@
1270
1280
  object-fit: cover;
1271
1281
  }
1272
1282
  .sg\:p-1 {
1273
- padding: calc(var(--sg-spacing) * 1);
1283
+ padding: var(--sg-spacing);
1274
1284
  }
1275
1285
  .sg\:p-2 {
1276
1286
  padding: calc(var(--sg-spacing) * 2);
@@ -1306,7 +1316,7 @@
1306
1316
  padding-block: calc(var(--sg-spacing) * 0.5);
1307
1317
  }
1308
1318
  .sg\:py-1 {
1309
- padding-block: calc(var(--sg-spacing) * 1);
1319
+ padding-block: var(--sg-spacing);
1310
1320
  }
1311
1321
  .sg\:py-1\.5 {
1312
1322
  padding-block: calc(var(--sg-spacing) * 1.5);
@@ -1339,7 +1349,7 @@
1339
1349
  padding-block: calc(var(--sg-spacing) * 32);
1340
1350
  }
1341
1351
  .sg\:pt-0 {
1342
- padding-top: calc(var(--sg-spacing) * 0);
1352
+ padding-top: 0;
1343
1353
  }
1344
1354
  .sg\:pt-2 {
1345
1355
  padding-top: calc(var(--sg-spacing) * 2);
@@ -1350,11 +1360,14 @@
1350
1360
  .sg\:pt-4 {
1351
1361
  padding-top: calc(var(--sg-spacing) * 4);
1352
1362
  }
1363
+ .sg\:pt-6 {
1364
+ padding-top: calc(var(--sg-spacing) * 6);
1365
+ }
1353
1366
  .sg\:pt-8 {
1354
1367
  padding-top: calc(var(--sg-spacing) * 8);
1355
1368
  }
1356
1369
  .sg\:pr-1 {
1357
- padding-right: calc(var(--sg-spacing) * 1);
1370
+ padding-right: var(--sg-spacing);
1358
1371
  }
1359
1372
  .sg\:pr-2 {
1360
1373
  padding-right: calc(var(--sg-spacing) * 2);
@@ -1561,6 +1574,9 @@
1561
1574
  .sg\:italic {
1562
1575
  font-style: italic;
1563
1576
  }
1577
+ .sg\:underline {
1578
+ text-decoration-line: underline;
1579
+ }
1564
1580
  .sg\:decoration-primary\/40 {
1565
1581
  text-decoration-color: var(--sg-primary);
1566
1582
  @supports (color: color-mix(in lab, red, red)) {
@@ -2050,7 +2066,7 @@
2050
2066
  }
2051
2067
  .sg\:last\:mt-0 {
2052
2068
  &:last-child {
2053
- margin-top: calc(var(--sg-spacing) * 0);
2069
+ margin-top: 0;
2054
2070
  }
2055
2071
  }
2056
2072
  .sg\:hover\:border-primary {
@@ -2368,7 +2384,7 @@
2368
2384
  }
2369
2385
  .sg\:has-\[\>img\:first-child\]\:pt-0 {
2370
2386
  &:has(> img:first-child) {
2371
- padding-top: calc(var(--sg-spacing) * 0);
2387
+ padding-top: 0;
2372
2388
  }
2373
2389
  }
2374
2390
  .sg\:has-\[\>svg\]\:grid-cols-\[auto_1fr\] {
@@ -2414,7 +2430,7 @@
2414
2430
  }
2415
2431
  .sg\:data-ending-style\:h-0 {
2416
2432
  &[data-ending-style] {
2417
- height: calc(var(--sg-spacing) * 0);
2433
+ height: 0;
2418
2434
  }
2419
2435
  }
2420
2436
  .sg\:data-open\:bg-muted\/50 {
@@ -2448,7 +2464,7 @@
2448
2464
  }
2449
2465
  .sg\:data-starting-style\:h-0 {
2450
2466
  &[data-starting-style] {
2451
- height: calc(var(--sg-spacing) * 0);
2467
+ height: 0;
2452
2468
  }
2453
2469
  }
2454
2470
  .sg\:data-\[align-trigger\=true\]\:animate-none {
@@ -2742,17 +2758,17 @@
2742
2758
  }
2743
2759
  .sg\:min-\[442px\]\:px-0 {
2744
2760
  @media (width >= 442px) {
2745
- padding-inline: calc(var(--sg-spacing) * 0);
2761
+ padding-inline: 0;
2746
2762
  }
2747
2763
  }
2748
2764
  .sg\:min-\[800px\]\:px-0 {
2749
2765
  @media (width >= 800px) {
2750
- padding-inline: calc(var(--sg-spacing) * 0);
2766
+ padding-inline: 0;
2751
2767
  }
2752
2768
  }
2753
2769
  .sg\:min-\[1056px\]\:px-0 {
2754
2770
  @media (width >= 1056px) {
2755
- padding-inline: calc(var(--sg-spacing) * 0);
2771
+ padding-inline: 0;
2756
2772
  }
2757
2773
  }
2758
2774
  .sg\:sm\:max-w-sm {
@@ -3170,9 +3186,11 @@
3170
3186
  }
3171
3187
  html {
3172
3188
  color-scheme: dark light;
3189
+ scrollbar-gutter: stable;
3190
+ interpolate-size: allow-keywords;
3173
3191
  }
3174
3192
  body {
3175
- min-height: 100vh;
3193
+ min-block-size: 100svh;
3176
3194
  }
3177
3195
  picture,
3178
3196
  svg,