@astralui/core 0.1.1 → 0.1.2

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/README.md CHANGED
@@ -13,6 +13,7 @@ dependency-free UI components. No CSS-in-JS runtime: just CSS variables +
13
13
  - 🌗 **Color scheme** - `ColorSchemeProvider` / `useColorScheme` (persisted, `data-astral-scheme` on `<html>`).
14
14
  - 🖌️ **Per-brand theming** - `AstralThemeProvider` generates a brand palette from a single hex and injects per-scheme overrides at runtime (with live preview).
15
15
  - 🧩 **Components** - `AstralModal`, `AstralDrawer`, `AstralSelect`, `AstralMenu`, `AstralPinInput`, `AstralToaster` + `notifications`, `DateInput`, `Spinner`.
16
+ - 🌌 **Backgrounds** - `SpaceBackground` (animated starfield) and `GridBackground` (masked technical grid) for auth screens, heroes, and splash pages.
16
17
 
17
18
  ## Install
18
19
 
@@ -89,6 +90,8 @@ notifications.update({ id: 'x', message: 'Done', color: 'green', loading: false,
89
90
  | `DateInput` | Freeze-proof native date / datetime-local input. |
90
91
  | `Spinner` | Theme-aware loading spinner. |
91
92
  | `notifications` + `AstralToaster` | Toast system. |
93
+ | `SpaceBackground` | Animated cosmic backdrop with a twinkling starfield (wrap your content as children). |
94
+ | `GridBackground` | Subtle technical grid with a brand-tinted glow, edge-masked. |
92
95
  | `generateColors(hex)` | 10-shade palette from one color. |
93
96
 
94
97
  ## Token reference
package/dist/index.cjs CHANGED
@@ -599,6 +599,20 @@ function Spinner2({ size = 24, className, style }) {
599
599
  }
600
600
  );
601
601
  }
602
+ function cls(base, extra) {
603
+ return extra ? `${base} ${extra}` : base;
604
+ }
605
+ function SpaceBackground({ children, className, style, fixed }) {
606
+ const s = fixed ? { position: "fixed", inset: 0, ...style } : style ?? {};
607
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cls("astral-space-bg", className), style: s, children: [
608
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "astral-stars", "aria-hidden": "true" }),
609
+ children
610
+ ] });
611
+ }
612
+ function GridBackground({ children, className, style, fixed }) {
613
+ const s = fixed ? { position: "fixed", inset: 0, ...style } : style ?? {};
614
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cls("astral-grid-bg", className), style: s, children });
615
+ }
602
616
 
603
617
  exports.AstralDrawer = AstralDrawer;
604
618
  exports.AstralMenu = AstralMenu;
@@ -609,6 +623,8 @@ exports.AstralThemeProvider = AstralThemeProvider;
609
623
  exports.AstralToaster = AstralToaster;
610
624
  exports.ColorSchemeProvider = ColorSchemeProvider;
611
625
  exports.DateInput = DateInput;
626
+ exports.GridBackground = GridBackground;
627
+ exports.SpaceBackground = SpaceBackground;
612
628
  exports.Spinner = Spinner2;
613
629
  exports.buildOrgCss = buildOrgCss;
