mythik-react 0.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/LICENSE +201 -0
- package/NOTICE +4 -0
- package/README.md +83 -0
- package/dist/MythikApp.d.ts +61 -0
- package/dist/MythikApp.d.ts.map +1 -0
- package/dist/MythikApp.js +381 -0
- package/dist/MythikApp.js.map +1 -0
- package/dist/MythikRenderer.d.ts +31 -0
- package/dist/MythikRenderer.d.ts.map +1 -0
- package/dist/MythikRenderer.js +900 -0
- package/dist/MythikRenderer.js.map +1 -0
- package/dist/animation/index.d.ts +7 -0
- package/dist/animation/index.d.ts.map +1 -0
- package/dist/animation/index.js +5 -0
- package/dist/animation/index.js.map +1 -0
- package/dist/animation/stylesheet-singleton.d.ts +12 -0
- package/dist/animation/stylesheet-singleton.d.ts.map +1 -0
- package/dist/animation/stylesheet-singleton.js +107 -0
- package/dist/animation/stylesheet-singleton.js.map +1 -0
- package/dist/animation/useElementAnimations.d.ts +30 -0
- package/dist/animation/useElementAnimations.d.ts.map +1 -0
- package/dist/animation/useElementAnimations.js +254 -0
- package/dist/animation/useElementAnimations.js.map +1 -0
- package/dist/animation/usePrefersReducedMotion.d.ts +2 -0
- package/dist/animation/usePrefersReducedMotion.d.ts.map +1 -0
- package/dist/animation/usePrefersReducedMotion.js +29 -0
- package/dist/animation/usePrefersReducedMotion.js.map +1 -0
- package/dist/animation/useShapeAnimations.d.ts +21 -0
- package/dist/animation/useShapeAnimations.d.ts.map +1 -0
- package/dist/animation/useShapeAnimations.js +119 -0
- package/dist/animation/useShapeAnimations.js.map +1 -0
- package/dist/app-context.d.ts +15 -0
- package/dist/app-context.d.ts.map +1 -0
- package/dist/app-context.js +9 -0
- package/dist/app-context.js.map +1 -0
- package/dist/background/BackgroundLayer.d.ts +7 -0
- package/dist/background/BackgroundLayer.d.ts.map +1 -0
- package/dist/background/BackgroundLayer.js +50 -0
- package/dist/background/BackgroundLayer.js.map +1 -0
- package/dist/background/BackgroundStack.d.ts +19 -0
- package/dist/background/BackgroundStack.d.ts.map +1 -0
- package/dist/background/BackgroundStack.js +59 -0
- package/dist/background/BackgroundStack.js.map +1 -0
- package/dist/background/BlobLayer.d.ts +12 -0
- package/dist/background/BlobLayer.d.ts.map +1 -0
- package/dist/background/BlobLayer.js +60 -0
- package/dist/background/BlobLayer.js.map +1 -0
- package/dist/background/index.d.ts +3 -0
- package/dist/background/index.d.ts.map +1 -0
- package/dist/background/index.js +3 -0
- package/dist/background/index.js.map +1 -0
- package/dist/css-hover.d.ts +15 -0
- package/dist/css-hover.d.ts.map +1 -0
- package/dist/css-hover.js +51 -0
- package/dist/css-hover.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/primitives/accordion.d.ts +12 -0
- package/dist/primitives/accordion.d.ts.map +1 -0
- package/dist/primitives/accordion.js +25 -0
- package/dist/primitives/accordion.js.map +1 -0
- package/dist/primitives/area-chart.d.ts +14 -0
- package/dist/primitives/area-chart.d.ts.map +1 -0
- package/dist/primitives/area-chart.js +18 -0
- package/dist/primitives/area-chart.js.map +1 -0
- package/dist/primitives/audio-player.d.ts +9 -0
- package/dist/primitives/audio-player.d.ts.map +1 -0
- package/dist/primitives/audio-player.js +5 -0
- package/dist/primitives/audio-player.js.map +1 -0
- package/dist/primitives/bar-chart.d.ts +14 -0
- package/dist/primitives/bar-chart.d.ts.map +1 -0
- package/dist/primitives/bar-chart.js +22 -0
- package/dist/primitives/bar-chart.js.map +1 -0
- package/dist/primitives/box.d.ts +21 -0
- package/dist/primitives/box.d.ts.map +1 -0
- package/dist/primitives/box.js +54 -0
- package/dist/primitives/box.js.map +1 -0
- package/dist/primitives/button.d.ts +14 -0
- package/dist/primitives/button.d.ts.map +1 -0
- package/dist/primitives/button.js +28 -0
- package/dist/primitives/button.js.map +1 -0
- package/dist/primitives/camera.d.ts +15 -0
- package/dist/primitives/camera.d.ts.map +1 -0
- package/dist/primitives/camera.js +25 -0
- package/dist/primitives/camera.js.map +1 -0
- package/dist/primitives/checkbox.d.ts +12 -0
- package/dist/primitives/checkbox.d.ts.map +1 -0
- package/dist/primitives/checkbox.js +24 -0
- package/dist/primitives/checkbox.js.map +1 -0
- package/dist/primitives/divider.d.ts +9 -0
- package/dist/primitives/divider.d.ts.map +1 -0
- package/dist/primitives/divider.js +10 -0
- package/dist/primitives/divider.js.map +1 -0
- package/dist/primitives/drawer.d.ts +21 -0
- package/dist/primitives/drawer.d.ts.map +1 -0
- package/dist/primitives/drawer.js +38 -0
- package/dist/primitives/drawer.js.map +1 -0
- package/dist/primitives/file-upload.d.ts +27 -0
- package/dist/primitives/file-upload.d.ts.map +1 -0
- package/dist/primitives/file-upload.js +225 -0
- package/dist/primitives/file-upload.js.map +1 -0
- package/dist/primitives/grid.d.ts +13 -0
- package/dist/primitives/grid.d.ts.map +1 -0
- package/dist/primitives/grid.js +13 -0
- package/dist/primitives/grid.js.map +1 -0
- package/dist/primitives/icon.d.ts +22 -0
- package/dist/primitives/icon.d.ts.map +1 -0
- package/dist/primitives/icon.js +52 -0
- package/dist/primitives/icon.js.map +1 -0
- package/dist/primitives/image.d.ts +13 -0
- package/dist/primitives/image.d.ts.map +1 -0
- package/dist/primitives/image.js +38 -0
- package/dist/primitives/image.js.map +1 -0
- package/dist/primitives/index.d.ts +57 -0
- package/dist/primitives/index.d.ts.map +1 -0
- package/dist/primitives/index.js +106 -0
- package/dist/primitives/index.js.map +1 -0
- package/dist/primitives/input.d.ts +32 -0
- package/dist/primitives/input.d.ts.map +1 -0
- package/dist/primitives/input.js +192 -0
- package/dist/primitives/input.js.map +1 -0
- package/dist/primitives/kanban-board.d.ts +13 -0
- package/dist/primitives/kanban-board.d.ts.map +1 -0
- package/dist/primitives/kanban-board.js +5 -0
- package/dist/primitives/kanban-board.js.map +1 -0
- package/dist/primitives/line-chart.d.ts +14 -0
- package/dist/primitives/line-chart.d.ts.map +1 -0
- package/dist/primitives/line-chart.js +17 -0
- package/dist/primitives/line-chart.js.map +1 -0
- package/dist/primitives/list.d.ts +13 -0
- package/dist/primitives/list.d.ts.map +1 -0
- package/dist/primitives/list.js +10 -0
- package/dist/primitives/list.js.map +1 -0
- package/dist/primitives/modal.d.ts +20 -0
- package/dist/primitives/modal.d.ts.map +1 -0
- package/dist/primitives/modal.js +60 -0
- package/dist/primitives/modal.js.map +1 -0
- package/dist/primitives/pie-chart.d.ts +15 -0
- package/dist/primitives/pie-chart.d.ts.map +1 -0
- package/dist/primitives/pie-chart.js +36 -0
- package/dist/primitives/pie-chart.js.map +1 -0
- package/dist/primitives/screen-outlet.d.ts +9 -0
- package/dist/primitives/screen-outlet.d.ts.map +1 -0
- package/dist/primitives/screen-outlet.js +92 -0
- package/dist/primitives/screen-outlet.js.map +1 -0
- package/dist/primitives/screen.d.ts +9 -0
- package/dist/primitives/screen.d.ts.map +1 -0
- package/dist/primitives/screen.js +10 -0
- package/dist/primitives/screen.js.map +1 -0
- package/dist/primitives/scroll.d.ts +11 -0
- package/dist/primitives/scroll.d.ts.map +1 -0
- package/dist/primitives/scroll.js +10 -0
- package/dist/primitives/scroll.js.map +1 -0
- package/dist/primitives/select.d.ts +19 -0
- package/dist/primitives/select.d.ts.map +1 -0
- package/dist/primitives/select.js +109 -0
- package/dist/primitives/select.js.map +1 -0
- package/dist/primitives/signature.d.ts +13 -0
- package/dist/primitives/signature.d.ts.map +1 -0
- package/dist/primitives/signature.js +45 -0
- package/dist/primitives/signature.js.map +1 -0
- package/dist/primitives/skeleton.d.ts +14 -0
- package/dist/primitives/skeleton.d.ts.map +1 -0
- package/dist/primitives/skeleton.js +41 -0
- package/dist/primitives/skeleton.js.map +1 -0
- package/dist/primitives/slider.d.ts +15 -0
- package/dist/primitives/slider.d.ts.map +1 -0
- package/dist/primitives/slider.js +7 -0
- package/dist/primitives/slider.js.map +1 -0
- package/dist/primitives/spacer.d.ts +9 -0
- package/dist/primitives/spacer.d.ts.map +1 -0
- package/dist/primitives/spacer.js +9 -0
- package/dist/primitives/spacer.js.map +1 -0
- package/dist/primitives/spatial-map-editing.d.ts +472 -0
- package/dist/primitives/spatial-map-editing.d.ts.map +1 -0
- package/dist/primitives/spatial-map-editing.js +886 -0
- package/dist/primitives/spatial-map-editing.js.map +1 -0
- package/dist/primitives/spatial-map.d.ts +1073 -0
- package/dist/primitives/spatial-map.d.ts.map +1 -0
- package/dist/primitives/spatial-map.js +1705 -0
- package/dist/primitives/spatial-map.js.map +1 -0
- package/dist/primitives/stack.d.ts +13 -0
- package/dist/primitives/stack.d.ts.map +1 -0
- package/dist/primitives/stack.js +12 -0
- package/dist/primitives/stack.js.map +1 -0
- package/dist/primitives/table.d.ts +115 -0
- package/dist/primitives/table.d.ts.map +1 -0
- package/dist/primitives/table.js +498 -0
- package/dist/primitives/table.js.map +1 -0
- package/dist/primitives/tabs.d.ts +17 -0
- package/dist/primitives/tabs.d.ts.map +1 -0
- package/dist/primitives/tabs.js +13 -0
- package/dist/primitives/tabs.js.map +1 -0
- package/dist/primitives/text.d.ts +11 -0
- package/dist/primitives/text.d.ts.map +1 -0
- package/dist/primitives/text.js +69 -0
- package/dist/primitives/text.js.map +1 -0
- package/dist/primitives/textarea.d.ts +15 -0
- package/dist/primitives/textarea.d.ts.map +1 -0
- package/dist/primitives/textarea.js +23 -0
- package/dist/primitives/textarea.js.map +1 -0
- package/dist/primitives/toast-container.d.ts +15 -0
- package/dist/primitives/toast-container.d.ts.map +1 -0
- package/dist/primitives/toast-container.js +160 -0
- package/dist/primitives/toast-container.js.map +1 -0
- package/dist/primitives/toggle.d.ts +12 -0
- package/dist/primitives/toggle.d.ts.map +1 -0
- package/dist/primitives/toggle.js +18 -0
- package/dist/primitives/toggle.js.map +1 -0
- package/dist/primitives/touchable.d.ts +10 -0
- package/dist/primitives/touchable.d.ts.map +1 -0
- package/dist/primitives/touchable.js +6 -0
- package/dist/primitives/touchable.js.map +1 -0
- package/dist/primitives/use-design-tokens.d.ts +127 -0
- package/dist/primitives/use-design-tokens.d.ts.map +1 -0
- package/dist/primitives/use-design-tokens.js +251 -0
- package/dist/primitives/use-design-tokens.js.map +1 -0
- package/dist/primitives/use-theme.d.ts +11 -0
- package/dist/primitives/use-theme.d.ts.map +1 -0
- package/dist/primitives/use-theme.js +17 -0
- package/dist/primitives/use-theme.js.map +1 -0
- package/dist/primitives/wizard.d.ts +11 -0
- package/dist/primitives/wizard.d.ts.map +1 -0
- package/dist/primitives/wizard.js +15 -0
- package/dist/primitives/wizard.js.map +1 -0
- package/dist/runtime/context-dispatcher.d.ts +3 -0
- package/dist/runtime/context-dispatcher.d.ts.map +1 -0
- package/dist/runtime/context-dispatcher.js +11 -0
- package/dist/runtime/context-dispatcher.js.map +1 -0
- package/dist/runtime/row-dispatcher.d.ts +19 -0
- package/dist/runtime/row-dispatcher.d.ts.map +1 -0
- package/dist/runtime/row-dispatcher.js +25 -0
- package/dist/runtime/row-dispatcher.js.map +1 -0
- package/dist/types.d.ts +10 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/use-device-context.d.ts +8 -0
- package/dist/use-device-context.d.ts.map +1 -0
- package/dist/use-device-context.js +54 -0
- package/dist/use-device-context.js.map +1 -0
- package/package.json +59 -0
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
// useShapeAnimations (web) — Layer 3 runner for SVG-child animations.
|
|
2
|
+
//
|
|
3
|
+
// Consumes the same ElementAnimations contract as useElementAnimations but
|
|
4
|
+
// targets an SVG child (path, circle, rect, …) via its attribute/style
|
|
5
|
+
// surface. Plan 3 scope is strictly `ambient` — SVG children have no
|
|
6
|
+
// hover/focus/active affordance (they don't receive pointer events in the
|
|
7
|
+
// decorative-blob use case) and no mount/unmount ceremony distinct from
|
|
8
|
+
// their parent element's mount.
|
|
9
|
+
//
|
|
10
|
+
// Why a separate hook instead of reusing useElementAnimations?
|
|
11
|
+
// - Simpler surface: no options.isHovered/isFocused/isActive, no store,
|
|
12
|
+
// no triggerUnmount. Matches Layer 3's narrow use case.
|
|
13
|
+
// - Refs typed to SVGElement so consumers (BlobLayer, icon primitives)
|
|
14
|
+
// get correct type inference.
|
|
15
|
+
// - useElementAnimations pulls in StateStore + reanimated imports that
|
|
16
|
+
// shape-level consumers don't need.
|
|
17
|
+
//
|
|
18
|
+
// Keyframes are registered once into the plan-2 stylesheet singleton
|
|
19
|
+
// (`registerKeyframes`) and deduplicated by hash. Multiple shape instances
|
|
20
|
+
// with the same recipe share one CSS rule — zero per-instance duplication.
|
|
21
|
+
//
|
|
22
|
+
// Cleanup: on unmount (or animations→null transition), `el.style.animation`
|
|
23
|
+
// is cleared. The CSSOM keyframe rule stays registered (its cost is one
|
|
24
|
+
// @keyframes block per unique recipe; global lifetime is fine).
|
|
25
|
+
//
|
|
26
|
+
// Performance: `options.recipes` SHOULD be a stable reference (typically
|
|
27
|
+
// ANIMATION_RECIPES from core, which is module-scope). Inline object
|
|
28
|
+
// literals invalidate the useMemo every render — correct but wasteful,
|
|
29
|
+
// especially when a BlobLayer iterates over many blob instances.
|
|
30
|
+
import { useEffect, useMemo } from 'react';
|
|
31
|
+
import { resolveAnimation, buildCSSKeyframes, applyReducedMotion, toArray, } from 'mythik';
|
|
32
|
+
import { registerKeyframes } from './stylesheet-singleton.js';
|
|
33
|
+
import { usePrefersReducedMotion } from './usePrefersReducedMotion.js';
|
|
34
|
+
/**
|
|
35
|
+
* Compose a CSS `animation` shorthand from a resolved AnimationSpec.
|
|
36
|
+
*
|
|
37
|
+
* Order matches the CSS spec:
|
|
38
|
+
* name duration easing delay iteration-count direction fill-mode
|
|
39
|
+
*
|
|
40
|
+
* Side effect: registers the keyframes rule into the singleton stylesheet
|
|
41
|
+
* (idempotent via `registerKeyframes`'s internal dedup).
|
|
42
|
+
*/
|
|
43
|
+
function buildAnimationCSS(spec, staggerIndex) {
|
|
44
|
+
const built = buildCSSKeyframes(spec);
|
|
45
|
+
registerKeyframes(built.name, built.keyframesText);
|
|
46
|
+
const staggerDelay = spec.stagger ? spec.stagger.delay * (staggerIndex ?? 0) : 0;
|
|
47
|
+
const delayMs = spec.delay + staggerDelay;
|
|
48
|
+
const iterStr = spec.iterations === 'infinite' ? 'infinite' : `${spec.iterations}`;
|
|
49
|
+
return `${built.name} ${spec.duration}ms ${spec.easing} ${delayMs}ms ${iterStr} ${spec.direction} ${spec.fillMode}`;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Attach ambient CSS animations to an SVG child element.
|
|
53
|
+
*
|
|
54
|
+
* @param ref Ref to an SVG element (path, circle, rect, g, …).
|
|
55
|
+
* @param animations ElementAnimations (Layer 3 reads only `ambient`) or
|
|
56
|
+
* null for "no animations".
|
|
57
|
+
* @param options Recipe registry, optional stagger index, reduced-motion
|
|
58
|
+
* override.
|
|
59
|
+
*/
|
|
60
|
+
export function useShapeAnimations(ref, animations, options) {
|
|
61
|
+
const reducedMotion = usePrefersReducedMotion(options.reducedMotion);
|
|
62
|
+
// Dev-mode guard: Layer 3 scope is strictly `ambient`. If the consumer
|
|
63
|
+
// passes hover/mount/etc., the trigger is silently dropped in production
|
|
64
|
+
// (robust against being fed a full ElementAnimations object from a
|
|
65
|
+
// cascade merge). In dev we warn to surface a likely mistake — usually
|
|
66
|
+
// the consumer meant useElementAnimations. Runtime behavior unchanged.
|
|
67
|
+
if (process.env.NODE_ENV !== 'production' && animations) {
|
|
68
|
+
const extras = [];
|
|
69
|
+
for (const key of ['mount', 'unmount', 'hover', 'focus', 'active', 'stateChange']) {
|
|
70
|
+
if (key in animations && animations[key] !== undefined && animations[key] !== null) {
|
|
71
|
+
extras.push(key);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
if (extras.length > 0) {
|
|
75
|
+
// eslint-disable-next-line no-console
|
|
76
|
+
console.warn(`useShapeAnimations: ignoring non-ambient triggers [${extras.join(', ')}]. ` +
|
|
77
|
+
'Use useElementAnimations for interactive/mount animations; shapes only support ambient.');
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
// Compose the `animation` shorthand string from every ambient entry.
|
|
81
|
+
// Memoized on inputs so a re-render with the same refs is cheap.
|
|
82
|
+
const animationCSS = useMemo(() => {
|
|
83
|
+
if (!animations)
|
|
84
|
+
return '';
|
|
85
|
+
const ambient = animations.ambient;
|
|
86
|
+
if (!ambient)
|
|
87
|
+
return '';
|
|
88
|
+
const refs = toArray(ambient);
|
|
89
|
+
const parts = [];
|
|
90
|
+
for (const animRef of refs) {
|
|
91
|
+
let spec = resolveAnimation(animRef, options.recipes);
|
|
92
|
+
if (reducedMotion) {
|
|
93
|
+
const policy = applyReducedMotion(spec, 'ambient');
|
|
94
|
+
if (policy === null)
|
|
95
|
+
continue;
|
|
96
|
+
spec = policy;
|
|
97
|
+
}
|
|
98
|
+
parts.push(buildAnimationCSS(spec, options.staggerIndex));
|
|
99
|
+
}
|
|
100
|
+
return parts.join(', ');
|
|
101
|
+
}, [animations, options.recipes, options.staggerIndex, reducedMotion]);
|
|
102
|
+
useEffect(() => {
|
|
103
|
+
const el = ref.current;
|
|
104
|
+
if (!el)
|
|
105
|
+
return;
|
|
106
|
+
// SVG elements' `style` surface is the same property-style API as
|
|
107
|
+
// HTMLElement's for CSS animation properties in all browsers plan 3
|
|
108
|
+
// targets; jsdom mirrors that. No attribute-write path needed.
|
|
109
|
+
el.style.animation = animationCSS;
|
|
110
|
+
return () => {
|
|
111
|
+
// Graceful cleanup on unmount or next effect re-run. Accessing
|
|
112
|
+
// `el.style` post-unmount is safe — the element reference stays
|
|
113
|
+
// valid until React releases it; the DOM node is already detached
|
|
114
|
+
// so the write is a no-op.
|
|
115
|
+
el.style.animation = '';
|
|
116
|
+
};
|
|
117
|
+
}, [animationCSS, ref]);
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=useShapeAnimations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useShapeAnimations.js","sourceRoot":"","sources":["../../src/animation/useShapeAnimations.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { AppEngine } from 'mythik';
|
|
3
|
+
import type { MythikInstance } from 'mythik';
|
|
4
|
+
import type { SpecStore } from 'mythik';
|
|
5
|
+
import type { SpecRuntime } from 'mythik';
|
|
6
|
+
export interface AppContextValue {
|
|
7
|
+
appEngine: AppEngine;
|
|
8
|
+
svc: MythikInstance;
|
|
9
|
+
specStore: SpecStore;
|
|
10
|
+
fetcher?: (url: string, options?: RequestInit) => Promise<Response>;
|
|
11
|
+
onSpecRuntimeMount?: (runtime: SpecRuntime | null) => void;
|
|
12
|
+
}
|
|
13
|
+
export declare const AppContext: React.Context<AppContextValue | null>;
|
|
14
|
+
export declare function useAppContext(): AppContextValue;
|
|
15
|
+
//# sourceMappingURL=app-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app-context.d.ts","sourceRoot":"","sources":["../src/app-context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAC7C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAE1C,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,SAAS,CAAC;IACrB,GAAG,EAAE,cAAc,CAAC;IACpB,SAAS,EAAE,SAAS,CAAC;IACrB,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;IACpE,kBAAkB,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,KAAK,IAAI,CAAC;CAC5D;AAED,eAAO,MAAM,UAAU,uCAAoD,CAAC;AAE5E,wBAAgB,aAAa,IAAI,eAAe,CAI/C"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export const AppContext = React.createContext(null);
|
|
3
|
+
export function useAppContext() {
|
|
4
|
+
const ctx = React.useContext(AppContext);
|
|
5
|
+
if (!ctx)
|
|
6
|
+
throw new Error('useAppContext must be used inside <MythikApp>');
|
|
7
|
+
return ctx;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=app-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app-context.js","sourceRoot":"","sources":["../src/app-context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAc1B,MAAM,CAAC,MAAM,UAAU,GAAG,KAAK,CAAC,aAAa,CAAyB,IAAI,CAAC,CAAC;AAE5E,MAAM,UAAU,aAAa;IAC3B,MAAM,GAAG,GAAG,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IACzC,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IAC3E,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { LayerSpec } from 'mythik';
|
|
2
|
+
interface BackgroundLayerProps {
|
|
3
|
+
spec: LayerSpec;
|
|
4
|
+
}
|
|
5
|
+
export declare function BackgroundLayer({ spec }: BackgroundLayerProps): import("react/jsx-runtime").JSX.Element | null;
|
|
6
|
+
export {};
|
|
7
|
+
//# sourceMappingURL=BackgroundLayer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BackgroundLayer.d.ts","sourceRoot":"","sources":["../../src/background/BackgroundLayer.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAExC,UAAU,oBAAoB;IAC5B,IAAI,EAAE,SAAS,CAAC;CACjB;AAkBD,wBAAgB,eAAe,CAAC,EAAE,IAAI,EAAE,EAAE,oBAAoB,kDA2D7D"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
function commonStyle(spec) {
|
|
3
|
+
return {
|
|
4
|
+
position: 'absolute',
|
|
5
|
+
inset: 0,
|
|
6
|
+
opacity: spec.common.opacity,
|
|
7
|
+
mixBlendMode: spec.common.blendMode === 'normal' ? undefined : spec.common.blendMode,
|
|
8
|
+
zIndex: spec.common.zIndex,
|
|
9
|
+
pointerEvents: 'none',
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
function extractPatternId(svg) {
|
|
13
|
+
const match = svg.match(/<pattern\s+id="([^"]+)"/);
|
|
14
|
+
return match ? match[1] : 'unknown';
|
|
15
|
+
}
|
|
16
|
+
export function BackgroundLayer({ spec }) {
|
|
17
|
+
switch (spec.kind) {
|
|
18
|
+
case 'solid':
|
|
19
|
+
return _jsx("div", { style: { ...commonStyle(spec), backgroundColor: spec.color } });
|
|
20
|
+
case 'gradient':
|
|
21
|
+
return _jsx("div", { style: { ...commonStyle(spec), backgroundImage: spec.css } });
|
|
22
|
+
case 'image':
|
|
23
|
+
return (_jsx("div", { style: {
|
|
24
|
+
...commonStyle(spec),
|
|
25
|
+
backgroundImage: `url(${spec.url})`,
|
|
26
|
+
backgroundSize: spec.size,
|
|
27
|
+
backgroundPosition: spec.position,
|
|
28
|
+
backgroundRepeat: spec.repeat,
|
|
29
|
+
} }));
|
|
30
|
+
case 'pattern': {
|
|
31
|
+
const id = extractPatternId(spec.svg);
|
|
32
|
+
const innerHTML = `<defs>${spec.svg}</defs><rect width="100%" height="100%" fill="url(#${id})"/>`;
|
|
33
|
+
return (_jsx("svg", { style: commonStyle(spec), xmlns: "http://www.w3.org/2000/svg", width: "100%", height: "100%", dangerouslySetInnerHTML: { __html: innerHTML } }));
|
|
34
|
+
}
|
|
35
|
+
case 'grain':
|
|
36
|
+
return (_jsx("svg", { style: commonStyle(spec), xmlns: "http://www.w3.org/2000/svg", width: "100%", height: "100%", dangerouslySetInnerHTML: { __html: spec.svg } }));
|
|
37
|
+
case 'blobs':
|
|
38
|
+
// Plan 3 Task 16 stub — renders a placeholder div that carries common
|
|
39
|
+
// style. Task 18 replaces this branch with <BlobLayer /> which resolves
|
|
40
|
+
// palette + BLOB_CATALOG + motion → ambient animations and mounts an
|
|
41
|
+
// <svg> root with per-blob <path>/<circle> + useShapeAnimations.
|
|
42
|
+
return _jsx("div", { "data-sv-layer": "blobs", style: commonStyle(spec) });
|
|
43
|
+
default: {
|
|
44
|
+
const _exhaustive = spec;
|
|
45
|
+
void _exhaustive;
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=BackgroundLayer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BackgroundLayer.js","sourceRoot":"","sources":["../../src/background/BackgroundLayer.tsx"],"names":[],"mappings":";AAQA,SAAS,WAAW,CAAC,IAAe;IAClC,OAAO;QACL,QAAQ,EAAE,UAAU;QACpB,KAAK,EAAE,CAAC;QACR,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO;QAC5B,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS;QACpF,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;QAC1B,aAAa,EAAE,MAAM;KACtB,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAW;IACnC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;IACnD,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,EAAE,IAAI,EAAwB;IAC5D,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,KAAK,OAAO;YACV,OAAO,cAAK,KAAK,EAAE,EAAE,GAAG,WAAW,CAAC,IAAI,CAAC,EAAE,eAAe,EAAE,IAAI,CAAC,KAAK,EAAE,GAAI,CAAC;QAE/E,KAAK,UAAU;YACb,OAAO,cAAK,KAAK,EAAE,EAAE,GAAG,WAAW,CAAC,IAAI,CAAC,EAAE,eAAe,EAAE,IAAI,CAAC,GAAG,EAAE,GAAI,CAAC;QAE7E,KAAK,OAAO;YACV,OAAO,CACL,cACE,KAAK,EAAE;oBACL,GAAG,WAAW,CAAC,IAAI,CAAC;oBACpB,eAAe,EAAE,OAAO,IAAI,CAAC,GAAG,GAAG;oBACnC,cAAc,EAAE,IAAI,CAAC,IAAI;oBACzB,kBAAkB,EAAE,IAAI,CAAC,QAAQ;oBACjC,gBAAgB,EAAE,IAAI,CAAC,MAAM;iBAC9B,GACD,CACH,CAAC;QAEJ,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,MAAM,EAAE,GAAG,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACtC,MAAM,SAAS,GAAG,SAAS,IAAI,CAAC,GAAG,sDAAsD,EAAE,MAAM,CAAC;YAClG,OAAO,CACL,cACE,KAAK,EAAE,WAAW,CAAC,IAAI,CAAC,EACxB,KAAK,EAAC,4BAA4B,EAClC,KAAK,EAAC,MAAM,EACZ,MAAM,EAAC,MAAM,EACb,uBAAuB,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,GAC9C,CACH,CAAC;QACJ,CAAC;QAED,KAAK,OAAO;YACV,OAAO,CACL,cACE,KAAK,EAAE,WAAW,CAAC,IAAI,CAAC,EACxB,KAAK,EAAC,4BAA4B,EAClC,KAAK,EAAC,MAAM,EACZ,MAAM,EAAC,MAAM,EACb,uBAAuB,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,GAC7C,CACH,CAAC;QAEJ,KAAK,OAAO;YACV,sEAAsE;YACtE,wEAAwE;YACxE,qEAAqE;YACrE,iEAAiE;YACjE,OAAO,+BAAmB,OAAO,EAAC,KAAK,EAAE,WAAW,CAAC,IAAI,CAAC,GAAI,CAAC;QAEjE,OAAO,CAAC,CAAC,CAAC;YACR,MAAM,WAAW,GAAU,IAAI,CAAC;YAChC,KAAK,WAAW,CAAC;YACjB,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { LayerBackground } from 'mythik';
|
|
2
|
+
interface BackgroundStackProps {
|
|
3
|
+
background?: LayerBackground | string;
|
|
4
|
+
/**
|
|
5
|
+
* Palette source for blob layers (plan 3 Task 18). Without it, blob layers
|
|
6
|
+
* fall through to the BackgroundLayer stub which renders an empty
|
|
7
|
+
* positioned div (layer geometry stays consistent; no shapes paint). A dev-
|
|
8
|
+
* mode warning fires per render so Task 20 misuse (forgetting to thread
|
|
9
|
+
* tokens) doesn't fail silently. MythikRenderer populates this from
|
|
10
|
+
* resolved tokens in Task 20.
|
|
11
|
+
*/
|
|
12
|
+
palette?: {
|
|
13
|
+
primary: string;
|
|
14
|
+
accent: string;
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
export declare function BackgroundStack({ background, palette }: BackgroundStackProps): import("react/jsx-runtime").JSX.Element | null;
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=BackgroundStack.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BackgroundStack.d.ts","sourceRoot":"","sources":["../../src/background/BackgroundStack.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAA2B,MAAM,QAAQ,CAAC;AAIvE,UAAU,oBAAoB;IAC5B,UAAU,CAAC,EAAE,eAAe,GAAG,MAAM,CAAC;IACtC;;;;;;;OAOG;IACH,OAAO,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAC/C;AAED,wBAAgB,eAAe,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,oBAAoB,kDAgB5E"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { Fragment as _Fragment, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { resolveBackgroundLayers, BACKGROUND_RECIPES } from 'mythik';
|
|
3
|
+
import { BackgroundLayer } from './BackgroundLayer.js';
|
|
4
|
+
import { BlobLayer } from './BlobLayer.js';
|
|
5
|
+
export function BackgroundStack({ background, palette }) {
|
|
6
|
+
if (!background)
|
|
7
|
+
return null;
|
|
8
|
+
const config = typeof background === 'string' ? BACKGROUND_RECIPES[background] : background;
|
|
9
|
+
if (!config)
|
|
10
|
+
return null;
|
|
11
|
+
const specs = resolveBackgroundLayers(config);
|
|
12
|
+
if (!specs.length)
|
|
13
|
+
return null;
|
|
14
|
+
return (_jsx(_Fragment, { children: specs.map((spec, i) => renderLayer(spec, i, palette)) }));
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Dispatch layer rendering: blob layers with a palette bypass BackgroundLayer
|
|
18
|
+
* entirely and mount <BlobLayer>; everything else (including blobs without a
|
|
19
|
+
* palette) goes through the generic BackgroundLayer path. The blob branch also
|
|
20
|
+
* maps BlobsLayerConfig.blobOpacity → BlobV2Config.opacity (the per-blob fill
|
|
21
|
+
* default) and strips layer-level fields (type/opacity/blendMode/zIndex) that
|
|
22
|
+
* don't belong inside resolveBlobLayer.
|
|
23
|
+
*/
|
|
24
|
+
function renderLayer(spec, i, palette) {
|
|
25
|
+
if (spec.kind === 'blobs' && !palette && process.env.NODE_ENV !== 'production') {
|
|
26
|
+
// Review M3 — surface the fallback so Task 20 misuse (forgetting to
|
|
27
|
+
// thread tokens through MythikRenderer) doesn't fail silently with an
|
|
28
|
+
// invisible blob layer. Only the preview/test harness legitimately hits
|
|
29
|
+
// this path without tokens; warn once per render.
|
|
30
|
+
// eslint-disable-next-line no-console
|
|
31
|
+
console.warn('BackgroundStack (web): blobs layer rendered without palette — falling back to empty stub. Pass the `palette` prop (typically `{ primary, accent }` from resolved tokens) to enable blob rendering.');
|
|
32
|
+
}
|
|
33
|
+
if (spec.kind === 'blobs' && palette) {
|
|
34
|
+
return (_jsx("div", { "data-sv-layer": "blobs", style: {
|
|
35
|
+
position: 'absolute',
|
|
36
|
+
inset: 0,
|
|
37
|
+
opacity: spec.common.opacity,
|
|
38
|
+
mixBlendMode: spec.common.blendMode === 'normal' ? undefined : spec.common.blendMode,
|
|
39
|
+
zIndex: spec.common.zIndex,
|
|
40
|
+
pointerEvents: 'none',
|
|
41
|
+
}, children: _jsx(BlobLayer, { config: toBlobV2Config(spec.config), palette: palette }) }, `bg-layer-${i}`));
|
|
42
|
+
}
|
|
43
|
+
return _jsx(BackgroundLayer, { spec: spec }, `bg-layer-${i}`);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Strip layer-level fields from BlobsLayerConfig and promote `blobOpacity` to
|
|
47
|
+
* the BlobV2Config.opacity slot that resolveBlobLayer consumes. Keeps the two
|
|
48
|
+
* opacity axes (layer-container vs per-blob fill) cleanly separated at the
|
|
49
|
+
* type boundary — see BlobsLayerConfig docstring.
|
|
50
|
+
*/
|
|
51
|
+
function toBlobV2Config(layerConfig) {
|
|
52
|
+
const { type: _type, opacity: _layerOpacity, blendMode: _blendMode, zIndex: _zIndex, blobOpacity, ...rest } = layerConfig;
|
|
53
|
+
void _type;
|
|
54
|
+
void _layerOpacity;
|
|
55
|
+
void _blendMode;
|
|
56
|
+
void _zIndex;
|
|
57
|
+
return blobOpacity !== undefined ? { ...rest, opacity: blobOpacity } : rest;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=BackgroundStack.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BackgroundStack.js","sourceRoot":"","sources":["../../src/background/BackgroundStack.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,MAAM,QAAQ,CAAC;AAErE,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAe3C,MAAM,UAAU,eAAe,CAAC,EAAE,UAAU,EAAE,OAAO,EAAwB;IAC3E,IAAI,CAAC,UAAU;QAAE,OAAO,IAAI,CAAC;IAE7B,MAAM,MAAM,GACV,OAAO,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;IAE/E,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAEzB,MAAM,KAAK,GAAG,uBAAuB,CAAC,MAAM,CAAC,CAAC;IAC9C,IAAI,CAAC,KAAK,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAE/B,OAAO,CACL,4BACG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,GACrD,CACJ,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,WAAW,CAClB,IAAe,EACf,CAAS,EACT,OAAwC;IAExC,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,EAAE,CAAC;QAC/E,oEAAoE;QACpE,sEAAsE;QACtE,wEAAwE;QACxE,kDAAkD;QAClD,sCAAsC;QACtC,OAAO,CAAC,IAAI,CACV,oMAAoM,CACrM,CAAC;IACJ,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,OAAO,EAAE,CAAC;QACrC,OAAO,CACL,+BAEgB,OAAO,EACrB,KAAK,EAAE;gBACL,QAAQ,EAAE,UAAU;gBACpB,KAAK,EAAE,CAAC;gBACR,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO;gBAC5B,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS;gBACpF,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;gBAC1B,aAAa,EAAE,MAAM;aACtB,YAED,KAAC,SAAS,IAAC,MAAM,EAAE,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,OAAO,GAAI,IAX/D,YAAY,CAAC,EAAE,CAYhB,CACP,CAAC;IACJ,CAAC;IACD,OAAO,KAAC,eAAe,IAAuB,IAAI,EAAE,IAAI,IAA3B,YAAY,CAAC,EAAE,CAAgB,CAAC;AAC/D,CAAC;AAED;;;;;GAKG;AACH,SAAS,cAAc,CACrB,WAA4D;IAE5D,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,IAAI,EAAE,GAAG,WAAW,CAAC;IAC1H,KAAK,KAAK,CAAC;IAAC,KAAK,aAAa,CAAC;IAAC,KAAK,UAAU,CAAC;IAAC,KAAK,OAAO,CAAC;IAC9D,OAAO,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAC9E,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { type BlobV2Config } from 'mythik';
|
|
3
|
+
interface BlobLayerProps {
|
|
4
|
+
config: BlobV2Config;
|
|
5
|
+
palette: {
|
|
6
|
+
primary: string;
|
|
7
|
+
accent: string;
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
export declare function BlobLayer({ config, palette }: BlobLayerProps): React.ReactElement;
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=BlobLayer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BlobLayer.d.ts","sourceRoot":"","sources":["../../src/background/BlobLayer.tsx"],"names":[],"mappings":"AAsBA,OAAO,KAA0B,MAAM,OAAO,CAAC;AAC/C,OAAO,EAGL,KAAK,YAAY,EAElB,MAAM,QAAQ,CAAC;AAGhB,UAAU,cAAc;IACtB,MAAM,EAAE,YAAY,CAAC;IACrB,OAAO,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAC9C;AAED,wBAAgB,SAAS,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,cAAc,GAAG,KAAK,CAAC,YAAY,CAajF"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
// Plan 3 Task 18 — web BlobLayer.
|
|
3
|
+
//
|
|
4
|
+
// Consumes a BlobV2Config (explicit `blobs[]` or preset form) + a {primary,
|
|
5
|
+
// accent} palette and mounts one <svg><path/></svg> per resolved BlobSpec.
|
|
6
|
+
// Each path receives a ref that drives ambient motion through Layer 3's
|
|
7
|
+
// `useShapeAnimations` hook (drift/rotate/scale → CSS @keyframes registered
|
|
8
|
+
// once, dedup'd by recipe hash). Rendering is JSX-native — no
|
|
9
|
+
// dangerouslySetInnerHTML — so React handles all escaping and the legacy
|
|
10
|
+
// XSS surface (box.tsx:127 + resolveBlobStyles) is closed.
|
|
11
|
+
//
|
|
12
|
+
// Placement: this component emits a React fragment of positioned <svg>
|
|
13
|
+
// elements (absolute with per-blob left/top/width/height). The caller
|
|
14
|
+
// (BackgroundStack) provides the compositing wrapper div that applies
|
|
15
|
+
// LayerCommonProps opacity/blendMode/zIndex; BlobLayer only handles the
|
|
16
|
+
// blob-level styling.
|
|
17
|
+
//
|
|
18
|
+
// BlobV2Config.opacity (per-blob fill default) flows through resolveBlobLayer
|
|
19
|
+
// and lands on each BlobRenderStyle.opacity → the `opacity` attribute on the
|
|
20
|
+
// outer <svg>. Layer-container opacity lives separately on the caller's
|
|
21
|
+
// wrapper. See BlobsLayerConfig.blobOpacity docstring for the naming
|
|
22
|
+
// rationale at the layer-type surface.
|
|
23
|
+
import { useMemo, useRef } from 'react';
|
|
24
|
+
import { resolveBlobLayer, ANIMATION_RECIPES, } from 'mythik';
|
|
25
|
+
import { useShapeAnimations } from '../animation/useShapeAnimations.js';
|
|
26
|
+
export function BlobLayer({ config, palette }) {
|
|
27
|
+
// Task 19 review I1 (fix applied to web for parity) — resolveBlobLayer
|
|
28
|
+
// returns fresh BlobSpec references per call; each spec.animations drives a
|
|
29
|
+
// useShapeAnimations useMemo. Without this memo, every parent render
|
|
30
|
+
// cascades into an O(N) resolve across all blobs and keyframe re-register.
|
|
31
|
+
const specs = useMemo(() => resolveBlobLayer(config, palette), [config, palette]);
|
|
32
|
+
return (_jsx(_Fragment, { children: specs.map((spec, i) => (_jsx(BlobSvg, { spec: spec }, i))) }));
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Per-blob <svg> wrapping a single <path>. The ref binds useShapeAnimations
|
|
36
|
+
* to the path element (ambient trigger only; see useShapeAnimations docstring
|
|
37
|
+
* for the Layer 3 scope narrowing).
|
|
38
|
+
*
|
|
39
|
+
* Why the ref targets <path> not <svg>: the keyframes transform
|
|
40
|
+
* (translate/rotate/scale) should apply to the shape geometry itself so
|
|
41
|
+
* layered blur and outer positioning remain stable. If we animated the <svg>
|
|
42
|
+
* root the wrapper div's position would shift under us, producing scroll-
|
|
43
|
+
* equivalent artifacts.
|
|
44
|
+
*/
|
|
45
|
+
function BlobSvg({ spec }) {
|
|
46
|
+
const ref = useRef(null);
|
|
47
|
+
useShapeAnimations(ref, spec.animations, { recipes: ANIMATION_RECIPES });
|
|
48
|
+
const { style, shape } = spec;
|
|
49
|
+
return (_jsx("svg", { viewBox: shape.viewBox, style: {
|
|
50
|
+
position: 'absolute',
|
|
51
|
+
left: style.position.x,
|
|
52
|
+
top: style.position.y,
|
|
53
|
+
width: style.size.width,
|
|
54
|
+
height: style.size.height,
|
|
55
|
+
transform: style.rotation ? `rotate(${style.rotation})` : undefined,
|
|
56
|
+
filter: style.blur > 0 ? `blur(${style.blur}px)` : undefined,
|
|
57
|
+
pointerEvents: 'none',
|
|
58
|
+
}, opacity: style.opacity, "aria-hidden": "true", xmlns: "http://www.w3.org/2000/svg", children: _jsx("path", { ref: ref, d: shape.path, fill: style.color }) }));
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=BlobLayer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BlobLayer.js","sourceRoot":"","sources":["../../src/background/BlobLayer.tsx"],"names":[],"mappings":";AAAA,kCAAkC;AAClC,EAAE;AACF,4EAA4E;AAC5E,2EAA2E;AAC3E,wEAAwE;AACxE,4EAA4E;AAC5E,8DAA8D;AAC9D,yEAAyE;AACzE,2DAA2D;AAC3D,EAAE;AACF,uEAAuE;AACvE,sEAAsE;AACtE,sEAAsE;AACtE,wEAAwE;AACxE,sBAAsB;AACtB,EAAE;AACF,8EAA8E;AAC9E,6EAA6E;AAC7E,wEAAwE;AACxE,qEAAqE;AACrE,uCAAuC;AAEvC,OAAc,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAC/C,OAAO,EACL,gBAAgB,EAChB,iBAAiB,GAGlB,MAAM,QAAQ,CAAC;AAChB,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAOxE,MAAM,UAAU,SAAS,CAAC,EAAE,MAAM,EAAE,OAAO,EAAkB;IAC3D,uEAAuE;IACvE,4EAA4E;IAC5E,qEAAqE;IACrE,2EAA2E;IAC3E,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAClF,OAAO,CACL,4BACG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CACtB,KAAC,OAAO,IAAS,IAAI,EAAE,IAAI,IAAb,CAAC,CAAgB,CAChC,CAAC,GACD,CACJ,CAAC;AACJ,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAS,OAAO,CAAC,EAAE,IAAI,EAAsB;IAC3C,MAAM,GAAG,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IACzC,kBAAkB,CAAC,GAAG,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,OAAO,EAAE,iBAAiB,EAAE,CAAC,CAAC;IAEzE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;IAE9B,OAAO,CACL,cACE,OAAO,EAAE,KAAK,CAAC,OAAO,EACtB,KAAK,EAAE;YACL,QAAQ,EAAE,UAAU;YACpB,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;YACtB,GAAG,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;YACrB,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK;YACvB,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM;YACzB,SAAS,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,SAAS;YACnE,MAAM,EAAE,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,SAAS;YAC5D,aAAa,EAAE,MAAM;SACtB,EACD,OAAO,EAAE,KAAK,CAAC,OAAO,iBACV,MAAM,EAClB,KAAK,EAAC,4BAA4B,YAElC,eAAM,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,KAAK,GAAI,GAChD,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/background/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/background/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export declare function needsMotionWrapper(...fields: (Record<string, unknown> | undefined)[]): boolean;
|
|
2
|
+
interface InteractionFields {
|
|
3
|
+
hover?: Record<string, unknown>;
|
|
4
|
+
active?: Record<string, unknown>;
|
|
5
|
+
focus?: Record<string, unknown>;
|
|
6
|
+
transition?: {
|
|
7
|
+
duration?: number;
|
|
8
|
+
ease?: string;
|
|
9
|
+
delay?: number;
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
export declare function generateHoverCSS(className: string, fields: InteractionFields): string;
|
|
13
|
+
export declare function hashId(elementId: string): string;
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=css-hover.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"css-hover.d.ts","sourceRoot":"","sources":["../src/css-hover.ts"],"names":[],"mappings":"AAEA,wBAAgB,kBAAkB,CAChC,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC,EAAE,GACjD,OAAO,CAQT;AAmBD,UAAU,iBAAiB;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,UAAU,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACnE;AAED,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,GAAG,MAAM,CAarF;AAED,wBAAgB,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAQhD"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
const MOTION_ONLY_PROPS = new Set(['scale', 'scaleX', 'scaleY', 'rotate', 'x', 'y']);
|
|
2
|
+
export function needsMotionWrapper(...fields) {
|
|
3
|
+
for (const field of fields) {
|
|
4
|
+
if (!field)
|
|
5
|
+
continue;
|
|
6
|
+
for (const key of Object.keys(field)) {
|
|
7
|
+
if (MOTION_ONLY_PROPS.has(key))
|
|
8
|
+
return true;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
return false;
|
|
12
|
+
}
|
|
13
|
+
const EASE_MAP = {
|
|
14
|
+
linear: 'linear',
|
|
15
|
+
easeIn: 'ease-in',
|
|
16
|
+
easeOut: 'ease-out',
|
|
17
|
+
easeInOut: 'ease-in-out',
|
|
18
|
+
};
|
|
19
|
+
function toKebab(str) {
|
|
20
|
+
return str.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`);
|
|
21
|
+
}
|
|
22
|
+
function buildDeclarations(style) {
|
|
23
|
+
return Object.entries(style)
|
|
24
|
+
.map(([key, value]) => `${toKebab(key)}: ${value}`)
|
|
25
|
+
.join('; ');
|
|
26
|
+
}
|
|
27
|
+
export function generateHoverCSS(className, fields) {
|
|
28
|
+
const rules = [];
|
|
29
|
+
const duration = fields.transition?.duration ?? 150;
|
|
30
|
+
const ease = EASE_MAP[fields.transition?.ease ?? 'easeOut'] ?? 'ease-out';
|
|
31
|
+
const delay = fields.transition?.delay ?? 0;
|
|
32
|
+
const transitionValue = `all ${duration}ms ${ease}${delay ? ` ${delay}ms` : ''}`;
|
|
33
|
+
rules.push(`.${className} { transition: ${transitionValue}; }`);
|
|
34
|
+
if (fields.hover)
|
|
35
|
+
rules.push(`.${className}:hover { ${buildDeclarations(fields.hover)}; }`);
|
|
36
|
+
if (fields.active)
|
|
37
|
+
rules.push(`.${className}:active { ${buildDeclarations(fields.active)}; }`);
|
|
38
|
+
if (fields.focus)
|
|
39
|
+
rules.push(`.${className}:focus-visible { ${buildDeclarations(fields.focus)}; }`);
|
|
40
|
+
return rules.join('\n');
|
|
41
|
+
}
|
|
42
|
+
export function hashId(elementId) {
|
|
43
|
+
// FNV-1a 32-bit for better distribution on short strings
|
|
44
|
+
let hash = 0x811c9dc5;
|
|
45
|
+
for (let i = 0; i < elementId.length; i++) {
|
|
46
|
+
hash ^= elementId.charCodeAt(i);
|
|
47
|
+
hash = (hash * 0x01000193) | 0;
|
|
48
|
+
}
|
|
49
|
+
return `sv-${(hash >>> 0).toString(36)}`;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=css-hover.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"css-hover.js","sourceRoot":"","sources":["../src/css-hover.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export { MythikRenderer } from './MythikRenderer.js';
|
|
2
|
+
export { registerReactPrimitives, PRIMITIVES } from './primitives/index.js';
|
|
3
|
+
export { Box, Text, Image, Icon, Stack, Grid, Scroll, Divider, Spacer } from './primitives/index.js';
|
|
4
|
+
export { Input, Textarea, Select, Checkbox, Toggle, Slider } from './primitives/index.js';
|
|
5
|
+
export { Button, Touchable, List } from './primitives/index.js';
|
|
6
|
+
export { MythikApp, createAuthSpecStore } from './MythikApp.js';
|
|
7
|
+
export { AppContext, useAppContext } from './app-context.js';
|
|
8
|
+
export { createSupabaseAuthProvider, createCustomJWTProvider, createMockAuthProvider } from 'mythik';
|
|
9
|
+
export type { AuthProvider, AuthUser, AuthResult, AuthEvent } from 'mythik';
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,uBAAuB,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAC5E,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AACrG,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC1F,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAG7D,OAAO,EAAE,0BAA0B,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,QAAQ,CAAC;AACrG,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// mythik-react — public API
|
|
2
|
+
export { MythikRenderer } from './MythikRenderer.js';
|
|
3
|
+
export { registerReactPrimitives, PRIMITIVES } from './primitives/index.js';
|
|
4
|
+
export { Box, Text, Image, Icon, Stack, Grid, Scroll, Divider, Spacer } from './primitives/index.js';
|
|
5
|
+
export { Input, Textarea, Select, Checkbox, Toggle, Slider } from './primitives/index.js';
|
|
6
|
+
export { Button, Touchable, List } from './primitives/index.js';
|
|
7
|
+
export { MythikApp, createAuthSpecStore } from './MythikApp.js';
|
|
8
|
+
export { AppContext, useAppContext } from './app-context.js';
|
|
9
|
+
// Re-export auth providers for convenience (scaffolding imports from mythik-react)
|
|
10
|
+
export { createSupabaseAuthProvider, createCustomJWTProvider, createMockAuthProvider } from 'mythik';
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,4BAA4B;AAC5B,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,uBAAuB,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAC5E,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AACrG,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC1F,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAE7D,mFAAmF;AACnF,OAAO,EAAE,0BAA0B,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,QAAQ,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { CSSProperties, ReactNode } from 'react';
|
|
2
|
+
interface AccordionProps {
|
|
3
|
+
title?: string;
|
|
4
|
+
defaultOpen?: boolean;
|
|
5
|
+
badge?: string | number | boolean;
|
|
6
|
+
style?: CSSProperties;
|
|
7
|
+
_tokens?: Record<string, unknown>;
|
|
8
|
+
children?: ReactNode;
|
|
9
|
+
}
|
|
10
|
+
export declare function Accordion({ title, defaultOpen, badge, style, _tokens, children }: AccordionProps): import("react/jsx-runtime").JSX.Element;
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=accordion.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accordion.d.ts","sourceRoot":"","sources":["../../src/primitives/accordion.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGtD,UAAU,cAAc;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IAClC,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED,wBAAgB,SAAS,CAAC,EAAE,KAAU,EAAE,WAAmB,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,cAAc,2CA2C7G"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { useDesignTokens } from './use-design-tokens.js';
|
|
4
|
+
export function Accordion({ title = '', defaultOpen = false, badge, style, _tokens, children }) {
|
|
5
|
+
const [open, setOpen] = React.useState(defaultOpen);
|
|
6
|
+
const t = useDesignTokens(_tokens);
|
|
7
|
+
const showBadge = badge !== undefined && badge !== 0 && badge !== '' && badge !== false;
|
|
8
|
+
return (_jsxs("div", { style: { borderRadius: t.radius(t.shape.radius.md), color: t.colors.text, ...t.surface.card, ...style }, children: [_jsxs("button", { type: "button", "aria-expanded": open, onClick: () => setOpen(!open), style: {
|
|
9
|
+
width: '100%', padding: `${t.spacing.scale.sm + t.spacing.unit}px ${t.spacing.scale.md}px`, display: 'flex',
|
|
10
|
+
justifyContent: 'space-between', alignItems: 'center',
|
|
11
|
+
border: 'none', backgroundColor: 'transparent', color: 'inherit',
|
|
12
|
+
cursor: 'pointer', fontSize: t.typography.scale.md.fontSize, fontWeight: t.typography.weight.medium, fontFamily: t.typography.fontFamily.base,
|
|
13
|
+
}, children: [_jsx("span", { children: title }), _jsxs("span", { style: { display: 'flex', alignItems: 'center', gap: '8px' }, children: [showBadge && (_jsx("span", { "data-badge": true, style: {
|
|
14
|
+
backgroundColor: t.colors.primary,
|
|
15
|
+
color: '#fff',
|
|
16
|
+
padding: badge === true ? '0' : '1px 8px',
|
|
17
|
+
width: badge === true ? '8px' : undefined,
|
|
18
|
+
height: badge === true ? '8px' : undefined,
|
|
19
|
+
borderRadius: t.radius(t.shape.radius.full),
|
|
20
|
+
fontSize: '0.75em',
|
|
21
|
+
fontWeight: 600,
|
|
22
|
+
display: 'inline-block',
|
|
23
|
+
}, children: badge === true ? '' : badge })), _jsx("span", { style: { transform: open ? 'rotate(180deg)' : 'rotate(0)', transition: `transform ${t.motion.duration.fast}ms` }, children: "\u25BC" })] })] }), open && _jsx("div", { style: { padding: `0 ${t.spacing.scale.md}px ${t.spacing.scale.md}px` }, children: children })] }));
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=accordion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accordion.js","sourceRoot":"","sources":["../../src/primitives/accordion.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { CSSProperties } from 'react';
|
|
2
|
+
interface AreaChartDataPoint {
|
|
3
|
+
label: string;
|
|
4
|
+
value: number;
|
|
5
|
+
}
|
|
6
|
+
interface AreaChartProps {
|
|
7
|
+
data?: AreaChartDataPoint[];
|
|
8
|
+
height?: number;
|
|
9
|
+
color?: string;
|
|
10
|
+
style?: CSSProperties;
|
|
11
|
+
}
|
|
12
|
+
export declare function AreaChart({ data, height, color, style }: AreaChartProps): import("react/jsx-runtime").JSX.Element;
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=area-chart.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"area-chart.d.ts","sourceRoot":"","sources":["../../src/primitives/area-chart.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAE3C,UAAU,kBAAkB;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,UAAU,cAAc;IACtB,IAAI,CAAC,EAAE,kBAAkB,EAAE,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,aAAa,CAAC;CACvB;AAED,wBAAgB,SAAS,CAAC,EAAE,IAAS,EAAE,MAAY,EAAE,KAAiB,EAAE,KAAK,EAAE,EAAE,cAAc,2CAyB9F"}
|