@number10/jsx-core 5.0.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 +667 -0
- package/README.md +38 -0
- package/dist/animation/animated-signal.cjs +19 -0
- package/dist/animation/animated-signal.cjs.map +1 -0
- package/dist/animation/animated-signal.d.ts +35 -0
- package/dist/animation/animated-signal.d.ts.map +1 -0
- package/dist/animation/animated-signal.js +19 -0
- package/dist/animation/animated-signal.js.map +1 -0
- package/dist/animation/create-spring.cjs +80 -0
- package/dist/animation/create-spring.cjs.map +1 -0
- package/dist/animation/create-spring.d.ts +56 -0
- package/dist/animation/create-spring.d.ts.map +1 -0
- package/dist/animation/create-spring.js +80 -0
- package/dist/animation/create-spring.js.map +1 -0
- package/dist/animation/easing.cjs +76 -0
- package/dist/animation/easing.cjs.map +1 -0
- package/dist/animation/easing.d.ts +45 -0
- package/dist/animation/easing.d.ts.map +1 -0
- package/dist/animation/easing.js +76 -0
- package/dist/animation/easing.js.map +1 -0
- package/dist/animation/effect-definitions.cjs +441 -0
- package/dist/animation/effect-definitions.cjs.map +1 -0
- package/dist/animation/effect-definitions.d.ts +60 -0
- package/dist/animation/effect-definitions.d.ts.map +1 -0
- package/dist/animation/effect-definitions.js +441 -0
- package/dist/animation/effect-definitions.js.map +1 -0
- package/dist/animation/effect-engine.cjs +189 -0
- package/dist/animation/effect-engine.cjs.map +1 -0
- package/dist/animation/effect-engine.d.ts +70 -0
- package/dist/animation/effect-engine.d.ts.map +1 -0
- package/dist/animation/effect-engine.js +189 -0
- package/dist/animation/effect-engine.js.map +1 -0
- package/dist/animation/index.d.ts +24 -0
- package/dist/animation/index.d.ts.map +1 -0
- package/dist/animation/spring-physics.cjs +94 -0
- package/dist/animation/spring-physics.cjs.map +1 -0
- package/dist/animation/spring-physics.d.ts +145 -0
- package/dist/animation/spring-physics.d.ts.map +1 -0
- package/dist/animation/spring-physics.js +94 -0
- package/dist/animation/spring-physics.js.map +1 -0
- package/dist/animation/tween.cjs +67 -0
- package/dist/animation/tween.cjs.map +1 -0
- package/dist/animation/tween.d.ts +60 -0
- package/dist/animation/tween.d.ts.map +1 -0
- package/dist/animation/tween.js +67 -0
- package/dist/animation/tween.js.map +1 -0
- package/dist/animation/types.d.ts +31 -0
- package/dist/animation/types.d.ts.map +1 -0
- package/dist/animation/useSpring.cjs +152 -0
- package/dist/animation/useSpring.cjs.map +1 -0
- package/dist/animation/useSpring.d.ts +55 -0
- package/dist/animation/useSpring.d.ts.map +1 -0
- package/dist/animation/useSpring.js +149 -0
- package/dist/animation/useSpring.js.map +1 -0
- package/dist/animation/useTween.cjs +208 -0
- package/dist/animation/useTween.cjs.map +1 -0
- package/dist/animation/useTween.d.ts +116 -0
- package/dist/animation/useTween.d.ts.map +1 -0
- package/dist/animation/useTween.js +208 -0
- package/dist/animation/useTween.js.map +1 -0
- package/dist/border-geometry.cjs +447 -0
- package/dist/border-geometry.cjs.map +1 -0
- package/dist/border-geometry.d.ts +114 -0
- package/dist/border-geometry.d.ts.map +1 -0
- package/dist/border-geometry.js +447 -0
- package/dist/border-geometry.js.map +1 -0
- package/dist/colors/color-presets.cjs +236 -0
- package/dist/colors/color-presets.cjs.map +1 -0
- package/dist/colors/color-presets.d.ts +89 -0
- package/dist/colors/color-presets.d.ts.map +1 -0
- package/dist/colors/color-presets.js +236 -0
- package/dist/colors/color-presets.js.map +1 -0
- package/dist/colors/color-theme-helpers.cjs +32 -0
- package/dist/colors/color-theme-helpers.cjs.map +1 -0
- package/dist/colors/color-theme-helpers.d.ts +65 -0
- package/dist/colors/color-theme-helpers.d.ts.map +1 -0
- package/dist/colors/color-theme-helpers.js +32 -0
- package/dist/colors/color-theme-helpers.js.map +1 -0
- package/dist/colors/color-types.cjs +38 -0
- package/dist/colors/color-types.cjs.map +1 -0
- package/dist/colors/color-types.d.ts +112 -0
- package/dist/colors/color-types.d.ts.map +1 -0
- package/dist/colors/color-types.js +38 -0
- package/dist/colors/color-types.js.map +1 -0
- package/dist/colors/color-utils.cjs +197 -0
- package/dist/colors/color-utils.cjs.map +1 -0
- package/dist/colors/color-utils.d.ts +216 -0
- package/dist/colors/color-utils.d.ts.map +1 -0
- package/dist/colors/color-utils.js +197 -0
- package/dist/colors/color-utils.js.map +1 -0
- package/dist/colors/contrast-contracts.cjs +265 -0
- package/dist/colors/contrast-contracts.cjs.map +1 -0
- package/dist/colors/contrast-contracts.d.ts +289 -0
- package/dist/colors/contrast-contracts.d.ts.map +1 -0
- package/dist/colors/contrast-contracts.js +265 -0
- package/dist/colors/contrast-contracts.js.map +1 -0
- package/dist/colors/index.cjs +55 -0
- package/dist/colors/index.cjs.map +1 -0
- package/dist/colors/index.d.ts +16 -0
- package/dist/colors/index.d.ts.map +1 -0
- package/dist/colors/index.js +55 -0
- package/dist/colors/index.js.map +1 -0
- package/dist/core-props.cjs +66 -0
- package/dist/core-props.cjs.map +1 -0
- package/dist/core-props.d.ts +395 -0
- package/dist/core-props.d.ts.map +1 -0
- package/dist/core-props.js +66 -0
- package/dist/core-props.js.map +1 -0
- package/dist/design-tokens/design-token-presets.cjs +91 -0
- package/dist/design-tokens/design-token-presets.cjs.map +1 -0
- package/dist/design-tokens/design-token-presets.d.ts +34 -0
- package/dist/design-tokens/design-token-presets.d.ts.map +1 -0
- package/dist/design-tokens/design-token-presets.js +91 -0
- package/dist/design-tokens/design-token-presets.js.map +1 -0
- package/dist/design-tokens/design-token-types.d.ts +97 -0
- package/dist/design-tokens/design-token-types.d.ts.map +1 -0
- package/dist/design-tokens/index.cjs +10 -0
- package/dist/design-tokens/index.cjs.map +1 -0
- package/dist/design-tokens/index.d.ts +9 -0
- package/dist/design-tokens/index.d.ts.map +1 -0
- package/dist/design-tokens/index.js +10 -0
- package/dist/design-tokens/index.js.map +1 -0
- package/dist/dev-config.cjs +296 -0
- package/dist/dev-config.cjs.map +1 -0
- package/dist/dev-config.d.ts +238 -0
- package/dist/dev-config.d.ts.map +1 -0
- package/dist/dev-config.js +296 -0
- package/dist/dev-config.js.map +1 -0
- package/dist/effects.cjs +69 -0
- package/dist/effects.cjs.map +1 -0
- package/dist/effects.d.ts +152 -0
- package/dist/effects.d.ts.map +1 -0
- package/dist/effects.js +69 -0
- package/dist/effects.js.map +1 -0
- package/dist/global-registry.cjs +25 -0
- package/dist/global-registry.cjs.map +1 -0
- package/dist/global-registry.d.ts +19 -0
- package/dist/global-registry.d.ts.map +1 -0
- package/dist/global-registry.js +25 -0
- package/dist/global-registry.js.map +1 -0
- package/dist/hooks.cjs +378 -0
- package/dist/hooks.cjs.map +1 -0
- package/dist/hooks.d.ts +322 -0
- package/dist/hooks.d.ts.map +1 -0
- package/dist/hooks.js +378 -0
- package/dist/hooks.js.map +1 -0
- package/dist/host-adapter.d.ts +414 -0
- package/dist/host-adapter.d.ts.map +1 -0
- package/dist/index.cjs +229 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +226 -0
- package/dist/index.js.map +1 -0
- package/dist/jsx-dev-runtime.cjs +10 -0
- package/dist/jsx-dev-runtime.cjs.map +1 -0
- package/dist/jsx-dev-runtime.d.ts +5 -0
- package/dist/jsx-dev-runtime.d.ts.map +1 -0
- package/dist/jsx-dev-runtime.js +11 -0
- package/dist/jsx-dev-runtime.js.map +1 -0
- package/dist/jsx-runtime.cjs +44 -0
- package/dist/jsx-runtime.cjs.map +1 -0
- package/dist/jsx-runtime.d.ts +24 -0
- package/dist/jsx-runtime.d.ts.map +1 -0
- package/dist/jsx-runtime.js +44 -0
- package/dist/jsx-runtime.js.map +1 -0
- package/dist/jsx-types.d.ts +25 -0
- package/dist/jsx-types.d.ts.map +1 -0
- package/dist/layout/appliers/container-applier.cjs +20 -0
- package/dist/layout/appliers/container-applier.cjs.map +1 -0
- package/dist/layout/appliers/container-applier.d.ts +9 -0
- package/dist/layout/appliers/container-applier.d.ts.map +1 -0
- package/dist/layout/appliers/container-applier.js +20 -0
- package/dist/layout/appliers/container-applier.js.map +1 -0
- package/dist/layout/appliers/position-applier.cjs +31 -0
- package/dist/layout/appliers/position-applier.cjs.map +1 -0
- package/dist/layout/appliers/position-applier.d.ts +8 -0
- package/dist/layout/appliers/position-applier.d.ts.map +1 -0
- package/dist/layout/appliers/position-applier.js +31 -0
- package/dist/layout/appliers/position-applier.js.map +1 -0
- package/dist/layout/layout-engine-test-utils.d.ts +26 -0
- package/dist/layout/layout-engine-test-utils.d.ts.map +1 -0
- package/dist/layout/layout-engine.cjs +628 -0
- package/dist/layout/layout-engine.cjs.map +1 -0
- package/dist/layout/layout-engine.d.ts +140 -0
- package/dist/layout/layout-engine.d.ts.map +1 -0
- package/dist/layout/layout-engine.js +628 -0
- package/dist/layout/layout-engine.js.map +1 -0
- package/dist/layout/strategies/base-strategy.cjs +31 -0
- package/dist/layout/strategies/base-strategy.cjs.map +1 -0
- package/dist/layout/strategies/base-strategy.d.ts +59 -0
- package/dist/layout/strategies/base-strategy.d.ts.map +1 -0
- package/dist/layout/strategies/base-strategy.js +31 -0
- package/dist/layout/strategies/base-strategy.js.map +1 -0
- package/dist/layout/strategies/column-layout.cjs +145 -0
- package/dist/layout/strategies/column-layout.cjs.map +1 -0
- package/dist/layout/strategies/column-layout.d.ts +38 -0
- package/dist/layout/strategies/column-layout.d.ts.map +1 -0
- package/dist/layout/strategies/column-layout.js +145 -0
- package/dist/layout/strategies/column-layout.js.map +1 -0
- package/dist/layout/strategies/row-layout.cjs +145 -0
- package/dist/layout/strategies/row-layout.cjs.map +1 -0
- package/dist/layout/strategies/row-layout.d.ts +38 -0
- package/dist/layout/strategies/row-layout.d.ts.map +1 -0
- package/dist/layout/strategies/row-layout.js +145 -0
- package/dist/layout/strategies/row-layout.js.map +1 -0
- package/dist/layout/strategies/stack-layout.cjs +94 -0
- package/dist/layout/strategies/stack-layout.cjs.map +1 -0
- package/dist/layout/strategies/stack-layout.d.ts +30 -0
- package/dist/layout/strategies/stack-layout.d.ts.map +1 -0
- package/dist/layout/strategies/stack-layout.js +94 -0
- package/dist/layout/strategies/stack-layout.js.map +1 -0
- package/dist/layout/types.d.ts +134 -0
- package/dist/layout/types.d.ts.map +1 -0
- package/dist/layout/utils/child-utils.cjs +129 -0
- package/dist/layout/utils/child-utils.cjs.map +1 -0
- package/dist/layout/utils/child-utils.d.ts +54 -0
- package/dist/layout/utils/child-utils.d.ts.map +1 -0
- package/dist/layout/utils/child-utils.js +129 -0
- package/dist/layout/utils/child-utils.js.map +1 -0
- package/dist/layout/utils/dimension-calculator.cjs +109 -0
- package/dist/layout/utils/dimension-calculator.cjs.map +1 -0
- package/dist/layout/utils/dimension-calculator.d.ts +59 -0
- package/dist/layout/utils/dimension-calculator.d.ts.map +1 -0
- package/dist/layout/utils/dimension-calculator.js +109 -0
- package/dist/layout/utils/dimension-calculator.js.map +1 -0
- package/dist/layout/utils/flex-distributor.cjs +173 -0
- package/dist/layout/utils/flex-distributor.cjs.map +1 -0
- package/dist/layout/utils/flex-distributor.d.ts +18 -0
- package/dist/layout/utils/flex-distributor.d.ts.map +1 -0
- package/dist/layout/utils/flex-distributor.js +173 -0
- package/dist/layout/utils/flex-distributor.js.map +1 -0
- package/dist/layout/utils/size-resolver.cjs +280 -0
- package/dist/layout/utils/size-resolver.cjs.map +1 -0
- package/dist/layout/utils/size-resolver.d.ts +84 -0
- package/dist/layout/utils/size-resolver.d.ts.map +1 -0
- package/dist/layout/utils/size-resolver.js +280 -0
- package/dist/layout/utils/size-resolver.js.map +1 -0
- package/dist/layout/utils/spacing-calculator.cjs +50 -0
- package/dist/layout/utils/spacing-calculator.cjs.map +1 -0
- package/dist/layout/utils/spacing-calculator.d.ts +27 -0
- package/dist/layout/utils/spacing-calculator.d.ts.map +1 -0
- package/dist/layout/utils/spacing-calculator.js +50 -0
- package/dist/layout/utils/spacing-calculator.js.map +1 -0
- package/dist/memo.cjs +18 -0
- package/dist/memo.cjs.map +1 -0
- package/dist/memo.d.ts +29 -0
- package/dist/memo.d.ts.map +1 -0
- package/dist/memo.js +18 -0
- package/dist/memo.js.map +1 -0
- package/dist/nineslice-contract.cjs +60 -0
- package/dist/nineslice-contract.cjs.map +1 -0
- package/dist/nineslice-contract.d.ts +107 -0
- package/dist/nineslice-contract.d.ts.map +1 -0
- package/dist/nineslice-contract.js +60 -0
- package/dist/nineslice-contract.js.map +1 -0
- package/dist/placeholder.cjs +12 -0
- package/dist/placeholder.cjs.map +1 -0
- package/dist/placeholder.d.ts +44 -0
- package/dist/placeholder.d.ts.map +1 -0
- package/dist/placeholder.js +12 -0
- package/dist/placeholder.js.map +1 -0
- package/dist/portal.cjs +89 -0
- package/dist/portal.cjs.map +1 -0
- package/dist/portal.d.ts +62 -0
- package/dist/portal.d.ts.map +1 -0
- package/dist/portal.js +89 -0
- package/dist/portal.js.map +1 -0
- package/dist/primitive-contracts.cjs +12 -0
- package/dist/primitive-contracts.cjs.map +1 -0
- package/dist/primitive-contracts.d.ts +186 -0
- package/dist/primitive-contracts.d.ts.map +1 -0
- package/dist/primitive-contracts.js +12 -0
- package/dist/primitive-contracts.js.map +1 -0
- package/dist/theme.cjs +332 -0
- package/dist/theme.cjs.map +1 -0
- package/dist/theme.d.ts +204 -0
- package/dist/theme.d.ts.map +1 -0
- package/dist/theme.js +332 -0
- package/dist/theme.js.map +1 -0
- package/dist/types.d.ts +86 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/vdom/create-runtime.cjs +79 -0
- package/dist/vdom/create-runtime.cjs.map +1 -0
- package/dist/vdom/create-runtime.d.ts +7 -0
- package/dist/vdom/create-runtime.d.ts.map +1 -0
- package/dist/vdom/create-runtime.js +79 -0
- package/dist/vdom/create-runtime.js.map +1 -0
- package/dist/vdom/index.cjs +8 -0
- package/dist/vdom/index.cjs.map +1 -0
- package/dist/vdom/index.d.ts +4 -0
- package/dist/vdom/index.d.ts.map +1 -0
- package/dist/vdom/index.js +8 -0
- package/dist/vdom/index.js.map +1 -0
- package/dist/vdom/mount.cjs +161 -0
- package/dist/vdom/mount.cjs.map +1 -0
- package/dist/vdom/mount.d.ts +6 -0
- package/dist/vdom/mount.d.ts.map +1 -0
- package/dist/vdom/mount.js +161 -0
- package/dist/vdom/mount.js.map +1 -0
- package/dist/vdom/patch.cjs +163 -0
- package/dist/vdom/patch.cjs.map +1 -0
- package/dist/vdom/patch.d.ts +3 -0
- package/dist/vdom/patch.d.ts.map +1 -0
- package/dist/vdom/patch.js +163 -0
- package/dist/vdom/patch.js.map +1 -0
- package/dist/vdom/registry.cjs +85 -0
- package/dist/vdom/registry.cjs.map +1 -0
- package/dist/vdom/registry.d.ts +28 -0
- package/dist/vdom/registry.d.ts.map +1 -0
- package/dist/vdom/registry.js +85 -0
- package/dist/vdom/registry.js.map +1 -0
- package/dist/vdom/runtime-helpers.cjs +23 -0
- package/dist/vdom/runtime-helpers.cjs.map +1 -0
- package/dist/vdom/runtime-helpers.d.ts +8 -0
- package/dist/vdom/runtime-helpers.d.ts.map +1 -0
- package/dist/vdom/runtime-helpers.js +23 -0
- package/dist/vdom/runtime-helpers.js.map +1 -0
- package/dist/vdom/surface.cjs +107 -0
- package/dist/vdom/surface.cjs.map +1 -0
- package/dist/vdom/surface.d.ts +9 -0
- package/dist/vdom/surface.d.ts.map +1 -0
- package/dist/vdom/surface.js +107 -0
- package/dist/vdom/surface.js.map +1 -0
- package/dist/vdom/types.d.ts +104 -0
- package/dist/vdom/types.d.ts.map +1 -0
- package/dist/vdom/utils.cjs +146 -0
- package/dist/vdom/utils.cjs.map +1 -0
- package/dist/vdom/utils.d.ts +24 -0
- package/dist/vdom/utils.d.ts.map +1 -0
- package/dist/vdom/utils.js +146 -0
- package/dist/vdom/utils.js.map +1 -0
- package/dist/vdom.d.ts +4 -0
- package/dist/vdom.d.ts.map +1 -0
- package/dist/vector-draw-context.d.ts +63 -0
- package/dist/vector-draw-context.d.ts.map +1 -0
- package/package.json +161 -0
- package/vdom/index.cjs +1 -0
- package/vdom/index.d.ts +1 -0
- package/vdom/index.js +1 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"border-geometry.js","sources":["../src/border-geometry.ts"],"sourcesContent":["/**\n * Border Geometry — centralized, renderer-neutral border rendering algorithm.\n *\n * This module provides the **single source of truth** for rendering complex\n * borders (asymmetric, dashed, dotted, rounded) across ALL renderers.\n *\n * ## Architecture\n *\n * - **Core** owns the geometry algorithm via {@link drawBorderGeometry}.\n * - **Renderers** only translate the calls to their native draw API via\n * the existing {@link VectorDrawContext} interface.\n * - Renderers decide *when* to use the core fallback via\n * {@link shouldUseCoreBorderGeometry}.\n *\n * ## Dotted Border Definition\n *\n * `dotted` is defined centrally as a sequence of **real round filled circles**\n * placed along the border mid-line. `dash[0]` controls the gap and\n * `dash[1]` optionally overrides the dot diameter.\n *\n * ## Mandatory Core Fallback\n *\n * Any **asymmetric** border (per-side widths not all equal) MUST use the\n * core geometry algorithm. Renderers MUST NOT contain their own asymmetric\n * border rendering logic.\n *\n * ## Optional Core Fallback\n *\n * A renderer may also route **symmetric** cases through the core fallback\n * when its native path produces visibly poor results.\n *\n * ## Legacy Border\n *\n * The legacy `borderWidth`/`borderColor`/`borderAlpha` props are **not**\n * affected — they continue to use renderer-native drawing.\n */\n\nimport type { BorderPropsV2, BorderSideInsets } from './core-props'\nimport type { VectorDrawContext } from './vector-draw-context'\n\n// ---------------------------------------------------------------------------\n// Utilities\n// ---------------------------------------------------------------------------\n\n/**\n * Resolve a BorderPropsV2 width to per-side pixel values.\n * A plain `number` is applied uniformly; an object allows per-side control.\n */\nexport function resolveBorderSides(width: number | BorderSideInsets<number> | undefined): {\n top: number\n right: number\n bottom: number\n left: number\n} {\n if (width === undefined) return { top: 0, right: 0, bottom: 0, left: 0 }\n if (typeof width === 'number') {\n const w = Math.max(0, width)\n return { top: w, right: w, bottom: w, left: w }\n }\n return {\n top: Math.max(0, width.top ?? 0),\n right: Math.max(0, width.right ?? 0),\n bottom: Math.max(0, width.bottom ?? 0),\n left: Math.max(0, width.left ?? 0),\n }\n}\n\n/** Check whether all four side widths are identical. */\nexport function isUniformBorder(sides: {\n top: number\n right: number\n bottom: number\n left: number\n}): boolean {\n return sides.top === sides.right && sides.right === sides.bottom && sides.bottom === sides.left\n}\n\n/**\n * Resolve the per-corner radii to a normalized object form.\n */\nexport function resolveCornerRadii(\n cr: number | { tl?: number; tr?: number; bl?: number; br?: number } | undefined\n): { tl: number; tr: number; bl: number; br: number } {\n if (typeof cr === 'number') {\n const r = Math.max(0, cr)\n return { tl: r, tr: r, bl: r, br: r }\n }\n if (cr) {\n return {\n tl: Math.max(0, cr.tl ?? 0),\n tr: Math.max(0, cr.tr ?? 0),\n bl: Math.max(0, cr.bl ?? 0),\n br: Math.max(0, cr.br ?? 0),\n }\n }\n return { tl: 0, tr: 0, bl: 0, br: 0 }\n}\n\n/** Check whether any corner has a non-zero radius. */\nexport function hasAnyCornerRadius(corners: {\n tl: number\n tr: number\n bl: number\n br: number\n}): boolean {\n return corners.tl > 0 || corners.tr > 0 || corners.bl > 0 || corners.br > 0\n}\n\n// ---------------------------------------------------------------------------\n// Fallback decision\n// ---------------------------------------------------------------------------\n\n/**\n * Known renderer issues that can trigger the core fallback for otherwise\n * symmetric borders.\n */\nexport type RendererIssue =\n | 'rounded-dotted' // rounded corners + dotted style → poor native rendering\n | 'rounded-dashed-cap' // rounded + dashed + cap not supported natively\n | 'all' // route everything through core\n\n/**\n * Determine whether the core border geometry fallback should be used.\n *\n * **Mandatory:** Any asymmetric border (per-side widths differ).\n * **Optional:** Renderer can declare known issues to force the fallback\n * even for symmetric borders.\n *\n * @param border - The border configuration\n * @param rendererIssues - Known renderer-specific issues (optional)\n * @returns `true` if the core fallback should be used\n */\nexport function shouldUseCoreBorderGeometry(\n border: Pick<BorderPropsV2, 'width' | 'style'>,\n rendererIssues?: RendererIssue[]\n): boolean {\n const sides = resolveBorderSides(border.width)\n const asymmetric = !isUniformBorder(sides)\n\n if (asymmetric) return true\n\n if (rendererIssues && rendererIssues.length > 0) {\n if (rendererIssues.includes('all')) return true\n if (rendererIssues.includes('rounded-dotted') && border.style === 'dotted') {\n return true\n }\n if (rendererIssues.includes('rounded-dashed-cap') && border.style === 'dashed') {\n return true\n }\n }\n\n return false\n}\n\n// ---------------------------------------------------------------------------\n// Segment types (internal)\n// ---------------------------------------------------------------------------\n\ntype PerimeterPoint = Point & { width: number }\n\ntype PerimeterSegment = {\n x1: number\n y1: number\n x2: number\n y2: number\n width1: number\n width2: number\n length: number\n}\n\n// ---------------------------------------------------------------------------\n// Perimeter builder\n// ---------------------------------------------------------------------------\n\n/**\n * Build the ordered list of sampled points for the border mid-line.\n *\n * The mid-line position depends on {@link BorderPropsV2.align}:\n * - `inside`: mid-line at +halfWidth from box edge (border fully inside)\n * - `center`: mid-line at the box edge (border centered on edge)\n * - `outside`: mid-line at -halfWidth from box edge (border fully outside)\n */\nfunction pushPerimeterPoint(points: PerimeterPoint[], pt: Point, width: number): void {\n const last = points[points.length - 1]\n if (!last || Math.abs(last.x - pt.x) > 0.001 || Math.abs(last.y - pt.y) > 0.001) {\n points.push({ x: pt.x, y: pt.y, width })\n return\n }\n last.width = width\n}\n\nfunction appendPerimeterArcPoints(\n points: PerimeterPoint[],\n corner: CornerEllipse,\n startAngle: number,\n endAngle: number,\n widthStart: number,\n widthEnd: number\n): void {\n const start = pointOnEllipse(corner, startAngle)\n pushPerimeterPoint(points, start, widthStart)\n\n if (corner.rx <= 0 || corner.ry <= 0) {\n pushPerimeterPoint(points, pointOnEllipse(corner, endAngle), widthEnd)\n return\n }\n\n const span = endAngle - startAngle\n const maxR = Math.max(corner.rx, corner.ry)\n const steps = Math.max(1, Math.min(24, Math.ceil((Math.abs(span) * maxR) / 8)))\n for (let i = 1; i <= steps; i++) {\n const t = i / steps\n const angle = startAngle + span * t\n const width = widthStart + (widthEnd - widthStart) * t\n pushPerimeterPoint(points, pointOnEllipse(corner, angle), width)\n }\n}\n\nfunction buildPerimeterPoints(\n w: number,\n h: number,\n sides: { top: number; right: number; bottom: number; left: number },\n corners: { tl: number; tr: number; bl: number; br: number },\n align: 'inside' | 'center' | 'outside'\n): PerimeterPoint[] {\n const offsets = resolveBorderOffsets(sides, align)\n const outer = buildOuterContour(w, h, corners, offsets.outer)\n const inner = buildInnerContour(w, h, corners, offsets.inner)\n const mid = averageContours(outer, inner)\n const points: PerimeterPoint[] = []\n\n pushPerimeterPoint(points, { x: mid.tl.cx, y: mid.top }, sides.top)\n pushPerimeterPoint(points, { x: mid.tr.cx, y: mid.top }, sides.top)\n appendPerimeterArcPoints(points, mid.tr, -Math.PI / 2, 0, sides.top, sides.right)\n pushPerimeterPoint(points, { x: mid.right, y: mid.br.cy }, sides.right)\n appendPerimeterArcPoints(points, mid.br, 0, Math.PI / 2, sides.right, sides.bottom)\n pushPerimeterPoint(points, { x: mid.bl.cx, y: mid.bottom }, sides.bottom)\n appendPerimeterArcPoints(points, mid.bl, Math.PI / 2, Math.PI, sides.bottom, sides.left)\n pushPerimeterPoint(points, { x: mid.left, y: mid.tl.cy }, sides.left)\n appendPerimeterArcPoints(points, mid.tl, Math.PI, Math.PI * 1.5, sides.left, sides.top)\n\n if (points.length > 1) {\n const first = points[0] ?? { x: 0, y: 0, width: 0 }\n const last = points[points.length - 1] ?? { x: 0, y: 0, width: 0 }\n if (Math.abs(first.x - last.x) <= 0.001 && Math.abs(first.y - last.y) <= 0.001) {\n points.pop()\n }\n }\n\n return points\n}\n\nfunction buildPerimeterSegments(points: PerimeterPoint[]): PerimeterSegment[] {\n if (points.length < 2) return []\n\n const segs: PerimeterSegment[] = []\n for (let i = 0; i < points.length; i++) {\n const p1 = points[i] ?? { x: 0, y: 0, width: 0 }\n const p2 = points[(i + 1) % points.length] ?? { x: 0, y: 0, width: 0 }\n const dx = p2.x - p1.x\n const dy = p2.y - p1.y\n const length = Math.sqrt(dx * dx + dy * dy)\n if (length <= 0.001) continue\n segs.push({\n x1: p1.x,\n y1: p1.y,\n x2: p2.x,\n y2: p2.y,\n width1: p1.width,\n width2: p2.width,\n length,\n })\n }\n return segs\n}\n\n/** Get the point and interpolated width at a given distance along a perimeter segment. */\nfunction pointAtDistance(\n seg: PerimeterSegment,\n t: number\n): { x: number; y: number; width: number } {\n const frac = seg.length > 0 ? t / seg.length : 0\n return {\n x: seg.x1 + (seg.x2 - seg.x1) * frac,\n y: seg.y1 + (seg.y2 - seg.y1) * frac,\n width: seg.width1 + (seg.width2 - seg.width1) * frac,\n }\n}\n\n// ---------------------------------------------------------------------------\n// Solid border drawing\n// ---------------------------------------------------------------------------\n\ntype Point = { x: number; y: number }\n\ntype CornerEllipse = {\n cx: number\n cy: number\n rx: number\n ry: number\n}\n\ntype RoundedContour = {\n left: number\n top: number\n right: number\n bottom: number\n tl: CornerEllipse\n tr: CornerEllipse\n br: CornerEllipse\n bl: CornerEllipse\n}\n\ntype BorderOffsets = {\n outer: { top: number; right: number; bottom: number; left: number }\n inner: { top: number; right: number; bottom: number; left: number }\n}\n\nfunction resolveBorderOffsets(\n sides: { top: number; right: number; bottom: number; left: number },\n align: 'inside' | 'center' | 'outside'\n): BorderOffsets {\n if (align === 'inside') {\n return {\n outer: { top: 0, right: 0, bottom: 0, left: 0 },\n inner: { ...sides },\n }\n }\n if (align === 'outside') {\n return {\n outer: { ...sides },\n inner: { top: 0, right: 0, bottom: 0, left: 0 },\n }\n }\n return {\n outer: {\n top: sides.top / 2,\n right: sides.right / 2,\n bottom: sides.bottom / 2,\n left: sides.left / 2,\n },\n inner: {\n top: sides.top / 2,\n right: sides.right / 2,\n bottom: sides.bottom / 2,\n left: sides.left / 2,\n },\n }\n}\n\nfunction buildOuterContour(\n w: number,\n h: number,\n corners: { tl: number; tr: number; bl: number; br: number },\n offsets: BorderOffsets['outer']\n): RoundedContour {\n const left = -offsets.left\n const top = -offsets.top\n const right = w + offsets.right\n const bottom = h + offsets.bottom\n return {\n left,\n top,\n right,\n bottom,\n tl: {\n cx: corners.tl,\n cy: corners.tl,\n rx: corners.tl + offsets.left,\n ry: corners.tl + offsets.top,\n },\n tr: {\n cx: w - corners.tr,\n cy: corners.tr,\n rx: corners.tr + offsets.right,\n ry: corners.tr + offsets.top,\n },\n br: {\n cx: w - corners.br,\n cy: h - corners.br,\n rx: corners.br + offsets.right,\n ry: corners.br + offsets.bottom,\n },\n bl: {\n cx: corners.bl,\n cy: h - corners.bl,\n rx: corners.bl + offsets.left,\n ry: corners.bl + offsets.bottom,\n },\n }\n}\n\nfunction buildInnerContour(\n w: number,\n h: number,\n corners: { tl: number; tr: number; bl: number; br: number },\n offsets: BorderOffsets['inner']\n): RoundedContour {\n const left = offsets.left\n const top = offsets.top\n const right = w - offsets.right\n const bottom = h - offsets.bottom\n\n const tlRx = Math.max(0, corners.tl - offsets.left)\n const tlRy = Math.max(0, corners.tl - offsets.top)\n const trRx = Math.max(0, corners.tr - offsets.right)\n const trRy = Math.max(0, corners.tr - offsets.top)\n const brRx = Math.max(0, corners.br - offsets.right)\n const brRy = Math.max(0, corners.br - offsets.bottom)\n const blRx = Math.max(0, corners.bl - offsets.left)\n const blRy = Math.max(0, corners.bl - offsets.bottom)\n\n return {\n left,\n top,\n right,\n bottom,\n tl: { cx: left + tlRx, cy: top + tlRy, rx: tlRx, ry: tlRy },\n tr: { cx: right - trRx, cy: top + trRy, rx: trRx, ry: trRy },\n br: { cx: right - brRx, cy: bottom - brRy, rx: brRx, ry: brRy },\n bl: { cx: left + blRx, cy: bottom - blRy, rx: blRx, ry: blRy },\n }\n}\n\nfunction averageContours(a: RoundedContour, b: RoundedContour): RoundedContour {\n const avgCorner = (\n ca: CornerEllipse,\n cb: CornerEllipse,\n sideX: number,\n sideY: number,\n right = false,\n bottom = false\n ): CornerEllipse => {\n const rx = (ca.rx + cb.rx) / 2\n const ry = (ca.ry + cb.ry) / 2\n return {\n cx: right ? sideX - rx : sideX + rx,\n cy: bottom ? sideY - ry : sideY + ry,\n rx,\n ry,\n }\n }\n\n return {\n left: (a.left + b.left) / 2,\n top: (a.top + b.top) / 2,\n right: (a.right + b.right) / 2,\n bottom: (a.bottom + b.bottom) / 2,\n tl: avgCorner(a.tl, b.tl, (a.left + b.left) / 2, (a.top + b.top) / 2),\n tr: avgCorner(a.tr, b.tr, (a.right + b.right) / 2, (a.top + b.top) / 2, true, false),\n br: avgCorner(a.br, b.br, (a.right + b.right) / 2, (a.bottom + b.bottom) / 2, true, true),\n bl: avgCorner(a.bl, b.bl, (a.left + b.left) / 2, (a.bottom + b.bottom) / 2, false, true),\n }\n}\n\nfunction pointOnEllipse(corner: CornerEllipse, angle: number): Point {\n return {\n x: corner.cx + corner.rx * Math.cos(angle),\n y: corner.cy + corner.ry * Math.sin(angle),\n }\n}\n\nfunction pushPoint(points: Point[], pt: Point): void {\n const last = points[points.length - 1]\n if (!last || Math.abs(last.x - pt.x) > 0.001 || Math.abs(last.y - pt.y) > 0.001) {\n points.push(pt)\n }\n}\n\nfunction appendEllipseArcPoints(\n points: Point[],\n corner: CornerEllipse,\n startAngle: number,\n endAngle: number\n): void {\n const start = pointOnEllipse(corner, startAngle)\n const end = pointOnEllipse(corner, endAngle)\n pushPoint(points, start)\n\n if (corner.rx <= 0 || corner.ry <= 0) {\n pushPoint(points, end)\n return\n }\n\n const span = endAngle - startAngle\n const maxR = Math.max(corner.rx, corner.ry)\n const steps = Math.max(1, Math.min(24, Math.ceil((Math.abs(span) * maxR) / 8)))\n for (let i = 1; i <= steps; i++) {\n const t = i / steps\n const angle = startAngle + span * t\n pushPoint(points, pointOnEllipse(corner, angle))\n }\n}\n\nfunction buildContourPoints(contour: RoundedContour): Point[] {\n const points: Point[] = []\n pushPoint(points, { x: contour.tl.cx, y: contour.top })\n pushPoint(points, { x: contour.tr.cx, y: contour.top })\n appendEllipseArcPoints(points, contour.tr, -Math.PI / 2, 0)\n pushPoint(points, { x: contour.right, y: contour.br.cy })\n appendEllipseArcPoints(points, contour.br, 0, Math.PI / 2)\n pushPoint(points, { x: contour.bl.cx, y: contour.bottom })\n appendEllipseArcPoints(points, contour.bl, Math.PI / 2, Math.PI)\n pushPoint(points, { x: contour.left, y: contour.tl.cy })\n appendEllipseArcPoints(points, contour.tl, Math.PI, Math.PI * 1.5)\n return points\n}\n\nfunction traceClosedPath(ctx: VectorDrawContext, points: Point[]): void {\n if (points.length === 0) return\n if (points[0] === undefined) return\n ctx.moveTo(points[0].x, points[0].y)\n for (let i = 1; i < points.length; i++) {\n const pt = points[i] ?? { x: 0, y: 0 }\n ctx.lineTo(pt.x, pt.y)\n }\n ctx.closePath()\n}\n\n/**\n * Draw a solid border as the filled ring between outer and inner contours.\n * This fixes the previous `edge strips + corner patches` model, which\n * broke down for asymmetric widths combined with rounded corners.\n */\nfunction drawSolidBorder(\n ctx: VectorDrawContext,\n w: number,\n h: number,\n sides: { top: number; right: number; bottom: number; left: number },\n corners: { tl: number; tr: number; bl: number; br: number },\n color: number,\n alpha: number,\n align: 'inside' | 'center' | 'outside'\n): void {\n const offsets = resolveBorderOffsets(sides, align)\n const outer = buildOuterContour(w, h, corners, offsets.outer)\n const inner = buildInnerContour(w, h, corners, offsets.inner)\n const outerPoints = buildContourPoints(outer)\n const innerPoints = buildContourPoints(inner)\n\n if (outerPoints.length < 3) return\n\n ctx.fillStyle(color, alpha)\n ctx.beginPath()\n traceClosedPath(ctx, outerPoints)\n traceClosedPath(ctx, [...innerPoints].reverse())\n ctx.fillPath()\n}\n\n// ---------------------------------------------------------------------------\n// Dashed border drawing\n// ---------------------------------------------------------------------------\n\n/**\n * Draw a dashed border by walking a continuous closed perimeter polyline\n * and stroking each dash chunk as a single path. This avoids re-starting\n * short line segments at rounded corners, which previously produced\n * visible spikes and broken joins.\n */\nfunction appendDashPoint(points: Point[], pt: Point): void {\n const last = points[points.length - 1]\n if (!last || Math.abs(last.x - pt.x) > 0.001 || Math.abs(last.y - pt.y) > 0.001) {\n points.push(pt)\n }\n}\n\nfunction strokeDashedPath(\n ctx: VectorDrawContext,\n points: Point[],\n widths: number[],\n color: number,\n alpha: number\n): void {\n if (points.length < 2 || widths.length === 0) return\n const width = widths.reduce((sum, value) => sum + value, 0) / widths.length\n if (width <= 0) return\n\n ctx.lineStyle(width, color, alpha)\n ctx.beginPath()\n if (points[0] === undefined) return\n ctx.moveTo(points[0].x, points[0].y)\n for (let i = 1; i < points.length; i++) {\n const pt = points[i]\n if (pt === undefined) continue\n ctx.lineTo(pt.x, pt.y)\n }\n ctx.strokePath()\n}\n\nfunction drawDashedBorder(\n ctx: VectorDrawContext,\n w: number,\n h: number,\n sides: { top: number; right: number; bottom: number; left: number },\n corners: { tl: number; tr: number; bl: number; br: number },\n border: BorderPropsV2,\n color: number,\n alpha: number,\n align: 'inside' | 'center' | 'outside'\n): void {\n const segs = buildPerimeterSegments(buildPerimeterPoints(w, h, sides, corners, align))\n if (segs.length === 0) return\n\n const maxWidth = Math.max(sides.top, sides.right, sides.bottom, sides.left)\n const dashArray = border.dash ?? [maxWidth * 3, maxWidth * 2]\n const dashOffset = border.dashOffset ?? 0\n\n const pattern = dashArray.length % 2 === 0 ? dashArray : [...dashArray, ...dashArray]\n const patternSum = pattern.reduce((a, b) => a + b, 0)\n if (patternSum <= 0) return\n\n let patIdx = 0\n let drawing = true\n let accumulated = pattern[0] ?? 0\n let offset = dashOffset % patternSum\n if (offset < 0) offset += patternSum\n while (offset > 0.001) {\n const consume = Math.min(offset, accumulated)\n offset -= consume\n accumulated -= consume\n if (accumulated <= 0.001) {\n patIdx = (patIdx + 1) % pattern.length\n drawing = !drawing\n accumulated = pattern[patIdx] ?? 0\n }\n }\n\n let dashPoints: Point[] = []\n let dashWidths: number[] = []\n\n const flushDash = (): void => {\n if (dashPoints.length > 1) {\n strokeDashedPath(ctx, dashPoints, dashWidths, color, alpha)\n }\n dashPoints = []\n dashWidths = []\n }\n\n for (const seg of segs) {\n const sLen = seg.length\n if (sLen <= 0) continue\n\n let t = 0\n while (t < sLen) {\n const consume = Math.min(accumulated, sLen - t)\n const end = t + consume\n\n if (drawing && consume > 0) {\n const p1 = pointAtDistance(seg, t)\n const p2 = pointAtDistance(seg, end)\n if (dashPoints.length === 0) {\n appendDashPoint(dashPoints, p1)\n dashWidths.push(p1.width)\n }\n appendDashPoint(dashPoints, p2)\n dashWidths.push((p1.width + p2.width) / 2)\n }\n\n t += consume\n accumulated -= consume\n\n if (accumulated <= 0.001) {\n if (drawing) flushDash()\n patIdx = (patIdx + 1) % pattern.length\n drawing = !drawing\n accumulated = pattern[patIdx] ?? 0\n }\n }\n }\n\n if (drawing) flushDash()\n}\n\n// ---------------------------------------------------------------------------\n// Dotted border drawing — real round circles along the mid-line\n// ---------------------------------------------------------------------------\n\n/**\n * Draw a dotted border as a sequence of **real round filled circles**\n * placed along the border mid-line. Uses self-contained\n * {@link VectorDrawContext.fillCircleStyled} calls.\n *\n * ## Dot Geometry\n *\n * - **Dot diameter**: `dash[1]` if `dash` has ≥2 elements, otherwise `borderWidth` (per edge)\n * - **Dot gap** (edge-to-edge): `dash[0]` if `dash` has ≥1 element, otherwise `borderWidth`\n * - **Step** (center-to-center) = dotDiameter + gap\n *\n * Single-element `dash: [gap]` sets only the gap — dot diameter follows the\n * per-edge border width. This is the recommended form for asymmetric borders.\n *\n * Two-element `dash: [gap, size]` sets both gap and dot-diameter override.\n * (Yes, gap first — the common use-case is spacing control.)\n */\nfunction drawDottedBorder(\n ctx: VectorDrawContext,\n w: number,\n h: number,\n sides: { top: number; right: number; bottom: number; left: number },\n corners: { tl: number; tr: number; bl: number; br: number },\n border: BorderPropsV2,\n color: number,\n alpha: number,\n align: 'inside' | 'center' | 'outside'\n): void {\n const segs = buildPerimeterSegments(buildPerimeterPoints(w, h, sides, corners, align))\n if (segs.length === 0) return\n\n // dash[0] = gap, dash[1] = dot-diameter override (both optional)\n const dotGap = border.dash?.[0] ?? Math.max(sides.top, sides.right, sides.bottom, sides.left)\n const dotDiameterOverride: number | undefined = border.dash?.[1]\n\n const totalLength = segs.reduce((sum, seg) => sum + seg.length, 0)\n if (totalLength <= 0) return\n\n const fallbackDiameter = Math.max(sides.top, sides.right, sides.bottom, sides.left)\n const baseDiameter = dotDiameterOverride ?? fallbackDiameter\n const step = baseDiameter + dotGap\n if (step <= 0) return\n\n let distance = step / 2 + (border.dashOffset ?? 0)\n while (distance < 0) distance += step\n\n for (; distance < totalLength; distance += step) {\n let remaining = distance\n for (const seg of segs) {\n if (remaining <= seg.length) {\n const pt = pointAtDistance(seg, remaining)\n const dotDiameter = dotDiameterOverride ?? pt.width\n const dotRadius = dotDiameter / 2\n if (dotRadius > 0) {\n ctx.fillCircleStyled(pt.x, pt.y, dotRadius, color, alpha)\n }\n break\n }\n remaining -= seg.length\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Input geometry for border drawing.\n */\nexport interface BorderGeometryInput {\n /** Box dimensions */\n box: { x: number; y: number; w: number; h: number }\n /** Per-side border widths */\n sides: { top: number; right: number; bottom: number; left: number }\n /** Per-corner radii */\n corners: { tl: number; tr: number; bl: number; br: number }\n}\n\n/**\n * Draw a border using the centralized core geometry algorithm.\n *\n * This is the **single source of truth** for all complex border rendering.\n * It handles solid, dashed, and dotted styles, asymmetric widths, and\n * rounded corners.\n *\n * The function draws onto any {@link VectorDrawContext} — renderers only\n * need to wrap their native Graphics object in a VectorDrawContext adapter\n * and call this function.\n *\n * ## Dotted Definition\n *\n * `dotted` borders are rendered as real round filled circles (via\n * {@link VectorDrawContext.fillCircle}) placed along the border mid-line.\n * `dash[0]` controls the gap and `dash[1]` optionally overrides the\n * dot diameter.\n *\n * ## Align\n *\n * `border.align` adjusts where the border sits relative to the box edge:\n * - `center` (default): half inside, half outside\n * - `inside`: fully inside the box\n * - `outside`: fully outside the box\n *\n * @param ctx - Renderer-neutral draw context\n * @param input - Box geometry and border parameters\n * @param border - Border style configuration\n */\nexport function drawBorderGeometry(\n ctx: VectorDrawContext,\n input: BorderGeometryInput,\n border: BorderPropsV2\n): void {\n const { box, sides, corners } = input\n const { w, h } = box\n const color = border.color ?? 0xffffff\n const alpha = typeof border.alpha === 'number' ? border.alpha : 1\n const maxSw = Math.max(sides.top, sides.right, sides.bottom, sides.left)\n\n if (maxSw <= 0) return\n if (w <= 0 || h <= 0) return\n\n const align = border.align ?? 'center'\n const style = border.style ?? 'solid'\n\n switch (style) {\n case 'dotted':\n drawDottedBorder(ctx, w, h, sides, corners, border, color, alpha, align)\n break\n case 'dashed':\n drawDashedBorder(ctx, w, h, sides, corners, border, color, alpha, align)\n break\n case 'solid':\n default:\n drawSolidBorder(ctx, w, h, sides, corners, color, alpha, align)\n break\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const colorTypes = require("./color-types.cjs");
|
|
4
|
+
const colorUtils = require("./color-utils.cjs");
|
|
5
|
+
const LIGHT_NEUTRALS = {
|
|
6
|
+
background: {
|
|
7
|
+
lightest: "#ffffff",
|
|
8
|
+
light: "#fafafa",
|
|
9
|
+
medium: "#f0f0f0",
|
|
10
|
+
dark: "#e5e5e5",
|
|
11
|
+
darkest: "#d0d0d0"
|
|
12
|
+
},
|
|
13
|
+
surface: {
|
|
14
|
+
lightest: "#f5f5f5",
|
|
15
|
+
light: "#ebebeb",
|
|
16
|
+
medium: "#e0e0e0",
|
|
17
|
+
dark: "#d5d5d5",
|
|
18
|
+
darkest: "#c8c8c8"
|
|
19
|
+
},
|
|
20
|
+
text: {
|
|
21
|
+
lightest: "#e0e0e0",
|
|
22
|
+
light: "#666666",
|
|
23
|
+
medium: "#555555",
|
|
24
|
+
dark: "#424242",
|
|
25
|
+
darkest: "#212121"
|
|
26
|
+
},
|
|
27
|
+
border: {
|
|
28
|
+
lightest: "#d5d5d5",
|
|
29
|
+
light: "#c0c0c0",
|
|
30
|
+
medium: "#a8a8a8",
|
|
31
|
+
dark: "#8e8e8e",
|
|
32
|
+
darkest: "#6e6e6e"
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
const DARK_NEUTRALS = {
|
|
36
|
+
background: {
|
|
37
|
+
lightest: "#3a3a3a",
|
|
38
|
+
light: "#2e2e2e",
|
|
39
|
+
medium: "#1e1e1e",
|
|
40
|
+
dark: "#161616",
|
|
41
|
+
darkest: "#0a0a0a"
|
|
42
|
+
},
|
|
43
|
+
surface: {
|
|
44
|
+
lightest: "#4a4a4a",
|
|
45
|
+
light: "#3e3e3e",
|
|
46
|
+
medium: "#333333",
|
|
47
|
+
dark: "#2a2a2a",
|
|
48
|
+
darkest: "#222222"
|
|
49
|
+
},
|
|
50
|
+
text: {
|
|
51
|
+
lightest: "#ffffff",
|
|
52
|
+
light: "#e8e8e8",
|
|
53
|
+
medium: "#cccccc",
|
|
54
|
+
dark: "#bebebe",
|
|
55
|
+
darkest: "#808080"
|
|
56
|
+
},
|
|
57
|
+
border: {
|
|
58
|
+
lightest: "#757575",
|
|
59
|
+
light: "#616161",
|
|
60
|
+
medium: "#4a4a4a",
|
|
61
|
+
dark: "#3a3a3a",
|
|
62
|
+
darkest: "#2e2e2e"
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
function toColorShade(shades) {
|
|
66
|
+
return {
|
|
67
|
+
lightest: colorTypes.HexColor.from(shades.lightest),
|
|
68
|
+
light: colorTypes.HexColor.from(shades.light),
|
|
69
|
+
medium: colorTypes.HexColor.from(shades.medium),
|
|
70
|
+
dark: colorTypes.HexColor.from(shades.dark),
|
|
71
|
+
darkest: colorTypes.HexColor.from(shades.darkest),
|
|
72
|
+
DEFAULT: colorTypes.HexColor.from(shades.medium)
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
function addDefault(shade) {
|
|
76
|
+
return { ...shade, DEFAULT: shade.medium };
|
|
77
|
+
}
|
|
78
|
+
function generateColorScale(baseColor) {
|
|
79
|
+
const num = colorUtils.hexToNumber(baseColor);
|
|
80
|
+
const hsl = colorUtils.numberToHsl(num);
|
|
81
|
+
return addDefault({
|
|
82
|
+
lightest: colorTypes.HexColor.from(colorUtils.numberToHex(colorUtils.hslToNumber(hsl.h, hsl.s, 0.92))),
|
|
83
|
+
light: colorTypes.HexColor.from(colorUtils.numberToHex(colorUtils.hslToNumber(hsl.h, hsl.s * 0.7, 0.72))),
|
|
84
|
+
medium: colorTypes.HexColor.from(baseColor),
|
|
85
|
+
dark: colorTypes.HexColor.from(colorUtils.numberToHex(colorUtils.hslToNumber(hsl.h, hsl.s * 0.8, 0.35))),
|
|
86
|
+
darkest: colorTypes.HexColor.from(colorUtils.numberToHex(colorUtils.hslToNumber(hsl.h, hsl.s * 0.6, 0.15)))
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
const oceanBluePreset = {
|
|
90
|
+
name: "oceanBlue",
|
|
91
|
+
colors: {
|
|
92
|
+
// Brand colors
|
|
93
|
+
primary: generateColorScale("#2196f3"),
|
|
94
|
+
// Material Blue
|
|
95
|
+
secondary: generateColorScale("#607d8b"),
|
|
96
|
+
// Blue Grey
|
|
97
|
+
accent: generateColorScale("#00bcd4"),
|
|
98
|
+
// Cyan
|
|
99
|
+
// Feedback colors
|
|
100
|
+
success: generateColorScale("#4caf50"),
|
|
101
|
+
// Green
|
|
102
|
+
warning: generateColorScale("#ff9800"),
|
|
103
|
+
// Orange
|
|
104
|
+
error: generateColorScale("#f44336"),
|
|
105
|
+
// Red
|
|
106
|
+
info: generateColorScale("#2196f3"),
|
|
107
|
+
// Blue (same as primary)
|
|
108
|
+
// Neutral colors - designed for light mode
|
|
109
|
+
background: toColorShade(LIGHT_NEUTRALS.background),
|
|
110
|
+
surface: toColorShade(LIGHT_NEUTRALS.surface),
|
|
111
|
+
text: toColorShade(LIGHT_NEUTRALS.text),
|
|
112
|
+
border: toColorShade(LIGHT_NEUTRALS.border)
|
|
113
|
+
}
|
|
114
|
+
};
|
|
115
|
+
const forestGreenPreset = {
|
|
116
|
+
name: "forestGreen",
|
|
117
|
+
colors: {
|
|
118
|
+
// Brand colors
|
|
119
|
+
primary: generateColorScale("#4caf50"),
|
|
120
|
+
// Green
|
|
121
|
+
secondary: generateColorScale("#8bc34a"),
|
|
122
|
+
// Light Green
|
|
123
|
+
accent: generateColorScale("#ff8f00"),
|
|
124
|
+
// Amber (warm earth tone)
|
|
125
|
+
// Feedback colors
|
|
126
|
+
success: generateColorScale("#66bb6a"),
|
|
127
|
+
// Light Green
|
|
128
|
+
warning: generateColorScale("#ffa726"),
|
|
129
|
+
// Orange
|
|
130
|
+
error: generateColorScale("#ef5350"),
|
|
131
|
+
// Red
|
|
132
|
+
info: generateColorScale("#29b6f6"),
|
|
133
|
+
// Light Blue
|
|
134
|
+
// Neutral colors - green-tinted
|
|
135
|
+
background: toColorShade({
|
|
136
|
+
lightest: "#ffffff",
|
|
137
|
+
light: "#f1f8e9",
|
|
138
|
+
medium: "#dcedc8",
|
|
139
|
+
dark: "#c5e1a5",
|
|
140
|
+
darkest: "#aed581"
|
|
141
|
+
}),
|
|
142
|
+
surface: toColorShade({
|
|
143
|
+
lightest: "#ffffff",
|
|
144
|
+
light: "#f9fbe7",
|
|
145
|
+
medium: "#f0f4c3",
|
|
146
|
+
dark: "#e6ee9c",
|
|
147
|
+
darkest: "#dce775"
|
|
148
|
+
}),
|
|
149
|
+
text: toColorShade({
|
|
150
|
+
lightest: "#9e9e9e",
|
|
151
|
+
light: "#757575",
|
|
152
|
+
medium: "#616161",
|
|
153
|
+
dark: "#424242",
|
|
154
|
+
darkest: "#1b5e20"
|
|
155
|
+
}),
|
|
156
|
+
border: toColorShade({
|
|
157
|
+
lightest: "#dcedc8",
|
|
158
|
+
light: "#c5e1a5",
|
|
159
|
+
medium: "#aed581",
|
|
160
|
+
dark: "#9ccc65",
|
|
161
|
+
darkest: "#7cb342"
|
|
162
|
+
})
|
|
163
|
+
}
|
|
164
|
+
};
|
|
165
|
+
const midnightPreset = {
|
|
166
|
+
name: "midnight",
|
|
167
|
+
colors: {
|
|
168
|
+
// Brand colors
|
|
169
|
+
primary: generateColorScale("#9c27b0"),
|
|
170
|
+
// Purple
|
|
171
|
+
secondary: generateColorScale("#673ab7"),
|
|
172
|
+
// Deep Purple
|
|
173
|
+
accent: generateColorScale("#e91e63"),
|
|
174
|
+
// Pink
|
|
175
|
+
// Feedback colors
|
|
176
|
+
success: generateColorScale("#66bb6a"),
|
|
177
|
+
// Green
|
|
178
|
+
warning: generateColorScale("#ffa726"),
|
|
179
|
+
// Orange
|
|
180
|
+
error: generateColorScale("#ef5350"),
|
|
181
|
+
// Red
|
|
182
|
+
info: generateColorScale("#42a5f5"),
|
|
183
|
+
// Blue
|
|
184
|
+
// Neutral colors - designed for dark mode
|
|
185
|
+
background: toColorShade(DARK_NEUTRALS.background),
|
|
186
|
+
surface: toColorShade(DARK_NEUTRALS.surface),
|
|
187
|
+
text: toColorShade(DARK_NEUTRALS.text),
|
|
188
|
+
border: toColorShade(DARK_NEUTRALS.border)
|
|
189
|
+
}
|
|
190
|
+
};
|
|
191
|
+
function applyLightMode(preset) {
|
|
192
|
+
return {
|
|
193
|
+
...preset,
|
|
194
|
+
colors: {
|
|
195
|
+
...preset.colors,
|
|
196
|
+
background: toColorShade(LIGHT_NEUTRALS.background),
|
|
197
|
+
surface: toColorShade(LIGHT_NEUTRALS.surface),
|
|
198
|
+
text: toColorShade(LIGHT_NEUTRALS.text),
|
|
199
|
+
border: toColorShade(LIGHT_NEUTRALS.border)
|
|
200
|
+
}
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
function applyDarkMode(preset) {
|
|
204
|
+
return {
|
|
205
|
+
...preset,
|
|
206
|
+
colors: {
|
|
207
|
+
...preset.colors,
|
|
208
|
+
background: toColorShade(DARK_NEUTRALS.background),
|
|
209
|
+
surface: toColorShade(DARK_NEUTRALS.surface),
|
|
210
|
+
text: toColorShade(DARK_NEUTRALS.text),
|
|
211
|
+
border: toColorShade(DARK_NEUTRALS.border)
|
|
212
|
+
}
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
const presets = {
|
|
216
|
+
oceanBlue: oceanBluePreset,
|
|
217
|
+
forestGreen: forestGreenPreset,
|
|
218
|
+
midnight: midnightPreset
|
|
219
|
+
};
|
|
220
|
+
function getPreset(name) {
|
|
221
|
+
return presets[name];
|
|
222
|
+
}
|
|
223
|
+
function getPresetWithMode(name, mode) {
|
|
224
|
+
const preset = getPreset(name);
|
|
225
|
+
return mode === "light" ? applyLightMode(preset) : applyDarkMode(preset);
|
|
226
|
+
}
|
|
227
|
+
exports.applyDarkMode = applyDarkMode;
|
|
228
|
+
exports.applyLightMode = applyLightMode;
|
|
229
|
+
exports.forestGreenPreset = forestGreenPreset;
|
|
230
|
+
exports.generateColorScale = generateColorScale;
|
|
231
|
+
exports.getPreset = getPreset;
|
|
232
|
+
exports.getPresetWithMode = getPresetWithMode;
|
|
233
|
+
exports.midnightPreset = midnightPreset;
|
|
234
|
+
exports.oceanBluePreset = oceanBluePreset;
|
|
235
|
+
exports.presets = presets;
|
|
236
|
+
//# sourceMappingURL=color-presets.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"color-presets.cjs","sources":["../../src/colors/color-presets.ts"],"sourcesContent":["/**\n * Color preset definitions for PhaserJSX UI\n * Provides pre-configured color palettes with light/dark mode support\n */\n\nimport { HexColor, type ColorShade, type ColorTokens } from './color-types'\nimport { hexToNumber, hslToNumber, numberToHex, numberToHsl } from './color-utils'\n\n/**\n * Base ColorShade without DEFAULT property\n */\ntype ColorShadeBase = Omit<ColorShade, 'DEFAULT'>\n\n/** Neutral color hex values per shade level */\ntype NeutralHexValues = Record<'lightest' | 'light' | 'medium' | 'dark' | 'darkest', string>\n\n/** Light mode neutral color definitions */\nconst LIGHT_NEUTRALS = {\n background: {\n lightest: '#ffffff',\n light: '#fafafa',\n medium: '#f0f0f0',\n dark: '#e5e5e5',\n darkest: '#d0d0d0',\n },\n surface: {\n lightest: '#f5f5f5',\n light: '#ebebeb',\n medium: '#e0e0e0',\n dark: '#d5d5d5',\n darkest: '#c8c8c8',\n },\n text: {\n lightest: '#e0e0e0',\n light: '#666666',\n medium: '#555555',\n dark: '#424242',\n darkest: '#212121',\n },\n border: {\n lightest: '#d5d5d5',\n light: '#c0c0c0',\n medium: '#a8a8a8',\n dark: '#8e8e8e',\n darkest: '#6e6e6e',\n },\n} as const satisfies Record<string, NeutralHexValues>\n\n/** Dark mode neutral color definitions */\nconst DARK_NEUTRALS = {\n background: {\n lightest: '#3a3a3a',\n light: '#2e2e2e',\n medium: '#1e1e1e',\n dark: '#161616',\n darkest: '#0a0a0a',\n },\n surface: {\n lightest: '#4a4a4a',\n light: '#3e3e3e',\n medium: '#333333',\n dark: '#2a2a2a',\n darkest: '#222222',\n },\n text: {\n lightest: '#ffffff',\n light: '#e8e8e8',\n medium: '#cccccc',\n dark: '#bebebe',\n darkest: '#808080',\n },\n border: {\n lightest: '#757575',\n light: '#616161',\n medium: '#4a4a4a',\n dark: '#3a3a3a',\n darkest: '#2e2e2e',\n },\n} as const satisfies Record<string, NeutralHexValues>\n\n/**\n * Convert neutral hex values to a full ColorShade with DEFAULT alias\n * @param shades - Record of shade level to hex string\n * @returns ColorShade with HexColor instances and DEFAULT pointing to medium\n */\nfunction toColorShade(shades: NeutralHexValues): ColorShade {\n return {\n lightest: HexColor.from(shades.lightest),\n light: HexColor.from(shades.light),\n medium: HexColor.from(shades.medium),\n dark: HexColor.from(shades.dark),\n darkest: HexColor.from(shades.darkest),\n DEFAULT: HexColor.from(shades.medium),\n }\n}\n\n/**\n * Create a ColorShade with DEFAULT pointing to medium\n * @param shade - ColorShade object without DEFAULT\n * @returns ColorShade with DEFAULT set to medium\n */\nfunction addDefault(shade: ColorShadeBase): ColorShade {\n return { ...shade, DEFAULT: shade.medium }\n}\n\n/**\n * Generate a complete color scale from a base color using HSL-based perceptual scaling\n * Creates shades from lightest to darkest with DEFAULT pointing to medium\n * @param baseColor - The base color in hex format (e.g., '#2196f3')\n * @returns Complete ColorShade with all semantic levels as HexColor objects\n * @example\n * ```typescript\n * const primaryScale = generateColorScale('#2196f3')\n * // Usage: colors.primary.medium.toNumber()\n * // DEFAULT also works: colors.primary.DEFAULT.toNumber()\n * ```\n */\nexport function generateColorScale(baseColor: string): ColorShade {\n const num = hexToNumber(baseColor)\n const hsl = numberToHsl(num)\n\n return addDefault({\n lightest: HexColor.from(numberToHex(hslToNumber(hsl.h, hsl.s, 0.92))),\n light: HexColor.from(numberToHex(hslToNumber(hsl.h, hsl.s * 0.7, 0.72))),\n medium: HexColor.from(baseColor),\n dark: HexColor.from(numberToHex(hslToNumber(hsl.h, hsl.s * 0.8, 0.35))),\n darkest: HexColor.from(numberToHex(hslToNumber(hsl.h, hsl.s * 0.6, 0.15))),\n })\n}\n\n/**\n * Color preset configuration\n * Defines a complete set of semantic colors for a theme\n */\nexport interface ColorPreset {\n /** Preset name for identification */\n name: string\n /** Complete color token set */\n colors: ColorTokens\n}\n\n/**\n * Ocean Blue Preset\n * Clean, professional blue-based palette\n */\nexport const oceanBluePreset: ColorPreset = {\n name: 'oceanBlue',\n colors: {\n // Brand colors\n primary: generateColorScale('#2196f3'), // Material Blue\n secondary: generateColorScale('#607d8b'), // Blue Grey\n accent: generateColorScale('#00bcd4'), // Cyan\n\n // Feedback colors\n success: generateColorScale('#4caf50'), // Green\n warning: generateColorScale('#ff9800'), // Orange\n error: generateColorScale('#f44336'), // Red\n info: generateColorScale('#2196f3'), // Blue (same as primary)\n\n // Neutral colors - designed for light mode\n background: toColorShade(LIGHT_NEUTRALS.background),\n surface: toColorShade(LIGHT_NEUTRALS.surface),\n text: toColorShade(LIGHT_NEUTRALS.text),\n border: toColorShade(LIGHT_NEUTRALS.border),\n },\n}\n\n/**\n * Forest Green Preset\n * Nature-inspired green-based palette\n */\nexport const forestGreenPreset: ColorPreset = {\n name: 'forestGreen',\n colors: {\n // Brand colors\n primary: generateColorScale('#4caf50'), // Green\n secondary: generateColorScale('#8bc34a'), // Light Green\n accent: generateColorScale('#ff8f00'), // Amber (warm earth tone)\n\n // Feedback colors\n success: generateColorScale('#66bb6a'), // Light Green\n warning: generateColorScale('#ffa726'), // Orange\n error: generateColorScale('#ef5350'), // Red\n info: generateColorScale('#29b6f6'), // Light Blue\n\n // Neutral colors - green-tinted\n background: toColorShade({\n lightest: '#ffffff',\n light: '#f1f8e9',\n medium: '#dcedc8',\n dark: '#c5e1a5',\n darkest: '#aed581',\n }),\n surface: toColorShade({\n lightest: '#ffffff',\n light: '#f9fbe7',\n medium: '#f0f4c3',\n dark: '#e6ee9c',\n darkest: '#dce775',\n }),\n text: toColorShade({\n lightest: '#9e9e9e',\n light: '#757575',\n medium: '#616161',\n dark: '#424242',\n darkest: '#1b5e20',\n }),\n border: toColorShade({\n lightest: '#dcedc8',\n light: '#c5e1a5',\n medium: '#aed581',\n dark: '#9ccc65',\n darkest: '#7cb342',\n }),\n },\n}\n\n/**\n * Midnight Preset\n * Dark, elegant purple-based palette\n */\nexport const midnightPreset: ColorPreset = {\n name: 'midnight',\n colors: {\n // Brand colors\n primary: generateColorScale('#9c27b0'), // Purple\n secondary: generateColorScale('#673ab7'), // Deep Purple\n accent: generateColorScale('#e91e63'), // Pink\n\n // Feedback colors\n success: generateColorScale('#66bb6a'), // Green\n warning: generateColorScale('#ffa726'), // Orange\n error: generateColorScale('#ef5350'), // Red\n info: generateColorScale('#42a5f5'), // Blue\n\n // Neutral colors - designed for dark mode\n background: toColorShade(DARK_NEUTRALS.background),\n surface: toColorShade(DARK_NEUTRALS.surface),\n text: toColorShade(DARK_NEUTRALS.text),\n border: toColorShade(DARK_NEUTRALS.border),\n },\n}\n\n/**\n * Apply light mode overrides to a preset\n * Adjusts neutral colors for optimal light mode appearance\n * @param preset - Base preset to modify\n * @returns New preset with light mode neutral colors\n */\nexport function applyLightMode(preset: ColorPreset): ColorPreset {\n return {\n ...preset,\n colors: {\n ...preset.colors,\n background: toColorShade(LIGHT_NEUTRALS.background),\n surface: toColorShade(LIGHT_NEUTRALS.surface),\n text: toColorShade(LIGHT_NEUTRALS.text),\n border: toColorShade(LIGHT_NEUTRALS.border),\n },\n }\n}\n\n/**\n * Apply dark mode overrides to a preset\n * Adjusts neutral colors for optimal dark mode appearance\n * @param preset - Base preset to modify\n * @returns New preset with dark mode neutral colors\n */\nexport function applyDarkMode(preset: ColorPreset): ColorPreset {\n return {\n ...preset,\n colors: {\n ...preset.colors,\n background: toColorShade(DARK_NEUTRALS.background),\n surface: toColorShade(DARK_NEUTRALS.surface),\n text: toColorShade(DARK_NEUTRALS.text),\n border: toColorShade(DARK_NEUTRALS.border),\n },\n }\n}\n\n/**\n * All available presets\n */\nexport const presets = {\n oceanBlue: oceanBluePreset,\n forestGreen: forestGreenPreset,\n midnight: midnightPreset,\n} as const\n\n/**\n * Preset names for type safety\n */\nexport type PresetName = keyof typeof presets\n\n/**\n * Get a preset by name\n * @param name - Preset name\n * @returns Color preset\n * @example\n * ```typescript\n * const preset = getPreset('oceanBlue')\n * const primaryColor = preset.colors.primary.DEFAULT\n * ```\n */\nexport function getPreset(name: PresetName): ColorPreset {\n return presets[name]\n}\n\n/**\n * Get a preset with color mode applied\n * @param name - Preset name\n * @param mode - Color mode ('light' or 'dark')\n * @returns Color preset with mode-specific neutral colors\n * @example\n * ```typescript\n * const darkPreset = getPresetWithMode('oceanBlue', 'dark')\n * const bgColor = darkPreset.colors.background.DEFAULT\n * ```\n */\nexport function getPresetWithMode(name: PresetName, mode: 'light' | 'dark'): ColorPreset {\n const preset = getPreset(name)\n return mode === 'light' ? applyLightMode(preset) : applyDarkMode(preset)\n}\n"],"names":["HexColor","hexToNumber","numberToHsl","numberToHex","hslToNumber"],"mappings":"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"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { ColorShade, ColorTokens } from './color-types';
|
|
2
|
+
/**
|
|
3
|
+
* Generate a complete color scale from a base color using HSL-based perceptual scaling
|
|
4
|
+
* Creates shades from lightest to darkest with DEFAULT pointing to medium
|
|
5
|
+
* @param baseColor - The base color in hex format (e.g., '#2196f3')
|
|
6
|
+
* @returns Complete ColorShade with all semantic levels as HexColor objects
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* const primaryScale = generateColorScale('#2196f3')
|
|
10
|
+
* // Usage: colors.primary.medium.toNumber()
|
|
11
|
+
* // DEFAULT also works: colors.primary.DEFAULT.toNumber()
|
|
12
|
+
* ```
|
|
13
|
+
*/
|
|
14
|
+
export declare function generateColorScale(baseColor: string): ColorShade;
|
|
15
|
+
/**
|
|
16
|
+
* Color preset configuration
|
|
17
|
+
* Defines a complete set of semantic colors for a theme
|
|
18
|
+
*/
|
|
19
|
+
export interface ColorPreset {
|
|
20
|
+
/** Preset name for identification */
|
|
21
|
+
name: string;
|
|
22
|
+
/** Complete color token set */
|
|
23
|
+
colors: ColorTokens;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Ocean Blue Preset
|
|
27
|
+
* Clean, professional blue-based palette
|
|
28
|
+
*/
|
|
29
|
+
export declare const oceanBluePreset: ColorPreset;
|
|
30
|
+
/**
|
|
31
|
+
* Forest Green Preset
|
|
32
|
+
* Nature-inspired green-based palette
|
|
33
|
+
*/
|
|
34
|
+
export declare const forestGreenPreset: ColorPreset;
|
|
35
|
+
/**
|
|
36
|
+
* Midnight Preset
|
|
37
|
+
* Dark, elegant purple-based palette
|
|
38
|
+
*/
|
|
39
|
+
export declare const midnightPreset: ColorPreset;
|
|
40
|
+
/**
|
|
41
|
+
* Apply light mode overrides to a preset
|
|
42
|
+
* Adjusts neutral colors for optimal light mode appearance
|
|
43
|
+
* @param preset - Base preset to modify
|
|
44
|
+
* @returns New preset with light mode neutral colors
|
|
45
|
+
*/
|
|
46
|
+
export declare function applyLightMode(preset: ColorPreset): ColorPreset;
|
|
47
|
+
/**
|
|
48
|
+
* Apply dark mode overrides to a preset
|
|
49
|
+
* Adjusts neutral colors for optimal dark mode appearance
|
|
50
|
+
* @param preset - Base preset to modify
|
|
51
|
+
* @returns New preset with dark mode neutral colors
|
|
52
|
+
*/
|
|
53
|
+
export declare function applyDarkMode(preset: ColorPreset): ColorPreset;
|
|
54
|
+
/**
|
|
55
|
+
* All available presets
|
|
56
|
+
*/
|
|
57
|
+
export declare const presets: {
|
|
58
|
+
readonly oceanBlue: ColorPreset;
|
|
59
|
+
readonly forestGreen: ColorPreset;
|
|
60
|
+
readonly midnight: ColorPreset;
|
|
61
|
+
};
|
|
62
|
+
/**
|
|
63
|
+
* Preset names for type safety
|
|
64
|
+
*/
|
|
65
|
+
export type PresetName = keyof typeof presets;
|
|
66
|
+
/**
|
|
67
|
+
* Get a preset by name
|
|
68
|
+
* @param name - Preset name
|
|
69
|
+
* @returns Color preset
|
|
70
|
+
* @example
|
|
71
|
+
* ```typescript
|
|
72
|
+
* const preset = getPreset('oceanBlue')
|
|
73
|
+
* const primaryColor = preset.colors.primary.DEFAULT
|
|
74
|
+
* ```
|
|
75
|
+
*/
|
|
76
|
+
export declare function getPreset(name: PresetName): ColorPreset;
|
|
77
|
+
/**
|
|
78
|
+
* Get a preset with color mode applied
|
|
79
|
+
* @param name - Preset name
|
|
80
|
+
* @param mode - Color mode ('light' or 'dark')
|
|
81
|
+
* @returns Color preset with mode-specific neutral colors
|
|
82
|
+
* @example
|
|
83
|
+
* ```typescript
|
|
84
|
+
* const darkPreset = getPresetWithMode('oceanBlue', 'dark')
|
|
85
|
+
* const bgColor = darkPreset.colors.background.DEFAULT
|
|
86
|
+
* ```
|
|
87
|
+
*/
|
|
88
|
+
export declare function getPresetWithMode(name: PresetName, mode: 'light' | 'dark'): ColorPreset;
|
|
89
|
+
//# sourceMappingURL=color-presets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"color-presets.d.ts","sourceRoot":"","sources":["../../src/colors/color-presets.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAY,KAAK,UAAU,EAAE,KAAK,WAAW,EAAE,MAAM,eAAe,CAAA;AAoG3E;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,UAAU,CAWhE;AAED;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,qCAAqC;IACrC,IAAI,EAAE,MAAM,CAAA;IACZ,+BAA+B;IAC/B,MAAM,EAAE,WAAW,CAAA;CACpB;AAED;;;GAGG;AACH,eAAO,MAAM,eAAe,EAAE,WAoB7B,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,WA4C/B,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,cAAc,EAAE,WAoB5B,CAAA;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,WAAW,CAW/D;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,WAAW,GAAG,WAAW,CAW9D;AAED;;GAEG;AACH,eAAO,MAAM,OAAO;;;;CAIV,CAAA;AAEV;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,MAAM,OAAO,OAAO,CAAA;AAE7C;;;;;;;;;GASG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,UAAU,GAAG,WAAW,CAEvD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,WAAW,CAGvF"}
|