614
630
  exports.dateTimeToInputStr = dateTimeToInputStr;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/theme/ColorSchemeProvider.tsx","../src/theme/generateColors.ts","../src/theme/AstralProvider.tsx","../src/components/overlay.tsx","../src/components/Toast.tsx","../src/components/DateInput.tsx","../src/components/Spinner.tsx"],"names":["createContext","useState","useEffect","useCallback","jsx","useContext","chroma","useMemo","jsxs","createPortal","IconX","useRef","clean","IconChevronDown","Fragment","IconCheck","IconExclamationCircle","IconAlertTriangle","IconInfoCircle","useSyncExternalStore","Spinner"],"mappings":"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","file":"index.cjs","sourcesContent":["import { createContext, useContext, useState, useEffect, useCallback } from 'react';\nimport type { ReactNode } from 'react';\n\n/* Light/dark control. Owns the color scheme, persists it to localStorage, and sets\n `data-astral-scheme` + `color-scheme` on <html> - which the AstralUI tokens (and\n every `light-dark()`) key off. The sole source of truth for the active scheme. */\n\nexport type ColorScheme = 'light' | 'dark';\n\ninterface ColorSchemeContextType {\n colorScheme: ColorScheme;\n setColorScheme: (scheme: ColorScheme) => void;\n toggle: () => void;\n}\n\nconst ColorSchemeContext = createContext<ColorSchemeContextType>({\n colorScheme: 'dark',\n setColorScheme: () => {},\n toggle: () => {},\n});\n\ninterface ColorSchemeProviderProps {\n children: ReactNode;\n /** Initial scheme when nothing is persisted yet. Default 'dark'. */\n defaultScheme?: ColorScheme;\n /** localStorage key for persistence. Default 'astral-color-scheme'. */\n storageKey?: string;\n}\n\nexport function ColorSchemeProvider({ children, defaultScheme = 'dark', storageKey = 'astral-color-scheme' }: ColorSchemeProviderProps) {\n const [colorScheme, setScheme] = useState<ColorScheme>(() => {\n try {\n const v = localStorage.getItem(storageKey);\n if (v === 'light' || v === 'dark') return v;\n } catch { /* ignore */ }\n return defaultScheme;\n });\n\n useEffect(() => {\n const root = document.documentElement;\n root.setAttribute('data-astral-scheme', colorScheme);\n root.style.colorScheme = colorScheme;\n }, [colorScheme]);\n\n const setColorScheme = useCallback((scheme: ColorScheme) => {\n try { localStorage.setItem(storageKey, scheme); } catch { /* ignore */ }\n setScheme(scheme);\n }, [storageKey]);\n\n const toggle = useCallback(() => {\n setScheme(prev => {\n const next = prev === 'dark' ? 'light' : 'dark';\n try { localStorage.setItem(storageKey, next); } catch { /* ignore */ }\n return next;\n });\n }, [storageKey]);\n\n return (\n <ColorSchemeContext.Provider value={{ colorScheme, setColorScheme, toggle }}>\n {children}\n </ColorSchemeContext.Provider>\n );\n}\n\nexport function useColorScheme() {\n return useContext(ColorSchemeContext);\n}\n","import chroma from 'chroma-js';\n\n/* Produces a 10-shade palette from a single hex, using fixed lightness/saturation\n maps and chroma-js LCH math. Used by AstralThemeProvider to turn an org's chosen\n brand color into a full palette. */\n\nconst LIGHTNESS_MAP = [0.96, 0.907, 0.805, 0.697, 0.605, 0.547, 0.518, 0.445, 0.395, 0.34];\nconst SATURATION_MAP = [0.32, 0.16, 0.08, 0.04, 0, 0, 0.04, 0.08, 0.16, 0.32];\n\nfunction getClosestLightness(colorObject: chroma.Color): number {\n const lightnessGoal = colorObject.get('hsl.l');\n return LIGHTNESS_MAP.reduce((prev, curr) =>\n Math.abs(curr - lightnessGoal) < Math.abs(prev - lightnessGoal) ? curr : prev,\n );\n}\n\nexport function generateColors(color: string): string[] {\n const colorObject = chroma(color);\n const closestLightness = getClosestLightness(colorObject);\n const baseColorIndex = LIGHTNESS_MAP.findIndex((l) => l === closestLightness);\n\n const colors = LIGHTNESS_MAP\n .map((l) => colorObject.set('hsl.l', l))\n .map((c) => chroma(c))\n .map((c, i) => {\n const saturationDelta = SATURATION_MAP[i] - SATURATION_MAP[baseColorIndex];\n return saturationDelta >= 0 ? c.saturate(saturationDelta) : c.desaturate(saturationDelta * -1);\n });\n\n colors[baseColorIndex] = chroma(color);\n return colors.map((c) => c.hex());\n}\n","import { useMemo, useState, useCallback, createContext, useContext } from 'react';\nimport type { ReactNode } from 'react';\nimport { generateColors } from './generateColors';\n\n/* Per-org / per-brand theming. Computes the brand palette + surface overrides and\n injects them as a runtime <style> that overrides the base --astral-* tokens\n (from tokens.css) per scheme. Selectors use html:root[data-astral-scheme=\"...\"]\n (specificity 0,2,1, so they win over the :root base tokens). No colors -> empty\n style -> base tokens. Prop-driven (no app coupling): pass the brand colors in. */\n\n/* ── Color preview context (live editing) ── */\n\nexport interface AstralThemeColors {\n primary_color?: string | null;\n background_color?: string | null;\n card_color?: string | null;\n navbar_color?: string | null;\n font_color?: string | null;\n light_primary_color?: string | null;\n light_background_color?: string | null;\n light_card_color?: string | null;\n light_navbar_color?: string | null;\n light_font_color?: string | null;\n}\n\ninterface ThemePreviewContextType {\n preview: AstralThemeColors | null;\n setPreview: (colors: AstralThemeColors | null) => void;\n}\n\nconst ThemePreviewContext = createContext<ThemePreviewContextType>({\n preview: null,\n setPreview: () => {},\n});\n\nexport function useThemePreview() {\n return useContext(ThemePreviewContext);\n}\n\n/* ── Helpers ── */\n\nconst HEX_RE = /^#[0-9a-f]{6}$/i;\nconst isValidHex = (v: string | null | undefined): v is string => !!v && HEX_RE.test(v);\n\nfunction adjustHex(hex: string, amount: number): string {\n const c = hex.replace('#', '');\n const r = Math.max(0, Math.min(255, parseInt(c.substring(0, 2), 16) + amount));\n const g = Math.max(0, Math.min(255, parseInt(c.substring(2, 4), 16) + amount));\n const b = Math.max(0, Math.min(255, parseInt(c.substring(4, 6), 16) + amount));\n return `#${r.toString(16).padStart(2, '0')}${g.toString(16).padStart(2, '0')}${b.toString(16).padStart(2, '0')}`;\n}\n\nfunction hexToRgba(hex: string, alpha: number): string {\n const c = hex.replace('#', '');\n const r = parseInt(c.substring(0, 2), 16);\n const g = parseInt(c.substring(2, 4), 16);\n const b = parseInt(c.substring(4, 6), 16);\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n}\n\n/* primaryShade is { light: 6, dark: 8 }; -light is the shade-6 color at .1/.15 alpha\n (.12/.2 hovered); -light-color is shade 6 (light) / 3 (dark). Theme-level constants,\n identical for any palette. */\nfunction primaryVars(palette: string[], scheme: 'light' | 'dark'): string[] {\n if (scheme === 'light') {\n return [\n `--astral-primary-color-filled:${palette[6]}`,\n `--astral-primary-color-filled-hover:${palette[7]}`,\n `--astral-primary-color-light:${hexToRgba(palette[6], 0.1)}`,\n `--astral-primary-color-light-hover:${hexToRgba(palette[6], 0.12)}`,\n `--astral-primary-color-light-color:${palette[6]}`,\n ];\n }\n return [\n `--astral-primary-color-filled:${palette[8]}`,\n `--astral-primary-color-filled-hover:${palette[9]}`,\n `--astral-primary-color-light:${hexToRgba(palette[6], 0.15)}`,\n `--astral-primary-color-light-hover:${hexToRgba(palette[6], 0.2)}`,\n `--astral-primary-color-light-color:${palette[3]}`,\n ];\n}\n\nfunction safeGenerate(hex: string): string[] | null {\n try { return generateColors(hex) as unknown as string[]; } catch { return null; }\n}\n\nexport function buildOrgCss(src: AstralThemeColors): string {\n const brand = isValidHex(src.primary_color) ? safeGenerate(src.primary_color!) : null;\n const lightBrand = isValidHex(src.light_primary_color) ? safeGenerate(src.light_primary_color!) : null;\n const lightPalette = lightBrand ?? brand; // light mode uses lightBrand, else falls back to brand\n const noDarkBrand = !brand; // the base accent palette is only overridden in light when no dark brand\n\n const vBg = isValidHex(src.background_color) ? src.background_color! : '';\n const vCard = isValidHex(src.card_color) ? src.card_color! : '';\n const vNav = isValidHex(src.navbar_color) ? src.navbar_color! : '';\n const vFont = isValidHex(src.font_color) ? src.font_color! : '';\n const vLBg = isValidHex(src.light_background_color) ? src.light_background_color! : '';\n const vLCard = isValidHex(src.light_card_color) ? src.light_card_color! : '';\n const vLNav = isValidHex(src.light_navbar_color) ? src.light_navbar_color! : '';\n const vLFont = isValidHex(src.light_font_color) ? src.light_font_color! : '';\n\n const dark: string[] = [];\n const light: string[] = [];\n\n /* ── dark scheme ── */\n if (brand) dark.push(...primaryVars(brand, 'dark'));\n if (vFont) {\n // dark palette: dark-0 = primary text; the dark text token mirrors dark-0.\n dark.push(`--astral-color-dark-0:${vFont}`, `--astral-color-dark-1:${adjustHex(vFont, -30)}`, `--astral-color-dark-2:${adjustHex(vFont, -60)}`, `--astral-color-text:${vFont}`);\n }\n if (vCard) dark.push(`--astral-color-dark-6:${vCard}`);\n if (vBg) dark.push(`--astral-color-dark-7:${vBg}`, `--astral-color-dark-9:${adjustHex(vBg, -10)}`, `--astral-color-body:${vBg}`, `--astral-app-bg:${vBg}`);\n if (vNav) dark.push(`--astral-color-dark-8:${vNav}`, `--astral-app-nav:${vNav}`);\n if (vCard) dark.push(`--astral-app-card:${vCard}`);\n\n /* ── light scheme ── */\n if (lightBrand && noDarkBrand) {\n // only-light-primary: override the base accent (violet) palette so accent-derived\n // tokens (e.g. brand-text) follow the light primary in light mode.\n for (let i = 0; i < 10; i++) light.push(`--astral-color-violet-${i}:${lightBrand[i]}`);\n }\n if (lightPalette) light.push(...primaryVars(lightPalette, 'light'));\n if (vLFont) light.push(`--astral-color-text:${vLFont}`);\n if (vLBg) light.push(`--astral-app-bg:${vLBg}`);\n if (vLNav) light.push(`--astral-app-nav:${vLNav}`);\n if (vLCard) light.push(`--astral-app-card:${vLCard}`);\n\n let css = '';\n if (dark.length) css += `html:root[data-astral-scheme=\"dark\"]{${dark.join(';')}}`;\n if (light.length) css += `html:root[data-astral-scheme=\"light\"]{${light.join(';')}}`;\n return css;\n}\n\n/* ── Provider ──\n Pass the brand colors via `colors`. While editing, call setPreview() (from\n useThemePreview) with partial colors for an instant live preview. */\n\nexport function AstralThemeProvider({ colors, children }: { colors?: AstralThemeColors | null; children: ReactNode }) {\n const [preview, setPreview] = useState<AstralThemeColors | null>(null);\n\n const stableSetPreview = useCallback((c: AstralThemeColors | null) => {\n setPreview(c);\n }, []);\n\n const effective: AstralThemeColors | null = preview\n ? { ...(colors ?? {}), ...preview }\n : (colors ?? null);\n\n const orgCss = useMemo(\n () => (effective ? buildOrgCss(effective) : ''),\n [effective ? JSON.stringify(effective) : ''],\n );\n\n return (\n <ThemePreviewContext.Provider value={{ preview, setPreview: stableSetPreview }}>\n <style data-astral-theme>{orgCss}</style>\n {children}\n </ThemePreviewContext.Provider>\n );\n}\n","import { useCallback, useEffect, useRef, useState, type ReactNode, type CSSProperties, type KeyboardEvent as ReactKeyboardEvent } from 'react';\nimport { createPortal } from 'react-dom';\nimport { IconX, IconChevronDown } from '@tabler/icons-react';\n\nfunction useDismiss(opened: boolean, onClose: () => void) {\n useEffect(() => {\n if (!opened) return;\n const onKey = (e: KeyboardEvent) => { if (e.key === 'Escape') onClose(); };\n document.addEventListener('keydown', onKey);\n const prev = document.body.style.overflow;\n document.body.style.overflow = 'hidden';\n return () => { document.removeEventListener('keydown', onKey); document.body.style.overflow = prev; };\n }, [opened, onClose]);\n}\n\ninterface ShellProps {\n opened: boolean;\n onClose: () => void;\n title: ReactNode;\n brand?: string;\n width?: number;\n /** Override the overlay z-index (default 300). Use to stack over flow-editor modals. */\n zIndex?: number;\n children: ReactNode;\n}\n\n/** Centered Astral modal (portal + overlay + escape + click-outside). */\nexport function AstralModal({ opened, onClose, title, brand, width = 460, zIndex, children }: ShellProps) {\n useDismiss(opened, onClose);\n if (!opened) return null;\n const style = { maxWidth: width, ...(brand ? { '--au-ic': brand } : {}) } as CSSProperties;\n return createPortal(\n <div className=\"au-modal-overlay\" onMouseDown={onClose} style={zIndex != null ? { zIndex } : undefined}>\n <div className=\"au-modal-panel\" style={style} onMouseDown={(e) => e.stopPropagation()}>\n <div className=\"au-modal-head\">\n <span className=\"au-modal-title\">{title}</span>\n <button type=\"button\" className=\"au-modal-x\" onClick={onClose} aria-label=\"Close\"><IconX /></button>\n </div>\n <div className=\"au-modal-body\">{children}</div>\n </div>\n </div>,\n document.body,\n );\n}\n\n/** Right-side Astral drawer. */\nexport function AstralDrawer({ opened, onClose, title, brand, width = 440, zIndex, children }: ShellProps) {\n useDismiss(opened, onClose);\n if (!opened) return null;\n const style = { width, ...(brand ? { '--au-ic': brand } : {}) } as CSSProperties;\n return createPortal(\n <div className=\"au-drawer-overlay\" onMouseDown={onClose} style={zIndex != null ? { zIndex } : undefined}>\n <div className=\"au-drawer-panel\" style={style} onMouseDown={(e) => e.stopPropagation()}>\n <div className=\"au-drawer-head\">\n <span className=\"au-drawer-title\">{title}</span>\n <button type=\"button\" className=\"au-modal-x\" onClick={onClose} aria-label=\"Close\"><IconX /></button>\n </div>\n <div className=\"au-drawer-body\">{children}</div>\n </div>\n </div>,\n document.body,\n );\n}\n\n/** Astral 6-box code input, with auto-advance, backspace, paste and arrows. */\nexport function AstralPinInput({ length = 6, value, onChange, autoFocus }: {\n length?: number;\n value: string;\n onChange: (value: string) => void;\n autoFocus?: boolean;\n}) {\n const refs = useRef<Array<HTMLInputElement | null>>([]);\n const digits = Array.from({ length }, (_, i) => value[i] ?? '');\n\n const focusBox = (i: number) => { refs.current[Math.max(0, Math.min(length - 1, i))]?.focus(); };\n\n const handleChange = (i: number, raw: string) => {\n const clean = raw.replace(/\\D/g, '');\n if (!clean) return;\n const arr = value.split('');\n let pos = i;\n for (const ch of clean) {\n if (pos >= length) break;\n arr[pos] = ch;\n pos++;\n }\n onChange(arr.join('').slice(0, length));\n focusBox(pos);\n };\n\n const handleKeyDown = (i: number, e: ReactKeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Backspace') {\n e.preventDefault();\n const arr = value.split('');\n if (arr[i]) {\n arr[i] = '';\n onChange(arr.join(''));\n } else if (i > 0) {\n arr[i - 1] = '';\n onChange(arr.join(''));\n focusBox(i - 1);\n }\n } else if (e.key === 'ArrowLeft') {\n e.preventDefault();\n focusBox(i - 1);\n } else if (e.key === 'ArrowRight') {\n e.preventDefault();\n focusBox(i + 1);\n }\n };\n\n return (\n <div className=\"au-pin\">\n {digits.map((d, i) => (\n <input\n key={i}\n ref={(el) => { refs.current[i] = el; }}\n className=\"au-pin-box\"\n inputMode=\"numeric\"\n autoComplete=\"one-time-code\"\n aria-label={`Digit ${i + 1}`}\n value={d}\n autoFocus={autoFocus && i === 0}\n onChange={(e) => handleChange(i, e.currentTarget.value)}\n onKeyDown={(e) => handleKeyDown(i, e)}\n onFocus={(e) => e.currentTarget.select()}\n />\n ))}\n </div>\n );\n}\n\nexport interface AstralSelectOption { value: string; label: string; }\n\n/** Astral select with optional search/create/clear - combobox. */\nexport function AstralSelect({ value, onChange, options, placeholder, disabled, searchable, searchPlaceholder, noResults, clearable, creatable }: {\n value: string | null;\n onChange: (value: string) => void;\n options: AstralSelectOption[];\n placeholder?: string;\n disabled?: boolean;\n searchable?: boolean;\n searchPlaceholder?: string;\n noResults?: string;\n clearable?: boolean;\n creatable?: boolean;\n}) {\n const [open, setOpen] = useState(false);\n const [q, setQ] = useState('');\n const triggerRef = useRef<HTMLButtonElement>(null);\n const menuRef = useRef<HTMLDivElement>(null);\n const [pos, setPos] = useState<{ left: number; top?: number; bottom?: number; width: number; maxHeight: number } | null>(null);\n\n const reposition = useCallback(() => {\n const el = triggerRef.current;\n if (!el) return;\n const r = el.getBoundingClientRect();\n const spaceBelow = window.innerHeight - r.bottom - 12;\n const spaceAbove = r.top - 12;\n const flipUp = spaceBelow < 200 && spaceAbove > spaceBelow;\n setPos({\n left: r.left,\n width: r.width,\n ...(flipUp\n ? { bottom: window.innerHeight - r.top + 5, maxHeight: Math.max(140, Math.min(300, spaceAbove)) }\n : { top: r.bottom + 5, maxHeight: Math.max(140, Math.min(300, spaceBelow)) }),\n });\n }, []);\n\n useEffect(() => {\n if (!open) return;\n reposition();\n const onScroll = () => reposition();\n const onResize = () => setOpen(false);\n const onDoc = (e: MouseEvent) => {\n if (triggerRef.current?.contains(e.target as Node)) return;\n if (menuRef.current?.contains(e.target as Node)) return;\n setOpen(false);\n };\n window.addEventListener('scroll', onScroll, true);\n window.addEventListener('resize', onResize);\n // Capture phase: AstralModal/AstralDrawer panels stopPropagation on mousedown,\n // which would otherwise block this outside-click close when the overlay lives inside one.\n document.addEventListener('mousedown', onDoc, true);\n return () => {\n window.removeEventListener('scroll', onScroll, true);\n window.removeEventListener('resize', onResize);\n document.removeEventListener('mousedown', onDoc, true);\n };\n }, [open, reposition]);\n\n const selected = options.find(o => o.value === value);\n const hasValue = value != null && value !== '';\n const display = selected ? selected.label : (value ?? '');\n const filtered = searchable && q.trim()\n ? options.filter(o => o.label.toLowerCase().includes(q.trim().toLowerCase()))\n : options;\n const showCreate = !!creatable && !!q.trim() && !options.some(o => o.label.toLowerCase() === q.trim().toLowerCase());\n\n return (\n <div className=\"au-select\">\n <button ref={triggerRef} type=\"button\" className=\"au-input au-select-trigger\" disabled={disabled} onClick={() => setOpen(o => !o)}>\n <span className={hasValue ? '' : 'ph'}>{hasValue ? display : placeholder}</span>\n {clearable && hasValue ? (\n <span className=\"au-select-caret au-select-clear\" role=\"button\" tabIndex={-1}\n onClick={(e) => { e.stopPropagation(); onChange(''); }}><IconX size={14} /></span>\n ) : (\n <IconChevronDown size={15} className=\"au-select-caret\" />\n )}\n </button>\n {open && !disabled && pos && createPortal(\n <div\n ref={menuRef}\n className=\"au-select-menu\"\n style={{ left: pos.left, top: pos.top, bottom: pos.bottom, width: pos.width, maxHeight: pos.maxHeight }}\n >\n {searchable && (\n <input\n autoFocus\n className=\"au-select-search\"\n placeholder={searchPlaceholder}\n value={q}\n onChange={(e) => setQ(e.currentTarget.value)}\n />\n )}\n {filtered.length === 0 && !showCreate && <div className=\"au-select-empty\">{noResults}</div>}\n {filtered.map(o => (\n <button\n type=\"button\"\n key={o.value}\n className={`au-select-opt${o.value === value ? ' on' : ''}`}\n onClick={() => { onChange(o.value); setOpen(false); setQ(''); }}\n >\n {o.label}\n </button>\n ))}\n {showCreate && (\n <button type=\"button\" className=\"au-select-opt au-select-create\"\n onClick={() => { onChange(q.trim()); setOpen(false); setQ(''); }}>\n + {q.trim()}\n </button>\n )}\n </div>,\n document.body,\n )}\n </div>\n );\n}\n\nexport interface AstralMenuItem { key?: string; label: ReactNode; icon?: ReactNode; onClick?: () => void; danger?: boolean; divider?: boolean; disabled?: boolean; }\n\n/** Astral action-menu dropdown - portalled like AstralSelect. */\nexport function AstralMenu({ trigger, items, align = 'end', width = 220 }: {\n trigger: ReactNode;\n items: AstralMenuItem[];\n align?: 'start' | 'end';\n width?: number;\n}) {\n const [open, setOpen] = useState(false);\n const anchorRef = useRef<HTMLDivElement>(null);\n const menuRef = useRef<HTMLDivElement>(null);\n const [pos, setPos] = useState<{ left: number; top?: number; bottom?: number; minWidth: number; maxHeight: number } | null>(null);\n\n const reposition = useCallback(() => {\n const el = anchorRef.current;\n if (!el) return;\n const r = el.getBoundingClientRect();\n const spaceBelow = window.innerHeight - r.bottom - 12;\n const spaceAbove = r.top - 12;\n const flipUp = spaceBelow < 220 && spaceAbove > spaceBelow;\n const left = align === 'end' ? Math.max(8, Math.min(r.right - width, window.innerWidth - width - 8)) : Math.min(r.left, window.innerWidth - width - 8);\n setPos({\n left,\n minWidth: width,\n ...(flipUp\n ? { bottom: window.innerHeight - r.top + 5, maxHeight: Math.max(160, Math.min(380, spaceAbove)) }\n : { top: r.bottom + 5, maxHeight: Math.max(160, Math.min(380, spaceBelow)) }),\n });\n }, [align, width]);\n\n useEffect(() => {\n if (!open) return;\n reposition();\n const onScroll = () => reposition();\n const onResize = () => setOpen(false);\n const onDoc = (e: MouseEvent) => {\n if (anchorRef.current?.contains(e.target as Node)) return;\n if (menuRef.current?.contains(e.target as Node)) return;\n setOpen(false);\n };\n window.addEventListener('scroll', onScroll, true);\n window.addEventListener('resize', onResize);\n // Capture phase: AstralModal/AstralDrawer panels stopPropagation on mousedown,\n // which would otherwise block this outside-click close when the overlay lives inside one.\n document.addEventListener('mousedown', onDoc, true);\n return () => {\n window.removeEventListener('scroll', onScroll, true);\n window.removeEventListener('resize', onResize);\n document.removeEventListener('mousedown', onDoc, true);\n };\n }, [open, reposition]);\n\n return (\n <>\n <div className=\"au-menu-anchor\" ref={anchorRef} onClick={() => setOpen(o => !o)}>\n {trigger}\n </div>\n {open && pos && createPortal(\n <div ref={menuRef} className=\"au-menu\" style={{ left: pos.left, top: pos.top, bottom: pos.bottom, minWidth: pos.minWidth, maxHeight: pos.maxHeight }}>\n {items.map((it, i) => it.divider\n ? <div key={it.key ?? `d${i}`} className=\"au-menu-divider\" />\n : (\n <button type=\"button\" key={it.key ?? i} className={`au-menu-item${it.danger ? ' danger' : ''}`} disabled={it.disabled}\n onClick={() => { setOpen(false); it.onClick?.(); }}>\n {it.icon && <span className=\"au-menu-ic\">{it.icon}</span>}\n <span className=\"au-menu-label\">{it.label}</span>\n </button>\n ))}\n </div>,\n document.body,\n )}\n </>\n );\n}\n","import { useSyncExternalStore } from 'react';\nimport type { ReactNode, CSSProperties } from 'react';\nimport { createPortal } from 'react-dom';\nimport { IconX, IconCheck, IconAlertTriangle, IconInfoCircle, IconExclamationCircle } from '@tabler/icons-react';\n\n/* AstralUI toast system. The `notifications` object (show/update/hide/clean, returns\n an id) is a small imperative store; <AstralToaster/> renders the live toasts and is\n mounted once at the app root. Theme-aware via the --astral-* tokens. */\n\nexport interface ToastOptions {\n id?: string;\n title?: ReactNode;\n message?: ReactNode;\n color?: string;\n icon?: ReactNode;\n loading?: boolean;\n autoClose?: number | false;\n withCloseButton?: boolean;\n onClose?: () => void;\n /** accepted for API compatibility; the toaster uses one global position */\n position?: string;\n /** tolerate any other notification prop a call site may pass (radius, withBorder, style, ...) */\n [key: string]: unknown;\n}\n\ninterface Toast extends ToastOptions { id: string; }\n\nlet toasts: Toast[] = [];\nconst listeners = new Set<() => void>();\nconst timers = new Map<string, ReturnType<typeof setTimeout>>();\nlet counter = 0;\n\nconst emit = () => listeners.forEach(l => l());\n\nfunction clearTimer(id: string) {\n const x = timers.get(id);\n if (x) { clearTimeout(x); timers.delete(id); }\n}\n\nfunction scheduleAutoClose(t: Toast) {\n clearTimer(t.id);\n if (t.autoClose === false || t.loading) return; // loading toasts stay until updated\n const ms = typeof t.autoClose === 'number' ? t.autoClose : 4000;\n timers.set(t.id, setTimeout(() => hide(t.id), ms));\n}\n\nfunction show(opts: ToastOptions): string {\n const id = opts.id ?? `toast-${++counter}`;\n const existing = toasts.find(t => t.id === id);\n const toast: Toast = { withCloseButton: true, ...existing, ...opts, id };\n toasts = existing ? toasts.map(t => (t.id === id ? toast : t)) : [...toasts, toast];\n emit();\n scheduleAutoClose(toast);\n return id;\n}\n\nfunction update(opts: ToastOptions): string {\n if (!opts.id) return show(opts);\n const existing = toasts.find(t => t.id === opts.id);\n if (!existing) return show(opts);\n const toast: Toast = { ...existing, ...opts, id: opts.id };\n toasts = toasts.map(t => (t.id === opts.id ? toast : t));\n emit();\n scheduleAutoClose(toast);\n return opts.id;\n}\n\nfunction hide(id: string) {\n const t = toasts.find(x => x.id === id);\n clearTimer(id);\n toasts = toasts.filter(x => x.id !== id);\n emit();\n t?.onClose?.();\n}\n\nfunction clean() {\n toasts.forEach(t => clearTimer(t.id));\n toasts = [];\n emit();\n}\n\nexport const notifications = { show, update, hide, clean };\n\n/* ── Rendering ── */\n\nconst subscribe = (cb: () => void) => { listeners.add(cb); return () => { listeners.delete(cb); }; };\nconst getSnapshot = () => toasts;\n\nconst DEFAULT_ICON: Record<string, ReactNode> = {\n green: <IconCheck size={16} />,\n teal: <IconCheck size={16} />,\n red: <IconExclamationCircle size={16} />,\n orange: <IconAlertTriangle size={16} />,\n yellow: <IconAlertTriangle size={16} />,\n};\n\nfunction Spinner() {\n return <span className=\"au-toast-spin\" />;\n}\n\nfunction ToastCard({ t }: { t: Toast }) {\n const accent = t.color ? `var(--astral-color-${t.color}-6)` : 'var(--astral-color-default-border)';\n const lead = t.loading\n ? <Spinner />\n : t.icon\n ? t.icon\n : (t.color && DEFAULT_ICON[t.color]) || <IconInfoCircle size={16} />;\n return (\n <div className=\"au-toast\" style={{ ['--au-toast-accent' as string]: accent } as CSSProperties} role=\"status\">\n <span className=\"au-toast-lead\">{lead}</span>\n <div className=\"au-toast-body\">\n {t.title && <div className=\"au-toast-title\">{t.title}</div>}\n {t.message != null && <div className=\"au-toast-msg\">{t.message}</div>}\n </div>\n {t.withCloseButton !== false && (\n <button type=\"button\" className=\"au-toast-x\" onClick={() => hide(t.id)} aria-label=\"Close\"><IconX size={14} /></button>\n )}\n </div>\n );\n}\n\nexport function AstralToaster() {\n const items = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n if (typeof document === 'undefined') return null;\n return createPortal(\n <div className=\"au-toast-host\" role=\"region\" aria-live=\"polite\" aria-label=\"Notifications\">\n {items.map(t => <ToastCard key={t.id} t={t} />)}\n </div>,\n document.body,\n );\n}\n","import { useState, useEffect } from 'react';\nimport type { CSSProperties } from 'react';\n\n/* Native <input type=\"date\" | \"datetime-local\"> that mirrors exactly what the user\n types and only commits a parsed Date upward once the string is a COMPLETE, plausible\n value. A fully-controlled date input that round-trips every keystroke through\n `new Date(y, m-1, d)` hits JS's 0-99 -> 1900s year remap mid-typing (so \"2\" -> 1902),\n and the reformatted value fights the user's typing into a re-render storm that freezes\n the page. Keeping the string local and gating the commit avoids that entirely.\n `color-scheme` is left to inherit so the native calendar glyph follows the app theme. */\n\nconst pad2 = (n: number) => String(n).padStart(2, '0');\nconst pad4 = (n: number) => String(n).padStart(4, '0');\n\n/** Date -> \"YYYY-MM-DD\" (local) */\nexport function dateToInputStr(d: Date | null): string {\n if (!d || isNaN(d.getTime())) return '';\n return `${pad4(d.getFullYear())}-${pad2(d.getMonth() + 1)}-${pad2(d.getDate())}`;\n}\n\n/** Date -> \"YYYY-MM-DDTHH:mm\" (local) */\nexport function dateTimeToInputStr(d: Date | null): string {\n if (!d || isNaN(d.getTime())) return '';\n return `${dateToInputStr(d)}T${pad2(d.getHours())}:${pad2(d.getMinutes())}`;\n}\n\ninterface Props {\n type?: 'date' | 'datetime-local';\n value: Date | null;\n onChange: (d: Date | null) => void;\n min?: Date;\n max?: Date;\n className?: string;\n style?: CSSProperties;\n disabled?: boolean;\n 'aria-label'?: string;\n}\n\nexport default function DateInput({ type = 'date', value, onChange, min, max, className, style, disabled, 'aria-label': ariaLabel }: Props) {\n const isTime = type === 'datetime-local';\n const fmt = isTime ? dateTimeToInputStr : dateToInputStr;\n const [s, setS] = useState(() => fmt(value));\n // Re-sync from the parent (preset buttons, programmatic clears) without fighting typing.\n const t = value?.getTime();\n useEffect(() => { setS(fmt(value)); }, [t]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const handle = (str: string) => {\n setS(str);\n if (str === '') { onChange(null); return; }\n const m = (isTime ? /^(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2})$/ : /^(\\d{4})-(\\d{2})-(\\d{2})$/).exec(str);\n if (!m) return; // incomplete - hold locally, don't commit\n const y = Number(m[1]);\n if (y < 1970 || y > 2100) return; // implausible (mid-typed) year - wait for a full one\n const d = isTime\n ? new Date(y, Number(m[2]) - 1, Number(m[3]), Number(m[4]), Number(m[5]))\n : new Date(y, Number(m[2]) - 1, Number(m[3]));\n if (isNaN(d.getTime())) return;\n onChange(d);\n };\n\n return (\n <input\n type={type}\n className={className}\n style={style}\n disabled={disabled}\n aria-label={ariaLabel}\n value={s}\n min={min ? fmt(min) : undefined}\n max={max ? fmt(max) : undefined}\n onChange={e => handle(e.currentTarget.value)}\n />\n );\n}\n","import type { CSSProperties } from 'react';\n\n/* Minimal theme-aware spinner. Styled by the .au-spinner class (in tokens.css);\n size via the `size` prop (px). */\nexport function Spinner({ size = 24, className, style }: { size?: number; className?: string; style?: CSSProperties }) {\n return (\n <span\n className={className ? `au-spinner ${className}` : 'au-spinner'}\n style={{ width: size, height: size, ...style }}\n role=\"status\"\n aria-label=\"Loading\"\n />\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/theme/ColorSchemeProvider.tsx","../src/theme/generateColors.ts","../src/theme/AstralProvider.tsx","../src/components/overlay.tsx","../src/components/Toast.tsx","../src/components/DateInput.tsx","../src/components/Spinner.tsx","../src/components/Backgrounds.tsx"],"names":["createContext","useState","useEffect","useCallback","jsx","useContext","chroma","useMemo","jsxs","createPortal","IconX","useRef","clean","IconChevronDown","Fragment","IconCheck","IconExclamationCircle","IconAlertTriangle","IconInfoCircle","useSyncExternalStore","Spinner"],"mappings":"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","file":"index.cjs","sourcesContent":["import { createContext, useContext, useState, useEffect, useCallback } from 'react';\nimport type { ReactNode } from 'react';\n\n/* Light/dark control. Owns the color scheme, persists it to localStorage, and sets\n `data-astral-scheme` + `color-scheme` on <html> - which the AstralUI tokens (and\n every `light-dark()`) key off. The sole source of truth for the active scheme. */\n\nexport type ColorScheme = 'light' | 'dark';\n\ninterface ColorSchemeContextType {\n colorScheme: ColorScheme;\n setColorScheme: (scheme: ColorScheme) => void;\n toggle: () => void;\n}\n\nconst ColorSchemeContext = createContext<ColorSchemeContextType>({\n colorScheme: 'dark',\n setColorScheme: () => {},\n toggle: () => {},\n});\n\ninterface ColorSchemeProviderProps {\n children: ReactNode;\n /** Initial scheme when nothing is persisted yet. Default 'dark'. */\n defaultScheme?: ColorScheme;\n /** localStorage key for persistence. Default 'astral-color-scheme'. */\n storageKey?: string;\n}\n\nexport function ColorSchemeProvider({ children, defaultScheme = 'dark', storageKey = 'astral-color-scheme' }: ColorSchemeProviderProps) {\n const [colorScheme, setScheme] = useState<ColorScheme>(() => {\n try {\n const v = localStorage.getItem(storageKey);\n if (v === 'light' || v === 'dark') return v;\n } catch { /* ignore */ }\n return defaultScheme;\n });\n\n useEffect(() => {\n const root = document.documentElement;\n root.setAttribute('data-astral-scheme', colorScheme);\n root.style.colorScheme = colorScheme;\n }, [colorScheme]);\n\n const setColorScheme = useCallback((scheme: ColorScheme) => {\n try { localStorage.setItem(storageKey, scheme); } catch { /* ignore */ }\n setScheme(scheme);\n }, [storageKey]);\n\n const toggle = useCallback(() => {\n setScheme(prev => {\n const next = prev === 'dark' ? 'light' : 'dark';\n try { localStorage.setItem(storageKey, next); } catch { /* ignore */ }\n return next;\n });\n }, [storageKey]);\n\n return (\n <ColorSchemeContext.Provider value={{ colorScheme, setColorScheme, toggle }}>\n {children}\n </ColorSchemeContext.Provider>\n );\n}\n\nexport function useColorScheme() {\n return useContext(ColorSchemeContext);\n}\n","import chroma from 'chroma-js';\n\n/* Produces a 10-shade palette from a single hex, using fixed lightness/saturation\n maps and chroma-js LCH math. Used by AstralThemeProvider to turn an org's chosen\n brand color into a full palette. */\n\nconst LIGHTNESS_MAP = [0.96, 0.907, 0.805, 0.697, 0.605, 0.547, 0.518, 0.445, 0.395, 0.34];\nconst SATURATION_MAP = [0.32, 0.16, 0.08, 0.04, 0, 0, 0.04, 0.08, 0.16, 0.32];\n\nfunction getClosestLightness(colorObject: chroma.Color): number {\n const lightnessGoal = colorObject.get('hsl.l');\n return LIGHTNESS_MAP.reduce((prev, curr) =>\n Math.abs(curr - lightnessGoal) < Math.abs(prev - lightnessGoal) ? curr : prev,\n );\n}\n\nexport function generateColors(color: string): string[] {\n const colorObject = chroma(color);\n const closestLightness = getClosestLightness(colorObject);\n const baseColorIndex = LIGHTNESS_MAP.findIndex((l) => l === closestLightness);\n\n const colors = LIGHTNESS_MAP\n .map((l) => colorObject.set('hsl.l', l))\n .map((c) => chroma(c))\n .map((c, i) => {\n const saturationDelta = SATURATION_MAP[i] - SATURATION_MAP[baseColorIndex];\n return saturationDelta >= 0 ? c.saturate(saturationDelta) : c.desaturate(saturationDelta * -1);\n });\n\n colors[baseColorIndex] = chroma(color);\n return colors.map((c) => c.hex());\n}\n","import { useMemo, useState, useCallback, createContext, useContext } from 'react';\nimport type { ReactNode } from 'react';\nimport { generateColors } from './generateColors';\n\n/* Per-org / per-brand theming. Computes the brand palette + surface overrides and\n injects them as a runtime <style> that overrides the base --astral-* tokens\n (from tokens.css) per scheme. Selectors use html:root[data-astral-scheme=\"...\"]\n (specificity 0,2,1, so they win over the :root base tokens). No colors -> empty\n style -> base tokens. Prop-driven (no app coupling): pass the brand colors in. */\n\n/* ── Color preview context (live editing) ── */\n\nexport interface AstralThemeColors {\n primary_color?: string | null;\n background_color?: string | null;\n card_color?: string | null;\n navbar_color?: string | null;\n font_color?: string | null;\n light_primary_color?: string | null;\n light_background_color?: string | null;\n light_card_color?: string | null;\n light_navbar_color?: string | null;\n light_font_color?: string | null;\n}\n\ninterface ThemePreviewContextType {\n preview: AstralThemeColors | null;\n setPreview: (colors: AstralThemeColors | null) => void;\n}\n\nconst ThemePreviewContext = createContext<ThemePreviewContextType>({\n preview: null,\n setPreview: () => {},\n});\n\nexport function useThemePreview() {\n return useContext(ThemePreviewContext);\n}\n\n/* ── Helpers ── */\n\nconst HEX_RE = /^#[0-9a-f]{6}$/i;\nconst isValidHex = (v: string | null | undefined): v is string => !!v && HEX_RE.test(v);\n\nfunction adjustHex(hex: string, amount: number): string {\n const c = hex.replace('#', '');\n const r = Math.max(0, Math.min(255, parseInt(c.substring(0, 2), 16) + amount));\n const g = Math.max(0, Math.min(255, parseInt(c.substring(2, 4), 16) + amount));\n const b = Math.max(0, Math.min(255, parseInt(c.substring(4, 6), 16) + amount));\n return `#${r.toString(16).padStart(2, '0')}${g.toString(16).padStart(2, '0')}${b.toString(16).padStart(2, '0')}`;\n}\n\nfunction hexToRgba(hex: string, alpha: number): string {\n const c = hex.replace('#', '');\n const r = parseInt(c.substring(0, 2), 16);\n const g = parseInt(c.substring(2, 4), 16);\n const b = parseInt(c.substring(4, 6), 16);\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n}\n\n/* primaryShade is { light: 6, dark: 8 }; -light is the shade-6 color at .1/.15 alpha\n (.12/.2 hovered); -light-color is shade 6 (light) / 3 (dark). Theme-level constants,\n identical for any palette. */\nfunction primaryVars(palette: string[], scheme: 'light' | 'dark'): string[] {\n if (scheme === 'light') {\n return [\n `--astral-primary-color-filled:${palette[6]}`,\n `--astral-primary-color-filled-hover:${palette[7]}`,\n `--astral-primary-color-light:${hexToRgba(palette[6], 0.1)}`,\n `--astral-primary-color-light-hover:${hexToRgba(palette[6], 0.12)}`,\n `--astral-primary-color-light-color:${palette[6]}`,\n ];\n }\n return [\n `--astral-primary-color-filled:${palette[8]}`,\n `--astral-primary-color-filled-hover:${palette[9]}`,\n `--astral-primary-color-light:${hexToRgba(palette[6], 0.15)}`,\n `--astral-primary-color-light-hover:${hexToRgba(palette[6], 0.2)}`,\n `--astral-primary-color-light-color:${palette[3]}`,\n ];\n}\n\nfunction safeGenerate(hex: string): string[] | null {\n try { return generateColors(hex) as unknown as string[]; } catch { return null; }\n}\n\nexport function buildOrgCss(src: AstralThemeColors): string {\n const brand = isValidHex(src.primary_color) ? safeGenerate(src.primary_color!) : null;\n const lightBrand = isValidHex(src.light_primary_color) ? safeGenerate(src.light_primary_color!) : null;\n const lightPalette = lightBrand ?? brand; // light mode uses lightBrand, else falls back to brand\n const noDarkBrand = !brand; // the base accent palette is only overridden in light when no dark brand\n\n const vBg = isValidHex(src.background_color) ? src.background_color! : '';\n const vCard = isValidHex(src.card_color) ? src.card_color! : '';\n const vNav = isValidHex(src.navbar_color) ? src.navbar_color! : '';\n const vFont = isValidHex(src.font_color) ? src.font_color! : '';\n const vLBg = isValidHex(src.light_background_color) ? src.light_background_color! : '';\n const vLCard = isValidHex(src.light_card_color) ? src.light_card_color! : '';\n const vLNav = isValidHex(src.light_navbar_color) ? src.light_navbar_color! : '';\n const vLFont = isValidHex(src.light_font_color) ? src.light_font_color! : '';\n\n const dark: string[] = [];\n const light: string[] = [];\n\n /* ── dark scheme ── */\n if (brand) dark.push(...primaryVars(brand, 'dark'));\n if (vFont) {\n // dark palette: dark-0 = primary text; the dark text token mirrors dark-0.\n dark.push(`--astral-color-dark-0:${vFont}`, `--astral-color-dark-1:${adjustHex(vFont, -30)}`, `--astral-color-dark-2:${adjustHex(vFont, -60)}`, `--astral-color-text:${vFont}`);\n }\n if (vCard) dark.push(`--astral-color-dark-6:${vCard}`);\n if (vBg) dark.push(`--astral-color-dark-7:${vBg}`, `--astral-color-dark-9:${adjustHex(vBg, -10)}`, `--astral-color-body:${vBg}`, `--astral-app-bg:${vBg}`);\n if (vNav) dark.push(`--astral-color-dark-8:${vNav}`, `--astral-app-nav:${vNav}`);\n if (vCard) dark.push(`--astral-app-card:${vCard}`);\n\n /* ── light scheme ── */\n if (lightBrand && noDarkBrand) {\n // only-light-primary: override the base accent (violet) palette so accent-derived\n // tokens (e.g. brand-text) follow the light primary in light mode.\n for (let i = 0; i < 10; i++) light.push(`--astral-color-violet-${i}:${lightBrand[i]}`);\n }\n if (lightPalette) light.push(...primaryVars(lightPalette, 'light'));\n if (vLFont) light.push(`--astral-color-text:${vLFont}`);\n if (vLBg) light.push(`--astral-app-bg:${vLBg}`);\n if (vLNav) light.push(`--astral-app-nav:${vLNav}`);\n if (vLCard) light.push(`--astral-app-card:${vLCard}`);\n\n let css = '';\n if (dark.length) css += `html:root[data-astral-scheme=\"dark\"]{${dark.join(';')}}`;\n if (light.length) css += `html:root[data-astral-scheme=\"light\"]{${light.join(';')}}`;\n return css;\n}\n\n/* ── Provider ──\n Pass the brand colors via `colors`. While editing, call setPreview() (from\n useThemePreview) with partial colors for an instant live preview. */\n\nexport function AstralThemeProvider({ colors, children }: { colors?: AstralThemeColors | null; children: ReactNode }) {\n const [preview, setPreview] = useState<AstralThemeColors | null>(null);\n\n const stableSetPreview = useCallback((c: AstralThemeColors | null) => {\n setPreview(c);\n }, []);\n\n const effective: AstralThemeColors | null = preview\n ? { ...(colors ?? {}), ...preview }\n : (colors ?? null);\n\n const orgCss = useMemo(\n () => (effective ? buildOrgCss(effective) : ''),\n [effective ? JSON.stringify(effective) : ''],\n );\n\n return (\n <ThemePreviewContext.Provider value={{ preview, setPreview: stableSetPreview }}>\n <style data-astral-theme>{orgCss}</style>\n {children}\n </ThemePreviewContext.Provider>\n );\n}\n","import { useCallback, useEffect, useRef, useState, type ReactNode, type CSSProperties, type KeyboardEvent as ReactKeyboardEvent } from 'react';\nimport { createPortal } from 'react-dom';\nimport { IconX, IconChevronDown } from '@tabler/icons-react';\n\nfunction useDismiss(opened: boolean, onClose: () => void) {\n useEffect(() => {\n if (!opened) return;\n const onKey = (e: KeyboardEvent) => { if (e.key === 'Escape') onClose(); };\n document.addEventListener('keydown', onKey);\n const prev = document.body.style.overflow;\n document.body.style.overflow = 'hidden';\n return () => { document.removeEventListener('keydown', onKey); document.body.style.overflow = prev; };\n }, [opened, onClose]);\n}\n\ninterface ShellProps {\n opened: boolean;\n onClose: () => void;\n title: ReactNode;\n brand?: string;\n width?: number;\n /** Override the overlay z-index (default 300). Use to stack over flow-editor modals. */\n zIndex?: number;\n children: ReactNode;\n}\n\n/** Centered Astral modal (portal + overlay + escape + click-outside). */\nexport function AstralModal({ opened, onClose, title, brand, width = 460, zIndex, children }: ShellProps) {\n useDismiss(opened, onClose);\n if (!opened) return null;\n const style = { maxWidth: width, ...(brand ? { '--au-ic': brand } : {}) } as CSSProperties;\n return createPortal(\n <div className=\"au-modal-overlay\" onMouseDown={onClose} style={zIndex != null ? { zIndex } : undefined}>\n <div className=\"au-modal-panel\" style={style} onMouseDown={(e) => e.stopPropagation()}>\n <div className=\"au-modal-head\">\n <span className=\"au-modal-title\">{title}</span>\n <button type=\"button\" className=\"au-modal-x\" onClick={onClose} aria-label=\"Close\"><IconX /></button>\n </div>\n <div className=\"au-modal-body\">{children}</div>\n </div>\n </div>,\n document.body,\n );\n}\n\n/** Right-side Astral drawer. */\nexport function AstralDrawer({ opened, onClose, title, brand, width = 440, zIndex, children }: ShellProps) {\n useDismiss(opened, onClose);\n if (!opened) return null;\n const style = { width, ...(brand ? { '--au-ic': brand } : {}) } as CSSProperties;\n return createPortal(\n <div className=\"au-drawer-overlay\" onMouseDown={onClose} style={zIndex != null ? { zIndex } : undefined}>\n <div className=\"au-drawer-panel\" style={style} onMouseDown={(e) => e.stopPropagation()}>\n <div className=\"au-drawer-head\">\n <span className=\"au-drawer-title\">{title}</span>\n <button type=\"button\" className=\"au-modal-x\" onClick={onClose} aria-label=\"Close\"><IconX /></button>\n </div>\n <div className=\"au-drawer-body\">{children}</div>\n </div>\n </div>,\n document.body,\n );\n}\n\n/** Astral 6-box code input, with auto-advance, backspace, paste and arrows. */\nexport function AstralPinInput({ length = 6, value, onChange, autoFocus }: {\n length?: number;\n value: string;\n onChange: (value: string) => void;\n autoFocus?: boolean;\n}) {\n const refs = useRef<Array<HTMLInputElement | null>>([]);\n const digits = Array.from({ length }, (_, i) => value[i] ?? '');\n\n const focusBox = (i: number) => { refs.current[Math.max(0, Math.min(length - 1, i))]?.focus(); };\n\n const handleChange = (i: number, raw: string) => {\n const clean = raw.replace(/\\D/g, '');\n if (!clean) return;\n const arr = value.split('');\n let pos = i;\n for (const ch of clean) {\n if (pos >= length) break;\n arr[pos] = ch;\n pos++;\n }\n onChange(arr.join('').slice(0, length));\n focusBox(pos);\n };\n\n const handleKeyDown = (i: number, e: ReactKeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Backspace') {\n e.preventDefault();\n const arr = value.split('');\n if (arr[i]) {\n arr[i] = '';\n onChange(arr.join(''));\n } else if (i > 0) {\n arr[i - 1] = '';\n onChange(arr.join(''));\n focusBox(i - 1);\n }\n } else if (e.key === 'ArrowLeft') {\n e.preventDefault();\n focusBox(i - 1);\n } else if (e.key === 'ArrowRight') {\n e.preventDefault();\n focusBox(i + 1);\n }\n };\n\n return (\n <div className=\"au-pin\">\n {digits.map((d, i) => (\n <input\n key={i}\n ref={(el) => { refs.current[i] = el; }}\n className=\"au-pin-box\"\n inputMode=\"numeric\"\n autoComplete=\"one-time-code\"\n aria-label={`Digit ${i + 1}`}\n value={d}\n autoFocus={autoFocus && i === 0}\n onChange={(e) => handleChange(i, e.currentTarget.value)}\n onKeyDown={(e) => handleKeyDown(i, e)}\n onFocus={(e) => e.currentTarget.select()}\n />\n ))}\n </div>\n );\n}\n\nexport interface AstralSelectOption { value: string; label: string; }\n\n/** Astral select with optional search/create/clear - combobox. */\nexport function AstralSelect({ value, onChange, options, placeholder, disabled, searchable, searchPlaceholder, noResults, clearable, creatable }: {\n value: string | null;\n onChange: (value: string) => void;\n options: AstralSelectOption[];\n placeholder?: string;\n disabled?: boolean;\n searchable?: boolean;\n searchPlaceholder?: string;\n noResults?: string;\n clearable?: boolean;\n creatable?: boolean;\n}) {\n const [open, setOpen] = useState(false);\n const [q, setQ] = useState('');\n const triggerRef = useRef<HTMLButtonElement>(null);\n const menuRef = useRef<HTMLDivElement>(null);\n const [pos, setPos] = useState<{ left: number; top?: number; bottom?: number; width: number; maxHeight: number } | null>(null);\n\n const reposition = useCallback(() => {\n const el = triggerRef.current;\n if (!el) return;\n const r = el.getBoundingClientRect();\n const spaceBelow = window.innerHeight - r.bottom - 12;\n const spaceAbove = r.top - 12;\n const flipUp = spaceBelow < 200 && spaceAbove > spaceBelow;\n setPos({\n left: r.left,\n width: r.width,\n ...(flipUp\n ? { bottom: window.innerHeight - r.top + 5, maxHeight: Math.max(140, Math.min(300, spaceAbove)) }\n : { top: r.bottom + 5, maxHeight: Math.max(140, Math.min(300, spaceBelow)) }),\n });\n }, []);\n\n useEffect(() => {\n if (!open) return;\n reposition();\n const onScroll = () => reposition();\n const onResize = () => setOpen(false);\n const onDoc = (e: MouseEvent) => {\n if (triggerRef.current?.contains(e.target as Node)) return;\n if (menuRef.current?.contains(e.target as Node)) return;\n setOpen(false);\n };\n window.addEventListener('scroll', onScroll, true);\n window.addEventListener('resize', onResize);\n // Capture phase: AstralModal/AstralDrawer panels stopPropagation on mousedown,\n // which would otherwise block this outside-click close when the overlay lives inside one.\n document.addEventListener('mousedown', onDoc, true);\n return () => {\n window.removeEventListener('scroll', onScroll, true);\n window.removeEventListener('resize', onResize);\n document.removeEventListener('mousedown', onDoc, true);\n };\n }, [open, reposition]);\n\n const selected = options.find(o => o.value === value);\n const hasValue = value != null && value !== '';\n const display = selected ? selected.label : (value ?? '');\n const filtered = searchable && q.trim()\n ? options.filter(o => o.label.toLowerCase().includes(q.trim().toLowerCase()))\n : options;\n const showCreate = !!creatable && !!q.trim() && !options.some(o => o.label.toLowerCase() === q.trim().toLowerCase());\n\n return (\n <div className=\"au-select\">\n <button ref={triggerRef} type=\"button\" className=\"au-input au-select-trigger\" disabled={disabled} onClick={() => setOpen(o => !o)}>\n <span className={hasValue ? '' : 'ph'}>{hasValue ? display : placeholder}</span>\n {clearable && hasValue ? (\n <span className=\"au-select-caret au-select-clear\" role=\"button\" tabIndex={-1}\n onClick={(e) => { e.stopPropagation(); onChange(''); }}><IconX size={14} /></span>\n ) : (\n <IconChevronDown size={15} className=\"au-select-caret\" />\n )}\n </button>\n {open && !disabled && pos && createPortal(\n <div\n ref={menuRef}\n className=\"au-select-menu\"\n style={{ left: pos.left, top: pos.top, bottom: pos.bottom, width: pos.width, maxHeight: pos.maxHeight }}\n >\n {searchable && (\n <input\n autoFocus\n className=\"au-select-search\"\n placeholder={searchPlaceholder}\n value={q}\n onChange={(e) => setQ(e.currentTarget.value)}\n />\n )}\n {filtered.length === 0 && !showCreate && <div className=\"au-select-empty\">{noResults}</div>}\n {filtered.map(o => (\n <button\n type=\"button\"\n key={o.value}\n className={`au-select-opt${o.value === value ? ' on' : ''}`}\n onClick={() => { onChange(o.value); setOpen(false); setQ(''); }}\n >\n {o.label}\n </button>\n ))}\n {showCreate && (\n <button type=\"button\" className=\"au-select-opt au-select-create\"\n onClick={() => { onChange(q.trim()); setOpen(false); setQ(''); }}>\n + {q.trim()}\n </button>\n )}\n </div>,\n document.body,\n )}\n </div>\n );\n}\n\nexport interface AstralMenuItem { key?: string; label: ReactNode; icon?: ReactNode; onClick?: () => void; danger?: boolean; divider?: boolean; disabled?: boolean; }\n\n/** Astral action-menu dropdown - portalled like AstralSelect. */\nexport function AstralMenu({ trigger, items, align = 'end', width = 220 }: {\n trigger: ReactNode;\n items: AstralMenuItem[];\n align?: 'start' | 'end';\n width?: number;\n}) {\n const [open, setOpen] = useState(false);\n const anchorRef = useRef<HTMLDivElement>(null);\n const menuRef = useRef<HTMLDivElement>(null);\n const [pos, setPos] = useState<{ left: number; top?: number; bottom?: number; minWidth: number; maxHeight: number } | null>(null);\n\n const reposition = useCallback(() => {\n const el = anchorRef.current;\n if (!el) return;\n const r = el.getBoundingClientRect();\n const spaceBelow = window.innerHeight - r.bottom - 12;\n const spaceAbove = r.top - 12;\n const flipUp = spaceBelow < 220 && spaceAbove > spaceBelow;\n const left = align === 'end' ? Math.max(8, Math.min(r.right - width, window.innerWidth - width - 8)) : Math.min(r.left, window.innerWidth - width - 8);\n setPos({\n left,\n minWidth: width,\n ...(flipUp\n ? { bottom: window.innerHeight - r.top + 5, maxHeight: Math.max(160, Math.min(380, spaceAbove)) }\n : { top: r.bottom + 5, maxHeight: Math.max(160, Math.min(380, spaceBelow)) }),\n });\n }, [align, width]);\n\n useEffect(() => {\n if (!open) return;\n reposition();\n const onScroll = () => reposition();\n const onResize = () => setOpen(false);\n const onDoc = (e: MouseEvent) => {\n if (anchorRef.current?.contains(e.target as Node)) return;\n if (menuRef.current?.contains(e.target as Node)) return;\n setOpen(false);\n };\n window.addEventListener('scroll', onScroll, true);\n window.addEventListener('resize', onResize);\n // Capture phase: AstralModal/AstralDrawer panels stopPropagation on mousedown,\n // which would otherwise block this outside-click close when the overlay lives inside one.\n document.addEventListener('mousedown', onDoc, true);\n return () => {\n window.removeEventListener('scroll', onScroll, true);\n window.removeEventListener('resize', onResize);\n document.removeEventListener('mousedown', onDoc, true);\n };\n }, [open, reposition]);\n\n return (\n <>\n <div className=\"au-menu-anchor\" ref={anchorRef} onClick={() => setOpen(o => !o)}>\n {trigger}\n </div>\n {open && pos && createPortal(\n <div ref={menuRef} className=\"au-menu\" style={{ left: pos.left, top: pos.top, bottom: pos.bottom, minWidth: pos.minWidth, maxHeight: pos.maxHeight }}>\n {items.map((it, i) => it.divider\n ? <div key={it.key ?? `d${i}`} className=\"au-menu-divider\" />\n : (\n <button type=\"button\" key={it.key ?? i} className={`au-menu-item${it.danger ? ' danger' : ''}`} disabled={it.disabled}\n onClick={() => { setOpen(false); it.onClick?.(); }}>\n {it.icon && <span className=\"au-menu-ic\">{it.icon}</span>}\n <span className=\"au-menu-label\">{it.label}</span>\n </button>\n ))}\n </div>,\n document.body,\n )}\n </>\n );\n}\n","import { useSyncExternalStore } from 'react';\nimport type { ReactNode, CSSProperties } from 'react';\nimport { createPortal } from 'react-dom';\nimport { IconX, IconCheck, IconAlertTriangle, IconInfoCircle, IconExclamationCircle } from '@tabler/icons-react';\n\n/* AstralUI toast system. The `notifications` object (show/update/hide/clean, returns\n an id) is a small imperative store; <AstralToaster/> renders the live toasts and is\n mounted once at the app root. Theme-aware via the --astral-* tokens. */\n\nexport interface ToastOptions {\n id?: string;\n title?: ReactNode;\n message?: ReactNode;\n color?: string;\n icon?: ReactNode;\n loading?: boolean;\n autoClose?: number | false;\n withCloseButton?: boolean;\n onClose?: () => void;\n /** accepted for API compatibility; the toaster uses one global position */\n position?: string;\n /** tolerate any other notification prop a call site may pass (radius, withBorder, style, ...) */\n [key: string]: unknown;\n}\n\ninterface Toast extends ToastOptions { id: string; }\n\nlet toasts: Toast[] = [];\nconst listeners = new Set<() => void>();\nconst timers = new Map<string, ReturnType<typeof setTimeout>>();\nlet counter = 0;\n\nconst emit = () => listeners.forEach(l => l());\n\nfunction clearTimer(id: string) {\n const x = timers.get(id);\n if (x) { clearTimeout(x); timers.delete(id); }\n}\n\nfunction scheduleAutoClose(t: Toast) {\n clearTimer(t.id);\n if (t.autoClose === false || t.loading) return; // loading toasts stay until updated\n const ms = typeof t.autoClose === 'number' ? t.autoClose : 4000;\n timers.set(t.id, setTimeout(() => hide(t.id), ms));\n}\n\nfunction show(opts: ToastOptions): string {\n const id = opts.id ?? `toast-${++counter}`;\n const existing = toasts.find(t => t.id === id);\n const toast: Toast = { withCloseButton: true, ...existing, ...opts, id };\n toasts = existing ? toasts.map(t => (t.id === id ? toast : t)) : [...toasts, toast];\n emit();\n scheduleAutoClose(toast);\n return id;\n}\n\nfunction update(opts: ToastOptions): string {\n if (!opts.id) return show(opts);\n const existing = toasts.find(t => t.id === opts.id);\n if (!existing) return show(opts);\n const toast: Toast = { ...existing, ...opts, id: opts.id };\n toasts = toasts.map(t => (t.id === opts.id ? toast : t));\n emit();\n scheduleAutoClose(toast);\n return opts.id;\n}\n\nfunction hide(id: string) {\n const t = toasts.find(x => x.id === id);\n clearTimer(id);\n toasts = toasts.filter(x => x.id !== id);\n emit();\n t?.onClose?.();\n}\n\nfunction clean() {\n toasts.forEach(t => clearTimer(t.id));\n toasts = [];\n emit();\n}\n\nexport const notifications = { show, update, hide, clean };\n\n/* ── Rendering ── */\n\nconst subscribe = (cb: () => void) => { listeners.add(cb); return () => { listeners.delete(cb); }; };\nconst getSnapshot = () => toasts;\n\nconst DEFAULT_ICON: Record<string, ReactNode> = {\n green: <IconCheck size={16} />,\n teal: <IconCheck size={16} />,\n red: <IconExclamationCircle size={16} />,\n orange: <IconAlertTriangle size={16} />,\n yellow: <IconAlertTriangle size={16} />,\n};\n\nfunction Spinner() {\n return <span className=\"au-toast-spin\" />;\n}\n\nfunction ToastCard({ t }: { t: Toast }) {\n const accent = t.color ? `var(--astral-color-${t.color}-6)` : 'var(--astral-color-default-border)';\n const lead = t.loading\n ? <Spinner />\n : t.icon\n ? t.icon\n : (t.color && DEFAULT_ICON[t.color]) || <IconInfoCircle size={16} />;\n return (\n <div className=\"au-toast\" style={{ ['--au-toast-accent' as string]: accent } as CSSProperties} role=\"status\">\n <span className=\"au-toast-lead\">{lead}</span>\n <div className=\"au-toast-body\">\n {t.title && <div className=\"au-toast-title\">{t.title}</div>}\n {t.message != null && <div className=\"au-toast-msg\">{t.message}</div>}\n </div>\n {t.withCloseButton !== false && (\n <button type=\"button\" className=\"au-toast-x\" onClick={() => hide(t.id)} aria-label=\"Close\"><IconX size={14} /></button>\n )}\n </div>\n );\n}\n\nexport function AstralToaster() {\n const items = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n if (typeof document === 'undefined') return null;\n return createPortal(\n <div className=\"au-toast-host\" role=\"region\" aria-live=\"polite\" aria-label=\"Notifications\">\n {items.map(t => <ToastCard key={t.id} t={t} />)}\n </div>,\n document.body,\n );\n}\n","import { useState, useEffect } from 'react';\nimport type { CSSProperties } from 'react';\n\n/* Native <input type=\"date\" | \"datetime-local\"> that mirrors exactly what the user\n types and only commits a parsed Date upward once the string is a COMPLETE, plausible\n value. A fully-controlled date input that round-trips every keystroke through\n `new Date(y, m-1, d)` hits JS's 0-99 -> 1900s year remap mid-typing (so \"2\" -> 1902),\n and the reformatted value fights the user's typing into a re-render storm that freezes\n the page. Keeping the string local and gating the commit avoids that entirely.\n `color-scheme` is left to inherit so the native calendar glyph follows the app theme. */\n\nconst pad2 = (n: number) => String(n).padStart(2, '0');\nconst pad4 = (n: number) => String(n).padStart(4, '0');\n\n/** Date -> \"YYYY-MM-DD\" (local) */\nexport function dateToInputStr(d: Date | null): string {\n if (!d || isNaN(d.getTime())) return '';\n return `${pad4(d.getFullYear())}-${pad2(d.getMonth() + 1)}-${pad2(d.getDate())}`;\n}\n\n/** Date -> \"YYYY-MM-DDTHH:mm\" (local) */\nexport function dateTimeToInputStr(d: Date | null): string {\n if (!d || isNaN(d.getTime())) return '';\n return `${dateToInputStr(d)}T${pad2(d.getHours())}:${pad2(d.getMinutes())}`;\n}\n\ninterface Props {\n type?: 'date' | 'datetime-local';\n value: Date | null;\n onChange: (d: Date | null) => void;\n min?: Date;\n max?: Date;\n className?: string;\n style?: CSSProperties;\n disabled?: boolean;\n 'aria-label'?: string;\n}\n\nexport default function DateInput({ type = 'date', value, onChange, min, max, className, style, disabled, 'aria-label': ariaLabel }: Props) {\n const isTime = type === 'datetime-local';\n const fmt = isTime ? dateTimeToInputStr : dateToInputStr;\n const [s, setS] = useState(() => fmt(value));\n // Re-sync from the parent (preset buttons, programmatic clears) without fighting typing.\n const t = value?.getTime();\n useEffect(() => { setS(fmt(value)); }, [t]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const handle = (str: string) => {\n setS(str);\n if (str === '') { onChange(null); return; }\n const m = (isTime ? /^(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2})$/ : /^(\\d{4})-(\\d{2})-(\\d{2})$/).exec(str);\n if (!m) return; // incomplete - hold locally, don't commit\n const y = Number(m[1]);\n if (y < 1970 || y > 2100) return; // implausible (mid-typed) year - wait for a full one\n const d = isTime\n ? new Date(y, Number(m[2]) - 1, Number(m[3]), Number(m[4]), Number(m[5]))\n : new Date(y, Number(m[2]) - 1, Number(m[3]));\n if (isNaN(d.getTime())) return;\n onChange(d);\n };\n\n return (\n <input\n type={type}\n className={className}\n style={style}\n disabled={disabled}\n aria-label={ariaLabel}\n value={s}\n min={min ? fmt(min) : undefined}\n max={max ? fmt(max) : undefined}\n onChange={e => handle(e.currentTarget.value)}\n />\n );\n}\n","import type { CSSProperties } from 'react';\n\n/* Minimal theme-aware spinner. Styled by the .au-spinner class (in tokens.css);\n size via the `size` prop (px). */\nexport function Spinner({ size = 24, className, style }: { size?: number; className?: string; style?: CSSProperties }) {\n return (\n <span\n className={className ? `au-spinner ${className}` : 'au-spinner'}\n style={{ width: size, height: size, ...style }}\n role=\"status\"\n aria-label=\"Loading\"\n />\n );\n}\n","import type { ReactNode, CSSProperties } from 'react';\n\ninterface BackgroundProps {\n /** Content rendered above the backdrop (it becomes the positioning context). */\n children?: ReactNode;\n className?: string;\n style?: CSSProperties;\n /** Pin to the viewport (position:fixed, inset:0) instead of filling the parent. */\n fixed?: boolean;\n}\n\nfunction cls(base: string, extra?: string) {\n return extra ? `${base} ${extra}` : base;\n}\n\n/** Animated cosmic backdrop with a twinkling starfield. Great for auth screens,\n * heroes, or splash pages. Wrap your content as children. */\nexport function SpaceBackground({ children, className, style, fixed }: BackgroundProps) {\n const s: CSSProperties = fixed ? { position: 'fixed', inset: 0, ...style } : style ?? {};\n return (\n <div className={cls('astral-space-bg', className)} style={s}>\n <div className=\"astral-stars\" aria-hidden=\"true\" />\n {children}\n </div>\n );\n}\n\n/** Subtle technical grid backdrop with a brand-tinted radial glow, faded toward\n * the edges with a radial mask. */\nexport function GridBackground({ children, className, style, fixed }: BackgroundProps) {\n const s: CSSProperties = fixed ? { position: 'fixed', inset: 0, ...style } : style ?? {};\n return (\n <div className={cls('astral-grid-bg', className)} style={s}>\n {children}\n </div>\n );\n}\n"]}
