@falcon-ui/falcon-ui 1.0.0 → 1.1.0
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 +1 -0
- package/THIRD_PARTY_NOTICES.md +51 -0
- package/cjs/components/index.cjs +1131 -4
- package/cjs/components/index.cjs.map +1 -1
- package/cjs/components/loading/index.cjs +1186 -0
- package/cjs/components/loading/index.cjs.map +1 -0
- package/cjs/components/loading/src/loading.cjs +72 -0
- package/cjs/components/loading/src/loading.cjs.map +1 -0
- package/cjs/index.cjs +1132 -4
- package/cjs/index.cjs.map +1 -1
- package/esm/components/index.mjs +1130 -6
- package/esm/components/index.mjs.map +1 -1
- package/esm/components/loading/index.mjs +1179 -0
- package/esm/components/loading/index.mjs.map +1 -0
- package/esm/components/loading/src/loading.mjs +66 -0
- package/esm/components/loading/src/loading.mjs.map +1 -0
- package/esm/index.mjs +1131 -6
- package/esm/index.mjs.map +1 -1
- package/global.d.ts +2 -0
- package/package.json +7 -1
- package/theme/index.css +1 -1
- package/theme/index.scss +1 -0
- package/theme/src/loading.scss +52 -0
- package/types/components/barcode/index.d.ts +1 -1
- package/types/components/barcode/src/barcode.vue.d.ts +1 -1
- package/types/components/index.d.ts +2 -0
- package/types/components/input/index.d.ts +1 -1
- package/types/components/input/src/input.vue.d.ts +1 -1
- package/types/components/input-number/index.d.ts +3 -3
- package/types/components/input-number/src/input-number.vue.d.ts +1 -1
- package/types/components/loading/index.d.ts +183 -0
- package/types/components/loading/src/FlLoading.vue.d.ts +109 -0
- package/types/components/loading/src/animations/composing.d.ts +2 -0
- package/types/components/loading/src/animations/earth.d.ts +12 -0
- package/types/components/loading/src/animations/listening.d.ts +2 -0
- package/types/components/loading/src/animations/searching.d.ts +2 -0
- package/types/components/loading/src/animations/shaping.d.ts +2 -0
- package/types/components/loading/src/animations/solving.d.ts +2 -0
- package/types/components/loading/src/animations/working.d.ts +2 -0
- package/types/components/loading/src/earth-points.d.ts +22 -0
- package/types/components/loading/src/loading-frame.d.ts +4 -0
- package/types/components/loading/src/loading-geometry.d.ts +66 -0
- package/types/components/loading/src/loading-presets.d.ts +6 -0
- package/types/components/loading/src/loading-profiles.d.ts +7 -0
- package/types/components/loading/src/loading-renderer.d.ts +4 -0
- package/types/components/loading/src/loading.d.ts +65 -0
- package/types/components/loading/src/use-fl-loading.d.ts +15 -0
- package/types/components/loading/src/use-loading-animation.d.ts +13 -0
- package/types/components/loading/src/use-loading-color.d.ts +6 -0
- package/umd/falcon-ui.umd.js +1137 -7
- package/umd/falcon-ui.umd.js.map +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["observer: MutationObserver | undefined","media: MediaQueryList | undefined","probe: HTMLSpanElement | undefined","observedHost: HTMLElement | undefined | null","el: HTMLElement | null","COUNT_PAIRS: ReadonlyArray<readonly [string, string]>","out: ModeOpts","BASE_PROFILES: Record<string, ModeOpts>","visible: Dot[]","frameGlobe: ModeFrame","dots: Dot[]","moves: Move[]","frameRubik: ModeFrame","dots: Dot[]","frameWave: ModeFrame","dots: Dot[]","frameOrbits: ModeFrame","dots: Dot[]","frameRibbon: ModeFrame","dots: Dot[]","L: number[]","CIRCLE: Path","CYCLE: Path[]","frameMorph: ModeFrame","pts: Array<[number, number]>","dots: Dot[]","points: EarthPoint[]","dots: Dot[]","frames: Record<Exclude<FlLoadingAnimation, 'earth'>, ModeFrame>","ctx: CanvasRenderingContext2D | null","raf: number | undefined","previous: number | undefined","observer: IntersectionObserver | undefined","motion: MediaQueryList | undefined","layout","active","text","$slots","ariaLabel"],"sources":["../../../../../packages/utils/src/bem.ts","../../../../../packages/utils/src/install.ts","../../../../../packages/components/loading/src/loading.ts","../../../../../packages/components/loading/src/use-loading-color.ts","../../../../../packages/components/loading/src/loading-profiles.ts","../../../../../packages/components/loading/src/loading-presets.ts","../../../../../packages/components/loading/src/loading-geometry.ts","../../../../../packages/components/loading/src/animations/searching.ts","../../../../../packages/components/loading/src/animations/solving.ts","../../../../../packages/components/loading/src/animations/listening.ts","../../../../../packages/components/loading/src/animations/working.ts","../../../../../packages/components/loading/src/animations/composing.ts","../../../../../packages/components/loading/src/animations/shaping.ts","../../../../../packages/components/loading/src/earth-points.ts","../../../../../packages/components/loading/src/animations/earth.ts","../../../../../packages/components/loading/src/loading-renderer.ts","../../../../../packages/components/loading/src/use-loading-animation.ts","../../../../../packages/components/loading/src/FlLoading.vue","../../../../../packages/components/loading/src/FlLoading.vue","../../../../../packages/components/loading/src/use-fl-loading.ts","../../../../../packages/components/loading/index.ts"],"sourcesContent":["const defaultNamespace = 'fl'\r\nconst statePrefix = 'is-'\r\n\r\nconst buildBemName = (\r\n namespace: string,\r\n block: string,\r\n blockSuffix = '',\r\n element = '',\r\n modifier = ''\r\n) => {\r\n let className = `${namespace}-${block}`\r\n\r\n if (blockSuffix) {\r\n className += `-${blockSuffix}`\r\n }\r\n\r\n if (element) {\r\n className += `__${element}`\r\n }\r\n\r\n if (modifier) {\r\n className += `--${modifier}`\r\n }\r\n\r\n return className\r\n}\r\n\r\nexport const useNamespace = (block: string, namespace = defaultNamespace) => {\r\n const b = (blockSuffix = '') => buildBemName(namespace, block, blockSuffix)\r\n\r\n const e = (element?: string) => (element ? buildBemName(namespace, block, '', element) : '')\r\n\r\n const m = (modifier?: string) =>\r\n modifier ? buildBemName(namespace, block, '', '', modifier) : ''\r\n\r\n const be = (blockSuffix?: string, element?: string) => {\r\n if (!blockSuffix || !element) {\r\n return ''\r\n }\r\n\r\n return buildBemName(namespace, block, blockSuffix, element)\r\n }\r\n\r\n const em = (element?: string, modifier?: string) => {\r\n if (!element || !modifier) {\r\n return ''\r\n }\r\n\r\n return buildBemName(namespace, block, '', element, modifier)\r\n }\r\n\r\n const bm = (blockSuffix?: string, modifier?: string) => {\r\n if (!blockSuffix || !modifier) {\r\n return ''\r\n }\r\n\r\n return buildBemName(namespace, block, blockSuffix, '', modifier)\r\n }\r\n\r\n const bem = (blockSuffix?: string, element?: string, modifier?: string) => {\r\n if (!blockSuffix && !element && !modifier) {\r\n return b()\r\n }\r\n\r\n return buildBemName(namespace, block, blockSuffix, element, modifier)\r\n }\r\n\r\n const is = (name: string, state = true) => (state ? `${statePrefix}${name}` : '')\r\n\r\n return {\r\n namespace,\r\n b,\r\n e,\r\n m,\r\n be,\r\n em,\r\n bm,\r\n bem,\r\n is\r\n }\r\n}\r\n","import type { App, Plugin } from 'vue'\r\n\r\nexport type SFCWithInstall<T> = T & Plugin\r\n\r\nexport const withInstall = <T extends { name?: string }>(component: T): SFCWithInstall<T> => {\r\n const installable = component as SFCWithInstall<T>\r\n\r\n installable.install = (app: App) => {\r\n if (!component.name) {\r\n return\r\n }\r\n\r\n app.component(component.name, component as unknown as object)\r\n }\r\n\r\n return installable\r\n}\r\n","import type { ExtractPublicPropTypes, PropType } from 'vue'\r\n\r\nexport const flLoadingAnimations = [\r\n 'working',\r\n 'searching',\r\n 'solving',\r\n 'listening',\r\n 'composing',\r\n 'shaping',\r\n 'earth'\r\n] as const\r\nexport const flLoadingSizes = [20, 32, 48, 64, 96] as const\r\nexport type FlLoadingAnimation = (typeof flLoadingAnimations)[number]\r\nexport type FlLoadingSize = (typeof flLoadingSizes)[number]\r\nexport type FlLoadingTheme = 'auto' | 'light' | 'dark'\r\nexport type FlLoadingLayout = 'inline' | 'vertical'\r\n\r\nexport const flLoadingProps = {\r\n /** Whether to show the indicator. Inactive indicators retain their layout space. */\r\n active: { type: Boolean, default: true },\r\n /** Dot animation, including the land-textured Earth. */\r\n animation: {\r\n type: String as PropType<FlLoadingAnimation>,\r\n default: 'searching',\r\n validator: (v: FlLoadingAnimation) => flLoadingAnimations.includes(v)\r\n },\r\n /** Canvas CSS size in pixels. Each size has its own dot density. */\r\n size: {\r\n type: Number as PropType<FlLoadingSize>,\r\n default: 64,\r\n validator: (v: FlLoadingSize) => flLoadingSizes.includes(v)\r\n },\r\n /** Dot color; accepts CSS colors and CSS variables. */\r\n color: { type: String, default: '' },\r\n /** Background theme used to choose contrasting dots. */\r\n theme: { type: String as PropType<FlLoadingTheme>, default: 'auto' },\r\n /** Animation speed multiplier, clamped to 0.25–3. */\r\n speed: { type: Number, default: 1 },\r\n /** Freeze the current animation time. */\r\n paused: { type: Boolean, default: false },\r\n /** Accessible, selectable status text. */\r\n text: { type: String, default: '' },\r\n /** Position the text beside or below the canvas. */\r\n layout: { type: String as PropType<FlLoadingLayout>, default: 'inline' },\r\n /** Accessible label when no visible text is provided. */\r\n ariaLabel: { type: String, default: '加载中' }\r\n} as const\r\n\r\nexport type FlLoadingProps = ExtractPublicPropTypes<typeof flLoadingProps>\r\nexport const normalizeAnimation = (v: FlLoadingAnimation): FlLoadingAnimation =>\r\n flLoadingAnimations.includes(v) ? v : 'searching'\r\nexport const normalizeSize = (v: FlLoadingSize): FlLoadingSize =>\r\n flLoadingSizes.includes(v) ? v : 64\r\nexport const normalizeSpeed = (v: number) =>\r\n Number.isFinite(v) ? Math.max(0.25, Math.min(3, v)) : 1\r\n","import { onMounted, onScopeDispose, ref, watch } from 'vue'\r\nimport type { FlLoadingTheme } from './loading'\r\n\r\n/** Resolve variables at the source element before a loading mask moves into body. */\r\nexport function useLoadingColor(\r\n host: () => HTMLElement | undefined | null,\r\n options: () => { color?: string; theme?: FlLoadingTheme }\r\n) {\r\n const color = ref('#20252b')\r\n let mounted = false\r\n let observer: MutationObserver | undefined\r\n let media: MediaQueryList | undefined\r\n let probe: HTMLSpanElement | undefined\r\n let observedHost: HTMLElement | undefined | null\r\n\r\n const resolve = () => {\r\n if (!mounted) return\r\n const target = host() || document.documentElement\r\n if (target !== observedHost) {\r\n observer?.disconnect()\r\n probe?.remove()\r\n probe = document.createElement('span')\r\n probe.setAttribute('aria-hidden', 'true')\r\n probe.style.cssText =\r\n 'position:absolute;visibility:hidden;pointer-events:none;width:0;height:0;overflow:hidden'\r\n target.appendChild(probe)\r\n for (let el: HTMLElement | null = target; el; el = el.parentElement) {\r\n observer?.observe(el, {\r\n attributes: true,\r\n attributeFilter: ['class', 'style', 'data-theme']\r\n })\r\n }\r\n observedHost = target\r\n }\r\n const { color: explicit, theme = 'auto' } = options()\r\n let dark = theme === 'dark'\r\n if (theme === 'auto') {\r\n dark = media?.matches ?? false\r\n for (let el: HTMLElement | null = target; el; el = el.parentElement) {\r\n const marker = el.dataset.theme\r\n if (marker === 'dark' || marker === 'light') {\r\n dark = marker === 'dark'\r\n break\r\n }\r\n if (el.classList.contains('dark') || el.classList.contains('light')) {\r\n dark = el.classList.contains('dark')\r\n break\r\n }\r\n }\r\n }\r\n const variable = getComputedStyle(target).getPropertyValue('--fl-loading-color').trim()\r\n const fallback = dark ? '#f0f3f7' : '#20252b'\r\n if (probe) {\r\n probe.style.color = fallback\r\n if (explicit || variable) probe.style.color = explicit || variable\r\n color.value = getComputedStyle(probe).color || fallback\r\n }\r\n }\r\n watch([host, () => options().color, () => options().theme], resolve, { flush: 'post' })\r\n onMounted(() => {\r\n mounted = true\r\n media = window.matchMedia?.('(prefers-color-scheme: dark)')\r\n observer = typeof MutationObserver === 'undefined' ? undefined : new MutationObserver(resolve)\r\n media?.addEventListener('change', resolve)\r\n resolve()\r\n })\r\n onScopeDispose(() => {\r\n mounted = false\r\n observer?.disconnect()\r\n media?.removeEventListener('change', resolve)\r\n probe?.remove()\r\n })\r\n return color\r\n}\r\n","// Adapted from Thinking Orbs (MIT), Jakub Antalik, commit de85557.\r\n// See packages/components/loading/THIRD_PARTY_NOTICES.md.\r\n// Density profiles + the multiplier machinery that scales them. The base\r\n// rows are inkform's `fine` profiles; each shipped preset (state × size)\r\n// applies count / radius multipliers on top, resolved once per mount.\r\n\r\nexport interface ModeOpts {\r\n [key: string]: number | undefined\r\n}\r\n\r\n// 2-D lattices (rings × dots-per-ring) come in pairs — each side takes\r\n// √scale so the TOTAL dot count scales by `scale`; flat lists scale\r\n// linearly. `iconD` sets the morph outline's sampling density.\r\nconst COUNT_PAIRS: ReadonlyArray<readonly [string, string]> = [\r\n ['latRings', 'lonDensity'],\r\n ['rings', 'lonDensity'],\r\n ['lanes', 'segs']\r\n]\r\nconst COUNT_KEYS = ['orbitN', 'ghostN', 'nodeN', 'strandN', 'signals'] as const\r\nconst ICON_DENSITY_KEYS = ['iconD'] as const\r\n\r\n// Every key that sets a dot's rendered radius — scaling all of them keeps\r\n// a dot's near/far falloff intact while shrinking or growing the mark.\r\nconst RADIUS_KEYS = [\r\n 'rBase',\r\n 'rDepth',\r\n 'rActive',\r\n 'rDot',\r\n 'ghostR',\r\n 'partR',\r\n 'partRDepth',\r\n 'nodeR',\r\n 'nodeRDepth'\r\n] as const\r\n\r\nexport function scaleCounts(opts: ModeOpts, scale: number): ModeOpts {\r\n const out: ModeOpts = { ...opts }\r\n const done = new Set<string>()\r\n const rt = Math.sqrt(scale)\r\n for (const [a, b] of COUNT_PAIRS) {\r\n const va = out[a]\r\n const vb = out[b]\r\n if (va != null && vb != null && !done.has(a) && !done.has(b)) {\r\n out[a] = Math.max(2, Math.round(va * rt))\r\n out[b] = Math.max(2, Math.round(vb * rt))\r\n done.add(a)\r\n done.add(b)\r\n }\r\n }\r\n for (const k of COUNT_KEYS) {\r\n const v = out[k]\r\n // 0 means the mode opted out of that layer entirely (ring has no ghost\r\n // sphere) — scaling must not resurrect it as a single stray dot\r\n if (v != null && v !== 0 && !done.has(k)) out[k] = Math.max(1, Math.round(v * scale))\r\n }\r\n for (const k of ICON_DENSITY_KEYS) {\r\n const v = out[k]\r\n if (v != null) out[k] = Math.max(0.02, v * scale)\r\n }\r\n return out\r\n}\r\n\r\nexport function scaleRadii(opts: ModeOpts, scale: number): ModeOpts {\r\n const out: ModeOpts = { ...opts }\r\n for (const k of RADIUS_KEYS) {\r\n const v = out[k]\r\n if (v != null) out[k] = v * scale\r\n }\r\n // remember the multiplier itself — spacing-derived radii (the morph\r\n // outline) use it, since they aren't based on any single radius key\r\n out.rSizeMul = (out.rSizeMul ?? 1) * scale\r\n return out\r\n}\r\n\r\n/** Base (fine) profiles per mode, before preset multipliers. */\r\nexport const BASE_PROFILES: Record<string, ModeOpts> = {\r\n globe: {\r\n latRings: 17,\r\n lonDensity: 44,\r\n rBase: 0.6,\r\n rDepth: 1.7,\r\n rBoost: 1.0,\r\n inkFar: 0.62,\r\n inkSpan: 0.54,\r\n rsPow: 0.6,\r\n rMin: 0.3\r\n },\r\n orbits: {\r\n orbitN: 12,\r\n ghostN: 40,\r\n ghostR: 0.9,\r\n ghostA: 0.5,\r\n particles: 3,\r\n partR: 1.2,\r\n partRDepth: 1.6,\r\n rsPow: 0.6,\r\n rMin: 0.3\r\n },\r\n rubik: {\r\n latRings: 15,\r\n lonDensity: 40,\r\n moveCount: 14,\r\n rBase: 0.6,\r\n rDepth: 1.7,\r\n rActive: 0.3,\r\n inkFar: 0.62,\r\n inkSpan: 0.54,\r\n rsPow: 0.6,\r\n rMin: 0.3\r\n },\r\n wave: {\r\n rings: 15,\r\n lonDensity: 40,\r\n rBase: 0.6,\r\n rDepth: 1.7,\r\n rsPow: 0.6,\r\n rMin: 0.3\r\n },\r\n web: {\r\n nodeN: 30,\r\n thr: 0.72,\r\n signals: 5,\r\n nodeR: 1.4,\r\n nodeRDepth: 1.8,\r\n lineW: 0.8,\r\n rsPow: 0.6,\r\n rMin: 0.3\r\n },\r\n braid: {\r\n strandN: 52,\r\n turns: 3.0,\r\n ghostN: 150,\r\n rBase: 1.2,\r\n rDepth: 1.8,\r\n rsPow: 0.6,\r\n rMin: 0.3\r\n },\r\n ribbon: {\r\n lanes: 5,\r\n segs: 88,\r\n ghostN: 150,\r\n rBase: 1.1,\r\n rDepth: 1.7,\r\n rsPow: 0.6,\r\n rMin: 0.3\r\n },\r\n // ring shares ribbon's painter; faceOn cancels the camera tilt and moves\r\n // the undulation onto the radius, and there is no ghost sphere behind it\r\n ring: {\r\n lanes: 5,\r\n segs: 88,\r\n ghostN: 0,\r\n faceOn: 1,\r\n rBase: 1.1,\r\n rDepth: 1.7,\r\n rsPow: 0.6,\r\n rMin: 0.3\r\n },\r\n morph: {\r\n rDot: 0.021,\r\n iconD: 1,\r\n rMin: 0.25\r\n }\r\n}\r\n","// Tunings adapted from Thinking Orbs de85557 (MIT); see THIRD_PARTY_NOTICES.md.\r\nimport { BASE_PROFILES, scaleCounts, scaleRadii } from './loading-profiles'\r\nimport type { ModeOpts } from './loading-profiles'\r\nimport type { FlLoadingAnimation, FlLoadingSize } from './loading'\r\n\r\nconst presets = {\r\n working: ['orbits', 1.885, 1, 1, 3.9, 0.238, 2.4],\r\n searching: ['globe', 2.015, 0.42, 1.15, 2.665, 0.105, 1.75],\r\n solving: ['rubik', 1.82, 0.35, 1.05, 1.95, 0.088, 1.9],\r\n listening: ['wave', 4.388, 0.341, 1, 3.998, 0.105, 1.6],\r\n composing: ['ribbon', 2.34, 0.25, 0.85, 3.12, 0.051, 1.073],\r\n shaping: ['morph', 2.405, 0.702, 0.395, 2.08, 0.53, 1.011]\r\n} as const\r\nconst cache = new Map<string, { speed: number; opts: ModeOpts }>()\r\n\r\nexport function resolvePreset(animation: FlLoadingAnimation, size: FlLoadingSize) {\r\n const key = `${animation}-${size}`\r\n const hit = cache.get(key)\r\n if (hit) return hit\r\n if (animation === 'earth') return { speed: 1, opts: {} }\r\n const [mode, bigSpeed, bigCount, bigRadius, smallSpeed, smallCount, smallRadius] =\r\n presets[animation]\r\n const blend = Math.max(0, Math.min(1, (size - 20) / 44))\r\n const count = smallCount + (bigCount - smallCount) * blend\r\n const radius = smallRadius + (bigRadius - smallRadius) * blend\r\n let opts = scaleRadii(scaleCounts(BASE_PROFILES[mode], count), radius)\r\n if (animation === 'searching') opts = { ...opts, scanMul: 4.08, dimBase: 0.45 }\r\n if (animation === 'composing') opts = { ...opts, spin: 0, bandMul: 3.9, wobMul: 1 }\r\n if (animation === 'shaping') opts = { ...opts, spread: 1.45 }\r\n const resolved = { speed: smallSpeed + (bigSpeed - smallSpeed) * blend, opts }\r\n cache.set(key, resolved)\r\n return resolved\r\n}\r\n","// Adapted from Thinking Orbs (MIT), Jakub Antalik, commit de85557.\r\n// See packages/components/loading/THIRD_PARTY_NOTICES.md.\r\n// Shared primitives for the dotted 3D thought-orbs. Ported from inkform\r\n// (PlotterLab's HalftoneSphere lineage): honestly 3D — rotated,\r\n// depth-shaded, z-sorted. Depth is carried by dot size and ink weight\r\n// alone. Plain 2D canvas fills only: no ctx.filter, no SVG filters, so\r\n// every mode renders identically in Chrome, Safari and Firefox.\r\n\r\nexport interface Dot {\r\n x: number\r\n y: number\r\n z: number\r\n r: number\r\n /** Ink value: 0 = darkest ink on paper. Mirrored on dark themes. */\r\n white: number\r\n a?: number\r\n}\r\n\r\n/** A stroked edge between two projected points (the `connecting` web). */\r\nexport interface Line {\r\n x1: number\r\n y1: number\r\n x2: number\r\n y2: number\r\n /** Ink value, same convention as `Dot.white`. */\r\n white: number\r\n a?: number\r\n w: number\r\n}\r\n\r\n/**\r\n * One rendered instant: a complete, final set of draw instructions.\r\n * `dots` is already z-sorted into draw order and radius-clamped; `lines`\r\n * are drawn first. Nothing here needs further interpretation, which is what\r\n * makes a frame portable to any 2D renderer.\r\n */\r\nexport interface OrbFrame {\r\n dots: Dot[]\r\n lines: Line[]\r\n}\r\n\r\nexport type Projector = (x: number, y: number, z: number) => [number, number, number]\r\n\r\nexport function lerp(a: number, b: number, f: number): number {\r\n return a + (b - a) * f\r\n}\r\n\r\nexport function frac(x: number): number {\r\n return x - Math.floor(x)\r\n}\r\n\r\n/** Value noise on a 2D lattice — smooth, deterministic, cheap. */\r\nexport function vnoise(x: number, y: number): number {\r\n const xi = Math.floor(x)\r\n const yi = Math.floor(y)\r\n let fx = x - xi\r\n let fy = y - yi\r\n fx = fx * fx * (3 - 2 * fx)\r\n fy = fy * fy * (3 - 2 * fy)\r\n const a = hashD(xi, yi)\r\n const b = hashD(xi + 1, yi)\r\n const c = hashD(xi, yi + 1)\r\n const d = hashD(xi + 1, yi + 1)\r\n return a + (b - a) * fx + (c - a) * fy + (a - b - c + d) * fx * fy\r\n}\r\n\r\n/** Deterministic hash in [0, 1). */\r\nexport function hashD(a: number, b: number): number {\r\n const h = Math.sin(a * 12.9898 + b * 78.233) * 43758.5453\r\n return h - Math.floor(h)\r\n}\r\n\r\n/** Stable directions on a unit sphere (Fibonacci lattice). */\r\nexport function fibDir(i: number, n: number): [number, number, number] {\r\n const golden = Math.PI * (3 - Math.sqrt(5))\r\n const y = 1 - (2 * (i + 0.5)) / n\r\n const rad = Math.sqrt(1 - y * y)\r\n const a = i * golden\r\n return [rad * Math.cos(a), y, rad * Math.sin(a)]\r\n}\r\n\r\n/** Shortest signed angular distance, wrapped to (-π, π]. */\r\nexport function angleDelta(a: number, b: number): number {\r\n return Math.atan2(Math.sin(a - b), Math.cos(a - b))\r\n}\r\n\r\n/** Shared spin + tilt + orthographic projection. */\r\nexport function makeProj(\r\n yaw: number,\r\n tilt: number,\r\n cx: number,\r\n cy: number,\r\n scale: number\r\n): Projector {\r\n const st = Math.sin(tilt)\r\n const ct = Math.cos(tilt)\r\n const sy = Math.sin(yaw)\r\n const cyw = Math.cos(yaw)\r\n return (x, y, z) => {\r\n const x1 = x * cyw + z * sy\r\n const z1 = -x * sy + z * cyw\r\n const y1 = y * ct - z1 * st\r\n const z2 = y * st + z1 * ct\r\n return [cx + x1 * scale, cy - y1 * scale, z2]\r\n }\r\n}\r\n\r\n/**\r\n * Painter: z-sort far→near, matte grayscale dots. On dark substrates the\r\n * ink value is mirrored (1 - white) so near dots read bright — the same\r\n * depth language on an inverted substrate.\r\n */\r\n\r\n/** Stroke pass for edge-based modes. Runs before `paint` so nodes sit on top. */\r\n\r\n/**\r\n * Turn raw mode output into a finished frame: drop invisible marks, clamp\r\n * radii to the mode's floor, and z-sort far→near into draw order.\r\n *\r\n * This runs in the GEOMETRY step, not the painter, so a frame is a complete\r\n * set of draw instructions: every value is final and the array order is the\r\n * order to draw in. That is what lets the RN and SwiftUI ports share this\r\n * output verbatim — a port draws the list, it never re-derives anything —\r\n * and what lets the golden-vector tests compare numbers instead of pixels.\r\n */\r\nexport function finalizeFrame(dots: Dot[], lines: Line[], rMin = 0.3): OrbFrame {\r\n const visible: Dot[] = []\r\n for (const d of dots) {\r\n if ((d.a ?? 1) < 0.02) continue\r\n d.r = Math.max(rMin, d.r)\r\n visible.push(d)\r\n }\r\n visible.sort((a, b) => a.z - b.z)\r\n return { dots: visible, lines: lines.filter((l) => (l.a ?? 1) >= 0.02) }\r\n}\r\n\r\n/** Paint a finished frame. Lines first, so nodes sit on top of their edges. */\r\n\r\n/**\r\n * Dot radii were tuned for a 300pt frame; sub-linear scaling keeps small\r\n * spinners legible. Lower pow = radii shrink less with size.\r\n */\r\nexport function radiusScale(size: number, pow: number): number {\r\n return (size / 300) ** pow\r\n}\r\n","// Adapted from Thinking Orbs (MIT), Jakub Antalik, commit de85557.\r\n// See packages/components/loading/THIRD_PARTY_NOTICES.md.\r\nimport type { Dot, ModeFrame } from '../loading-frame'\r\nimport { angleDelta, finalizeFrame, makeProj, radiusScale } from '../loading-geometry'\r\n// --- Globe: lat/long field, a scan meridian sweeps — searching --------\r\n\r\nexport const frameGlobe: ModeFrame = (size, t, o) => {\r\n const spin = 0.5\r\n const cx = size / 2\r\n const cy = size / 2\r\n const radius = (size / 2) * 0.82\r\n const tilt = 0.4 + 0.06 * Math.sin(t * 0.35)\r\n const pt = makeProj(t * spin, tilt, cx, cy, radius)\r\n // scan sweeps relative to the spin; scanMul scales that relative rate\r\n const scan = t * (spin + (1.7 - spin) * (o.scanMul ?? 1))\r\n const rs = radiusScale(size, o.rsPow ?? 0.6)\r\n const dimBase = o.dimBase ?? 1\r\n\r\n const dots: Dot[] = []\r\n const latRings = o.latRings ?? 17\r\n const lonDensity = o.lonDensity ?? 44\r\n for (let li = 0; li <= latRings; li++) {\r\n const lat = -Math.PI / 2 + (li / latRings) * Math.PI\r\n const cosLat = Math.cos(lat)\r\n const sinLat = Math.sin(lat)\r\n const lonCount = Math.max(1, Math.round(Math.abs(cosLat) * lonDensity))\r\n for (let lj = 0; lj < lonCount; lj++) {\r\n const lon = (lj / lonCount) * 2 * Math.PI\r\n const [px, py, z] = pt(cosLat * Math.cos(lon), sinLat, cosLat * Math.sin(lon))\r\n const depth = (z + 1) / 2\r\n // the scan: a moving meridian read as a size ripple, not a shine\r\n const d = angleDelta(lon + t * spin, scan)\r\n const boost = Math.exp(-(d * d) / 0.18) * Math.max(0, z)\r\n dots.push({\r\n x: px,\r\n y: py,\r\n z,\r\n r: ((o.rBase ?? 0.6) + (o.rDepth ?? 1.7) * depth + (o.rBoost ?? 1) * boost) * rs,\r\n white: (o.inkFar ?? 0.62) - (o.inkSpan ?? 0.54) * depth,\r\n // dimBase < 1 fades un-scanned dots so the meridian reads clearly\r\n a: dimBase + (1 - dimBase) * Math.min(1, boost)\r\n })\r\n }\r\n }\r\n return finalizeFrame(dots, [], o.rMin)\r\n}\r\n","// Adapted from Thinking Orbs (MIT), Jakub Antalik, commit de85557.\r\n// See packages/components/loading/THIRD_PARTY_NOTICES.md.\r\n// The sphere-lattice modes: globe (searching), rubik (solving) and\r\n// wave (listening). All draw a lat/long dot field with mode-specific\r\n// motion, then hand off to the shared z-sorted painter.\r\n\r\nimport type { Dot, ModeFrame } from '../loading-frame'\r\nimport { finalizeFrame, hashD, makeProj, radiusScale } from '../loading-geometry'\r\n\r\n// --- the shared solver heartbeat (rubik) ------------------------------\r\n// Rapid eased moves scramble, then replay in reverse (palindrome) so\r\n// everything clicks back to solved, rests, repeats.\r\n\r\ninterface Move {\r\n axis: 0 | 1 | 2\r\n lo: number\r\n hi: number\r\n ang: number\r\n}\r\n\r\nfunction solveCycle(time: number, count: number, slotDur: number, rest: number) {\r\n const cyc = 2 * count * slotDur + rest\r\n const tc = time % cyc\r\n const amount = new Array<number>(count).fill(0)\r\n let active = -1\r\n if (tc < 2 * count * slotDur) {\r\n const slot = Math.floor(tc / slotDur)\r\n const p = (tc - slot * slotDur) / slotDur\r\n const cl = Math.min(1, p / 0.7)\r\n const ep = 1 - (1 - cl) ** 3 // machine ease-out\r\n if (slot < count) {\r\n for (let i = 0; i < slot; i++) amount[i] = 1\r\n amount[slot] = ep\r\n active = slot\r\n } else {\r\n const u = 2 * count - 1 - slot\r\n for (let i = 0; i < u; i++) amount[i] = 1\r\n amount[u] = 1 - ep\r\n active = u\r\n }\r\n }\r\n return { amount, active }\r\n}\r\n\r\nfunction applyMoves(\r\n pt3: [number, number, number],\r\n moves: Move[],\r\n sc: { amount: number[]; active: number }\r\n): [number, number, number, boolean] {\r\n let [x, y, z] = pt3\r\n let inActive = false\r\n for (let i = 0; i < moves.length; i++) {\r\n if (sc.amount[i] <= 0) continue\r\n const mv = moves[i]\r\n const coord = mv.axis === 0 ? x : mv.axis === 1 ? y : z\r\n if (coord < mv.lo || coord >= mv.hi) continue\r\n if (i === sc.active) inActive = true\r\n const a = mv.ang * sc.amount[i]\r\n const ca = Math.cos(a)\r\n const sa = Math.sin(a)\r\n if (mv.axis === 0) {\r\n const y2 = y * ca - z * sa\r\n z = y * sa + z * ca\r\n y = y2\r\n } else if (mv.axis === 1) {\r\n const x2 = x * ca + z * sa\r\n z = -x * sa + z * ca\r\n x = x2\r\n } else {\r\n const x2 = x * ca - y * sa\r\n y = x * sa + y * ca\r\n x = x2\r\n }\r\n }\r\n return [x, y, z, inActive]\r\n}\r\n\r\nfunction makeMoves(count: number): Move[] {\r\n const moves: Move[] = []\r\n for (let i = 0; i < count; i++) {\r\n const axis = Math.min(2, Math.floor(hashD(i, 2.3) * 3)) as 0 | 1 | 2\r\n const lo = -1.0 + 0.5 * Math.min(3, Math.floor(hashD(i, 5.9) * 4))\r\n const dir = hashD(i, 7.7) < 0.5 ? 1 : -1\r\n moves.push({ axis, lo, hi: lo + 0.5, ang: (dir * Math.PI) / 2 })\r\n }\r\n return moves\r\n}\r\n\r\n// --- Rubik: bands twist in quarter turns, scramble → solve — solving --\r\n\r\nexport const frameRubik: ModeFrame = (size, t, o) => {\r\n const cx = size / 2\r\n const cy = size / 2\r\n const R = (size / 2) * 0.82\r\n const pt = makeProj(t * 0.55, 0.35 + 0.1 * Math.sin(t * 0.9), cx, cy, R)\r\n const rs = radiusScale(size, o.rsPow ?? 0.6)\r\n const moveCount = o.moveCount ?? 14\r\n const moves = makeMoves(moveCount)\r\n const sc = solveCycle(t, moveCount, 0.42, 1.2)\r\n\r\n const dots: Dot[] = []\r\n const latRings = o.latRings ?? 15\r\n const lonDensity = o.lonDensity ?? 40\r\n for (let li = 0; li <= latRings; li++) {\r\n const lat = -Math.PI / 2 + (li / latRings) * Math.PI\r\n const cosLat = Math.cos(lat)\r\n const sinLat = Math.sin(lat)\r\n const lonCount = Math.max(1, Math.round(Math.abs(cosLat) * lonDensity))\r\n for (let lj = 0; lj < lonCount; lj++) {\r\n const lon = (lj / lonCount) * 2 * Math.PI\r\n const [x, y, z, inActive] = applyMoves(\r\n [cosLat * Math.cos(lon), sinLat, cosLat * Math.sin(lon)],\r\n moves,\r\n sc\r\n )\r\n const [px, py, zr] = pt(x, y, z)\r\n const depth = (zr + 1) / 2\r\n // the band being turned inks a touch darker — the \"hand\"\r\n dots.push({\r\n x: px,\r\n y: py,\r\n z: zr,\r\n r:\r\n ((o.rBase ?? 0.6) + (o.rDepth ?? 1.7) * depth + (inActive ? (o.rActive ?? 0.3) : 0)) * rs,\r\n white: (o.inkFar ?? 0.62) - (o.inkSpan ?? 0.54) * depth - (inActive ? 0.14 : 0)\r\n })\r\n }\r\n }\r\n return finalizeFrame(dots, [], o.rMin)\r\n}\r\n\r\n// --- Wave: a waveform rolls through the rings — listening -------------\r\n","// Adapted from Thinking Orbs (MIT), Jakub Antalik, commit de85557.\r\n// See packages/components/loading/THIRD_PARTY_NOTICES.md.\r\nimport type { Dot, ModeFrame } from '../loading-frame'\r\nimport { finalizeFrame, makeProj, radiusScale } from '../loading-geometry'\r\nexport const frameWave: ModeFrame = (size, t, o) => {\r\n const cx = size / 2\r\n const cy = size / 2\r\n // 0.76 base × 1.15 — the undulation pulls the sphere inward, so wave read\r\n // ~15% smaller than the other lattice modes; scaled up to match them\r\n const R = (size / 2) * 0.874\r\n const pt = makeProj(t * 0.18, 0.38, cx, cy, 1)\r\n const rs = radiusScale(size, o.rsPow ?? 0.6)\r\n\r\n const dots: Dot[] = []\r\n const rings = o.rings ?? 15\r\n const lonDensity = o.lonDensity ?? 40\r\n for (let ri = 0; ri <= rings; ri++) {\r\n const lat = -Math.PI / 2 + (ri / rings) * Math.PI\r\n const cosLat = Math.cos(lat)\r\n const sinLat = Math.sin(lat)\r\n // two waves, different tempi — organic, never quite repeating\r\n const w = 0.62 * Math.sin(t * 2.1 - ri * 0.52) + 0.38 * Math.sin(t * 1.27 + ri * 0.83)\r\n const rr = R * (0.88 + 0.105 * w)\r\n const lonCount = Math.max(1, Math.round(Math.abs(cosLat) * lonDensity))\r\n for (let lj = 0; lj < lonCount; lj++) {\r\n const lon = (lj / lonCount) * 2 * Math.PI\r\n const [px, py, z] = pt(cosLat * Math.cos(lon) * rr, sinLat * rr, cosLat * Math.sin(lon) * rr)\r\n const depth = (z / R + 1) / 2\r\n const crest = Math.max(0, w)\r\n dots.push({\r\n x: px,\r\n y: py,\r\n z,\r\n r: ((o.rBase ?? 0.6) + (o.rDepth ?? 1.7) * depth) * (1 + 0.4 * crest) * rs,\r\n white: 0.66 - 0.56 * depth - 0.1 * crest\r\n })\r\n }\r\n }\r\n return finalizeFrame(dots, [], o.rMin)\r\n}\r\n","// Adapted from Thinking Orbs (MIT), Jakub Antalik, commit de85557.\r\n// See packages/components/loading/THIRD_PARTY_NOTICES.md.\r\n// Orbits: particles on tilted orbits — the \"working\" state. No nucleus\r\n// (the tuned preset runs coreless): just ghost paths and the particles\r\n// doing the work.\r\n\r\nimport type { Dot, ModeFrame } from '../loading-frame'\r\nimport { finalizeFrame, hashD, makeProj, radiusScale } from '../loading-geometry'\r\n\r\nexport const frameOrbits: ModeFrame = (size, t, o) => {\r\n const cx = size / 2\r\n const cy = size / 2\r\n const R = (size / 2) * 0.82\r\n const pt = makeProj(t * 0.12, 0.3, cx, cy, 1)\r\n const rs = radiusScale(size, o.rsPow ?? 0.6)\r\n\r\n const dots: Dot[] = []\r\n const orbitN = o.orbitN ?? 12\r\n const ghostN = o.ghostN ?? 40\r\n const particles = o.particles ?? 3\r\n\r\n // orbits: each a tilted circle — a ghost path + running particles\r\n for (let orb = 0; orb < orbitN; orb++) {\r\n const h1 = hashD(orb, 1.7)\r\n const h2 = hashD(orb, 5.2)\r\n const h3 = hashD(orb, 8.9)\r\n const ro = R * (0.45 + 0.52 * h1)\r\n const th = h1 * 2 * Math.PI\r\n const phi = Math.acos(2 * h2 - 1)\r\n // orbit plane basis (u, v ⟂ normal n)\r\n const nx = Math.sin(phi) * Math.cos(th)\r\n const ny = Math.cos(phi)\r\n const nz = Math.sin(phi) * Math.sin(th)\r\n let ux = -ny\r\n let uy = nx\r\n const uz = 0\r\n const ul = Math.max(1e-6, Math.sqrt(ux * ux + uy * uy))\r\n ux /= ul\r\n uy /= ul\r\n const vx = ny * uz - nz * uy\r\n const vy = nz * ux - nx * uz\r\n const vz = nx * uy - ny * ux\r\n const speed = (0.25 + 0.55 * h3) * (h3 > 0.5 ? 1 : -1)\r\n\r\n // ghost path\r\n for (let k = 0; k < ghostN; k++) {\r\n const a = (k / ghostN) * 2 * Math.PI\r\n const [px, py, z] = pt(\r\n (ux * Math.cos(a) + vx * Math.sin(a)) * ro,\r\n (uy * Math.cos(a) + vy * Math.sin(a)) * ro,\r\n (uz * Math.cos(a) + vz * Math.sin(a)) * ro\r\n )\r\n const depth = (z / ro + 1) / 2\r\n dots.push({\r\n x: px,\r\n y: py,\r\n z,\r\n r: (o.ghostR ?? 0.9) * rs,\r\n white: 0.72,\r\n a: (o.ghostA ?? 0.5) * (0.4 + 0.6 * depth)\r\n })\r\n }\r\n // the particles doing the work\r\n for (let m = 0; m < particles; m++) {\r\n const a = t * speed + (m / particles) * 2 * Math.PI + h2 * 6\r\n const [px, py, z] = pt(\r\n (ux * Math.cos(a) + vx * Math.sin(a)) * ro,\r\n (uy * Math.cos(a) + vy * Math.sin(a)) * ro,\r\n (uz * Math.cos(a) + vz * Math.sin(a)) * ro\r\n )\r\n const depth = (z / ro + 1) / 2\r\n dots.push({\r\n x: px,\r\n y: py,\r\n z,\r\n r: ((o.partR ?? 1.2) + (o.partRDepth ?? 1.6) * depth) * rs,\r\n white: 0.3 - 0.22 * depth\r\n })\r\n }\r\n }\r\n return finalizeFrame(dots, [], o.rMin)\r\n}\r\n","// Adapted from Thinking Orbs (MIT), Jakub Antalik, commit de85557.\r\n// See packages/components/loading/THIRD_PARTY_NOTICES.md.\r\n// Ribbon: an undulating sash of parallel strands rides a great circle —\r\n// the \"composing\" state. The tuned preset freezes the 3D tumble\r\n// (spin 0), leaving the traveling undulation on a fixed band.\r\n//\r\n// The same painter also drives \"breathing\" (ring), via the `faceOn` flag:\r\n// a face-on circle whose radius — not its out-of-plane offset — undulates,\r\n// so it reads as a ring slowly morphing rather than a sash in orbit.\r\n\r\nimport type { Dot, ModeFrame } from '../loading-frame'\r\nimport { fibDir, finalizeFrame, makeProj, radiusScale } from '../loading-geometry'\r\n\r\nexport const frameRibbon: ModeFrame = (size, t, o) => {\r\n const cx = size / 2\r\n const cy = size / 2\r\n const R = (size / 2) * 0.78\r\n // spin scales the 3D tumble; spin=0 freezes the band's orientation,\r\n // leaving only the traveling undulation\r\n const spin = o.spin ?? 1\r\n const camTilt = 0.3\r\n const pt = makeProj(t * 0.1 * spin, camTilt, cx, cy, 1)\r\n const rs = radiusScale(size, o.rsPow ?? 0.6)\r\n\r\n const dots: Dot[] = []\r\n const ghostN = o.ghostN ?? 150\r\n for (let i = 0; i < ghostN; i++) {\r\n const d = fibDir(i, ghostN)\r\n const [px, py, z] = pt(d[0] * R, d[1] * R, d[2] * R)\r\n const depth = (z / R + 1) / 2\r\n dots.push({ x: px, y: py, z, r: 0.8 * rs, white: 0.78, a: 0.1 + 0.22 * depth })\r\n }\r\n\r\n // The band plane, precessing (frozen when spin=0). The projection squashes\r\n // the band's great circle vertically by cos(ta + camTilt); face-on sets\r\n // ta = -camTilt so that term is 1 and the band reads as a true circle\r\n // rather than ribbon's tilted ellipse.\r\n const ya = t * 0.24 * spin\r\n const ta = o.faceOn ? -camTilt : 0.55 + 0.3 * Math.sin(t * 0.18) * spin\r\n const ux = Math.cos(ya)\r\n const uy = 0\r\n const uz = Math.sin(ya)\r\n const vx = -uz * Math.sin(ta)\r\n const vy = Math.cos(ta)\r\n const vz = ux * Math.sin(ta)\r\n // plane normal n = u × v\r\n const nx = uy * vz - uz * vy\r\n const ny = uz * vx - ux * vz\r\n const nz = ux * vy - uy * vx\r\n\r\n // Radial lobes swell past R, so pull the base radius in by (most of) the\r\n // wobble amplitude. The silhouette then stays inside the frame however far\r\n // the deformation is pushed, while lobes keep getting deeper relative to\r\n // the mean radius.\r\n const wobAmp = 0.23 * (o.wobMul ?? 1)\r\n const baseR = o.faceOn ? R / (1 + 0.85 * wobAmp) : R\r\n\r\n const baseLanes = o.lanes ?? 5\r\n const segs = o.segs ?? 88\r\n const lanes = Math.max(1, Math.round(baseLanes * (o.bandMul ?? 1)))\r\n for (let w = 0; w < lanes; w++) {\r\n const laneOff = (w - (lanes - 1) / 2) * 0.075\r\n const edge = Math.abs(w - (lanes - 1) / 2) / Math.max(1, (lanes - 1) / 2)\r\n for (let k = 0; k < segs; k++) {\r\n const a = (k / segs) * 2 * Math.PI\r\n // the undulation: two traveling waves along the band; wobMul\r\n // scales the deformation — 0 is a clean band\r\n const wob =\r\n (0.16 * Math.sin(a * 3 - t * 1.7 + w * 0.22) + 0.07 * Math.sin(a * 5 + t * 1.1)) *\r\n (o.wobMul ?? 1)\r\n // A normal-direction wobble is cancelled by the re-normalisation below:\r\n // the point lands back on the sphere, so the silhouette is pinned at R\r\n // and the deformation can only ever pull dots inward. Face-on instead\r\n // modulates the in-plane RADIUS, so lobes genuinely swell outward and\r\n // pinch inward. Ribbon keeps the original out-of-plane sash wobble.\r\n const radial = o.faceOn ? 1 + wob : 1\r\n const off = o.faceOn ? laneOff : laneOff + wob\r\n const x = ux * Math.cos(a) + vx * Math.sin(a) + nx * off\r\n const y = uy * Math.cos(a) + vy * Math.sin(a) + ny * off\r\n const z = uz * Math.cos(a) + vz * Math.sin(a) + nz * off\r\n const l = Math.sqrt(x * x + y * y + z * z)\r\n const rr = baseR * radial\r\n const [px, py, zr] = pt((x / l) * rr, (y / l) * rr, (z / l) * rr)\r\n const depth = (zr / R + 1) / 2\r\n dots.push({\r\n x: px,\r\n y: py,\r\n z: zr,\r\n r: ((o.rBase ?? 1.1) + (o.rDepth ?? 1.7) * depth) * (1 - 0.25 * edge) * rs,\r\n white: 0.52 - 0.44 * depth + 0.18 * edge,\r\n a: 0.4 + 0.6 * depth\r\n })\r\n }\r\n }\r\n return finalizeFrame(dots, [], o.rMin)\r\n}\r\n","// Adapted from Thinking Orbs (MIT), Jakub Antalik, commit de85557.\r\n// See packages/components/loading/THIRD_PARTY_NOTICES.md.\r\n// Morph: a dotted outline cycling circle → triangle → square → circle —\r\n// the \"shaping\" state. Each shape is a continuous closed path\r\n// parameterised by arc length (top-centre start, clockwise). Every\r\n// frame the engine blends the two neighbouring paths, then lays the\r\n// dots EVENLY along the blended outline — spacing stays uniform at\r\n// every instant of the morph, holds and transitions alike. Plain\r\n// circle fills only: no canvas/SVG filters, fully cross-browser.\r\n\r\nimport type { Dot, ModeFrame } from '../loading-frame'\r\nimport { finalizeFrame } from '../loading-geometry'\r\n\r\ntype Path = (f: number) => [number, number]\r\n\r\nfunction smoothE(x: number): number {\r\n return x * x * (3 - 2 * x)\r\n}\r\n\r\nfunction polyPath(verts: ReadonlyArray<readonly [number, number]>): Path {\r\n const V = verts.length\r\n const L: number[] = []\r\n let total = 0\r\n for (let i = 0; i < V; i++) {\r\n const a = verts[i]\r\n const b = verts[(i + 1) % V]\r\n const l = Math.hypot(b[0] - a[0], b[1] - a[1])\r\n L.push(l)\r\n total += l\r\n }\r\n return (f) => {\r\n let target = f * total\r\n let i = 0\r\n while (target > L[i] && i < V - 1) {\r\n target -= L[i]\r\n i++\r\n }\r\n const a = verts[i]\r\n const b = verts[(i + 1) % V]\r\n const ff = L[i] ? Math.min(1, target / L[i]) : 0\r\n return [a[0] + (b[0] - a[0]) * ff, a[1] + (b[1] - a[1]) * ff]\r\n }\r\n}\r\n\r\nconst CIRCLE: Path = (f) => {\r\n const a = -Math.PI / 2 + f * 2 * Math.PI\r\n return [Math.cos(a) * 0.24, Math.sin(a) * 0.24]\r\n}\r\nconst TRIANGLE = polyPath([\r\n [0.0, -0.26],\r\n [0.24, 0.16],\r\n [-0.24, 0.16]\r\n])\r\n// 5-vertex walk so the path STARTS at top-centre like the other shapes\r\nconst SQUARE = polyPath([\r\n [0, -0.2],\r\n [0.2, -0.2],\r\n [0.2, 0.2],\r\n [-0.2, 0.2],\r\n [-0.2, -0.2]\r\n])\r\nconst CYCLE: Path[] = [CIRCLE, TRIANGLE, SQUARE]\r\n\r\n// low floor keeps sparse outlines possible while never degenerating\r\nfunction morphN(d: number): number {\r\n return Math.max(6, Math.round(34 * d))\r\n}\r\n\r\nconst HOLD = 1.4\r\nconst MORPH = 0.9\r\nconst SEG = HOLD + MORPH\r\n\r\n// This state was tuned in inkform, which paints it through a blur +\r\n// threshold \"goo\" filter; we draw plain circles instead, since `ctx.filter`\r\n// and SVG filter refs are not safe to rely on across Chrome / Safari /\r\n// Firefox. The dot GEOMETRY is identical either way — the threshold just\r\n// yields a hard edge where a plain fill has an antialiased one, so these\r\n// dots read a touch softer than inkform's. Don't \"correct\" for that by\r\n// shrinking the radius: it makes the mark genuinely smaller than the tuning.\r\n\r\nexport const frameMorph: ModeFrame = (size, t, o) => {\r\n const K = CYCLE.length\r\n const tc = t % (SEG * K)\r\n const k = Math.floor(tc / SEG)\r\n const local = tc - k * SEG\r\n const m = local > HOLD ? smoothE((local - HOLD) / MORPH) : 0\r\n const sprd = o.spread ?? 1\r\n\r\n // blend the two shape PATHS at m, then measure the blended outline\r\n const pA = CYCLE[k]\r\n const pB = CYCLE[(k + 1) % K]\r\n const M = 160\r\n const pts: Array<[number, number]> = []\r\n for (let i = 0; i < M; i++) {\r\n const f = i / M\r\n const a = pA(f)\r\n const b = pB(f)\r\n pts.push([(a[0] + (b[0] - a[0]) * m) * sprd, (a[1] + (b[1] - a[1]) * m) * sprd])\r\n }\r\n const L: number[] = []\r\n let total = 0\r\n for (let i = 0; i < M; i++) {\r\n const a = pts[i]\r\n const b = pts[(i + 1) % M]\r\n const l = Math.hypot(b[0] - a[0], b[1] - a[1])\r\n L.push(l)\r\n total += l\r\n }\r\n\r\n // dot radius depends ONLY on rDot (the size knob); the count sets the\r\n // gaps. Formed shapes breathe a little (uniform pulse).\r\n const n = morphN(o.iconD ?? 1)\r\n const re = (o.rDot ?? 0.021) * 1.35 * sprd\r\n const pulse = 1 + 0.02 * Math.sin(local * 3.1)\r\n\r\n const dots: Dot[] = []\r\n const c2 = size / 2\r\n let seg = 0\r\n let acc = 0\r\n for (let k2 = 0; k2 < n; k2++) {\r\n const target = (k2 / n) * total\r\n while (acc + L[seg] < target && seg < M - 1) {\r\n acc += L[seg]\r\n seg++\r\n }\r\n const a = pts[seg]\r\n const b = pts[(seg + 1) % M]\r\n const f = L[seg] ? Math.min(1, (target - acc) / L[seg]) : 0\r\n const x = (a[0] + (b[0] - a[0]) * f) * pulse\r\n const y = (a[1] + (b[1] - a[1]) * f) * pulse\r\n dots.push({\r\n x: c2 + x * size,\r\n y: c2 + y * size,\r\n z: 0,\r\n r: Math.max(0.35, re * size),\r\n white: 0.1\r\n })\r\n }\r\n return finalizeFrame(dots, [], o.rMin)\r\n}\r\n","// Generated from Natural Earth v5.1.2. Do not edit; see THIRD_PARTY_NOTICES.md.\r\n// Input SHA256: 9e0729ee253ca7d7a5c4ae9395fb1902264c5377c52e224d13dd85010e2835d9\r\nexport const earthPointData = {\r\n '20': {\r\n rings: 9,\r\n flags:\r\n '01100000000000000000000000000000100010000100000011000110011000000000011111100000011001001100011000111010'\r\n },\r\n '32': {\r\n rings: 17,\r\n flags:\r\n '011001001111000000000000000000000100000000000000000000010000000000000000000000000110000010000000101000000000000111000001110000001110000000000001111000011100000000000000000000001110000011110000001000000000000000100000111111000000000000000000100000001111111010100000000000011000000110011111111000000011110000101001111100000011110001111111100011100001111111000000010000'\r\n },\r\n '48': {\r\n rings: 29,\r\n flags:\r\n '111011111111001011001111111100000000000000101111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000001000000000000001100000000000000000000000001100000000000000000001100000000001100000000000011111000000000000000000001110000000001110100000000001111100000000000000000000011111000000001111010000000000011100000000000000000000001111110000000011110000000000000001100000000000000000000011111111000000011111000000000000000010100000000000000000000111100000000001111100000000000100000000000000000000000000011100000000111111111000001000000000000000000000000000000100000000001111111111000001000100000000000000000000000101001000000001111111111100110110000000000000000000001110010000000001111111111001111111100000000000000000111110000000000111110111111111111000000000000000011111100000000100001111111111110010000000000011111100000000101101111111111100000000000111111010000011111111111111100000000011110100000100111111111110100011111010100010111111111111111010010001011111110001001100001000000110000000'\r\n },\r\n '64': {\r\n rings: 37,\r\n flags:\r\n '111011111111011110011111111100000001000111111111110000000000000000001101111100000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000011100000000000010000000000000001000111000000000000000000000000111100000000000011100000000000000011111110000000000000000000000000111100000000000011110100000000000011111110000000000000000000000000001111110000000000111100100000000000000111110000000000000000000000000001111111100000000001111110100000000000000011000000000000000000000000000001111111110000000000111110000000000000000000000001000000000000000000000000111111111000000000011111100000000000000000000100000000000000000000000000001111110000000000001111111000000000000101100000000000000000000000000000000001111100000000000011111111000000000011001000000000000000000000000000000000001100000000011111111111110000010000010000000000000000000000000000000011000000000000011111111111110000011000110000000000000000000000000000011000010000000000111111111111111000110011000000000000000000000000000011000100000000000111111111111110011111111110000000000000000000000011100000000000000011111111111111111111111100000000000000000000011111110000000000001110000111111111111110000000000000000000011111110000000000010000011101111111111000000000000000000011111111000000000010110010111111111111000000000000001111111101000000111111111111111111110000000000001111101110000011111111111111111110000000001111100100000010101111111111110010011111111010100000111111111111111101111010011000011111111111100001110110000001110000001011101000000000000000000'\r\n },\r\n '96': {\r\n rings: 53,\r\n flags:\r\n '111111111111001111011111111100111110011111111111110000110111000111111111111110000000000001000000111111111111111100000000000000000000000000110111111110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000001100000000000000000000000000000000000000000000000001000000000000000000000000011100000000000000000000000000000000000000000000000000001000000000000000000000000011110000000000000000000000000000000000000000000000110000001000000000000000000000000000111100000000000000000011000000000000000000000010000111000000000000000000000000000000000001111100000000000000000111100000000000000000000011111111110000000000000000000000000000000000011111100000000000000001111100000000000000000000011111111110000000000000000000000000000000000000111111100000000000000001111110010000000000000000001111111111000000000000000000000000000000000000001111111100000000000000011111100100000000000000000000111111110000000000000000000000000000000000000001111111110000000000000011111111011000000000000000000001111101000000000000000000000000000000000000000111111111110000000000000001111111100000000000000000000000001101000000000000000000000000000000000000000011111111111100000000000000111111110000000000000000000000000000000100000000000000000000000000000000000000111111111111100000000000000111111100000000000000000000110000000111000000000000000000000000000000000000000111111111111000000000000000111111110000000000000000000101101000111000000000000000000000000000000000000000011111111100000000000000000111111111100000000000000000100110000000000000000000000000000000000000000000000000111111100000000000000000011111111111000000000000000110001000000000000000000000000000000000000000000000000111111000000000000001111111111111111100000000010000010000001000000000000000000000000000000000000000000000011100000000000000111111111111111111100000000000000000000000000000000000000000000000000000000000000011000000000000000000011111111111111111110000000110000011100000000000000000000000000000000000000000001110000000000000000000011111111111111110111000000110001111000000000000000000000000000000000000000001100100010000000000000001111111111111110111110000111101111000000000000000000000000000000000000000011100000000000000000000001111111111111111111100111111111111111000000000000000000000000000000000011100001000000000000000001111111111110111011111111111111111100000000000000000000000000000000111111110000000000000000000111111111111111111111111111111111000000000000000000000000000000111111111000000000000000000111100000011111111111111111111100100000000000000000000000001111111111100000000000000011000000011111011111111111111100100000000000000000000000011111111111000000000000000110100111111001111111111111101000000000000000000000001111111111110000000000000011101110010111111111111111111010000000000000000000111111111101010000000000111111111111111111111111111100000000000000000011111111111111000000000111111111111111111111111111100000000000000011111111011110000000000001111111111111111111110001000000000001111110001100000000000010111111111111111111000100000111111111100100010000000101111111111111111111010001111111111111001000100010111111111111111111110111111001010011000001111111111111111111000001111101110000000101111111100000000010011100000000110000000000011110010000000000000101100000000000000000000'\r\n }\r\n} as const\r\n","import { earthPointData } from '../earth-points'\r\nimport { angleDelta, finalizeFrame, makeProj } from '../loading-geometry'\r\nimport type { Dot, OrbFrame } from '../loading-frame'\r\nimport type { FlLoadingSize } from '../loading'\r\n\r\nexport interface EarthPoint {\r\n x: number\r\n y: number\r\n z: number\r\n lon: number\r\n land: boolean\r\n}\r\nconst cache = new Map<FlLoadingSize, EarthPoint[]>()\r\n\r\n/** Reconstruct stable geographic positions once, not on every animation frame. */\r\nexport function getEarthPoints(size: FlLoadingSize): EarthPoint[] {\r\n const hit = cache.get(size)\r\n if (hit) return hit\r\n const { rings, flags } = earthPointData[size]\r\n const points: EarthPoint[] = []\r\n let index = 0\r\n for (let row = 0; row < rings; row++) {\r\n const lat = -Math.PI / 2 + ((row + 0.5) / rings) * Math.PI\r\n const count = Math.max(1, Math.round(2 * rings * Math.cos(lat)))\r\n for (let col = 0; col < count; col++, index++) {\r\n const lon = -Math.PI + (col / count) * 2 * Math.PI\r\n const land = flags[index] === '1'\r\n if (!land && index % 3 !== 0) continue\r\n points.push({\r\n x: Math.cos(lat) * Math.cos(lon),\r\n y: Math.sin(lat),\r\n z: Math.cos(lat) * Math.sin(lon),\r\n lon,\r\n land\r\n })\r\n }\r\n }\r\n cache.set(size, points)\r\n return points\r\n}\r\n\r\nexport function frameEarth(size: FlLoadingSize, time: number): OrbFrame {\r\n // Looking at 35°E initially: Africa, Europe and western Asia. East-positive coordinates.\r\n const yaw = (35 * Math.PI) / 180 - Math.PI / 2 + time * 0.22\r\n const project = makeProj(yaw, 0.18, size / 2, size / 2, size * 0.43)\r\n const dots: Dot[] = []\r\n for (const p of getEarthPoints(size)) {\r\n const [x, y, z] = project(p.x, p.y, p.z)\r\n if (z <= 0) continue\r\n const scan = Math.exp(-Math.pow(angleDelta(p.lon, time * 0.9), 2) / 0.08)\r\n const edge = Math.min(1, z / 0.14)\r\n dots.push({\r\n x,\r\n y,\r\n z,\r\n r:\r\n (size <= 32 ? 0.48 : 0.52) *\r\n (size / 64) ** 0.25 *\r\n (1 + 0.2 * z + (p.land ? 0.22 * scan : 0)),\r\n white: p.land ? 0.08 + 0.2 * (1 - z) : 0.65,\r\n a: edge * (p.land ? 0.82 + scan * 0.18 : 0.2)\r\n })\r\n }\r\n return finalizeFrame(dots, [], 0.3)\r\n}\r\n","import type { FlLoadingAnimation, FlLoadingSize } from './loading'\r\nimport type { ModeFrame, OrbFrame } from './loading-frame'\r\nimport { resolvePreset } from './loading-presets'\r\nimport { frameGlobe } from './animations/searching'\r\nimport { frameRubik } from './animations/solving'\r\nimport { frameWave } from './animations/listening'\r\nimport { frameOrbits } from './animations/working'\r\nimport { frameRibbon } from './animations/composing'\r\nimport { frameMorph } from './animations/shaping'\r\nimport { frameEarth } from './animations/earth'\r\n\r\nconst frames: Record<Exclude<FlLoadingAnimation, 'earth'>, ModeFrame> = {\r\n searching: frameGlobe,\r\n solving: frameRubik,\r\n listening: frameWave,\r\n working: frameOrbits,\r\n composing: frameRibbon,\r\n shaping: frameMorph\r\n}\r\nexport function createLoadingFrame(\r\n animation: FlLoadingAnimation,\r\n size: FlLoadingSize,\r\n time: number\r\n) {\r\n if (animation === 'earth') return frameEarth(size, time)\r\n const { speed, opts } = resolvePreset(animation, size)\r\n const frame = frames[animation](size, time * speed, opts)\r\n // Evenly subsample tiny indicators without destroying the relative spatial arrangement.\r\n if (size === 20 && frame.dots.length > 120) {\r\n const count = frame.dots.length\r\n frame.dots = Array.from({ length: 120 }, (_, i) => frame.dots[Math.floor((i * count) / 120)])\r\n }\r\n return frame\r\n}\r\n\r\nexport function paintLoadingFrame(ctx: CanvasRenderingContext2D, frame: OrbFrame, color: string) {\r\n ctx.fillStyle = color\r\n for (const dot of frame.dots) {\r\n ctx.globalAlpha = Math.max(0, Math.min(1, (dot.a ?? 1) * (1 - dot.white)))\r\n ctx.beginPath()\r\n ctx.arc(dot.x, dot.y, dot.r, 0, Math.PI * 2)\r\n ctx.fill()\r\n }\r\n ctx.globalAlpha = 1\r\n}\r\n","import { onActivated, onDeactivated, onMounted, onScopeDispose, ref, watch } from 'vue'\r\nimport type { Ref } from 'vue'\r\nimport { normalizeAnimation, normalizeSize, normalizeSpeed } from './loading'\r\nimport type { FlLoadingAnimation, FlLoadingSize } from './loading'\r\nimport { createLoadingFrame, paintLoadingFrame } from './loading-renderer'\r\n\r\ninterface AnimationOptions {\r\n active: boolean\r\n paused: boolean\r\n animation: FlLoadingAnimation\r\n size: FlLoadingSize\r\n speed: number\r\n}\r\n\r\nexport function useLoadingAnimation(\r\n canvas: Ref<HTMLCanvasElement | undefined>,\r\n options: () => AnimationOptions,\r\n color: Ref<string>\r\n) {\r\n const available = ref(true)\r\n let ctx: CanvasRenderingContext2D | null = null\r\n let raf: number | undefined\r\n let previous: number | undefined\r\n let elapsed = 0\r\n let enabled = true\r\n let inView = true\r\n let reduced = false\r\n let mounted = false\r\n let dpr = 1\r\n let observer: IntersectionObserver | undefined\r\n let motion: MediaQueryList | undefined\r\n const stop = () => {\r\n if (raf !== undefined) cancelAnimationFrame(raf)\r\n raf = undefined\r\n previous = undefined\r\n }\r\n const running = () =>\r\n mounted &&\r\n ctx &&\r\n enabled &&\r\n inView &&\r\n options().active &&\r\n !options().paused &&\r\n !reduced &&\r\n document.visibilityState !== 'hidden'\r\n const paint = () => {\r\n if (!ctx || !canvas.value) return\r\n const size = normalizeSize(options().size)\r\n const ratio = Math.min(2, Math.max(1, window.devicePixelRatio || 1))\r\n if (canvas.value.width !== Math.round(size * ratio) || ratio !== dpr) {\r\n canvas.value.width = Math.round(size * ratio)\r\n canvas.value.height = Math.round(size * ratio)\r\n }\r\n dpr = ratio\r\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0)\r\n ctx.clearRect(0, 0, size, size)\r\n try {\r\n paintLoadingFrame(\r\n ctx,\r\n createLoadingFrame(normalizeAnimation(options().animation), size, reduced ? 0.6 : elapsed),\r\n color.value\r\n )\r\n } catch {\r\n available.value = false\r\n ctx = null\r\n stop()\r\n }\r\n }\r\n const tick = (now: number) => {\r\n raf = undefined\r\n if (!running()) {\r\n previous = undefined\r\n return\r\n }\r\n if (previous !== undefined)\r\n elapsed += (Math.min(100, now - previous) / 1000) * normalizeSpeed(options().speed)\r\n previous = now\r\n paint()\r\n if (running()) raf = requestAnimationFrame(tick)\r\n }\r\n const sync = () => {\r\n if (!mounted) return\r\n if (!running()) stop()\r\n if (options().active && inView && enabled && document.visibilityState !== 'hidden') paint()\r\n if (running() && raf === undefined) raf = requestAnimationFrame(tick)\r\n }\r\n const motionChange = () => {\r\n reduced = motion?.matches ?? false\r\n sync()\r\n }\r\n watch(\r\n () => [\r\n options().active,\r\n options().paused,\r\n options().animation,\r\n options().size,\r\n options().speed,\r\n color.value\r\n ],\r\n sync,\r\n { flush: 'post' }\r\n )\r\n onMounted(() => {\r\n mounted = true\r\n try {\r\n ctx = canvas.value?.getContext('2d') ?? null\r\n } catch {\r\n ctx = null\r\n }\r\n available.value = !!ctx\r\n motion = window.matchMedia?.('(prefers-reduced-motion: reduce)')\r\n reduced = motion?.matches ?? false\r\n motion?.addEventListener('change', motionChange)\r\n if (typeof IntersectionObserver !== 'undefined' && canvas.value) {\r\n observer = new IntersectionObserver(([entry]) => {\r\n inView = entry.isIntersecting\r\n sync()\r\n })\r\n observer.observe(canvas.value)\r\n }\r\n document.addEventListener('visibilitychange', sync)\r\n window.addEventListener('resize', sync)\r\n sync()\r\n })\r\n onActivated(() => {\r\n enabled = true\r\n sync()\r\n })\r\n onDeactivated(() => {\r\n enabled = false\r\n stop()\r\n })\r\n onScopeDispose(() => {\r\n mounted = false\r\n stop()\r\n observer?.disconnect()\r\n motion?.removeEventListener('change', motionChange)\r\n if (typeof document !== 'undefined') document.removeEventListener('visibilitychange', sync)\r\n if (typeof window !== 'undefined') window.removeEventListener('resize', sync)\r\n ctx = null\r\n })\r\n return { available }\r\n}\r\n","<template>\r\n <span\r\n ref=\"root\"\r\n :class=\"[ns.b(), ns.m(layout), ns.is('inactive', !active)]\"\r\n :style=\"{ '--fl-loading-size': `${resolvedSize}px` }\"\r\n :role=\"active ? 'status' : undefined\"\r\n :aria-live=\"active ? 'polite' : 'off'\"\r\n :aria-hidden=\"!active || undefined\"\r\n :aria-label=\"!text && !$slots.text ? ariaLabel : undefined\">\r\n <span :class=\"ns.e('visual')\" aria-hidden=\"true\">\r\n <canvas\r\n v-show=\"available\"\r\n ref=\"canvas\"\r\n :class=\"ns.e('canvas')\"\r\n :style=\"{ width: `${resolvedSize}px`, height: `${resolvedSize}px` }\" />\r\n <span v-if=\"!available\" :class=\"ns.e('fallback')\" :style=\"{ color: resolvedColor }\">●</span>\r\n </span>\r\n <span v-if=\"text || $slots.text\" :class=\"ns.e('text')\"\r\n ><slot name=\"text\">{{ text }}</slot></span\r\n >\r\n </span>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { computed, ref } from 'vue'\r\nimport { useNamespace } from '@falcon-ui/utils'\r\nimport { flLoadingProps, normalizeSize } from './loading'\r\nimport { useLoadingColor } from './use-loading-color'\r\nimport { useLoadingAnimation } from './use-loading-animation'\r\n\r\ndefineOptions({ name: 'FlLoading' })\r\nconst props = defineProps(flLoadingProps)\r\ndefineSlots<{ text?: () => unknown }>()\r\nconst ns = useNamespace('loading')\r\nconst root = ref<HTMLSpanElement>()\r\nconst canvas = ref<HTMLCanvasElement>()\r\nconst resolvedSize = computed(() => normalizeSize(props.size))\r\nconst resolvedColor = useLoadingColor(\r\n () => root.value,\r\n () => props\r\n)\r\nconst { available } = useLoadingAnimation(canvas, () => props, resolvedColor)\r\n</script>\r\n","<template>\r\n <span\r\n ref=\"root\"\r\n :class=\"[ns.b(), ns.m(layout), ns.is('inactive', !active)]\"\r\n :style=\"{ '--fl-loading-size': `${resolvedSize}px` }\"\r\n :role=\"active ? 'status' : undefined\"\r\n :aria-live=\"active ? 'polite' : 'off'\"\r\n :aria-hidden=\"!active || undefined\"\r\n :aria-label=\"!text && !$slots.text ? ariaLabel : undefined\">\r\n <span :class=\"ns.e('visual')\" aria-hidden=\"true\">\r\n <canvas\r\n v-show=\"available\"\r\n ref=\"canvas\"\r\n :class=\"ns.e('canvas')\"\r\n :style=\"{ width: `${resolvedSize}px`, height: `${resolvedSize}px` }\" />\r\n <span v-if=\"!available\" :class=\"ns.e('fallback')\" :style=\"{ color: resolvedColor }\">●</span>\r\n </span>\r\n <span v-if=\"text || $slots.text\" :class=\"ns.e('text')\"\r\n ><slot name=\"text\">{{ text }}</slot></span\r\n >\r\n </span>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { computed, ref } from 'vue'\r\nimport { useNamespace } from '@falcon-ui/utils'\r\nimport { flLoadingProps, normalizeSize } from './loading'\r\nimport { useLoadingColor } from './use-loading-color'\r\nimport { useLoadingAnimation } from './use-loading-animation'\r\n\r\ndefineOptions({ name: 'FlLoading' })\r\nconst props = defineProps(flLoadingProps)\r\ndefineSlots<{ text?: () => unknown }>()\r\nconst ns = useNamespace('loading')\r\nconst root = ref<HTMLSpanElement>()\r\nconst canvas = ref<HTMLCanvasElement>()\r\nconst resolvedSize = computed(() => normalizeSize(props.size))\r\nconst resolvedColor = useLoadingColor(\r\n () => root.value,\r\n () => props\r\n)\r\nconst { available } = useLoadingAnimation(canvas, () => props, resolvedColor)\r\n</script>\r\n","import { computed, defineComponent, h, onScopeDispose, ref, toValue, watch } from 'vue'\r\nimport type { ComputedRef, MaybeRefOrGetter, VNode } from 'vue'\r\nimport type { LoadingOptions } from 'element-plus'\r\nimport { useNamespace } from '@falcon-ui/utils'\r\nimport FlLoading from './FlLoading.vue'\r\nimport type { FlLoadingProps } from './loading'\r\nimport { useLoadingColor } from './use-loading-color'\r\n\r\nexport interface FlLoadingOptions extends Omit<FlLoadingProps, 'active'> {\r\n background?: string\r\n customClass?: string\r\n themeTarget?: MaybeRefOrGetter<HTMLElement | null | undefined>\r\n}\r\n\r\n/** Plain values are also accepted by the native directive's narrower binding type. */\r\nexport interface FlLoadingDirectiveOptions {\r\n text: VNode\r\n customClass: string\r\n background?: string\r\n}\r\n\r\n/** Create options for the ORIGINAL Element Plus directive; install vLoading separately. */\r\nexport function useFlLoading(\r\n active: MaybeRefOrGetter<boolean>,\r\n options: MaybeRefOrGetter<FlLoadingOptions> = {}\r\n): ComputedRef<false | FlLoadingDirectiveOptions> {\r\n const ns = useNamespace('loading')\r\n const alive = ref(true)\r\n const generation = ref(0)\r\n const resolved = computed(() => toValue(options))\r\n const color = useLoadingColor(\r\n () => toValue(resolved.value.themeTarget),\r\n () => resolved.value\r\n )\r\n watch(\r\n () => toValue(active),\r\n () => generation.value++,\r\n { flush: 'sync' }\r\n )\r\n onScopeDispose(() => {\r\n alive.value = false\r\n })\r\n // A closing instance must stay stopped even when a new request opens before its transition ends.\r\n const Content = defineComponent({\r\n name: 'FlLoadingContent',\r\n props: { generation: { type: Number, required: true } },\r\n setup(props) {\r\n const ownGeneration = props.generation\r\n return () => {\r\n const {\r\n background: _background,\r\n customClass: _customClass,\r\n themeTarget: _target,\r\n ...visual\r\n } = resolved.value\r\n return h(FlLoading, {\r\n layout: 'vertical',\r\n ...visual,\r\n color: color.value,\r\n active: alive.value && toValue(active) && ownGeneration === generation.value\r\n })\r\n }\r\n }\r\n })\r\n return computed(() => {\r\n if (!alive.value || !toValue(active)) return false\r\n return {\r\n text: h(Content, { generation: generation.value }),\r\n customClass: [ns.b('adapter'), resolved.value.customClass].filter(Boolean).join(' '),\r\n background: resolved.value.background\r\n } satisfies LoadingOptions\r\n })\r\n}\r\n","import Loading from './src/FlLoading.vue'\r\nimport { withInstall } from '@falcon-ui/utils'\r\n\r\nexport const FlLoading = withInstall(Loading)\r\nexport default FlLoading\r\nexport { useFlLoading } from './src/use-fl-loading'\r\nexport type { FlLoadingOptions, FlLoadingDirectiveOptions } from './src/use-fl-loading'\r\nexport type {\r\n FlLoadingProps,\r\n FlLoadingAnimation,\r\n FlLoadingSize,\r\n FlLoadingTheme,\r\n FlLoadingLayout\r\n} from './src/loading'\r\n"],"mappings":"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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
const flLoadingAnimations = [
|
|
3
|
+
"working",
|
|
4
|
+
"searching",
|
|
5
|
+
"solving",
|
|
6
|
+
"listening",
|
|
7
|
+
"composing",
|
|
8
|
+
"shaping",
|
|
9
|
+
"earth"
|
|
10
|
+
];
|
|
11
|
+
const flLoadingSizes = [
|
|
12
|
+
20,
|
|
13
|
+
32,
|
|
14
|
+
48,
|
|
15
|
+
64,
|
|
16
|
+
96
|
|
17
|
+
];
|
|
18
|
+
const flLoadingProps = {
|
|
19
|
+
active: {
|
|
20
|
+
type: Boolean,
|
|
21
|
+
default: true
|
|
22
|
+
},
|
|
23
|
+
animation: {
|
|
24
|
+
type: String,
|
|
25
|
+
default: "searching",
|
|
26
|
+
validator: (v) => flLoadingAnimations.includes(v)
|
|
27
|
+
},
|
|
28
|
+
size: {
|
|
29
|
+
type: Number,
|
|
30
|
+
default: 64,
|
|
31
|
+
validator: (v) => flLoadingSizes.includes(v)
|
|
32
|
+
},
|
|
33
|
+
color: {
|
|
34
|
+
type: String,
|
|
35
|
+
default: ""
|
|
36
|
+
},
|
|
37
|
+
theme: {
|
|
38
|
+
type: String,
|
|
39
|
+
default: "auto"
|
|
40
|
+
},
|
|
41
|
+
speed: {
|
|
42
|
+
type: Number,
|
|
43
|
+
default: 1
|
|
44
|
+
},
|
|
45
|
+
paused: {
|
|
46
|
+
type: Boolean,
|
|
47
|
+
default: false
|
|
48
|
+
},
|
|
49
|
+
text: {
|
|
50
|
+
type: String,
|
|
51
|
+
default: ""
|
|
52
|
+
},
|
|
53
|
+
layout: {
|
|
54
|
+
type: String,
|
|
55
|
+
default: "inline"
|
|
56
|
+
},
|
|
57
|
+
ariaLabel: {
|
|
58
|
+
type: String,
|
|
59
|
+
default: "加载中"
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
const normalizeAnimation = (v) => flLoadingAnimations.includes(v) ? v : "searching";
|
|
63
|
+
const normalizeSize = (v) => flLoadingSizes.includes(v) ? v : 64;
|
|
64
|
+
const normalizeSpeed = (v) => Number.isFinite(v) ? Math.max(.25, Math.min(3, v)) : 1;
|
|
65
|
+
exports.flLoadingAnimations = flLoadingAnimations;
|
|
66
|
+
exports.flLoadingProps = flLoadingProps;
|
|
67
|
+
exports.flLoadingSizes = flLoadingSizes;
|
|
68
|
+
exports.normalizeAnimation = normalizeAnimation;
|
|
69
|
+
exports.normalizeSize = normalizeSize;
|
|
70
|
+
exports.normalizeSpeed = normalizeSpeed;
|
|
71
|
+
|
|
72
|
+
//# sourceMappingURL=loading.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loading.cjs","names":[],"sources":["../../../../../../packages/components/loading/src/loading.ts"],"sourcesContent":["import type { ExtractPublicPropTypes, PropType } from 'vue'\r\n\r\nexport const flLoadingAnimations = [\r\n 'working',\r\n 'searching',\r\n 'solving',\r\n 'listening',\r\n 'composing',\r\n 'shaping',\r\n 'earth'\r\n] as const\r\nexport const flLoadingSizes = [20, 32, 48, 64, 96] as const\r\nexport type FlLoadingAnimation = (typeof flLoadingAnimations)[number]\r\nexport type FlLoadingSize = (typeof flLoadingSizes)[number]\r\nexport type FlLoadingTheme = 'auto' | 'light' | 'dark'\r\nexport type FlLoadingLayout = 'inline' | 'vertical'\r\n\r\nexport const flLoadingProps = {\r\n /** Whether to show the indicator. Inactive indicators retain their layout space. */\r\n active: { type: Boolean, default: true },\r\n /** Dot animation, including the land-textured Earth. */\r\n animation: {\r\n type: String as PropType<FlLoadingAnimation>,\r\n default: 'searching',\r\n validator: (v: FlLoadingAnimation) => flLoadingAnimations.includes(v)\r\n },\r\n /** Canvas CSS size in pixels. Each size has its own dot density. */\r\n size: {\r\n type: Number as PropType<FlLoadingSize>,\r\n default: 64,\r\n validator: (v: FlLoadingSize) => flLoadingSizes.includes(v)\r\n },\r\n /** Dot color; accepts CSS colors and CSS variables. */\r\n color: { type: String, default: '' },\r\n /** Background theme used to choose contrasting dots. */\r\n theme: { type: String as PropType<FlLoadingTheme>, default: 'auto' },\r\n /** Animation speed multiplier, clamped to 0.25–3. */\r\n speed: { type: Number, default: 1 },\r\n /** Freeze the current animation time. */\r\n paused: { type: Boolean, default: false },\r\n /** Accessible, selectable status text. */\r\n text: { type: String, default: '' },\r\n /** Position the text beside or below the canvas. */\r\n layout: { type: String as PropType<FlLoadingLayout>, default: 'inline' },\r\n /** Accessible label when no visible text is provided. */\r\n ariaLabel: { type: String, default: '加载中' }\r\n} as const\r\n\r\nexport type FlLoadingProps = ExtractPublicPropTypes<typeof flLoadingProps>\r\nexport const normalizeAnimation = (v: FlLoadingAnimation): FlLoadingAnimation =>\r\n flLoadingAnimations.includes(v) ? v : 'searching'\r\nexport const normalizeSize = (v: FlLoadingSize): FlLoadingSize =>\r\n flLoadingSizes.includes(v) ? v : 64\r\nexport const normalizeSpeed = (v: number) =>\r\n Number.isFinite(v) ? Math.max(0.25, Math.min(3, v)) : 1\r\n"],"mappings":";AAEA,MAAa,sBAAsB;CACjC;CACA;CACA;CACA;CACA;CACA;CACA;CACD;AACD,MAAa,iBAAiB;CAAC;CAAI;CAAI;CAAI;CAAI;CAAG;AAMlD,MAAa,iBAAiB;CAE5B,QAAQ;EAAE,MAAM;EAAS,SAAS;EAAM;CAExC,WAAW;EACT,MAAM;EACN,SAAS;EACT,YAAY,MAA0B,oBAAoB,SAAS,EAAE;EACtE;CAED,MAAM;EACJ,MAAM;EACN,SAAS;EACT,YAAY,MAAqB,eAAe,SAAS,EAAE;EAC5D;CAED,OAAO;EAAE,MAAM;EAAQ,SAAS;EAAI;CAEpC,OAAO;EAAE,MAAM;EAAoC,SAAS;EAAQ;CAEpE,OAAO;EAAE,MAAM;EAAQ,SAAS;EAAG;CAEnC,QAAQ;EAAE,MAAM;EAAS,SAAS;EAAO;CAEzC,MAAM;EAAE,MAAM;EAAQ,SAAS;EAAI;CAEnC,QAAQ;EAAE,MAAM;EAAqC,SAAS;EAAU;CAExE,WAAW;EAAE,MAAM;EAAQ,SAAS;EAAO;CAC5C;AAGD,MAAa,sBAAsB,MACjC,oBAAoB,SAAS,EAAE,GAAG,IAAI;AACxC,MAAa,iBAAiB,MAC5B,eAAe,SAAS,EAAE,GAAG,IAAI;AACnC,MAAa,kBAAkB,MAC7B,OAAO,SAAS,EAAE,GAAG,KAAK,IAAI,KAAM,KAAK,IAAI,GAAG,EAAE,CAAC,GAAG"}
|