package/dist/index.d.cts CHANGED
@@ -147,4 +147,19 @@ declare function Spinner({ size, className, style }: {
147
147
  style?: CSSProperties;
148
148
  }): react.JSX.Element;
149
149
 
150
- export { AstralDrawer, AstralMenu, type AstralMenuItem, AstralModal, AstralPinInput, AstralSelect, type AstralSelectOption, type AstralThemeColors, AstralThemeProvider, AstralToaster, type ColorScheme, ColorSchemeProvider, DateInput, Spinner, type ToastOptions, buildOrgCss, dateTimeToInputStr, dateToInputStr, generateColors, notifications, useColorScheme, useThemePreview };
150
+ interface BackgroundProps {
151
+ /** Content rendered above the backdrop (it becomes the positioning context). */
152
+ children?: ReactNode;
153
+ className?: string;
154
+ style?: CSSProperties;
155
+ /** Pin to the viewport (position:fixed, inset:0) instead of filling the parent. */
156
+ fixed?: boolean;
157
+ }
158
+ /** Animated cosmic backdrop with a twinkling starfield. Great for auth screens,
159
+ * heroes, or splash pages. Wrap your content as children. */
160
+ declare function SpaceBackground({ children, className, style, fixed }: BackgroundProps): react.JSX.Element;
161
+ /** Subtle technical grid backdrop with a brand-tinted radial glow, faded toward
162
+ * the edges with a radial mask. */
163
+ declare function GridBackground({ children, className, style, fixed }: BackgroundProps): react.JSX.Element;
164
+
165
+ export { AstralDrawer, AstralMenu, type AstralMenuItem, AstralModal, AstralPinInput, AstralSelect, type AstralSelectOption, type AstralThemeColors, AstralThemeProvider, AstralToaster, type ColorScheme, ColorSchemeProvider, DateInput, GridBackground, SpaceBackground, Spinner, type ToastOptions, buildOrgCss, dateTimeToInputStr, dateToInputStr, generateColors, notifications, useColorScheme, useThemePreview };
package/dist/index.d.ts CHANGED
@@ -147,4 +147,19 @@ declare function Spinner({ size, className, style }: {
147
147
  style?: CSSProperties;
148
148
  }): react.JSX.Element;
149
149
 
150
- export { AstralDrawer, AstralMenu, type AstralMenuItem, AstralModal, AstralPinInput, AstralSelect, type AstralSelectOption, type AstralThemeColors, AstralThemeProvider, AstralToaster, type ColorScheme, ColorSchemeProvider, DateInput, Spinner, type ToastOptions, buildOrgCss, dateTimeToInputStr, dateToInputStr, generateColors, notifications, useColorScheme, useThemePreview };
150
+ interface BackgroundProps {
151
+ /** Content rendered above the backdrop (it becomes the positioning context). */
152
+ children?: ReactNode;
153
+ className?: string;
154
+ style?: CSSProperties;
155
+ /** Pin to the viewport (position:fixed, inset:0) instead of filling the parent. */
156
+ fixed?: boolean;
157
+ }
158
+ /** Animated cosmic backdrop with a twinkling starfield. Great for auth screens,
159
+ * heroes, or splash pages. Wrap your content as children. */
160
+ declare function SpaceBackground({ children, className, style, fixed }: BackgroundProps): react.JSX.Element;
161
+ /** Subtle technical grid backdrop with a brand-tinted radial glow, faded toward
162
+ * the edges with a radial mask. */
163
+ declare function GridBackground({ children, className, style, fixed }: BackgroundProps): react.JSX.Element;
164
+
165
+ export { AstralDrawer, AstralMenu, type AstralMenuItem, AstralModal, AstralPinInput, AstralSelect, type AstralSelectOption, type AstralThemeColors, AstralThemeProvider, AstralToaster, type ColorScheme, ColorSchemeProvider, DateInput, GridBackground, SpaceBackground, Spinner, type ToastOptions, buildOrgCss, dateTimeToInputStr, dateToInputStr, generateColors, notifications, useColorScheme, useThemePreview };
package/dist/index.js CHANGED
@@ -593,7 +593,21 @@ function Spinner2({ size = 24, className, style }) {
593
593
  }
594
594
  );
595
595
  }
596
+ function cls(base, extra) {
597
+ return extra ? `${base} ${extra}` : base;
598
+ }
599
+ function SpaceBackground({ children, className, style, fixed }) {
600
+ const s = fixed ? { position: "fixed", inset: 0, ...style } : style ?? {};
601
+ return /* @__PURE__ */ jsxs("div", { className: cls("astral-space-bg", className), style: s, children: [
602
+ /* @__PURE__ */ jsx("div", { className: "astral-stars", "aria-hidden": "true" }),
603
+ children
604
+ ] });
605
+ }
606
+ function GridBackground({ children, className, style, fixed }) {
607
+ const s = fixed ? { position: "fixed", inset: 0, ...style } : style ?? {};
608
+ return /* @__PURE__ */ jsx("div", { className: cls("astral-grid-bg", className), style: s, children });
609
+ }
596
610
 
597
- export { AstralDrawer, AstralMenu, AstralModal, AstralPinInput, AstralSelect, AstralThemeProvider, AstralToaster, ColorSchemeProvider, DateInput, Spinner2 as Spinner, buildOrgCss, dateTimeToInputStr, dateToInputStr, generateColors, notifications, useColorScheme, useThemePreview };
611
+ export { AstralDrawer, AstralMenu, AstralModal, AstralPinInput, AstralSelect, AstralThemeProvider, AstralToaster, ColorSchemeProvider, DateInput, GridBackground, SpaceBackground, Spinner2 as Spinner, buildOrgCss, dateTimeToInputStr, dateToInputStr, generateColors, notifications, useColorScheme, useThemePreview };
598
612
  //# sourceMappingURL=index.js.map
599
613
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/theme/ColorSchemeProvider.tsx","../src/theme/generateColors.ts","../src/theme/AstralProvider.tsx","../src/components/overlay.tsx","../src/components/Toast.tsx","../src/components/DateInput.tsx","../src/components/Spinner.tsx"],"names":["createContext","useContext","useState","useCallback","jsx","useEffect","jsxs","clean","IconX","createPortal","Spinner"],"mappings":"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","file":"index.js","sourcesContent":["import { createContext, useContext, useState, useEffect, useCallback } from 'react';\nimport type { ReactNode } from 'react';\n\n/* Light/dark control. Owns the color scheme, persists it to localStorage, and sets\n `data-astral-scheme` + `color-scheme` on <html> - which the AstralUI tokens (and\n every `light-dark()`) key off. The sole source of truth for the active scheme. */\n\nexport type ColorScheme = 'light' | 'dark';\n\ninterface ColorSchemeContextType {\n colorScheme: ColorScheme;\n setColorScheme: (scheme: ColorScheme) => void;\n toggle: () => void;\n}\n\nconst ColorSchemeContext = createContext<ColorSchemeContextType>({\n colorScheme: 'dark',\n setColorScheme: () => {},\n toggle: () => {},\n});\n\ninterface ColorSchemeProviderProps {\n children: ReactNode;\n /** Initial scheme when nothing is persisted yet. Default 'dark'. */\n defaultScheme?: ColorScheme;\n /** localStorage key for persistence. Default 'astral-color-scheme'. */\n storageKey?: string;\n}\n\nexport function ColorSchemeProvider({ children, defaultScheme = 'dark', storageKey = 'astral-color-scheme' }: ColorSchemeProviderProps) {\n const [colorScheme, setScheme] = useState<ColorScheme>(() => {\n try {\n const v = localStorage.getItem(storageKey);\n if (v === 'light' || v === 'dark') return v;\n } catch { /* ignore */ }\n return defaultScheme;\n });\n\n useEffect(() => {\n const root = document.documentElement;\n root.setAttribute('data-astral-scheme', colorScheme);\n root.style.colorScheme = colorScheme;\n }, [colorScheme]);\n\n const setColorScheme = useCallback((scheme: ColorScheme) => {\n try { localStorage.setItem(storageKey, scheme); } catch { /* ignore */ }\n setScheme(scheme);\n }, [storageKey]);\n\n const toggle = useCallback(() => {\n setScheme(prev => {\n const next = prev === 'dark' ? 'light' : 'dark';\n try { localStorage.setItem(storageKey, next); } catch { /* ignore */ }\n return next;\n });\n }, [storageKey]);\n\n return (\n <ColorSchemeContext.Provider value={{ colorScheme, setColorScheme, toggle }}>\n {children}\n </ColorSchemeContext.Provider>\n );\n}\n\nexport function useColorScheme() {\n return useContext(ColorSchemeContext);\n}\n","import chroma from 'chroma-js';\n\n/* Produces a 10-shade palette from a single hex, using fixed lightness/saturation\n maps and chroma-js LCH math. Used by AstralThemeProvider to turn an org's chosen\n brand color into a full palette. */\n\nconst LIGHTNESS_MAP = [0.96, 0.907, 0.805, 0.697, 0.605, 0.547, 0.518, 0.445, 0.395, 0.34];\nconst SATURATION_MAP = [0.32, 0.16, 0.08, 0.04, 0, 0, 0.04, 0.08, 0.16, 0.32];\n\nfunction getClosestLightness(colorObject: chroma.Color): number {\n const lightnessGoal = colorObject.get('hsl.l');\n return LIGHTNESS_MAP.reduce((prev, curr) =>\n Math.abs(curr - lightnessGoal) < Math.abs(prev - lightnessGoal) ? curr : prev,\n );\n}\n\nexport function generateColors(color: string): string[] {\n const colorObject = chroma(color);\n const closestLightness = getClosestLightness(colorObject);\n const baseColorIndex = LIGHTNESS_MAP.findIndex((l) => l === closestLightness);\n\n const colors = LIGHTNESS_MAP\n .map((l) => colorObject.set('hsl.l', l))\n .map((c) => chroma(c))\n .map((c, i) => {\n const saturationDelta = SATURATION_MAP[i] - SATURATION_MAP[baseColorIndex];\n return saturationDelta >= 0 ? c.saturate(saturationDelta) : c.desaturate(saturationDelta * -1);\n });\n\n colors[baseColorIndex] = chroma(color);\n return colors.map((c) => c.hex());\n}\n","import { useMemo, useState, useCallback, createContext, useContext } from 'react';\nimport type { ReactNode } from 'react';\nimport { generateColors } from './generateColors';\n\n/* Per-org / per-brand theming. Computes the brand palette + surface overrides and\n injects them as a runtime <style> that overrides the base --astral-* tokens\n (from tokens.css) per scheme. Selectors use html:root[data-astral-scheme=\"...\"]\n (specificity 0,2,1, so they win over the :root base tokens). No colors -> empty\n style -> base tokens. Prop-driven (no app coupling): pass the brand colors in. */\n\n/* ── Color preview context (live editing) ── */\n\nexport interface AstralThemeColors {\n primary_color?: string | null;\n background_color?: string | null;\n card_color?: string | null;\n navbar_color?: string | null;\n font_color?: string | null;\n light_primary_color?: string | null;\n light_background_color?: string | null;\n light_card_color?: string | null;\n light_navbar_color?: string | null;\n light_font_color?: string | null;\n}\n\ninterface ThemePreviewContextType {\n preview: AstralThemeColors | null;\n setPreview: (colors: AstralThemeColors | null) => void;\n}\n\nconst ThemePreviewContext = createContext<ThemePreviewContextType>({\n preview: null,\n setPreview: () => {},\n});\n\nexport function useThemePreview() {\n return useContext(ThemePreviewContext);\n}\n\n/* ── Helpers ── */\n\nconst HEX_RE = /^#[0-9a-f]{6}$/i;\nconst isValidHex = (v: string | null | undefined): v is string => !!v && HEX_RE.test(v);\n\nfunction adjustHex(hex: string, amount: number): string {\n const c = hex.replace('#', '');\n const r = Math.max(0, Math.min(255, parseInt(c.substring(0, 2), 16) + amount));\n const g = Math.max(0, Math.min(255, parseInt(c.substring(2, 4), 16) + amount));\n const b = Math.max(0, Math.min(255, parseInt(c.substring(4, 6), 16) + amount));\n return `#${r.toString(16).padStart(2, '0')}${g.toString(16).padStart(2, '0')}${b.toString(16).padStart(2, '0')}`;\n}\n\nfunction hexToRgba(hex: string, alpha: number): string {\n const c = hex.replace('#', '');\n const r = parseInt(c.substring(0, 2), 16);\n const g = parseInt(c.substring(2, 4), 16);\n const b = parseInt(c.substring(4, 6), 16);\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n}\n\n/* primaryShade is { light: 6, dark: 8 }; -light is the shade-6 color at .1/.15 alpha\n (.12/.2 hovered); -light-color is shade 6 (light) / 3 (dark). Theme-level constants,\n identical for any palette. */\nfunction primaryVars(palette: string[], scheme: 'light' | 'dark'): string[] {\n if (scheme === 'light') {\n return [\n `--astral-primary-color-filled:${palette[6]}`,\n `--astral-primary-color-filled-hover:${palette[7]}`,\n `--astral-primary-color-light:${hexToRgba(palette[6], 0.1)}`,\n `--astral-primary-color-light-hover:${hexToRgba(palette[6], 0.12)}`,\n `--astral-primary-color-light-color:${palette[6]}`,\n ];\n }\n return [\n `--astral-primary-color-filled:${palette[8]}`,\n `--astral-primary-color-filled-hover:${palette[9]}`,\n `--astral-primary-color-light:${hexToRgba(palette[6], 0.15)}`,\n `--astral-primary-color-light-hover:${hexToRgba(palette[6], 0.2)}`,\n `--astral-primary-color-light-color:${palette[3]}`,\n ];\n}\n\nfunction safeGenerate(hex: string): string[] | null {\n try { return generateColors(hex) as unknown as string[]; } catch { return null; }\n}\n\nexport function buildOrgCss(src: AstralThemeColors): string {\n const brand = isValidHex(src.primary_color) ? safeGenerate(src.primary_color!) : null;\n const lightBrand = isValidHex(src.light_primary_color) ? safeGenerate(src.light_primary_color!) : null;\n const lightPalette = lightBrand ?? brand; // light mode uses lightBrand, else falls back to brand\n const noDarkBrand = !brand; // the base accent palette is only overridden in light when no dark brand\n\n const vBg = isValidHex(src.background_color) ? src.background_color! : '';\n const vCard = isValidHex(src.card_color) ? src.card_color! : '';\n const vNav = isValidHex(src.navbar_color) ? src.navbar_color! : '';\n const vFont = isValidHex(src.font_color) ? src.font_color! : '';\n const vLBg = isValidHex(src.light_background_color) ? src.light_background_color! : '';\n const vLCard = isValidHex(src.light_card_color) ? src.light_card_color! : '';\n const vLNav = isValidHex(src.light_navbar_color) ? src.light_navbar_color! : '';\n const vLFont = isValidHex(src.light_font_color) ? src.light_font_color! : '';\n\n const dark: string[] = [];\n const light: string[] = [];\n\n /* ── dark scheme ── */\n if (brand) dark.push(...primaryVars(brand, 'dark'));\n if (vFont) {\n // dark palette: dark-0 = primary text; the dark text token mirrors dark-0.\n dark.push(`--astral-color-dark-0:${vFont}`, `--astral-color-dark-1:${adjustHex(vFont, -30)}`, `--astral-color-dark-2:${adjustHex(vFont, -60)}`, `--astral-color-text:${vFont}`);\n }\n if (vCard) dark.push(`--astral-color-dark-6:${vCard}`);\n if (vBg) dark.push(`--astral-color-dark-7:${vBg}`, `--astral-color-dark-9:${adjustHex(vBg, -10)}`, `--astral-color-body:${vBg}`, `--astral-app-bg:${vBg}`);\n if (vNav) dark.push(`--astral-color-dark-8:${vNav}`, `--astral-app-nav:${vNav}`);\n if (vCard) dark.push(`--astral-app-card:${vCard}`);\n\n /* ── light scheme ── */\n if (lightBrand && noDarkBrand) {\n // only-light-primary: override the base accent (violet) palette so accent-derived\n // tokens (e.g. brand-text) follow the light primary in light mode.\n for (let i = 0; i < 10; i++) light.push(`--astral-color-violet-${i}:${lightBrand[i]}`);\n }\n if (lightPalette) light.push(...primaryVars(lightPalette, 'light'));\n if (vLFont) light.push(`--astral-color-text:${vLFont}`);\n if (vLBg) light.push(`--astral-app-bg:${vLBg}`);\n if (vLNav) light.push(`--astral-app-nav:${vLNav}`);\n if (vLCard) light.push(`--astral-app-card:${vLCard}`);\n\n let css = '';\n if (dark.length) css += `html:root[data-astral-scheme=\"dark\"]{${dark.join(';')}}`;\n if (light.length) css += `html:root[data-astral-scheme=\"light\"]{${light.join(';')}}`;\n return css;\n}\n\n/* ── Provider ──\n Pass the brand colors via `colors`. While editing, call setPreview() (from\n useThemePreview) with partial colors for an instant live preview. */\n\nexport function AstralThemeProvider({ colors, children }: { colors?: AstralThemeColors | null; children: ReactNode }) {\n const [preview, setPreview] = useState<AstralThemeColors | null>(null);\n\n const stableSetPreview = useCallback((c: AstralThemeColors | null) => {\n setPreview(c);\n }, []);\n\n const effective: AstralThemeColors | null = preview\n ? { ...(colors ?? {}), ...preview }\n : (colors ?? null);\n\n const orgCss = useMemo(\n () => (effective ? buildOrgCss(effective) : ''),\n [effective ? JSON.stringify(effective) : ''],\n );\n\n return (\n <ThemePreviewContext.Provider value={{ preview, setPreview: stableSetPreview }}>\n <style data-astral-theme>{orgCss}</style>\n {children}\n </ThemePreviewContext.Provider>\n );\n}\n","import { useCallback, useEffect, useRef, useState, type ReactNode, type CSSProperties, type KeyboardEvent as ReactKeyboardEvent } from 'react';\nimport { createPortal } from 'react-dom';\nimport { IconX, IconChevronDown } from '@tabler/icons-react';\n\nfunction useDismiss(opened: boolean, onClose: () => void) {\n useEffect(() => {\n if (!opened) return;\n const onKey = (e: KeyboardEvent) => { if (e.key === 'Escape') onClose(); };\n document.addEventListener('keydown', onKey);\n const prev = document.body.style.overflow;\n document.body.style.overflow = 'hidden';\n return () => { document.removeEventListener('keydown', onKey); document.body.style.overflow = prev; };\n }, [opened, onClose]);\n}\n\ninterface ShellProps {\n opened: boolean;\n onClose: () => void;\n title: ReactNode;\n brand?: string;\n width?: number;\n /** Override the overlay z-index (default 300). Use to stack over flow-editor modals. */\n zIndex?: number;\n children: ReactNode;\n}\n\n/** Centered Astral modal (portal + overlay + escape + click-outside). */\nexport function AstralModal({ opened, onClose, title, brand, width = 460, zIndex, children }: ShellProps) {\n useDismiss(opened, onClose);\n if (!opened) return null;\n const style = { maxWidth: width, ...(brand ? { '--au-ic': brand } : {}) } as CSSProperties;\n return createPortal(\n <div className=\"au-modal-overlay\" onMouseDown={onClose} style={zIndex != null ? { zIndex } : undefined}>\n <div className=\"au-modal-panel\" style={style} onMouseDown={(e) => e.stopPropagation()}>\n <div className=\"au-modal-head\">\n <span className=\"au-modal-title\">{title}</span>\n <button type=\"button\" className=\"au-modal-x\" onClick={onClose} aria-label=\"Close\"><IconX /></button>\n </div>\n <div className=\"au-modal-body\">{children}</div>\n </div>\n </div>,\n document.body,\n );\n}\n\n/** Right-side Astral drawer. */\nexport function AstralDrawer({ opened, onClose, title, brand, width = 440, zIndex, children }: ShellProps) {\n useDismiss(opened, onClose);\n if (!opened) return null;\n const style = { width, ...(brand ? { '--au-ic': brand } : {}) } as CSSProperties;\n return createPortal(\n <div className=\"au-drawer-overlay\" onMouseDown={onClose} style={zIndex != null ? { zIndex } : undefined}>\n <div className=\"au-drawer-panel\" style={style} onMouseDown={(e) => e.stopPropagation()}>\n <div className=\"au-drawer-head\">\n <span className=\"au-drawer-title\">{title}</span>\n <button type=\"button\" className=\"au-modal-x\" onClick={onClose} aria-label=\"Close\"><IconX /></button>\n </div>\n <div className=\"au-drawer-body\">{children}</div>\n </div>\n </div>,\n document.body,\n );\n}\n\n/** Astral 6-box code input, with auto-advance, backspace, paste and arrows. */\nexport function AstralPinInput({ length = 6, value, onChange, autoFocus }: {\n length?: number;\n value: string;\n onChange: (value: string) => void;\n autoFocus?: boolean;\n}) {\n const refs = useRef<Array<HTMLInputElement | null>>([]);\n const digits = Array.from({ length }, (_, i) => value[i] ?? '');\n\n const focusBox = (i: number) => { refs.current[Math.max(0, Math.min(length - 1, i))]?.focus(); };\n\n const handleChange = (i: number, raw: string) => {\n const clean = raw.replace(/\\D/g, '');\n if (!clean) return;\n const arr = value.split('');\n let pos = i;\n for (const ch of clean) {\n if (pos >= length) break;\n arr[pos] = ch;\n pos++;\n }\n onChange(arr.join('').slice(0, length));\n focusBox(pos);\n };\n\n const handleKeyDown = (i: number, e: ReactKeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Backspace') {\n e.preventDefault();\n const arr = value.split('');\n if (arr[i]) {\n arr[i] = '';\n onChange(arr.join(''));\n } else if (i > 0) {\n arr[i - 1] = '';\n onChange(arr.join(''));\n focusBox(i - 1);\n }\n } else if (e.key === 'ArrowLeft') {\n e.preventDefault();\n focusBox(i - 1);\n } else if (e.key === 'ArrowRight') {\n e.preventDefault();\n focusBox(i + 1);\n }\n };\n\n return (\n <div className=\"au-pin\">\n {digits.map((d, i) => (\n <input\n key={i}\n ref={(el) => { refs.current[i] = el; }}\n className=\"au-pin-box\"\n inputMode=\"numeric\"\n autoComplete=\"one-time-code\"\n aria-label={`Digit ${i + 1}`}\n value={d}\n autoFocus={autoFocus && i === 0}\n onChange={(e) => handleChange(i, e.currentTarget.value)}\n onKeyDown={(e) => handleKeyDown(i, e)}\n onFocus={(e) => e.currentTarget.select()}\n />\n ))}\n </div>\n );\n}\n\nexport interface AstralSelectOption { value: string; label: string; }\n\n/** Astral select with optional search/create/clear - combobox. */\nexport function AstralSelect({ value, onChange, options, placeholder, disabled, searchable, searchPlaceholder, noResults, clearable, creatable }: {\n value: string | null;\n onChange: (value: string) => void;\n options: AstralSelectOption[];\n placeholder?: string;\n disabled?: boolean;\n searchable?: boolean;\n searchPlaceholder?: string;\n noResults?: string;\n clearable?: boolean;\n creatable?: boolean;\n}) {\n const [open, setOpen] = useState(false);\n const [q, setQ] = useState('');\n const triggerRef = useRef<HTMLButtonElement>(null);\n const menuRef = useRef<HTMLDivElement>(null);\n const [pos, setPos] = useState<{ left: number; top?: number; bottom?: number; width: number; maxHeight: number } | null>(null);\n\n const reposition = useCallback(() => {\n const el = triggerRef.current;\n if (!el) return;\n const r = el.getBoundingClientRect();\n const spaceBelow = window.innerHeight - r.bottom - 12;\n const spaceAbove = r.top - 12;\n const flipUp = spaceBelow < 200 && spaceAbove > spaceBelow;\n setPos({\n left: r.left,\n width: r.width,\n ...(flipUp\n ? { bottom: window.innerHeight - r.top + 5, maxHeight: Math.max(140, Math.min(300, spaceAbove)) }\n : { top: r.bottom + 5, maxHeight: Math.max(140, Math.min(300, spaceBelow)) }),\n });\n }, []);\n\n useEffect(() => {\n if (!open) return;\n reposition();\n const onScroll = () => reposition();\n const onResize = () => setOpen(false);\n const onDoc = (e: MouseEvent) => {\n if (triggerRef.current?.contains(e.target as Node)) return;\n if (menuRef.current?.contains(e.target as Node)) return;\n setOpen(false);\n };\n window.addEventListener('scroll', onScroll, true);\n window.addEventListener('resize', onResize);\n // Capture phase: AstralModal/AstralDrawer panels stopPropagation on mousedown,\n // which would otherwise block this outside-click close when the overlay lives inside one.\n document.addEventListener('mousedown', onDoc, true);\n return () => {\n window.removeEventListener('scroll', onScroll, true);\n window.removeEventListener('resize', onResize);\n document.removeEventListener('mousedown', onDoc, true);\n };\n }, [open, reposition]);\n\n const selected = options.find(o => o.value === value);\n const hasValue = value != null && value !== '';\n const display = selected ? selected.label : (value ?? '');\n const filtered = searchable && q.trim()\n ? options.filter(o => o.label.toLowerCase().includes(q.trim().toLowerCase()))\n : options;\n const showCreate = !!creatable && !!q.trim() && !options.some(o => o.label.toLowerCase() === q.trim().toLowerCase());\n\n return (\n <div className=\"au-select\">\n <button ref={triggerRef} type=\"button\" className=\"au-input au-select-trigger\" disabled={disabled} onClick={() => setOpen(o => !o)}>\n <span className={hasValue ? '' : 'ph'}>{hasValue ? display : placeholder}</span>\n {clearable && hasValue ? (\n <span className=\"au-select-caret au-select-clear\" role=\"button\" tabIndex={-1}\n onClick={(e) => { e.stopPropagation(); onChange(''); }}><IconX size={14} /></span>\n ) : (\n <IconChevronDown size={15} className=\"au-select-caret\" />\n )}\n </button>\n {open && !disabled && pos && createPortal(\n <div\n ref={menuRef}\n className=\"au-select-menu\"\n style={{ left: pos.left, top: pos.top, bottom: pos.bottom, width: pos.width, maxHeight: pos.maxHeight }}\n >\n {searchable && (\n <input\n autoFocus\n className=\"au-select-search\"\n placeholder={searchPlaceholder}\n value={q}\n onChange={(e) => setQ(e.currentTarget.value)}\n />\n )}\n {filtered.length === 0 && !showCreate && <div className=\"au-select-empty\">{noResults}</div>}\n {filtered.map(o => (\n <button\n type=\"button\"\n key={o.value}\n className={`au-select-opt${o.value === value ? ' on' : ''}`}\n onClick={() => { onChange(o.value); setOpen(false); setQ(''); }}\n >\n {o.label}\n </button>\n ))}\n {showCreate && (\n <button type=\"button\" className=\"au-select-opt au-select-create\"\n onClick={() => { onChange(q.trim()); setOpen(false); setQ(''); }}>\n + {q.trim()}\n </button>\n )}\n </div>,\n document.body,\n )}\n </div>\n );\n}\n\nexport interface AstralMenuItem { key?: string; label: ReactNode; icon?: ReactNode; onClick?: () => void; danger?: boolean; divider?: boolean; disabled?: boolean; }\n\n/** Astral action-menu dropdown - portalled like AstralSelect. */\nexport function AstralMenu({ trigger, items, align = 'end', width = 220 }: {\n trigger: ReactNode;\n items: AstralMenuItem[];\n align?: 'start' | 'end';\n width?: number;\n}) {\n const [open, setOpen] = useState(false);\n const anchorRef = useRef<HTMLDivElement>(null);\n const menuRef = useRef<HTMLDivElement>(null);\n const [pos, setPos] = useState<{ left: number; top?: number; bottom?: number; minWidth: number; maxHeight: number } | null>(null);\n\n const reposition = useCallback(() => {\n const el = anchorRef.current;\n if (!el) return;\n const r = el.getBoundingClientRect();\n const spaceBelow = window.innerHeight - r.bottom - 12;\n const spaceAbove = r.top - 12;\n const flipUp = spaceBelow < 220 && spaceAbove > spaceBelow;\n const left = align === 'end' ? Math.max(8, Math.min(r.right - width, window.innerWidth - width - 8)) : Math.min(r.left, window.innerWidth - width - 8);\n setPos({\n left,\n minWidth: width,\n ...(flipUp\n ? { bottom: window.innerHeight - r.top + 5, maxHeight: Math.max(160, Math.min(380, spaceAbove)) }\n : { top: r.bottom + 5, maxHeight: Math.max(160, Math.min(380, spaceBelow)) }),\n });\n }, [align, width]);\n\n useEffect(() => {\n if (!open) return;\n reposition();\n const onScroll = () => reposition();\n const onResize = () => setOpen(false);\n const onDoc = (e: MouseEvent) => {\n if (anchorRef.current?.contains(e.target as Node)) return;\n if (menuRef.current?.contains(e.target as Node)) return;\n setOpen(false);\n };\n window.addEventListener('scroll', onScroll, true);\n window.addEventListener('resize', onResize);\n // Capture phase: AstralModal/AstralDrawer panels stopPropagation on mousedown,\n // which would otherwise block this outside-click close when the overlay lives inside one.\n document.addEventListener('mousedown', onDoc, true);\n return () => {\n window.removeEventListener('scroll', onScroll, true);\n window.removeEventListener('resize', onResize);\n document.removeEventListener('mousedown', onDoc, true);\n };\n }, [open, reposition]);\n\n return (\n <>\n <div className=\"au-menu-anchor\" ref={anchorRef} onClick={() => setOpen(o => !o)}>\n {trigger}\n </div>\n {open && pos && createPortal(\n <div ref={menuRef} className=\"au-menu\" style={{ left: pos.left, top: pos.top, bottom: pos.bottom, minWidth: pos.minWidth, maxHeight: pos.maxHeight }}>\n {items.map((it, i) => it.divider\n ? <div key={it.key ?? `d${i}`} className=\"au-menu-divider\" />\n : (\n <button type=\"button\" key={it.key ?? i} className={`au-menu-item${it.danger ? ' danger' : ''}`} disabled={it.disabled}\n onClick={() => { setOpen(false); it.onClick?.(); }}>\n {it.icon && <span className=\"au-menu-ic\">{it.icon}</span>}\n <span className=\"au-menu-label\">{it.label}</span>\n </button>\n ))}\n </div>,\n document.body,\n )}\n </>\n );\n}\n","import { useSyncExternalStore } from 'react';\nimport type { ReactNode, CSSProperties } from 'react';\nimport { createPortal } from 'react-dom';\nimport { IconX, IconCheck, IconAlertTriangle, IconInfoCircle, IconExclamationCircle } from '@tabler/icons-react';\n\n/* AstralUI toast system. The `notifications` object (show/update/hide/clean, returns\n an id) is a small imperative store; <AstralToaster/> renders the live toasts and is\n mounted once at the app root. Theme-aware via the --astral-* tokens. */\n\nexport interface ToastOptions {\n id?: string;\n title?: ReactNode;\n message?: ReactNode;\n color?: string;\n icon?: ReactNode;\n loading?: boolean;\n autoClose?: number | false;\n withCloseButton?: boolean;\n onClose?: () => void;\n /** accepted for API compatibility; the toaster uses one global position */\n position?: string;\n /** tolerate any other notification prop a call site may pass (radius, withBorder, style, ...) */\n [key: string]: unknown;\n}\n\ninterface Toast extends ToastOptions { id: string; }\n\nlet toasts: Toast[] = [];\nconst listeners = new Set<() => void>();\nconst timers = new Map<string, ReturnType<typeof setTimeout>>();\nlet counter = 0;\n\nconst emit = () => listeners.forEach(l => l());\n\nfunction clearTimer(id: string) {\n const x = timers.get(id);\n if (x) { clearTimeout(x); timers.delete(id); }\n}\n\nfunction scheduleAutoClose(t: Toast) {\n clearTimer(t.id);\n if (t.autoClose === false || t.loading) return; // loading toasts stay until updated\n const ms = typeof t.autoClose === 'number' ? t.autoClose : 4000;\n timers.set(t.id, setTimeout(() => hide(t.id), ms));\n}\n\nfunction show(opts: ToastOptions): string {\n const id = opts.id ?? `toast-${++counter}`;\n const existing = toasts.find(t => t.id === id);\n const toast: Toast = { withCloseButton: true, ...existing, ...opts, id };\n toasts = existing ? toasts.map(t => (t.id === id ? toast : t)) : [...toasts, toast];\n emit();\n scheduleAutoClose(toast);\n return id;\n}\n\nfunction update(opts: ToastOptions): string {\n if (!opts.id) return show(opts);\n const existing = toasts.find(t => t.id === opts.id);\n if (!existing) return show(opts);\n const toast: Toast = { ...existing, ...opts, id: opts.id };\n toasts = toasts.map(t => (t.id === opts.id ? toast : t));\n emit();\n scheduleAutoClose(toast);\n return opts.id;\n}\n\nfunction hide(id: string) {\n const t = toasts.find(x => x.id === id);\n clearTimer(id);\n toasts = toasts.filter(x => x.id !== id);\n emit();\n t?.onClose?.();\n}\n\nfunction clean() {\n toasts.forEach(t => clearTimer(t.id));\n toasts = [];\n emit();\n}\n\nexport const notifications = { show, update, hide, clean };\n\n/* ── Rendering ── */\n\nconst subscribe = (cb: () => void) => { listeners.add(cb); return () => { listeners.delete(cb); }; };\nconst getSnapshot = () => toasts;\n\nconst DEFAULT_ICON: Record<string, ReactNode> = {\n green: <IconCheck size={16} />,\n teal: <IconCheck size={16} />,\n red: <IconExclamationCircle size={16} />,\n orange: <IconAlertTriangle size={16} />,\n yellow: <IconAlertTriangle size={16} />,\n};\n\nfunction Spinner() {\n return <span className=\"au-toast-spin\" />;\n}\n\nfunction ToastCard({ t }: { t: Toast }) {\n const accent = t.color ? `var(--astral-color-${t.color}-6)` : 'var(--astral-color-default-border)';\n const lead = t.loading\n ? <Spinner />\n : t.icon\n ? t.icon\n : (t.color && DEFAULT_ICON[t.color]) || <IconInfoCircle size={16} />;\n return (\n <div className=\"au-toast\" style={{ ['--au-toast-accent' as string]: accent } as CSSProperties} role=\"status\">\n <span className=\"au-toast-lead\">{lead}</span>\n <div className=\"au-toast-body\">\n {t.title && <div className=\"au-toast-title\">{t.title}</div>}\n {t.message != null && <div className=\"au-toast-msg\">{t.message}</div>}\n </div>\n {t.withCloseButton !== false && (\n <button type=\"button\" className=\"au-toast-x\" onClick={() => hide(t.id)} aria-label=\"Close\"><IconX size={14} /></button>\n )}\n </div>\n );\n}\n\nexport function AstralToaster() {\n const items = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n if (typeof document === 'undefined') return null;\n return createPortal(\n <div className=\"au-toast-host\" role=\"region\" aria-live=\"polite\" aria-label=\"Notifications\">\n {items.map(t => <ToastCard key={t.id} t={t} />)}\n </div>,\n document.body,\n );\n}\n","import { useState, useEffect } from 'react';\nimport type { CSSProperties } from 'react';\n\n/* Native <input type=\"date\" | \"datetime-local\"> that mirrors exactly what the user\n types and only commits a parsed Date upward once the string is a COMPLETE, plausible\n value. A fully-controlled date input that round-trips every keystroke through\n `new Date(y, m-1, d)` hits JS's 0-99 -> 1900s year remap mid-typing (so \"2\" -> 1902),\n and the reformatted value fights the user's typing into a re-render storm that freezes\n the page. Keeping the string local and gating the commit avoids that entirely.\n `color-scheme` is left to inherit so the native calendar glyph follows the app theme. */\n\nconst pad2 = (n: number) => String(n).padStart(2, '0');\nconst pad4 = (n: number) => String(n).padStart(4, '0');\n\n/** Date -> \"YYYY-MM-DD\" (local) */\nexport function dateToInputStr(d: Date | null): string {\n if (!d || isNaN(d.getTime())) return '';\n return `${pad4(d.getFullYear())}-${pad2(d.getMonth() + 1)}-${pad2(d.getDate())}`;\n}\n\n/** Date -> \"YYYY-MM-DDTHH:mm\" (local) */\nexport function dateTimeToInputStr(d: Date | null): string {\n if (!d || isNaN(d.getTime())) return '';\n return `${dateToInputStr(d)}T${pad2(d.getHours())}:${pad2(d.getMinutes())}`;\n}\n\ninterface Props {\n type?: 'date' | 'datetime-local';\n value: Date | null;\n onChange: (d: Date | null) => void;\n min?: Date;\n max?: Date;\n className?: string;\n style?: CSSProperties;\n disabled?: boolean;\n 'aria-label'?: string;\n}\n\nexport default function DateInput({ type = 'date', value, onChange, min, max, className, style, disabled, 'aria-label': ariaLabel }: Props) {\n const isTime = type === 'datetime-local';\n const fmt = isTime ? dateTimeToInputStr : dateToInputStr;\n const [s, setS] = useState(() => fmt(value));\n // Re-sync from the parent (preset buttons, programmatic clears) without fighting typing.\n const t = value?.getTime();\n useEffect(() => { setS(fmt(value)); }, [t]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const handle = (str: string) => {\n setS(str);\n if (str === '') { onChange(null); return; }\n const m = (isTime ? /^(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2})$/ : /^(\\d{4})-(\\d{2})-(\\d{2})$/).exec(str);\n if (!m) return; // incomplete - hold locally, don't commit\n const y = Number(m[1]);\n if (y < 1970 || y > 2100) return; // implausible (mid-typed) year - wait for a full one\n const d = isTime\n ? new Date(y, Number(m[2]) - 1, Number(m[3]), Number(m[4]), Number(m[5]))\n : new Date(y, Number(m[2]) - 1, Number(m[3]));\n if (isNaN(d.getTime())) return;\n onChange(d);\n };\n\n return (\n <input\n type={type}\n className={className}\n style={style}\n disabled={disabled}\n aria-label={ariaLabel}\n value={s}\n min={min ? fmt(min) : undefined}\n max={max ? fmt(max) : undefined}\n onChange={e => handle(e.currentTarget.value)}\n />\n );\n}\n","import type { CSSProperties } from 'react';\n\n/* Minimal theme-aware spinner. Styled by the .au-spinner class (in tokens.css);\n size via the `size` prop (px). */\nexport function Spinner({ size = 24, className, style }: { size?: number; className?: string; style?: CSSProperties }) {\n return (\n <span\n className={className ? `au-spinner ${className}` : 'au-spinner'}\n style={{ width: size, height: size, ...style }}\n role=\"status\"\n aria-label=\"Loading\"\n />\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/theme/ColorSchemeProvider.tsx","../src/theme/generateColors.ts","../src/theme/AstralProvider.tsx","../src/components/overlay.tsx","../src/components/Toast.tsx","../src/components/DateInput.tsx","../src/components/Spinner.tsx","../src/components/Backgrounds.tsx"],"names":["createContext","useContext","useState","useCallback","jsx","useEffect","jsxs","clean","IconX","createPortal","Spinner"],"mappings":"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","file":"index.js","sourcesContent":["import { createContext, useContext, useState, useEffect, useCallback } from 'react';\nimport type { ReactNode } from 'react';\n\n/* Light/dark control. Owns the color scheme, persists it to localStorage, and sets\n `data-astral-scheme` + `color-scheme` on <html> - which the AstralUI tokens (and\n every `light-dark()`) key off. The sole source of truth for the active scheme. */\n\nexport type ColorScheme = 'light' | 'dark';\n\ninterface ColorSchemeContextType {\n colorScheme: ColorScheme;\n setColorScheme: (scheme: ColorScheme) => void;\n toggle: () => void;\n}\n\nconst ColorSchemeContext = createContext<ColorSchemeContextType>({\n colorScheme: 'dark',\n setColorScheme: () => {},\n toggle: () => {},\n});\n\ninterface ColorSchemeProviderProps {\n children: ReactNode;\n /** Initial scheme when nothing is persisted yet. Default 'dark'. */\n defaultScheme?: ColorScheme;\n /** localStorage key for persistence. Default 'astral-color-scheme'. */\n storageKey?: string;\n}\n\nexport function ColorSchemeProvider({ children, defaultScheme = 'dark', storageKey = 'astral-color-scheme' }: ColorSchemeProviderProps) {\n const [colorScheme, setScheme] = useState<ColorScheme>(() => {\n try {\n const v = localStorage.getItem(storageKey);\n if (v === 'light' || v === 'dark') return v;\n } catch { /* ignore */ }\n return defaultScheme;\n });\n\n useEffect(() => {\n const root = document.documentElement;\n root.setAttribute('data-astral-scheme', colorScheme);\n root.style.colorScheme = colorScheme;\n }, [colorScheme]);\n\n const setColorScheme = useCallback((scheme: ColorScheme) => {\n try { localStorage.setItem(storageKey, scheme); } catch { /* ignore */ }\n setScheme(scheme);\n }, [storageKey]);\n\n const toggle = useCallback(() => {\n setScheme(prev => {\n const next = prev === 'dark' ? 'light' : 'dark';\n try { localStorage.setItem(storageKey, next); } catch { /* ignore */ }\n return next;\n });\n }, [storageKey]);\n\n return (\n <ColorSchemeContext.Provider value={{ colorScheme, setColorScheme, toggle }}>\n {children}\n </ColorSchemeContext.Provider>\n );\n}\n\nexport function useColorScheme() {\n return useContext(ColorSchemeContext);\n}\n","import chroma from 'chroma-js';\n\n/* Produces a 10-shade palette from a single hex, using fixed lightness/saturation\n maps and chroma-js LCH math. Used by AstralThemeProvider to turn an org's chosen\n brand color into a full palette. */\n\nconst LIGHTNESS_MAP = [0.96, 0.907, 0.805, 0.697, 0.605, 0.547, 0.518, 0.445, 0.395, 0.34];\nconst SATURATION_MAP = [0.32, 0.16, 0.08, 0.04, 0, 0, 0.04, 0.08, 0.16, 0.32];\n\nfunction getClosestLightness(colorObject: chroma.Color): number {\n const lightnessGoal = colorObject.get('hsl.l');\n return LIGHTNESS_MAP.reduce((prev, curr) =>\n Math.abs(curr - lightnessGoal) < Math.abs(prev - lightnessGoal) ? curr : prev,\n );\n}\n\nexport function generateColors(color: string): string[] {\n const colorObject = chroma(color);\n const closestLightness = getClosestLightness(colorObject);\n const baseColorIndex = LIGHTNESS_MAP.findIndex((l) => l === closestLightness);\n\n const colors = LIGHTNESS_MAP\n .map((l) => colorObject.set('hsl.l', l))\n .map((c) => chroma(c))\n .map((c, i) => {\n const saturationDelta = SATURATION_MAP[i] - SATURATION_MAP[baseColorIndex];\n return saturationDelta >= 0 ? c.saturate(saturationDelta) : c.desaturate(saturationDelta * -1);\n });\n\n colors[baseColorIndex] = chroma(color);\n return colors.map((c) => c.hex());\n}\n","import { useMemo, useState, useCallback, createContext, useContext } from 'react';\nimport type { ReactNode } from 'react';\nimport { generateColors } from './generateColors';\n\n/* Per-org / per-brand theming. Computes the brand palette + surface overrides and\n injects them as a runtime <style> that overrides the base --astral-* tokens\n (from tokens.css) per scheme. Selectors use html:root[data-astral-scheme=\"...\"]\n (specificity 0,2,1, so they win over the :root base tokens). No colors -> empty\n style -> base tokens. Prop-driven (no app coupling): pass the brand colors in. */\n\n/* ── Color preview context (live editing) ── */\n\nexport interface AstralThemeColors {\n primary_color?: string | null;\n background_color?: string | null;\n card_color?: string | null;\n navbar_color?: string | null;\n font_color?: string | null;\n light_primary_color?: string | null;\n light_background_color?: string | null;\n light_card_color?: string | null;\n light_navbar_color?: string | null;\n light_font_color?: string | null;\n}\n\ninterface ThemePreviewContextType {\n preview: AstralThemeColors | null;\n setPreview: (colors: AstralThemeColors | null) => void;\n}\n\nconst ThemePreviewContext = createContext<ThemePreviewContextType>({\n preview: null,\n setPreview: () => {},\n});\n\nexport function useThemePreview() {\n return useContext(ThemePreviewContext);\n}\n\n/* ── Helpers ── */\n\nconst HEX_RE = /^#[0-9a-f]{6}$/i;\nconst isValidHex = (v: string | null | undefined): v is string => !!v && HEX_RE.test(v);\n\nfunction adjustHex(hex: string, amount: number): string {\n const c = hex.replace('#', '');\n const r = Math.max(0, Math.min(255, parseInt(c.substring(0, 2), 16) + amount));\n const g = Math.max(0, Math.min(255, parseInt(c.substring(2, 4), 16) + amount));\n const b = Math.max(0, Math.min(255, parseInt(c.substring(4, 6), 16) + amount));\n return `#${r.toString(16).padStart(2, '0')}${g.toString(16).padStart(2, '0')}${b.toString(16).padStart(2, '0')}`;\n}\n\nfunction hexToRgba(hex: string, alpha: number): string {\n const c = hex.replace('#', '');\n const r = parseInt(c.substring(0, 2), 16);\n const g = parseInt(c.substring(2, 4), 16);\n const b = parseInt(c.substring(4, 6), 16);\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n}\n\n/* primaryShade is { light: 6, dark: 8 }; -light is the shade-6 color at .1/.15 alpha\n (.12/.2 hovered); -light-color is shade 6 (light) / 3 (dark). Theme-level constants,\n identical for any palette. */\nfunction primaryVars(palette: string[], scheme: 'light' | 'dark'): string[] {\n if (scheme === 'light') {\n return [\n `--astral-primary-color-filled:${palette[6]}`,\n `--astral-primary-color-filled-hover:${palette[7]}`,\n `--astral-primary-color-light:${hexToRgba(palette[6], 0.1)}`,\n `--astral-primary-color-light-hover:${hexToRgba(palette[6], 0.12)}`,\n `--astral-primary-color-light-color:${palette[6]}`,\n ];\n }\n return [\n `--astral-primary-color-filled:${palette[8]}`,\n `--astral-primary-color-filled-hover:${palette[9]}`,\n `--astral-primary-color-light:${hexToRgba(palette[6], 0.15)}`,\n `--astral-primary-color-light-hover:${hexToRgba(palette[6], 0.2)}`,\n `--astral-primary-color-light-color:${palette[3]}`,\n ];\n}\n\nfunction safeGenerate(hex: string): string[] | null {\n try { return generateColors(hex) as unknown as string[]; } catch { return null; }\n}\n\nexport function buildOrgCss(src: AstralThemeColors): string {\n const brand = isValidHex(src.primary_color) ? safeGenerate(src.primary_color!) : null;\n const lightBrand = isValidHex(src.light_primary_color) ? safeGenerate(src.light_primary_color!) : null;\n const lightPalette = lightBrand ?? brand; // light mode uses lightBrand, else falls back to brand\n const noDarkBrand = !brand; // the base accent palette is only overridden in light when no dark brand\n\n const vBg = isValidHex(src.background_color) ? src.background_color! : '';\n const vCard = isValidHex(src.card_color) ? src.card_color! : '';\n const vNav = isValidHex(src.navbar_color) ? src.navbar_color! : '';\n const vFont = isValidHex(src.font_color) ? src.font_color! : '';\n const vLBg = isValidHex(src.light_background_color) ? src.light_background_color! : '';\n const vLCard = isValidHex(src.light_card_color) ? src.light_card_color! : '';\n const vLNav = isValidHex(src.light_navbar_color) ? src.light_navbar_color! : '';\n const vLFont = isValidHex(src.light_font_color) ? src.light_font_color! : '';\n\n const dark: string[] = [];\n const light: string[] = [];\n\n /* ── dark scheme ── */\n if (brand) dark.push(...primaryVars(brand, 'dark'));\n if (vFont) {\n // dark palette: dark-0 = primary text; the dark text token mirrors dark-0.\n dark.push(`--astral-color-dark-0:${vFont}`, `--astral-color-dark-1:${adjustHex(vFont, -30)}`, `--astral-color-dark-2:${adjustHex(vFont, -60)}`, `--astral-color-text:${vFont}`);\n }\n if (vCard) dark.push(`--astral-color-dark-6:${vCard}`);\n if (vBg) dark.push(`--astral-color-dark-7:${vBg}`, `--astral-color-dark-9:${adjustHex(vBg, -10)}`, `--astral-color-body:${vBg}`, `--astral-app-bg:${vBg}`);\n if (vNav) dark.push(`--astral-color-dark-8:${vNav}`, `--astral-app-nav:${vNav}`);\n if (vCard) dark.push(`--astral-app-card:${vCard}`);\n\n /* ── light scheme ── */\n if (lightBrand && noDarkBrand) {\n // only-light-primary: override the base accent (violet) palette so accent-derived\n // tokens (e.g. brand-text) follow the light primary in light mode.\n for (let i = 0; i < 10; i++) light.push(`--astral-color-violet-${i}:${lightBrand[i]}`);\n }\n if (lightPalette) light.push(...primaryVars(lightPalette, 'light'));\n if (vLFont) light.push(`--astral-color-text:${vLFont}`);\n if (vLBg) light.push(`--astral-app-bg:${vLBg}`);\n if (vLNav) light.push(`--astral-app-nav:${vLNav}`);\n if (vLCard) light.push(`--astral-app-card:${vLCard}`);\n\n let css = '';\n if (dark.length) css += `html:root[data-astral-scheme=\"dark\"]{${dark.join(';')}}`;\n if (light.length) css += `html:root[data-astral-scheme=\"light\"]{${light.join(';')}}`;\n return css;\n}\n\n/* ── Provider ──\n Pass the brand colors via `colors`. While editing, call setPreview() (from\n useThemePreview) with partial colors for an instant live preview. */\n\nexport function AstralThemeProvider({ colors, children }: { colors?: AstralThemeColors | null; children: ReactNode }) {\n const [preview, setPreview] = useState<AstralThemeColors | null>(null);\n\n const stableSetPreview = useCallback((c: AstralThemeColors | null) => {\n setPreview(c);\n }, []);\n\n const effective: AstralThemeColors | null = preview\n ? { ...(colors ?? {}), ...preview }\n : (colors ?? null);\n\n const orgCss = useMemo(\n () => (effective ? buildOrgCss(effective) : ''),\n [effective ? JSON.stringify(effective) : ''],\n );\n\n return (\n <ThemePreviewContext.Provider value={{ preview, setPreview: stableSetPreview }}>\n <style data-astral-theme>{orgCss}</style>\n {children}\n </ThemePreviewContext.Provider>\n );\n}\n","import { useCallback, useEffect, useRef, useState, type ReactNode, type CSSProperties, type KeyboardEvent as ReactKeyboardEvent } from 'react';\nimport { createPortal } from 'react-dom';\nimport { IconX, IconChevronDown } from '@tabler/icons-react';\n\nfunction useDismiss(opened: boolean, onClose: () => void) {\n useEffect(() => {\n if (!opened) return;\n const onKey = (e: KeyboardEvent) => { if (e.key === 'Escape') onClose(); };\n document.addEventListener('keydown', onKey);\n const prev = document.body.style.overflow;\n document.body.style.overflow = 'hidden';\n return () => { document.removeEventListener('keydown', onKey); document.body.style.overflow = prev; };\n }, [opened, onClose]);\n}\n\ninterface ShellProps {\n opened: boolean;\n onClose: () => void;\n title: ReactNode;\n brand?: string;\n width?: number;\n /** Override the overlay z-index (default 300). Use to stack over flow-editor modals. */\n zIndex?: number;\n children: ReactNode;\n}\n\n/** Centered Astral modal (portal + overlay + escape + click-outside). */\nexport function AstralModal({ opened, onClose, title, brand, width = 460, zIndex, children }: ShellProps) {\n useDismiss(opened, onClose);\n if (!opened) return null;\n const style = { maxWidth: width, ...(brand ? { '--au-ic': brand } : {}) } as CSSProperties;\n return createPortal(\n <div className=\"au-modal-overlay\" onMouseDown={onClose} style={zIndex != null ? { zIndex } : undefined}>\n <div className=\"au-modal-panel\" style={style} onMouseDown={(e) => e.stopPropagation()}>\n <div className=\"au-modal-head\">\n <span className=\"au-modal-title\">{title}</span>\n <button type=\"button\" className=\"au-modal-x\" onClick={onClose} aria-label=\"Close\"><IconX /></button>\n </div>\n <div className=\"au-modal-body\">{children}</div>\n </div>\n </div>,\n document.body,\n );\n}\n\n/** Right-side Astral drawer. */\nexport function AstralDrawer({ opened, onClose, title, brand, width = 440, zIndex, children }: ShellProps) {\n useDismiss(opened, onClose);\n if (!opened) return null;\n const style = { width, ...(brand ? { '--au-ic': brand } : {}) } as CSSProperties;\n return createPortal(\n <div className=\"au-drawer-overlay\" onMouseDown={onClose} style={zIndex != null ? { zIndex } : undefined}>\n <div className=\"au-drawer-panel\" style={style} onMouseDown={(e) => e.stopPropagation()}>\n <div className=\"au-drawer-head\">\n <span className=\"au-drawer-title\">{title}</span>\n <button type=\"button\" className=\"au-modal-x\" onClick={onClose} aria-label=\"Close\"><IconX /></button>\n </div>\n <div className=\"au-drawer-body\">{children}</div>\n </div>\n </div>,\n document.body,\n );\n}\n\n/** Astral 6-box code input, with auto-advance, backspace, paste and arrows. */\nexport function AstralPinInput({ length = 6, value, onChange, autoFocus }: {\n length?: number;\n value: string;\n onChange: (value: string) => void;\n autoFocus?: boolean;\n}) {\n const refs = useRef<Array<HTMLInputElement | null>>([]);\n const digits = Array.from({ length }, (_, i) => value[i] ?? '');\n\n const focusBox = (i: number) => { refs.current[Math.max(0, Math.min(length - 1, i))]?.focus(); };\n\n const handleChange = (i: number, raw: string) => {\n const clean = raw.replace(/\\D/g, '');\n if (!clean) return;\n const arr = value.split('');\n let pos = i;\n for (const ch of clean) {\n if (pos >= length) break;\n arr[pos] = ch;\n pos++;\n }\n onChange(arr.join('').slice(0, length));\n focusBox(pos);\n };\n\n const handleKeyDown = (i: number, e: ReactKeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Backspace') {\n e.preventDefault();\n const arr = value.split('');\n if (arr[i]) {\n arr[i] = '';\n onChange(arr.join(''));\n } else if (i > 0) {\n arr[i - 1] = '';\n onChange(arr.join(''));\n focusBox(i - 1);\n }\n } else if (e.key === 'ArrowLeft') {\n e.preventDefault();\n focusBox(i - 1);\n } else if (e.key === 'ArrowRight') {\n e.preventDefault();\n focusBox(i + 1);\n }\n };\n\n return (\n <div className=\"au-pin\">\n {digits.map((d, i) => (\n <input\n key={i}\n ref={(el) => { refs.current[i] = el; }}\n className=\"au-pin-box\"\n inputMode=\"numeric\"\n autoComplete=\"one-time-code\"\n aria-label={`Digit ${i + 1}`}\n value={d}\n autoFocus={autoFocus && i === 0}\n onChange={(e) => handleChange(i, e.currentTarget.value)}\n onKeyDown={(e) => handleKeyDown(i, e)}\n onFocus={(e) => e.currentTarget.select()}\n />\n ))}\n </div>\n );\n}\n\nexport interface AstralSelectOption { value: string; label: string; }\n\n/** Astral select with optional search/create/clear - combobox. */\nexport function AstralSelect({ value, onChange, options, placeholder, disabled, searchable, searchPlaceholder, noResults, clearable, creatable }: {\n value: string | null;\n onChange: (value: string) => void;\n options: AstralSelectOption[];\n placeholder?: string;\n disabled?: boolean;\n searchable?: boolean;\n searchPlaceholder?: string;\n noResults?: string;\n clearable?: boolean;\n creatable?: boolean;\n}) {\n const [open, setOpen] = useState(false);\n const [q, setQ] = useState('');\n const triggerRef = useRef<HTMLButtonElement>(null);\n const menuRef = useRef<HTMLDivElement>(null);\n const [pos, setPos] = useState<{ left: number; top?: number; bottom?: number; width: number; maxHeight: number } | null>(null);\n\n const reposition = useCallback(() => {\n const el = triggerRef.current;\n if (!el) return;\n const r = el.getBoundingClientRect();\n const spaceBelow = window.innerHeight - r.bottom - 12;\n const spaceAbove = r.top - 12;\n const flipUp = spaceBelow < 200 && spaceAbove > spaceBelow;\n setPos({\n left: r.left,\n width: r.width,\n ...(flipUp\n ? { bottom: window.innerHeight - r.top + 5, maxHeight: Math.max(140, Math.min(300, spaceAbove)) }\n : { top: r.bottom + 5, maxHeight: Math.max(140, Math.min(300, spaceBelow)) }),\n });\n }, []);\n\n useEffect(() => {\n if (!open) return;\n reposition();\n const onScroll = () => reposition();\n const onResize = () => setOpen(false);\n const onDoc = (e: MouseEvent) => {\n if (triggerRef.current?.contains(e.target as Node)) return;\n if (menuRef.current?.contains(e.target as Node)) return;\n setOpen(false);\n };\n window.addEventListener('scroll', onScroll, true);\n window.addEventListener('resize', onResize);\n // Capture phase: AstralModal/AstralDrawer panels stopPropagation on mousedown,\n // which would otherwise block this outside-click close when the overlay lives inside one.\n document.addEventListener('mousedown', onDoc, true);\n return () => {\n window.removeEventListener('scroll', onScroll, true);\n window.removeEventListener('resize', onResize);\n document.removeEventListener('mousedown', onDoc, true);\n };\n }, [open, reposition]);\n\n const selected = options.find(o => o.value === value);\n const hasValue = value != null && value !== '';\n const display = selected ? selected.label : (value ?? '');\n const filtered = searchable && q.trim()\n ? options.filter(o => o.label.toLowerCase().includes(q.trim().toLowerCase()))\n : options;\n const showCreate = !!creatable && !!q.trim() && !options.some(o => o.label.toLowerCase() === q.trim().toLowerCase());\n\n return (\n <div className=\"au-select\">\n <button ref={triggerRef} type=\"button\" className=\"au-input au-select-trigger\" disabled={disabled} onClick={() => setOpen(o => !o)}>\n <span className={hasValue ? '' : 'ph'}>{hasValue ? display : placeholder}</span>\n {clearable && hasValue ? (\n <span className=\"au-select-caret au-select-clear\" role=\"button\" tabIndex={-1}\n onClick={(e) => { e.stopPropagation(); onChange(''); }}><IconX size={14} /></span>\n ) : (\n <IconChevronDown size={15} className=\"au-select-caret\" />\n )}\n </button>\n {open && !disabled && pos && createPortal(\n <div\n ref={menuRef}\n className=\"au-select-menu\"\n style={{ left: pos.left, top: pos.top, bottom: pos.bottom, width: pos.width, maxHeight: pos.maxHeight }}\n >\n {searchable && (\n <input\n autoFocus\n className=\"au-select-search\"\n placeholder={searchPlaceholder}\n value={q}\n onChange={(e) => setQ(e.currentTarget.value)}\n />\n )}\n {filtered.length === 0 && !showCreate && <div className=\"au-select-empty\">{noResults}</div>}\n {filtered.map(o => (\n <button\n type=\"button\"\n key={o.value}\n className={`au-select-opt${o.value === value ? ' on' : ''}`}\n onClick={() => { onChange(o.value); setOpen(false); setQ(''); }}\n >\n {o.label}\n </button>\n ))}\n {showCreate && (\n <button type=\"button\" className=\"au-select-opt au-select-create\"\n onClick={() => { onChange(q.trim()); setOpen(false); setQ(''); }}>\n + {q.trim()}\n </button>\n )}\n </div>,\n document.body,\n )}\n </div>\n );\n}\n\nexport interface AstralMenuItem { key?: string; label: ReactNode; icon?: ReactNode; onClick?: () => void; danger?: boolean; divider?: boolean; disabled?: boolean; }\n\n/** Astral action-menu dropdown - portalled like AstralSelect. */\nexport function AstralMenu({ trigger, items, align = 'end', width = 220 }: {\n trigger: ReactNode;\n items: AstralMenuItem[];\n align?: 'start' | 'end';\n width?: number;\n}) {\n const [open, setOpen] = useState(false);\n const anchorRef = useRef<HTMLDivElement>(null);\n const menuRef = useRef<HTMLDivElement>(null);\n const [pos, setPos] = useState<{ left: number; top?: number; bottom?: number; minWidth: number; maxHeight: number } | null>(null);\n\n const reposition = useCallback(() => {\n const el = anchorRef.current;\n if (!el) return;\n const r = el.getBoundingClientRect();\n const spaceBelow = window.innerHeight - r.bottom - 12;\n const spaceAbove = r.top - 12;\n const flipUp = spaceBelow < 220 && spaceAbove > spaceBelow;\n const left = align === 'end' ? Math.max(8, Math.min(r.right - width, window.innerWidth - width - 8)) : Math.min(r.left, window.innerWidth - width - 8);\n setPos({\n left,\n minWidth: width,\n ...(flipUp\n ? { bottom: window.innerHeight - r.top + 5, maxHeight: Math.max(160, Math.min(380, spaceAbove)) }\n : { top: r.bottom + 5, maxHeight: Math.max(160, Math.min(380, spaceBelow)) }),\n });\n }, [align, width]);\n\n useEffect(() => {\n if (!open) return;\n reposition();\n const onScroll = () => reposition();\n const onResize = () => setOpen(false);\n const onDoc = (e: MouseEvent) => {\n if (anchorRef.current?.contains(e.target as Node)) return;\n if (menuRef.current?.contains(e.target as Node)) return;\n setOpen(false);\n };\n window.addEventListener('scroll', onScroll, true);\n window.addEventListener('resize', onResize);\n // Capture phase: AstralModal/AstralDrawer panels stopPropagation on mousedown,\n // which would otherwise block this outside-click close when the overlay lives inside one.\n document.addEventListener('mousedown', onDoc, true);\n return () => {\n window.removeEventListener('scroll', onScroll, true);\n window.removeEventListener('resize', onResize);\n document.removeEventListener('mousedown', onDoc, true);\n };\n }, [open, reposition]);\n\n return (\n <>\n <div className=\"au-menu-anchor\" ref={anchorRef} onClick={() => setOpen(o => !o)}>\n {trigger}\n </div>\n {open && pos && createPortal(\n <div ref={menuRef} className=\"au-menu\" style={{ left: pos.left, top: pos.top, bottom: pos.bottom, minWidth: pos.minWidth, maxHeight: pos.maxHeight }}>\n {items.map((it, i) => it.divider\n ? <div key={it.key ?? `d${i}`} className=\"au-menu-divider\" />\n : (\n <button type=\"button\" key={it.key ?? i} className={`au-menu-item${it.danger ? ' danger' : ''}`} disabled={it.disabled}\n onClick={() => { setOpen(false); it.onClick?.(); }}>\n {it.icon && <span className=\"au-menu-ic\">{it.icon}</span>}\n <span className=\"au-menu-label\">{it.label}</span>\n </button>\n ))}\n </div>,\n document.body,\n )}\n </>\n );\n}\n","import { useSyncExternalStore } from 'react';\nimport type { ReactNode, CSSProperties } from 'react';\nimport { createPortal } from 'react-dom';\nimport { IconX, IconCheck, IconAlertTriangle, IconInfoCircle, IconExclamationCircle } from '@tabler/icons-react';\n\n/* AstralUI toast system. The `notifications` object (show/update/hide/clean, returns\n an id) is a small imperative store; <AstralToaster/> renders the live toasts and is\n mounted once at the app root. Theme-aware via the --astral-* tokens. */\n\nexport interface ToastOptions {\n id?: string;\n title?: ReactNode;\n message?: ReactNode;\n color?: string;\n icon?: ReactNode;\n loading?: boolean;\n autoClose?: number | false;\n withCloseButton?: boolean;\n onClose?: () => void;\n /** accepted for API compatibility; the toaster uses one global position */\n position?: string;\n /** tolerate any other notification prop a call site may pass (radius, withBorder, style, ...) */\n [key: string]: unknown;\n}\n\ninterface Toast extends ToastOptions { id: string; }\n\nlet toasts: Toast[] = [];\nconst listeners = new Set<() => void>();\nconst timers = new Map<string, ReturnType<typeof setTimeout>>();\nlet counter = 0;\n\nconst emit = () => listeners.forEach(l => l());\n\nfunction clearTimer(id: string) {\n const x = timers.get(id);\n if (x) { clearTimeout(x); timers.delete(id); }\n}\n\nfunction scheduleAutoClose(t: Toast) {\n clearTimer(t.id);\n if (t.autoClose === false || t.loading) return; // loading toasts stay until updated\n const ms = typeof t.autoClose === 'number' ? t.autoClose : 4000;\n timers.set(t.id, setTimeout(() => hide(t.id), ms));\n}\n\nfunction show(opts: ToastOptions): string {\n const id = opts.id ?? `toast-${++counter}`;\n const existing = toasts.find(t => t.id === id);\n const toast: Toast = { withCloseButton: true, ...existing, ...opts, id };\n toasts = existing ? toasts.map(t => (t.id === id ? toast : t)) : [...toasts, toast];\n emit();\n scheduleAutoClose(toast);\n return id;\n}\n\nfunction update(opts: ToastOptions): string {\n if (!opts.id) return show(opts);\n const existing = toasts.find(t => t.id === opts.id);\n if (!existing) return show(opts);\n const toast: Toast = { ...existing, ...opts, id: opts.id };\n toasts = toasts.map(t => (t.id === opts.id ? toast : t));\n emit();\n scheduleAutoClose(toast);\n return opts.id;\n}\n\nfunction hide(id: string) {\n const t = toasts.find(x => x.id === id);\n clearTimer(id);\n toasts = toasts.filter(x => x.id !== id);\n emit();\n t?.onClose?.();\n}\n\nfunction clean() {\n toasts.forEach(t => clearTimer(t.id));\n toasts = [];\n emit();\n}\n\nexport const notifications = { show, update, hide, clean };\n\n/* ── Rendering ── */\n\nconst subscribe = (cb: () => void) => { listeners.add(cb); return () => { listeners.delete(cb); }; };\nconst getSnapshot = () => toasts;\n\nconst DEFAULT_ICON: Record<string, ReactNode> = {\n green: <IconCheck size={16} />,\n teal: <IconCheck size={16} />,\n red: <IconExclamationCircle size={16} />,\n orange: <IconAlertTriangle size={16} />,\n yellow: <IconAlertTriangle size={16} />,\n};\n\nfunction Spinner() {\n return <span className=\"au-toast-spin\" />;\n}\n\nfunction ToastCard({ t }: { t: Toast }) {\n const accent = t.color ? `var(--astral-color-${t.color}-6)` : 'var(--astral-color-default-border)';\n const lead = t.loading\n ? <Spinner />\n : t.icon\n ? t.icon\n : (t.color && DEFAULT_ICON[t.color]) || <IconInfoCircle size={16} />;\n return (\n <div className=\"au-toast\" style={{ ['--au-toast-accent' as string]: accent } as CSSProperties} role=\"status\">\n <span className=\"au-toast-lead\">{lead}</span>\n <div className=\"au-toast-body\">\n {t.title && <div className=\"au-toast-title\">{t.title}</div>}\n {t.message != null && <div className=\"au-toast-msg\">{t.message}</div>}\n </div>\n {t.withCloseButton !== false && (\n <button type=\"button\" className=\"au-toast-x\" onClick={() => hide(t.id)} aria-label=\"Close\"><IconX size={14} /></button>\n )}\n </div>\n );\n}\n\nexport function AstralToaster() {\n const items = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n if (typeof document === 'undefined') return null;\n return createPortal(\n <div className=\"au-toast-host\" role=\"region\" aria-live=\"polite\" aria-label=\"Notifications\">\n {items.map(t => <ToastCard key={t.id} t={t} />)}\n </div>,\n document.body,\n );\n}\n","import { useState, useEffect } from 'react';\nimport type { CSSProperties } from 'react';\n\n/* Native <input type=\"date\" | \"datetime-local\"> that mirrors exactly what the user\n types and only commits a parsed Date upward once the string is a COMPLETE, plausible\n value. A fully-controlled date input that round-trips every keystroke through\n `new Date(y, m-1, d)` hits JS's 0-99 -> 1900s year remap mid-typing (so \"2\" -> 1902),\n and the reformatted value fights the user's typing into a re-render storm that freezes\n the page. Keeping the string local and gating the commit avoids that entirely.\n `color-scheme` is left to inherit so the native calendar glyph follows the app theme. */\n\nconst pad2 = (n: number) => String(n).padStart(2, '0');\nconst pad4 = (n: number) => String(n).padStart(4, '0');\n\n/** Date -> \"YYYY-MM-DD\" (local) */\nexport function dateToInputStr(d: Date | null): string {\n if (!d || isNaN(d.getTime())) return '';\n return `${pad4(d.getFullYear())}-${pad2(d.getMonth() + 1)}-${pad2(d.getDate())}`;\n}\n\n/** Date -> \"YYYY-MM-DDTHH:mm\" (local) */\nexport function dateTimeToInputStr(d: Date | null): string {\n if (!d || isNaN(d.getTime())) return '';\n return `${dateToInputStr(d)}T${pad2(d.getHours())}:${pad2(d.getMinutes())}`;\n}\n\ninterface Props {\n type?: 'date' | 'datetime-local';\n value: Date | null;\n onChange: (d: Date | null) => void;\n min?: Date;\n max?: Date;\n className?: string;\n style?: CSSProperties;\n disabled?: boolean;\n 'aria-label'?: string;\n}\n\nexport default function DateInput({ type = 'date', value, onChange, min, max, className, style, disabled, 'aria-label': ariaLabel }: Props) {\n const isTime = type === 'datetime-local';\n const fmt = isTime ? dateTimeToInputStr : dateToInputStr;\n const [s, setS] = useState(() => fmt(value));\n // Re-sync from the parent (preset buttons, programmatic clears) without fighting typing.\n const t = value?.getTime();\n useEffect(() => { setS(fmt(value)); }, [t]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const handle = (str: string) => {\n setS(str);\n if (str === '') { onChange(null); return; }\n const m = (isTime ? /^(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2})$/ : /^(\\d{4})-(\\d{2})-(\\d{2})$/).exec(str);\n if (!m) return; // incomplete - hold locally, don't commit\n const y = Number(m[1]);\n if (y < 1970 || y > 2100) return; // implausible (mid-typed) year - wait for a full one\n const d = isTime\n ? new Date(y, Number(m[2]) - 1, Number(m[3]), Number(m[4]), Number(m[5]))\n : new Date(y, Number(m[2]) - 1, Number(m[3]));\n if (isNaN(d.getTime())) return;\n onChange(d);\n };\n\n return (\n <input\n type={type}\n className={className}\n style={style}\n disabled={disabled}\n aria-label={ariaLabel}\n value={s}\n min={min ? fmt(min) : undefined}\n max={max ? fmt(max) : undefined}\n onChange={e => handle(e.currentTarget.value)}\n />\n );\n}\n","import type { CSSProperties } from 'react';\n\n/* Minimal theme-aware spinner. Styled by the .au-spinner class (in tokens.css);\n size via the `size` prop (px). */\nexport function Spinner({ size = 24, className, style }: { size?: number; className?: string; style?: CSSProperties }) {\n return (\n <span\n className={className ? `au-spinner ${className}` : 'au-spinner'}\n style={{ width: size, height: size, ...style }}\n role=\"status\"\n aria-label=\"Loading\"\n />\n );\n}\n","import type { ReactNode, CSSProperties } from 'react';\n\ninterface BackgroundProps {\n /** Content rendered above the backdrop (it becomes the positioning context). */\n children?: ReactNode;\n className?: string;\n style?: CSSProperties;\n /** Pin to the viewport (position:fixed, inset:0) instead of filling the parent. */\n fixed?: boolean;\n}\n\nfunction cls(base: string, extra?: string) {\n return extra ? `${base} ${extra}` : base;\n}\n\n/** Animated cosmic backdrop with a twinkling starfield. Great for auth screens,\n * heroes, or splash pages. Wrap your content as children. */\nexport function SpaceBackground({ children, className, style, fixed }: BackgroundProps) {\n const s: CSSProperties = fixed ? { position: 'fixed', inset: 0, ...style } : style ?? {};\n return (\n <div className={cls('astral-space-bg', className)} style={s}>\n <div className=\"astral-stars\" aria-hidden=\"true\" />\n {children}\n </div>\n );\n}\n\n/** Subtle technical grid backdrop with a brand-tinted radial glow, faded toward\n * the edges with a radial mask. */\nexport function GridBackground({ children, className, style, fixed }: BackgroundProps) {\n const s: CSSProperties = fixed ? { position: 'fixed', inset: 0, ...style } : style ?? {};\n return (\n <div className={cls('astral-grid-bg', className)} style={s}>\n {children}\n </div>\n );\n}\n"]}
package/dist/styles.css CHANGED
@@ -582,3 +582,68 @@ button, input, optgroup, select, textarea { font-family: inherit; font-size: 100
582
582
  animation: au-toast-spin .6s linear infinite;
583
583
  display: block;
584
584
  }
585
+
586
+
587
+ /* ===== src/styles/backgrounds.css ===== */
588
+ /* AstralUI decorative backgrounds - full-bleed backdrops you can drop behind any
589
+ surface (auth screens, hero sections, empty states). Use the React components
590
+ <SpaceBackground/> / <GridBackground/>, or the classes directly. */
591
+
592
+ /* ============================ Space / starfield ============================ */
593
+ .astral-space-bg {
594
+ position: relative;
595
+ overflow: hidden;
596
+ background: #06060d;
597
+ background-image:
598
+ radial-gradient(ellipse 80% 50% at 50% 0%, rgba(99, 40, 180, 0.15) 0%, transparent 60%),
599
+ radial-gradient(ellipse 60% 40% at 80% 20%, rgba(219, 39, 119, 0.07) 0%, transparent 50%),
600
+ radial-gradient(ellipse 70% 50% at 20% 80%, rgba(59, 130, 246, 0.07) 0%, transparent 50%);
601
+ }
602
+ .astral-space-bg::before {
603
+ content: '';
604
+ position: absolute;
605
+ top: 30%;
606
+ left: 50%;
607
+ transform: translate(-50%, -50%);
608
+ width: 800px;
609
+ height: 800px;
610
+ background: radial-gradient(circle, rgba(147, 51, 234, 0.12) 0%, rgba(219, 39, 119, 0.04) 40%, transparent 65%);
611
+ pointer-events: none;
612
+ animation: astral-glow 8s ease-in-out infinite;
613
+ }
614
+ @keyframes astral-glow {
615
+ 0%, 100% { opacity: 0.6; transform: translate(-50%, -50%) scale(1); }
616
+ 50% { opacity: 1; transform: translate(-50%, -50%) scale(1.1); }
617
+ }
618
+ @keyframes astral-twinkle {
619
+ 0%, 100% { opacity: 0.15; }
620
+ 50% { opacity: 0.7; }
621
+ }
622
+ .astral-stars, .astral-stars::after { position: absolute; top: 0; left: 0; right: 0; bottom: 0; width: 1px; height: 1px; pointer-events: none; overflow: visible; }
623
+ .astral-stars::after { content: ''; position: absolute; top: 0; left: 0; width: 1px; height: 1px; overflow: visible; }
624
+ .astral-stars { box-shadow: 1px 630px 0 0px rgba(230,220,255,0.33), 752px 236px 0 1px rgba(230,220,255,0.46), 1061px 309px 0 0px rgba(230,220,255,0.61), 1801px 542px 0 0px rgba(230,220,255,0.32), 377px 388px 0 0px rgba(230,220,255,0.60), 1069px 1013px 0 0px rgba(230,220,255,0.24), 1078px 157px 0 1px rgba(230,220,255,0.43), 944px 540px 0 0px rgba(230,220,255,0.21), 46px 1192px 0 1px rgba(230,220,255,0.59), 1142px 923px 0 0px rgba(230,220,255,0.37), 751px 321px 0 0px rgba(230,220,255,0.52), 728px 63px 0 0px rgba(230,220,255,0.28), 908px 395px 0 0px rgba(230,220,255,0.23), 1973px 655px 0 0px rgba(230,220,255,0.70), 867px 842px 0 0px rgba(230,220,255,0.47), 1991px 228px 0 0px rgba(230,220,255,0.40), 878px 896px 0 0px rgba(230,220,255,0.61), 1612px 117px 0 0px rgba(230,220,255,0.27), 1275px 456px 0 0px rgba(230,220,255,0.45), 1042px 124px 0 1px rgba(230,220,255,0.37), 1537px 318px 0 0px rgba(230,220,255,0.66), 933px 529px 0 1px rgba(230,220,255,0.43), 1954px 384px 0 0px rgba(230,220,255,0.63), 1485px 669px 0 0px rgba(230,220,255,0.47), 615px 412px 0 0px rgba(230,220,255,0.42), 1134px 783px 0 0px rgba(230,220,255,0.44), 912px 11px 0 0px rgba(230,220,255,0.39), 894px 1123px 0 0px rgba(230,220,255,0.41), 585px 493px 0 0px rgba(230,220,255,0.38), 1420px 1123px 0 0px rgba(230,220,255,0.44), 1643px 639px 0 0px rgba(230,220,255,0.40), 258px 975px 0 0px rgba(230,220,255,0.24), 1195px 404px 0 0px rgba(230,220,255,0.39), 628px 740px 0 0px rgba(230,220,255,0.34), 1978px 236px 0 0px rgba(230,220,255,0.46), 1569px 153px 0 0px rgba(230,220,255,0.31), 598px 202px 0 1px rgba(230,220,255,0.56), 1179px 621px 0 0px rgba(230,220,255,0.38), 587px 468px 0 0px rgba(230,220,255,0.41), 644px 423px 0 0px rgba(230,220,255,0.56), 819px 12px 0 0px rgba(230,220,255,0.47), 384px 1044px 0 1px rgba(230,220,255,0.68), 1589px 280px 0 0px rgba(230,220,255,0.30), 1743px 975px 0 1px rgba(230,220,255,0.37), 1257px 810px 0 1px rgba(230,220,255,0.26), 1360px 1196px 0 1px rgba(230,220,255,0.27), 738px 49px 0 0px rgba(230,220,255,0.29), 1011px 187px 0 0px rgba(230,220,255,0.33), 433px 405px 0 0px rgba(230,220,255,0.41), 1915px 690px 0 0px rgba(230,220,255,0.52), 1874px 591px 0 0px rgba(230,220,255,0.24), 1507px 182px 0 0px rgba(230,220,255,0.50), 688px 467px 0 0px rgba(230,220,255,0.61), 963px 779px 0 0px rgba(230,220,255,0.23), 1261px 809px 0 0px rgba(230,220,255,0.60), 427px 59px 0 0px rgba(230,220,255,0.57), 1927px 643px 0 0px rgba(230,220,255,0.52), 763px 598px 0 0px rgba(230,220,255,0.39), 1692px 1015px 0 1px rgba(230,220,255,0.48), 105px 880px 0 0px rgba(230,220,255,0.51), 46px 562px 0 0px rgba(230,220,255,0.64), 673px 1061px 0 1px rgba(230,220,255,0.43), 961px 1064px 0 0px rgba(230,220,255,0.22), 962px 658px 0 0px rgba(230,220,255,0.47), 176px 530px 0 1px rgba(230,220,255,0.68), 809px 397px 0 1px rgba(230,220,255,0.60), 748px 368px 0 0px rgba(230,220,255,0.66), 1257px 1107px 0 0px rgba(230,220,255,0.63), 293px 570px 0 0px rgba(230,220,255,0.35), 501px 514px 0 0px rgba(230,220,255,0.56), 485px 515px 0 0px rgba(230,220,255,0.51), 987px 961px 0 0px rgba(230,220,255,0.33), 430px 790px 0 0px rgba(230,220,255,0.39), 484px 748px 0 0px rgba(230,220,255,0.50), 741px 150px 0 0px rgba(230,220,255,0.39), 786px 1119px 0 0px rgba(230,220,255,0.25), 529px 835px 0 0px rgba(230,220,255,0.46), 16px 949px 0 0px rgba(230,220,255,0.26), 314px 465px 0 0px rgba(230,220,255,0.34), 1368px 239px 0 0px rgba(230,220,255,0.55), 1519px 115px 0 1px rgba(230,220,255,0.47), 1013px 922px 0 1px rgba(230,220,255,0.34), 1461px 344px 0 0px rgba(230,220,255,0.53), 430px 482px 0 0px rgba(230,220,255,0.50), 544px 816px 0 0px rgba(230,220,255,0.44), 1011px 406px 0 0px rgba(230,220,255,0.59), 1754px 524px 0 0px rgba(230,220,255,0.36), 288px 528px 0 0px rgba(230,220,255,0.68), 1656px 754px 0 0px rgba(230,220,255,0.20), 1875px 660px 0 0px rgba(230,220,255,0.57), 726px 536px 0 0px rgba(230,220,255,0.27), 637px 1113px 0 0px rgba(230,220,255,0.55), 1457px 407px 0 0px rgba(230,220,255,0.49), 1289px 262px 0 0px rgba(230,220,255,0.53), 379px 214px 0 0px rgba(230,220,255,0.38), 1699px 1126px 0 1px rgba(230,220,255,0.38), 660px 320px 0 0px rgba(230,220,255,0.59), 1615px 1019px 0 0px rgba(230,220,255,0.23), 405px 394px 0 0px rgba(230,220,255,0.60), 1248px 927px 0 0px rgba(230,220,255,0.51), 1633px 33px 0 0px rgba(230,220,255,0.38), 1761px 704px 0 0px rgba(230,220,255,0.36), 1933px 878px 0 0px rgba(230,220,255,0.44), 251px 81px 0 0px rgba(230,220,255,0.62), 1505px 376px 0 0px rgba(230,220,255,0.21), 434px 320px 0 0px rgba(230,220,255,0.65), 828px 539px 0 0px rgba(230,220,255,0.23), 1920px 280px 0 1px rgba(230,220,255,0.48), 399px 44px 0 0px rgba(230,220,255,0.46), 989px 174px 0 1px rgba(230,220,255,0.65), 1511px 952px 0 0px rgba(230,220,255,0.34), 440px 83px 0 1px rgba(230,220,255,0.30), 1837px 1054px 0 0px rgba(230,220,255,0.61), 296px 855px 0 0px rgba(230,220,255,0.67), 368px 1173px 0 0px rgba(230,220,255,0.68), 1792px 962px 0 0px rgba(230,220,255,0.69), 511px 469px 0 0px rgba(230,220,255,0.27), 931px 1046px 0 0px rgba(230,220,255,0.26); animation: astral-twinkle 6s ease-in-out infinite; }
625
+ .astral-stars::after { box-shadow: 2px 27px 0 0px rgba(200,180,255,0.31), 1488px 812px 0 0px rgba(200,180,255,0.23), 501px 642px 0 1px rgba(200,180,255,0.32), 531px 507px 0 0px rgba(200,180,255,0.33), 888px 915px 0 1px rgba(200,180,255,0.40), 662px 1189px 0 0px rgba(200,180,255,0.20), 1541px 199px 0 0px rgba(200,180,255,0.45), 368px 501px 0 0px rgba(200,180,255,0.33), 1966px 839px 0 0px rgba(200,180,255,0.35), 1262px 1062px 0 0px rgba(200,180,255,0.22), 914px 327px 0 0px rgba(200,180,255,0.38), 1001px 235px 0 0px rgba(200,180,255,0.38), 1997px 246px 0 0px rgba(200,180,255,0.27), 1079px 259px 0 0px rgba(200,180,255,0.34), 330px 1042px 0 0px rgba(200,180,255,0.55), 1121px 1137px 0 0px rgba(200,180,255,0.38), 1355px 1084px 0 0px rgba(200,180,255,0.54), 1657px 361px 0 0px rgba(200,180,255,0.16), 862px 562px 0 0px rgba(200,180,255,0.54), 314px 1150px 0 0px rgba(200,180,255,0.25), 1908px 493px 0 0px rgba(200,180,255,0.21), 1913px 390px 0 0px rgba(200,180,255,0.48), 1893px 1162px 0 0px rgba(200,180,255,0.28), 1501px 977px 0 0px rgba(200,180,255,0.45), 1592px 371px 0 0px rgba(200,180,255,0.20), 386px 389px 0 0px rgba(200,180,255,0.41), 437px 713px 0 0px rgba(200,180,255,0.26), 1821px 419px 0 0px rgba(200,180,255,0.18), 1808px 220px 0 0px rgba(200,180,255,0.29), 1634px 75px 0 0px rgba(200,180,255,0.51), 16px 221px 0 0px rgba(200,180,255,0.16), 1322px 327px 0 0px rgba(200,180,255,0.45), 1817px 524px 0 0px rgba(200,180,255,0.37), 1766px 544px 0 0px rgba(200,180,255,0.30), 949px 727px 0 0px rgba(200,180,255,0.43), 842px 703px 0 0px rgba(200,180,255,0.42), 694px 561px 0 0px rgba(200,180,255,0.52), 1921px 436px 0 1px rgba(200,180,255,0.21), 954px 931px 0 0px rgba(200,180,255,0.27), 1089px 569px 0 0px rgba(200,180,255,0.35), 1073px 200px 0 0px rgba(200,180,255,0.20), 1618px 319px 0 0px rgba(200,180,255,0.17), 1602px 745px 0 1px rgba(200,180,255,0.42), 250px 69px 0 0px rgba(200,180,255,0.22), 105px 451px 0 0px rgba(200,180,255,0.18), 1206px 933px 0 0px rgba(200,180,255,0.24), 1026px 372px 0 0px rgba(200,180,255,0.54), 1525px 270px 0 0px rgba(200,180,255,0.19), 878px 1126px 0 0px rgba(200,180,255,0.45), 371px 769px 0 0px rgba(200,180,255,0.41), 418px 622px 0 0px rgba(200,180,255,0.34), 551px 771px 0 0px rgba(200,180,255,0.52), 480px 1187px 0 0px rgba(200,180,255,0.46), 1128px 294px 0 0px rgba(200,180,255,0.49), 543px 1136px 0 0px rgba(200,180,255,0.51), 1434px 1169px 0 0px rgba(200,180,255,0.33), 1258px 486px 0 0px rgba(200,180,255,0.36), 1512px 896px 0 0px rgba(200,180,255,0.19), 1702px 936px 0 0px rgba(200,180,255,0.53), 675px 188px 0 0px rgba(200,180,255,0.53), 538px 639px 0 0px rgba(200,180,255,0.49), 301px 1128px 0 1px rgba(200,180,255,0.23), 837px 22px 0 0px rgba(200,180,255,0.18), 1124px 7px 0 0px rgba(200,180,255,0.29), 1134px 451px 0 0px rgba(200,180,255,0.47), 366px 51px 0 0px rgba(200,180,255,0.19), 1273px 393px 0 0px rgba(200,180,255,0.21), 50px 592px 0 0px rgba(200,180,255,0.47), 1191px 783px 0 0px rgba(200,180,255,0.20), 1819px 723px 0 0px rgba(200,180,255,0.52), 406px 144px 0 1px rgba(200,180,255,0.29), 323px 183px 0 0px rgba(200,180,255,0.32), 1000px 613px 0 0px rgba(200,180,255,0.40), 1612px 552px 0 0px rgba(200,180,255,0.17), 1443px 1004px 0 1px rgba(200,180,255,0.42), 1856px 649px 0 0px rgba(200,180,255,0.43), 1175px 268px 0 0px rgba(200,180,255,0.37), 567px 752px 0 0px rgba(200,180,255,0.18), 1674px 253px 0 0px rgba(200,180,255,0.39), 323px 8px 0 0px rgba(200,180,255,0.21); animation: astral-twinkle 8s ease-in-out infinite reverse; }
626
+
627
+ /* ============================ Technical grid ============================ */
628
+ .astral-grid-bg {
629
+ position: relative;
630
+ overflow: hidden;
631
+ background-image:
632
+ radial-gradient(50% 44% at 50% 8%, color-mix(in srgb, var(--astral-primary-color-filled) 16%, transparent), transparent 70%),
633
+ radial-gradient(42% 40% at 84% 104%, color-mix(in srgb, var(--astral-color-blue-6) 11%, transparent), transparent 72%);
634
+ }
635
+ .astral-grid-bg::before {
636
+ content: '';
637
+ position: absolute;
638
+ inset: 0;
639
+ pointer-events: none;
640
+ --astral-grid-line: color-mix(in srgb, var(--astral-color-default-border) 60%, transparent);
641
+ background-image: linear-gradient(var(--astral-grid-line) 1px, transparent 1px), linear-gradient(90deg, var(--astral-grid-line) 1px, transparent 1px);
642
+ background-size: 48px 48px;
643
+ -webkit-mask-image: radial-gradient(72% 62% at 50% 32%, #000, transparent 76%);
644
+ mask-image: radial-gradient(72% 62% at 50% 32%, #000, transparent 76%);
645
+ }
646
+
647
+ @media (prefers-reduced-motion: reduce) {
648
+ .astral-space-bg::before, .astral-stars, .astral-stars::after { animation: none; }
649
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@astralui/core",
3
- "version": "0.1.1",
3
+ "version": "0.1.2",
4
4
  "description": "AstralUI - a self-contained, dependency-free React design system: theme engine (light/dark + per-brand theming), design tokens, and components (Modal, Drawer, Select, Menu, Toast, DateInput, PinInput, Spinner).",
5
5
  "license": "MIT",
6
6
  "author": "Unbounded Technologies",