@xtyle/core 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +212 -0
- package/algorithms.d.ts +25 -0
- package/concepts/algorithms.md +28 -0
- package/concepts/consuming.md +45 -0
- package/concepts/open-register.md +28 -0
- package/concepts/overview.md +43 -0
- package/dist/algorithms/factory.d.ts +102 -0
- package/dist/algorithms/factory.d.ts.map +1 -0
- package/dist/algorithms/factory.js +2187 -0
- package/dist/algorithms/factory.js.map +1 -0
- package/dist/audit.d.ts +52 -0
- package/dist/audit.d.ts.map +1 -0
- package/dist/audit.js +71 -0
- package/dist/audit.js.map +1 -0
- package/dist/authoring.d.ts +52 -0
- package/dist/authoring.d.ts.map +1 -0
- package/dist/authoring.js +89 -0
- package/dist/authoring.js.map +1 -0
- package/dist/baked.d.ts +3 -0
- package/dist/baked.d.ts.map +1 -0
- package/dist/baked.js +9 -0
- package/dist/baked.js.map +1 -0
- package/dist/batteries.js +339 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +202 -0
- package/dist/cli.js.map +1 -0
- package/dist/color.d.ts +45 -0
- package/dist/color.d.ts.map +1 -0
- package/dist/color.js +130 -0
- package/dist/color.js.map +1 -0
- package/dist/concepts.d.ts +8 -0
- package/dist/concepts.d.ts.map +1 -0
- package/dist/concepts.js +31 -0
- package/dist/concepts.js.map +1 -0
- package/dist/constraints.d.ts +3 -0
- package/dist/constraints.d.ts.map +1 -0
- package/dist/constraints.js +11 -0
- package/dist/constraints.js.map +1 -0
- package/dist/convert.d.ts +59 -0
- package/dist/convert.d.ts.map +1 -0
- package/dist/convert.js +317 -0
- package/dist/convert.js.map +1 -0
- package/dist/coverage.d.ts +20 -0
- package/dist/coverage.d.ts.map +1 -0
- package/dist/coverage.js +37 -0
- package/dist/coverage.js.map +1 -0
- package/dist/css/components/accordion.d.ts +2 -0
- package/dist/css/components/accordion.d.ts.map +1 -0
- package/dist/css/components/accordion.js +98 -0
- package/dist/css/components/accordion.js.map +1 -0
- package/dist/css/components/alert.d.ts +2 -0
- package/dist/css/components/alert.d.ts.map +1 -0
- package/dist/css/components/alert.js +98 -0
- package/dist/css/components/alert.js.map +1 -0
- package/dist/css/components/app-shell.d.ts +2 -0
- package/dist/css/components/app-shell.d.ts.map +1 -0
- package/dist/css/components/app-shell.js +145 -0
- package/dist/css/components/app-shell.js.map +1 -0
- package/dist/css/components/avatar-group.d.ts +2 -0
- package/dist/css/components/avatar-group.d.ts.map +1 -0
- package/dist/css/components/avatar-group.js +65 -0
- package/dist/css/components/avatar-group.js.map +1 -0
- package/dist/css/components/avatar.d.ts +2 -0
- package/dist/css/components/avatar.d.ts.map +1 -0
- package/dist/css/components/avatar.js +108 -0
- package/dist/css/components/avatar.js.map +1 -0
- package/dist/css/components/badge.d.ts +2 -0
- package/dist/css/components/badge.d.ts.map +1 -0
- package/dist/css/components/badge.js +161 -0
- package/dist/css/components/badge.js.map +1 -0
- package/dist/css/components/bar.d.ts +2 -0
- package/dist/css/components/bar.d.ts.map +1 -0
- package/dist/css/components/bar.js +102 -0
- package/dist/css/components/bar.js.map +1 -0
- package/dist/css/components/base.d.ts +15 -0
- package/dist/css/components/base.d.ts.map +1 -0
- package/dist/css/components/base.js +62 -0
- package/dist/css/components/base.js.map +1 -0
- package/dist/css/components/breadcrumb.d.ts +2 -0
- package/dist/css/components/breadcrumb.d.ts.map +1 -0
- package/dist/css/components/breadcrumb.js +89 -0
- package/dist/css/components/breadcrumb.js.map +1 -0
- package/dist/css/components/button.d.ts +2 -0
- package/dist/css/components/button.d.ts.map +1 -0
- package/dist/css/components/button.js +165 -0
- package/dist/css/components/button.js.map +1 -0
- package/dist/css/components/card-link.d.ts +2 -0
- package/dist/css/components/card-link.d.ts.map +1 -0
- package/dist/css/components/card-link.js +11 -0
- package/dist/css/components/card-link.js.map +1 -0
- package/dist/css/components/card.d.ts +2 -0
- package/dist/css/components/card.d.ts.map +1 -0
- package/dist/css/components/card.js +85 -0
- package/dist/css/components/card.js.map +1 -0
- package/dist/css/components/carousel.d.ts +2 -0
- package/dist/css/components/carousel.d.ts.map +1 -0
- package/dist/css/components/carousel.js +75 -0
- package/dist/css/components/carousel.js.map +1 -0
- package/dist/css/components/checkbox.d.ts +2 -0
- package/dist/css/components/checkbox.d.ts.map +1 -0
- package/dist/css/components/checkbox.js +122 -0
- package/dist/css/components/checkbox.js.map +1 -0
- package/dist/css/components/cluster.d.ts +2 -0
- package/dist/css/components/cluster.d.ts.map +1 -0
- package/dist/css/components/cluster.js +41 -0
- package/dist/css/components/cluster.js.map +1 -0
- package/dist/css/components/code.d.ts +2 -0
- package/dist/css/components/code.d.ts.map +1 -0
- package/dist/css/components/code.js +135 -0
- package/dist/css/components/code.js.map +1 -0
- package/dist/css/components/color-picker.d.ts +2 -0
- package/dist/css/components/color-picker.d.ts.map +1 -0
- package/dist/css/components/color-picker.js +458 -0
- package/dist/css/components/color-picker.js.map +1 -0
- package/dist/css/components/dialog.d.ts +2 -0
- package/dist/css/components/dialog.d.ts.map +1 -0
- package/dist/css/components/dialog.js +103 -0
- package/dist/css/components/dialog.js.map +1 -0
- package/dist/css/components/dock-zone.d.ts +2 -0
- package/dist/css/components/dock-zone.d.ts.map +1 -0
- package/dist/css/components/dock-zone.js +285 -0
- package/dist/css/components/dock-zone.js.map +1 -0
- package/dist/css/components/dock.d.ts +2 -0
- package/dist/css/components/dock.d.ts.map +1 -0
- package/dist/css/components/dock.js +66 -0
- package/dist/css/components/dock.js.map +1 -0
- package/dist/css/components/eyebrow.d.ts +2 -0
- package/dist/css/components/eyebrow.d.ts.map +1 -0
- package/dist/css/components/eyebrow.js +22 -0
- package/dist/css/components/eyebrow.js.map +1 -0
- package/dist/css/components/field.d.ts +2 -0
- package/dist/css/components/field.d.ts.map +1 -0
- package/dist/css/components/field.js +135 -0
- package/dist/css/components/field.js.map +1 -0
- package/dist/css/components/form-group.d.ts +2 -0
- package/dist/css/components/form-group.d.ts.map +1 -0
- package/dist/css/components/form-group.js +66 -0
- package/dist/css/components/form-group.js.map +1 -0
- package/dist/css/components/grid.d.ts +2 -0
- package/dist/css/components/grid.d.ts.map +1 -0
- package/dist/css/components/grid.js +42 -0
- package/dist/css/components/grid.js.map +1 -0
- package/dist/css/components/heading.d.ts +2 -0
- package/dist/css/components/heading.d.ts.map +1 -0
- package/dist/css/components/heading.js +37 -0
- package/dist/css/components/heading.js.map +1 -0
- package/dist/css/components/heatmap.d.ts +2 -0
- package/dist/css/components/heatmap.d.ts.map +1 -0
- package/dist/css/components/heatmap.js +111 -0
- package/dist/css/components/heatmap.js.map +1 -0
- package/dist/css/components/hero.d.ts +2 -0
- package/dist/css/components/hero.d.ts.map +1 -0
- package/dist/css/components/hero.js +30 -0
- package/dist/css/components/hero.js.map +1 -0
- package/dist/css/components/icon.d.ts +2 -0
- package/dist/css/components/icon.d.ts.map +1 -0
- package/dist/css/components/icon.js +24 -0
- package/dist/css/components/icon.js.map +1 -0
- package/dist/css/components/image.d.ts +2 -0
- package/dist/css/components/image.d.ts.map +1 -0
- package/dist/css/components/image.js +118 -0
- package/dist/css/components/image.js.map +1 -0
- package/dist/css/components/kbd.d.ts +2 -0
- package/dist/css/components/kbd.d.ts.map +1 -0
- package/dist/css/components/kbd.js +30 -0
- package/dist/css/components/kbd.js.map +1 -0
- package/dist/css/components/link.d.ts +2 -0
- package/dist/css/components/link.d.ts.map +1 -0
- package/dist/css/components/link.js +61 -0
- package/dist/css/components/link.js.map +1 -0
- package/dist/css/components/menu.d.ts +2 -0
- package/dist/css/components/menu.d.ts.map +1 -0
- package/dist/css/components/menu.js +114 -0
- package/dist/css/components/menu.js.map +1 -0
- package/dist/css/components/number-input.d.ts +2 -0
- package/dist/css/components/number-input.d.ts.map +1 -0
- package/dist/css/components/number-input.js +92 -0
- package/dist/css/components/number-input.js.map +1 -0
- package/dist/css/components/pagination.d.ts +2 -0
- package/dist/css/components/pagination.d.ts.map +1 -0
- package/dist/css/components/pagination.js +105 -0
- package/dist/css/components/pagination.js.map +1 -0
- package/dist/css/components/panel.d.ts +2 -0
- package/dist/css/components/panel.d.ts.map +1 -0
- package/dist/css/components/panel.js +116 -0
- package/dist/css/components/panel.js.map +1 -0
- package/dist/css/components/parallax.d.ts +2 -0
- package/dist/css/components/parallax.d.ts.map +1 -0
- package/dist/css/components/parallax.js +34 -0
- package/dist/css/components/parallax.js.map +1 -0
- package/dist/css/components/pie.d.ts +2 -0
- package/dist/css/components/pie.d.ts.map +1 -0
- package/dist/css/components/pie.js +100 -0
- package/dist/css/components/pie.js.map +1 -0
- package/dist/css/components/progress.d.ts +2 -0
- package/dist/css/components/progress.d.ts.map +1 -0
- package/dist/css/components/progress.js +161 -0
- package/dist/css/components/progress.js.map +1 -0
- package/dist/css/components/radio.d.ts +2 -0
- package/dist/css/components/radio.d.ts.map +1 -0
- package/dist/css/components/radio.js +134 -0
- package/dist/css/components/radio.js.map +1 -0
- package/dist/css/components/section.d.ts +2 -0
- package/dist/css/components/section.d.ts.map +1 -0
- package/dist/css/components/section.js +45 -0
- package/dist/css/components/section.js.map +1 -0
- package/dist/css/components/segmented.d.ts +2 -0
- package/dist/css/components/segmented.d.ts.map +1 -0
- package/dist/css/components/segmented.js +129 -0
- package/dist/css/components/segmented.js.map +1 -0
- package/dist/css/components/select.d.ts +2 -0
- package/dist/css/components/select.d.ts.map +1 -0
- package/dist/css/components/select.js +75 -0
- package/dist/css/components/select.js.map +1 -0
- package/dist/css/components/separator.d.ts +2 -0
- package/dist/css/components/separator.d.ts.map +1 -0
- package/dist/css/components/separator.js +60 -0
- package/dist/css/components/separator.js.map +1 -0
- package/dist/css/components/skeleton.d.ts +2 -0
- package/dist/css/components/skeleton.d.ts.map +1 -0
- package/dist/css/components/skeleton.js +56 -0
- package/dist/css/components/skeleton.js.map +1 -0
- package/dist/css/components/slider.d.ts +2 -0
- package/dist/css/components/slider.d.ts.map +1 -0
- package/dist/css/components/slider.js +131 -0
- package/dist/css/components/slider.js.map +1 -0
- package/dist/css/components/sparkline.d.ts +2 -0
- package/dist/css/components/sparkline.d.ts.map +1 -0
- package/dist/css/components/sparkline.js +78 -0
- package/dist/css/components/sparkline.js.map +1 -0
- package/dist/css/components/spinner.d.ts +2 -0
- package/dist/css/components/spinner.d.ts.map +1 -0
- package/dist/css/components/spinner.js +33 -0
- package/dist/css/components/spinner.js.map +1 -0
- package/dist/css/components/splitter.d.ts +2 -0
- package/dist/css/components/splitter.d.ts.map +1 -0
- package/dist/css/components/splitter.js +90 -0
- package/dist/css/components/splitter.js.map +1 -0
- package/dist/css/components/stack.d.ts +2 -0
- package/dist/css/components/stack.d.ts.map +1 -0
- package/dist/css/components/stack.js +36 -0
- package/dist/css/components/stack.js.map +1 -0
- package/dist/css/components/stat.d.ts +2 -0
- package/dist/css/components/stat.d.ts.map +1 -0
- package/dist/css/components/stat.js +78 -0
- package/dist/css/components/stat.js.map +1 -0
- package/dist/css/components/statusbar.d.ts +2 -0
- package/dist/css/components/statusbar.d.ts.map +1 -0
- package/dist/css/components/statusbar.js +120 -0
- package/dist/css/components/statusbar.js.map +1 -0
- package/dist/css/components/swatch.d.ts +2 -0
- package/dist/css/components/swatch.d.ts.map +1 -0
- package/dist/css/components/swatch.js +102 -0
- package/dist/css/components/swatch.js.map +1 -0
- package/dist/css/components/switch.d.ts +2 -0
- package/dist/css/components/switch.d.ts.map +1 -0
- package/dist/css/components/switch.js +144 -0
- package/dist/css/components/switch.js.map +1 -0
- package/dist/css/components/table.d.ts +2 -0
- package/dist/css/components/table.d.ts.map +1 -0
- package/dist/css/components/table.js +142 -0
- package/dist/css/components/table.js.map +1 -0
- package/dist/css/components/tabs.d.ts +2 -0
- package/dist/css/components/tabs.d.ts.map +1 -0
- package/dist/css/components/tabs.js +158 -0
- package/dist/css/components/tabs.js.map +1 -0
- package/dist/css/components/text.d.ts +2 -0
- package/dist/css/components/text.d.ts.map +1 -0
- package/dist/css/components/text.js +35 -0
- package/dist/css/components/text.js.map +1 -0
- package/dist/css/components/textarea.d.ts +2 -0
- package/dist/css/components/textarea.d.ts.map +1 -0
- package/dist/css/components/textarea.js +57 -0
- package/dist/css/components/textarea.js.map +1 -0
- package/dist/css/components/toast.d.ts +2 -0
- package/dist/css/components/toast.d.ts.map +1 -0
- package/dist/css/components/toast.js +161 -0
- package/dist/css/components/toast.js.map +1 -0
- package/dist/css/components/toc.d.ts +2 -0
- package/dist/css/components/toc.d.ts.map +1 -0
- package/dist/css/components/toc.js +80 -0
- package/dist/css/components/toc.js.map +1 -0
- package/dist/css/components/toolbar.d.ts +2 -0
- package/dist/css/components/toolbar.d.ts.map +1 -0
- package/dist/css/components/toolbar.js +69 -0
- package/dist/css/components/toolbar.js.map +1 -0
- package/dist/css/components/tooltip.d.ts +2 -0
- package/dist/css/components/tooltip.d.ts.map +1 -0
- package/dist/css/components/tooltip.js +151 -0
- package/dist/css/components/tooltip.js.map +1 -0
- package/dist/css/components/tree.d.ts +2 -0
- package/dist/css/components/tree.d.ts.map +1 -0
- package/dist/css/components/tree.js +135 -0
- package/dist/css/components/tree.js.map +1 -0
- package/dist/css/components.d.ts +15 -0
- package/dist/css/components.d.ts.map +1 -0
- package/dist/css/components.js +210 -0
- package/dist/css/components.js.map +1 -0
- package/dist/css/index.d.ts +77 -0
- package/dist/css/index.d.ts.map +1 -0
- package/dist/css/index.js +87 -0
- package/dist/css/index.js.map +1 -0
- package/dist/css/utilities.d.ts +16 -0
- package/dist/css/utilities.d.ts.map +1 -0
- package/dist/css/utilities.js +108 -0
- package/dist/css/utilities.js.map +1 -0
- package/dist/cuti.d.ts +42 -0
- package/dist/cuti.d.ts.map +1 -0
- package/dist/cuti.js +66 -0
- package/dist/cuti.js.map +1 -0
- package/dist/dom.d.ts +11 -0
- package/dist/dom.d.ts.map +1 -0
- package/dist/dom.js +37 -0
- package/dist/dom.js.map +1 -0
- package/dist/elements/accordion.d.ts +34 -0
- package/dist/elements/accordion.d.ts.map +1 -0
- package/dist/elements/accordion.js +158 -0
- package/dist/elements/accordion.js.map +1 -0
- package/dist/elements/alert.d.ts +25 -0
- package/dist/elements/alert.d.ts.map +1 -0
- package/dist/elements/alert.js +82 -0
- package/dist/elements/alert.js.map +1 -0
- package/dist/elements/app-shell.d.ts +35 -0
- package/dist/elements/app-shell.d.ts.map +1 -0
- package/dist/elements/app-shell.js +207 -0
- package/dist/elements/app-shell.js.map +1 -0
- package/dist/elements/avatar-group.d.ts +19 -0
- package/dist/elements/avatar-group.d.ts.map +1 -0
- package/dist/elements/avatar-group.js +58 -0
- package/dist/elements/avatar-group.js.map +1 -0
- package/dist/elements/avatar.d.ts +35 -0
- package/dist/elements/avatar.d.ts.map +1 -0
- package/dist/elements/avatar.js +105 -0
- package/dist/elements/avatar.js.map +1 -0
- package/dist/elements/badge.d.ts +41 -0
- package/dist/elements/badge.d.ts.map +1 -0
- package/dist/elements/badge.js +129 -0
- package/dist/elements/badge.js.map +1 -0
- package/dist/elements/bar.d.ts +35 -0
- package/dist/elements/bar.d.ts.map +1 -0
- package/dist/elements/bar.js +204 -0
- package/dist/elements/bar.js.map +1 -0
- package/dist/elements/base.d.ts +86 -0
- package/dist/elements/base.d.ts.map +1 -0
- package/dist/elements/base.js +157 -0
- package/dist/elements/base.js.map +1 -0
- package/dist/elements/breadcrumb.d.ts +24 -0
- package/dist/elements/breadcrumb.d.ts.map +1 -0
- package/dist/elements/breadcrumb.js +89 -0
- package/dist/elements/breadcrumb.js.map +1 -0
- package/dist/elements/button.d.ts +42 -0
- package/dist/elements/button.d.ts.map +1 -0
- package/dist/elements/button.js +158 -0
- package/dist/elements/button.js.map +1 -0
- package/dist/elements/card-link.d.ts +23 -0
- package/dist/elements/card-link.d.ts.map +1 -0
- package/dist/elements/card-link.js +70 -0
- package/dist/elements/card-link.js.map +1 -0
- package/dist/elements/card.d.ts +34 -0
- package/dist/elements/card.d.ts.map +1 -0
- package/dist/elements/card.js +119 -0
- package/dist/elements/card.js.map +1 -0
- package/dist/elements/carousel.d.ts +50 -0
- package/dist/elements/carousel.d.ts.map +1 -0
- package/dist/elements/carousel.js +265 -0
- package/dist/elements/carousel.js.map +1 -0
- package/dist/elements/checkbox.d.ts +81 -0
- package/dist/elements/checkbox.d.ts.map +1 -0
- package/dist/elements/checkbox.js +293 -0
- package/dist/elements/checkbox.js.map +1 -0
- package/dist/elements/cluster.d.ts +24 -0
- package/dist/elements/cluster.d.ts.map +1 -0
- package/dist/elements/cluster.js +80 -0
- package/dist/elements/cluster.js.map +1 -0
- package/dist/elements/code-highlight.d.ts +56 -0
- package/dist/elements/code-highlight.d.ts.map +1 -0
- package/dist/elements/code-highlight.js +134 -0
- package/dist/elements/code-highlight.js.map +1 -0
- package/dist/elements/code-langs-custom.d.ts +17 -0
- package/dist/elements/code-langs-custom.d.ts.map +1 -0
- package/dist/elements/code-langs-custom.js +26 -0
- package/dist/elements/code-langs-custom.js.map +1 -0
- package/dist/elements/code-langs.generated.d.ts +8 -0
- package/dist/elements/code-langs.generated.d.ts.map +1 -0
- package/dist/elements/code-langs.generated.js +514 -0
- package/dist/elements/code-langs.generated.js.map +1 -0
- package/dist/elements/code.d.ts +75 -0
- package/dist/elements/code.d.ts.map +1 -0
- package/dist/elements/code.js +212 -0
- package/dist/elements/code.js.map +1 -0
- package/dist/elements/color-picker.d.ts +90 -0
- package/dist/elements/color-picker.d.ts.map +1 -0
- package/dist/elements/color-picker.js +738 -0
- package/dist/elements/color-picker.js.map +1 -0
- package/dist/elements/dialog.d.ts +34 -0
- package/dist/elements/dialog.d.ts.map +1 -0
- package/dist/elements/dialog.js +134 -0
- package/dist/elements/dialog.js.map +1 -0
- package/dist/elements/dock-layout.d.ts +63 -0
- package/dist/elements/dock-layout.d.ts.map +1 -0
- package/dist/elements/dock-layout.js +79 -0
- package/dist/elements/dock-layout.js.map +1 -0
- package/dist/elements/dock-model.d.ts +143 -0
- package/dist/elements/dock-model.d.ts.map +1 -0
- package/dist/elements/dock-model.js +259 -0
- package/dist/elements/dock-model.js.map +1 -0
- package/dist/elements/dock-zone.d.ts +146 -0
- package/dist/elements/dock-zone.d.ts.map +1 -0
- package/dist/elements/dock-zone.js +777 -0
- package/dist/elements/dock-zone.js.map +1 -0
- package/dist/elements/dock.d.ts +35 -0
- package/dist/elements/dock.d.ts.map +1 -0
- package/dist/elements/dock.js +106 -0
- package/dist/elements/dock.js.map +1 -0
- package/dist/elements/eyebrow.d.ts +26 -0
- package/dist/elements/eyebrow.d.ts.map +1 -0
- package/dist/elements/eyebrow.js +57 -0
- package/dist/elements/eyebrow.js.map +1 -0
- package/dist/elements/field-options.d.ts +9 -0
- package/dist/elements/field-options.d.ts.map +1 -0
- package/dist/elements/field-options.js +31 -0
- package/dist/elements/field-options.js.map +1 -0
- package/dist/elements/field.d.ts +74 -0
- package/dist/elements/field.d.ts.map +1 -0
- package/dist/elements/field.js +298 -0
- package/dist/elements/field.js.map +1 -0
- package/dist/elements/form-group.d.ts +49 -0
- package/dist/elements/form-group.d.ts.map +1 -0
- package/dist/elements/form-group.js +195 -0
- package/dist/elements/form-group.js.map +1 -0
- package/dist/elements/fragment-host.d.ts +166 -0
- package/dist/elements/fragment-host.d.ts.map +1 -0
- package/dist/elements/fragment-host.js +363 -0
- package/dist/elements/fragment-host.js.map +1 -0
- package/dist/elements/fragment-ssr.d.ts +39 -0
- package/dist/elements/fragment-ssr.d.ts.map +1 -0
- package/dist/elements/fragment-ssr.js +234 -0
- package/dist/elements/fragment-ssr.js.map +1 -0
- package/dist/elements/fragments/accordion/source.generated.d.ts +27 -0
- package/dist/elements/fragments/accordion/source.generated.d.ts.map +1 -0
- package/dist/elements/fragments/accordion/source.generated.js +4 -0
- package/dist/elements/fragments/accordion/source.generated.js.map +1 -0
- package/dist/elements/fragments/alert/source.generated.d.ts +30 -0
- package/dist/elements/fragments/alert/source.generated.d.ts.map +1 -0
- package/dist/elements/fragments/alert/source.generated.js +4 -0
- package/dist/elements/fragments/alert/source.generated.js.map +1 -0
- package/dist/elements/fragments/app-shell/source.generated.d.ts +25 -0
- package/dist/elements/fragments/app-shell/source.generated.d.ts.map +1 -0
- package/dist/elements/fragments/app-shell/source.generated.js +4 -0
- package/dist/elements/fragments/app-shell/source.generated.js.map +1 -0
- package/dist/elements/fragments/avatar/source.generated.d.ts +22 -0
- package/dist/elements/fragments/avatar/source.generated.d.ts.map +1 -0
- package/dist/elements/fragments/avatar/source.generated.js +4 -0
- package/dist/elements/fragments/avatar/source.generated.js.map +1 -0
- package/dist/elements/fragments/avatar-group/source.generated.d.ts +25 -0
- package/dist/elements/fragments/avatar-group/source.generated.d.ts.map +1 -0
- package/dist/elements/fragments/avatar-group/source.generated.js +4 -0
- package/dist/elements/fragments/avatar-group/source.generated.js.map +1 -0
- package/dist/elements/fragments/badge/source.generated.d.ts +25 -0
- package/dist/elements/fragments/badge/source.generated.d.ts.map +1 -0
- package/dist/elements/fragments/badge/source.generated.js +4 -0
- package/dist/elements/fragments/badge/source.generated.js.map +1 -0
- package/dist/elements/fragments/bar/source.generated.d.ts +25 -0
- package/dist/elements/fragments/bar/source.generated.d.ts.map +1 -0
- package/dist/elements/fragments/bar/source.generated.js +4 -0
- package/dist/elements/fragments/bar/source.generated.js.map +1 -0
- package/dist/elements/fragments/breadcrumb/source.generated.d.ts +30 -0
- package/dist/elements/fragments/breadcrumb/source.generated.d.ts.map +1 -0
- package/dist/elements/fragments/breadcrumb/source.generated.js +4 -0
- package/dist/elements/fragments/breadcrumb/source.generated.js.map +1 -0
- package/dist/elements/fragments/button/source.generated.d.ts +22 -0
- package/dist/elements/fragments/button/source.generated.d.ts.map +1 -0
- package/dist/elements/fragments/button/source.generated.js +4 -0
- package/dist/elements/fragments/button/source.generated.js.map +1 -0
- package/dist/elements/fragments/card/source.generated.d.ts +22 -0
- package/dist/elements/fragments/card/source.generated.d.ts.map +1 -0
- package/dist/elements/fragments/card/source.generated.js +4 -0
- package/dist/elements/fragments/card/source.generated.js.map +1 -0
- package/dist/elements/fragments/card-link/source.generated.d.ts +22 -0
- package/dist/elements/fragments/card-link/source.generated.d.ts.map +1 -0
- package/dist/elements/fragments/card-link/source.generated.js +4 -0
- package/dist/elements/fragments/card-link/source.generated.js.map +1 -0
- package/dist/elements/fragments/checkbox/source.generated.d.ts +27 -0
- package/dist/elements/fragments/checkbox/source.generated.d.ts.map +1 -0
- package/dist/elements/fragments/checkbox/source.generated.js +4 -0
- package/dist/elements/fragments/checkbox/source.generated.js.map +1 -0
- package/dist/elements/fragments/cluster/source.generated.d.ts +25 -0
- package/dist/elements/fragments/cluster/source.generated.d.ts.map +1 -0
- package/dist/elements/fragments/cluster/source.generated.js +4 -0
- package/dist/elements/fragments/cluster/source.generated.js.map +1 -0
- package/dist/elements/fragments/code/source.generated.d.ts +30 -0
- package/dist/elements/fragments/code/source.generated.d.ts.map +1 -0
- package/dist/elements/fragments/code/source.generated.js +4 -0
- package/dist/elements/fragments/code/source.generated.js.map +1 -0
- package/dist/elements/fragments/color-picker/source.generated.d.ts +25 -0
- package/dist/elements/fragments/color-picker/source.generated.d.ts.map +1 -0
- package/dist/elements/fragments/color-picker/source.generated.js +4 -0
- package/dist/elements/fragments/color-picker/source.generated.js.map +1 -0
- package/dist/elements/fragments/component-host.json +801 -0
- package/dist/elements/fragments/dialog/source.generated.d.ts +30 -0
- package/dist/elements/fragments/dialog/source.generated.d.ts.map +1 -0
- package/dist/elements/fragments/dialog/source.generated.js +4 -0
- package/dist/elements/fragments/dialog/source.generated.js.map +1 -0
- package/dist/elements/fragments/dock/source.generated.d.ts +25 -0
- package/dist/elements/fragments/dock/source.generated.d.ts.map +1 -0
- package/dist/elements/fragments/dock/source.generated.js +4 -0
- package/dist/elements/fragments/dock/source.generated.js.map +1 -0
- package/dist/elements/fragments/eyebrow/source.generated.d.ts +22 -0
- package/dist/elements/fragments/eyebrow/source.generated.d.ts.map +1 -0
- package/dist/elements/fragments/eyebrow/source.generated.js +4 -0
- package/dist/elements/fragments/eyebrow/source.generated.js.map +1 -0
- package/dist/elements/fragments/field/source.generated.d.ts +27 -0
- package/dist/elements/fragments/field/source.generated.d.ts.map +1 -0
- package/dist/elements/fragments/field/source.generated.js +4 -0
- package/dist/elements/fragments/field/source.generated.js.map +1 -0
- package/dist/elements/fragments/form-group/source.generated.d.ts +22 -0
- package/dist/elements/fragments/form-group/source.generated.d.ts.map +1 -0
- package/dist/elements/fragments/form-group/source.generated.js +4 -0
- package/dist/elements/fragments/form-group/source.generated.js.map +1 -0
- package/dist/elements/fragments/grid/source.generated.d.ts +25 -0
- package/dist/elements/fragments/grid/source.generated.d.ts.map +1 -0
- package/dist/elements/fragments/grid/source.generated.js +4 -0
- package/dist/elements/fragments/grid/source.generated.js.map +1 -0
- package/dist/elements/fragments/heading/source.generated.d.ts +22 -0
- package/dist/elements/fragments/heading/source.generated.d.ts.map +1 -0
- package/dist/elements/fragments/heading/source.generated.js +4 -0
- package/dist/elements/fragments/heading/source.generated.js.map +1 -0
- package/dist/elements/fragments/heatmap/source.generated.d.ts +25 -0
- package/dist/elements/fragments/heatmap/source.generated.d.ts.map +1 -0
- package/dist/elements/fragments/heatmap/source.generated.js +4 -0
- package/dist/elements/fragments/heatmap/source.generated.js.map +1 -0
- package/dist/elements/fragments/icon/source.generated.d.ts +25 -0
- package/dist/elements/fragments/icon/source.generated.d.ts.map +1 -0
- package/dist/elements/fragments/icon/source.generated.js +4 -0
- package/dist/elements/fragments/icon/source.generated.js.map +1 -0
- package/dist/elements/fragments/image/source.generated.d.ts +25 -0
- package/dist/elements/fragments/image/source.generated.d.ts.map +1 -0
- package/dist/elements/fragments/image/source.generated.js +4 -0
- package/dist/elements/fragments/image/source.generated.js.map +1 -0
- package/dist/elements/fragments/kbd/source.generated.d.ts +25 -0
- package/dist/elements/fragments/kbd/source.generated.d.ts.map +1 -0
- package/dist/elements/fragments/kbd/source.generated.js +4 -0
- package/dist/elements/fragments/kbd/source.generated.js.map +1 -0
- package/dist/elements/fragments/link/source.generated.d.ts +22 -0
- package/dist/elements/fragments/link/source.generated.d.ts.map +1 -0
- package/dist/elements/fragments/link/source.generated.js +4 -0
- package/dist/elements/fragments/link/source.generated.js.map +1 -0
- package/dist/elements/fragments/menu/source.generated.d.ts +30 -0
- package/dist/elements/fragments/menu/source.generated.d.ts.map +1 -0
- package/dist/elements/fragments/menu/source.generated.js +4 -0
- package/dist/elements/fragments/menu/source.generated.js.map +1 -0
- package/dist/elements/fragments/number-input/source.generated.d.ts +30 -0
- package/dist/elements/fragments/number-input/source.generated.d.ts.map +1 -0
- package/dist/elements/fragments/number-input/source.generated.js +4 -0
- package/dist/elements/fragments/number-input/source.generated.js.map +1 -0
- package/dist/elements/fragments/pagination/source.generated.d.ts +25 -0
- package/dist/elements/fragments/pagination/source.generated.d.ts.map +1 -0
- package/dist/elements/fragments/pagination/source.generated.js +4 -0
- package/dist/elements/fragments/pagination/source.generated.js.map +1 -0
- package/dist/elements/fragments/panel/source.generated.d.ts +30 -0
- package/dist/elements/fragments/panel/source.generated.d.ts.map +1 -0
- package/dist/elements/fragments/panel/source.generated.js +4 -0
- package/dist/elements/fragments/panel/source.generated.js.map +1 -0
- package/dist/elements/fragments/pie/source.generated.d.ts +25 -0
- package/dist/elements/fragments/pie/source.generated.d.ts.map +1 -0
- package/dist/elements/fragments/pie/source.generated.js +4 -0
- package/dist/elements/fragments/pie/source.generated.js.map +1 -0
- package/dist/elements/fragments/progress/source.generated.d.ts +25 -0
- package/dist/elements/fragments/progress/source.generated.d.ts.map +1 -0
- package/dist/elements/fragments/progress/source.generated.js +4 -0
- package/dist/elements/fragments/progress/source.generated.js.map +1 -0
- package/dist/elements/fragments/radio/source.generated.d.ts +30 -0
- package/dist/elements/fragments/radio/source.generated.d.ts.map +1 -0
- package/dist/elements/fragments/radio/source.generated.js +4 -0
- package/dist/elements/fragments/radio/source.generated.js.map +1 -0
- package/dist/elements/fragments/section/source.generated.d.ts +22 -0
- package/dist/elements/fragments/section/source.generated.d.ts.map +1 -0
- package/dist/elements/fragments/section/source.generated.js +4 -0
- package/dist/elements/fragments/section/source.generated.js.map +1 -0
- package/dist/elements/fragments/segmented/source.generated.d.ts +30 -0
- package/dist/elements/fragments/segmented/source.generated.d.ts.map +1 -0
- package/dist/elements/fragments/segmented/source.generated.js +4 -0
- package/dist/elements/fragments/segmented/source.generated.js.map +1 -0
- package/dist/elements/fragments/select/source.generated.d.ts +22 -0
- package/dist/elements/fragments/select/source.generated.d.ts.map +1 -0
- package/dist/elements/fragments/select/source.generated.js +4 -0
- package/dist/elements/fragments/select/source.generated.js.map +1 -0
- package/dist/elements/fragments/selector-escape.d.ts +8 -0
- package/dist/elements/fragments/selector-escape.d.ts.map +1 -0
- package/dist/elements/fragments/selector-escape.js +14 -0
- package/dist/elements/fragments/selector-escape.js.map +1 -0
- package/dist/elements/fragments/separator/source.generated.d.ts +22 -0
- package/dist/elements/fragments/separator/source.generated.d.ts.map +1 -0
- package/dist/elements/fragments/separator/source.generated.js +4 -0
- package/dist/elements/fragments/separator/source.generated.js.map +1 -0
- package/dist/elements/fragments/skeleton/source.generated.d.ts +25 -0
- package/dist/elements/fragments/skeleton/source.generated.d.ts.map +1 -0
- package/dist/elements/fragments/skeleton/source.generated.js +4 -0
- package/dist/elements/fragments/skeleton/source.generated.js.map +1 -0
- package/dist/elements/fragments/slider/source.generated.d.ts +30 -0
- package/dist/elements/fragments/slider/source.generated.d.ts.map +1 -0
- package/dist/elements/fragments/slider/source.generated.js +4 -0
- package/dist/elements/fragments/slider/source.generated.js.map +1 -0
- package/dist/elements/fragments/sparkline/source.generated.d.ts +25 -0
- package/dist/elements/fragments/sparkline/source.generated.d.ts.map +1 -0
- package/dist/elements/fragments/sparkline/source.generated.js +4 -0
- package/dist/elements/fragments/sparkline/source.generated.js.map +1 -0
- package/dist/elements/fragments/spinner/source.generated.d.ts +25 -0
- package/dist/elements/fragments/spinner/source.generated.d.ts.map +1 -0
- package/dist/elements/fragments/spinner/source.generated.js +4 -0
- package/dist/elements/fragments/spinner/source.generated.js.map +1 -0
- package/dist/elements/fragments/splitter/source.generated.d.ts +30 -0
- package/dist/elements/fragments/splitter/source.generated.d.ts.map +1 -0
- package/dist/elements/fragments/splitter/source.generated.js +4 -0
- package/dist/elements/fragments/splitter/source.generated.js.map +1 -0
- package/dist/elements/fragments/stack/source.generated.d.ts +25 -0
- package/dist/elements/fragments/stack/source.generated.d.ts.map +1 -0
- package/dist/elements/fragments/stack/source.generated.js +4 -0
- package/dist/elements/fragments/stack/source.generated.js.map +1 -0
- package/dist/elements/fragments/stat/source.generated.d.ts +25 -0
- package/dist/elements/fragments/stat/source.generated.d.ts.map +1 -0
- package/dist/elements/fragments/stat/source.generated.js +4 -0
- package/dist/elements/fragments/stat/source.generated.js.map +1 -0
- package/dist/elements/fragments/statusbar/source.generated.d.ts +25 -0
- package/dist/elements/fragments/statusbar/source.generated.d.ts.map +1 -0
- package/dist/elements/fragments/statusbar/source.generated.js +4 -0
- package/dist/elements/fragments/statusbar/source.generated.js.map +1 -0
- package/dist/elements/fragments/swatch/source.generated.d.ts +30 -0
- package/dist/elements/fragments/swatch/source.generated.d.ts.map +1 -0
- package/dist/elements/fragments/swatch/source.generated.js +4 -0
- package/dist/elements/fragments/swatch/source.generated.js.map +1 -0
- package/dist/elements/fragments/switch/source.generated.d.ts +27 -0
- package/dist/elements/fragments/switch/source.generated.d.ts.map +1 -0
- package/dist/elements/fragments/switch/source.generated.js +4 -0
- package/dist/elements/fragments/switch/source.generated.js.map +1 -0
- package/dist/elements/fragments/tabs/source.generated.d.ts +27 -0
- package/dist/elements/fragments/tabs/source.generated.d.ts.map +1 -0
- package/dist/elements/fragments/tabs/source.generated.js +4 -0
- package/dist/elements/fragments/tabs/source.generated.js.map +1 -0
- package/dist/elements/fragments/text/source.generated.d.ts +25 -0
- package/dist/elements/fragments/text/source.generated.d.ts.map +1 -0
- package/dist/elements/fragments/text/source.generated.js +4 -0
- package/dist/elements/fragments/text/source.generated.js.map +1 -0
- package/dist/elements/fragments/textarea/source.generated.d.ts +30 -0
- package/dist/elements/fragments/textarea/source.generated.d.ts.map +1 -0
- package/dist/elements/fragments/textarea/source.generated.js +4 -0
- package/dist/elements/fragments/textarea/source.generated.js.map +1 -0
- package/dist/elements/fragments/toast/source.generated.d.ts +30 -0
- package/dist/elements/fragments/toast/source.generated.d.ts.map +1 -0
- package/dist/elements/fragments/toast/source.generated.js +4 -0
- package/dist/elements/fragments/toast/source.generated.js.map +1 -0
- package/dist/elements/fragments/toc/source.generated.d.ts +25 -0
- package/dist/elements/fragments/toc/source.generated.d.ts.map +1 -0
- package/dist/elements/fragments/toc/source.generated.js +4 -0
- package/dist/elements/fragments/toc/source.generated.js.map +1 -0
- package/dist/elements/fragments/toolbar/source.generated.d.ts +25 -0
- package/dist/elements/fragments/toolbar/source.generated.d.ts.map +1 -0
- package/dist/elements/fragments/toolbar/source.generated.js +4 -0
- package/dist/elements/fragments/toolbar/source.generated.js.map +1 -0
- package/dist/elements/fragments/tooltip/source.generated.d.ts +25 -0
- package/dist/elements/fragments/tooltip/source.generated.d.ts.map +1 -0
- package/dist/elements/fragments/tooltip/source.generated.js +4 -0
- package/dist/elements/fragments/tooltip/source.generated.js.map +1 -0
- package/dist/elements/fragments/tree/source.generated.d.ts +30 -0
- package/dist/elements/fragments/tree/source.generated.d.ts.map +1 -0
- package/dist/elements/fragments/tree/source.generated.js +4 -0
- package/dist/elements/fragments/tree/source.generated.js.map +1 -0
- package/dist/elements/grid.d.ts +24 -0
- package/dist/elements/grid.d.ts.map +1 -0
- package/dist/elements/grid.js +94 -0
- package/dist/elements/grid.js.map +1 -0
- package/dist/elements/heading.d.ts +21 -0
- package/dist/elements/heading.d.ts.map +1 -0
- package/dist/elements/heading.js +62 -0
- package/dist/elements/heading.js.map +1 -0
- package/dist/elements/heatmap.d.ts +54 -0
- package/dist/elements/heatmap.d.ts.map +1 -0
- package/dist/elements/heatmap.js +292 -0
- package/dist/elements/heatmap.js.map +1 -0
- package/dist/elements/hero.d.ts +16 -0
- package/dist/elements/hero.d.ts.map +1 -0
- package/dist/elements/hero.js +24 -0
- package/dist/elements/hero.js.map +1 -0
- package/dist/elements/host-controls.d.ts +32 -0
- package/dist/elements/host-controls.d.ts.map +1 -0
- package/dist/elements/host-controls.js +53 -0
- package/dist/elements/host-controls.js.map +1 -0
- package/dist/elements/icon.d.ts +33 -0
- package/dist/elements/icon.d.ts.map +1 -0
- package/dist/elements/icon.js +110 -0
- package/dist/elements/icon.js.map +1 -0
- package/dist/elements/image.d.ts +37 -0
- package/dist/elements/image.d.ts.map +1 -0
- package/dist/elements/image.js +190 -0
- package/dist/elements/image.js.map +1 -0
- package/dist/elements/index.d.ts +134 -0
- package/dist/elements/index.d.ts.map +1 -0
- package/dist/elements/index.js +127 -0
- package/dist/elements/index.js.map +1 -0
- package/dist/elements/kbd.d.ts +16 -0
- package/dist/elements/kbd.d.ts.map +1 -0
- package/dist/elements/kbd.js +47 -0
- package/dist/elements/kbd.js.map +1 -0
- package/dist/elements/link.d.ts +27 -0
- package/dist/elements/link.d.ts.map +1 -0
- package/dist/elements/link.js +81 -0
- package/dist/elements/link.js.map +1 -0
- package/dist/elements/live-register.d.ts +11 -0
- package/dist/elements/live-register.d.ts.map +1 -0
- package/dist/elements/live-register.js +25 -0
- package/dist/elements/live-register.js.map +1 -0
- package/dist/elements/menu.d.ts +38 -0
- package/dist/elements/menu.d.ts.map +1 -0
- package/dist/elements/menu.js +210 -0
- package/dist/elements/menu.js.map +1 -0
- package/dist/elements/native-input-attrs.d.ts +8 -0
- package/dist/elements/native-input-attrs.d.ts.map +1 -0
- package/dist/elements/native-input-attrs.js +23 -0
- package/dist/elements/native-input-attrs.js.map +1 -0
- package/dist/elements/number-input.d.ts +49 -0
- package/dist/elements/number-input.d.ts.map +1 -0
- package/dist/elements/number-input.js +224 -0
- package/dist/elements/number-input.js.map +1 -0
- package/dist/elements/overlay-position.d.ts +87 -0
- package/dist/elements/overlay-position.d.ts.map +1 -0
- package/dist/elements/overlay-position.js +124 -0
- package/dist/elements/overlay-position.js.map +1 -0
- package/dist/elements/pagination.d.ts +38 -0
- package/dist/elements/pagination.d.ts.map +1 -0
- package/dist/elements/pagination.js +124 -0
- package/dist/elements/pagination.js.map +1 -0
- package/dist/elements/panel.d.ts +36 -0
- package/dist/elements/panel.d.ts.map +1 -0
- package/dist/elements/panel.js +109 -0
- package/dist/elements/panel.js.map +1 -0
- package/dist/elements/parallax.d.ts +32 -0
- package/dist/elements/parallax.d.ts.map +1 -0
- package/dist/elements/parallax.js +167 -0
- package/dist/elements/parallax.js.map +1 -0
- package/dist/elements/pie.d.ts +26 -0
- package/dist/elements/pie.d.ts.map +1 -0
- package/dist/elements/pie.js +146 -0
- package/dist/elements/pie.js.map +1 -0
- package/dist/elements/progress.d.ts +62 -0
- package/dist/elements/progress.d.ts.map +1 -0
- package/dist/elements/progress.js +187 -0
- package/dist/elements/progress.js.map +1 -0
- package/dist/elements/radio.d.ts +67 -0
- package/dist/elements/radio.d.ts.map +1 -0
- package/dist/elements/radio.js +268 -0
- package/dist/elements/radio.js.map +1 -0
- package/dist/elements/section.d.ts +33 -0
- package/dist/elements/section.d.ts.map +1 -0
- package/dist/elements/section.js +83 -0
- package/dist/elements/section.js.map +1 -0
- package/dist/elements/segmented.d.ts +61 -0
- package/dist/elements/segmented.d.ts.map +1 -0
- package/dist/elements/segmented.js +182 -0
- package/dist/elements/segmented.js.map +1 -0
- package/dist/elements/select.d.ts +35 -0
- package/dist/elements/select.d.ts.map +1 -0
- package/dist/elements/select.js +144 -0
- package/dist/elements/select.js.map +1 -0
- package/dist/elements/separator.d.ts +25 -0
- package/dist/elements/separator.d.ts.map +1 -0
- package/dist/elements/separator.js +62 -0
- package/dist/elements/separator.js.map +1 -0
- package/dist/elements/skeleton.d.ts +18 -0
- package/dist/elements/skeleton.d.ts.map +1 -0
- package/dist/elements/skeleton.js +44 -0
- package/dist/elements/skeleton.js.map +1 -0
- package/dist/elements/slider.d.ts +65 -0
- package/dist/elements/slider.d.ts.map +1 -0
- package/dist/elements/slider.js +295 -0
- package/dist/elements/slider.js.map +1 -0
- package/dist/elements/sparkline.d.ts +29 -0
- package/dist/elements/sparkline.d.ts.map +1 -0
- package/dist/elements/sparkline.js +178 -0
- package/dist/elements/sparkline.js.map +1 -0
- package/dist/elements/spinner.d.ts +17 -0
- package/dist/elements/spinner.d.ts.map +1 -0
- package/dist/elements/spinner.js +51 -0
- package/dist/elements/spinner.js.map +1 -0
- package/dist/elements/splitter.d.ts +50 -0
- package/dist/elements/splitter.d.ts.map +1 -0
- package/dist/elements/splitter.js +240 -0
- package/dist/elements/splitter.js.map +1 -0
- package/dist/elements/stack.d.ts +22 -0
- package/dist/elements/stack.d.ts.map +1 -0
- package/dist/elements/stack.js +73 -0
- package/dist/elements/stack.js.map +1 -0
- package/dist/elements/stat.d.ts +39 -0
- package/dist/elements/stat.d.ts.map +1 -0
- package/dist/elements/stat.js +99 -0
- package/dist/elements/stat.js.map +1 -0
- package/dist/elements/statusbar.d.ts +61 -0
- package/dist/elements/statusbar.d.ts.map +1 -0
- package/dist/elements/statusbar.js +309 -0
- package/dist/elements/statusbar.js.map +1 -0
- package/dist/elements/swatch.d.ts +40 -0
- package/dist/elements/swatch.d.ts.map +1 -0
- package/dist/elements/swatch.js +144 -0
- package/dist/elements/swatch.js.map +1 -0
- package/dist/elements/switch.d.ts +40 -0
- package/dist/elements/switch.d.ts.map +1 -0
- package/dist/elements/switch.js +141 -0
- package/dist/elements/switch.js.map +1 -0
- package/dist/elements/table.d.ts +35 -0
- package/dist/elements/table.d.ts.map +1 -0
- package/dist/elements/table.js +176 -0
- package/dist/elements/table.js.map +1 -0
- package/dist/elements/tabs.d.ts +50 -0
- package/dist/elements/tabs.d.ts.map +1 -0
- package/dist/elements/tabs.js +194 -0
- package/dist/elements/tabs.js.map +1 -0
- package/dist/elements/text.d.ts +32 -0
- package/dist/elements/text.d.ts.map +1 -0
- package/dist/elements/text.js +81 -0
- package/dist/elements/text.js.map +1 -0
- package/dist/elements/textarea.d.ts +46 -0
- package/dist/elements/textarea.d.ts.map +1 -0
- package/dist/elements/textarea.js +194 -0
- package/dist/elements/textarea.js.map +1 -0
- package/dist/elements/toast.d.ts +78 -0
- package/dist/elements/toast.d.ts.map +1 -0
- package/dist/elements/toast.js +207 -0
- package/dist/elements/toast.js.map +1 -0
- package/dist/elements/toc.d.ts +32 -0
- package/dist/elements/toc.d.ts.map +1 -0
- package/dist/elements/toc.js +122 -0
- package/dist/elements/toc.js.map +1 -0
- package/dist/elements/toolbar.d.ts +27 -0
- package/dist/elements/toolbar.d.ts.map +1 -0
- package/dist/elements/toolbar.js +79 -0
- package/dist/elements/toolbar.js.map +1 -0
- package/dist/elements/tooltip.d.ts +63 -0
- package/dist/elements/tooltip.d.ts.map +1 -0
- package/dist/elements/tooltip.js +227 -0
- package/dist/elements/tooltip.js.map +1 -0
- package/dist/elements/tree.d.ts +33 -0
- package/dist/elements/tree.d.ts.map +1 -0
- package/dist/elements/tree.js +180 -0
- package/dist/elements/tree.js.map +1 -0
- package/dist/emit/css.d.ts +3 -0
- package/dist/emit/css.d.ts.map +1 -0
- package/dist/emit/css.js +13 -0
- package/dist/emit/css.js.map +1 -0
- package/dist/emit/index.d.ts +10 -0
- package/dist/emit/index.d.ts.map +1 -0
- package/dist/emit/index.js +25 -0
- package/dist/emit/index.js.map +1 -0
- package/dist/emit/json.d.ts +3 -0
- package/dist/emit/json.d.ts.map +1 -0
- package/dist/emit/json.js +8 -0
- package/dist/emit/json.js.map +1 -0
- package/dist/emit/monaco.d.ts +9 -0
- package/dist/emit/monaco.d.ts.map +1 -0
- package/dist/emit/monaco.js +80 -0
- package/dist/emit/monaco.js.map +1 -0
- package/dist/emit/prism.d.ts +9 -0
- package/dist/emit/prism.d.ts.map +1 -0
- package/dist/emit/prism.js +37 -0
- package/dist/emit/prism.js.map +1 -0
- package/dist/gauntlet.d.ts +27 -0
- package/dist/gauntlet.d.ts.map +1 -0
- package/dist/gauntlet.js +199 -0
- package/dist/gauntlet.js.map +1 -0
- package/dist/graph.d.ts +21 -0
- package/dist/graph.d.ts.map +1 -0
- package/dist/graph.js +66 -0
- package/dist/graph.js.map +1 -0
- package/dist/host/algorithms-bundle.generated.d.ts +5 -0
- package/dist/host/algorithms-bundle.generated.d.ts.map +1 -0
- package/dist/host/algorithms-bundle.generated.js +3 -0
- package/dist/host/algorithms-bundle.generated.js.map +1 -0
- package/dist/host/authoring-prelude-entry.d.ts +2 -0
- package/dist/host/authoring-prelude-entry.d.ts.map +1 -0
- package/dist/host/authoring-prelude-entry.js +17 -0
- package/dist/host/authoring-prelude-entry.js.map +1 -0
- package/dist/host/authoring-prelude.generated.d.ts +2 -0
- package/dist/host/authoring-prelude.generated.d.ts.map +1 -0
- package/dist/host/authoring-prelude.generated.js +3 -0
- package/dist/host/authoring-prelude.generated.js.map +1 -0
- package/dist/host/bundle.d.ts +26 -0
- package/dist/host/bundle.d.ts.map +1 -0
- package/dist/host/bundle.js +38 -0
- package/dist/host/bundle.js.map +1 -0
- package/dist/host/index.d.ts +29 -0
- package/dist/host/index.d.ts.map +1 -0
- package/dist/host/index.js +148 -0
- package/dist/host/index.js.map +1 -0
- package/dist/host/registry.d.ts +24 -0
- package/dist/host/registry.d.ts.map +1 -0
- package/dist/host/registry.js +83 -0
- package/dist/host/registry.js.map +1 -0
- package/dist/icon-builder.d.ts +155 -0
- package/dist/icon-builder.d.ts.map +1 -0
- package/dist/icon-builder.js +486 -0
- package/dist/icon-builder.js.map +1 -0
- package/dist/icons.d.ts +45 -0
- package/dist/icons.d.ts.map +1 -0
- package/dist/icons.js +100 -0
- package/dist/icons.js.map +1 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +60 -0
- package/dist/index.js.map +1 -0
- package/dist/manifest/accordion.manifest.d.ts +3 -0
- package/dist/manifest/accordion.manifest.d.ts.map +1 -0
- package/dist/manifest/accordion.manifest.js +190 -0
- package/dist/manifest/accordion.manifest.js.map +1 -0
- package/dist/manifest/alert.manifest.d.ts +3 -0
- package/dist/manifest/alert.manifest.d.ts.map +1 -0
- package/dist/manifest/alert.manifest.js +251 -0
- package/dist/manifest/alert.manifest.js.map +1 -0
- package/dist/manifest/app-shell.manifest.d.ts +3 -0
- package/dist/manifest/app-shell.manifest.d.ts.map +1 -0
- package/dist/manifest/app-shell.manifest.js +287 -0
- package/dist/manifest/app-shell.manifest.js.map +1 -0
- package/dist/manifest/avatar-group.manifest.d.ts +3 -0
- package/dist/manifest/avatar-group.manifest.d.ts.map +1 -0
- package/dist/manifest/avatar-group.manifest.js +180 -0
- package/dist/manifest/avatar-group.manifest.js.map +1 -0
- package/dist/manifest/avatar.manifest.d.ts +3 -0
- package/dist/manifest/avatar.manifest.d.ts.map +1 -0
- package/dist/manifest/avatar.manifest.js +249 -0
- package/dist/manifest/avatar.manifest.js.map +1 -0
- package/dist/manifest/badge.manifest.d.ts +3 -0
- package/dist/manifest/badge.manifest.d.ts.map +1 -0
- package/dist/manifest/badge.manifest.js +284 -0
- package/dist/manifest/badge.manifest.js.map +1 -0
- package/dist/manifest/bar.manifest.d.ts +3 -0
- package/dist/manifest/bar.manifest.d.ts.map +1 -0
- package/dist/manifest/bar.manifest.js +342 -0
- package/dist/manifest/bar.manifest.js.map +1 -0
- package/dist/manifest/breadcrumb.manifest.d.ts +3 -0
- package/dist/manifest/breadcrumb.manifest.d.ts.map +1 -0
- package/dist/manifest/breadcrumb.manifest.js +280 -0
- package/dist/manifest/breadcrumb.manifest.js.map +1 -0
- package/dist/manifest/button.manifest.d.ts +3 -0
- package/dist/manifest/button.manifest.d.ts.map +1 -0
- package/dist/manifest/button.manifest.js +377 -0
- package/dist/manifest/button.manifest.js.map +1 -0
- package/dist/manifest/card-link.manifest.d.ts +3 -0
- package/dist/manifest/card-link.manifest.d.ts.map +1 -0
- package/dist/manifest/card-link.manifest.js +133 -0
- package/dist/manifest/card-link.manifest.js.map +1 -0
- package/dist/manifest/card.manifest.d.ts +3 -0
- package/dist/manifest/card.manifest.d.ts.map +1 -0
- package/dist/manifest/card.manifest.js +280 -0
- package/dist/manifest/card.manifest.js.map +1 -0
- package/dist/manifest/carousel.manifest.d.ts +3 -0
- package/dist/manifest/carousel.manifest.d.ts.map +1 -0
- package/dist/manifest/carousel.manifest.js +170 -0
- package/dist/manifest/carousel.manifest.js.map +1 -0
- package/dist/manifest/checkbox.manifest.d.ts +3 -0
- package/dist/manifest/checkbox.manifest.d.ts.map +1 -0
- package/dist/manifest/checkbox.manifest.js +249 -0
- package/dist/manifest/checkbox.manifest.js.map +1 -0
- package/dist/manifest/cluster.manifest.d.ts +3 -0
- package/dist/manifest/cluster.manifest.d.ts.map +1 -0
- package/dist/manifest/cluster.manifest.js +132 -0
- package/dist/manifest/cluster.manifest.js.map +1 -0
- package/dist/manifest/code.manifest.d.ts +3 -0
- package/dist/manifest/code.manifest.d.ts.map +1 -0
- package/dist/manifest/code.manifest.js +269 -0
- package/dist/manifest/code.manifest.js.map +1 -0
- package/dist/manifest/color-picker.manifest.d.ts +3 -0
- package/dist/manifest/color-picker.manifest.d.ts.map +1 -0
- package/dist/manifest/color-picker.manifest.js +379 -0
- package/dist/manifest/color-picker.manifest.js.map +1 -0
- package/dist/manifest/dialog.manifest.d.ts +3 -0
- package/dist/manifest/dialog.manifest.d.ts.map +1 -0
- package/dist/manifest/dialog.manifest.js +267 -0
- package/dist/manifest/dialog.manifest.js.map +1 -0
- package/dist/manifest/dock-zone.manifest.d.ts +3 -0
- package/dist/manifest/dock-zone.manifest.d.ts.map +1 -0
- package/dist/manifest/dock-zone.manifest.js +277 -0
- package/dist/manifest/dock-zone.manifest.js.map +1 -0
- package/dist/manifest/dock.manifest.d.ts +3 -0
- package/dist/manifest/dock.manifest.d.ts.map +1 -0
- package/dist/manifest/dock.manifest.js +239 -0
- package/dist/manifest/dock.manifest.js.map +1 -0
- package/dist/manifest/eyebrow.manifest.d.ts +3 -0
- package/dist/manifest/eyebrow.manifest.d.ts.map +1 -0
- package/dist/manifest/eyebrow.manifest.js +105 -0
- package/dist/manifest/eyebrow.manifest.js.map +1 -0
- package/dist/manifest/field.manifest.d.ts +3 -0
- package/dist/manifest/field.manifest.d.ts.map +1 -0
- package/dist/manifest/field.manifest.js +380 -0
- package/dist/manifest/field.manifest.js.map +1 -0
- package/dist/manifest/form-group.manifest.d.ts +3 -0
- package/dist/manifest/form-group.manifest.d.ts.map +1 -0
- package/dist/manifest/form-group.manifest.js +218 -0
- package/dist/manifest/form-group.manifest.js.map +1 -0
- package/dist/manifest/grid.manifest.d.ts +3 -0
- package/dist/manifest/grid.manifest.d.ts.map +1 -0
- package/dist/manifest/grid.manifest.js +141 -0
- package/dist/manifest/grid.manifest.js.map +1 -0
- package/dist/manifest/heading.manifest.d.ts +3 -0
- package/dist/manifest/heading.manifest.d.ts.map +1 -0
- package/dist/manifest/heading.manifest.js +166 -0
- package/dist/manifest/heading.manifest.js.map +1 -0
- package/dist/manifest/heatmap.manifest.d.ts +3 -0
- package/dist/manifest/heatmap.manifest.d.ts.map +1 -0
- package/dist/manifest/heatmap.manifest.js +423 -0
- package/dist/manifest/heatmap.manifest.js.map +1 -0
- package/dist/manifest/hero.manifest.d.ts +3 -0
- package/dist/manifest/hero.manifest.d.ts.map +1 -0
- package/dist/manifest/hero.manifest.js +142 -0
- package/dist/manifest/hero.manifest.js.map +1 -0
- package/dist/manifest/icon.manifest.d.ts +3 -0
- package/dist/manifest/icon.manifest.d.ts.map +1 -0
- package/dist/manifest/icon.manifest.js +177 -0
- package/dist/manifest/icon.manifest.js.map +1 -0
- package/dist/manifest/image.manifest.d.ts +3 -0
- package/dist/manifest/image.manifest.d.ts.map +1 -0
- package/dist/manifest/image.manifest.js +186 -0
- package/dist/manifest/image.manifest.js.map +1 -0
- package/dist/manifest/index.d.ts +4 -0
- package/dist/manifest/index.d.ts.map +1 -0
- package/dist/manifest/index.js +4 -0
- package/dist/manifest/index.js.map +1 -0
- package/dist/manifest/kbd.manifest.d.ts +3 -0
- package/dist/manifest/kbd.manifest.d.ts.map +1 -0
- package/dist/manifest/kbd.manifest.js +119 -0
- package/dist/manifest/kbd.manifest.js.map +1 -0
- package/dist/manifest/link.manifest.d.ts +3 -0
- package/dist/manifest/link.manifest.d.ts.map +1 -0
- package/dist/manifest/link.manifest.js +183 -0
- package/dist/manifest/link.manifest.js.map +1 -0
- package/dist/manifest/lint.d.ts +40 -0
- package/dist/manifest/lint.d.ts.map +1 -0
- package/dist/manifest/lint.js +90 -0
- package/dist/manifest/lint.js.map +1 -0
- package/dist/manifest/menu.manifest.d.ts +3 -0
- package/dist/manifest/menu.manifest.d.ts.map +1 -0
- package/dist/manifest/menu.manifest.js +245 -0
- package/dist/manifest/menu.manifest.js.map +1 -0
- package/dist/manifest/number-input.manifest.d.ts +3 -0
- package/dist/manifest/number-input.manifest.d.ts.map +1 -0
- package/dist/manifest/number-input.manifest.js +193 -0
- package/dist/manifest/number-input.manifest.js.map +1 -0
- package/dist/manifest/pagination.manifest.d.ts +3 -0
- package/dist/manifest/pagination.manifest.d.ts.map +1 -0
- package/dist/manifest/pagination.manifest.js +213 -0
- package/dist/manifest/pagination.manifest.js.map +1 -0
- package/dist/manifest/panel.manifest.d.ts +3 -0
- package/dist/manifest/panel.manifest.d.ts.map +1 -0
- package/dist/manifest/panel.manifest.js +246 -0
- package/dist/manifest/panel.manifest.js.map +1 -0
- package/dist/manifest/parallax.manifest.d.ts +3 -0
- package/dist/manifest/parallax.manifest.d.ts.map +1 -0
- package/dist/manifest/parallax.manifest.js +124 -0
- package/dist/manifest/parallax.manifest.js.map +1 -0
- package/dist/manifest/pie.manifest.d.ts +3 -0
- package/dist/manifest/pie.manifest.d.ts.map +1 -0
- package/dist/manifest/pie.manifest.js +284 -0
- package/dist/manifest/pie.manifest.js.map +1 -0
- package/dist/manifest/progress.manifest.d.ts +3 -0
- package/dist/manifest/progress.manifest.d.ts.map +1 -0
- package/dist/manifest/progress.manifest.js +288 -0
- package/dist/manifest/progress.manifest.js.map +1 -0
- package/dist/manifest/radio.manifest.d.ts +3 -0
- package/dist/manifest/radio.manifest.d.ts.map +1 -0
- package/dist/manifest/radio.manifest.js +296 -0
- package/dist/manifest/radio.manifest.js.map +1 -0
- package/dist/manifest/registry.d.ts +20 -0
- package/dist/manifest/registry.d.ts.map +1 -0
- package/dist/manifest/registry.js +146 -0
- package/dist/manifest/registry.js.map +1 -0
- package/dist/manifest/section.manifest.d.ts +3 -0
- package/dist/manifest/section.manifest.d.ts.map +1 -0
- package/dist/manifest/section.manifest.js +173 -0
- package/dist/manifest/section.manifest.js.map +1 -0
- package/dist/manifest/segmented.manifest.d.ts +3 -0
- package/dist/manifest/segmented.manifest.d.ts.map +1 -0
- package/dist/manifest/segmented.manifest.js +261 -0
- package/dist/manifest/segmented.manifest.js.map +1 -0
- package/dist/manifest/select.manifest.d.ts +3 -0
- package/dist/manifest/select.manifest.d.ts.map +1 -0
- package/dist/manifest/select.manifest.js +262 -0
- package/dist/manifest/select.manifest.js.map +1 -0
- package/dist/manifest/separator.manifest.d.ts +3 -0
- package/dist/manifest/separator.manifest.d.ts.map +1 -0
- package/dist/manifest/separator.manifest.js +164 -0
- package/dist/manifest/separator.manifest.js.map +1 -0
- package/dist/manifest/skeleton.manifest.d.ts +3 -0
- package/dist/manifest/skeleton.manifest.d.ts.map +1 -0
- package/dist/manifest/skeleton.manifest.js +141 -0
- package/dist/manifest/skeleton.manifest.js.map +1 -0
- package/dist/manifest/slider.manifest.d.ts +3 -0
- package/dist/manifest/slider.manifest.d.ts.map +1 -0
- package/dist/manifest/slider.manifest.js +294 -0
- package/dist/manifest/slider.manifest.js.map +1 -0
- package/dist/manifest/sparkline.manifest.d.ts +3 -0
- package/dist/manifest/sparkline.manifest.d.ts.map +1 -0
- package/dist/manifest/sparkline.manifest.js +227 -0
- package/dist/manifest/sparkline.manifest.js.map +1 -0
- package/dist/manifest/spinner.manifest.d.ts +3 -0
- package/dist/manifest/spinner.manifest.d.ts.map +1 -0
- package/dist/manifest/spinner.manifest.js +137 -0
- package/dist/manifest/spinner.manifest.js.map +1 -0
- package/dist/manifest/splitter.manifest.d.ts +3 -0
- package/dist/manifest/splitter.manifest.d.ts.map +1 -0
- package/dist/manifest/splitter.manifest.js +192 -0
- package/dist/manifest/splitter.manifest.js.map +1 -0
- package/dist/manifest/stack.manifest.d.ts +3 -0
- package/dist/manifest/stack.manifest.d.ts.map +1 -0
- package/dist/manifest/stack.manifest.js +125 -0
- package/dist/manifest/stack.manifest.js.map +1 -0
- package/dist/manifest/stat.manifest.d.ts +3 -0
- package/dist/manifest/stat.manifest.d.ts.map +1 -0
- package/dist/manifest/stat.manifest.js +197 -0
- package/dist/manifest/stat.manifest.js.map +1 -0
- package/dist/manifest/statusbar.manifest.d.ts +3 -0
- package/dist/manifest/statusbar.manifest.d.ts.map +1 -0
- package/dist/manifest/statusbar.manifest.js +232 -0
- package/dist/manifest/statusbar.manifest.js.map +1 -0
- package/dist/manifest/swatch.manifest.d.ts +3 -0
- package/dist/manifest/swatch.manifest.d.ts.map +1 -0
- package/dist/manifest/swatch.manifest.js +215 -0
- package/dist/manifest/swatch.manifest.js.map +1 -0
- package/dist/manifest/switch.manifest.d.ts +3 -0
- package/dist/manifest/switch.manifest.d.ts.map +1 -0
- package/dist/manifest/switch.manifest.js +323 -0
- package/dist/manifest/switch.manifest.js.map +1 -0
- package/dist/manifest/table.manifest.d.ts +3 -0
- package/dist/manifest/table.manifest.d.ts.map +1 -0
- package/dist/manifest/table.manifest.js +303 -0
- package/dist/manifest/table.manifest.js.map +1 -0
- package/dist/manifest/tabs.manifest.d.ts +3 -0
- package/dist/manifest/tabs.manifest.d.ts.map +1 -0
- package/dist/manifest/tabs.manifest.js +343 -0
- package/dist/manifest/tabs.manifest.js.map +1 -0
- package/dist/manifest/text.manifest.d.ts +3 -0
- package/dist/manifest/text.manifest.d.ts.map +1 -0
- package/dist/manifest/text.manifest.js +189 -0
- package/dist/manifest/text.manifest.js.map +1 -0
- package/dist/manifest/textarea.manifest.d.ts +3 -0
- package/dist/manifest/textarea.manifest.d.ts.map +1 -0
- package/dist/manifest/textarea.manifest.js +233 -0
- package/dist/manifest/textarea.manifest.js.map +1 -0
- package/dist/manifest/toast.manifest.d.ts +3 -0
- package/dist/manifest/toast.manifest.d.ts.map +1 -0
- package/dist/manifest/toast.manifest.js +299 -0
- package/dist/manifest/toast.manifest.js.map +1 -0
- package/dist/manifest/toc.manifest.d.ts +3 -0
- package/dist/manifest/toc.manifest.d.ts.map +1 -0
- package/dist/manifest/toc.manifest.js +139 -0
- package/dist/manifest/toc.manifest.js.map +1 -0
- package/dist/manifest/toolbar.manifest.d.ts +3 -0
- package/dist/manifest/toolbar.manifest.d.ts.map +1 -0
- package/dist/manifest/toolbar.manifest.js +243 -0
- package/dist/manifest/toolbar.manifest.js.map +1 -0
- package/dist/manifest/tooltip.manifest.d.ts +3 -0
- package/dist/manifest/tooltip.manifest.d.ts.map +1 -0
- package/dist/manifest/tooltip.manifest.js +248 -0
- package/dist/manifest/tooltip.manifest.js.map +1 -0
- package/dist/manifest/tree.manifest.d.ts +3 -0
- package/dist/manifest/tree.manifest.d.ts.map +1 -0
- package/dist/manifest/tree.manifest.js +231 -0
- package/dist/manifest/tree.manifest.js.map +1 -0
- package/dist/manifest/types.d.ts +68 -0
- package/dist/manifest/types.d.ts.map +1 -0
- package/dist/manifest/types.js +2 -0
- package/dist/manifest/types.js.map +1 -0
- package/dist/markup/accordion.d.ts +20 -0
- package/dist/markup/accordion.d.ts.map +1 -0
- package/dist/markup/accordion.js +3 -0
- package/dist/markup/accordion.js.map +1 -0
- package/dist/markup/alert.d.ts +9 -0
- package/dist/markup/alert.d.ts.map +1 -0
- package/dist/markup/alert.js +3 -0
- package/dist/markup/alert.js.map +1 -0
- package/dist/markup/app-shell.d.ts +3 -0
- package/dist/markup/app-shell.d.ts.map +1 -0
- package/dist/markup/app-shell.js +3 -0
- package/dist/markup/app-shell.js.map +1 -0
- package/dist/markup/avatar-group.d.ts +5 -0
- package/dist/markup/avatar-group.d.ts.map +1 -0
- package/dist/markup/avatar-group.js +3 -0
- package/dist/markup/avatar-group.js.map +1 -0
- package/dist/markup/avatar.d.ts +28 -0
- package/dist/markup/avatar.d.ts.map +1 -0
- package/dist/markup/avatar.js +46 -0
- package/dist/markup/avatar.js.map +1 -0
- package/dist/markup/badge.d.ts +3 -0
- package/dist/markup/badge.d.ts.map +1 -0
- package/dist/markup/badge.js +3 -0
- package/dist/markup/badge.js.map +1 -0
- package/dist/markup/bar.d.ts +13 -0
- package/dist/markup/bar.d.ts.map +1 -0
- package/dist/markup/bar.js +3 -0
- package/dist/markup/bar.js.map +1 -0
- package/dist/markup/breadcrumb.d.ts +33 -0
- package/dist/markup/breadcrumb.d.ts.map +1 -0
- package/dist/markup/breadcrumb.js +53 -0
- package/dist/markup/breadcrumb.js.map +1 -0
- package/dist/markup/button.d.ts +5 -0
- package/dist/markup/button.d.ts.map +1 -0
- package/dist/markup/button.js +3 -0
- package/dist/markup/button.js.map +1 -0
- package/dist/markup/card-link.d.ts +11 -0
- package/dist/markup/card-link.d.ts.map +1 -0
- package/dist/markup/card-link.js +3 -0
- package/dist/markup/card-link.js.map +1 -0
- package/dist/markup/card.d.ts +3 -0
- package/dist/markup/card.d.ts.map +1 -0
- package/dist/markup/card.js +3 -0
- package/dist/markup/card.js.map +1 -0
- package/dist/markup/checkbox.d.ts +24 -0
- package/dist/markup/checkbox.d.ts.map +1 -0
- package/dist/markup/checkbox.js +48 -0
- package/dist/markup/checkbox.js.map +1 -0
- package/dist/markup/cluster.d.ts +3 -0
- package/dist/markup/cluster.d.ts.map +1 -0
- package/dist/markup/cluster.js +3 -0
- package/dist/markup/cluster.js.map +1 -0
- package/dist/markup/code.d.ts +50 -0
- package/dist/markup/code.d.ts.map +1 -0
- package/dist/markup/code.js +112 -0
- package/dist/markup/code.js.map +1 -0
- package/dist/markup/color-picker.d.ts +64 -0
- package/dist/markup/color-picker.d.ts.map +1 -0
- package/dist/markup/color-picker.js +112 -0
- package/dist/markup/color-picker.js.map +1 -0
- package/dist/markup/dialog.d.ts +3 -0
- package/dist/markup/dialog.d.ts.map +1 -0
- package/dist/markup/dialog.js +3 -0
- package/dist/markup/dialog.js.map +1 -0
- package/dist/markup/dock.d.ts +4 -0
- package/dist/markup/dock.d.ts.map +1 -0
- package/dist/markup/dock.js +3 -0
- package/dist/markup/dock.js.map +1 -0
- package/dist/markup/escape.d.ts +11 -0
- package/dist/markup/escape.d.ts.map +1 -0
- package/dist/markup/escape.js +15 -0
- package/dist/markup/escape.js.map +1 -0
- package/dist/markup/eyebrow.d.ts +21 -0
- package/dist/markup/eyebrow.d.ts.map +1 -0
- package/dist/markup/eyebrow.js +26 -0
- package/dist/markup/eyebrow.js.map +1 -0
- package/dist/markup/field.d.ts +36 -0
- package/dist/markup/field.d.ts.map +1 -0
- package/dist/markup/field.js +93 -0
- package/dist/markup/field.js.map +1 -0
- package/dist/markup/form-group.d.ts +3 -0
- package/dist/markup/form-group.d.ts.map +1 -0
- package/dist/markup/form-group.js +3 -0
- package/dist/markup/form-group.js.map +1 -0
- package/dist/markup/grid.d.ts +4 -0
- package/dist/markup/grid.d.ts.map +1 -0
- package/dist/markup/grid.js +3 -0
- package/dist/markup/grid.js.map +1 -0
- package/dist/markup/heading.d.ts +3 -0
- package/dist/markup/heading.d.ts.map +1 -0
- package/dist/markup/heading.js +3 -0
- package/dist/markup/heading.js.map +1 -0
- package/dist/markup/heatmap.d.ts +5 -0
- package/dist/markup/heatmap.d.ts.map +1 -0
- package/dist/markup/heatmap.js +3 -0
- package/dist/markup/heatmap.js.map +1 -0
- package/dist/markup/icon.d.ts +4 -0
- package/dist/markup/icon.d.ts.map +1 -0
- package/dist/markup/icon.js +3 -0
- package/dist/markup/icon.js.map +1 -0
- package/dist/markup/image.d.ts +6 -0
- package/dist/markup/image.d.ts.map +1 -0
- package/dist/markup/image.js +3 -0
- package/dist/markup/image.js.map +1 -0
- package/dist/markup/index.d.ts +98 -0
- package/dist/markup/index.d.ts.map +1 -0
- package/dist/markup/index.js +58 -0
- package/dist/markup/index.js.map +1 -0
- package/dist/markup/kbd.d.ts +6 -0
- package/dist/markup/kbd.d.ts.map +1 -0
- package/dist/markup/kbd.js +3 -0
- package/dist/markup/kbd.js.map +1 -0
- package/dist/markup/link.d.ts +20 -0
- package/dist/markup/link.d.ts.map +1 -0
- package/dist/markup/link.js +32 -0
- package/dist/markup/link.js.map +1 -0
- package/dist/markup/menu.d.ts +22 -0
- package/dist/markup/menu.d.ts.map +1 -0
- package/dist/markup/menu.js +3 -0
- package/dist/markup/menu.js.map +1 -0
- package/dist/markup/number-input.d.ts +16 -0
- package/dist/markup/number-input.d.ts.map +1 -0
- package/dist/markup/number-input.js +22 -0
- package/dist/markup/number-input.js.map +1 -0
- package/dist/markup/pagination.d.ts +36 -0
- package/dist/markup/pagination.d.ts.map +1 -0
- package/dist/markup/pagination.js +102 -0
- package/dist/markup/pagination.js.map +1 -0
- package/dist/markup/panel.d.ts +23 -0
- package/dist/markup/panel.d.ts.map +1 -0
- package/dist/markup/panel.js +54 -0
- package/dist/markup/panel.js.map +1 -0
- package/dist/markup/pie.d.ts +14 -0
- package/dist/markup/pie.d.ts.map +1 -0
- package/dist/markup/pie.js +3 -0
- package/dist/markup/pie.js.map +1 -0
- package/dist/markup/progress.d.ts +3 -0
- package/dist/markup/progress.d.ts.map +1 -0
- package/dist/markup/progress.js +3 -0
- package/dist/markup/progress.js.map +1 -0
- package/dist/markup/radio.d.ts +19 -0
- package/dist/markup/radio.d.ts.map +1 -0
- package/dist/markup/radio.js +31 -0
- package/dist/markup/radio.js.map +1 -0
- package/dist/markup/section.d.ts +16 -0
- package/dist/markup/section.d.ts.map +1 -0
- package/dist/markup/section.js +3 -0
- package/dist/markup/section.js.map +1 -0
- package/dist/markup/segmented.d.ts +24 -0
- package/dist/markup/segmented.d.ts.map +1 -0
- package/dist/markup/segmented.js +59 -0
- package/dist/markup/segmented.js.map +1 -0
- package/dist/markup/select.d.ts +29 -0
- package/dist/markup/select.d.ts.map +1 -0
- package/dist/markup/select.js +61 -0
- package/dist/markup/select.js.map +1 -0
- package/dist/markup/separator.d.ts +6 -0
- package/dist/markup/separator.d.ts.map +1 -0
- package/dist/markup/separator.js +3 -0
- package/dist/markup/separator.js.map +1 -0
- package/dist/markup/skeleton.d.ts +4 -0
- package/dist/markup/skeleton.d.ts.map +1 -0
- package/dist/markup/skeleton.js +3 -0
- package/dist/markup/skeleton.js.map +1 -0
- package/dist/markup/slider.d.ts +3 -0
- package/dist/markup/slider.d.ts.map +1 -0
- package/dist/markup/slider.js +3 -0
- package/dist/markup/slider.js.map +1 -0
- package/dist/markup/sparkline.d.ts +6 -0
- package/dist/markup/sparkline.d.ts.map +1 -0
- package/dist/markup/sparkline.js +3 -0
- package/dist/markup/sparkline.js.map +1 -0
- package/dist/markup/spinner.d.ts +10 -0
- package/dist/markup/spinner.d.ts.map +1 -0
- package/dist/markup/spinner.js +10 -0
- package/dist/markup/spinner.js.map +1 -0
- package/dist/markup/splitter.d.ts +3 -0
- package/dist/markup/splitter.d.ts.map +1 -0
- package/dist/markup/splitter.js +3 -0
- package/dist/markup/splitter.js.map +1 -0
- package/dist/markup/stack.d.ts +3 -0
- package/dist/markup/stack.d.ts.map +1 -0
- package/dist/markup/stack.js +3 -0
- package/dist/markup/stack.js.map +1 -0
- package/dist/markup/stat.d.ts +7 -0
- package/dist/markup/stat.d.ts.map +1 -0
- package/dist/markup/stat.js +3 -0
- package/dist/markup/stat.js.map +1 -0
- package/dist/markup/statusbar.d.ts +3 -0
- package/dist/markup/statusbar.d.ts.map +1 -0
- package/dist/markup/statusbar.js +3 -0
- package/dist/markup/statusbar.js.map +1 -0
- package/dist/markup/swatch.d.ts +4 -0
- package/dist/markup/swatch.d.ts.map +1 -0
- package/dist/markup/swatch.js +3 -0
- package/dist/markup/swatch.js.map +1 -0
- package/dist/markup/switch.d.ts +3 -0
- package/dist/markup/switch.d.ts.map +1 -0
- package/dist/markup/switch.js +3 -0
- package/dist/markup/switch.js.map +1 -0
- package/dist/markup/tabs.d.ts +25 -0
- package/dist/markup/tabs.d.ts.map +1 -0
- package/dist/markup/tabs.js +3 -0
- package/dist/markup/tabs.js.map +1 -0
- package/dist/markup/text.d.ts +17 -0
- package/dist/markup/text.d.ts.map +1 -0
- package/dist/markup/text.js +3 -0
- package/dist/markup/text.js.map +1 -0
- package/dist/markup/textarea.d.ts +4 -0
- package/dist/markup/textarea.d.ts.map +1 -0
- package/dist/markup/textarea.js +3 -0
- package/dist/markup/textarea.js.map +1 -0
- package/dist/markup/toast.d.ts +44 -0
- package/dist/markup/toast.d.ts.map +1 -0
- package/dist/markup/toast.js +76 -0
- package/dist/markup/toast.js.map +1 -0
- package/dist/markup/toc.d.ts +7 -0
- package/dist/markup/toc.d.ts.map +1 -0
- package/dist/markup/toc.js +3 -0
- package/dist/markup/toc.js.map +1 -0
- package/dist/markup/toolbar.d.ts +21 -0
- package/dist/markup/toolbar.d.ts.map +1 -0
- package/dist/markup/toolbar.js +36 -0
- package/dist/markup/toolbar.js.map +1 -0
- package/dist/markup/tooltip.d.ts +4 -0
- package/dist/markup/tooltip.d.ts.map +1 -0
- package/dist/markup/tooltip.js +3 -0
- package/dist/markup/tooltip.js.map +1 -0
- package/dist/markup/tree.d.ts +46 -0
- package/dist/markup/tree.d.ts.map +1 -0
- package/dist/markup/tree.js +81 -0
- package/dist/markup/tree.js.map +1 -0
- package/dist/mcp/resources.d.ts +3 -0
- package/dist/mcp/resources.d.ts.map +1 -0
- package/dist/mcp/resources.js +13 -0
- package/dist/mcp/resources.js.map +1 -0
- package/dist/mcp/server.d.ts +9 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +21 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools.d.ts +4 -0
- package/dist/mcp/tools.d.ts.map +1 -0
- package/dist/mcp/tools.js +162 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/series.d.ts +86 -0
- package/dist/series.d.ts.map +1 -0
- package/dist/series.js +207 -0
- package/dist/series.js.map +1 -0
- package/dist/theme-file.d.ts +53 -0
- package/dist/theme-file.d.ts.map +1 -0
- package/dist/theme-file.js +51 -0
- package/dist/theme-file.js.map +1 -0
- package/dist/timeseries.d.ts +26 -0
- package/dist/timeseries.d.ts.map +1 -0
- package/dist/timeseries.js +23 -0
- package/dist/timeseries.js.map +1 -0
- package/dist/token-meta.d.ts +19 -0
- package/dist/token-meta.d.ts.map +1 -0
- package/dist/token-meta.js +74 -0
- package/dist/token-meta.js.map +1 -0
- package/dist/types.d.ts +152 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/vocab.d.ts +45 -0
- package/dist/vocab.d.ts.map +1 -0
- package/dist/vocab.js +41 -0
- package/dist/vocab.js.map +1 -0
- package/manifest.json +96 -0
- package/package.json +60 -0
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
// generated by scripts/build-mods.mjs: do not edit
|
|
2
|
+
export const ALGORITHM_BUNDLES = { "nxi-nite": { "manifest": { "$schema": "https://xript.dev/schema/mod-manifest/v0.7.json", "xript": "0.7", "name": "nxi-nite", "version": "0.1.0", "title": "Day/Night", "family": "xtyle", "capabilities": ["color-math"], "entry": { "script": "src/mod.js", "format": "script", "exports": { "graph": { "description": "Token lineage nodes for anchors+knobs.", "params": [{ "name": "input", "type": "DeriveInput" }], "returns": { "array": "TokenNode" } }, "traced": { "description": "Per-pass register snapshots for anchors+knobs.", "params": [{ "name": "input", "type": "DeriveInput" }], "returns": { "array": "TraceSnapshot" } }, "manifest": { "description": "produces + categories + knobs.", "returns": "AlgorithmManifest" }, "invariants": { "description": "Evaluate per-algorithm invariants.", "params": [{ "name": "ctx", "type": "map" }], "returns": { "array": "InvariantResult" } } } } }, "source": "(() => {\n var __defProp = Object.defineProperty;\n var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\n var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\n\n // node_modules/culori/src/rgb/parseNumber.js\n var parseNumber = (color, len) => {\n if (typeof color !== \"number\") return;\n if (len === 3) {\n return {\n mode: \"rgb\",\n r: (color >> 8 & 15 | color >> 4 & 240) / 255,\n g: (color >> 4 & 15 | color & 240) / 255,\n b: (color & 15 | color << 4 & 240) / 255\n };\n }\n if (len === 4) {\n return {\n mode: \"rgb\",\n r: (color >> 12 & 15 | color >> 8 & 240) / 255,\n g: (color >> 8 & 15 | color >> 4 & 240) / 255,\n b: (color >> 4 & 15 | color & 240) / 255,\n alpha: (color & 15 | color << 4 & 240) / 255\n };\n }\n if (len === 6) {\n return {\n mode: \"rgb\",\n r: (color >> 16 & 255) / 255,\n g: (color >> 8 & 255) / 255,\n b: (color & 255) / 255\n };\n }\n if (len === 8) {\n return {\n mode: \"rgb\",\n r: (color >> 24 & 255) / 255,\n g: (color >> 16 & 255) / 255,\n b: (color >> 8 & 255) / 255,\n alpha: (color & 255) / 255\n };\n }\n };\n var parseNumber_default = parseNumber;\n\n // node_modules/culori/src/colors/named.js\n var named = {\n aliceblue: 15792383,\n antiquewhite: 16444375,\n aqua: 65535,\n aquamarine: 8388564,\n azure: 15794175,\n beige: 16119260,\n bisque: 16770244,\n black: 0,\n blanchedalmond: 16772045,\n blue: 255,\n blueviolet: 9055202,\n brown: 10824234,\n burlywood: 14596231,\n cadetblue: 6266528,\n chartreuse: 8388352,\n chocolate: 13789470,\n coral: 16744272,\n cornflowerblue: 6591981,\n cornsilk: 16775388,\n crimson: 14423100,\n cyan: 65535,\n darkblue: 139,\n darkcyan: 35723,\n darkgoldenrod: 12092939,\n darkgray: 11119017,\n darkgreen: 25600,\n darkgrey: 11119017,\n darkkhaki: 12433259,\n darkmagenta: 9109643,\n darkolivegreen: 5597999,\n darkorange: 16747520,\n darkorchid: 10040012,\n darkred: 9109504,\n darksalmon: 15308410,\n darkseagreen: 9419919,\n darkslateblue: 4734347,\n darkslategray: 3100495,\n darkslategrey: 3100495,\n darkturquoise: 52945,\n darkviolet: 9699539,\n deeppink: 16716947,\n deepskyblue: 49151,\n dimgray: 6908265,\n dimgrey: 6908265,\n dodgerblue: 2003199,\n firebrick: 11674146,\n floralwhite: 16775920,\n forestgreen: 2263842,\n fuchsia: 16711935,\n gainsboro: 14474460,\n ghostwhite: 16316671,\n gold: 16766720,\n goldenrod: 14329120,\n gray: 8421504,\n green: 32768,\n greenyellow: 11403055,\n grey: 8421504,\n honeydew: 15794160,\n hotpink: 16738740,\n indianred: 13458524,\n indigo: 4915330,\n ivory: 16777200,\n khaki: 15787660,\n lavender: 15132410,\n lavenderblush: 16773365,\n lawngreen: 8190976,\n lemonchiffon: 16775885,\n lightblue: 11393254,\n lightcoral: 15761536,\n lightcyan: 14745599,\n lightgoldenrodyellow: 16448210,\n lightgray: 13882323,\n lightgreen: 9498256,\n lightgrey: 13882323,\n lightpink: 16758465,\n lightsalmon: 16752762,\n lightseagreen: 2142890,\n lightskyblue: 8900346,\n lightslategray: 7833753,\n lightslategrey: 7833753,\n lightsteelblue: 11584734,\n lightyellow: 16777184,\n lime: 65280,\n limegreen: 3329330,\n linen: 16445670,\n magenta: 16711935,\n maroon: 8388608,\n mediumaquamarine: 6737322,\n mediumblue: 205,\n mediumorchid: 12211667,\n mediumpurple: 9662683,\n mediumseagreen: 3978097,\n mediumslateblue: 8087790,\n mediumspringgreen: 64154,\n mediumturquoise: 4772300,\n mediumvioletred: 13047173,\n midnightblue: 1644912,\n mintcream: 16121850,\n mistyrose: 16770273,\n moccasin: 16770229,\n navajowhite: 16768685,\n navy: 128,\n oldlace: 16643558,\n olive: 8421376,\n olivedrab: 7048739,\n orange: 16753920,\n orangered: 16729344,\n orchid: 14315734,\n palegoldenrod: 15657130,\n palegreen: 10025880,\n paleturquoise: 11529966,\n palevioletred: 14381203,\n papayawhip: 16773077,\n peachpuff: 16767673,\n peru: 13468991,\n pink: 16761035,\n plum: 14524637,\n powderblue: 11591910,\n purple: 8388736,\n // Added in CSS Colors Level 4:\n // https://drafts.csswg.org/css-color/#changes-from-3\n rebeccapurple: 6697881,\n red: 16711680,\n rosybrown: 12357519,\n royalblue: 4286945,\n saddlebrown: 9127187,\n salmon: 16416882,\n sandybrown: 16032864,\n seagreen: 3050327,\n seashell: 16774638,\n sienna: 10506797,\n silver: 12632256,\n skyblue: 8900331,\n slateblue: 6970061,\n slategray: 7372944,\n slategrey: 7372944,\n snow: 16775930,\n springgreen: 65407,\n steelblue: 4620980,\n tan: 13808780,\n teal: 32896,\n thistle: 14204888,\n tomato: 16737095,\n turquoise: 4251856,\n violet: 15631086,\n wheat: 16113331,\n white: 16777215,\n whitesmoke: 16119285,\n yellow: 16776960,\n yellowgreen: 10145074\n };\n var named_default = named;\n\n // node_modules/culori/src/rgb/parseNamed.js\n var parseNamed = (color) => {\n return parseNumber_default(named_default[color.toLowerCase()], 6);\n };\n var parseNamed_default = parseNamed;\n\n // node_modules/culori/src/rgb/parseHex.js\n var hex = /^#?([0-9a-f]{8}|[0-9a-f]{6}|[0-9a-f]{4}|[0-9a-f]{3})$/i;\n var parseHex = (color) => {\n let match;\n return (match = color.match(hex)) ? parseNumber_default(parseInt(match[1], 16), match[1].length) : void 0;\n };\n var parseHex_default = parseHex;\n\n // node_modules/culori/src/util/regex.js\n var num = \"([+-]?\\\\d*\\\\.?\\\\d+(?:[eE][+-]?\\\\d+)?)\";\n var num_none = `(?:${num}|none)`;\n var per = `${num}%`;\n var per_none = `(?:${num}%|none)`;\n var num_per = `(?:${num}%|${num})`;\n var num_per_none = `(?:${num}%|${num}|none)`;\n var hue = `(?:${num}(deg|grad|rad|turn)|${num})`;\n var hue_none = `(?:${num}(deg|grad|rad|turn)|${num}|none)`;\n var c = `\\\\s*,\\\\s*`;\n var rx_num_per_none = new RegExp(\"^\" + num_per_none + \"$\");\n\n // node_modules/culori/src/rgb/parseRgbLegacy.js\n var rgb_num_old = new RegExp(\n `^rgba?\\\\(\\\\s*${num}${c}${num}${c}${num}\\\\s*(?:,\\\\s*${num_per}\\\\s*)?\\\\)$`\n );\n var rgb_per_old = new RegExp(\n `^rgba?\\\\(\\\\s*${per}${c}${per}${c}${per}\\\\s*(?:,\\\\s*${num_per}\\\\s*)?\\\\)$`\n );\n var parseRgbLegacy = (color) => {\n let res = { mode: \"rgb\" };\n let match;\n if (match = color.match(rgb_num_old)) {\n if (match[1] !== void 0) {\n res.r = match[1] / 255;\n }\n if (match[2] !== void 0) {\n res.g = match[2] / 255;\n }\n if (match[3] !== void 0) {\n res.b = match[3] / 255;\n }\n } else if (match = color.match(rgb_per_old)) {\n if (match[1] !== void 0) {\n res.r = match[1] / 100;\n }\n if (match[2] !== void 0) {\n res.g = match[2] / 100;\n }\n if (match[3] !== void 0) {\n res.b = match[3] / 100;\n }\n } else {\n return void 0;\n }\n if (match[4] !== void 0) {\n res.alpha = Math.max(0, Math.min(1, match[4] / 100));\n } else if (match[5] !== void 0) {\n res.alpha = Math.max(0, Math.min(1, +match[5]));\n }\n return res;\n };\n var parseRgbLegacy_default = parseRgbLegacy;\n\n // node_modules/culori/src/_prepare.js\n var prepare = (color, mode) => color === void 0 ? void 0 : typeof color !== \"object\" ? parse_default(color) : color.mode !== void 0 ? color : mode ? { ...color, mode } : void 0;\n var prepare_default = prepare;\n\n // node_modules/culori/src/converter.js\n var converter = (target_mode = \"rgb\") => (color) => (color = prepare_default(color, target_mode)) !== void 0 ? (\n // if the color's mode corresponds to our target mode\n color.mode === target_mode ? (\n // then just return the color\n color\n ) : (\n // otherwise check to see if we have a dedicated\n // converter for the target mode\n converters[color.mode][target_mode] ? (\n // and return its result...\n converters[color.mode][target_mode](color)\n ) : (\n // ...otherwise pass through RGB as an intermediary step.\n // if the target mode is RGB...\n target_mode === \"rgb\" ? (\n // just return the RGB\n converters[color.mode].rgb(color)\n ) : (\n // otherwise convert color.mode -> RGB -> target_mode\n converters.rgb[target_mode](converters[color.mode].rgb(color))\n )\n )\n )\n ) : void 0;\n var converter_default = converter;\n\n // node_modules/culori/src/modes.js\n var converters = {};\n var modes = {};\n var parsers = [];\n var colorProfiles = {};\n var identity = (v) => v;\n var useMode = (definition29) => {\n converters[definition29.mode] = {\n ...converters[definition29.mode],\n ...definition29.toMode\n };\n Object.keys(definition29.fromMode || {}).forEach((k4) => {\n if (!converters[k4]) {\n converters[k4] = {};\n }\n converters[k4][definition29.mode] = definition29.fromMode[k4];\n });\n if (!definition29.ranges) {\n definition29.ranges = {};\n }\n if (!definition29.difference) {\n definition29.difference = {};\n }\n definition29.channels.forEach((channel) => {\n if (definition29.ranges[channel] === void 0) {\n definition29.ranges[channel] = [0, 1];\n }\n if (!definition29.interpolate[channel]) {\n throw new Error(`Missing interpolator for: ${channel}`);\n }\n if (typeof definition29.interpolate[channel] === \"function\") {\n definition29.interpolate[channel] = {\n use: definition29.interpolate[channel]\n };\n }\n if (!definition29.interpolate[channel].fixup) {\n definition29.interpolate[channel].fixup = identity;\n }\n });\n modes[definition29.mode] = definition29;\n (definition29.parse || []).forEach((parser) => {\n useParser(parser, definition29.mode);\n });\n return converter_default(definition29.mode);\n };\n var getMode = (mode) => modes[mode];\n var useParser = (parser, mode) => {\n if (typeof parser === \"string\") {\n if (!mode) {\n throw new Error(`'mode' required when 'parser' is a string`);\n }\n colorProfiles[parser] = mode;\n } else if (typeof parser === \"function\") {\n if (parsers.indexOf(parser) < 0) {\n parsers.push(parser);\n }\n }\n };\n\n // node_modules/culori/src/parse.js\n var IdentStartCodePoint = /[^\\x00-\\x7F]|[a-zA-Z_]/;\n var IdentCodePoint = /[^\\x00-\\x7F]|[-\\w]/;\n var Tok = {\n Function: \"function\",\n Ident: \"ident\",\n Number: \"number\",\n Percentage: \"percentage\",\n ParenClose: \")\",\n None: \"none\",\n Hue: \"hue\",\n Alpha: \"alpha\"\n };\n var _i = 0;\n function is_num(chars) {\n let ch = chars[_i];\n let ch1 = chars[_i + 1];\n if (ch === \"-\" || ch === \"+\") {\n return /\\d/.test(ch1) || ch1 === \".\" && /\\d/.test(chars[_i + 2]);\n }\n if (ch === \".\") {\n return /\\d/.test(ch1);\n }\n return /\\d/.test(ch);\n }\n function is_ident(chars) {\n if (_i >= chars.length) {\n return false;\n }\n let ch = chars[_i];\n if (IdentStartCodePoint.test(ch)) {\n return true;\n }\n if (ch === \"-\") {\n if (chars.length - _i < 2) {\n return false;\n }\n let ch1 = chars[_i + 1];\n if (ch1 === \"-\" || IdentStartCodePoint.test(ch1)) {\n return true;\n }\n return false;\n }\n return false;\n }\n var huenits = {\n deg: 1,\n rad: 180 / Math.PI,\n grad: 9 / 10,\n turn: 360\n };\n function num2(chars) {\n let value = \"\";\n if (chars[_i] === \"-\" || chars[_i] === \"+\") {\n value += chars[_i++];\n }\n value += digits(chars);\n if (chars[_i] === \".\" && /\\d/.test(chars[_i + 1])) {\n value += chars[_i++] + digits(chars);\n }\n if (chars[_i] === \"e\" || chars[_i] === \"E\") {\n if ((chars[_i + 1] === \"-\" || chars[_i + 1] === \"+\") && /\\d/.test(chars[_i + 2])) {\n value += chars[_i++] + chars[_i++] + digits(chars);\n } else if (/\\d/.test(chars[_i + 1])) {\n value += chars[_i++] + digits(chars);\n }\n }\n if (is_ident(chars)) {\n let id = ident(chars);\n if (id === \"deg\" || id === \"rad\" || id === \"turn\" || id === \"grad\") {\n return { type: Tok.Hue, value: value * huenits[id] };\n }\n return void 0;\n }\n if (chars[_i] === \"%\") {\n _i++;\n return { type: Tok.Percentage, value: +value };\n }\n return { type: Tok.Number, value: +value };\n }\n function digits(chars) {\n let v = \"\";\n while (/\\d/.test(chars[_i])) {\n v += chars[_i++];\n }\n return v;\n }\n function ident(chars) {\n let v = \"\";\n while (_i < chars.length && IdentCodePoint.test(chars[_i])) {\n v += chars[_i++];\n }\n return v;\n }\n function identlike(chars) {\n let v = ident(chars);\n if (chars[_i] === \"(\") {\n _i++;\n return { type: Tok.Function, value: v };\n }\n if (v === \"none\") {\n return { type: Tok.None, value: void 0 };\n }\n return { type: Tok.Ident, value: v };\n }\n function tokenize(str = \"\") {\n let chars = str.trim();\n let tokens = [];\n let ch;\n _i = 0;\n while (_i < chars.length) {\n ch = chars[_i++];\n if (ch === \"\\n\" || ch === \"\t\" || ch === \" \") {\n while (_i < chars.length && (chars[_i] === \"\\n\" || chars[_i] === \"\t\" || chars[_i] === \" \")) {\n _i++;\n }\n continue;\n }\n if (ch === \",\") {\n return void 0;\n }\n if (ch === \")\") {\n tokens.push({ type: Tok.ParenClose });\n continue;\n }\n if (ch === \"+\") {\n _i--;\n if (is_num(chars)) {\n tokens.push(num2(chars));\n continue;\n }\n return void 0;\n }\n if (ch === \"-\") {\n _i--;\n if (is_num(chars)) {\n tokens.push(num2(chars));\n continue;\n }\n if (is_ident(chars)) {\n tokens.push({ type: Tok.Ident, value: ident(chars) });\n continue;\n }\n return void 0;\n }\n if (ch === \".\") {\n _i--;\n if (is_num(chars)) {\n tokens.push(num2(chars));\n continue;\n }\n return void 0;\n }\n if (ch === \"/\") {\n while (_i < chars.length && (chars[_i] === \"\\n\" || chars[_i] === \"\t\" || chars[_i] === \" \")) {\n _i++;\n }\n let alpha2;\n if (is_num(chars)) {\n alpha2 = num2(chars);\n if (alpha2.type !== Tok.Hue) {\n tokens.push({ type: Tok.Alpha, value: alpha2 });\n continue;\n }\n }\n if (is_ident(chars)) {\n if (ident(chars) === \"none\") {\n tokens.push({\n type: Tok.Alpha,\n value: { type: Tok.None, value: void 0 }\n });\n continue;\n }\n }\n return void 0;\n }\n if (/\\d/.test(ch)) {\n _i--;\n tokens.push(num2(chars));\n continue;\n }\n if (IdentStartCodePoint.test(ch)) {\n _i--;\n tokens.push(identlike(chars));\n continue;\n }\n return void 0;\n }\n return tokens;\n }\n function parseColorSyntax(tokens) {\n tokens._i = 0;\n let token = tokens[tokens._i++];\n if (!token || token.type !== Tok.Function || token.value !== \"color\") {\n return void 0;\n }\n token = tokens[tokens._i++];\n if (token.type !== Tok.Ident) {\n return void 0;\n }\n const mode = colorProfiles[token.value];\n if (!mode) {\n return void 0;\n }\n const res = { mode };\n const coords = consumeCoords(tokens, false);\n if (!coords) {\n return void 0;\n }\n const channels = getMode(mode).channels;\n for (let ii = 0, c2, ch; ii < channels.length; ii++) {\n c2 = coords[ii];\n ch = channels[ii];\n if (c2.type !== Tok.None) {\n res[ch] = c2.type === Tok.Number ? c2.value : c2.value / 100;\n if (ch === \"alpha\") {\n res[ch] = Math.max(0, Math.min(1, res[ch]));\n }\n }\n }\n return res;\n }\n function consumeCoords(tokens, includeHue) {\n const coords = [];\n let token;\n while (tokens._i < tokens.length) {\n token = tokens[tokens._i++];\n if (token.type === Tok.None || token.type === Tok.Number || token.type === Tok.Alpha || token.type === Tok.Percentage || includeHue && token.type === Tok.Hue) {\n coords.push(token);\n continue;\n }\n if (token.type === Tok.ParenClose) {\n if (tokens._i < tokens.length) {\n return void 0;\n }\n continue;\n }\n return void 0;\n }\n if (coords.length < 3 || coords.length > 4) {\n return void 0;\n }\n if (coords.length === 4) {\n if (coords[3].type !== Tok.Alpha) {\n return void 0;\n }\n coords[3] = coords[3].value;\n }\n if (coords.length === 3) {\n coords.push({ type: Tok.None, value: void 0 });\n }\n return coords.every((c2) => c2.type !== Tok.Alpha) ? coords : void 0;\n }\n function parseModernSyntax(tokens, includeHue) {\n tokens._i = 0;\n let token = tokens[tokens._i++];\n if (!token || token.type !== Tok.Function) {\n return void 0;\n }\n let coords = consumeCoords(tokens, includeHue);\n if (!coords) {\n return void 0;\n }\n coords.unshift(token.value);\n return coords;\n }\n var parse = (color) => {\n if (typeof color !== \"string\") {\n return void 0;\n }\n const tokens = tokenize(color);\n const parsed = tokens ? parseModernSyntax(tokens, true) : void 0;\n let result = void 0;\n let i = 0;\n let len = parsers.length;\n while (i < len) {\n if ((result = parsers[i++](color, parsed)) !== void 0) {\n return result;\n }\n }\n return tokens ? parseColorSyntax(tokens) : void 0;\n };\n var parse_default = parse;\n\n // node_modules/culori/src/rgb/parseRgb.js\n function parseRgb(color, parsed) {\n if (!parsed || parsed[0] !== \"rgb\" && parsed[0] !== \"rgba\") {\n return void 0;\n }\n const res = { mode: \"rgb\" };\n const [, r2, g, b, alpha2] = parsed;\n if (r2.type === Tok.Hue || g.type === Tok.Hue || b.type === Tok.Hue) {\n return void 0;\n }\n if (r2.type !== Tok.None) {\n res.r = r2.type === Tok.Number ? r2.value / 255 : r2.value / 100;\n }\n if (g.type !== Tok.None) {\n res.g = g.type === Tok.Number ? g.value / 255 : g.value / 100;\n }\n if (b.type !== Tok.None) {\n res.b = b.type === Tok.Number ? b.value / 255 : b.value / 100;\n }\n if (alpha2.type !== Tok.None) {\n res.alpha = Math.min(\n 1,\n Math.max(\n 0,\n alpha2.type === Tok.Number ? alpha2.value : alpha2.value / 100\n )\n );\n }\n return res;\n }\n var parseRgb_default = parseRgb;\n\n // node_modules/culori/src/rgb/parseTransparent.js\n var parseTransparent = (c2) => c2 === \"transparent\" ? { mode: \"rgb\", r: 0, g: 0, b: 0, alpha: 0 } : void 0;\n var parseTransparent_default = parseTransparent;\n\n // node_modules/culori/src/interpolate/lerp.js\n var lerp = (a, b, t) => a + t * (b - a);\n\n // node_modules/culori/src/interpolate/piecewise.js\n var get_classes = (arr) => {\n let classes = [];\n for (let i = 0; i < arr.length - 1; i++) {\n let a = arr[i];\n let b = arr[i + 1];\n if (a === void 0 && b === void 0) {\n classes.push(void 0);\n } else if (a !== void 0 && b !== void 0) {\n classes.push([a, b]);\n } else {\n classes.push(a !== void 0 ? [a, a] : [b, b]);\n }\n }\n return classes;\n };\n var interpolatorPiecewise = (interpolator) => (arr) => {\n let classes = get_classes(arr);\n return (t) => {\n let cls = t * classes.length;\n let idx = t >= 1 ? classes.length - 1 : Math.max(Math.floor(cls), 0);\n let pair = classes[idx];\n return pair === void 0 ? void 0 : interpolator(pair[0], pair[1], cls - idx);\n };\n };\n\n // node_modules/culori/src/interpolate/linear.js\n var interpolatorLinear = interpolatorPiecewise(lerp);\n\n // node_modules/culori/src/fixup/alpha.js\n var fixupAlpha = (arr) => {\n let some_defined = false;\n let res = arr.map((v) => {\n if (v !== void 0) {\n some_defined = true;\n return v;\n }\n return 1;\n });\n return some_defined ? res : arr;\n };\n\n // node_modules/culori/src/rgb/definition.js\n var definition = {\n mode: \"rgb\",\n channels: [\"r\", \"g\", \"b\", \"alpha\"],\n parse: [\n parseRgb_default,\n parseHex_default,\n parseRgbLegacy_default,\n parseNamed_default,\n parseTransparent_default,\n \"srgb\"\n ],\n serialize: \"srgb\",\n interpolate: {\n r: interpolatorLinear,\n g: interpolatorLinear,\n b: interpolatorLinear,\n alpha: { use: interpolatorLinear, fixup: fixupAlpha }\n },\n gamut: true,\n white: { r: 1, g: 1, b: 1 },\n black: { r: 0, g: 0, b: 0 }\n };\n var definition_default = definition;\n\n // node_modules/culori/src/a98/convertA98ToXyz65.js\n var linearize = (v = 0) => Math.pow(Math.abs(v), 563 / 256) * Math.sign(v);\n var convertA98ToXyz65 = (a982) => {\n let r2 = linearize(a982.r);\n let g = linearize(a982.g);\n let b = linearize(a982.b);\n let res = {\n mode: \"xyz65\",\n x: 0.5766690429101305 * r2 + 0.1855582379065463 * g + 0.1882286462349947 * b,\n y: 0.297344975250536 * r2 + 0.6273635662554661 * g + 0.0752914584939979 * b,\n z: 0.0270313613864123 * r2 + 0.0706888525358272 * g + 0.9913375368376386 * b\n };\n if (a982.alpha !== void 0) {\n res.alpha = a982.alpha;\n }\n return res;\n };\n var convertA98ToXyz65_default = convertA98ToXyz65;\n\n // node_modules/culori/src/a98/convertXyz65ToA98.js\n var gamma = (v) => Math.pow(Math.abs(v), 256 / 563) * Math.sign(v);\n var convertXyz65ToA98 = ({ x, y, z, alpha: alpha2 }) => {\n if (x === void 0) x = 0;\n if (y === void 0) y = 0;\n if (z === void 0) z = 0;\n let res = {\n mode: \"a98\",\n r: gamma(\n x * 2.0415879038107465 - y * 0.5650069742788597 - 0.3447313507783297 * z\n ),\n g: gamma(\n x * -0.9692436362808798 + y * 1.8759675015077206 + 0.0415550574071756 * z\n ),\n b: gamma(\n x * 0.0134442806320312 - y * 0.1183623922310184 + 1.0151749943912058 * z\n )\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertXyz65ToA98_default = convertXyz65ToA98;\n\n // node_modules/culori/src/lrgb/convertRgbToLrgb.js\n var fn = (c2 = 0) => {\n const abs2 = Math.abs(c2);\n if (abs2 <= 0.04045) {\n return c2 / 12.92;\n }\n return (Math.sign(c2) || 1) * Math.pow((abs2 + 0.055) / 1.055, 2.4);\n };\n var convertRgbToLrgb = ({ r: r2, g, b, alpha: alpha2 }) => {\n let res = {\n mode: \"lrgb\",\n r: fn(r2),\n g: fn(g),\n b: fn(b)\n };\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n };\n var convertRgbToLrgb_default = convertRgbToLrgb;\n\n // node_modules/culori/src/xyz65/convertRgbToXyz65.js\n var convertRgbToXyz65 = (rgb4) => {\n let { r: r2, g, b, alpha: alpha2 } = convertRgbToLrgb_default(rgb4);\n let res = {\n mode: \"xyz65\",\n x: 0.4123907992659593 * r2 + 0.357584339383878 * g + 0.1804807884018343 * b,\n y: 0.2126390058715102 * r2 + 0.715168678767756 * g + 0.0721923153607337 * b,\n z: 0.0193308187155918 * r2 + 0.119194779794626 * g + 0.9505321522496607 * b\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertRgbToXyz65_default = convertRgbToXyz65;\n\n // node_modules/culori/src/lrgb/convertLrgbToRgb.js\n var fn2 = (c2 = 0) => {\n const abs2 = Math.abs(c2);\n if (abs2 > 31308e-7) {\n return (Math.sign(c2) || 1) * (1.055 * Math.pow(abs2, 1 / 2.4) - 0.055);\n }\n return c2 * 12.92;\n };\n var convertLrgbToRgb = ({ r: r2, g, b, alpha: alpha2 }, mode = \"rgb\") => {\n let res = {\n mode,\n r: fn2(r2),\n g: fn2(g),\n b: fn2(b)\n };\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n };\n var convertLrgbToRgb_default = convertLrgbToRgb;\n\n // node_modules/culori/src/xyz65/convertXyz65ToRgb.js\n var convertXyz65ToRgb = ({ x, y, z, alpha: alpha2 }) => {\n if (x === void 0) x = 0;\n if (y === void 0) y = 0;\n if (z === void 0) z = 0;\n let res = convertLrgbToRgb_default({\n r: x * 3.2409699419045226 - y * 1.537383177570094 - 0.4986107602930034 * z,\n g: x * -0.9692436362808796 + y * 1.8759675015077204 + 0.0415550574071756 * z,\n b: x * 0.0556300796969936 - y * 0.2039769588889765 + 1.0569715142428784 * z\n });\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertXyz65ToRgb_default = convertXyz65ToRgb;\n\n // node_modules/culori/src/a98/definition.js\n var definition2 = {\n ...definition_default,\n mode: \"a98\",\n parse: [\"a98-rgb\"],\n serialize: \"a98-rgb\",\n fromMode: {\n rgb: (color) => convertXyz65ToA98_default(convertRgbToXyz65_default(color)),\n xyz65: convertXyz65ToA98_default\n },\n toMode: {\n rgb: (color) => convertXyz65ToRgb_default(convertA98ToXyz65_default(color)),\n xyz65: convertA98ToXyz65_default\n }\n };\n var definition_default2 = definition2;\n\n // node_modules/culori/src/util/normalizeHue.js\n var normalizeHue = (hue3) => (hue3 = hue3 % 360) < 0 ? hue3 + 360 : hue3;\n var normalizeHue_default = normalizeHue;\n\n // node_modules/culori/src/fixup/hue.js\n var hue2 = (hues, fn5) => {\n return hues.map((hue3, idx, arr) => {\n if (hue3 === void 0) {\n return hue3;\n }\n let normalized = normalizeHue_default(hue3);\n if (idx === 0 || hues[idx - 1] === void 0) {\n return normalized;\n }\n return fn5(normalized - normalizeHue_default(arr[idx - 1]));\n }).reduce((acc, curr) => {\n if (!acc.length || curr === void 0 || acc[acc.length - 1] === void 0) {\n acc.push(curr);\n return acc;\n }\n acc.push(curr + acc[acc.length - 1]);\n return acc;\n }, []);\n };\n var fixupHueShorter = (arr) => hue2(arr, (d) => Math.abs(d) <= 180 ? d : d - 360 * Math.sign(d));\n\n // node_modules/culori/src/cubehelix/constants.js\n var M = [-0.14861, 1.78277, -0.29227, -0.90649, 1.97294, 0];\n var degToRad = Math.PI / 180;\n var radToDeg = 180 / Math.PI;\n\n // node_modules/culori/src/cubehelix/convertRgbToCubehelix.js\n var DE = M[3] * M[4];\n var BE = M[1] * M[4];\n var BCAD = M[1] * M[2] - M[0] * M[3];\n var convertRgbToCubehelix = ({ r: r2, g, b, alpha: alpha2 }) => {\n if (r2 === void 0) r2 = 0;\n if (g === void 0) g = 0;\n if (b === void 0) b = 0;\n let l = (BCAD * b + r2 * DE - g * BE) / (BCAD + DE - BE);\n let x = b - l;\n let y = (M[4] * (g - l) - M[2] * x) / M[3];\n let res = {\n mode: \"cubehelix\",\n l,\n s: l === 0 || l === 1 ? void 0 : Math.sqrt(x * x + y * y) / (M[4] * l * (1 - l))\n };\n if (res.s) res.h = Math.atan2(y, x) * radToDeg - 120;\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n };\n var convertRgbToCubehelix_default = convertRgbToCubehelix;\n\n // node_modules/culori/src/cubehelix/convertCubehelixToRgb.js\n var convertCubehelixToRgb = ({ h, s, l, alpha: alpha2 }) => {\n let res = { mode: \"rgb\" };\n h = (h === void 0 ? 0 : h + 120) * degToRad;\n if (l === void 0) l = 0;\n let amp = s === void 0 ? 0 : s * l * (1 - l);\n let cosh = Math.cos(h);\n let sinh = Math.sin(h);\n res.r = l + amp * (M[0] * cosh + M[1] * sinh);\n res.g = l + amp * (M[2] * cosh + M[3] * sinh);\n res.b = l + amp * (M[4] * cosh + M[5] * sinh);\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n };\n var convertCubehelixToRgb_default = convertCubehelixToRgb;\n\n // node_modules/culori/src/difference.js\n var differenceHueSaturation = (std, smp) => {\n if (std.h === void 0 || smp.h === void 0 || !std.s || !smp.s) {\n return 0;\n }\n let std_h = normalizeHue_default(std.h);\n let smp_h = normalizeHue_default(smp.h);\n let dH = Math.sin((smp_h - std_h + 360) / 2 * Math.PI / 180);\n return 2 * Math.sqrt(std.s * smp.s) * dH;\n };\n var differenceHueNaive = (std, smp) => {\n if (std.h === void 0 || smp.h === void 0) {\n return 0;\n }\n let std_h = normalizeHue_default(std.h);\n let smp_h = normalizeHue_default(smp.h);\n if (Math.abs(smp_h - std_h) > 180) {\n return std_h - (smp_h - 360 * Math.sign(smp_h - std_h));\n }\n return smp_h - std_h;\n };\n var differenceHueChroma = (std, smp) => {\n if (std.h === void 0 || smp.h === void 0 || !std.c || !smp.c) {\n return 0;\n }\n let std_h = normalizeHue_default(std.h);\n let smp_h = normalizeHue_default(smp.h);\n let dH = Math.sin((smp_h - std_h + 360) / 2 * Math.PI / 180);\n return 2 * Math.sqrt(std.c * smp.c) * dH;\n };\n\n // node_modules/culori/src/average.js\n var averageAngle = (val) => {\n let sum = val.reduce(\n (sum2, val2) => {\n if (val2 !== void 0) {\n let rad = val2 * Math.PI / 180;\n sum2.sin += Math.sin(rad);\n sum2.cos += Math.cos(rad);\n }\n return sum2;\n },\n { sin: 0, cos: 0 }\n );\n let angle = Math.atan2(sum.sin, sum.cos) * 180 / Math.PI;\n return angle < 0 ? 360 + angle : angle;\n };\n\n // node_modules/culori/src/cubehelix/definition.js\n var definition3 = {\n mode: \"cubehelix\",\n channels: [\"h\", \"s\", \"l\", \"alpha\"],\n parse: [\"--cubehelix\"],\n serialize: \"--cubehelix\",\n ranges: {\n h: [0, 360],\n s: [0, 4.614],\n l: [0, 1]\n },\n fromMode: {\n rgb: convertRgbToCubehelix_default\n },\n toMode: {\n rgb: convertCubehelixToRgb_default\n },\n interpolate: {\n h: {\n use: interpolatorLinear,\n fixup: fixupHueShorter\n },\n s: interpolatorLinear,\n l: interpolatorLinear,\n alpha: {\n use: interpolatorLinear,\n fixup: fixupAlpha\n }\n },\n difference: {\n h: differenceHueSaturation\n },\n average: {\n h: averageAngle\n }\n };\n var definition_default3 = definition3;\n\n // node_modules/culori/src/lch/convertLabToLch.js\n var convertLabToLch = ({ l, a, b, alpha: alpha2 }, mode = \"lch\") => {\n if (a === void 0) a = 0;\n if (b === void 0) b = 0;\n let c2 = Math.sqrt(a * a + b * b);\n let res = { mode, l, c: c2 };\n if (c2) res.h = normalizeHue_default(Math.atan2(b, a) * 180 / Math.PI);\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n };\n var convertLabToLch_default = convertLabToLch;\n\n // node_modules/culori/src/lch/convertLchToLab.js\n var convertLchToLab = ({ l, c: c2, h, alpha: alpha2 }, mode = \"lab\") => {\n if (h === void 0) h = 0;\n let res = {\n mode,\n l,\n a: c2 ? c2 * Math.cos(h / 180 * Math.PI) : 0,\n b: c2 ? c2 * Math.sin(h / 180 * Math.PI) : 0\n };\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n };\n var convertLchToLab_default = convertLchToLab;\n\n // node_modules/culori/src/xyz65/constants.js\n var k = Math.pow(29, 3) / Math.pow(3, 3);\n var e = Math.pow(6, 3) / Math.pow(29, 3);\n\n // node_modules/culori/src/constants.js\n var D50 = {\n X: 0.3457 / 0.3585,\n Y: 1,\n Z: (1 - 0.3457 - 0.3585) / 0.3585\n };\n var D65 = {\n X: 0.3127 / 0.329,\n Y: 1,\n Z: (1 - 0.3127 - 0.329) / 0.329\n };\n var k2 = Math.pow(29, 3) / Math.pow(3, 3);\n var e2 = Math.pow(6, 3) / Math.pow(29, 3);\n\n // node_modules/culori/src/lab65/convertLab65ToXyz65.js\n var fn3 = (v) => Math.pow(v, 3) > e ? Math.pow(v, 3) : (116 * v - 16) / k;\n var convertLab65ToXyz65 = ({ l, a, b, alpha: alpha2 }) => {\n if (l === void 0) l = 0;\n if (a === void 0) a = 0;\n if (b === void 0) b = 0;\n let fy = (l + 16) / 116;\n let fx = a / 500 + fy;\n let fz = fy - b / 200;\n let res = {\n mode: \"xyz65\",\n x: fn3(fx) * D65.X,\n y: fn3(fy) * D65.Y,\n z: fn3(fz) * D65.Z\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertLab65ToXyz65_default = convertLab65ToXyz65;\n\n // node_modules/culori/src/lab65/convertLab65ToRgb.js\n var convertLab65ToRgb = (lab2) => convertXyz65ToRgb_default(convertLab65ToXyz65_default(lab2));\n var convertLab65ToRgb_default = convertLab65ToRgb;\n\n // node_modules/culori/src/lab65/convertXyz65ToLab65.js\n var f = (value) => value > e ? Math.cbrt(value) : (k * value + 16) / 116;\n var convertXyz65ToLab65 = ({ x, y, z, alpha: alpha2 }) => {\n if (x === void 0) x = 0;\n if (y === void 0) y = 0;\n if (z === void 0) z = 0;\n let f0 = f(x / D65.X);\n let f1 = f(y / D65.Y);\n let f22 = f(z / D65.Z);\n let res = {\n mode: \"lab65\",\n l: 116 * f1 - 16,\n a: 500 * (f0 - f1),\n b: 200 * (f1 - f22)\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertXyz65ToLab65_default = convertXyz65ToLab65;\n\n // node_modules/culori/src/lab65/convertRgbToLab65.js\n var convertRgbToLab65 = (rgb4) => {\n let res = convertXyz65ToLab65_default(convertRgbToXyz65_default(rgb4));\n if (rgb4.r === rgb4.b && rgb4.b === rgb4.g) {\n res.a = res.b = 0;\n }\n return res;\n };\n var convertRgbToLab65_default = convertRgbToLab65;\n\n // node_modules/culori/src/dlch/constants.js\n var kE = 1;\n var kCH = 1;\n var \\u03B8 = 26 / 180 * Math.PI;\n var cos\\u03B8 = Math.cos(\\u03B8);\n var sin\\u03B8 = Math.sin(\\u03B8);\n var factor = 100 / Math.log(139 / 100);\n\n // node_modules/culori/src/dlch/convertDlchToLab65.js\n var convertDlchToLab65 = ({ l, c: c2, h, alpha: alpha2 }) => {\n if (l === void 0) l = 0;\n if (c2 === void 0) c2 = 0;\n if (h === void 0) h = 0;\n let res = {\n mode: \"lab65\",\n l: (Math.exp(l * kE / factor) - 1) / 39e-4\n };\n let G = (Math.exp(0.0435 * c2 * kCH * kE) - 1) / 0.075;\n let e4 = G * Math.cos(h / 180 * Math.PI - \\u03B8);\n let f3 = G * Math.sin(h / 180 * Math.PI - \\u03B8);\n res.a = e4 * cos\\u03B8 - f3 / 0.83 * sin\\u03B8;\n res.b = e4 * sin\\u03B8 + f3 / 0.83 * cos\\u03B8;\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n };\n var convertDlchToLab65_default = convertDlchToLab65;\n\n // node_modules/culori/src/dlch/convertLab65ToDlch.js\n var convertLab65ToDlch = ({ l, a, b, alpha: alpha2 }) => {\n if (l === void 0) l = 0;\n if (a === void 0) a = 0;\n if (b === void 0) b = 0;\n let e4 = a * cos\\u03B8 + b * sin\\u03B8;\n let f3 = 0.83 * (b * cos\\u03B8 - a * sin\\u03B8);\n let G = Math.sqrt(e4 * e4 + f3 * f3);\n let res = {\n mode: \"dlch\",\n l: factor / kE * Math.log(1 + 39e-4 * l),\n c: Math.log(1 + 0.075 * G) / (0.0435 * kCH * kE)\n };\n if (res.c) {\n res.h = normalizeHue_default((Math.atan2(f3, e4) + \\u03B8) / Math.PI * 180);\n }\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n };\n var convertLab65ToDlch_default = convertLab65ToDlch;\n\n // node_modules/culori/src/dlab/definition.js\n var convertDlabToLab65 = (c2) => convertDlchToLab65_default(convertLabToLch_default(c2, \"dlch\"));\n var convertLab65ToDlab = (c2) => convertLchToLab_default(convertLab65ToDlch_default(c2), \"dlab\");\n var definition4 = {\n mode: \"dlab\",\n parse: [\"--din99o-lab\"],\n serialize: \"--din99o-lab\",\n toMode: {\n lab65: convertDlabToLab65,\n rgb: (c2) => convertLab65ToRgb_default(convertDlabToLab65(c2))\n },\n fromMode: {\n lab65: convertLab65ToDlab,\n rgb: (c2) => convertLab65ToDlab(convertRgbToLab65_default(c2))\n },\n channels: [\"l\", \"a\", \"b\", \"alpha\"],\n ranges: {\n l: [0, 100],\n a: [-40.09, 45.501],\n b: [-40.469, 44.344]\n },\n interpolate: {\n l: interpolatorLinear,\n a: interpolatorLinear,\n b: interpolatorLinear,\n alpha: {\n use: interpolatorLinear,\n fixup: fixupAlpha\n }\n }\n };\n var definition_default4 = definition4;\n\n // node_modules/culori/src/dlch/definition.js\n var definition5 = {\n mode: \"dlch\",\n parse: [\"--din99o-lch\"],\n serialize: \"--din99o-lch\",\n toMode: {\n lab65: convertDlchToLab65_default,\n dlab: (c2) => convertLchToLab_default(c2, \"dlab\"),\n rgb: (c2) => convertLab65ToRgb_default(convertDlchToLab65_default(c2))\n },\n fromMode: {\n lab65: convertLab65ToDlch_default,\n dlab: (c2) => convertLabToLch_default(c2, \"dlch\"),\n rgb: (c2) => convertLab65ToDlch_default(convertRgbToLab65_default(c2))\n },\n channels: [\"l\", \"c\", \"h\", \"alpha\"],\n ranges: {\n l: [0, 100],\n c: [0, 51.484],\n h: [0, 360]\n },\n interpolate: {\n l: interpolatorLinear,\n c: interpolatorLinear,\n h: {\n use: interpolatorLinear,\n fixup: fixupHueShorter\n },\n alpha: {\n use: interpolatorLinear,\n fixup: fixupAlpha\n }\n },\n difference: {\n h: differenceHueChroma\n },\n average: {\n h: averageAngle\n }\n };\n var definition_default5 = definition5;\n\n // node_modules/culori/src/hsi/convertHsiToRgb.js\n function convertHsiToRgb({ h, s, i, alpha: alpha2 }) {\n h = normalizeHue_default(h !== void 0 ? h : 0);\n if (s === void 0) s = 0;\n if (i === void 0) i = 0;\n let f3 = Math.abs(h / 60 % 2 - 1);\n let res;\n switch (Math.floor(h / 60)) {\n case 0:\n res = {\n r: i * (1 + s * (3 / (2 - f3) - 1)),\n g: i * (1 + s * (3 * (1 - f3) / (2 - f3) - 1)),\n b: i * (1 - s)\n };\n break;\n case 1:\n res = {\n r: i * (1 + s * (3 * (1 - f3) / (2 - f3) - 1)),\n g: i * (1 + s * (3 / (2 - f3) - 1)),\n b: i * (1 - s)\n };\n break;\n case 2:\n res = {\n r: i * (1 - s),\n g: i * (1 + s * (3 / (2 - f3) - 1)),\n b: i * (1 + s * (3 * (1 - f3) / (2 - f3) - 1))\n };\n break;\n case 3:\n res = {\n r: i * (1 - s),\n g: i * (1 + s * (3 * (1 - f3) / (2 - f3) - 1)),\n b: i * (1 + s * (3 / (2 - f3) - 1))\n };\n break;\n case 4:\n res = {\n r: i * (1 + s * (3 * (1 - f3) / (2 - f3) - 1)),\n g: i * (1 - s),\n b: i * (1 + s * (3 / (2 - f3) - 1))\n };\n break;\n case 5:\n res = {\n r: i * (1 + s * (3 / (2 - f3) - 1)),\n g: i * (1 - s),\n b: i * (1 + s * (3 * (1 - f3) / (2 - f3) - 1))\n };\n break;\n default:\n res = { r: i * (1 - s), g: i * (1 - s), b: i * (1 - s) };\n }\n res.mode = \"rgb\";\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n }\n\n // node_modules/culori/src/hsi/convertRgbToHsi.js\n function convertRgbToHsi({ r: r2, g, b, alpha: alpha2 }) {\n if (r2 === void 0) r2 = 0;\n if (g === void 0) g = 0;\n if (b === void 0) b = 0;\n let M3 = Math.max(r2, g, b), m = Math.min(r2, g, b);\n let res = {\n mode: \"hsi\",\n s: r2 + g + b === 0 ? 0 : 1 - 3 * m / (r2 + g + b),\n i: (r2 + g + b) / 3\n };\n if (M3 - m !== 0)\n res.h = (M3 === r2 ? (g - b) / (M3 - m) + (g < b) * 6 : M3 === g ? (b - r2) / (M3 - m) + 2 : (r2 - g) / (M3 - m) + 4) * 60;\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n }\n\n // node_modules/culori/src/hsi/definition.js\n var definition6 = {\n mode: \"hsi\",\n toMode: {\n rgb: convertHsiToRgb\n },\n parse: [\"--hsi\"],\n serialize: \"--hsi\",\n fromMode: {\n rgb: convertRgbToHsi\n },\n channels: [\"h\", \"s\", \"i\", \"alpha\"],\n ranges: {\n h: [0, 360]\n },\n gamut: \"rgb\",\n interpolate: {\n h: { use: interpolatorLinear, fixup: fixupHueShorter },\n s: interpolatorLinear,\n i: interpolatorLinear,\n alpha: { use: interpolatorLinear, fixup: fixupAlpha }\n },\n difference: {\n h: differenceHueSaturation\n },\n average: {\n h: averageAngle\n }\n };\n var definition_default6 = definition6;\n\n // node_modules/culori/src/hsl/convertHslToRgb.js\n function convertHslToRgb({ h, s, l, alpha: alpha2 }) {\n h = normalizeHue_default(h !== void 0 ? h : 0);\n if (s === void 0) s = 0;\n if (l === void 0) l = 0;\n let m1 = l + s * (l < 0.5 ? l : 1 - l);\n let m2 = m1 - (m1 - l) * 2 * Math.abs(h / 60 % 2 - 1);\n let res;\n switch (Math.floor(h / 60)) {\n case 0:\n res = { r: m1, g: m2, b: 2 * l - m1 };\n break;\n case 1:\n res = { r: m2, g: m1, b: 2 * l - m1 };\n break;\n case 2:\n res = { r: 2 * l - m1, g: m1, b: m2 };\n break;\n case 3:\n res = { r: 2 * l - m1, g: m2, b: m1 };\n break;\n case 4:\n res = { r: m2, g: 2 * l - m1, b: m1 };\n break;\n case 5:\n res = { r: m1, g: 2 * l - m1, b: m2 };\n break;\n default:\n res = { r: 2 * l - m1, g: 2 * l - m1, b: 2 * l - m1 };\n }\n res.mode = \"rgb\";\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n }\n\n // node_modules/culori/src/hsl/convertRgbToHsl.js\n function convertRgbToHsl({ r: r2, g, b, alpha: alpha2 }) {\n if (r2 === void 0) r2 = 0;\n if (g === void 0) g = 0;\n if (b === void 0) b = 0;\n let M3 = Math.max(r2, g, b), m = Math.min(r2, g, b);\n let res = {\n mode: \"hsl\",\n s: M3 === m ? 0 : (M3 - m) / (1 - Math.abs(M3 + m - 1)),\n l: 0.5 * (M3 + m)\n };\n if (M3 - m !== 0)\n res.h = (M3 === r2 ? (g - b) / (M3 - m) + (g < b) * 6 : M3 === g ? (b - r2) / (M3 - m) + 2 : (r2 - g) / (M3 - m) + 4) * 60;\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n }\n\n // node_modules/culori/src/util/hue.js\n var hueToDeg = (val, unit) => {\n switch (unit) {\n case \"deg\":\n return +val;\n case \"rad\":\n return val / Math.PI * 180;\n case \"grad\":\n return val / 10 * 9;\n case \"turn\":\n return val * 360;\n }\n };\n var hue_default = hueToDeg;\n\n // node_modules/culori/src/hsl/parseHslLegacy.js\n var hsl_old = new RegExp(\n `^hsla?\\\\(\\\\s*${hue}${c}${per}${c}${per}\\\\s*(?:,\\\\s*${num_per}\\\\s*)?\\\\)$`\n );\n var parseHslLegacy = (color) => {\n let match = color.match(hsl_old);\n if (!match) return;\n let res = { mode: \"hsl\" };\n if (match[3] !== void 0) {\n res.h = +match[3];\n } else if (match[1] !== void 0 && match[2] !== void 0) {\n res.h = hue_default(match[1], match[2]);\n }\n if (match[4] !== void 0) {\n res.s = Math.min(Math.max(0, match[4] / 100), 1);\n }\n if (match[5] !== void 0) {\n res.l = Math.min(Math.max(0, match[5] / 100), 1);\n }\n if (match[6] !== void 0) {\n res.alpha = Math.max(0, Math.min(1, match[6] / 100));\n } else if (match[7] !== void 0) {\n res.alpha = Math.max(0, Math.min(1, +match[7]));\n }\n return res;\n };\n var parseHslLegacy_default = parseHslLegacy;\n\n // node_modules/culori/src/hsl/parseHsl.js\n function parseHsl(color, parsed) {\n if (!parsed || parsed[0] !== \"hsl\" && parsed[0] !== \"hsla\") {\n return void 0;\n }\n const res = { mode: \"hsl\" };\n const [, h, s, l, alpha2] = parsed;\n if (h.type !== Tok.None) {\n if (h.type === Tok.Percentage) {\n return void 0;\n }\n res.h = h.value;\n }\n if (s.type !== Tok.None) {\n if (s.type === Tok.Hue) {\n return void 0;\n }\n res.s = s.value / 100;\n }\n if (l.type !== Tok.None) {\n if (l.type === Tok.Hue) {\n return void 0;\n }\n res.l = l.value / 100;\n }\n if (alpha2.type !== Tok.None) {\n res.alpha = Math.min(\n 1,\n Math.max(\n 0,\n alpha2.type === Tok.Number ? alpha2.value : alpha2.value / 100\n )\n );\n }\n return res;\n }\n var parseHsl_default = parseHsl;\n\n // node_modules/culori/src/hsl/definition.js\n var definition7 = {\n mode: \"hsl\",\n toMode: {\n rgb: convertHslToRgb\n },\n fromMode: {\n rgb: convertRgbToHsl\n },\n channels: [\"h\", \"s\", \"l\", \"alpha\"],\n ranges: {\n h: [0, 360]\n },\n gamut: \"rgb\",\n parse: [parseHsl_default, parseHslLegacy_default],\n serialize: (c2) => `hsl(${c2.h !== void 0 ? c2.h : \"none\"} ${c2.s !== void 0 ? c2.s * 100 + \"%\" : \"none\"} ${c2.l !== void 0 ? c2.l * 100 + \"%\" : \"none\"}${c2.alpha < 1 ? ` / ${c2.alpha}` : \"\"})`,\n interpolate: {\n h: { use: interpolatorLinear, fixup: fixupHueShorter },\n s: interpolatorLinear,\n l: interpolatorLinear,\n alpha: { use: interpolatorLinear, fixup: fixupAlpha }\n },\n difference: {\n h: differenceHueSaturation\n },\n average: {\n h: averageAngle\n }\n };\n var definition_default7 = definition7;\n\n // node_modules/culori/src/hsv/convertHsvToRgb.js\n function convertHsvToRgb({ h, s, v, alpha: alpha2 }) {\n h = normalizeHue_default(h !== void 0 ? h : 0);\n if (s === void 0) s = 0;\n if (v === void 0) v = 0;\n let f3 = Math.abs(h / 60 % 2 - 1);\n let res;\n switch (Math.floor(h / 60)) {\n case 0:\n res = { r: v, g: v * (1 - s * f3), b: v * (1 - s) };\n break;\n case 1:\n res = { r: v * (1 - s * f3), g: v, b: v * (1 - s) };\n break;\n case 2:\n res = { r: v * (1 - s), g: v, b: v * (1 - s * f3) };\n break;\n case 3:\n res = { r: v * (1 - s), g: v * (1 - s * f3), b: v };\n break;\n case 4:\n res = { r: v * (1 - s * f3), g: v * (1 - s), b: v };\n break;\n case 5:\n res = { r: v, g: v * (1 - s), b: v * (1 - s * f3) };\n break;\n default:\n res = { r: v * (1 - s), g: v * (1 - s), b: v * (1 - s) };\n }\n res.mode = \"rgb\";\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n }\n\n // node_modules/culori/src/hsv/convertRgbToHsv.js\n function convertRgbToHsv({ r: r2, g, b, alpha: alpha2 }) {\n if (r2 === void 0) r2 = 0;\n if (g === void 0) g = 0;\n if (b === void 0) b = 0;\n let M3 = Math.max(r2, g, b), m = Math.min(r2, g, b);\n let res = {\n mode: \"hsv\",\n s: M3 === 0 ? 0 : 1 - m / M3,\n v: M3\n };\n if (M3 - m !== 0)\n res.h = (M3 === r2 ? (g - b) / (M3 - m) + (g < b) * 6 : M3 === g ? (b - r2) / (M3 - m) + 2 : (r2 - g) / (M3 - m) + 4) * 60;\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n }\n\n // node_modules/culori/src/hsv/definition.js\n var definition8 = {\n mode: \"hsv\",\n toMode: {\n rgb: convertHsvToRgb\n },\n parse: [\"--hsv\"],\n serialize: \"--hsv\",\n fromMode: {\n rgb: convertRgbToHsv\n },\n channels: [\"h\", \"s\", \"v\", \"alpha\"],\n ranges: {\n h: [0, 360]\n },\n gamut: \"rgb\",\n interpolate: {\n h: { use: interpolatorLinear, fixup: fixupHueShorter },\n s: interpolatorLinear,\n v: interpolatorLinear,\n alpha: { use: interpolatorLinear, fixup: fixupAlpha }\n },\n difference: {\n h: differenceHueSaturation\n },\n average: {\n h: averageAngle\n }\n };\n var definition_default8 = definition8;\n\n // node_modules/culori/src/hwb/convertHwbToRgb.js\n function convertHwbToRgb({ h, w, b, alpha: alpha2 }) {\n if (w === void 0) w = 0;\n if (b === void 0) b = 0;\n if (w + b > 1) {\n let s = w + b;\n w /= s;\n b /= s;\n }\n return convertHsvToRgb({\n h,\n s: b === 1 ? 1 : 1 - w / (1 - b),\n v: 1 - b,\n alpha: alpha2\n });\n }\n\n // node_modules/culori/src/hwb/convertRgbToHwb.js\n function convertRgbToHwb(rgba) {\n let hsv2 = convertRgbToHsv(rgba);\n if (hsv2 === void 0) return void 0;\n let s = hsv2.s !== void 0 ? hsv2.s : 0;\n let v = hsv2.v !== void 0 ? hsv2.v : 0;\n let res = {\n mode: \"hwb\",\n w: (1 - s) * v,\n b: 1 - v\n };\n if (hsv2.h !== void 0) res.h = hsv2.h;\n if (hsv2.alpha !== void 0) res.alpha = hsv2.alpha;\n return res;\n }\n\n // node_modules/culori/src/hwb/parseHwb.js\n function ParseHwb(color, parsed) {\n if (!parsed || parsed[0] !== \"hwb\") {\n return void 0;\n }\n const res = { mode: \"hwb\" };\n const [, h, w, b, alpha2] = parsed;\n if (h.type !== Tok.None) {\n if (h.type === Tok.Percentage) {\n return void 0;\n }\n res.h = h.value;\n }\n if (w.type !== Tok.None) {\n if (w.type === Tok.Hue) {\n return void 0;\n }\n res.w = w.value / 100;\n }\n if (b.type !== Tok.None) {\n if (b.type === Tok.Hue) {\n return void 0;\n }\n res.b = b.value / 100;\n }\n if (alpha2.type !== Tok.None) {\n res.alpha = Math.min(\n 1,\n Math.max(\n 0,\n alpha2.type === Tok.Number ? alpha2.value : alpha2.value / 100\n )\n );\n }\n return res;\n }\n var parseHwb_default = ParseHwb;\n\n // node_modules/culori/src/hwb/definition.js\n var definition9 = {\n mode: \"hwb\",\n toMode: {\n rgb: convertHwbToRgb\n },\n fromMode: {\n rgb: convertRgbToHwb\n },\n channels: [\"h\", \"w\", \"b\", \"alpha\"],\n ranges: {\n h: [0, 360]\n },\n gamut: \"rgb\",\n parse: [parseHwb_default],\n serialize: (c2) => `hwb(${c2.h !== void 0 ? c2.h : \"none\"} ${c2.w !== void 0 ? c2.w * 100 + \"%\" : \"none\"} ${c2.b !== void 0 ? c2.b * 100 + \"%\" : \"none\"}${c2.alpha < 1 ? ` / ${c2.alpha}` : \"\"})`,\n interpolate: {\n h: { use: interpolatorLinear, fixup: fixupHueShorter },\n w: interpolatorLinear,\n b: interpolatorLinear,\n alpha: { use: interpolatorLinear, fixup: fixupAlpha }\n },\n difference: {\n h: differenceHueNaive\n },\n average: {\n h: averageAngle\n }\n };\n var definition_default9 = definition9;\n\n // node_modules/culori/src/hdr/constants.js\n var YW = 203;\n\n // node_modules/culori/src/hdr/transfer.js\n var M1 = 0.1593017578125;\n var M2 = 78.84375;\n var C1 = 0.8359375;\n var C2 = 18.8515625;\n var C3 = 18.6875;\n function transferPqDecode(v) {\n if (v < 0) return 0;\n const c2 = Math.pow(v, 1 / M2);\n return 1e4 * Math.pow(Math.max(0, c2 - C1) / (C2 - C3 * c2), 1 / M1);\n }\n function transferPqEncode(v) {\n if (v < 0) return 0;\n const c2 = Math.pow(v / 1e4, M1);\n return Math.pow((C1 + C2 * c2) / (1 + C3 * c2), M2);\n }\n\n // node_modules/culori/src/itp/convertItpToXyz65.js\n var toRel = (c2) => Math.max(c2 / YW, 0);\n var convertItpToXyz65 = ({ i, t, p: p4, alpha: alpha2 }) => {\n if (i === void 0) i = 0;\n if (t === void 0) t = 0;\n if (p4 === void 0) p4 = 0;\n const l = transferPqDecode(\n i + 0.008609037037932761 * t + 0.11102962500302593 * p4\n );\n const m = transferPqDecode(\n i - 0.00860903703793275 * t - 0.11102962500302599 * p4\n );\n const s = transferPqDecode(\n i + 0.5600313357106791 * t - 0.32062717498731885 * p4\n );\n const res = {\n mode: \"xyz65\",\n x: toRel(\n 2.070152218389422 * l - 1.3263473389671556 * m + 0.2066510476294051 * s\n ),\n y: toRel(\n 0.3647385209748074 * l + 0.680566024947227 * m - 0.0453045459220346 * s\n ),\n z: toRel(\n -0.049747207535812 * l - 0.0492609666966138 * m + 1.1880659249923042 * s\n )\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertItpToXyz65_default = convertItpToXyz65;\n\n // node_modules/culori/src/itp/convertXyz65ToItp.js\n var toAbs = (c2 = 0) => Math.max(c2 * YW, 0);\n var convertXyz65ToItp = ({ x, y, z, alpha: alpha2 }) => {\n const absX = toAbs(x);\n const absY = toAbs(y);\n const absZ = toAbs(z);\n const l = transferPqEncode(\n 0.3592832590121217 * absX + 0.6976051147779502 * absY - 0.0358915932320289 * absZ\n );\n const m = transferPqEncode(\n -0.1920808463704995 * absX + 1.1004767970374323 * absY + 0.0753748658519118 * absZ\n );\n const s = transferPqEncode(\n 0.0070797844607477 * absX + 0.0748396662186366 * absY + 0.8433265453898765 * absZ\n );\n const i = 0.5 * l + 0.5 * m;\n const t = 1.61376953125 * l - 3.323486328125 * m + 1.709716796875 * s;\n const p4 = 4.378173828125 * l - 4.24560546875 * m - 0.132568359375 * s;\n const res = { mode: \"itp\", i, t, p: p4 };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertXyz65ToItp_default = convertXyz65ToItp;\n\n // node_modules/culori/src/itp/definition.js\n var definition10 = {\n mode: \"itp\",\n channels: [\"i\", \"t\", \"p\", \"alpha\"],\n parse: [\"--ictcp\"],\n serialize: \"--ictcp\",\n toMode: {\n xyz65: convertItpToXyz65_default,\n rgb: (color) => convertXyz65ToRgb_default(convertItpToXyz65_default(color))\n },\n fromMode: {\n xyz65: convertXyz65ToItp_default,\n rgb: (color) => convertXyz65ToItp_default(convertRgbToXyz65_default(color))\n },\n ranges: {\n i: [0, 0.581],\n t: [-0.369, 0.272],\n p: [-0.164, 0.331]\n },\n interpolate: {\n i: interpolatorLinear,\n t: interpolatorLinear,\n p: interpolatorLinear,\n alpha: { use: interpolatorLinear, fixup: fixupAlpha }\n }\n };\n var definition_default10 = definition10;\n\n // node_modules/culori/src/jab/convertXyz65ToJab.js\n var p = 134.03437499999998;\n var d0 = 16295499532821565e-27;\n var jabPqEncode = (v) => {\n if (v < 0) return 0;\n let vn3 = Math.pow(v / 1e4, M1);\n return Math.pow((C1 + C2 * vn3) / (1 + C3 * vn3), p);\n };\n var abs = (v = 0) => Math.max(v * 203, 0);\n var convertXyz65ToJab = ({ x, y, z, alpha: alpha2 }) => {\n x = abs(x);\n y = abs(y);\n z = abs(z);\n let xp = 1.15 * x - 0.15 * z;\n let yp = 0.66 * y + 0.34 * x;\n let l = jabPqEncode(0.41478972 * xp + 0.579999 * yp + 0.014648 * z);\n let m = jabPqEncode(-0.20151 * xp + 1.120649 * yp + 0.0531008 * z);\n let s = jabPqEncode(-0.0166008 * xp + 0.2648 * yp + 0.6684799 * z);\n let i = (l + m) / 2;\n let res = {\n mode: \"jab\",\n j: 0.44 * i / (1 - 0.56 * i) - d0,\n a: 3.524 * l - 4.066708 * m + 0.542708 * s,\n b: 0.199076 * l + 1.096799 * m - 1.295875 * s\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertXyz65ToJab_default = convertXyz65ToJab;\n\n // node_modules/culori/src/jab/convertJabToXyz65.js\n var p2 = 134.03437499999998;\n var d02 = 16295499532821565e-27;\n var jabPqDecode = (v) => {\n if (v < 0) return 0;\n let vp = Math.pow(v, 1 / p2);\n return 1e4 * Math.pow((C1 - vp) / (C3 * vp - C2), 1 / M1);\n };\n var rel = (v) => v / 203;\n var convertJabToXyz65 = ({ j, a, b, alpha: alpha2 }) => {\n if (j === void 0) j = 0;\n if (a === void 0) a = 0;\n if (b === void 0) b = 0;\n let i = (j + d02) / (0.44 + 0.56 * (j + d02));\n let l = jabPqDecode(i + 0.13860504 * a + 0.058047316 * b);\n let m = jabPqDecode(i - 0.13860504 * a - 0.058047316 * b);\n let s = jabPqDecode(i - 0.096019242 * a - 0.8118919 * b);\n let res = {\n mode: \"xyz65\",\n x: rel(\n 1.661373024652174 * l - 0.914523081304348 * m + 0.23136208173913045 * s\n ),\n y: rel(\n -0.3250758611844533 * l + 1.571847026732543 * m - 0.21825383453227928 * s\n ),\n z: rel(-0.090982811 * l - 0.31272829 * m + 1.5227666 * s)\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertJabToXyz65_default = convertJabToXyz65;\n\n // node_modules/culori/src/jab/convertRgbToJab.js\n var convertRgbToJab = (rgb4) => {\n let res = convertXyz65ToJab_default(convertRgbToXyz65_default(rgb4));\n if (rgb4.r === rgb4.b && rgb4.b === rgb4.g) {\n res.a = res.b = 0;\n }\n return res;\n };\n var convertRgbToJab_default = convertRgbToJab;\n\n // node_modules/culori/src/jab/convertJabToRgb.js\n var convertJabToRgb = (color) => convertXyz65ToRgb_default(convertJabToXyz65_default(color));\n var convertJabToRgb_default = convertJabToRgb;\n\n // node_modules/culori/src/jab/definition.js\n var definition11 = {\n mode: \"jab\",\n channels: [\"j\", \"a\", \"b\", \"alpha\"],\n parse: [\"--jzazbz\"],\n serialize: \"--jzazbz\",\n fromMode: {\n rgb: convertRgbToJab_default,\n xyz65: convertXyz65ToJab_default\n },\n toMode: {\n rgb: convertJabToRgb_default,\n xyz65: convertJabToXyz65_default\n },\n ranges: {\n j: [0, 0.222],\n a: [-0.109, 0.129],\n b: [-0.185, 0.134]\n },\n interpolate: {\n j: interpolatorLinear,\n a: interpolatorLinear,\n b: interpolatorLinear,\n alpha: { use: interpolatorLinear, fixup: fixupAlpha }\n }\n };\n var definition_default11 = definition11;\n\n // node_modules/culori/src/jch/convertJabToJch.js\n var convertJabToJch = ({ j, a, b, alpha: alpha2 }) => {\n if (a === void 0) a = 0;\n if (b === void 0) b = 0;\n let c2 = Math.sqrt(a * a + b * b);\n let res = {\n mode: \"jch\",\n j,\n c: c2\n };\n if (c2) {\n res.h = normalizeHue_default(Math.atan2(b, a) * 180 / Math.PI);\n }\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertJabToJch_default = convertJabToJch;\n\n // node_modules/culori/src/jch/convertJchToJab.js\n var convertJchToJab = ({ j, c: c2, h, alpha: alpha2 }) => {\n if (h === void 0) h = 0;\n let res = {\n mode: \"jab\",\n j,\n a: c2 ? c2 * Math.cos(h / 180 * Math.PI) : 0,\n b: c2 ? c2 * Math.sin(h / 180 * Math.PI) : 0\n };\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n };\n var convertJchToJab_default = convertJchToJab;\n\n // node_modules/culori/src/jch/definition.js\n var definition12 = {\n mode: \"jch\",\n parse: [\"--jzczhz\"],\n serialize: \"--jzczhz\",\n toMode: {\n jab: convertJchToJab_default,\n rgb: (c2) => convertJabToRgb_default(convertJchToJab_default(c2))\n },\n fromMode: {\n rgb: (c2) => convertJabToJch_default(convertRgbToJab_default(c2)),\n jab: convertJabToJch_default\n },\n channels: [\"j\", \"c\", \"h\", \"alpha\"],\n ranges: {\n j: [0, 0.221],\n c: [0, 0.19],\n h: [0, 360]\n },\n interpolate: {\n h: { use: interpolatorLinear, fixup: fixupHueShorter },\n c: interpolatorLinear,\n j: interpolatorLinear,\n alpha: { use: interpolatorLinear, fixup: fixupAlpha }\n },\n difference: {\n h: differenceHueChroma\n },\n average: {\n h: averageAngle\n }\n };\n var definition_default12 = definition12;\n\n // node_modules/culori/src/xyz50/constants.js\n var k3 = Math.pow(29, 3) / Math.pow(3, 3);\n var e3 = Math.pow(6, 3) / Math.pow(29, 3);\n\n // node_modules/culori/src/lab/convertLabToXyz50.js\n var fn4 = (v) => Math.pow(v, 3) > e3 ? Math.pow(v, 3) : (116 * v - 16) / k3;\n var convertLabToXyz50 = ({ l, a, b, alpha: alpha2 }) => {\n if (l === void 0) l = 0;\n if (a === void 0) a = 0;\n if (b === void 0) b = 0;\n let fy = (l + 16) / 116;\n let fx = a / 500 + fy;\n let fz = fy - b / 200;\n let res = {\n mode: \"xyz50\",\n x: fn4(fx) * D50.X,\n y: fn4(fy) * D50.Y,\n z: fn4(fz) * D50.Z\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertLabToXyz50_default = convertLabToXyz50;\n\n // node_modules/culori/src/xyz50/convertXyz50ToRgb.js\n var convertXyz50ToRgb = ({ x, y, z, alpha: alpha2 }) => {\n if (x === void 0) x = 0;\n if (y === void 0) y = 0;\n if (z === void 0) z = 0;\n let res = convertLrgbToRgb_default({\n r: x * 3.1341359569958707 - y * 1.6173863321612538 - 0.4906619460083532 * z,\n g: x * -0.978795502912089 + y * 1.916254567259524 + 0.03344273116131949 * z,\n b: x * 0.07195537988411677 - y * 0.2289768264158322 + 1.405386058324125 * z\n });\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertXyz50ToRgb_default = convertXyz50ToRgb;\n\n // node_modules/culori/src/lab/convertLabToRgb.js\n var convertLabToRgb = (lab2) => convertXyz50ToRgb_default(convertLabToXyz50_default(lab2));\n var convertLabToRgb_default = convertLabToRgb;\n\n // node_modules/culori/src/xyz50/convertRgbToXyz50.js\n var convertRgbToXyz50 = (rgb4) => {\n let { r: r2, g, b, alpha: alpha2 } = convertRgbToLrgb_default(rgb4);\n let res = {\n mode: \"xyz50\",\n x: 0.436065742824811 * r2 + 0.3851514688337912 * g + 0.14307845442264197 * b,\n y: 0.22249319175623702 * r2 + 0.7168870538238823 * g + 0.06061979053616537 * b,\n z: 0.013923904500943465 * r2 + 0.09708128566574634 * g + 0.7140993584005155 * b\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertRgbToXyz50_default = convertRgbToXyz50;\n\n // node_modules/culori/src/lab/convertXyz50ToLab.js\n var f2 = (value) => value > e3 ? Math.cbrt(value) : (k3 * value + 16) / 116;\n var convertXyz50ToLab = ({ x, y, z, alpha: alpha2 }) => {\n if (x === void 0) x = 0;\n if (y === void 0) y = 0;\n if (z === void 0) z = 0;\n let f0 = f2(x / D50.X);\n let f1 = f2(y / D50.Y);\n let f22 = f2(z / D50.Z);\n let res = {\n mode: \"lab\",\n l: 116 * f1 - 16,\n a: 500 * (f0 - f1),\n b: 200 * (f1 - f22)\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertXyz50ToLab_default = convertXyz50ToLab;\n\n // node_modules/culori/src/lab/convertRgbToLab.js\n var convertRgbToLab = (rgb4) => {\n let res = convertXyz50ToLab_default(convertRgbToXyz50_default(rgb4));\n if (rgb4.r === rgb4.b && rgb4.b === rgb4.g) {\n res.a = res.b = 0;\n }\n return res;\n };\n var convertRgbToLab_default = convertRgbToLab;\n\n // node_modules/culori/src/lab/parseLab.js\n function parseLab(color, parsed) {\n if (!parsed || parsed[0] !== \"lab\") {\n return void 0;\n }\n const res = { mode: \"lab\" };\n const [, l, a, b, alpha2] = parsed;\n if (l.type === Tok.Hue || a.type === Tok.Hue || b.type === Tok.Hue) {\n return void 0;\n }\n if (l.type !== Tok.None) {\n res.l = Math.min(Math.max(0, l.value), 100);\n }\n if (a.type !== Tok.None) {\n res.a = a.type === Tok.Number ? a.value : a.value * 125 / 100;\n }\n if (b.type !== Tok.None) {\n res.b = b.type === Tok.Number ? b.value : b.value * 125 / 100;\n }\n if (alpha2.type !== Tok.None) {\n res.alpha = Math.min(\n 1,\n Math.max(\n 0,\n alpha2.type === Tok.Number ? alpha2.value : alpha2.value / 100\n )\n );\n }\n return res;\n }\n var parseLab_default = parseLab;\n\n // node_modules/culori/src/lab/definition.js\n var definition13 = {\n mode: \"lab\",\n toMode: {\n xyz50: convertLabToXyz50_default,\n rgb: convertLabToRgb_default\n },\n fromMode: {\n xyz50: convertXyz50ToLab_default,\n rgb: convertRgbToLab_default\n },\n channels: [\"l\", \"a\", \"b\", \"alpha\"],\n ranges: {\n l: [0, 100],\n a: [-125, 125],\n b: [-125, 125]\n },\n parse: [parseLab_default],\n serialize: (c2) => `lab(${c2.l !== void 0 ? c2.l : \"none\"} ${c2.a !== void 0 ? c2.a : \"none\"} ${c2.b !== void 0 ? c2.b : \"none\"}${c2.alpha < 1 ? ` / ${c2.alpha}` : \"\"})`,\n interpolate: {\n l: interpolatorLinear,\n a: interpolatorLinear,\n b: interpolatorLinear,\n alpha: { use: interpolatorLinear, fixup: fixupAlpha }\n }\n };\n var definition_default13 = definition13;\n\n // node_modules/culori/src/lab65/definition.js\n var definition14 = {\n ...definition_default13,\n mode: \"lab65\",\n parse: [\"--lab-d65\"],\n serialize: \"--lab-d65\",\n toMode: {\n xyz65: convertLab65ToXyz65_default,\n rgb: convertLab65ToRgb_default\n },\n fromMode: {\n xyz65: convertXyz65ToLab65_default,\n rgb: convertRgbToLab65_default\n },\n ranges: {\n l: [0, 100],\n a: [-125, 125],\n b: [-125, 125]\n }\n };\n var definition_default14 = definition14;\n\n // node_modules/culori/src/lch/parseLch.js\n function parseLch(color, parsed) {\n if (!parsed || parsed[0] !== \"lch\") {\n return void 0;\n }\n const res = { mode: \"lch\" };\n const [, l, c2, h, alpha2] = parsed;\n if (l.type !== Tok.None) {\n if (l.type === Tok.Hue) {\n return void 0;\n }\n res.l = Math.min(Math.max(0, l.value), 100);\n }\n if (c2.type !== Tok.None) {\n res.c = Math.max(\n 0,\n c2.type === Tok.Number ? c2.value : c2.value * 150 / 100\n );\n }\n if (h.type !== Tok.None) {\n if (h.type === Tok.Percentage) {\n return void 0;\n }\n res.h = h.value;\n }\n if (alpha2.type !== Tok.None) {\n res.alpha = Math.min(\n 1,\n Math.max(\n 0,\n alpha2.type === Tok.Number ? alpha2.value : alpha2.value / 100\n )\n );\n }\n return res;\n }\n var parseLch_default = parseLch;\n\n // node_modules/culori/src/lch/definition.js\n var definition15 = {\n mode: \"lch\",\n toMode: {\n lab: convertLchToLab_default,\n rgb: (c2) => convertLabToRgb_default(convertLchToLab_default(c2))\n },\n fromMode: {\n rgb: (c2) => convertLabToLch_default(convertRgbToLab_default(c2)),\n lab: convertLabToLch_default\n },\n channels: [\"l\", \"c\", \"h\", \"alpha\"],\n ranges: {\n l: [0, 100],\n c: [0, 150],\n h: [0, 360]\n },\n parse: [parseLch_default],\n serialize: (c2) => `lch(${c2.l !== void 0 ? c2.l : \"none\"} ${c2.c !== void 0 ? c2.c : \"none\"} ${c2.h !== void 0 ? c2.h : \"none\"}${c2.alpha < 1 ? ` / ${c2.alpha}` : \"\"})`,\n interpolate: {\n h: { use: interpolatorLinear, fixup: fixupHueShorter },\n c: interpolatorLinear,\n l: interpolatorLinear,\n alpha: { use: interpolatorLinear, fixup: fixupAlpha }\n },\n difference: {\n h: differenceHueChroma\n },\n average: {\n h: averageAngle\n }\n };\n var definition_default15 = definition15;\n\n // node_modules/culori/src/lch65/definition.js\n var definition16 = {\n ...definition_default15,\n mode: \"lch65\",\n parse: [\"--lch-d65\"],\n serialize: \"--lch-d65\",\n toMode: {\n lab65: (c2) => convertLchToLab_default(c2, \"lab65\"),\n rgb: (c2) => convertLab65ToRgb_default(convertLchToLab_default(c2, \"lab65\"))\n },\n fromMode: {\n rgb: (c2) => convertLabToLch_default(convertRgbToLab65_default(c2), \"lch65\"),\n lab65: (c2) => convertLabToLch_default(c2, \"lch65\")\n },\n ranges: {\n l: [0, 100],\n c: [0, 150],\n h: [0, 360]\n }\n };\n var definition_default16 = definition16;\n\n // node_modules/culori/src/lchuv/convertLuvToLchuv.js\n var convertLuvToLchuv = ({ l, u, v, alpha: alpha2 }) => {\n if (u === void 0) u = 0;\n if (v === void 0) v = 0;\n let c2 = Math.sqrt(u * u + v * v);\n let res = {\n mode: \"lchuv\",\n l,\n c: c2\n };\n if (c2) {\n res.h = normalizeHue_default(Math.atan2(v, u) * 180 / Math.PI);\n }\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertLuvToLchuv_default = convertLuvToLchuv;\n\n // node_modules/culori/src/lchuv/convertLchuvToLuv.js\n var convertLchuvToLuv = ({ l, c: c2, h, alpha: alpha2 }) => {\n if (h === void 0) h = 0;\n let res = {\n mode: \"luv\",\n l,\n u: c2 ? c2 * Math.cos(h / 180 * Math.PI) : 0,\n v: c2 ? c2 * Math.sin(h / 180 * Math.PI) : 0\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertLchuvToLuv_default = convertLchuvToLuv;\n\n // node_modules/culori/src/luv/convertXyz50ToLuv.js\n var u_fn = (x, y, z) => 4 * x / (x + 15 * y + 3 * z);\n var v_fn = (x, y, z) => 9 * y / (x + 15 * y + 3 * z);\n var un = u_fn(D50.X, D50.Y, D50.Z);\n var vn = v_fn(D50.X, D50.Y, D50.Z);\n var l_fn = (value) => value <= e3 ? k3 * value : 116 * Math.cbrt(value) - 16;\n var convertXyz50ToLuv = ({ x, y, z, alpha: alpha2 }) => {\n if (x === void 0) x = 0;\n if (y === void 0) y = 0;\n if (z === void 0) z = 0;\n let l = l_fn(y / D50.Y);\n let u = u_fn(x, y, z);\n let v = v_fn(x, y, z);\n if (!isFinite(u) || !isFinite(v)) {\n l = u = v = 0;\n } else {\n u = 13 * l * (u - un);\n v = 13 * l * (v - vn);\n }\n let res = {\n mode: \"luv\",\n l,\n u,\n v\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertXyz50ToLuv_default = convertXyz50ToLuv;\n\n // node_modules/culori/src/luv/convertLuvToXyz50.js\n var u_fn2 = (x, y, z) => 4 * x / (x + 15 * y + 3 * z);\n var v_fn2 = (x, y, z) => 9 * y / (x + 15 * y + 3 * z);\n var un2 = u_fn2(D50.X, D50.Y, D50.Z);\n var vn2 = v_fn2(D50.X, D50.Y, D50.Z);\n var convertLuvToXyz50 = ({ l, u, v, alpha: alpha2 }) => {\n if (l === void 0) l = 0;\n if (l === 0) {\n return { mode: \"xyz50\", x: 0, y: 0, z: 0 };\n }\n if (u === void 0) u = 0;\n if (v === void 0) v = 0;\n let up = u / (13 * l) + un2;\n let vp = v / (13 * l) + vn2;\n let y = D50.Y * (l <= 8 ? l / k3 : Math.pow((l + 16) / 116, 3));\n let x = y * (9 * up) / (4 * vp);\n let z = y * (12 - 3 * up - 20 * vp) / (4 * vp);\n let res = { mode: \"xyz50\", x, y, z };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertLuvToXyz50_default = convertLuvToXyz50;\n\n // node_modules/culori/src/lchuv/definition.js\n var convertRgbToLchuv = (rgb4) => convertLuvToLchuv_default(convertXyz50ToLuv_default(convertRgbToXyz50_default(rgb4)));\n var convertLchuvToRgb = (lchuv2) => convertXyz50ToRgb_default(convertLuvToXyz50_default(convertLchuvToLuv_default(lchuv2)));\n var definition17 = {\n mode: \"lchuv\",\n toMode: {\n luv: convertLchuvToLuv_default,\n rgb: convertLchuvToRgb\n },\n fromMode: {\n rgb: convertRgbToLchuv,\n luv: convertLuvToLchuv_default\n },\n channels: [\"l\", \"c\", \"h\", \"alpha\"],\n parse: [\"--lchuv\"],\n serialize: \"--lchuv\",\n ranges: {\n l: [0, 100],\n c: [0, 176.956],\n h: [0, 360]\n },\n interpolate: {\n h: { use: interpolatorLinear, fixup: fixupHueShorter },\n c: interpolatorLinear,\n l: interpolatorLinear,\n alpha: { use: interpolatorLinear, fixup: fixupAlpha }\n },\n difference: {\n h: differenceHueChroma\n },\n average: {\n h: averageAngle\n }\n };\n var definition_default17 = definition17;\n\n // node_modules/culori/src/lrgb/definition.js\n var definition18 = {\n ...definition_default,\n mode: \"lrgb\",\n toMode: {\n rgb: convertLrgbToRgb_default\n },\n fromMode: {\n rgb: convertRgbToLrgb_default\n },\n parse: [\"srgb-linear\"],\n serialize: \"srgb-linear\"\n };\n var definition_default18 = definition18;\n\n // node_modules/culori/src/luv/definition.js\n var definition19 = {\n mode: \"luv\",\n toMode: {\n xyz50: convertLuvToXyz50_default,\n rgb: (luv2) => convertXyz50ToRgb_default(convertLuvToXyz50_default(luv2))\n },\n fromMode: {\n xyz50: convertXyz50ToLuv_default,\n rgb: (rgb4) => convertXyz50ToLuv_default(convertRgbToXyz50_default(rgb4))\n },\n channels: [\"l\", \"u\", \"v\", \"alpha\"],\n parse: [\"--luv\"],\n serialize: \"--luv\",\n ranges: {\n l: [0, 100],\n u: [-84.936, 175.042],\n v: [-125.882, 87.243]\n },\n interpolate: {\n l: interpolatorLinear,\n u: interpolatorLinear,\n v: interpolatorLinear,\n alpha: { use: interpolatorLinear, fixup: fixupAlpha }\n }\n };\n var definition_default19 = definition19;\n\n // node_modules/culori/src/oklab/convertLrgbToOklab.js\n var convertLrgbToOklab = ({ r: r2, g, b, alpha: alpha2 }) => {\n if (r2 === void 0) r2 = 0;\n if (g === void 0) g = 0;\n if (b === void 0) b = 0;\n let L = Math.cbrt(\n 0.412221469470763 * r2 + 0.5363325372617348 * g + 0.0514459932675022 * b\n );\n let M3 = Math.cbrt(\n 0.2119034958178252 * r2 + 0.6806995506452344 * g + 0.1073969535369406 * b\n );\n let S = Math.cbrt(\n 0.0883024591900564 * r2 + 0.2817188391361215 * g + 0.6299787016738222 * b\n );\n let res = {\n mode: \"oklab\",\n l: 0.210454268309314 * L + 0.7936177747023054 * M3 - 0.0040720430116193 * S,\n a: 1.9779985324311684 * L - 2.42859224204858 * M3 + 0.450593709617411 * S,\n b: 0.0259040424655478 * L + 0.7827717124575296 * M3 - 0.8086757549230774 * S\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertLrgbToOklab_default = convertLrgbToOklab;\n\n // node_modules/culori/src/oklab/convertRgbToOklab.js\n var convertRgbToOklab = (rgb4) => {\n let res = convertLrgbToOklab_default(convertRgbToLrgb_default(rgb4));\n if (rgb4.r === rgb4.b && rgb4.b === rgb4.g) {\n res.a = res.b = 0;\n }\n return res;\n };\n var convertRgbToOklab_default = convertRgbToOklab;\n\n // node_modules/culori/src/oklab/convertOklabToLrgb.js\n var convertOklabToLrgb = ({ l, a, b, alpha: alpha2 }) => {\n if (l === void 0) l = 0;\n if (a === void 0) a = 0;\n if (b === void 0) b = 0;\n let L = Math.pow(l + 0.3963377773761749 * a + 0.2158037573099136 * b, 3);\n let M3 = Math.pow(l - 0.1055613458156586 * a - 0.0638541728258133 * b, 3);\n let S = Math.pow(l - 0.0894841775298119 * a - 1.2914855480194092 * b, 3);\n let res = {\n mode: \"lrgb\",\n r: 4.076741636075957 * L - 3.3077115392580616 * M3 + 0.2309699031821044 * S,\n g: -1.2684379732850317 * L + 2.6097573492876887 * M3 - 0.3413193760026573 * S,\n b: -0.0041960761386756 * L - 0.7034186179359362 * M3 + 1.7076146940746117 * S\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertOklabToLrgb_default = convertOklabToLrgb;\n\n // node_modules/culori/src/oklab/convertOklabToRgb.js\n var convertOklabToRgb = (c2) => convertLrgbToRgb_default(convertOklabToLrgb_default(c2));\n var convertOklabToRgb_default = convertOklabToRgb;\n\n // node_modules/culori/src/okhsl/helpers.js\n function toe(x) {\n const k_1 = 0.206;\n const k_2 = 0.03;\n const k_3 = (1 + k_1) / (1 + k_2);\n return 0.5 * (k_3 * x - k_1 + Math.sqrt((k_3 * x - k_1) * (k_3 * x - k_1) + 4 * k_2 * k_3 * x));\n }\n function toe_inv(x) {\n const k_1 = 0.206;\n const k_2 = 0.03;\n const k_3 = (1 + k_1) / (1 + k_2);\n return (x * x + k_1 * x) / (k_3 * (x + k_2));\n }\n function compute_max_saturation(a, b) {\n let k0, k1, k22, k32, k4, wl, wm, ws;\n if (-1.88170328 * a - 0.80936493 * b > 1) {\n k0 = 1.19086277;\n k1 = 1.76576728;\n k22 = 0.59662641;\n k32 = 0.75515197;\n k4 = 0.56771245;\n wl = 4.0767416621;\n wm = -3.3077115913;\n ws = 0.2309699292;\n } else if (1.81444104 * a - 1.19445276 * b > 1) {\n k0 = 0.73956515;\n k1 = -0.45954404;\n k22 = 0.08285427;\n k32 = 0.1254107;\n k4 = 0.14503204;\n wl = -1.2684380046;\n wm = 2.6097574011;\n ws = -0.3413193965;\n } else {\n k0 = 1.35733652;\n k1 = -915799e-8;\n k22 = -1.1513021;\n k32 = -0.50559606;\n k4 = 692167e-8;\n wl = -0.0041960863;\n wm = -0.7034186147;\n ws = 1.707614701;\n }\n let S = k0 + k1 * a + k22 * b + k32 * a * a + k4 * a * b;\n let k_l = 0.3963377774 * a + 0.2158037573 * b;\n let k_m = -0.1055613458 * a - 0.0638541728 * b;\n let k_s = -0.0894841775 * a - 1.291485548 * b;\n {\n let l_ = 1 + S * k_l;\n let m_ = 1 + S * k_m;\n let s_ = 1 + S * k_s;\n let l = l_ * l_ * l_;\n let m = m_ * m_ * m_;\n let s = s_ * s_ * s_;\n let l_dS = 3 * k_l * l_ * l_;\n let m_dS = 3 * k_m * m_ * m_;\n let s_dS = 3 * k_s * s_ * s_;\n let l_dS2 = 6 * k_l * k_l * l_;\n let m_dS2 = 6 * k_m * k_m * m_;\n let s_dS2 = 6 * k_s * k_s * s_;\n let f3 = wl * l + wm * m + ws * s;\n let f1 = wl * l_dS + wm * m_dS + ws * s_dS;\n let f22 = wl * l_dS2 + wm * m_dS2 + ws * s_dS2;\n S = S - f3 * f1 / (f1 * f1 - 0.5 * f3 * f22);\n }\n return S;\n }\n function find_cusp(a, b) {\n let S_cusp = compute_max_saturation(a, b);\n let rgb4 = convertOklabToLrgb_default({ l: 1, a: S_cusp * a, b: S_cusp * b });\n let L_cusp = Math.cbrt(1 / Math.max(rgb4.r, rgb4.g, rgb4.b));\n let C_cusp = L_cusp * S_cusp;\n return [L_cusp, C_cusp];\n }\n function find_gamut_intersection(a, b, L1, C12, L0, cusp = null) {\n if (!cusp) {\n cusp = find_cusp(a, b);\n }\n let t;\n if ((L1 - L0) * cusp[1] - (cusp[0] - L0) * C12 <= 0) {\n t = cusp[1] * L0 / (C12 * cusp[0] + cusp[1] * (L0 - L1));\n } else {\n t = cusp[1] * (L0 - 1) / (C12 * (cusp[0] - 1) + cusp[1] * (L0 - L1));\n {\n let dL = L1 - L0;\n let dC = C12;\n let k_l = 0.3963377774 * a + 0.2158037573 * b;\n let k_m = -0.1055613458 * a - 0.0638541728 * b;\n let k_s = -0.0894841775 * a - 1.291485548 * b;\n let l_dt = dL + dC * k_l;\n let m_dt = dL + dC * k_m;\n let s_dt = dL + dC * k_s;\n {\n let L = L0 * (1 - t) + t * L1;\n let C = t * C12;\n let l_ = L + C * k_l;\n let m_ = L + C * k_m;\n let s_ = L + C * k_s;\n let l = l_ * l_ * l_;\n let m = m_ * m_ * m_;\n let s = s_ * s_ * s_;\n let ldt = 3 * l_dt * l_ * l_;\n let mdt = 3 * m_dt * m_ * m_;\n let sdt = 3 * s_dt * s_ * s_;\n let ldt2 = 6 * l_dt * l_dt * l_;\n let mdt2 = 6 * m_dt * m_dt * m_;\n let sdt2 = 6 * s_dt * s_dt * s_;\n let r2 = 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s - 1;\n let r1 = 4.0767416621 * ldt - 3.3077115913 * mdt + 0.2309699292 * sdt;\n let r22 = 4.0767416621 * ldt2 - 3.3077115913 * mdt2 + 0.2309699292 * sdt2;\n let u_r = r1 / (r1 * r1 - 0.5 * r2 * r22);\n let t_r = -r2 * u_r;\n let g = -1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s - 1;\n let g1 = -1.2684380046 * ldt + 2.6097574011 * mdt - 0.3413193965 * sdt;\n let g2 = -1.2684380046 * ldt2 + 2.6097574011 * mdt2 - 0.3413193965 * sdt2;\n let u_g = g1 / (g1 * g1 - 0.5 * g * g2);\n let t_g = -g * u_g;\n let b2 = -0.0041960863 * l - 0.7034186147 * m + 1.707614701 * s - 1;\n let b1 = -0.0041960863 * ldt - 0.7034186147 * mdt + 1.707614701 * sdt;\n let b22 = -0.0041960863 * ldt2 - 0.7034186147 * mdt2 + 1.707614701 * sdt2;\n let u_b = b1 / (b1 * b1 - 0.5 * b2 * b22);\n let t_b = -b2 * u_b;\n t_r = u_r >= 0 ? t_r : 1e6;\n t_g = u_g >= 0 ? t_g : 1e6;\n t_b = u_b >= 0 ? t_b : 1e6;\n t += Math.min(t_r, Math.min(t_g, t_b));\n }\n }\n }\n return t;\n }\n function get_ST_max(a_, b_, cusp = null) {\n if (!cusp) {\n cusp = find_cusp(a_, b_);\n }\n let L = cusp[0];\n let C = cusp[1];\n return [C / L, C / (1 - L)];\n }\n function get_Cs(L, a_, b_) {\n let cusp = find_cusp(a_, b_);\n let C_max = find_gamut_intersection(a_, b_, L, 1, L, cusp);\n let ST_max = get_ST_max(a_, b_, cusp);\n let S_mid = 0.11516993 + 1 / (7.4477897 + 4.1590124 * b_ + a_ * (-2.19557347 + 1.75198401 * b_ + a_ * (-2.13704948 - 10.02301043 * b_ + a_ * (-4.24894561 + 5.38770819 * b_ + 4.69891013 * a_))));\n let T_mid = 0.11239642 + 1 / (1.6132032 - 0.68124379 * b_ + a_ * (0.40370612 + 0.90148123 * b_ + a_ * (-0.27087943 + 0.6122399 * b_ + a_ * (299215e-8 - 0.45399568 * b_ - 0.14661872 * a_))));\n let k4 = C_max / Math.min(L * ST_max[0], (1 - L) * ST_max[1]);\n let C_a = L * S_mid;\n let C_b = (1 - L) * T_mid;\n let C_mid = 0.9 * k4 * Math.sqrt(\n Math.sqrt(\n 1 / (1 / (C_a * C_a * C_a * C_a) + 1 / (C_b * C_b * C_b * C_b))\n )\n );\n C_a = L * 0.4;\n C_b = (1 - L) * 0.8;\n let C_0 = Math.sqrt(1 / (1 / (C_a * C_a) + 1 / (C_b * C_b)));\n return [C_0, C_mid, C_max];\n }\n\n // node_modules/culori/src/okhsl/convertOklabToOkhsl.js\n function convertOklabToOkhsl(lab2) {\n const l = lab2.l !== void 0 ? lab2.l : 0;\n const a = lab2.a !== void 0 ? lab2.a : 0;\n const b = lab2.b !== void 0 ? lab2.b : 0;\n const ret = { mode: \"okhsl\", l: toe(l) };\n if (lab2.alpha !== void 0) {\n ret.alpha = lab2.alpha;\n }\n let c2 = Math.sqrt(a * a + b * b);\n if (!c2) {\n ret.s = 0;\n return ret;\n }\n let [C_0, C_mid, C_max] = get_Cs(l, a / c2, b / c2);\n let s;\n if (c2 < C_mid) {\n let k_0 = 0;\n let k_1 = 0.8 * C_0;\n let k_2 = 1 - k_1 / C_mid;\n let t = (c2 - k_0) / (k_1 + k_2 * (c2 - k_0));\n s = t * 0.8;\n } else {\n let k_0 = C_mid;\n let k_1 = 0.2 * C_mid * C_mid * 1.25 * 1.25 / C_0;\n let k_2 = 1 - k_1 / (C_max - C_mid);\n let t = (c2 - k_0) / (k_1 + k_2 * (c2 - k_0));\n s = 0.8 + 0.2 * t;\n }\n if (s) {\n ret.s = s;\n ret.h = normalizeHue_default(Math.atan2(b, a) * 180 / Math.PI);\n }\n return ret;\n }\n\n // node_modules/culori/src/okhsl/convertOkhslToOklab.js\n function convertOkhslToOklab(hsl3) {\n let h = hsl3.h !== void 0 ? hsl3.h : 0;\n let s = hsl3.s !== void 0 ? hsl3.s : 0;\n let l = hsl3.l !== void 0 ? hsl3.l : 0;\n const ret = { mode: \"oklab\", l: toe_inv(l) };\n if (hsl3.alpha !== void 0) {\n ret.alpha = hsl3.alpha;\n }\n if (!s || l === 1) {\n ret.a = ret.b = 0;\n return ret;\n }\n let a_ = Math.cos(h / 180 * Math.PI);\n let b_ = Math.sin(h / 180 * Math.PI);\n let [C_0, C_mid, C_max] = get_Cs(ret.l, a_, b_);\n let t, k_0, k_1, k_2;\n if (s < 0.8) {\n t = 1.25 * s;\n k_0 = 0;\n k_1 = 0.8 * C_0;\n k_2 = 1 - k_1 / C_mid;\n } else {\n t = 5 * (s - 0.8);\n k_0 = C_mid;\n k_1 = 0.2 * C_mid * C_mid * 1.25 * 1.25 / C_0;\n k_2 = 1 - k_1 / (C_max - C_mid);\n }\n let C = k_0 + t * k_1 / (1 - k_2 * t);\n ret.a = C * a_;\n ret.b = C * b_;\n return ret;\n }\n\n // node_modules/culori/src/okhsl/modeOkhsl.js\n var modeOkhsl = {\n ...definition_default7,\n mode: \"okhsl\",\n channels: [\"h\", \"s\", \"l\", \"alpha\"],\n parse: [\"--okhsl\"],\n serialize: \"--okhsl\",\n fromMode: {\n oklab: convertOklabToOkhsl,\n rgb: (c2) => convertOklabToOkhsl(convertRgbToOklab_default(c2))\n },\n toMode: {\n oklab: convertOkhslToOklab,\n rgb: (c2) => convertOklabToRgb_default(convertOkhslToOklab(c2))\n }\n };\n var modeOkhsl_default = modeOkhsl;\n\n // node_modules/culori/src/okhsv/convertOklabToOkhsv.js\n function convertOklabToOkhsv(lab2) {\n let l = lab2.l !== void 0 ? lab2.l : 0;\n let a = lab2.a !== void 0 ? lab2.a : 0;\n let b = lab2.b !== void 0 ? lab2.b : 0;\n let c2 = Math.sqrt(a * a + b * b);\n let a_ = c2 ? a / c2 : 1;\n let b_ = c2 ? b / c2 : 1;\n let [S_max, T] = get_ST_max(a_, b_);\n let S_0 = 0.5;\n let k4 = 1 - S_0 / S_max;\n let t = T / (c2 + l * T);\n let L_v = t * l;\n let C_v = t * c2;\n let L_vt = toe_inv(L_v);\n let C_vt = C_v * L_vt / L_v;\n let rgb_scale = convertOklabToLrgb_default({ l: L_vt, a: a_ * C_vt, b: b_ * C_vt });\n let scale_L = Math.cbrt(\n 1 / Math.max(rgb_scale.r, rgb_scale.g, rgb_scale.b, 0)\n );\n l = l / scale_L;\n c2 = c2 / scale_L * toe(l) / l;\n l = toe(l);\n const ret = {\n mode: \"okhsv\",\n s: c2 ? (S_0 + T) * C_v / (T * S_0 + T * k4 * C_v) : 0,\n v: l ? l / L_v : 0\n };\n if (ret.s) {\n ret.h = normalizeHue_default(Math.atan2(b, a) * 180 / Math.PI);\n }\n if (lab2.alpha !== void 0) {\n ret.alpha = lab2.alpha;\n }\n return ret;\n }\n\n // node_modules/culori/src/okhsv/convertOkhsvToOklab.js\n function convertOkhsvToOklab(hsv2) {\n const ret = { mode: \"oklab\" };\n if (hsv2.alpha !== void 0) {\n ret.alpha = hsv2.alpha;\n }\n const h = hsv2.h !== void 0 ? hsv2.h : 0;\n const s = hsv2.s !== void 0 ? hsv2.s : 0;\n const v = hsv2.v !== void 0 ? hsv2.v : 0;\n const a_ = Math.cos(h / 180 * Math.PI);\n const b_ = Math.sin(h / 180 * Math.PI);\n const [S_max, T] = get_ST_max(a_, b_);\n const S_0 = 0.5;\n const k4 = 1 - S_0 / S_max;\n const L_v = 1 - s * S_0 / (S_0 + T - T * k4 * s);\n const C_v = s * T * S_0 / (S_0 + T - T * k4 * s);\n const L_vt = toe_inv(L_v);\n const C_vt = C_v * L_vt / L_v;\n const rgb_scale = convertOklabToLrgb_default({\n l: L_vt,\n a: a_ * C_vt,\n b: b_ * C_vt\n });\n const scale_L = Math.cbrt(\n 1 / Math.max(rgb_scale.r, rgb_scale.g, rgb_scale.b, 0)\n );\n const L_new = toe_inv(v * L_v);\n const C = C_v * L_new / L_v;\n ret.l = L_new * scale_L;\n ret.a = C * a_ * scale_L;\n ret.b = C * b_ * scale_L;\n return ret;\n }\n\n // node_modules/culori/src/okhsv/modeOkhsv.js\n var modeOkhsv = {\n ...definition_default8,\n mode: \"okhsv\",\n channels: [\"h\", \"s\", \"v\", \"alpha\"],\n parse: [\"--okhsv\"],\n serialize: \"--okhsv\",\n fromMode: {\n oklab: convertOklabToOkhsv,\n rgb: (c2) => convertOklabToOkhsv(convertRgbToOklab_default(c2))\n },\n toMode: {\n oklab: convertOkhsvToOklab,\n rgb: (c2) => convertOklabToRgb_default(convertOkhsvToOklab(c2))\n }\n };\n var modeOkhsv_default = modeOkhsv;\n\n // node_modules/culori/src/oklab/parseOklab.js\n function parseOklab(color, parsed) {\n if (!parsed || parsed[0] !== \"oklab\") {\n return void 0;\n }\n const res = { mode: \"oklab\" };\n const [, l, a, b, alpha2] = parsed;\n if (l.type === Tok.Hue || a.type === Tok.Hue || b.type === Tok.Hue) {\n return void 0;\n }\n if (l.type !== Tok.None) {\n res.l = Math.min(\n Math.max(0, l.type === Tok.Number ? l.value : l.value / 100),\n 1\n );\n }\n if (a.type !== Tok.None) {\n res.a = a.type === Tok.Number ? a.value : a.value * 0.4 / 100;\n }\n if (b.type !== Tok.None) {\n res.b = b.type === Tok.Number ? b.value : b.value * 0.4 / 100;\n }\n if (alpha2.type !== Tok.None) {\n res.alpha = Math.min(\n 1,\n Math.max(\n 0,\n alpha2.type === Tok.Number ? alpha2.value : alpha2.value / 100\n )\n );\n }\n return res;\n }\n var parseOklab_default = parseOklab;\n\n // node_modules/culori/src/oklab/definition.js\n var definition20 = {\n ...definition_default13,\n mode: \"oklab\",\n toMode: {\n lrgb: convertOklabToLrgb_default,\n rgb: convertOklabToRgb_default\n },\n fromMode: {\n lrgb: convertLrgbToOklab_default,\n rgb: convertRgbToOklab_default\n },\n ranges: {\n l: [0, 1],\n a: [-0.4, 0.4],\n b: [-0.4, 0.4]\n },\n parse: [parseOklab_default],\n serialize: (c2) => `oklab(${c2.l !== void 0 ? c2.l : \"none\"} ${c2.a !== void 0 ? c2.a : \"none\"} ${c2.b !== void 0 ? c2.b : \"none\"}${c2.alpha < 1 ? ` / ${c2.alpha}` : \"\"})`\n };\n var definition_default20 = definition20;\n\n // node_modules/culori/src/oklch/parseOklch.js\n function parseOklch(color, parsed) {\n if (!parsed || parsed[0] !== \"oklch\") {\n return void 0;\n }\n const res = { mode: \"oklch\" };\n const [, l, c2, h, alpha2] = parsed;\n if (l.type !== Tok.None) {\n if (l.type === Tok.Hue) {\n return void 0;\n }\n res.l = Math.min(\n Math.max(0, l.type === Tok.Number ? l.value : l.value / 100),\n 1\n );\n }\n if (c2.type !== Tok.None) {\n res.c = Math.max(\n 0,\n c2.type === Tok.Number ? c2.value : c2.value * 0.4 / 100\n );\n }\n if (h.type !== Tok.None) {\n if (h.type === Tok.Percentage) {\n return void 0;\n }\n res.h = h.value;\n }\n if (alpha2.type !== Tok.None) {\n res.alpha = Math.min(\n 1,\n Math.max(\n 0,\n alpha2.type === Tok.Number ? alpha2.value : alpha2.value / 100\n )\n );\n }\n return res;\n }\n var parseOklch_default = parseOklch;\n\n // node_modules/culori/src/oklch/definition.js\n var definition21 = {\n ...definition_default15,\n mode: \"oklch\",\n toMode: {\n oklab: (c2) => convertLchToLab_default(c2, \"oklab\"),\n rgb: (c2) => convertOklabToRgb_default(convertLchToLab_default(c2, \"oklab\"))\n },\n fromMode: {\n rgb: (c2) => convertLabToLch_default(convertRgbToOklab_default(c2), \"oklch\"),\n oklab: (c2) => convertLabToLch_default(c2, \"oklch\")\n },\n parse: [parseOklch_default],\n serialize: (c2) => `oklch(${c2.l !== void 0 ? c2.l : \"none\"} ${c2.c !== void 0 ? c2.c : \"none\"} ${c2.h !== void 0 ? c2.h : \"none\"}${c2.alpha < 1 ? ` / ${c2.alpha}` : \"\"})`,\n ranges: {\n l: [0, 1],\n c: [0, 0.4],\n h: [0, 360]\n }\n };\n var definition_default21 = definition21;\n\n // node_modules/culori/src/p3/convertP3ToXyz65.js\n var convertP3ToXyz65 = (rgb4) => {\n let { r: r2, g, b, alpha: alpha2 } = convertRgbToLrgb_default(rgb4);\n let res = {\n mode: \"xyz65\",\n x: 0.486570948648216 * r2 + 0.265667693169093 * g + 0.1982172852343625 * b,\n y: 0.2289745640697487 * r2 + 0.6917385218365062 * g + 0.079286914093745 * b,\n z: 0 * r2 + 0.0451133818589026 * g + 1.043944368900976 * b\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertP3ToXyz65_default = convertP3ToXyz65;\n\n // node_modules/culori/src/p3/convertXyz65ToP3.js\n var convertXyz65ToP3 = ({ x, y, z, alpha: alpha2 }) => {\n if (x === void 0) x = 0;\n if (y === void 0) y = 0;\n if (z === void 0) z = 0;\n let res = convertLrgbToRgb_default(\n {\n r: x * 2.4934969119414263 - y * 0.9313836179191242 - 0.402710784450717 * z,\n g: x * -0.8294889695615749 + y * 1.7626640603183465 + 0.0236246858419436 * z,\n b: x * 0.0358458302437845 - y * 0.0761723892680418 + 0.9568845240076871 * z\n },\n \"p3\"\n );\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertXyz65ToP3_default = convertXyz65ToP3;\n\n // node_modules/culori/src/p3/definition.js\n var definition22 = {\n ...definition_default,\n mode: \"p3\",\n parse: [\"display-p3\"],\n serialize: \"display-p3\",\n fromMode: {\n rgb: (color) => convertXyz65ToP3_default(convertRgbToXyz65_default(color)),\n xyz65: convertXyz65ToP3_default\n },\n toMode: {\n rgb: (color) => convertXyz65ToRgb_default(convertP3ToXyz65_default(color)),\n xyz65: convertP3ToXyz65_default\n }\n };\n var definition_default22 = definition22;\n\n // node_modules/culori/src/prophoto/convertXyz50ToProphoto.js\n var gamma2 = (v) => {\n let abs2 = Math.abs(v);\n if (abs2 >= 1 / 512) {\n return Math.sign(v) * Math.pow(abs2, 1 / 1.8);\n }\n return 16 * v;\n };\n var convertXyz50ToProphoto = ({ x, y, z, alpha: alpha2 }) => {\n if (x === void 0) x = 0;\n if (y === void 0) y = 0;\n if (z === void 0) z = 0;\n let res = {\n mode: \"prophoto\",\n r: gamma2(\n x * 1.3457868816471585 - y * 0.2555720873797946 - 0.0511018649755453 * z\n ),\n g: gamma2(\n x * -0.5446307051249019 + y * 1.5082477428451466 + 0.0205274474364214 * z\n ),\n b: gamma2(x * 0 + y * 0 + 1.2119675456389452 * z)\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertXyz50ToProphoto_default = convertXyz50ToProphoto;\n\n // node_modules/culori/src/prophoto/convertProphotoToXyz50.js\n var linearize2 = (v = 0) => {\n let abs2 = Math.abs(v);\n if (abs2 >= 16 / 512) {\n return Math.sign(v) * Math.pow(abs2, 1.8);\n }\n return v / 16;\n };\n var convertProphotoToXyz50 = (prophoto2) => {\n let r2 = linearize2(prophoto2.r);\n let g = linearize2(prophoto2.g);\n let b = linearize2(prophoto2.b);\n let res = {\n mode: \"xyz50\",\n x: 0.7977666449006423 * r2 + 0.1351812974005331 * g + 0.0313477341283922 * b,\n y: 0.2880748288194013 * r2 + 0.7118352342418731 * g + 899369387256e-16 * b,\n z: 0 * r2 + 0 * g + 0.8251046025104602 * b\n };\n if (prophoto2.alpha !== void 0) {\n res.alpha = prophoto2.alpha;\n }\n return res;\n };\n var convertProphotoToXyz50_default = convertProphotoToXyz50;\n\n // node_modules/culori/src/prophoto/definition.js\n var definition23 = {\n ...definition_default,\n mode: \"prophoto\",\n parse: [\"prophoto-rgb\"],\n serialize: \"prophoto-rgb\",\n fromMode: {\n xyz50: convertXyz50ToProphoto_default,\n rgb: (color) => convertXyz50ToProphoto_default(convertRgbToXyz50_default(color))\n },\n toMode: {\n xyz50: convertProphotoToXyz50_default,\n rgb: (color) => convertXyz50ToRgb_default(convertProphotoToXyz50_default(color))\n }\n };\n var definition_default23 = definition23;\n\n // node_modules/culori/src/rec2020/convertXyz65ToRec2020.js\n var \\u03B1 = 1.09929682680944;\n var \\u03B2 = 0.018053968510807;\n var gamma3 = (v) => {\n const abs2 = Math.abs(v);\n if (abs2 > \\u03B2) {\n return (Math.sign(v) || 1) * (\\u03B1 * Math.pow(abs2, 0.45) - (\\u03B1 - 1));\n }\n return 4.5 * v;\n };\n var convertXyz65ToRec2020 = ({ x, y, z, alpha: alpha2 }) => {\n if (x === void 0) x = 0;\n if (y === void 0) y = 0;\n if (z === void 0) z = 0;\n let res = {\n mode: \"rec2020\",\n r: gamma3(\n x * 1.7166511879712683 - y * 0.3556707837763925 - 0.2533662813736599 * z\n ),\n g: gamma3(\n x * -0.6666843518324893 + y * 1.6164812366349395 + 0.0157685458139111 * z\n ),\n b: gamma3(\n x * 0.0176398574453108 - y * 0.0427706132578085 + 0.9421031212354739 * z\n )\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertXyz65ToRec2020_default = convertXyz65ToRec2020;\n\n // node_modules/culori/src/rec2020/convertRec2020ToXyz65.js\n var \\u03B12 = 1.09929682680944;\n var \\u03B22 = 0.018053968510807;\n var linearize3 = (v = 0) => {\n let abs2 = Math.abs(v);\n if (abs2 < \\u03B22 * 4.5) {\n return v / 4.5;\n }\n return (Math.sign(v) || 1) * Math.pow((abs2 + \\u03B12 - 1) / \\u03B12, 1 / 0.45);\n };\n var convertRec2020ToXyz65 = (rec20202) => {\n let r2 = linearize3(rec20202.r);\n let g = linearize3(rec20202.g);\n let b = linearize3(rec20202.b);\n let res = {\n mode: \"xyz65\",\n x: 0.6369580483012911 * r2 + 0.1446169035862083 * g + 0.1688809751641721 * b,\n y: 0.262700212011267 * r2 + 0.6779980715188708 * g + 0.059301716469862 * b,\n z: 0 * r2 + 0.0280726930490874 * g + 1.0609850577107909 * b\n };\n if (rec20202.alpha !== void 0) {\n res.alpha = rec20202.alpha;\n }\n return res;\n };\n var convertRec2020ToXyz65_default = convertRec2020ToXyz65;\n\n // node_modules/culori/src/rec2020/definition.js\n var definition24 = {\n ...definition_default,\n mode: \"rec2020\",\n fromMode: {\n xyz65: convertXyz65ToRec2020_default,\n rgb: (color) => convertXyz65ToRec2020_default(convertRgbToXyz65_default(color))\n },\n toMode: {\n xyz65: convertRec2020ToXyz65_default,\n rgb: (color) => convertXyz65ToRgb_default(convertRec2020ToXyz65_default(color))\n },\n parse: [\"rec2020\"],\n serialize: \"rec2020\"\n };\n var definition_default24 = definition24;\n\n // node_modules/culori/src/xyb/constants.js\n var bias = 0.0037930732552754493;\n var bias_cbrt = Math.cbrt(bias);\n\n // node_modules/culori/src/xyb/convertRgbToXyb.js\n var transfer = (v) => Math.cbrt(v) - bias_cbrt;\n var convertRgbToXyb = (color) => {\n const { r: r2, g, b, alpha: alpha2 } = convertRgbToLrgb_default(color);\n const l = transfer(0.3 * r2 + 0.622 * g + 0.078 * b + bias);\n const m = transfer(0.23 * r2 + 0.692 * g + 0.078 * b + bias);\n const s = transfer(\n 0.2434226892454782 * r2 + 0.2047674442449682 * g + 0.5518098665095535 * b + bias\n );\n const res = {\n mode: \"xyb\",\n x: (l - m) / 2,\n y: (l + m) / 2,\n /* Apply default chroma from luma (subtract Y from B) */\n b: s - (l + m) / 2\n };\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n };\n var convertRgbToXyb_default = convertRgbToXyb;\n\n // node_modules/culori/src/xyb/convertXybToRgb.js\n var transfer2 = (v) => Math.pow(v + bias_cbrt, 3);\n var convertXybToRgb = ({ x, y, b, alpha: alpha2 }) => {\n if (x === void 0) x = 0;\n if (y === void 0) y = 0;\n if (b === void 0) b = 0;\n const l = transfer2(x + y) - bias;\n const m = transfer2(y - x) - bias;\n const s = transfer2(b + y) - bias;\n const res = convertLrgbToRgb_default({\n r: 11.031566904639861 * l - 9.866943908131562 * m - 0.16462299650829934 * s,\n g: -3.2541473810744237 * l + 4.418770377582723 * m - 0.16462299650829934 * s,\n b: -3.6588512867136815 * l + 2.7129230459360922 * m + 1.9459282407775895 * s\n });\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n };\n var convertXybToRgb_default = convertXybToRgb;\n\n // node_modules/culori/src/xyb/definition.js\n var definition25 = {\n mode: \"xyb\",\n channels: [\"x\", \"y\", \"b\", \"alpha\"],\n parse: [\"--xyb\"],\n serialize: \"--xyb\",\n toMode: {\n rgb: convertXybToRgb_default\n },\n fromMode: {\n rgb: convertRgbToXyb_default\n },\n ranges: {\n x: [-0.0154, 0.0281],\n y: [0, 0.8453],\n b: [-0.2778, 0.388]\n },\n interpolate: {\n x: interpolatorLinear,\n y: interpolatorLinear,\n b: interpolatorLinear,\n alpha: { use: interpolatorLinear, fixup: fixupAlpha }\n }\n };\n var definition_default25 = definition25;\n\n // node_modules/culori/src/xyz50/definition.js\n var definition26 = {\n mode: \"xyz50\",\n parse: [\"xyz-d50\"],\n serialize: \"xyz-d50\",\n toMode: {\n rgb: convertXyz50ToRgb_default,\n lab: convertXyz50ToLab_default\n },\n fromMode: {\n rgb: convertRgbToXyz50_default,\n lab: convertLabToXyz50_default\n },\n channels: [\"x\", \"y\", \"z\", \"alpha\"],\n ranges: {\n x: [0, 0.964],\n y: [0, 0.999],\n z: [0, 0.825]\n },\n interpolate: {\n x: interpolatorLinear,\n y: interpolatorLinear,\n z: interpolatorLinear,\n alpha: { use: interpolatorLinear, fixup: fixupAlpha }\n }\n };\n var definition_default26 = definition26;\n\n // node_modules/culori/src/xyz65/convertXyz65ToXyz50.js\n var convertXyz65ToXyz50 = (xyz652) => {\n let { x, y, z, alpha: alpha2 } = xyz652;\n if (x === void 0) x = 0;\n if (y === void 0) y = 0;\n if (z === void 0) z = 0;\n let res = {\n mode: \"xyz50\",\n x: 1.0479298208405488 * x + 0.0229467933410191 * y - 0.0501922295431356 * z,\n y: 0.0296278156881593 * x + 0.990434484573249 * y - 0.0170738250293851 * z,\n z: -0.0092430581525912 * x + 0.0150551448965779 * y + 0.7518742899580008 * z\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertXyz65ToXyz50_default = convertXyz65ToXyz50;\n\n // node_modules/culori/src/xyz65/convertXyz50ToXyz65.js\n var convertXyz50ToXyz65 = (xyz502) => {\n let { x, y, z, alpha: alpha2 } = xyz502;\n if (x === void 0) x = 0;\n if (y === void 0) y = 0;\n if (z === void 0) z = 0;\n let res = {\n mode: \"xyz65\",\n x: 0.9554734527042182 * x - 0.0230985368742614 * y + 0.0632593086610217 * z,\n y: -0.0283697069632081 * x + 1.0099954580058226 * y + 0.021041398966943 * z,\n z: 0.0123140016883199 * x - 0.0205076964334779 * y + 1.3303659366080753 * z\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertXyz50ToXyz65_default = convertXyz50ToXyz65;\n\n // node_modules/culori/src/xyz65/definition.js\n var definition27 = {\n mode: \"xyz65\",\n toMode: {\n rgb: convertXyz65ToRgb_default,\n xyz50: convertXyz65ToXyz50_default\n },\n fromMode: {\n rgb: convertRgbToXyz65_default,\n xyz50: convertXyz50ToXyz65_default\n },\n ranges: {\n x: [0, 0.95],\n y: [0, 1],\n z: [0, 1.088]\n },\n channels: [\"x\", \"y\", \"z\", \"alpha\"],\n parse: [\"xyz\", \"xyz-d65\"],\n serialize: \"xyz-d65\",\n interpolate: {\n x: interpolatorLinear,\n y: interpolatorLinear,\n z: interpolatorLinear,\n alpha: { use: interpolatorLinear, fixup: fixupAlpha }\n }\n };\n var definition_default27 = definition27;\n\n // node_modules/culori/src/yiq/convertRgbToYiq.js\n var convertRgbToYiq = ({ r: r2, g, b, alpha: alpha2 }) => {\n if (r2 === void 0) r2 = 0;\n if (g === void 0) g = 0;\n if (b === void 0) b = 0;\n const res = {\n mode: \"yiq\",\n y: 0.29889531 * r2 + 0.58662247 * g + 0.11448223 * b,\n i: 0.59597799 * r2 - 0.2741761 * g - 0.32180189 * b,\n q: 0.21147017 * r2 - 0.52261711 * g + 0.31114694 * b\n };\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n };\n var convertRgbToYiq_default = convertRgbToYiq;\n\n // node_modules/culori/src/yiq/convertYiqToRgb.js\n var convertYiqToRgb = ({ y, i, q, alpha: alpha2 }) => {\n if (y === void 0) y = 0;\n if (i === void 0) i = 0;\n if (q === void 0) q = 0;\n const res = {\n mode: \"rgb\",\n r: y + 0.95608445 * i + 0.6208885 * q,\n g: y - 0.27137664 * i - 0.6486059 * q,\n b: y - 1.10561724 * i + 1.70250126 * q\n };\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n };\n var convertYiqToRgb_default = convertYiqToRgb;\n\n // node_modules/culori/src/yiq/definition.js\n var definition28 = {\n mode: \"yiq\",\n toMode: {\n rgb: convertYiqToRgb_default\n },\n fromMode: {\n rgb: convertRgbToYiq_default\n },\n channels: [\"y\", \"i\", \"q\", \"alpha\"],\n parse: [\"--yiq\"],\n serialize: \"--yiq\",\n ranges: {\n i: [-0.595, 0.595],\n q: [-0.522, 0.522]\n },\n interpolate: {\n y: interpolatorLinear,\n i: interpolatorLinear,\n q: interpolatorLinear,\n alpha: { use: interpolatorLinear, fixup: fixupAlpha }\n }\n };\n var definition_default28 = definition28;\n\n // node_modules/culori/src/round.js\n var r = (value, precision) => Math.round(value * (precision = Math.pow(10, precision))) / precision;\n var round = (precision = 4) => (value) => typeof value === \"number\" ? r(value, precision) : value;\n var round_default = round;\n\n // node_modules/culori/src/formatter.js\n var twoDecimals = round_default(2);\n var clamp = (value) => Math.max(0, Math.min(1, value || 0));\n var fixup = (value) => Math.round(clamp(value) * 255);\n var rgb = converter_default(\"rgb\");\n var hsl = converter_default(\"hsl\");\n var serializeHex = (color) => {\n if (color === void 0) {\n return void 0;\n }\n let r2 = fixup(color.r);\n let g = fixup(color.g);\n let b = fixup(color.b);\n return \"#\" + (1 << 24 | r2 << 16 | g << 8 | b).toString(16).slice(1);\n };\n var serializeRgb = (color) => {\n if (color === void 0) {\n return void 0;\n }\n let r2 = fixup(color.r);\n let g = fixup(color.g);\n let b = fixup(color.b);\n if (color.alpha === void 0 || color.alpha === 1) {\n return `rgb(${r2}, ${g}, ${b})`;\n } else {\n return `rgba(${r2}, ${g}, ${b}, ${twoDecimals(clamp(color.alpha))})`;\n }\n };\n var formatHex = (c2) => serializeHex(rgb(c2));\n var formatRgb = (c2) => serializeRgb(rgb(c2));\n\n // node_modules/culori/src/clamp.js\n var rgb2 = converter_default(\"rgb\");\n var fixup_rgb = (c2) => {\n const res = {\n mode: c2.mode,\n r: Math.max(0, Math.min(c2.r !== void 0 ? c2.r : 0, 1)),\n g: Math.max(0, Math.min(c2.g !== void 0 ? c2.g : 0, 1)),\n b: Math.max(0, Math.min(c2.b !== void 0 ? c2.b : 0, 1))\n };\n if (c2.alpha !== void 0) {\n res.alpha = c2.alpha;\n }\n return res;\n };\n var to_displayable_srgb = (c2) => fixup_rgb(rgb2(c2));\n var inrange_rgb = (c2) => {\n return c2 !== void 0 && (c2.r === void 0 || c2.r >= 0 && c2.r <= 1) && (c2.g === void 0 || c2.g >= 0 && c2.g <= 1) && (c2.b === void 0 || c2.b >= 0 && c2.b <= 1);\n };\n function displayable(color) {\n return inrange_rgb(rgb2(color));\n }\n function inGamut(mode = \"rgb\") {\n const { gamut } = getMode(mode);\n if (!gamut) {\n return (color) => true;\n }\n const conv = converter_default(typeof gamut === \"string\" ? gamut : mode);\n return (color) => inrange_rgb(conv(color));\n }\n function clampGamut(mode = \"rgb\") {\n const { gamut } = getMode(mode);\n if (!gamut) {\n return (color) => prepare_default(color);\n }\n const destMode = typeof gamut === \"string\" ? gamut : mode;\n const destConv = converter_default(destMode);\n const inDestGamut = inGamut(destMode);\n return (color) => {\n const original = prepare_default(color);\n if (!original) {\n return void 0;\n }\n const converted = destConv(original);\n if (inDestGamut(converted)) {\n return original;\n }\n const clamped = fixup_rgb(converted);\n if (original.mode === clamped.mode) {\n return clamped;\n }\n return converter_default(original.mode)(clamped);\n };\n }\n function clampChroma(color, mode = \"lch\", rgbGamut = \"rgb\") {\n color = prepare_default(color);\n let inDestinationGamut = rgbGamut === \"rgb\" ? displayable : inGamut(rgbGamut);\n let clipToGamut = rgbGamut === \"rgb\" ? to_displayable_srgb : clampGamut(rgbGamut);\n if (color === void 0 || inDestinationGamut(color)) return color;\n let conv = converter_default(color.mode);\n color = converter_default(mode)(color);\n let clamped = { ...color, c: 0 };\n if (!inDestinationGamut(clamped)) {\n return conv(clipToGamut(clamped));\n }\n let start = 0;\n let end = color.c !== void 0 ? color.c : 0;\n let range = getMode(mode).ranges.c;\n let resolution = (range[1] - range[0]) / Math.pow(2, 13);\n let _last_good_c = clamped.c;\n while (end - start > resolution) {\n clamped.c = start + (end - start) * 0.5;\n if (inDestinationGamut(clamped)) {\n _last_good_c = clamped.c;\n start = clamped.c;\n } else {\n end = clamped.c;\n }\n }\n return conv(\n inDestinationGamut(clamped) ? clamped : { ...clamped, c: _last_good_c }\n );\n }\n\n // node_modules/culori/src/wcag.js\n function luminance(color) {\n let c2 = converter_default(\"lrgb\")(color);\n return 0.2126 * c2.r + 0.7152 * c2.g + 0.0722 * c2.b;\n }\n function contrast(a, b) {\n let L1 = luminance(a);\n let L2 = luminance(b);\n return (Math.max(L1, L2) + 0.05) / (Math.min(L1, L2) + 0.05);\n }\n\n // node_modules/culori/src/index.js\n var a98 = useMode(definition_default2);\n var cubehelix = useMode(definition_default3);\n var dlab = useMode(definition_default4);\n var dlch = useMode(definition_default5);\n var hsi = useMode(definition_default6);\n var hsl2 = useMode(definition_default7);\n var hsv = useMode(definition_default8);\n var hwb = useMode(definition_default9);\n var itp = useMode(definition_default10);\n var jab = useMode(definition_default11);\n var jch = useMode(definition_default12);\n var lab = useMode(definition_default13);\n var lab65 = useMode(definition_default14);\n var lch = useMode(definition_default15);\n var lch65 = useMode(definition_default16);\n var lchuv = useMode(definition_default17);\n var lrgb = useMode(definition_default18);\n var luv = useMode(definition_default19);\n var okhsl = useMode(modeOkhsl_default);\n var okhsv = useMode(modeOkhsv_default);\n var oklab = useMode(definition_default20);\n var oklch = useMode(definition_default21);\n var p3 = useMode(definition_default22);\n var prophoto = useMode(definition_default23);\n var rec2020 = useMode(definition_default24);\n var rgb3 = useMode(definition_default);\n var xyb = useMode(definition_default25);\n var xyz50 = useMode(definition_default26);\n var xyz65 = useMode(definition_default27);\n var yiq = useMode(definition_default28);\n\n // packages/xtyle/dist/color.js\n var toOklch = converter_default(\"oklch\");\n var DEFAULT_OKLCH = { l: 0, c: 0, h: 0, alpha: 1 };\n function toOklchColor(input) {\n if (typeof input !== \"string\")\n return input;\n const parsed = parse_default(input);\n if (!parsed)\n throw new Error(`xtyle: unparseable color \"${input}\"`);\n const o = toOklch(parsed);\n if (!o)\n throw new Error(`xtyle: cannot convert color \"${input}\" to oklch`);\n return {\n l: clamp01(o.l ?? 0),\n c: Math.max(0, o.c ?? 0),\n h: o.h ?? 0,\n alpha: o.alpha ?? 1\n };\n }\n function oklch2(l, c2, h, alpha2 = 1) {\n return { l: clamp01(l), c: Math.max(0, c2), h: (h % 360 + 360) % 360, alpha: alpha2 };\n }\n function withLightness(color, l) {\n return { ...color, l: clamp01(l) };\n }\n function withAlpha(color, alpha2) {\n return { ...color, alpha: clamp01(alpha2) };\n }\n function hueDelta(from, to) {\n let d = ((to - from) % 360 + 360) % 360;\n if (d > 180)\n d -= 360;\n return d;\n }\n function lightness(input) {\n return toOklchColor(input).l;\n }\n function contrast2(a, b) {\n const value = contrast(formatCss2(a), formatCss2(b));\n return value ?? 1;\n }\n function clampToGamut(color) {\n const mapped = clampChroma({ mode: \"oklch\", l: color.l, c: color.c, h: color.h, alpha: color.alpha }, \"oklch\", \"rgb\");\n return {\n l: mapped.l ?? color.l,\n c: Math.max(0, mapped.c ?? 0),\n h: mapped.h ?? color.h,\n alpha: mapped.alpha ?? color.alpha\n };\n }\n function formatCss2(input) {\n const source = typeof input === \"string\" ? toOklchColor(input) : input;\n const color = clampToGamut(source);\n const culoriColor = {\n mode: \"oklch\",\n l: color.l,\n c: color.c,\n h: color.h,\n alpha: color.alpha\n };\n if (color.alpha < 1) {\n return formatRgb(culoriColor) ?? formatHex(culoriColor) ?? \"#000000\";\n }\n return formatHex(culoriColor) ?? \"#000000\";\n }\n function schemeOf(bg) {\n return lightness(bg) < 0.5 ? \"dark\" : \"light\";\n }\n function pickReadable(fill, options, floor = 4.5) {\n let best = options[0] ?? DEFAULT_OKLCH;\n let bestContrast = -1;\n for (const option of options) {\n const ratio = contrast2(fill, option);\n if (ratio >= floor)\n return formatCss2(option);\n if (ratio > bestContrast) {\n bestContrast = ratio;\n best = option;\n }\n }\n return formatCss2(best);\n }\n function clamp01(value) {\n if (Number.isNaN(value))\n return 0;\n return Math.min(1, Math.max(0, value));\n }\n\n // packages/xtyle/dist/graph.js\n var CycleError = class extends Error {\n constructor(cycle) {\n super(`xtyle: cycle detected in token graph: ${cycle.join(\" -> \")}`);\n __publicField(this, \"cycle\");\n this.cycle = cycle;\n this.name = \"CycleError\";\n }\n };\n function resolveGraph(nodes) {\n const byName = /* @__PURE__ */ new Map();\n for (const node of nodes)\n byName.set(node.name, node);\n const computed = /* @__PURE__ */ new Map();\n const visiting = /* @__PURE__ */ new Set();\n const done = /* @__PURE__ */ new Set();\n const stack = [];\n const visit = (name) => {\n if (done.has(name))\n return;\n const node = byName.get(name);\n if (!node)\n return;\n if (visiting.has(name)) {\n const start = stack.indexOf(name);\n throw new CycleError([...stack.slice(start), name]);\n }\n visiting.add(name);\n stack.push(name);\n for (const ref of node.refs ?? [])\n visit(ref);\n if (node.resolve) {\n const inputs = {};\n for (const [key, value] of computed)\n inputs[key] = value;\n computed.set(name, node.resolve(inputs));\n } else if (node.value !== void 0) {\n computed.set(name, node.value);\n }\n stack.pop();\n visiting.delete(name);\n done.add(name);\n };\n for (const node of nodes)\n visit(node.name);\n const resolved = {};\n for (const node of nodes) {\n const value = computed.get(node.name);\n if (value !== void 0)\n resolved[node.name] = value;\n }\n return resolved;\n }\n\n // packages/xtyle/dist/vocab.js\n var TONES = [\"accent\", \"neutral\", \"danger\", \"success\", \"warn\", \"info\"];\n var ACCENT_VARIANTS = [\"accent-2\", \"accent-3\", \"accent-4\"];\n var HUES = [\n \"red\",\n \"orange\",\n \"yellow\",\n \"green\",\n \"blue\",\n \"purple\",\n \"brown\",\n \"pink\",\n \"cyan\",\n \"gray\",\n \"white\",\n \"black\"\n ];\n var FULL_TONES = [...TONES, ...ACCENT_VARIANTS, ...HUES];\n\n // packages/xtyle/dist/algorithms/factory.js\n var AA = 4.5;\n var AAA = 7;\n var ENFORCE = AA + 0.2;\n var SURFACE_SEPARATION = 1.5;\n var BORDER_SEPARATION = 1.5;\n var DIVIDER_SEPARATION = 1.8;\n var DEFAULT_SHIFT_STEP = 90;\n var DEFAULT_ACCENT_SPLIT = 45;\n var DERIVED_SURFACE_TINT_C = 0.02;\n var ACCENT_FAN = \"split-complement\";\n var ACHROMATIC_CHROMA = 0.02;\n var DERIVED_ACCENT_HUE_ROTATION = 150;\n var DERIVED_ACCENT_FALLBACK_HUE = 250;\n var DERIVED_ACCENT_L = 0.62;\n var DERIVED_ACCENT_C = 0.16;\n var ACCENT_RAMP_L_MIN = 0.1;\n var ACCENT_RAMP_L_MAX = 0.95;\n var HUE_STABLE_CHROMA = 0.1;\n var FAN_MIN_CHROMA = 0.045;\n var HUE_TOLERANCE = 8;\n var LIGHTNESS_TOLERANCE = 0.05;\n var DEFAULT_TYPE_SCALE = 1.2;\n var DEFAULT_RADIUS_SCALE = 1;\n var BASE_TEXT_REM = 1;\n var DEFAULT_FONTS = {\n sans: 'system-ui, -apple-system, \"Segoe UI\", Roboto, sans-serif',\n mono: 'ui-monospace, \"SF Mono\", \"Cascadia Code\", Consolas, monospace',\n display: '\"Avenir Next\", \"Futura\", \"Century Gothic\", \"Trebuchet MS\", system-ui, -apple-system, \"Segoe UI\", sans-serif'\n };\n var TEXT_LIGHT = { l: 0.98, c: 0, h: 0, alpha: 1 };\n var TEXT_DARK = { l: 0.15, c: 0, h: 0, alpha: 1 };\n var TRUE_WHITE = { l: 1, c: 0, h: 0, alpha: 1 };\n var TRUE_BLACK = { l: 0, c: 0, h: 0, alpha: 1 };\n var TEXT_POLES = [TRUE_WHITE, TRUE_BLACK];\n function bestTruePole(bg) {\n return contrast2(TRUE_BLACK, bg) >= contrast2(TRUE_WHITE, bg) ? TRUE_BLACK : TRUE_WHITE;\n }\n var STATUS_TO_HUE = {\n success: \"green\",\n warn: \"yellow\",\n danger: \"red\",\n info: \"blue\"\n };\n var NEUTRAL_ACCENT_CHROMA = 0.13;\n var PALETTE_HUES = {\n red: { h: 25, c: 0.2 },\n orange: { h: 55, c: 0.18 },\n yellow: { h: 95, c: 0.17 },\n green: { h: 145, c: 0.18 },\n blue: { h: 250, c: 0.18 },\n purple: { h: 300, c: 0.18 },\n brown: { h: 50, c: 0.08 },\n pink: { h: 350, c: 0.16 },\n cyan: { h: 200, c: 0.14 },\n gray: \"gray\",\n white: \"white\",\n black: \"black\"\n };\n var PALETTE_STOPS = [\"subtle\", \"muted\", \"base\", \"strong\", \"contrast\"];\n var CODE_VIVID_ROLES = [\n \"keyword\",\n \"number\",\n \"function\",\n \"type\",\n \"string\",\n \"tag\",\n \"attr\",\n \"regexp\"\n ];\n var CODE_HUE_RANK = [0, 4, 2, 6, 1, 5, 3, 7];\n var CODE_STRUCTURAL_ROLES = [\"comment\", \"operator\", \"punctuation\", \"variable\"];\n var CODE_SCOPES = [...CODE_VIVID_ROLES, ...CODE_STRUCTURAL_ROLES];\n var CODE_SURFACES = [\"--code-bg\", \"--code-fg\", \"--code-line-highlight\", \"--code-selection\"];\n var SURFACES = [\"--body-bg\", \"--bg-0\", \"--bg-1\", \"--bg-2\", \"--bg-3\"];\n var PANEL_REF_INDEX = SURFACES.indexOf(\"--bg-2\");\n var PANEL_SURFACES = [\"--bg-1\", \"--bg-2\"];\n var TEXT_STEPS = [\"xs\", \"sm\", \"body\", \"lg\", \"xl\", \"2xl\", \"3xl\", \"4xl\", \"5xl\"];\n var LEADING_STEPS = [\"tight\", \"normal\", \"loose\"];\n var WEIGHT_STEPS = [\"normal\", \"medium\", \"semibold\", \"bold\"];\n var RADIUS_STEPS = [\"none\", \"sm\", \"md\", \"lg\", \"full\"];\n var BORDER_STEPS = [\"thin\", \"normal\", \"thick\"];\n var DURATION_STEPS = [\"fast\", \"base\", \"slow\"];\n var EASE_STEPS = [\"standard\", \"emphasized\"];\n var SPACE_STEPS = [0, 1, 2, 3, 4, 5, 6, 7, 8];\n var ELEVATION_STEPS = [0, 1, 2, 3, 4, 5];\n var WEIGHT_VALUES = {\n normal: 400,\n medium: 500,\n semibold: 600,\n bold: 700\n };\n var LEADING_VALUES = {\n tight: 1.2,\n normal: 1.5,\n loose: 1.8\n };\n var DENSITY_MULTIPLIER = {\n compact: 0.8,\n normal: 1,\n comfortable: 1.25\n };\n var SPACE_BASE_REM = 0.25;\n function buildProduces() {\n const produces = [];\n const categories = {};\n const add = (name, category) => {\n produces.push(name);\n categories[name] = category;\n };\n add(\"--bg-sunken\", \"color\");\n for (const s of SURFACES)\n add(s, \"color\");\n add(\"--scrim\", \"color\");\n add(\"--surface-overlay\", \"color\");\n add(\"--surface-overlay-border\", \"color\");\n for (let i = 0; i <= 3; i++)\n add(`--fg-${i}`, \"color\");\n add(\"--fg-disabled\", \"color\");\n add(\"--placeholder\", \"color\");\n add(\"--line\", \"color\");\n add(\"--line-2\", \"color\");\n add(\"--ring\", \"color\");\n add(\"--ring-bg\", \"color\");\n add(\"--accent\", \"color\");\n add(\"--accent-hover\", \"color\");\n add(\"--accent-active\", \"color\");\n add(\"--accent-bg\", \"color\");\n add(\"--accent-fg\", \"color\");\n add(\"--accent-text\", \"color\");\n add(\"--accent-vivid\", \"color\");\n for (const n of [\"2\", \"3\", \"4\"]) {\n add(`--accent-${n}`, \"color\");\n add(`--accent-${n}-bg`, \"color\");\n add(`--accent-${n}-fg`, \"color\");\n add(`--accent-${n}-text`, \"color\");\n add(`--accent-${n}-vivid`, \"color\");\n }\n add(\"--accent-shift-step\", \"number\");\n add(\"--neutral\", \"color\");\n add(\"--neutral-bg\", \"color\");\n add(\"--neutral-fg\", \"color\");\n add(\"--neutral-text\", \"color\");\n add(\"--neutral-vivid\", \"color\");\n add(\"--field-bg\", \"color\");\n add(\"--field-border\", \"color\");\n for (const role of Object.keys(STATUS_TO_HUE)) {\n add(`--${role}`, \"color\");\n add(`--${role}-bg`, \"color\");\n add(`--${role}-fg`, \"color\");\n add(`--${role}-text`, \"color\");\n add(`--${role}-vivid`, \"color\");\n }\n for (const s of [\"hover\", \"press\", \"selected\", \"disabled\", \"drag\"]) {\n add(`--state-${s}`, \"color\");\n }\n add(\"--link\", \"color\");\n add(\"--link-hover\", \"color\");\n add(\"--selection\", \"color\");\n add(\"--highlight\", \"color\");\n add(\"--selection-cue\", \"keyword\");\n add(\"--shadow\", \"shadow\");\n for (const hue3 of Object.keys(PALETTE_HUES)) {\n add(`--color-${hue3}`, \"color\");\n for (const stop of PALETTE_STOPS)\n add(`--color-${hue3}-${stop}`, \"color\");\n add(`--${hue3}`, \"color\");\n add(`--${hue3}-bg`, \"color\");\n add(`--${hue3}-fg`, \"color\");\n add(`--${hue3}-text`, \"color\");\n add(`--${hue3}-vivid`, \"color\");\n }\n for (const t of CODE_SURFACES)\n add(t, \"color\");\n for (const role of CODE_SCOPES)\n add(`--code-${role}`, \"color\");\n add(\"--font-sans\", \"font\");\n add(\"--font-mono\", \"font\");\n add(\"--font-display\", \"font\");\n for (const step of TEXT_STEPS)\n add(`--text-${step}`, \"length\");\n for (const step of LEADING_STEPS)\n add(`--leading-${step}`, \"number\");\n for (const step of WEIGHT_STEPS)\n add(`--weight-${step}`, \"number\");\n for (const step of RADIUS_STEPS)\n add(`--radius-${step}`, \"length\");\n for (const step of BORDER_STEPS)\n add(`--border-${step}`, \"length\");\n for (const step of DURATION_STEPS)\n add(`--duration-${step}`, \"duration\");\n for (const step of EASE_STEPS)\n add(`--ease-${step}`, \"easing\");\n for (const step of ELEVATION_STEPS)\n add(`--elevation-${step}`, \"shadow\");\n for (const step of SPACE_STEPS)\n add(`--space-${step}`, \"length\");\n return { produces, categories };\n }\n var { produces: PRODUCES, categories: CATEGORIES } = buildProduces();\n var KEYWORD_DOMAINS = {\n \"--selection-cue\": [\"tint\", \"marker\"]\n };\n function stepLightness(base, scheme, step, index) {\n const direction = scheme === \"dark\" ? 1 : -1;\n return base + direction * step * index;\n }\n function contrastBandFloor(knobs) {\n const band = knobs.contrastBand;\n if (typeof band === \"number\")\n return band;\n if (band === \"aaa\")\n return AAA;\n if (band === \"aa\")\n return AA;\n return void 0;\n }\n function vibrancyOf(knobs, preset) {\n const v = typeof knobs.vibrancy === \"number\" ? knobs.vibrancy : preset.defaultVibrancy;\n return Math.min(1, Math.max(0, v));\n }\n function typeScaleOf(knobs) {\n const v = typeof knobs.typeScale === \"number\" ? knobs.typeScale : DEFAULT_TYPE_SCALE;\n return Math.min(2, Math.max(1.05, v));\n }\n function radiusScaleOf(knobs) {\n const v = typeof knobs.radiusScale === \"number\" ? knobs.radiusScale : DEFAULT_RADIUS_SCALE;\n return Math.max(0, v);\n }\n function densityOf(knobs) {\n const d = knobs.density;\n if (typeof d === \"number\")\n return Math.max(0.4, d);\n if (d === \"compact\" || d === \"comfortable\")\n return DENSITY_MULTIPLIER[d];\n return DENSITY_MULTIPLIER.normal;\n }\n function fontsOf(knobs) {\n return {\n sans: knobs.fonts?.sans ?? DEFAULT_FONTS.sans,\n mono: knobs.fonts?.mono ?? DEFAULT_FONTS.mono,\n display: knobs.fonts?.display ?? DEFAULT_FONTS.display\n };\n }\n function emittedContrast(fg, bgCss) {\n return contrast2(formatCss2(fg), bgCss);\n }\n function enforceContrastFloor(fg, bg, scheme, floor = ENFORCE) {\n const bgCss = formatCss2(bg);\n if (emittedContrast(fg, bgCss) >= floor)\n return fg;\n const preferred = scheme === \"dark\" ? TRUE_WHITE.l : TRUE_BLACK.l;\n const other = scheme === \"dark\" ? TRUE_BLACK.l : TRUE_WHITE.l;\n const swept = sweepToward(fg, bgCss, preferred, floor) ?? sweepToward(fg, bgCss, other, floor);\n const pole = bestTruePole(bgCss);\n if (!swept)\n return pole;\n return emittedContrast(pole, bgCss) > emittedContrast(swept, bgCss) ? pole : swept;\n }\n function sweepToward(fg, bgCss, targetL, floor) {\n for (let i = 0; i <= 100; i++) {\n const t = i / 100;\n const candidate = {\n l: fg.l + (targetL - fg.l) * t,\n c: fg.c * (1 - t),\n h: fg.h,\n alpha: fg.alpha\n };\n if (emittedContrast(candidate, bgCss) >= floor)\n return candidate;\n }\n return null;\n }\n function bestPoleContrast(bg) {\n return Math.max(contrast2(TEXT_LIGHT, bg), contrast2(TEXT_DARK, bg));\n }\n function ensureTextHeadroom(bg, scheme, floor = ENFORCE) {\n if (bestPoleContrast(bg) >= floor)\n return bg;\n const target = scheme === \"dark\" ? 0 : 1;\n let candidate = bg;\n for (let i = 1; i <= 100; i++) {\n const t = i / 100;\n candidate = withLightness(bg, bg.l + (target - bg.l) * t);\n if (bestPoleContrast(candidate) >= floor)\n return candidate;\n }\n return withLightness(bg, target);\n }\n function fillWithTextHeadroom(l, c2, h, floor = ENFORCE) {\n const seed = oklch2(l, c2, h);\n if (bestPoleContrast(seed) >= floor)\n return seed;\n let fallback = seed;\n for (let i = 1; i <= 100; i++) {\n const down = oklch2(l - l * i / 100, c2, h);\n if (bestPoleContrast(down) >= floor)\n return down;\n const up = oklch2(l + (1 - l) * i / 100, c2, h);\n if (bestPoleContrast(up) >= floor)\n return up;\n fallback = bestPoleContrast(down) >= bestPoleContrast(up) ? down : up;\n }\n return fallback;\n }\n function lightnessForContrast(pole, bg, bgCss, target) {\n let bestL = pole.l;\n for (let i = 0; i <= 200; i++) {\n const t = i / 200;\n const candidateL = pole.l + (bg.l - pole.l) * t;\n if (emittedContrast(withLightness(pole, candidateL), bgCss) >= target)\n bestL = candidateL;\n else\n break;\n }\n return bestL;\n }\n function liftStopForContrast(fg, bgCss, target, towardLight) {\n if (contrast2(formatCss2(fg), bgCss) >= target)\n return fg;\n const poleL = towardLight ? 1 : 0;\n let best = fg;\n for (let i = 1; i <= 100; i++) {\n const candidate = clampToGamut(oklch2(fg.l + (poleL - fg.l) * (i / 100), fg.c, fg.h));\n best = candidate;\n if (contrast2(formatCss2(candidate), bgCss) >= target)\n return candidate;\n }\n return best;\n }\n function separateFillFromSurface(fill, surface, separation, textFloor) {\n const surfaceCss = formatCss2(surface);\n if (contrast2(formatCss2(fill), surfaceCss) >= separation)\n return fill;\n const headroom = Math.min(textFloor, bestPoleContrast(fill));\n const poleL = surface.l < 0.5 ? 1 : 0;\n let best = fill;\n for (let i = 1; i <= 100; i++) {\n const candidate = clampToGamut(oklch2(fill.l + (poleL - fill.l) * (i / 100), fill.c, fill.h));\n best = candidate;\n if (contrast2(formatCss2(candidate), surfaceCss) >= separation && bestPoleContrast(candidate) >= headroom - 0.01) {\n return candidate;\n }\n }\n return best;\n }\n function borderForContrast(seed, surface, minContrast) {\n const surfaceCss = formatCss2(surface);\n if (emittedContrast(seed, surfaceCss) >= minContrast)\n return seed;\n const targetL = surface.l < 0.5 ? 1 : 0;\n let candidate = seed;\n for (let i = 1; i <= 100; i++) {\n candidate = withLightness(seed, seed.l + (targetL - seed.l) * (i / 100));\n if (emittedContrast(candidate, surfaceCss) >= minContrast)\n break;\n }\n return candidate;\n }\n function readableOnTint(tint, hue3, floor, inkChroma) {\n const tintCss = formatCss2(tint);\n const towardDark = contrast2(\"#000000\", tintCss) >= contrast2(\"#ffffff\", tintCss);\n const targetL = towardDark ? 0 : 1;\n const seedChroma = inkChroma ?? (towardDark ? 0.06 : 0.04);\n const seed = oklch2(tint.l + (towardDark ? -0.4 : 0.4), seedChroma, hue3);\n for (let i = 0; i <= 100; i++) {\n const t = i / 100;\n const css = formatCss2({\n l: seed.l + (targetL - seed.l) * t,\n c: seed.c * (1 - t),\n h: hue3,\n alpha: 1\n });\n if (contrast2(css, tintCss) >= floor)\n return css;\n }\n return towardDark ? \"#000000\" : \"#ffffff\";\n }\n function readableHuedOnTintAndPanel(tint, hue3, tintFloor, panels, panelFloor, seedChroma) {\n const tintCss = formatCss2(tint);\n const panelCss = panels.map((p4) => formatCss2(p4));\n const sweep = (towardDark) => {\n const targetL = towardDark ? 0 : 1;\n const seed = towardDark ? oklch2(tint.l - 0.4, seedChroma, hue3) : oklch2(tint.l + 0.4, seedChroma * 0.667, hue3);\n const out = [];\n for (let i = 0; i <= 100; i++) {\n const t = i / 100;\n out.push(formatCss2({\n l: seed.l + (targetL - seed.l) * t,\n c: seed.c * (1 - t),\n h: hue3,\n alpha: 1\n }));\n }\n return out;\n };\n const minPanel = (css) => panelCss.length === 0 ? Infinity : Math.min(...panelCss.map((p4) => contrast2(css, p4)));\n let best = null;\n let bestMin = -1;\n for (const towardDark of [true, false]) {\n for (const css of sweep(towardDark)) {\n if (contrast2(css, tintCss) < tintFloor)\n continue;\n const m = minPanel(css);\n if (m >= panelFloor)\n return css;\n if (m > bestMin) {\n bestMin = m;\n best = css;\n }\n }\n }\n return best ?? readableOnTint(tint, hue3, tintFloor);\n }\n function vividOnPanel(hue3, panels, floor, targetChroma) {\n const panelCss = panels.map((p4) => formatCss2(p4));\n const minPanel = (css) => panelCss.length === 0 ? Infinity : Math.min(...panelCss.map((p4) => contrast2(css, p4)));\n const avgL = panels.reduce((sum, p4) => sum + p4.l, 0) / Math.max(1, panels.length);\n const towardLight = avgL < 0.5;\n let best = null;\n let bestChroma = -1;\n for (let i = 0; i <= 80; i++) {\n const t = i / 80;\n const l = towardLight ? 0.5 + t * 0.45 : 0.5 - t * 0.42;\n const chroma = clampToGamut(oklch2(l, targetChroma, hue3)).c;\n const css = formatCss2(oklch2(l, chroma, hue3));\n if (minPanel(css) >= floor && chroma > bestChroma) {\n bestChroma = chroma;\n best = css;\n }\n }\n return best ?? (towardLight ? \"#ffffff\" : \"#000000\");\n }\n function deriveAccentAnchor(bg, fg) {\n const sourceHue = bg.c >= ACHROMATIC_CHROMA ? bg.h : fg.c >= ACHROMATIC_CHROMA ? fg.h : void 0;\n const hue3 = sourceHue === void 0 ? DERIVED_ACCENT_FALLBACK_HUE : ((sourceHue + DERIVED_ACCENT_HUE_ROTATION) % 360 + 360) % 360;\n return clampToGamut(oklch2(DERIVED_ACCENT_L, DERIVED_ACCENT_C, hue3));\n }\n function shadowString(scheme, level, vibrancy, preset) {\n if (level <= 0)\n return \"none\";\n const baseAlpha = (scheme === \"dark\" ? 0.5 : 0.16) + vibrancy * 0.1 + preset.elevationAlphaBoost;\n const y = Math.max(1, Math.round(level * 2 * preset.elevationStrengthMul));\n const blur = Math.max(1, Math.round(level * 4 * preset.elevationStrengthMul));\n const spread = Math.max(0, level - 3);\n const alpha2 = Math.min(0.92, baseAlpha + level * 0.04);\n const ambientY = Math.max(1, Math.round(level / 2));\n const ambientBlur = Math.max(1, Math.round(level * 2 * preset.elevationStrengthMul));\n const ambientAlpha = Math.min(0.7, alpha2 * 0.6);\n return [\n `0 ${y}px ${blur}px ${spread}px rgba(0, 0, 0, ${alpha2.toFixed(2)})`,\n `0 ${ambientY}px ${ambientBlur}px 0 rgba(0, 0, 0, ${ambientAlpha.toFixed(2)})`\n ].join(\", \");\n }\n function paletteRamp(register, hue3, spec2, scheme, vibrancy, floor, preset, accent, panels, pinnedBase) {\n const set = (suffix, color) => {\n register[suffix ? `--color-${hue3}-${suffix}` : `--color-${hue3}`] = formatCss2(color);\n };\n const family = (solid, bg, fg, text, vivid) => {\n register[`--${hue3}`] = solid;\n register[`--${hue3}-bg`] = bg;\n register[`--${hue3}-fg`] = fg;\n register[`--${hue3}-text`] = text;\n register[`--${hue3}-vivid`] = vivid;\n };\n const grayscale = (lights, chroma2) => {\n const stops2 = lights.map((l) => oklch2(l, chroma2, 0));\n const baseStop = stops2[2];\n const subtleStop2 = stops2[0];\n const strongStop2 = liftStopForContrast(stops2[3], formatCss2(subtleStop2), AA + 0.2, stops2[3].l >= subtleStop2.l);\n const contrast4 = readableOnTint(baseStop, 0, AA + 0.3, 0);\n set(\"\", baseStop);\n set(\"subtle\", subtleStop2);\n set(\"muted\", stops2[1]);\n set(\"base\", baseStop);\n set(\"strong\", strongStop2);\n register[`--color-${hue3}-contrast`] = contrast4;\n family(formatCss2(baseStop), formatCss2(subtleStop2), contrast4, readableOnTint(subtleStop2, 0, AA + 0.2, 0), vividOnPanel(0, panels, floor, 0));\n };\n if (spec2 === \"white\") {\n grayscale([0.82, 0.9, 0.97, 1], 0);\n return;\n }\n if (spec2 === \"black\") {\n grayscale([0.05, 0.12, 0.2, 0.32], 0);\n return;\n }\n if (spec2 === \"gray\") {\n grayscale([0.4, 0.55, 0.68, 0.82], 5e-3);\n return;\n }\n const accentChromaFactor = Math.max(0.5, Math.min(1.6, accent.c / NEUTRAL_ACCENT_CHROMA));\n const chroma = spec2.c * accentChromaFactor * (0.6 + vibrancy * 0.7) * preset.paletteChromaMul;\n const baseL = scheme === \"dark\" ? 0.7 : 0.55;\n const lBias = Math.max(-0.06, Math.min(0.06, (accent.l - baseL) * 0.25));\n const ladderL = (scheme === \"dark\" ? [0.45, 0.58, baseL, 0.82] : [0.78, 0.66, baseL, 0.42]).map((l) => Math.max(0.05, Math.min(0.97, l + lBias)));\n const ladderC = [chroma * 0.7, chroma * 0.9, chroma, chroma * 0.85];\n const stops = ladderL.map((l, i) => clampToGamut(oklch2(l, ladderC[i], spec2.h)));\n const base = stops[2];\n const solidBase = pinnedBase ?? base;\n const subtleStop = stops[0];\n const strongStop = liftStopForContrast(stops[3], formatCss2(subtleStop), AA + 0.2, stops[3].l >= subtleStop.l);\n const contrast3 = readableOnTint(solidBase, spec2.h, Math.max(floor, AA + 0.3));\n set(\"\", base);\n set(\"subtle\", subtleStop);\n set(\"muted\", stops[1]);\n set(\"base\", base);\n set(\"strong\", strongStop);\n register[`--color-${hue3}-contrast`] = contrast3;\n const bg0p = panels[0];\n const washL = scheme === \"dark\" ? Math.max(0.2, bg0p.l + 0.08) : Math.min(0.92, bg0p.l - 0.04);\n const bgTint = ensureTextHeadroom(oklch2(washL, chroma * 0.35, spec2.h), scheme, AA + 0.3);\n const bgText = readableHuedOnTintAndPanel(bgTint, spec2.h, AA + 0.3, panels.slice(1), AA + 0.05, chroma);\n family(formatCss2(solidBase), formatCss2(bgTint), contrast3, bgText, vividOnPanel(spec2.h, panels, floor, chroma));\n }\n function schemeFromFg(fg) {\n return fg.l >= 0.5 ? \"dark\" : \"light\";\n }\n function deriveSurface(scheme, hue3, chroma, depth, floor) {\n const l = scheme === \"dark\" ? depth : 1 - depth;\n return ensureTextHeadroom(oklch2(l, chroma, hue3), scheme, floor);\n }\n function completeAnchors(preset, opts) {\n const pin = opts.constraints ?? {};\n const givenBg = parsePin(pin[\"--bg-0\"]);\n const givenFg = parsePin(pin[\"--fg-0\"]);\n const givenAccent = parsePin(pin[\"--accent\"]);\n const defBg = toOklchColor(preset.defaultAnchors.bg);\n const defFg = toOklchColor(preset.defaultAnchors.fg);\n const defScheme = schemeOf(defBg);\n const surfaceDepth = defScheme === \"dark\" ? defBg.l : 1 - defBg.l;\n const floor = Math.max(ENFORCE, preset.contrastFloor);\n const inferredScheme = givenBg ? schemeOf(givenBg) : givenFg ? schemeFromFg(givenFg) : defScheme;\n const scheme = opts.knobs?.scheme ?? inferredScheme;\n let bg;\n if (givenBg) {\n bg = scheme === schemeOf(givenBg) ? givenBg : withLightness(givenBg, 1 - givenBg.l);\n } else if (givenAccent || givenFg) {\n const hue3 = givenAccent?.h ?? givenFg.h;\n const tint = givenAccent ? DERIVED_SURFACE_TINT_C : 5e-3;\n bg = deriveSurface(scheme, hue3, tint, surfaceDepth, floor);\n } else {\n bg = scheme === defScheme ? defBg : withLightness(defBg, 1 - defBg.l);\n }\n const fg = givenFg ?? defFg;\n const accentExplicit = givenAccent !== null || preset.defaultAnchors.accent !== void 0;\n const accent = givenAccent ?? (preset.defaultAnchors.accent ? toOklchColor(preset.defaultAnchors.accent) : deriveAccentAnchor(bg, fg));\n return { bg, fg, accent, scheme, accentExplicit };\n }\n function parsePin(value) {\n if (!value)\n return null;\n try {\n const o = toOklchColor(value);\n if (Number.isNaN(o.l) || Number.isNaN(o.c))\n return null;\n return o;\n } catch {\n return null;\n }\n }\n function parseChromaticPin(value) {\n const o = parsePin(value);\n if (!o || Number.isNaN(o.h) || o.c < ACHROMATIC_CHROMA)\n return null;\n return o;\n }\n function paletteHueAngle(name) {\n const spec2 = PALETTE_HUES[name];\n return typeof spec2 === \"object\" ? spec2.h : 0;\n }\n function resolveStatusHue(role, pinned) {\n const name = STATUS_TO_HUE[role] ?? \"red\";\n const pin = parseChromaticPin(pinned[`--${name}`] ?? pinned[`--color-${name}-base`] ?? pinned[`--color-${name}`]);\n return pin ? pin.h : paletteHueAngle(name);\n }\n function buildGraph(preset, opts) {\n const completed = completeAnchors(preset, opts);\n const bg = completed.bg;\n const fgAnchor = completed.fg;\n const pinned = opts.constraints ?? {};\n const accent = pinned[\"--accent\"] ? toOklchColor(pinned[\"--accent\"]) : completed.accent;\n const scheme = completed.scheme;\n const knobs = opts.knobs ?? {};\n const shiftStep = typeof knobs.accentShiftStep === \"number\" ? knobs.accentShiftStep : DEFAULT_SHIFT_STEP;\n const accentSplit = typeof knobs.accentSplit === \"number\" ? knobs.accentSplit : DEFAULT_ACCENT_SPLIT;\n const band = contrastBandFloor(knobs);\n const floor = Math.max(ENFORCE, preset.contrastFloor, (band ?? 0) + 0.2);\n const extreme = preset.extreme === true;\n let vibrancy = vibrancyOf(knobs, preset);\n if (extreme)\n vibrancy = 1;\n const typeScale = typeScaleOf(knobs);\n const radiusScale = radiusScaleOf(knobs);\n const density = densityOf(knobs);\n const fonts = fontsOf(knobs);\n const surfaceStep = 0.045;\n const nodes = [];\n const lit = (name, value, refs) => {\n nodes.push(refs && refs.length ? { name, value, refs } : { name, value });\n };\n const pinKeys = new Set(Object.keys(pinned));\n const refIfPinned = (...names) => names.filter((n) => pinKeys.has(n));\n lit(\"--scheme\", scheme);\n const bg0 = pinned[\"--bg-0\"] ? toOklchColor(pinned[\"--bg-0\"]) : extreme ? oklch2(scheme === \"dark\" ? 0 : 1, 0, 0) : ensureTextHeadroom(withLightness(bg, stepLightness(bg.l, scheme, surfaceStep, 1)), scheme, floor);\n const pageFloor = (fill) => separateFillFromSurface(fill, bg0, SURFACE_SEPARATION, floor);\n const direction = scheme === \"dark\" ? 1 : -1;\n const surfaceColors = SURFACES.map((_, index) => withLightness(bg0, bg0.l + direction * surfaceStep * (index - 1)));\n SURFACES.forEach((name, index) => {\n lit(name, formatCss2(surfaceColors[index]), refIfPinned(\"--bg-0\"));\n });\n lit(\"--bg-sunken\", formatCss2(withLightness(bg0, bg0.l - direction * surfaceStep * 2)), refIfPinned(\"--bg-0\"));\n lit(\"--scrim\", formatCss2(oklch2(scheme === \"dark\" ? 0 : 0.1, 0, 0, 0.6)));\n const overlayBase = withLightness(bg0, scheme === \"dark\" ? bg0.l + 0.07 : bg0.l + 0.03);\n lit(\"--surface-overlay\", formatCss2(overlayBase), refIfPinned(\"--bg-0\"));\n lit(\"--surface-overlay-border\", formatCss2(withAlpha(withLightness(bg0, scheme === \"dark\" ? bg0.l + 0.25 : bg0.l - 0.2), 0.6)), refIfPinned(\"--bg-0\"));\n const fg0 = pinned[\"--fg-0\"] ? toOklchColor(pinned[\"--fg-0\"]) : extreme ? bestTruePole(formatCss2(bg0)) : enforceContrastFloor(withLightness(fgAnchor, scheme === \"dark\" ? Math.max(fgAnchor.l, 0.9) : Math.min(fgAnchor.l, 0.2)), bg0, scheme, floor);\n lit(\"--fg-0\", formatCss2(fg0), refIfPinned(\"--bg-0\", \"--fg-0\"));\n const fgBg0Css = formatCss2(bg0);\n const fg0Contrast = emittedContrast(fg0, fgBg0Css);\n const panelRef = surfaceColors[PANEL_REF_INDEX];\n const panelRefCss = formatCss2(panelRef);\n const panelSurfaces = PANEL_SURFACES.map((s) => surfaceColors[SURFACES.indexOf(s)]);\n const rampFloor = extreme ? Math.min(fg0Contrast, Math.max(floor, fg0Contrast * 0.66)) : Math.min(floor, fg0Contrast);\n const conservativeFloorL = (target) => {\n const againstBg0 = lightnessForContrast(fg0, bg0, fgBg0Css, target);\n const againstPanel = lightnessForContrast(fg0, panelRef, panelRefCss, target);\n return Math.abs(againstBg0 - fg0.l) <= Math.abs(againstPanel - fg0.l) ? againstBg0 : againstPanel;\n };\n const textLight = scheme === \"dark\";\n const enforceOnPanels = (color) => {\n const onBg0 = enforceContrastFloor(color, bg0, scheme, floor);\n const sameSidePanels = panelSurfaces.filter((p4) => p4.l < 0.5 === textLight);\n if (sameSidePanels.length === 0)\n return onBg0;\n const panelCss = sameSidePanels.map((p4) => formatCss2(p4));\n const minPanel = (c2) => Math.min(...panelCss.map((p4) => emittedContrast(c2, p4)));\n if (minPanel(onBg0) >= floor - 0.01)\n return onBg0;\n const targetL = textLight ? 1 : 0;\n let best = onBg0;\n let bestMin = minPanel(onBg0);\n for (let i = 1; i <= 100; i++) {\n const t = i / 100;\n const candidate = withLightness(onBg0, onBg0.l + (targetL - onBg0.l) * t);\n if (emittedContrast(candidate, fgBg0Css) < floor - 0.01)\n break;\n const m = minPanel(candidate);\n if (m > bestMin) {\n bestMin = m;\n best = candidate;\n }\n if (m >= floor)\n break;\n }\n return best;\n };\n const enforceChromaticOnPanels = (color) => {\n const bg0Css = formatCss2(bg0);\n const sameSidePanels = panelSurfaces.filter((p4) => p4.l < 0.5 === textLight);\n const refsCss = [bg0Css, ...sameSidePanels.map((p4) => formatCss2(p4))];\n const minRef = (c2) => Math.min(...refsCss.map((r2) => emittedContrast(c2, r2)));\n if (minRef(color) >= floor - 0.01)\n return color;\n const targetL = textLight ? 1 : 0;\n for (let i = 1; i <= 100; i++) {\n const candidate = withLightness(color, color.l + (targetL - color.l) * (i / 100));\n if (minRef(candidate) >= floor)\n return candidate;\n }\n return enforceOnPanels(color);\n };\n const floorL = conservativeFloorL(rampFloor);\n for (let i = 1; i <= 3; i++) {\n const reduced = withLightness(fg0, fg0.l + (floorL - fg0.l) * (i / 3));\n lit(`--fg-${i}`, formatCss2(reduced), [\"--fg-0\", ...refIfPinned(\"--bg-0\")]);\n }\n lit(\"--fg-disabled\", formatCss2(withLightness(fg0, conservativeFloorL(3))), [\"--fg-0\", ...refIfPinned(\"--bg-0\")]);\n const placeholderFloor = extreme ? rampFloor : Math.min(floor, fg0Contrast);\n const placeholderL = conservativeFloorL(placeholderFloor);\n lit(\"--placeholder\", formatCss2(withLightness(fg0, placeholderL)), [\"--fg-0\", ...refIfPinned(\"--bg-0\")]);\n const accentFill = pinned[\"--accent\"] || completed.accentExplicit ? accent : pageFloor(fillWithTextHeadroom(accent.l, accent.c * (0.6 + vibrancy * 0.8) * preset.accentChromaMul, accent.h, floor));\n const accentValue = pinned[\"--accent\"] ?? formatCss2(accentFill);\n lit(\"--accent\", accentValue, refIfPinned(\"--accent\"));\n lit(\"--accent-fg\", pickReadable(accentFill, TEXT_POLES, floor), [\"--accent\"]);\n const accentTextColor = enforceChromaticOnPanels(accentFill);\n const accentTextCss = formatCss2(accentTextColor);\n const accentTint = liftStopForContrast(oklch2(scheme === \"dark\" ? Math.max(0.2, bg0.l + 0.08) : Math.min(0.92, bg0.l - 0.04), accentFill.c * preset.accentTintChromaMul, accentFill.h), accentTextCss, AA + 0.2, accentTextColor.l < 0.5);\n lit(\"--accent-bg\", formatCss2(accentTint), [\"--accent\", ...refIfPinned(\"--bg-0\")]);\n lit(\"--accent-text\", accentTextCss, [\"--accent\", ...refIfPinned(\"--bg-0\")]);\n lit(\"--accent-vivid\", vividOnPanel(accentFill.h, [bg0, ...panelSurfaces], floor, accentFill.c), [\"--accent\", ...refIfPinned(\"--bg-0\")]);\n const pinnedNeutral = parsePin(pinned[\"--neutral\"]);\n const neutralFill = pinnedNeutral ?? pageFloor(fillWithTextHeadroom(scheme === \"dark\" ? 0.6 : 0.5, preset.neutralChroma, accentFill.h, floor));\n const neutralTintHue = Number.isFinite(neutralFill.h) ? neutralFill.h : accentFill.h;\n lit(\"--neutral\", formatCss2(neutralFill), [\"--accent\", ...refIfPinned(\"--neutral\")]);\n const neutralTextColor = enforceOnPanels(neutralFill);\n const neutralTextCss = formatCss2(neutralTextColor);\n const neutralTint = liftStopForContrast(oklch2(scheme === \"dark\" ? Math.max(0.2, bg0.l + 0.06) : Math.min(0.92, bg0.l - 0.04), 5e-3, neutralTintHue), neutralTextCss, AA + 0.2, neutralTextColor.l < 0.5);\n lit(\"--neutral-bg\", formatCss2(neutralTint), [\"--accent\", ...refIfPinned(\"--bg-0\")]);\n lit(\"--neutral-fg\", pickReadable(neutralFill, TEXT_POLES, floor), [\"--neutral\"]);\n lit(\"--neutral-text\", neutralTextCss, [\"--neutral\", ...refIfPinned(\"--bg-0\")]);\n lit(\"--neutral-vivid\", neutralTextCss, [\"--neutral-text\", ...refIfPinned(\"--bg-0\")]);\n const lineSeed = extreme ? oklch2(scheme === \"dark\" ? 0.7 : 0.3, 0, 0) : withLightness(bg0, scheme === \"dark\" ? bg0.l + 0.12 : bg0.l - 0.12);\n lit(\"--line\", formatCss2(borderForContrast(lineSeed, bg0, BORDER_SEPARATION)), refIfPinned(\"--bg-0\"));\n const line2Seed = extreme ? oklch2(scheme === \"dark\" ? 0.85 : 0.15, 0, 0) : withLightness(bg0, scheme === \"dark\" ? bg0.l + 0.2 : bg0.l - 0.2);\n lit(\"--line-2\", formatCss2(borderForContrast(line2Seed, bg0, DIVIDER_SEPARATION)), refIfPinned(\"--bg-0\"));\n lit(\"--ring\", formatCss2(withAlpha(accentFill, 0.7)), [\"--accent\"]);\n lit(\"--ring-bg\", formatCss2(withAlpha(accentFill, 0.18)), [\"--accent\"]);\n const fieldBg = withLightness(bg0, scheme === \"dark\" ? bg0.l - 0.03 : bg0.l + 0.02);\n lit(\"--field-bg\", formatCss2(fieldBg), refIfPinned(\"--bg-0\"));\n const fieldBorderSeed = extreme ? oklch2(scheme === \"dark\" ? 0.8 : 0.2, 0, 0) : withLightness(bg0, scheme === \"dark\" ? bg0.l + 0.16 : bg0.l - 0.16);\n lit(\"--field-border\", formatCss2(borderForContrast(fieldBorderSeed, fieldBg, BORDER_SEPARATION)), refIfPinned(\"--bg-0\"));\n lit(\"--accent-hover\", formatCss2(withLightness(accentFill, accentFill.l + (scheme === \"dark\" ? 0.06 : -0.06))), [\"--accent\"]);\n lit(\"--accent-active\", formatCss2(withLightness(accentFill, accentFill.l + (scheme === \"dark\" ? -0.06 : 0.06))), [\"--accent\"]);\n const accentDisplay = toOklchColor(accentValue);\n const accentDelta = (from, to) => ({\n dL: to.l - from.l,\n dC: to.c - from.c,\n dH: hueDelta(from.h, to.h)\n });\n const applyAccentDelta = (from, delta) => {\n const rawL = from.l + delta.dL;\n const l = delta.dL === 0 ? Math.min(1, Math.max(0, rawL)) : Math.min(ACCENT_RAMP_L_MAX, Math.max(ACCENT_RAMP_L_MIN, rawL));\n return {\n l,\n c: Math.max(0, from.c + delta.dC),\n h: ((from.h + delta.dH) % 360 + 360) % 360,\n alpha: 1\n };\n };\n const emitAccent = (color) => {\n const maxC = clampToGamut({ l: color.l, c: color.c, h: color.h, alpha: 1 }).c;\n return formatCss2({ ...color, c: Math.min(color.c, maxC) });\n };\n const a1 = accentDisplay;\n const fanBase = { ...a1, c: Math.max(a1.c, FAN_MIN_CHROMA) };\n const rotate = (deg) => ({ dL: 0, dC: 0, dH: deg });\n const fanned = (n, derived) => pinned[`--accent-${n}`] ? toOklchColor(pinned[`--accent-${n}`]) : derived;\n let a2;\n let a3;\n let a4;\n let a2Refs;\n let a3Refs;\n let a4Refs;\n if (ACCENT_FAN === \"split-complement\") {\n const mirrorOf = (c2) => applyAccentDelta(fanBase, rotate(-hueDelta(a1.h, c2.h)));\n const a2Pin = pinned[\"--accent-2\"];\n const a3Pin = pinned[\"--accent-3\"];\n let a2Derived = applyAccentDelta(fanBase, rotate(-accentSplit));\n let a3Derived = applyAccentDelta(fanBase, rotate(accentSplit));\n if (a2Pin && !a3Pin)\n a3Derived = mirrorOf(toOklchColor(a2Pin));\n else if (a3Pin && !a2Pin)\n a2Derived = mirrorOf(toOklchColor(a3Pin));\n a2 = fanned(\"2\", a2Derived);\n a3 = fanned(\"3\", a3Derived);\n a4 = fanned(\"4\", applyAccentDelta(fanBase, rotate(180)));\n a2Refs = a3Pin && !a2Pin ? [\"--accent\", \"--accent-3\"] : [\"--accent\"];\n a3Refs = a2Pin && !a3Pin ? [\"--accent\", \"--accent-2\"] : [\"--accent\"];\n a4Refs = [\"--accent\"];\n } else {\n a2 = fanned(\"2\", applyAccentDelta(fanBase, rotate(shiftStep)));\n a3 = fanned(\"3\", applyAccentDelta(a2, accentDelta(fanBase, a2)));\n a4 = fanned(\"4\", applyAccentDelta(a3, accentDelta(a2, a3)));\n a2Refs = [\"--accent\", \"--accent-shift-step\"];\n a3Refs = [\"--accent-2\", \"--accent\"];\n a4Refs = [\"--accent-3\", \"--accent-2\"];\n }\n lit(\"--accent-2\", emitAccent(a2), a2Refs);\n lit(\"--accent-3\", emitAccent(a3), a3Refs);\n lit(\"--accent-4\", emitAccent(a4), a4Refs);\n lit(\"--accent-shift-step\", String(shiftStep));\n const emitAccentFamily = (n, raw) => {\n const color = toOklchColor(emitAccent(raw));\n lit(`--accent-${n}-fg`, pickReadable(color, TEXT_POLES, floor), [`--accent-${n}`]);\n const tint = oklch2(scheme === \"dark\" ? Math.max(0.2, bg0.l + 0.08) : Math.min(0.92, bg0.l - 0.04), color.c * preset.accentTintChromaMul, color.h);\n lit(`--accent-${n}-bg`, formatCss2(tint), [`--accent-${n}`, ...refIfPinned(\"--bg-0\")]);\n lit(`--accent-${n}-text`, readableHuedOnTintAndPanel(tint, color.h, AA + 0.3, panelSurfaces, AA + 0.05, color.c), [`--accent-${n}-bg`, ...refIfPinned(\"--bg-0\")]);\n lit(`--accent-${n}-vivid`, vividOnPanel(color.h, [bg0, ...panelSurfaces], floor, color.c), [`--accent-${n}`, ...refIfPinned(\"--bg-0\")]);\n };\n emitAccentFamily(\"2\", a2);\n emitAccentFamily(\"3\", a3);\n emitAccentFamily(\"4\", a4);\n lit(\"--selection-cue\", extreme || knobs.cues === \"redundant\" ? \"marker\" : \"tint\");\n const statusChroma = Math.max(0.12, accent.c) * (0.6 + vibrancy * 0.7) * preset.statusChromaMul;\n for (const role of Object.keys(STATUS_TO_HUE)) {\n const namedHue = resolveStatusHue(role, pinned);\n const pinnedFill = parseChromaticPin(pinned[`--${role}`]);\n const roleHue = pinnedFill ? pinnedFill.h : namedHue;\n const fillL = scheme === \"dark\" ? 0.62 : 0.52;\n const fill = pinnedFill ?? pageFloor(fillWithTextHeadroom(fillL, statusChroma, roleHue, floor));\n const tintL = scheme === \"dark\" ? Math.min(0.3, bg0.l + 0.08) : Math.min(0.92, bg0.l - 0.04);\n const tint = ensureTextHeadroom(oklch2(tintL, statusChroma * 0.35, roleHue), scheme, AA + 0.3);\n const fillRefs = refIfPinned(\"--accent\", `--${role}`);\n lit(`--${role}`, formatCss2(fill), fillRefs);\n lit(`--${role}-bg`, formatCss2(tint), [`--${role}`, ...refIfPinned(\"--bg-0\")]);\n lit(`--${role}-fg`, pickReadable(fill, TEXT_POLES, floor), [`--${role}`]);\n lit(`--${role}-text`, readableHuedOnTintAndPanel(tint, roleHue, AA + 0.3, panelSurfaces, AA + 0.05, statusChroma), [`--${role}-bg`, ...refIfPinned(\"--bg-0\")]);\n lit(`--${role}-vivid`, vividOnPanel(roleHue, [bg0, ...panelSurfaces], floor, statusChroma), [`--${role}`, ...refIfPinned(\"--bg-0\")]);\n }\n const overlayL = scheme === \"dark\" ? 1 : 0;\n const extremeDist = scheme === \"dark\" ? bg0.l : 1 - bg0.l;\n const overlayBoost = 1 + Math.max(0, (0.15 - extremeDist) / 0.15) * 0.8;\n const overlay = (a) => formatCss2(oklch2(overlayL, 0, 0, Math.min(0.4, a * overlayBoost)));\n lit(\"--state-hover\", overlay(0.06));\n lit(\"--state-press\", overlay(0.12));\n lit(\"--state-selected\", overlay(0.16));\n lit(\"--state-disabled\", overlay(0.08));\n lit(\"--state-drag\", overlay(0.1));\n lit(\"--selection\", formatCss2(withAlpha(accentFill, 0.3)), [\"--accent\"]);\n lit(\"--highlight\", formatCss2(withAlpha(oklch2(scheme === \"dark\" ? 0.85 : 0.9, 0.16, paletteHueAngle(\"yellow\")), 0.35)));\n const linkColor = enforceChromaticOnPanels(accent);\n const linkCss = formatCss2(linkColor);\n let linkHoverColor = enforceChromaticOnPanels(withLightness(accent, accent.l + (scheme === \"dark\" ? 0.08 : -0.08)));\n if (formatCss2(linkHoverColor) === linkCss) {\n const pole = textLight ? 1 : 0;\n const toward = linkColor.l < pole ? 1 : -1;\n const distinctHover = (candidate) => {\n const enforced = enforceChromaticOnPanels(candidate);\n return formatCss2(enforced) === linkCss ? void 0 : enforced;\n };\n let hover;\n for (let step = 0.1; step <= 0.6 && !hover; step += 0.05) {\n hover = distinctHover(withLightness(linkColor, linkColor.l + toward * step));\n }\n for (let step = 0.1; step <= 0.6 && !hover; step += 0.05) {\n hover = distinctHover(withLightness(linkColor, linkColor.l - toward * step));\n }\n for (let cut = 0.7; cut >= 0.05 && !hover; cut -= 0.15) {\n hover = distinctHover(oklch2(linkColor.l, linkColor.c * cut, linkColor.h));\n }\n linkHoverColor = hover ?? linkHoverColor;\n }\n lit(\"--link\", formatCss2(linkColor), [\"--accent\", ...refIfPinned(\"--bg-0\")]);\n lit(\"--link-hover\", formatCss2(linkHoverColor), [\"--link\", ...refIfPinned(\"--bg-0\")]);\n for (const [hue3, spec2] of Object.entries(PALETTE_HUES)) {\n const pinnedBase = typeof spec2 === \"object\" ? parseChromaticPin(pinned[`--${hue3}`] ?? pinned[`--color-${hue3}-base`] ?? pinned[`--color-${hue3}`]) : null;\n const effectiveSpec = pinnedBase && typeof spec2 === \"object\" ? { h: pinnedBase.h, c: pinnedBase.c } : spec2;\n const ramp = {};\n paletteRamp(ramp, hue3, effectiveSpec, scheme, vibrancy, floor, preset, accent, [bg0, ...panelSurfaces], pinnedBase ?? void 0);\n lit(`--color-${hue3}`, ramp[`--color-${hue3}`]);\n for (const stop of PALETTE_STOPS) {\n lit(`--color-${hue3}-${stop}`, ramp[`--color-${hue3}-${stop}`], [\n `--color-${hue3}`\n ]);\n }\n lit(`--${hue3}`, ramp[`--${hue3}`], [`--color-${hue3}-base`]);\n lit(`--${hue3}-bg`, ramp[`--${hue3}-bg`], [`--color-${hue3}-subtle`]);\n lit(`--${hue3}-fg`, ramp[`--${hue3}-fg`], [`--color-${hue3}-base`]);\n lit(`--${hue3}-text`, ramp[`--${hue3}-text`], [`--color-${hue3}-subtle`]);\n lit(`--${hue3}-vivid`, ramp[`--${hue3}-vivid`], [\n `--color-${hue3}-base`,\n ...refIfPinned(\"--bg-0\")\n ]);\n }\n const codeBg = ensureTextHeadroom(withLightness(bg0, scheme === \"dark\" ? bg0.l - 0.02 : bg0.l + 0.012), scheme, floor);\n const codeBgCss = formatCss2(codeBg);\n lit(\"--code-bg\", codeBgCss, refIfPinned(\"--bg-0\"));\n const codeFg = enforceContrastFloor(fg0, codeBg, scheme, floor);\n const codeFgCss = formatCss2(codeFg);\n lit(\"--code-fg\", codeFgCss, [\"--fg-0\", ...refIfPinned(\"--bg-0\")]);\n lit(\"--code-line-highlight\", formatCss2(withAlpha(accentFill, 0.1)), [\"--accent\"]);\n lit(\"--code-selection\", formatCss2(withAlpha(accentFill, 0.3)), [\"--accent\"]);\n const codeTowardLight = contrast2(\"#ffffff\", codeBgCss) >= contrast2(\"#000000\", codeBgCss);\n const codePole = codeTowardLight ? 1 : 0;\n const codeFloor = AA;\n const readableHuedOnCode = (l, c2, h, fl) => {\n const seed = oklch2(l, c2, h);\n let best = seed;\n let bestContrast = emittedContrast(seed, codeBgCss);\n if (bestContrast >= fl)\n return seed;\n for (let i = 1; i <= 100; i++) {\n const cand = withLightness(seed, seed.l + (codePole - seed.l) * (i / 100));\n const ct = emittedContrast(cand, codeBgCss);\n if (ct >= fl)\n return cand;\n if (ct > bestContrast) {\n bestContrast = ct;\n best = cand;\n }\n }\n return best;\n };\n const codeChroma = Math.max(0.08, Math.max(0.1, accent.c) * (0.7 + vibrancy * 0.7) * preset.paletteChromaMul);\n const codeBaseHue = Number.isFinite(accent.h) ? accent.h : DERIVED_ACCENT_FALLBACK_HUE;\n const codeBaseL = codeTowardLight ? 0.76 : 0.46;\n const codePoleL = codeTowardLight ? 1 : 0;\n const aaEdgeL = lightnessForContrast(oklch2(codePoleL, 0, 0), codeBg, codeBgCss, codeFloor);\n const bandLo = aaEdgeL + (codePoleL - aaEdgeL) * 0.06;\n const bandHi = codePoleL - (codePoleL - aaEdgeL) * 0.32;\n CODE_VIVID_ROLES.forEach((role, rank) => {\n const hue3 = ((codeBaseHue + CODE_HUE_RANK[rank] * 45) % 360 + 360) % 360;\n const bandL = bandLo + (bandHi - bandLo) * (rank / 7);\n const fill = readableHuedOnCode(bandL, codeChroma, hue3, codeFloor);\n lit(`--code-${role}`, formatCss2(fill), [\"--accent\", \"--code-bg\"]);\n });\n const commentFloor = Math.max(3, codeFloor * 0.62);\n const commentL = codeTowardLight ? 0.6 : 0.56;\n lit(\"--code-comment\", formatCss2(readableHuedOnCode(commentL, Math.min(0.03, codeChroma * 0.3), codeBaseHue, commentFloor)), [\"--accent\", \"--code-bg\"]);\n lit(\"--code-operator\", formatCss2(readableHuedOnCode(codeBaseL, codeChroma * 0.5, codeBaseHue, codeFloor)), [\"--accent\", \"--code-bg\"]);\n lit(\"--code-punctuation\", formatCss2(enforceContrastFloor(withLightness(codeFg, codeFg.l + (codePole - codeFg.l) * 0.18), codeBg, scheme, codeFloor)), [\"--code-fg\", \"--code-bg\"]);\n lit(\"--code-variable\", codeFgCss, [\"--code-fg\"]);\n lit(\"--font-sans\", fonts.sans);\n lit(\"--font-mono\", fonts.mono);\n lit(\"--font-display\", fonts.display);\n const bodyIndex = TEXT_STEPS.indexOf(\"body\");\n TEXT_STEPS.forEach((step, index) => {\n const rem = BASE_TEXT_REM * typeScale ** (index - bodyIndex);\n lit(`--text-${step}`, `${rem.toFixed(4).replace(/\\.?0+$/, \"\")}rem`);\n });\n for (const step of LEADING_STEPS) {\n lit(`--leading-${step}`, String(LEADING_VALUES[step]));\n }\n for (const step of WEIGHT_STEPS) {\n lit(`--weight-${step}`, String(WEIGHT_VALUES[step]));\n }\n const radiusPx = {\n none: 0,\n sm: 2 * radiusScale,\n md: 4 * radiusScale,\n lg: 8 * radiusScale,\n full: 9999\n };\n for (const step of RADIUS_STEPS) {\n lit(`--radius-${step}`, `${radiusPx[step]}px`);\n }\n const borderPx = { thin: 1, normal: 1.5, thick: 2 };\n for (const step of BORDER_STEPS) {\n lit(`--border-${step}`, `${borderPx[step]}px`);\n }\n const durationMs = { fast: 120, base: 200, slow: 320 };\n for (const step of DURATION_STEPS) {\n lit(`--duration-${step}`, `${durationMs[step]}ms`);\n }\n lit(\"--ease-standard\", \"cubic-bezier(0.2, 0, 0, 1)\");\n lit(\"--ease-emphasized\", \"cubic-bezier(0.3, 0, 0, 1)\");\n const elevationStrings = {};\n for (const level of ELEVATION_STEPS) {\n const value = shadowString(scheme, level, vibrancy, preset);\n elevationStrings[level] = value;\n lit(`--elevation-${level}`, value);\n }\n lit(\"--shadow\", elevationStrings[3], [\"--elevation-3\"]);\n for (const step of SPACE_STEPS) {\n const rem = SPACE_BASE_REM * step * density;\n lit(`--space-${step}`, `${rem.toFixed(4).replace(/\\.?0+$/, \"\")}rem`);\n }\n const producedNames = new Set(nodes.map((n) => n.name));\n for (const [name, value] of Object.entries(pinned)) {\n if (producedNames.has(name)) {\n for (const node of nodes) {\n if (node.name === name) {\n node.value = value;\n node.resolve = void 0;\n node.refs = void 0;\n }\n }\n } else {\n nodes.push({ name, value });\n }\n }\n return nodes;\n }\n function resolveBaseInputs(preset, opts) {\n const completed = completeAnchors(preset, opts);\n return {\n knobs: opts.knobs ?? {},\n scheme: completed.scheme,\n pinned: opts.constraints ?? {}\n };\n }\n function buildPassContext(preset, opts, passIndex) {\n const base = resolveBaseInputs(preset, opts);\n return { ...base, passIndex };\n }\n function runPipeline(passes, makeCtx) {\n let register = {};\n const trace = [];\n passes.forEach((pass, index) => {\n register = pass.run(register, makeCtx(index));\n trace.push({ name: pass.name, register });\n });\n return { register, trace };\n }\n function settlePass(preset, opts) {\n return {\n name: \"settle\",\n run: () => resolveGraph(buildGraph(preset, opts))\n };\n }\n function registerToNodes(register) {\n return Object.entries(register).map(([name, value]) => ({ name, value }));\n }\n function alpha(value) {\n if (!value)\n return 1;\n const rgba = /rgba?\\([^)]*?,\\s*([0-9.]+)\\s*\\)/.exec(value);\n if (rgba && rgba[1] !== void 0)\n return Number.parseFloat(rgba[1]);\n if (value.startsWith(\"#\") && value.length === 9) {\n return Number.parseInt(value.slice(7, 9), 16) / 255;\n }\n if (value.startsWith(\"#\") && value.length === 5) {\n return Number.parseInt(value.slice(4, 5).repeat(2), 16) / 255;\n }\n return 1;\n }\n function parseRem(value) {\n if (!value)\n return Number.NaN;\n const m = /^(-?[0-9.]+)(rem|px)$/.exec(value.trim());\n return m ? Number.parseFloat(m[1]) : Number.NaN;\n }\n function parseMs(value) {\n if (!value)\n return Number.NaN;\n const m = /^(-?[0-9.]+)ms$/.exec(value.trim());\n return m ? Number.parseFloat(m[1]) : Number.NaN;\n }\n function shadowStrength(value) {\n if (!value || value === \"none\")\n return 0;\n let total = 0;\n const offsets = value.match(/([0-9.]+)px/g) ?? [];\n for (const off of offsets)\n total += Number.parseFloat(off);\n const alphas = value.match(/rgba?\\([^)]*,\\s*([0-9.]+)\\)/g) ?? [];\n for (const a of alphas) {\n const m = /,\\s*([0-9.]+)\\)/.exec(a);\n if (m)\n total += Number.parseFloat(m[1]) * 20;\n }\n return total;\n }\n var STATE_TOKENS = [\n \"--state-hover\",\n \"--state-press\",\n \"--state-selected\",\n \"--state-disabled\",\n \"--state-drag\"\n ];\n var CEILING_EPSILON = 0.05;\n function achievableFloor(declaredFloor, bgCss) {\n if (!bgCss)\n return declaredFloor;\n const ceiling = Math.max(contrast2(\"#000000\", bgCss), contrast2(\"#ffffff\", bgCss));\n return Math.min(declaredFloor, ceiling - CEILING_EPSILON);\n }\n function oklabDist(a, b) {\n const x = toOklchColor(a);\n const y = toOklchColor(b);\n const rad = Math.PI / 180;\n const ax = x.c * Math.cos(x.h * rad);\n const ay = x.c * Math.sin(x.h * rad);\n const bx = y.c * Math.cos(y.h * rad);\n const by = y.c * Math.sin(y.h * rad);\n return Math.hypot(x.l - y.l, ax - bx, ay - by);\n }\n function makeInvariants(preset) {\n const onFillFloor = preset.declaredTextOnFillFloor;\n return [\n (ctx) => {\n for (const name of PRODUCES) {\n const value = ctx.register[name];\n const category = ctx.categories[name];\n if (typeof value !== \"string\" || value.length === 0) {\n return {\n name: \"every token non-empty and format-valid for its category\",\n ok: false,\n detail: `${name} is ${value === void 0 ? \"missing\" : \"empty\"}`\n };\n }\n if (/nan/i.test(value)) {\n return {\n name: \"every token non-empty and format-valid for its category\",\n ok: false,\n detail: `${name} contains NaN: ${value}`\n };\n }\n switch (category) {\n case \"color\": {\n try {\n const o = toOklchColor(value);\n if (Number.isNaN(o.l) || Number.isNaN(o.c) || Number.isNaN(o.h) || Number.isNaN(alpha(value))) {\n return {\n name: \"every token non-empty and format-valid for its category\",\n ok: false,\n detail: `${name} parses to NaN: ${value}`\n };\n }\n } catch (error) {\n return {\n name: \"every token non-empty and format-valid for its category\",\n ok: false,\n detail: `${name} unparseable color: ${value} (${String(error)})`\n };\n }\n break;\n }\n case \"length\": {\n if (Number.isNaN(parseRem(value))) {\n return {\n name: \"every token non-empty and format-valid for its category\",\n ok: false,\n detail: `${name} not a css length: ${value}`\n };\n }\n break;\n }\n case \"duration\": {\n if (Number.isNaN(parseMs(value))) {\n return {\n name: \"every token non-empty and format-valid for its category\",\n ok: false,\n detail: `${name} not a duration: ${value}`\n };\n }\n break;\n }\n case \"number\": {\n if (Number.isNaN(Number.parseFloat(value))) {\n return {\n name: \"every token non-empty and format-valid for its category\",\n ok: false,\n detail: `${name} not a number: ${value}`\n };\n }\n break;\n }\n case \"easing\": {\n if (!value.startsWith(\"cubic-bezier(\")) {\n return {\n name: \"every token non-empty and format-valid for its category\",\n ok: false,\n detail: `${name} not an easing: ${value}`\n };\n }\n break;\n }\n case \"shadow\": {\n if (value !== \"none\" && !value.includes(\"rgba\")) {\n return {\n name: \"every token non-empty and format-valid for its category\",\n ok: false,\n detail: `${name} not a shadow: ${value}`\n };\n }\n break;\n }\n case \"font\":\n break;\n case \"keyword\": {\n const domain = KEYWORD_DOMAINS[name];\n if (domain && !domain.includes(value)) {\n return {\n name: \"every token non-empty and format-valid for its category\",\n ok: false,\n detail: `${name} not in {${domain.join(\" | \")}}: ${value}`\n };\n }\n break;\n }\n }\n }\n return { name: \"every token non-empty and format-valid for its category\", ok: true };\n },\n (ctx) => {\n const name = `fg-0 on bg-0 clears ${onFillFloor >= AAA - 0.01 ? \"AAA\" : \"AA\"}`;\n if (ctx.constraints[\"--fg-0\"]) {\n return { name, ok: true, detail: \"skipped (pinned text)\" };\n }\n const fg0 = ctx.register[\"--fg-0\"];\n const bg0 = ctx.register[\"--bg-0\"];\n const ratio = fg0 && bg0 ? contrast2(fg0, bg0) : 0;\n const required = achievableFloor(onFillFloor, ctx.constraints[\"--bg-0\"] ? bg0 : void 0);\n return {\n name,\n ok: ratio >= required - 0.01,\n detail: `contrast ${ratio.toFixed(2)} (floor ${required.toFixed(2)}${ctx.constraints[\"--bg-0\"] ? ` best-achievable, declared ${onFillFloor}` : \"\"})`\n };\n },\n (ctx) => {\n const name = `fg ramp clears ${preset.contrastFloor >= AAA - 0.01 ? \"AAA\" : \"AA\"}`;\n if (ctx.constraints[\"--fg-0\"]) {\n return { name, ok: true, detail: \"skipped (pinned text)\" };\n }\n const bg0 = ctx.register[\"--bg-0\"];\n if (!bg0)\n return { name, ok: false, detail: \"missing --bg-0\" };\n const required = achievableFloor(preset.contrastFloor, ctx.constraints[\"--bg-0\"] ? bg0 : void 0);\n for (let i = 1; i <= 3; i++) {\n const key = `--fg-${i}`;\n if (ctx.constraints[key])\n continue;\n const fg = ctx.register[key];\n const ratio = fg ? contrast2(fg, bg0) : 0;\n if (ratio < required - 0.01) {\n return {\n name,\n ok: false,\n detail: `${key} contrast ${ratio.toFixed(2)} (floor ${required.toFixed(2)}${ctx.constraints[\"--bg-0\"] ? ` best-achievable, declared ${preset.contrastFloor}` : \"\"})`\n };\n }\n }\n return { name, ok: true };\n },\n (ctx) => {\n const pairs = [\n [\"--accent-fg\", \"--accent\"],\n [\"--neutral-fg\", \"--neutral\"],\n [\"--success-fg\", \"--success\"],\n [\"--warn-fg\", \"--warn\"],\n [\"--danger-fg\", \"--danger\"],\n [\"--info-fg\", \"--info\"],\n [\"--accent-text\", \"--bg-0\"],\n [\"--neutral-text\", \"--bg-0\"]\n ];\n const surfaceFill = new Set(SURFACES);\n for (const [fgName, fillName] of pairs) {\n const fill = ctx.register[fillName];\n const pinned = Boolean(ctx.constraints[fillName]);\n if (pinned && !surfaceFill.has(fillName))\n continue;\n const fg = ctx.register[fgName];\n if (!fg || !fill)\n continue;\n const required = pinned ? achievableFloor(onFillFloor, fill) : onFillFloor;\n if (contrast2(fg, fill) < required - 0.01) {\n return {\n name: `on-fill text clears ${onFillFloor >= AAA - 0.01 ? \"AAA\" : \"AA\"}`,\n ok: false,\n detail: `${fgName} on ${fillName} = ${contrast2(fg, fill).toFixed(2)} (floor ${required.toFixed(2)}${pinned ? \" best-achievable\" : \"\"})`\n };\n }\n }\n return {\n name: `on-fill text clears ${onFillFloor >= AAA - 0.01 ? \"AAA\" : \"AA\"}`,\n ok: true\n };\n },\n (ctx) => {\n const pairs = [\n [\"--success-text\", \"--success-bg\"],\n [\"--warn-text\", \"--warn-bg\"],\n [\"--danger-text\", \"--danger-bg\"],\n [\"--info-text\", \"--info-bg\"]\n ];\n for (const [fgName, fillName] of pairs) {\n const fg = ctx.register[fgName];\n const fill = ctx.register[fillName];\n if (!fg || !fill)\n continue;\n if (contrast2(fg, fill) < AA - 0.01) {\n return {\n name: \"text-on-tint clears AA\",\n ok: false,\n detail: `${fgName} on ${fillName} = ${contrast2(fg, fill).toFixed(2)}`\n };\n }\n }\n return { name: \"text-on-tint clears AA\", ok: true };\n },\n (ctx) => {\n const name = \"achromatic tone inks stay neutral\";\n const achromatic = [\"gray\", \"white\", \"black\"];\n for (const hue3 of achromatic) {\n for (const token of [`--${hue3}-fg`, `--${hue3}-text`, `--color-${hue3}-contrast`]) {\n const value = ctx.register[token];\n if (!value)\n continue;\n const c2 = toOklchColor(value).c;\n if (c2 >= ACHROMATIC_CHROMA) {\n return { name, ok: false, detail: `${token} = ${value} (chroma ${c2.toFixed(3)} \\u2265 ${ACHROMATIC_CHROMA})` };\n }\n }\n }\n return { name, ok: true };\n },\n (ctx) => {\n const name = \"panel text clears AA on --bg-1 and --bg-2\";\n const neutralText = [\n \"--fg-1\",\n \"--fg-2\",\n \"--fg-3\",\n \"--placeholder\",\n \"--link\",\n \"--accent-text\",\n \"--neutral-text\",\n \"--neutral-vivid\"\n ];\n if (ctx.constraints[\"--bg-0\"])\n return { name, ok: true, detail: \"skipped (pinned bg-0)\" };\n const bg0 = ctx.register[\"--bg-0\"];\n if (!bg0)\n return { name, ok: true };\n const textLight = ctx.scheme === \"dark\";\n const themePole = textLight ? \"#ffffff\" : \"#000000\";\n const band = contrastBandFloor(ctx.knobs);\n const inkFloor = Math.max(ENFORCE, preset.contrastFloor, (band ?? 0) + 0.2);\n const statusRoles = Object.keys(STATUS_TO_HUE);\n for (const panel of PANEL_SURFACES) {\n const bg = ctx.register[panel];\n if (!bg)\n continue;\n const bgL = toOklchColor(bg).l;\n if (bgL < 0.5 !== textLight)\n continue;\n const poleCeiling = contrast2(themePole, bg);\n const required = Math.min(AA, poleCeiling - CEILING_EPSILON);\n const fg0Reach = (() => {\n const v = ctx.register[\"--fg-0\"];\n return v ? contrast2(v, bg) : Infinity;\n })();\n const inkReach = (source) => {\n const v = ctx.register[source];\n if (!v)\n return Infinity;\n const ink = toOklchColor(v);\n const targetL = textLight ? 1 : 0;\n let reach = contrast2(v, bg);\n for (let i = 1; i <= 100; i++) {\n const t = i / 100;\n const candidate = withLightness(ink, ink.l + (targetL - ink.l) * t);\n if (contrast2(formatCss2(candidate), bg0) < inkFloor - 0.01)\n break;\n reach = Math.max(reach, contrast2(formatCss2(candidate), bg));\n }\n return reach;\n };\n const accentInkReach = inkReach(\"--accent\");\n const neutralInkReach = inkReach(\"--neutral\");\n const check = (token, ceilingReach = Infinity) => {\n const fg = ctx.register[token];\n if (!fg)\n return null;\n const floorFor = Math.min(required, ceilingReach);\n const ratio = contrast2(fg, bg);\n if (ratio < floorFor - 0.05) {\n return {\n name,\n ok: false,\n detail: `${token} on ${panel} = ${ratio.toFixed(2)} (floor ${floorFor.toFixed(2)})`\n };\n }\n return null;\n };\n const fg0Bounded = /* @__PURE__ */ new Set([\"--fg-1\", \"--fg-2\", \"--fg-3\", \"--placeholder\"]);\n const accentBounded = /* @__PURE__ */ new Set([\"--link\", \"--accent-text\"]);\n const reachFor = (token) => {\n if (fg0Bounded.has(token))\n return fg0Reach;\n if (accentBounded.has(token))\n return accentInkReach;\n if (token === \"--neutral-text\" || token === \"--neutral-vivid\")\n return neutralInkReach;\n return Infinity;\n };\n for (const token of neutralText) {\n const fail = check(token, reachFor(token));\n if (fail)\n return fail;\n }\n for (const role of statusRoles) {\n const tintBg = ctx.register[`--${role}-bg`];\n if (tintBg) {\n const whiteJoint = contrast2(\"#ffffff\", tintBg) >= AA && contrast2(\"#ffffff\", bg) >= AA;\n const blackJoint = contrast2(\"#000000\", tintBg) >= AA && contrast2(\"#000000\", bg) >= AA;\n if (!whiteJoint && !blackJoint)\n continue;\n }\n const fail = check(`--${role}-text`);\n if (fail)\n return fail;\n const failVivid = check(`--${role}-vivid`);\n if (failVivid)\n return failVivid;\n }\n }\n return { name, ok: true };\n },\n (ctx) => {\n const name = \"solid fills separate from --bg-0\";\n const bg0 = ctx.register[\"--bg-0\"];\n if (!bg0)\n return { name, ok: true };\n const fills = [\"--accent\", \"--neutral\", ...Object.keys(STATUS_TO_HUE).map((r2) => `--${r2}`)];\n for (const token of fills) {\n if (ctx.constraints[token])\n continue;\n const fill = ctx.register[token];\n if (!fill)\n continue;\n const ratio = contrast2(fill, bg0);\n if (ratio < SURFACE_SEPARATION - 0.05) {\n return { name, ok: false, detail: `${token} = ${ratio.toFixed(2)} on --bg-0 (floor ${SURFACE_SEPARATION})` };\n }\n }\n return { name, ok: true };\n },\n (ctx) => {\n const name = \"borders separate from their surface\";\n const borders = [\n [\"--line\", \"--bg-0\", BORDER_SEPARATION],\n [\"--line-2\", \"--bg-0\", DIVIDER_SEPARATION],\n [\"--field-border\", \"--field-bg\", BORDER_SEPARATION]\n ];\n for (const [token, surface, separation] of borders) {\n if (ctx.constraints[token])\n continue;\n const border = ctx.register[token];\n const bg = ctx.register[surface];\n if (!border || !bg)\n continue;\n const ratio = contrast2(border, bg);\n if (ratio < separation - 0.05) {\n return { name, ok: false, detail: `${token} = ${ratio.toFixed(2)} on ${surface} (floor ${separation})` };\n }\n }\n return { name, ok: true };\n },\n (ctx) => {\n const ladder = [\"--bg-sunken\", ...SURFACES];\n const ls = ladder.map((name) => {\n const value = ctx.register[name];\n return value ? toOklchColor(value).l : 0;\n });\n const ascending = ctx.scheme === \"dark\";\n for (let i = 1; i < ls.length; i++) {\n const prev = ls[i - 1];\n const cur = ls[i];\n const ok = ascending ? cur >= prev - 1e-6 : cur <= prev + 1e-6;\n if (!ok) {\n return {\n name: \"surface lightness monotonic\",\n ok: false,\n detail: `${ladder[i - 1]}=${prev.toFixed(3)} ${ladder[i]}=${cur.toFixed(3)} (${ctx.scheme})`\n };\n }\n }\n return { name: \"surface lightness monotonic\", ok: true };\n },\n (ctx) => {\n for (const name of STATE_TOKENS) {\n const value = ctx.register[name];\n if (!value)\n continue;\n const a = alpha(value);\n if (a >= 1) {\n return {\n name: \"state overlays translucent\",\n ok: false,\n detail: `${name} alpha ${a}`\n };\n }\n }\n return { name: \"state overlays translucent\", ok: true };\n },\n (ctx) => {\n const linkName = `links clear ${onFillFloor >= AAA - 0.01 ? \"AAA\" : \"AA\"} on bg-0`;\n const bg0 = ctx.register[\"--bg-0\"];\n const required = achievableFloor(onFillFloor, ctx.constraints[\"--bg-0\"] ? bg0 : void 0);\n for (const name of [\"--link\", \"--link-hover\"]) {\n const link = ctx.register[name];\n if (!link || !bg0)\n continue;\n const ratio = contrast2(link, bg0);\n if (ratio < required - 0.01) {\n return {\n name: linkName,\n ok: false,\n detail: `${name} on --bg-0 = ${ratio.toFixed(2)} (floor ${required.toFixed(2)}${ctx.constraints[\"--bg-0\"] ? \" best-achievable\" : \"\"})`\n };\n }\n }\n return { name: linkName, ok: true };\n },\n (ctx) => {\n const name = \"link hover distinct from link\";\n const link = ctx.register[\"--link\"];\n const hover = ctx.register[\"--link-hover\"];\n if (!link || !hover)\n return { name, ok: true };\n if (ctx.constraints[\"--link\"] || ctx.constraints[\"--link-hover\"])\n return { name, ok: true };\n if (link === hover) {\n if (link === \"#000000\" || link === \"#ffffff\")\n return { name, ok: true };\n return { name, ok: false, detail: `--link and --link-hover both ${link}` };\n }\n return { name, ok: true };\n },\n (ctx) => {\n const name = \"unpinned accent ramp holds its fan at constant L/C\";\n const accentValue = ctx.register[\"--accent\"];\n if (!accentValue) {\n return { name, ok: true };\n }\n const accent = toOklchColor(accentValue);\n if (accent.c < HUE_STABLE_CHROMA) {\n return { name, ok: true };\n }\n const step = typeof ctx.knobs.accentShiftStep === \"number\" ? ctx.knobs.accentShiftStep : DEFAULT_SHIFT_STEP;\n const split = typeof ctx.knobs.accentSplit === \"number\" ? ctx.knobs.accentSplit : DEFAULT_ACCENT_SPLIT;\n const accent2Value = ctx.register[\"--accent-2\"];\n const accent3Value = ctx.register[\"--accent-3\"];\n const pinnedAccent2 = ctx.constraints[\"--accent-2\"] && accent2Value ? toOklchColor(accent2Value) : null;\n const pinnedAccent3 = ctx.constraints[\"--accent-3\"] && accent3Value ? toOklchColor(accent3Value) : null;\n const fanOffset = (n) => ACCENT_FAN === \"split-complement\" ? n === 2 ? pinnedAccent3 ? -hueDelta(accent.h, pinnedAccent3.h) : -split : n === 3 ? pinnedAccent2 ? -hueDelta(accent.h, pinnedAccent2.h) : split : 180 : step * (n - 1);\n for (let n = 2; n <= 4; n++) {\n if (ctx.constraints[`--accent-${n}`])\n continue;\n const value = ctx.register[`--accent-${n}`];\n if (!value)\n continue;\n const rotated = toOklchColor(value);\n const wantH = ((accent.h + fanOffset(n)) % 360 + 360) % 360;\n if (rotated.c >= HUE_STABLE_CHROMA) {\n let dh = Math.abs(rotated.h - wantH) % 360;\n if (dh > 180)\n dh = 360 - dh;\n if (dh > HUE_TOLERANCE) {\n return {\n name,\n ok: false,\n detail: `--accent-${n} h=${rotated.h.toFixed(1)} want ${wantH.toFixed(1)}`\n };\n }\n }\n if (Math.abs(rotated.l - accent.l) > LIGHTNESS_TOLERANCE) {\n return {\n name,\n ok: false,\n detail: `--accent-${n} l=${rotated.l.toFixed(3)} want ${accent.l.toFixed(3)}`\n };\n }\n const maxChroma = clampToGamut({ l: accent.l, c: accent.c, h: wantH, alpha: 1 }).c;\n const expectedChroma = Math.min(accent.c, maxChroma);\n if (Math.abs(rotated.c - expectedChroma) > 0.02) {\n return {\n name,\n ok: false,\n detail: `--accent-${n} chroma ${rotated.c.toFixed(3)} want max-at-hue ${expectedChroma.toFixed(3)}`\n };\n }\n }\n return { name, ok: true };\n },\n (ctx) => {\n for (const name of [\"--ring\", \"--ring-bg\", \"--scrim\", \"--selection\", \"--highlight\"]) {\n const value = ctx.register[name];\n if (!value)\n continue;\n if (alpha(value) >= 1) {\n return {\n name: \"ring/scrim/selection/highlight carry alpha < 1\",\n ok: false,\n detail: `${name} alpha ${alpha(value)}`\n };\n }\n }\n return { name: \"ring/scrim/selection/highlight carry alpha < 1\", ok: true };\n },\n (ctx) => {\n let prev = -Infinity;\n for (const step of TEXT_STEPS) {\n const rem = parseRem(ctx.register[`--text-${step}`]);\n if (Number.isNaN(rem)) {\n return {\n name: \"type scale strictly increasing\",\n ok: false,\n detail: `--text-${step} not a length`\n };\n }\n if (rem <= prev) {\n return {\n name: \"type scale strictly increasing\",\n ok: false,\n detail: `--text-${step}=${rem} not > ${prev}`\n };\n }\n prev = rem;\n }\n return { name: \"type scale strictly increasing\", ok: true };\n },\n (ctx) => {\n let prev = -Infinity;\n for (const step of WEIGHT_STEPS) {\n const w = Number.parseFloat(ctx.register[`--weight-${step}`] ?? \"\");\n if (Number.isNaN(w) || w <= prev) {\n return {\n name: \"weights strictly increasing\",\n ok: false,\n detail: `--weight-${step}=${w} not > ${prev}`\n };\n }\n prev = w;\n }\n return { name: \"weights strictly increasing\", ok: true };\n },\n (ctx) => {\n let prev = -Infinity;\n for (const step of LEADING_STEPS) {\n const v = Number.parseFloat(ctx.register[`--leading-${step}`] ?? \"\");\n if (Number.isNaN(v) || v <= prev) {\n return {\n name: \"leading strictly increasing\",\n ok: false,\n detail: `--leading-${step}=${v} not > ${prev}`\n };\n }\n prev = v;\n }\n return { name: \"leading strictly increasing\", ok: true };\n },\n (ctx) => {\n let prev = -Infinity;\n for (const step of RADIUS_STEPS) {\n const v = parseRem(ctx.register[`--radius-${step}`]);\n if (Number.isNaN(v) || v < prev - 1e-9) {\n return {\n name: \"radius ladder non-decreasing\",\n ok: false,\n detail: `--radius-${step}=${v} < ${prev}`\n };\n }\n prev = v;\n }\n return { name: \"radius ladder non-decreasing\", ok: true };\n },\n (ctx) => {\n let prev = -Infinity;\n for (const step of BORDER_STEPS) {\n const v = parseRem(ctx.register[`--border-${step}`]);\n if (Number.isNaN(v) || v <= prev) {\n return {\n name: \"borders strictly increasing\",\n ok: false,\n detail: `--border-${step}=${v} not > ${prev}`\n };\n }\n prev = v;\n }\n return { name: \"borders strictly increasing\", ok: true };\n },\n (ctx) => {\n let prev = -Infinity;\n for (const step of DURATION_STEPS) {\n const v = parseMs(ctx.register[`--duration-${step}`]);\n if (Number.isNaN(v) || v <= prev) {\n return {\n name: \"durations strictly increasing\",\n ok: false,\n detail: `--duration-${step}=${v} not > ${prev}`\n };\n }\n prev = v;\n }\n return { name: \"durations strictly increasing\", ok: true };\n },\n (ctx) => {\n let prev = -Infinity;\n for (const level of ELEVATION_STEPS) {\n const v = shadowStrength(ctx.register[`--elevation-${level}`]);\n if (v < prev - 1e-9) {\n return {\n name: \"elevation strength non-decreasing\",\n ok: false,\n detail: `--elevation-${level}=${v} < ${prev}`\n };\n }\n prev = v;\n }\n return { name: \"elevation strength non-decreasing\", ok: true };\n },\n (ctx) => {\n let prev = -Infinity;\n for (const step of SPACE_STEPS) {\n const v = parseRem(ctx.register[`--space-${step}`]);\n if (Number.isNaN(v) || v < prev - 1e-9) {\n return {\n name: \"space ramp non-decreasing\",\n ok: false,\n detail: `--space-${step}=${v} < ${prev}`\n };\n }\n prev = v;\n }\n return { name: \"space ramp non-decreasing\", ok: true };\n },\n (ctx) => {\n for (const [hue3, spec2] of Object.entries(PALETTE_HUES)) {\n const stops = PALETTE_STOPS.filter((s) => s !== \"contrast\").map((stop) => ctx.register[`--color-${hue3}-${stop}`]);\n const ls = stops.map((v) => v ? toOklchColor(v).l : Number.NaN);\n if (ls.some((l) => Number.isNaN(l))) {\n return {\n name: \"palette ramps monotonic in OKLCH lightness\",\n ok: false,\n detail: `--color-${hue3} ramp has a non-color stop`\n };\n }\n const ascending = ls[ls.length - 1] >= ls[0];\n for (let i = 1; i < ls.length; i++) {\n const prev = ls[i - 1];\n const cur = ls[i];\n const ok = ascending ? cur > prev + 1e-9 : cur < prev - 1e-9;\n if (!ok) {\n return {\n name: \"palette ramps monotonic in OKLCH lightness\",\n ok: false,\n detail: `--color-${hue3} ramp l[${i}]=${cur} not strictly ${ascending ? \">\" : \"<\"} ${prev}`\n };\n }\n }\n const base = ctx.register[`--color-${hue3}-base`];\n const contrastStop = ctx.register[`--color-${hue3}-contrast`];\n if (base && contrastStop && contrast2(base, contrastStop) < AA - 0.01) {\n return {\n name: \"palette ramps monotonic in OKLCH lightness\",\n ok: false,\n detail: `--color-${hue3}-contrast on -base = ${contrast2(base, contrastStop).toFixed(2)}`\n };\n }\n if (spec2 !== \"white\" && spec2 !== \"black\") {\n const subtle = ctx.register[`--color-${hue3}-subtle`];\n const strong = ctx.register[`--color-${hue3}-strong`];\n if (subtle && strong && contrast2(subtle, strong) < AA - 0.01) {\n return {\n name: \"palette ramps monotonic in OKLCH lightness\",\n ok: false,\n detail: `--color-${hue3}-strong on -subtle = ${contrast2(subtle, strong).toFixed(2)}`\n };\n }\n }\n if (typeof spec2 === \"object\" && base) {\n const o = toOklchColor(base);\n if (o.c >= HUE_STABLE_CHROMA) {\n let dh = Math.abs(o.h - spec2.h) % 360;\n if (dh > 180)\n dh = 360 - dh;\n if (dh > 20) {\n return {\n name: \"palette ramps monotonic in OKLCH lightness\",\n ok: false,\n detail: `--color-${hue3}-base h=${o.h.toFixed(1)} strayed from ${spec2.h}`\n };\n }\n }\n }\n }\n return { name: \"palette ramps monotonic in OKLCH lightness\", ok: true };\n },\n (ctx) => {\n const name = \"every tone family clears AA (fg on solid, text on bg)\";\n for (const tone of FULL_TONES) {\n const solid = ctx.register[`--${tone}`];\n const fg = ctx.register[`--${tone}-fg`];\n const bg = ctx.register[`--${tone}-bg`];\n const text = ctx.register[`--${tone}-text`];\n if (!solid || !fg || !bg || !text) {\n return { name, ok: false, detail: `--${tone} family is incomplete` };\n }\n if (contrast2(solid, fg) < AA - 0.01) {\n return { name, ok: false, detail: `--${tone}-fg on --${tone} = ${contrast2(solid, fg).toFixed(2)}` };\n }\n if (contrast2(bg, text) < AA - 0.01) {\n return { name, ok: false, detail: `--${tone}-text on --${tone}-bg = ${contrast2(bg, text).toFixed(2)}` };\n }\n }\n return { name, ok: true };\n },\n (ctx) => {\n const name = \"code palette readable on --code-bg\";\n const codeBg = ctx.register[\"--code-bg\"];\n if (!codeBg)\n return { name, ok: false, detail: \"--code-bg missing\" };\n const readFloor = achievableFloor(AA, codeBg);\n const commentFloor = achievableFloor(3, codeBg);\n for (const role of [...CODE_VIVID_ROLES, \"operator\"]) {\n const v = ctx.register[`--code-${role}`];\n const ratio = v ? contrast2(v, codeBg) : 0;\n if (ratio < readFloor - 0.05) {\n return { name, ok: false, detail: `--code-${role} on --code-bg = ${ratio.toFixed(2)} (floor ${readFloor.toFixed(2)})` };\n }\n }\n const commentRatio = contrast2(ctx.register[\"--code-comment\"] ?? \"#000\", codeBg);\n if (commentRatio < commentFloor - 0.05) {\n return { name, ok: false, detail: `--code-comment on --code-bg = ${commentRatio.toFixed(2)} (floor ${commentFloor.toFixed(2)})` };\n }\n return { name, ok: true };\n },\n (ctx) => {\n const name = \"code scopes mutually distinguishable\";\n const MIN_DE = 6e-3;\n const distinct = [...CODE_VIVID_ROLES, \"comment\"].map((r2) => `--code-${r2}`);\n for (let i = 0; i < distinct.length; i++) {\n for (let j = i + 1; j < distinct.length; j++) {\n const ni = distinct[i];\n const nj = distinct[j];\n const a = ctx.register[ni];\n const b = ctx.register[nj];\n if (!a || !b)\n continue;\n const d = oklabDist(a, b);\n if (d < MIN_DE) {\n return { name, ok: false, detail: `${ni} vs ${nj} \\u0394E=${d.toFixed(4)} (min ${MIN_DE})` };\n }\n }\n }\n return { name, ok: true };\n },\n (ctx) => {\n const name = \"status roles mutually distinguishable\";\n const MIN_DE = 0.02;\n const roles = Object.keys(STATUS_TO_HUE).map((r2) => `--${r2}`);\n for (let i = 0; i < roles.length; i++) {\n for (let j = i + 1; j < roles.length; j++) {\n const ni = roles[i];\n const nj = roles[j];\n const a = ctx.register[ni];\n const b = ctx.register[nj];\n if (!a || !b)\n continue;\n const d = oklabDist(a, b);\n if (d < MIN_DE) {\n return { name, ok: false, detail: `${ni} vs ${nj} \\u0394E=${d.toFixed(4)} (min ${MIN_DE})` };\n }\n }\n }\n return { name, ok: true };\n }\n ];\n }\n var PRODUCED_TOKENS = PRODUCES;\n var TOKEN_CATEGORIES = CATEGORIES;\n var SHARED_KNOBS = [\n \"scheme\",\n \"accentShiftStep\",\n \"accentSplit\",\n \"contrastBand\",\n \"vibrancy\",\n \"typeScale\",\n \"radiusScale\",\n \"density\",\n \"cues\",\n \"fonts\",\n \"anchors\"\n ];\n var DEFAULT_ANCHORS = {\n bg: \"#0f1115\",\n fg: \"#e8eaed\"\n };\n\n // packages/xtyle/dist/authoring.js\n function toLineage(nodes) {\n return nodes.map(({ name, value, refs }) => refs && refs.length ? { name, value, refs } : { name, value });\n }\n function registerExports(graph, traced, manifest, invariants) {\n xript.exports.register(\"graph\", (...args) => toLineage(graph(args[0] ?? {})));\n xript.exports.register(\"traced\", (...args) => traced(args[0] ?? {}));\n xript.exports.register(\"manifest\", () => ({ ...manifest, invariantCount: invariants.length }));\n xript.exports.register(\"invariants\", (...args) => invariants.map((invariant) => invariant(args[0])));\n }\n function tracePreset(preset, buildPasses, input) {\n return runPipeline(buildPasses(preset, input), (passIndex) => buildPassContext(preset, input, passIndex)).trace;\n }\n function toPreset(spec2) {\n const chroma = spec2.chroma ?? {};\n const elevation = spec2.elevation ?? {};\n const contrast3 = spec2.contrast ?? {};\n const preset = {\n id: spec2.id,\n knobs: spec2.knobs ?? SHARED_KNOBS,\n // Merge over the full default so a spec that names only some anchors (e.g. just `bg` and\n // `accent`) still yields a complete `bg`/`fg` default — derivation reads both, so a partial\n // `defaultAnchors` would crash when invoked with no anchor overrides.\n defaultAnchors: spec2.anchors ? { ...DEFAULT_ANCHORS, ...spec2.anchors } : DEFAULT_ANCHORS,\n contrastFloor: contrast3.floor ?? 4.7,\n declaredTextOnFillFloor: contrast3.textOnFill ?? 4.5,\n defaultVibrancy: spec2.vibrancy ?? 0.5,\n accentChromaMul: chroma.accent ?? 1,\n statusChromaMul: chroma.status ?? 1,\n paletteChromaMul: chroma.palette ?? 1,\n neutralChroma: chroma.neutral ?? 0.01,\n elevationStrengthMul: elevation.strength ?? 1,\n elevationAlphaBoost: elevation.alphaBoost ?? 0,\n accentTintChromaMul: chroma.accentTint ?? 0.3\n };\n if (spec2.extreme)\n preset.extreme = true;\n return preset;\n }\n function defineXtyleAlgorithm(spec2) {\n const preset = toPreset(spec2);\n const buildPasses = spec2.passes ?? ((p4, input) => [settlePass(p4, input)]);\n const singlePass = buildPasses(preset, {}).length === 1;\n const finalNodes = (input) => singlePass ? buildGraph(preset, input) : registerToNodes(runPipeline(buildPasses(preset, input), (passIndex) => buildPassContext(preset, input, passIndex)).register);\n registerExports(finalNodes, (input) => tracePreset(preset, buildPasses, input), {\n produces: PRODUCED_TOKENS,\n categories: TOKEN_CATEGORIES,\n knobs: preset.knobs,\n passNames: buildPasses(preset, {}).map((pass) => pass.name)\n }, makeInvariants(preset));\n }\n\n // algorithms/nxi-nite/src/preset.ts\n var spec = {\n id: \"nxi-nite\",\n knobs: [\n \"scheme\",\n \"accentShiftStep\",\n \"accentSplit\",\n \"contrastBand\",\n \"vibrancy\",\n \"typeScale\",\n \"radiusScale\",\n \"density\",\n \"cues\",\n \"fonts\",\n \"anchors\",\n \"hour\"\n ]\n };\n\n // algorithms/nxi-nite/src/passes.ts\n var DEFAULT_HOUR = 12;\n var FLOOR = 4.5 + 0.2;\n var WARM_HUE = 65;\n var COOL_HUE = 250;\n var DIM_AMPLITUDE = 0.12;\n var WARMTH_AMPLITUDE = 18;\n function hourOf(knobs) {\n const raw = typeof knobs.hour === \"number\" ? knobs.hour : DEFAULT_HOUR;\n return Math.min(24, Math.max(0, raw));\n }\n function nightness(hour) {\n return Math.cos(hour / 24 * 2 * Math.PI);\n }\n function phaseOf(ctx) {\n return nightness(hourOf(ctx.knobs ?? {}));\n }\n var DIM_LADDER = [\"--bg-sunken\", \"--body-bg\", \"--bg-0\", \"--bg-1\", \"--bg-2\", \"--bg-3\"];\n var DIM_EXTRA = [\"--surface-overlay\", \"--field-bg\"];\n var SURFACE_TOKENS = [...DIM_LADDER, ...DIM_EXTRA];\n var WARMTH_TOKENS = SURFACE_TOKENS;\n function isColor(name) {\n return TOKEN_CATEGORIES[name] === \"color\";\n }\n function asColor(value) {\n if (!value || value === \"none\") return null;\n try {\n const o = toOklchColor(value);\n if (Number.isNaN(o.l) || Number.isNaN(o.c) || Number.isNaN(o.h)) return null;\n return o;\n } catch {\n return null;\n }\n }\n function hasAlpha(value) {\n if (value.startsWith(\"#\")) return value.length === 9 || value.length === 5;\n return /rgba?\\([^)]*,\\s*[0-9.]+\\s*\\)/.test(value);\n }\n function shiftHue(hue3, target, degrees) {\n let d = ((target - hue3) % 360 + 360) % 360;\n if (d > 180) d -= 360;\n const move = Math.sign(d) * Math.min(Math.abs(d), degrees);\n return ((hue3 + move) % 360 + 360) % 360;\n }\n function relLuminance(value) {\n return contrast2(value, \"#000000\") * 0.05 - 0.05;\n }\n function achievableFloor2(declaredFloor, bgValue) {\n const ceiling = Math.max(contrast2(\"#000000\", bgValue), contrast2(\"#ffffff\", bgValue));\n return Math.min(declaredFloor, ceiling - 0.05);\n }\n function matchLuminance(color, targetL) {\n const lum = (l) => relLuminance(formatCss2(withLightness(color, l)));\n let lo = 0;\n let hi = 1;\n for (let i = 0; i < 24; i++) {\n const mid = (lo + hi) / 2;\n if (lum(mid) < targetL) lo = mid;\n else hi = mid;\n }\n return withLightness(color, (lo + hi) / 2);\n }\n function warmthRun(register, ctx) {\n const n = phaseOf(ctx);\n if (n === 0) return { ...register };\n const target = n >= 0 ? WARM_HUE : COOL_HUE;\n const degrees = Math.abs(n) * WARMTH_AMPLITUDE;\n const tintChroma = Math.abs(n) * 0.012;\n const out = { ...register };\n for (const name of WARMTH_TOKENS) {\n const value = register[name];\n if (value === void 0) continue;\n if (ctx.pinned[name] !== void 0) continue;\n if (!isColor(name) || hasAlpha(value)) continue;\n const color = asColor(value);\n if (!color) continue;\n if (value === \"#ffffff\" || value === \"#000000\") continue;\n const targetLum = relLuminance(value);\n const sourceHue = color.c < 0.01 ? target : color.h;\n const newHue = shiftHue(sourceHue, target, degrees);\n const newChroma = Math.max(color.c, color.c < 0.01 ? tintChroma : 0);\n const tinted = oklch2(color.l, newChroma, newHue, color.alpha);\n out[name] = formatCss2(matchLuminance(tinted, targetLum));\n }\n return out;\n }\n function dimRun(register, ctx) {\n const n = phaseOf(ctx);\n const desired = Math.max(0, n) * DIM_AMPLITUDE;\n if (desired === 0) return { ...register };\n const ladderPinned = DIM_LADDER.some((name) => ctx.pinned[name] !== void 0);\n const pole = ctx.scheme === \"dark\" ? 0 : 1;\n const targets = ladderPinned ? DIM_EXTRA : SURFACE_TOKENS;\n const dimmed = (value, t2) => {\n const color = asColor(value);\n if (!color) return null;\n return formatCss2(withLightness(color, color.l + (pole - color.l) * t2));\n };\n const inks = RESTORE_PAIRS.filter((p4) => ctx.pinned[p4.fg] === void 0).map((p4) => ({ value: register[p4.fg], floor: p4.floor })).filter((x) => x.value !== void 0 && !hasAlpha(x.value));\n const textSurfaces = targets.filter(\n (s) => s === \"--bg-0\" || s === \"--bg-1\" || s === \"--bg-2\"\n );\n const bg0Value = register[\"--bg-0\"];\n const bg0Dims = !ladderPinned && bg0Value !== void 0 && !hasAlpha(bg0Value);\n const fills = bg0Dims ? FILL_TOKENS.filter((name) => ctx.pinned[name] === void 0).map((name) => register[name]).filter((v) => v !== void 0 && !hasAlpha(v)) : [];\n const inkSafe = (t2) => textSurfaces.every((surface) => {\n const sv = register[surface];\n if (sv === void 0 || hasAlpha(sv)) return true;\n const sdim = dimmed(sv, t2);\n if (sdim === null) return true;\n return inks.every(\n ({ value, floor }) => contrast2(value, sdim) >= Math.min(floor, contrast2(value, sv)) - 5e-3\n );\n });\n const fillSafe = (t2) => {\n if (!bg0Dims || bg0Value === void 0) return true;\n const sdim = dimmed(bg0Value, t2);\n if (sdim === null) return true;\n return fills.every(\n (f3) => contrast2(f3, sdim) >= Math.min(SURFACE_SEPARATION, contrast2(f3, bg0Value)) - 5e-3\n );\n };\n const safe = (t2) => inkSafe(t2) && fillSafe(t2);\n let t = desired;\n if (!safe(t)) {\n let lo = 0;\n let hi = desired;\n for (let i = 0; i < 24; i++) {\n const mid = (lo + hi) / 2;\n if (safe(mid)) lo = mid;\n else hi = mid;\n }\n t = lo;\n }\n if (t === 0) return { ...register };\n const out = { ...register };\n for (const name of targets) {\n if (ctx.pinned[name] !== void 0) continue;\n if (!isColor(name)) continue;\n const value = register[name];\n if (value === void 0 || hasAlpha(value)) continue;\n const moved = dimmed(value, t);\n if (moved !== null) out[name] = moved;\n }\n return out;\n }\n var RESTORE_PAIRS = [\n { fg: \"--fg-0\", bg: \"--bg-0\", floor: FLOOR },\n { fg: \"--fg-1\", bg: \"--bg-0\", floor: FLOOR },\n { fg: \"--fg-2\", bg: \"--bg-0\", floor: FLOOR },\n { fg: \"--fg-3\", bg: \"--bg-0\", floor: FLOOR },\n { fg: \"--placeholder\", bg: \"--bg-0\", floor: FLOOR },\n { fg: \"--fg-disabled\", bg: \"--bg-0\", floor: FLOOR },\n { fg: \"--accent-text\", bg: \"--bg-0\", floor: FLOOR },\n { fg: \"--neutral-text\", bg: \"--bg-0\", floor: FLOOR },\n { fg: \"--link\", bg: \"--bg-0\", floor: FLOOR },\n { fg: \"--link-hover\", bg: \"--bg-0\", floor: FLOOR },\n // The vivid on-surface tone inks clear AA by a tight margin (that's the point), so the\n // night shift can tip them under where the muted `-text` inks survive on headroom. Restore\n // them against `--bg-2`, the most-elevated same-side panel and therefore the hardest case —\n // clearing it clears the nearer panels too.\n { fg: \"--success-vivid\", bg: \"--bg-2\", floor: FLOOR },\n { fg: \"--warn-vivid\", bg: \"--bg-2\", floor: FLOOR },\n { fg: \"--danger-vivid\", bg: \"--bg-2\", floor: FLOOR },\n { fg: \"--info-vivid\", bg: \"--bg-2\", floor: FLOOR },\n { fg: \"--neutral-vivid\", bg: \"--bg-2\", floor: FLOOR }\n ];\n var BORDER_RESTORE = [\n { border: \"--line\", surface: \"--bg-0\", floor: BORDER_SEPARATION },\n { border: \"--line-2\", surface: \"--bg-0\", floor: DIVIDER_SEPARATION },\n { border: \"--field-border\", surface: \"--field-bg\", floor: BORDER_SEPARATION }\n ];\n var FILL_TOKENS = [\"--accent\", \"--neutral\", \"--success\", \"--warn\", \"--danger\", \"--info\"];\n function clearBounded(fgValue, bgValue, bg0Value, scheme, floor) {\n const reachable = achievableFloor2(floor, bgValue);\n if (contrast2(fgValue, bgValue) >= reachable - 0.01) return fgValue;\n const fg = asColor(fgValue);\n const bg = asColor(bgValue);\n if (!fg || !bg) return fgValue;\n const repaired = formatCss2(enforceContrastFloor(fg, bg, scheme, reachable));\n if (contrast2(repaired, bg0Value) < contrast2(fgValue, bg0Value) - 0.01) return fgValue;\n return repaired;\n }\n function contrastRestoreRun(register, ctx) {\n const out = { ...register };\n const bg0Value = out[\"--bg-0\"];\n if (bg0Value === void 0) return out;\n for (const { fg, bg, floor } of RESTORE_PAIRS) {\n if (ctx.pinned[fg] !== void 0) continue;\n const fgValue = out[fg];\n const bgValue = out[bg];\n if (fgValue === void 0 || bgValue === void 0 || hasAlpha(fgValue)) continue;\n out[fg] = clearBounded(fgValue, bgValue, bg0Value, ctx.scheme, floor);\n }\n for (const { border, surface, floor } of BORDER_RESTORE) {\n if (ctx.pinned[border] !== void 0) continue;\n const borderValue = out[border];\n const surfaceValue = out[surface];\n if (borderValue === void 0 || surfaceValue === void 0 || hasAlpha(borderValue)) continue;\n const seed = asColor(borderValue);\n const surf = asColor(surfaceValue);\n if (!seed || !surf) continue;\n out[border] = formatCss2(borderForContrast(seed, surf, floor));\n }\n return out;\n }\n function warmthPass() {\n return { name: \"warmth\", run: warmthRun };\n }\n function dimPass() {\n return { name: \"dim\", run: dimRun };\n }\n function contrastRestorePass() {\n return { name: \"contrast-restore\", run: contrastRestoreRun };\n }\n function nxiNitePasses(preset, opts) {\n return [settlePass(preset, opts), warmthPass(), dimPass(), contrastRestorePass()];\n }\n\n // algorithms/nxi-nite/src/mod.ts\n defineXtyleAlgorithm({ ...spec, passes: nxiNitePasses });\n})();\n" }, "xtyle-default": { "manifest": { "$schema": "https://xript.dev/schema/mod-manifest/v0.7.json", "xript": "0.7", "name": "xtyle-default", "version": "0.1.0", "title": "Xtyle Default", "family": "xtyle", "capabilities": ["color-math"], "entry": { "script": "src/mod.js", "format": "script", "exports": { "graph": { "description": "Token lineage nodes for anchors+knobs.", "params": [{ "name": "input", "type": "DeriveInput" }], "returns": { "array": "TokenNode" } }, "traced": { "description": "Per-pass register snapshots for anchors+knobs.", "params": [{ "name": "input", "type": "DeriveInput" }], "returns": { "array": "TraceSnapshot" } }, "manifest": { "description": "produces + categories + knobs.", "returns": "AlgorithmManifest" }, "invariants": { "description": "Evaluate per-algorithm invariants.", "params": [{ "name": "ctx", "type": "map" }], "returns": { "array": "InvariantResult" } } } } }, "source": "(() => {\n var __defProp = Object.defineProperty;\n var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\n var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\n\n // node_modules/culori/src/rgb/parseNumber.js\n var parseNumber = (color, len) => {\n if (typeof color !== \"number\") return;\n if (len === 3) {\n return {\n mode: \"rgb\",\n r: (color >> 8 & 15 | color >> 4 & 240) / 255,\n g: (color >> 4 & 15 | color & 240) / 255,\n b: (color & 15 | color << 4 & 240) / 255\n };\n }\n if (len === 4) {\n return {\n mode: \"rgb\",\n r: (color >> 12 & 15 | color >> 8 & 240) / 255,\n g: (color >> 8 & 15 | color >> 4 & 240) / 255,\n b: (color >> 4 & 15 | color & 240) / 255,\n alpha: (color & 15 | color << 4 & 240) / 255\n };\n }\n if (len === 6) {\n return {\n mode: \"rgb\",\n r: (color >> 16 & 255) / 255,\n g: (color >> 8 & 255) / 255,\n b: (color & 255) / 255\n };\n }\n if (len === 8) {\n return {\n mode: \"rgb\",\n r: (color >> 24 & 255) / 255,\n g: (color >> 16 & 255) / 255,\n b: (color >> 8 & 255) / 255,\n alpha: (color & 255) / 255\n };\n }\n };\n var parseNumber_default = parseNumber;\n\n // node_modules/culori/src/colors/named.js\n var named = {\n aliceblue: 15792383,\n antiquewhite: 16444375,\n aqua: 65535,\n aquamarine: 8388564,\n azure: 15794175,\n beige: 16119260,\n bisque: 16770244,\n black: 0,\n blanchedalmond: 16772045,\n blue: 255,\n blueviolet: 9055202,\n brown: 10824234,\n burlywood: 14596231,\n cadetblue: 6266528,\n chartreuse: 8388352,\n chocolate: 13789470,\n coral: 16744272,\n cornflowerblue: 6591981,\n cornsilk: 16775388,\n crimson: 14423100,\n cyan: 65535,\n darkblue: 139,\n darkcyan: 35723,\n darkgoldenrod: 12092939,\n darkgray: 11119017,\n darkgreen: 25600,\n darkgrey: 11119017,\n darkkhaki: 12433259,\n darkmagenta: 9109643,\n darkolivegreen: 5597999,\n darkorange: 16747520,\n darkorchid: 10040012,\n darkred: 9109504,\n darksalmon: 15308410,\n darkseagreen: 9419919,\n darkslateblue: 4734347,\n darkslategray: 3100495,\n darkslategrey: 3100495,\n darkturquoise: 52945,\n darkviolet: 9699539,\n deeppink: 16716947,\n deepskyblue: 49151,\n dimgray: 6908265,\n dimgrey: 6908265,\n dodgerblue: 2003199,\n firebrick: 11674146,\n floralwhite: 16775920,\n forestgreen: 2263842,\n fuchsia: 16711935,\n gainsboro: 14474460,\n ghostwhite: 16316671,\n gold: 16766720,\n goldenrod: 14329120,\n gray: 8421504,\n green: 32768,\n greenyellow: 11403055,\n grey: 8421504,\n honeydew: 15794160,\n hotpink: 16738740,\n indianred: 13458524,\n indigo: 4915330,\n ivory: 16777200,\n khaki: 15787660,\n lavender: 15132410,\n lavenderblush: 16773365,\n lawngreen: 8190976,\n lemonchiffon: 16775885,\n lightblue: 11393254,\n lightcoral: 15761536,\n lightcyan: 14745599,\n lightgoldenrodyellow: 16448210,\n lightgray: 13882323,\n lightgreen: 9498256,\n lightgrey: 13882323,\n lightpink: 16758465,\n lightsalmon: 16752762,\n lightseagreen: 2142890,\n lightskyblue: 8900346,\n lightslategray: 7833753,\n lightslategrey: 7833753,\n lightsteelblue: 11584734,\n lightyellow: 16777184,\n lime: 65280,\n limegreen: 3329330,\n linen: 16445670,\n magenta: 16711935,\n maroon: 8388608,\n mediumaquamarine: 6737322,\n mediumblue: 205,\n mediumorchid: 12211667,\n mediumpurple: 9662683,\n mediumseagreen: 3978097,\n mediumslateblue: 8087790,\n mediumspringgreen: 64154,\n mediumturquoise: 4772300,\n mediumvioletred: 13047173,\n midnightblue: 1644912,\n mintcream: 16121850,\n mistyrose: 16770273,\n moccasin: 16770229,\n navajowhite: 16768685,\n navy: 128,\n oldlace: 16643558,\n olive: 8421376,\n olivedrab: 7048739,\n orange: 16753920,\n orangered: 16729344,\n orchid: 14315734,\n palegoldenrod: 15657130,\n palegreen: 10025880,\n paleturquoise: 11529966,\n palevioletred: 14381203,\n papayawhip: 16773077,\n peachpuff: 16767673,\n peru: 13468991,\n pink: 16761035,\n plum: 14524637,\n powderblue: 11591910,\n purple: 8388736,\n // Added in CSS Colors Level 4:\n // https://drafts.csswg.org/css-color/#changes-from-3\n rebeccapurple: 6697881,\n red: 16711680,\n rosybrown: 12357519,\n royalblue: 4286945,\n saddlebrown: 9127187,\n salmon: 16416882,\n sandybrown: 16032864,\n seagreen: 3050327,\n seashell: 16774638,\n sienna: 10506797,\n silver: 12632256,\n skyblue: 8900331,\n slateblue: 6970061,\n slategray: 7372944,\n slategrey: 7372944,\n snow: 16775930,\n springgreen: 65407,\n steelblue: 4620980,\n tan: 13808780,\n teal: 32896,\n thistle: 14204888,\n tomato: 16737095,\n turquoise: 4251856,\n violet: 15631086,\n wheat: 16113331,\n white: 16777215,\n whitesmoke: 16119285,\n yellow: 16776960,\n yellowgreen: 10145074\n };\n var named_default = named;\n\n // node_modules/culori/src/rgb/parseNamed.js\n var parseNamed = (color) => {\n return parseNumber_default(named_default[color.toLowerCase()], 6);\n };\n var parseNamed_default = parseNamed;\n\n // node_modules/culori/src/rgb/parseHex.js\n var hex = /^#?([0-9a-f]{8}|[0-9a-f]{6}|[0-9a-f]{4}|[0-9a-f]{3})$/i;\n var parseHex = (color) => {\n let match;\n return (match = color.match(hex)) ? parseNumber_default(parseInt(match[1], 16), match[1].length) : void 0;\n };\n var parseHex_default = parseHex;\n\n // node_modules/culori/src/util/regex.js\n var num = \"([+-]?\\\\d*\\\\.?\\\\d+(?:[eE][+-]?\\\\d+)?)\";\n var num_none = `(?:${num}|none)`;\n var per = `${num}%`;\n var per_none = `(?:${num}%|none)`;\n var num_per = `(?:${num}%|${num})`;\n var num_per_none = `(?:${num}%|${num}|none)`;\n var hue = `(?:${num}(deg|grad|rad|turn)|${num})`;\n var hue_none = `(?:${num}(deg|grad|rad|turn)|${num}|none)`;\n var c = `\\\\s*,\\\\s*`;\n var rx_num_per_none = new RegExp(\"^\" + num_per_none + \"$\");\n\n // node_modules/culori/src/rgb/parseRgbLegacy.js\n var rgb_num_old = new RegExp(\n `^rgba?\\\\(\\\\s*${num}${c}${num}${c}${num}\\\\s*(?:,\\\\s*${num_per}\\\\s*)?\\\\)$`\n );\n var rgb_per_old = new RegExp(\n `^rgba?\\\\(\\\\s*${per}${c}${per}${c}${per}\\\\s*(?:,\\\\s*${num_per}\\\\s*)?\\\\)$`\n );\n var parseRgbLegacy = (color) => {\n let res = { mode: \"rgb\" };\n let match;\n if (match = color.match(rgb_num_old)) {\n if (match[1] !== void 0) {\n res.r = match[1] / 255;\n }\n if (match[2] !== void 0) {\n res.g = match[2] / 255;\n }\n if (match[3] !== void 0) {\n res.b = match[3] / 255;\n }\n } else if (match = color.match(rgb_per_old)) {\n if (match[1] !== void 0) {\n res.r = match[1] / 100;\n }\n if (match[2] !== void 0) {\n res.g = match[2] / 100;\n }\n if (match[3] !== void 0) {\n res.b = match[3] / 100;\n }\n } else {\n return void 0;\n }\n if (match[4] !== void 0) {\n res.alpha = Math.max(0, Math.min(1, match[4] / 100));\n } else if (match[5] !== void 0) {\n res.alpha = Math.max(0, Math.min(1, +match[5]));\n }\n return res;\n };\n var parseRgbLegacy_default = parseRgbLegacy;\n\n // node_modules/culori/src/_prepare.js\n var prepare = (color, mode) => color === void 0 ? void 0 : typeof color !== \"object\" ? parse_default(color) : color.mode !== void 0 ? color : mode ? { ...color, mode } : void 0;\n var prepare_default = prepare;\n\n // node_modules/culori/src/converter.js\n var converter = (target_mode = \"rgb\") => (color) => (color = prepare_default(color, target_mode)) !== void 0 ? (\n // if the color's mode corresponds to our target mode\n color.mode === target_mode ? (\n // then just return the color\n color\n ) : (\n // otherwise check to see if we have a dedicated\n // converter for the target mode\n converters[color.mode][target_mode] ? (\n // and return its result...\n converters[color.mode][target_mode](color)\n ) : (\n // ...otherwise pass through RGB as an intermediary step.\n // if the target mode is RGB...\n target_mode === \"rgb\" ? (\n // just return the RGB\n converters[color.mode].rgb(color)\n ) : (\n // otherwise convert color.mode -> RGB -> target_mode\n converters.rgb[target_mode](converters[color.mode].rgb(color))\n )\n )\n )\n ) : void 0;\n var converter_default = converter;\n\n // node_modules/culori/src/modes.js\n var converters = {};\n var modes = {};\n var parsers = [];\n var colorProfiles = {};\n var identity = (v) => v;\n var useMode = (definition29) => {\n converters[definition29.mode] = {\n ...converters[definition29.mode],\n ...definition29.toMode\n };\n Object.keys(definition29.fromMode || {}).forEach((k4) => {\n if (!converters[k4]) {\n converters[k4] = {};\n }\n converters[k4][definition29.mode] = definition29.fromMode[k4];\n });\n if (!definition29.ranges) {\n definition29.ranges = {};\n }\n if (!definition29.difference) {\n definition29.difference = {};\n }\n definition29.channels.forEach((channel) => {\n if (definition29.ranges[channel] === void 0) {\n definition29.ranges[channel] = [0, 1];\n }\n if (!definition29.interpolate[channel]) {\n throw new Error(`Missing interpolator for: ${channel}`);\n }\n if (typeof definition29.interpolate[channel] === \"function\") {\n definition29.interpolate[channel] = {\n use: definition29.interpolate[channel]\n };\n }\n if (!definition29.interpolate[channel].fixup) {\n definition29.interpolate[channel].fixup = identity;\n }\n });\n modes[definition29.mode] = definition29;\n (definition29.parse || []).forEach((parser) => {\n useParser(parser, definition29.mode);\n });\n return converter_default(definition29.mode);\n };\n var getMode = (mode) => modes[mode];\n var useParser = (parser, mode) => {\n if (typeof parser === \"string\") {\n if (!mode) {\n throw new Error(`'mode' required when 'parser' is a string`);\n }\n colorProfiles[parser] = mode;\n } else if (typeof parser === \"function\") {\n if (parsers.indexOf(parser) < 0) {\n parsers.push(parser);\n }\n }\n };\n\n // node_modules/culori/src/parse.js\n var IdentStartCodePoint = /[^\\x00-\\x7F]|[a-zA-Z_]/;\n var IdentCodePoint = /[^\\x00-\\x7F]|[-\\w]/;\n var Tok = {\n Function: \"function\",\n Ident: \"ident\",\n Number: \"number\",\n Percentage: \"percentage\",\n ParenClose: \")\",\n None: \"none\",\n Hue: \"hue\",\n Alpha: \"alpha\"\n };\n var _i = 0;\n function is_num(chars) {\n let ch = chars[_i];\n let ch1 = chars[_i + 1];\n if (ch === \"-\" || ch === \"+\") {\n return /\\d/.test(ch1) || ch1 === \".\" && /\\d/.test(chars[_i + 2]);\n }\n if (ch === \".\") {\n return /\\d/.test(ch1);\n }\n return /\\d/.test(ch);\n }\n function is_ident(chars) {\n if (_i >= chars.length) {\n return false;\n }\n let ch = chars[_i];\n if (IdentStartCodePoint.test(ch)) {\n return true;\n }\n if (ch === \"-\") {\n if (chars.length - _i < 2) {\n return false;\n }\n let ch1 = chars[_i + 1];\n if (ch1 === \"-\" || IdentStartCodePoint.test(ch1)) {\n return true;\n }\n return false;\n }\n return false;\n }\n var huenits = {\n deg: 1,\n rad: 180 / Math.PI,\n grad: 9 / 10,\n turn: 360\n };\n function num2(chars) {\n let value = \"\";\n if (chars[_i] === \"-\" || chars[_i] === \"+\") {\n value += chars[_i++];\n }\n value += digits(chars);\n if (chars[_i] === \".\" && /\\d/.test(chars[_i + 1])) {\n value += chars[_i++] + digits(chars);\n }\n if (chars[_i] === \"e\" || chars[_i] === \"E\") {\n if ((chars[_i + 1] === \"-\" || chars[_i + 1] === \"+\") && /\\d/.test(chars[_i + 2])) {\n value += chars[_i++] + chars[_i++] + digits(chars);\n } else if (/\\d/.test(chars[_i + 1])) {\n value += chars[_i++] + digits(chars);\n }\n }\n if (is_ident(chars)) {\n let id = ident(chars);\n if (id === \"deg\" || id === \"rad\" || id === \"turn\" || id === \"grad\") {\n return { type: Tok.Hue, value: value * huenits[id] };\n }\n return void 0;\n }\n if (chars[_i] === \"%\") {\n _i++;\n return { type: Tok.Percentage, value: +value };\n }\n return { type: Tok.Number, value: +value };\n }\n function digits(chars) {\n let v = \"\";\n while (/\\d/.test(chars[_i])) {\n v += chars[_i++];\n }\n return v;\n }\n function ident(chars) {\n let v = \"\";\n while (_i < chars.length && IdentCodePoint.test(chars[_i])) {\n v += chars[_i++];\n }\n return v;\n }\n function identlike(chars) {\n let v = ident(chars);\n if (chars[_i] === \"(\") {\n _i++;\n return { type: Tok.Function, value: v };\n }\n if (v === \"none\") {\n return { type: Tok.None, value: void 0 };\n }\n return { type: Tok.Ident, value: v };\n }\n function tokenize(str = \"\") {\n let chars = str.trim();\n let tokens = [];\n let ch;\n _i = 0;\n while (_i < chars.length) {\n ch = chars[_i++];\n if (ch === \"\\n\" || ch === \"\t\" || ch === \" \") {\n while (_i < chars.length && (chars[_i] === \"\\n\" || chars[_i] === \"\t\" || chars[_i] === \" \")) {\n _i++;\n }\n continue;\n }\n if (ch === \",\") {\n return void 0;\n }\n if (ch === \")\") {\n tokens.push({ type: Tok.ParenClose });\n continue;\n }\n if (ch === \"+\") {\n _i--;\n if (is_num(chars)) {\n tokens.push(num2(chars));\n continue;\n }\n return void 0;\n }\n if (ch === \"-\") {\n _i--;\n if (is_num(chars)) {\n tokens.push(num2(chars));\n continue;\n }\n if (is_ident(chars)) {\n tokens.push({ type: Tok.Ident, value: ident(chars) });\n continue;\n }\n return void 0;\n }\n if (ch === \".\") {\n _i--;\n if (is_num(chars)) {\n tokens.push(num2(chars));\n continue;\n }\n return void 0;\n }\n if (ch === \"/\") {\n while (_i < chars.length && (chars[_i] === \"\\n\" || chars[_i] === \"\t\" || chars[_i] === \" \")) {\n _i++;\n }\n let alpha2;\n if (is_num(chars)) {\n alpha2 = num2(chars);\n if (alpha2.type !== Tok.Hue) {\n tokens.push({ type: Tok.Alpha, value: alpha2 });\n continue;\n }\n }\n if (is_ident(chars)) {\n if (ident(chars) === \"none\") {\n tokens.push({\n type: Tok.Alpha,\n value: { type: Tok.None, value: void 0 }\n });\n continue;\n }\n }\n return void 0;\n }\n if (/\\d/.test(ch)) {\n _i--;\n tokens.push(num2(chars));\n continue;\n }\n if (IdentStartCodePoint.test(ch)) {\n _i--;\n tokens.push(identlike(chars));\n continue;\n }\n return void 0;\n }\n return tokens;\n }\n function parseColorSyntax(tokens) {\n tokens._i = 0;\n let token = tokens[tokens._i++];\n if (!token || token.type !== Tok.Function || token.value !== \"color\") {\n return void 0;\n }\n token = tokens[tokens._i++];\n if (token.type !== Tok.Ident) {\n return void 0;\n }\n const mode = colorProfiles[token.value];\n if (!mode) {\n return void 0;\n }\n const res = { mode };\n const coords = consumeCoords(tokens, false);\n if (!coords) {\n return void 0;\n }\n const channels = getMode(mode).channels;\n for (let ii = 0, c2, ch; ii < channels.length; ii++) {\n c2 = coords[ii];\n ch = channels[ii];\n if (c2.type !== Tok.None) {\n res[ch] = c2.type === Tok.Number ? c2.value : c2.value / 100;\n if (ch === \"alpha\") {\n res[ch] = Math.max(0, Math.min(1, res[ch]));\n }\n }\n }\n return res;\n }\n function consumeCoords(tokens, includeHue) {\n const coords = [];\n let token;\n while (tokens._i < tokens.length) {\n token = tokens[tokens._i++];\n if (token.type === Tok.None || token.type === Tok.Number || token.type === Tok.Alpha || token.type === Tok.Percentage || includeHue && token.type === Tok.Hue) {\n coords.push(token);\n continue;\n }\n if (token.type === Tok.ParenClose) {\n if (tokens._i < tokens.length) {\n return void 0;\n }\n continue;\n }\n return void 0;\n }\n if (coords.length < 3 || coords.length > 4) {\n return void 0;\n }\n if (coords.length === 4) {\n if (coords[3].type !== Tok.Alpha) {\n return void 0;\n }\n coords[3] = coords[3].value;\n }\n if (coords.length === 3) {\n coords.push({ type: Tok.None, value: void 0 });\n }\n return coords.every((c2) => c2.type !== Tok.Alpha) ? coords : void 0;\n }\n function parseModernSyntax(tokens, includeHue) {\n tokens._i = 0;\n let token = tokens[tokens._i++];\n if (!token || token.type !== Tok.Function) {\n return void 0;\n }\n let coords = consumeCoords(tokens, includeHue);\n if (!coords) {\n return void 0;\n }\n coords.unshift(token.value);\n return coords;\n }\n var parse = (color) => {\n if (typeof color !== \"string\") {\n return void 0;\n }\n const tokens = tokenize(color);\n const parsed = tokens ? parseModernSyntax(tokens, true) : void 0;\n let result = void 0;\n let i = 0;\n let len = parsers.length;\n while (i < len) {\n if ((result = parsers[i++](color, parsed)) !== void 0) {\n return result;\n }\n }\n return tokens ? parseColorSyntax(tokens) : void 0;\n };\n var parse_default = parse;\n\n // node_modules/culori/src/rgb/parseRgb.js\n function parseRgb(color, parsed) {\n if (!parsed || parsed[0] !== \"rgb\" && parsed[0] !== \"rgba\") {\n return void 0;\n }\n const res = { mode: \"rgb\" };\n const [, r2, g, b, alpha2] = parsed;\n if (r2.type === Tok.Hue || g.type === Tok.Hue || b.type === Tok.Hue) {\n return void 0;\n }\n if (r2.type !== Tok.None) {\n res.r = r2.type === Tok.Number ? r2.value / 255 : r2.value / 100;\n }\n if (g.type !== Tok.None) {\n res.g = g.type === Tok.Number ? g.value / 255 : g.value / 100;\n }\n if (b.type !== Tok.None) {\n res.b = b.type === Tok.Number ? b.value / 255 : b.value / 100;\n }\n if (alpha2.type !== Tok.None) {\n res.alpha = Math.min(\n 1,\n Math.max(\n 0,\n alpha2.type === Tok.Number ? alpha2.value : alpha2.value / 100\n )\n );\n }\n return res;\n }\n var parseRgb_default = parseRgb;\n\n // node_modules/culori/src/rgb/parseTransparent.js\n var parseTransparent = (c2) => c2 === \"transparent\" ? { mode: \"rgb\", r: 0, g: 0, b: 0, alpha: 0 } : void 0;\n var parseTransparent_default = parseTransparent;\n\n // node_modules/culori/src/interpolate/lerp.js\n var lerp = (a, b, t) => a + t * (b - a);\n\n // node_modules/culori/src/interpolate/piecewise.js\n var get_classes = (arr) => {\n let classes = [];\n for (let i = 0; i < arr.length - 1; i++) {\n let a = arr[i];\n let b = arr[i + 1];\n if (a === void 0 && b === void 0) {\n classes.push(void 0);\n } else if (a !== void 0 && b !== void 0) {\n classes.push([a, b]);\n } else {\n classes.push(a !== void 0 ? [a, a] : [b, b]);\n }\n }\n return classes;\n };\n var interpolatorPiecewise = (interpolator) => (arr) => {\n let classes = get_classes(arr);\n return (t) => {\n let cls = t * classes.length;\n let idx = t >= 1 ? classes.length - 1 : Math.max(Math.floor(cls), 0);\n let pair = classes[idx];\n return pair === void 0 ? void 0 : interpolator(pair[0], pair[1], cls - idx);\n };\n };\n\n // node_modules/culori/src/interpolate/linear.js\n var interpolatorLinear = interpolatorPiecewise(lerp);\n\n // node_modules/culori/src/fixup/alpha.js\n var fixupAlpha = (arr) => {\n let some_defined = false;\n let res = arr.map((v) => {\n if (v !== void 0) {\n some_defined = true;\n return v;\n }\n return 1;\n });\n return some_defined ? res : arr;\n };\n\n // node_modules/culori/src/rgb/definition.js\n var definition = {\n mode: \"rgb\",\n channels: [\"r\", \"g\", \"b\", \"alpha\"],\n parse: [\n parseRgb_default,\n parseHex_default,\n parseRgbLegacy_default,\n parseNamed_default,\n parseTransparent_default,\n \"srgb\"\n ],\n serialize: \"srgb\",\n interpolate: {\n r: interpolatorLinear,\n g: interpolatorLinear,\n b: interpolatorLinear,\n alpha: { use: interpolatorLinear, fixup: fixupAlpha }\n },\n gamut: true,\n white: { r: 1, g: 1, b: 1 },\n black: { r: 0, g: 0, b: 0 }\n };\n var definition_default = definition;\n\n // node_modules/culori/src/a98/convertA98ToXyz65.js\n var linearize = (v = 0) => Math.pow(Math.abs(v), 563 / 256) * Math.sign(v);\n var convertA98ToXyz65 = (a982) => {\n let r2 = linearize(a982.r);\n let g = linearize(a982.g);\n let b = linearize(a982.b);\n let res = {\n mode: \"xyz65\",\n x: 0.5766690429101305 * r2 + 0.1855582379065463 * g + 0.1882286462349947 * b,\n y: 0.297344975250536 * r2 + 0.6273635662554661 * g + 0.0752914584939979 * b,\n z: 0.0270313613864123 * r2 + 0.0706888525358272 * g + 0.9913375368376386 * b\n };\n if (a982.alpha !== void 0) {\n res.alpha = a982.alpha;\n }\n return res;\n };\n var convertA98ToXyz65_default = convertA98ToXyz65;\n\n // node_modules/culori/src/a98/convertXyz65ToA98.js\n var gamma = (v) => Math.pow(Math.abs(v), 256 / 563) * Math.sign(v);\n var convertXyz65ToA98 = ({ x, y, z, alpha: alpha2 }) => {\n if (x === void 0) x = 0;\n if (y === void 0) y = 0;\n if (z === void 0) z = 0;\n let res = {\n mode: \"a98\",\n r: gamma(\n x * 2.0415879038107465 - y * 0.5650069742788597 - 0.3447313507783297 * z\n ),\n g: gamma(\n x * -0.9692436362808798 + y * 1.8759675015077206 + 0.0415550574071756 * z\n ),\n b: gamma(\n x * 0.0134442806320312 - y * 0.1183623922310184 + 1.0151749943912058 * z\n )\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertXyz65ToA98_default = convertXyz65ToA98;\n\n // node_modules/culori/src/lrgb/convertRgbToLrgb.js\n var fn = (c2 = 0) => {\n const abs2 = Math.abs(c2);\n if (abs2 <= 0.04045) {\n return c2 / 12.92;\n }\n return (Math.sign(c2) || 1) * Math.pow((abs2 + 0.055) / 1.055, 2.4);\n };\n var convertRgbToLrgb = ({ r: r2, g, b, alpha: alpha2 }) => {\n let res = {\n mode: \"lrgb\",\n r: fn(r2),\n g: fn(g),\n b: fn(b)\n };\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n };\n var convertRgbToLrgb_default = convertRgbToLrgb;\n\n // node_modules/culori/src/xyz65/convertRgbToXyz65.js\n var convertRgbToXyz65 = (rgb4) => {\n let { r: r2, g, b, alpha: alpha2 } = convertRgbToLrgb_default(rgb4);\n let res = {\n mode: \"xyz65\",\n x: 0.4123907992659593 * r2 + 0.357584339383878 * g + 0.1804807884018343 * b,\n y: 0.2126390058715102 * r2 + 0.715168678767756 * g + 0.0721923153607337 * b,\n z: 0.0193308187155918 * r2 + 0.119194779794626 * g + 0.9505321522496607 * b\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertRgbToXyz65_default = convertRgbToXyz65;\n\n // node_modules/culori/src/lrgb/convertLrgbToRgb.js\n var fn2 = (c2 = 0) => {\n const abs2 = Math.abs(c2);\n if (abs2 > 31308e-7) {\n return (Math.sign(c2) || 1) * (1.055 * Math.pow(abs2, 1 / 2.4) - 0.055);\n }\n return c2 * 12.92;\n };\n var convertLrgbToRgb = ({ r: r2, g, b, alpha: alpha2 }, mode = \"rgb\") => {\n let res = {\n mode,\n r: fn2(r2),\n g: fn2(g),\n b: fn2(b)\n };\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n };\n var convertLrgbToRgb_default = convertLrgbToRgb;\n\n // node_modules/culori/src/xyz65/convertXyz65ToRgb.js\n var convertXyz65ToRgb = ({ x, y, z, alpha: alpha2 }) => {\n if (x === void 0) x = 0;\n if (y === void 0) y = 0;\n if (z === void 0) z = 0;\n let res = convertLrgbToRgb_default({\n r: x * 3.2409699419045226 - y * 1.537383177570094 - 0.4986107602930034 * z,\n g: x * -0.9692436362808796 + y * 1.8759675015077204 + 0.0415550574071756 * z,\n b: x * 0.0556300796969936 - y * 0.2039769588889765 + 1.0569715142428784 * z\n });\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertXyz65ToRgb_default = convertXyz65ToRgb;\n\n // node_modules/culori/src/a98/definition.js\n var definition2 = {\n ...definition_default,\n mode: \"a98\",\n parse: [\"a98-rgb\"],\n serialize: \"a98-rgb\",\n fromMode: {\n rgb: (color) => convertXyz65ToA98_default(convertRgbToXyz65_default(color)),\n xyz65: convertXyz65ToA98_default\n },\n toMode: {\n rgb: (color) => convertXyz65ToRgb_default(convertA98ToXyz65_default(color)),\n xyz65: convertA98ToXyz65_default\n }\n };\n var definition_default2 = definition2;\n\n // node_modules/culori/src/util/normalizeHue.js\n var normalizeHue = (hue3) => (hue3 = hue3 % 360) < 0 ? hue3 + 360 : hue3;\n var normalizeHue_default = normalizeHue;\n\n // node_modules/culori/src/fixup/hue.js\n var hue2 = (hues, fn5) => {\n return hues.map((hue3, idx, arr) => {\n if (hue3 === void 0) {\n return hue3;\n }\n let normalized = normalizeHue_default(hue3);\n if (idx === 0 || hues[idx - 1] === void 0) {\n return normalized;\n }\n return fn5(normalized - normalizeHue_default(arr[idx - 1]));\n }).reduce((acc, curr) => {\n if (!acc.length || curr === void 0 || acc[acc.length - 1] === void 0) {\n acc.push(curr);\n return acc;\n }\n acc.push(curr + acc[acc.length - 1]);\n return acc;\n }, []);\n };\n var fixupHueShorter = (arr) => hue2(arr, (d) => Math.abs(d) <= 180 ? d : d - 360 * Math.sign(d));\n\n // node_modules/culori/src/cubehelix/constants.js\n var M = [-0.14861, 1.78277, -0.29227, -0.90649, 1.97294, 0];\n var degToRad = Math.PI / 180;\n var radToDeg = 180 / Math.PI;\n\n // node_modules/culori/src/cubehelix/convertRgbToCubehelix.js\n var DE = M[3] * M[4];\n var BE = M[1] * M[4];\n var BCAD = M[1] * M[2] - M[0] * M[3];\n var convertRgbToCubehelix = ({ r: r2, g, b, alpha: alpha2 }) => {\n if (r2 === void 0) r2 = 0;\n if (g === void 0) g = 0;\n if (b === void 0) b = 0;\n let l = (BCAD * b + r2 * DE - g * BE) / (BCAD + DE - BE);\n let x = b - l;\n let y = (M[4] * (g - l) - M[2] * x) / M[3];\n let res = {\n mode: \"cubehelix\",\n l,\n s: l === 0 || l === 1 ? void 0 : Math.sqrt(x * x + y * y) / (M[4] * l * (1 - l))\n };\n if (res.s) res.h = Math.atan2(y, x) * radToDeg - 120;\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n };\n var convertRgbToCubehelix_default = convertRgbToCubehelix;\n\n // node_modules/culori/src/cubehelix/convertCubehelixToRgb.js\n var convertCubehelixToRgb = ({ h, s, l, alpha: alpha2 }) => {\n let res = { mode: \"rgb\" };\n h = (h === void 0 ? 0 : h + 120) * degToRad;\n if (l === void 0) l = 0;\n let amp = s === void 0 ? 0 : s * l * (1 - l);\n let cosh = Math.cos(h);\n let sinh = Math.sin(h);\n res.r = l + amp * (M[0] * cosh + M[1] * sinh);\n res.g = l + amp * (M[2] * cosh + M[3] * sinh);\n res.b = l + amp * (M[4] * cosh + M[5] * sinh);\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n };\n var convertCubehelixToRgb_default = convertCubehelixToRgb;\n\n // node_modules/culori/src/difference.js\n var differenceHueSaturation = (std, smp) => {\n if (std.h === void 0 || smp.h === void 0 || !std.s || !smp.s) {\n return 0;\n }\n let std_h = normalizeHue_default(std.h);\n let smp_h = normalizeHue_default(smp.h);\n let dH = Math.sin((smp_h - std_h + 360) / 2 * Math.PI / 180);\n return 2 * Math.sqrt(std.s * smp.s) * dH;\n };\n var differenceHueNaive = (std, smp) => {\n if (std.h === void 0 || smp.h === void 0) {\n return 0;\n }\n let std_h = normalizeHue_default(std.h);\n let smp_h = normalizeHue_default(smp.h);\n if (Math.abs(smp_h - std_h) > 180) {\n return std_h - (smp_h - 360 * Math.sign(smp_h - std_h));\n }\n return smp_h - std_h;\n };\n var differenceHueChroma = (std, smp) => {\n if (std.h === void 0 || smp.h === void 0 || !std.c || !smp.c) {\n return 0;\n }\n let std_h = normalizeHue_default(std.h);\n let smp_h = normalizeHue_default(smp.h);\n let dH = Math.sin((smp_h - std_h + 360) / 2 * Math.PI / 180);\n return 2 * Math.sqrt(std.c * smp.c) * dH;\n };\n\n // node_modules/culori/src/average.js\n var averageAngle = (val) => {\n let sum = val.reduce(\n (sum2, val2) => {\n if (val2 !== void 0) {\n let rad = val2 * Math.PI / 180;\n sum2.sin += Math.sin(rad);\n sum2.cos += Math.cos(rad);\n }\n return sum2;\n },\n { sin: 0, cos: 0 }\n );\n let angle = Math.atan2(sum.sin, sum.cos) * 180 / Math.PI;\n return angle < 0 ? 360 + angle : angle;\n };\n\n // node_modules/culori/src/cubehelix/definition.js\n var definition3 = {\n mode: \"cubehelix\",\n channels: [\"h\", \"s\", \"l\", \"alpha\"],\n parse: [\"--cubehelix\"],\n serialize: \"--cubehelix\",\n ranges: {\n h: [0, 360],\n s: [0, 4.614],\n l: [0, 1]\n },\n fromMode: {\n rgb: convertRgbToCubehelix_default\n },\n toMode: {\n rgb: convertCubehelixToRgb_default\n },\n interpolate: {\n h: {\n use: interpolatorLinear,\n fixup: fixupHueShorter\n },\n s: interpolatorLinear,\n l: interpolatorLinear,\n alpha: {\n use: interpolatorLinear,\n fixup: fixupAlpha\n }\n },\n difference: {\n h: differenceHueSaturation\n },\n average: {\n h: averageAngle\n }\n };\n var definition_default3 = definition3;\n\n // node_modules/culori/src/lch/convertLabToLch.js\n var convertLabToLch = ({ l, a, b, alpha: alpha2 }, mode = \"lch\") => {\n if (a === void 0) a = 0;\n if (b === void 0) b = 0;\n let c2 = Math.sqrt(a * a + b * b);\n let res = { mode, l, c: c2 };\n if (c2) res.h = normalizeHue_default(Math.atan2(b, a) * 180 / Math.PI);\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n };\n var convertLabToLch_default = convertLabToLch;\n\n // node_modules/culori/src/lch/convertLchToLab.js\n var convertLchToLab = ({ l, c: c2, h, alpha: alpha2 }, mode = \"lab\") => {\n if (h === void 0) h = 0;\n let res = {\n mode,\n l,\n a: c2 ? c2 * Math.cos(h / 180 * Math.PI) : 0,\n b: c2 ? c2 * Math.sin(h / 180 * Math.PI) : 0\n };\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n };\n var convertLchToLab_default = convertLchToLab;\n\n // node_modules/culori/src/xyz65/constants.js\n var k = Math.pow(29, 3) / Math.pow(3, 3);\n var e = Math.pow(6, 3) / Math.pow(29, 3);\n\n // node_modules/culori/src/constants.js\n var D50 = {\n X: 0.3457 / 0.3585,\n Y: 1,\n Z: (1 - 0.3457 - 0.3585) / 0.3585\n };\n var D65 = {\n X: 0.3127 / 0.329,\n Y: 1,\n Z: (1 - 0.3127 - 0.329) / 0.329\n };\n var k2 = Math.pow(29, 3) / Math.pow(3, 3);\n var e2 = Math.pow(6, 3) / Math.pow(29, 3);\n\n // node_modules/culori/src/lab65/convertLab65ToXyz65.js\n var fn3 = (v) => Math.pow(v, 3) > e ? Math.pow(v, 3) : (116 * v - 16) / k;\n var convertLab65ToXyz65 = ({ l, a, b, alpha: alpha2 }) => {\n if (l === void 0) l = 0;\n if (a === void 0) a = 0;\n if (b === void 0) b = 0;\n let fy = (l + 16) / 116;\n let fx = a / 500 + fy;\n let fz = fy - b / 200;\n let res = {\n mode: \"xyz65\",\n x: fn3(fx) * D65.X,\n y: fn3(fy) * D65.Y,\n z: fn3(fz) * D65.Z\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertLab65ToXyz65_default = convertLab65ToXyz65;\n\n // node_modules/culori/src/lab65/convertLab65ToRgb.js\n var convertLab65ToRgb = (lab2) => convertXyz65ToRgb_default(convertLab65ToXyz65_default(lab2));\n var convertLab65ToRgb_default = convertLab65ToRgb;\n\n // node_modules/culori/src/lab65/convertXyz65ToLab65.js\n var f = (value) => value > e ? Math.cbrt(value) : (k * value + 16) / 116;\n var convertXyz65ToLab65 = ({ x, y, z, alpha: alpha2 }) => {\n if (x === void 0) x = 0;\n if (y === void 0) y = 0;\n if (z === void 0) z = 0;\n let f0 = f(x / D65.X);\n let f1 = f(y / D65.Y);\n let f22 = f(z / D65.Z);\n let res = {\n mode: \"lab65\",\n l: 116 * f1 - 16,\n a: 500 * (f0 - f1),\n b: 200 * (f1 - f22)\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertXyz65ToLab65_default = convertXyz65ToLab65;\n\n // node_modules/culori/src/lab65/convertRgbToLab65.js\n var convertRgbToLab65 = (rgb4) => {\n let res = convertXyz65ToLab65_default(convertRgbToXyz65_default(rgb4));\n if (rgb4.r === rgb4.b && rgb4.b === rgb4.g) {\n res.a = res.b = 0;\n }\n return res;\n };\n var convertRgbToLab65_default = convertRgbToLab65;\n\n // node_modules/culori/src/dlch/constants.js\n var kE = 1;\n var kCH = 1;\n var \\u03B8 = 26 / 180 * Math.PI;\n var cos\\u03B8 = Math.cos(\\u03B8);\n var sin\\u03B8 = Math.sin(\\u03B8);\n var factor = 100 / Math.log(139 / 100);\n\n // node_modules/culori/src/dlch/convertDlchToLab65.js\n var convertDlchToLab65 = ({ l, c: c2, h, alpha: alpha2 }) => {\n if (l === void 0) l = 0;\n if (c2 === void 0) c2 = 0;\n if (h === void 0) h = 0;\n let res = {\n mode: \"lab65\",\n l: (Math.exp(l * kE / factor) - 1) / 39e-4\n };\n let G = (Math.exp(0.0435 * c2 * kCH * kE) - 1) / 0.075;\n let e4 = G * Math.cos(h / 180 * Math.PI - \\u03B8);\n let f3 = G * Math.sin(h / 180 * Math.PI - \\u03B8);\n res.a = e4 * cos\\u03B8 - f3 / 0.83 * sin\\u03B8;\n res.b = e4 * sin\\u03B8 + f3 / 0.83 * cos\\u03B8;\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n };\n var convertDlchToLab65_default = convertDlchToLab65;\n\n // node_modules/culori/src/dlch/convertLab65ToDlch.js\n var convertLab65ToDlch = ({ l, a, b, alpha: alpha2 }) => {\n if (l === void 0) l = 0;\n if (a === void 0) a = 0;\n if (b === void 0) b = 0;\n let e4 = a * cos\\u03B8 + b * sin\\u03B8;\n let f3 = 0.83 * (b * cos\\u03B8 - a * sin\\u03B8);\n let G = Math.sqrt(e4 * e4 + f3 * f3);\n let res = {\n mode: \"dlch\",\n l: factor / kE * Math.log(1 + 39e-4 * l),\n c: Math.log(1 + 0.075 * G) / (0.0435 * kCH * kE)\n };\n if (res.c) {\n res.h = normalizeHue_default((Math.atan2(f3, e4) + \\u03B8) / Math.PI * 180);\n }\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n };\n var convertLab65ToDlch_default = convertLab65ToDlch;\n\n // node_modules/culori/src/dlab/definition.js\n var convertDlabToLab65 = (c2) => convertDlchToLab65_default(convertLabToLch_default(c2, \"dlch\"));\n var convertLab65ToDlab = (c2) => convertLchToLab_default(convertLab65ToDlch_default(c2), \"dlab\");\n var definition4 = {\n mode: \"dlab\",\n parse: [\"--din99o-lab\"],\n serialize: \"--din99o-lab\",\n toMode: {\n lab65: convertDlabToLab65,\n rgb: (c2) => convertLab65ToRgb_default(convertDlabToLab65(c2))\n },\n fromMode: {\n lab65: convertLab65ToDlab,\n rgb: (c2) => convertLab65ToDlab(convertRgbToLab65_default(c2))\n },\n channels: [\"l\", \"a\", \"b\", \"alpha\"],\n ranges: {\n l: [0, 100],\n a: [-40.09, 45.501],\n b: [-40.469, 44.344]\n },\n interpolate: {\n l: interpolatorLinear,\n a: interpolatorLinear,\n b: interpolatorLinear,\n alpha: {\n use: interpolatorLinear,\n fixup: fixupAlpha\n }\n }\n };\n var definition_default4 = definition4;\n\n // node_modules/culori/src/dlch/definition.js\n var definition5 = {\n mode: \"dlch\",\n parse: [\"--din99o-lch\"],\n serialize: \"--din99o-lch\",\n toMode: {\n lab65: convertDlchToLab65_default,\n dlab: (c2) => convertLchToLab_default(c2, \"dlab\"),\n rgb: (c2) => convertLab65ToRgb_default(convertDlchToLab65_default(c2))\n },\n fromMode: {\n lab65: convertLab65ToDlch_default,\n dlab: (c2) => convertLabToLch_default(c2, \"dlch\"),\n rgb: (c2) => convertLab65ToDlch_default(convertRgbToLab65_default(c2))\n },\n channels: [\"l\", \"c\", \"h\", \"alpha\"],\n ranges: {\n l: [0, 100],\n c: [0, 51.484],\n h: [0, 360]\n },\n interpolate: {\n l: interpolatorLinear,\n c: interpolatorLinear,\n h: {\n use: interpolatorLinear,\n fixup: fixupHueShorter\n },\n alpha: {\n use: interpolatorLinear,\n fixup: fixupAlpha\n }\n },\n difference: {\n h: differenceHueChroma\n },\n average: {\n h: averageAngle\n }\n };\n var definition_default5 = definition5;\n\n // node_modules/culori/src/hsi/convertHsiToRgb.js\n function convertHsiToRgb({ h, s, i, alpha: alpha2 }) {\n h = normalizeHue_default(h !== void 0 ? h : 0);\n if (s === void 0) s = 0;\n if (i === void 0) i = 0;\n let f3 = Math.abs(h / 60 % 2 - 1);\n let res;\n switch (Math.floor(h / 60)) {\n case 0:\n res = {\n r: i * (1 + s * (3 / (2 - f3) - 1)),\n g: i * (1 + s * (3 * (1 - f3) / (2 - f3) - 1)),\n b: i * (1 - s)\n };\n break;\n case 1:\n res = {\n r: i * (1 + s * (3 * (1 - f3) / (2 - f3) - 1)),\n g: i * (1 + s * (3 / (2 - f3) - 1)),\n b: i * (1 - s)\n };\n break;\n case 2:\n res = {\n r: i * (1 - s),\n g: i * (1 + s * (3 / (2 - f3) - 1)),\n b: i * (1 + s * (3 * (1 - f3) / (2 - f3) - 1))\n };\n break;\n case 3:\n res = {\n r: i * (1 - s),\n g: i * (1 + s * (3 * (1 - f3) / (2 - f3) - 1)),\n b: i * (1 + s * (3 / (2 - f3) - 1))\n };\n break;\n case 4:\n res = {\n r: i * (1 + s * (3 * (1 - f3) / (2 - f3) - 1)),\n g: i * (1 - s),\n b: i * (1 + s * (3 / (2 - f3) - 1))\n };\n break;\n case 5:\n res = {\n r: i * (1 + s * (3 / (2 - f3) - 1)),\n g: i * (1 - s),\n b: i * (1 + s * (3 * (1 - f3) / (2 - f3) - 1))\n };\n break;\n default:\n res = { r: i * (1 - s), g: i * (1 - s), b: i * (1 - s) };\n }\n res.mode = \"rgb\";\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n }\n\n // node_modules/culori/src/hsi/convertRgbToHsi.js\n function convertRgbToHsi({ r: r2, g, b, alpha: alpha2 }) {\n if (r2 === void 0) r2 = 0;\n if (g === void 0) g = 0;\n if (b === void 0) b = 0;\n let M3 = Math.max(r2, g, b), m = Math.min(r2, g, b);\n let res = {\n mode: \"hsi\",\n s: r2 + g + b === 0 ? 0 : 1 - 3 * m / (r2 + g + b),\n i: (r2 + g + b) / 3\n };\n if (M3 - m !== 0)\n res.h = (M3 === r2 ? (g - b) / (M3 - m) + (g < b) * 6 : M3 === g ? (b - r2) / (M3 - m) + 2 : (r2 - g) / (M3 - m) + 4) * 60;\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n }\n\n // node_modules/culori/src/hsi/definition.js\n var definition6 = {\n mode: \"hsi\",\n toMode: {\n rgb: convertHsiToRgb\n },\n parse: [\"--hsi\"],\n serialize: \"--hsi\",\n fromMode: {\n rgb: convertRgbToHsi\n },\n channels: [\"h\", \"s\", \"i\", \"alpha\"],\n ranges: {\n h: [0, 360]\n },\n gamut: \"rgb\",\n interpolate: {\n h: { use: interpolatorLinear, fixup: fixupHueShorter },\n s: interpolatorLinear,\n i: interpolatorLinear,\n alpha: { use: interpolatorLinear, fixup: fixupAlpha }\n },\n difference: {\n h: differenceHueSaturation\n },\n average: {\n h: averageAngle\n }\n };\n var definition_default6 = definition6;\n\n // node_modules/culori/src/hsl/convertHslToRgb.js\n function convertHslToRgb({ h, s, l, alpha: alpha2 }) {\n h = normalizeHue_default(h !== void 0 ? h : 0);\n if (s === void 0) s = 0;\n if (l === void 0) l = 0;\n let m1 = l + s * (l < 0.5 ? l : 1 - l);\n let m2 = m1 - (m1 - l) * 2 * Math.abs(h / 60 % 2 - 1);\n let res;\n switch (Math.floor(h / 60)) {\n case 0:\n res = { r: m1, g: m2, b: 2 * l - m1 };\n break;\n case 1:\n res = { r: m2, g: m1, b: 2 * l - m1 };\n break;\n case 2:\n res = { r: 2 * l - m1, g: m1, b: m2 };\n break;\n case 3:\n res = { r: 2 * l - m1, g: m2, b: m1 };\n break;\n case 4:\n res = { r: m2, g: 2 * l - m1, b: m1 };\n break;\n case 5:\n res = { r: m1, g: 2 * l - m1, b: m2 };\n break;\n default:\n res = { r: 2 * l - m1, g: 2 * l - m1, b: 2 * l - m1 };\n }\n res.mode = \"rgb\";\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n }\n\n // node_modules/culori/src/hsl/convertRgbToHsl.js\n function convertRgbToHsl({ r: r2, g, b, alpha: alpha2 }) {\n if (r2 === void 0) r2 = 0;\n if (g === void 0) g = 0;\n if (b === void 0) b = 0;\n let M3 = Math.max(r2, g, b), m = Math.min(r2, g, b);\n let res = {\n mode: \"hsl\",\n s: M3 === m ? 0 : (M3 - m) / (1 - Math.abs(M3 + m - 1)),\n l: 0.5 * (M3 + m)\n };\n if (M3 - m !== 0)\n res.h = (M3 === r2 ? (g - b) / (M3 - m) + (g < b) * 6 : M3 === g ? (b - r2) / (M3 - m) + 2 : (r2 - g) / (M3 - m) + 4) * 60;\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n }\n\n // node_modules/culori/src/util/hue.js\n var hueToDeg = (val, unit) => {\n switch (unit) {\n case \"deg\":\n return +val;\n case \"rad\":\n return val / Math.PI * 180;\n case \"grad\":\n return val / 10 * 9;\n case \"turn\":\n return val * 360;\n }\n };\n var hue_default = hueToDeg;\n\n // node_modules/culori/src/hsl/parseHslLegacy.js\n var hsl_old = new RegExp(\n `^hsla?\\\\(\\\\s*${hue}${c}${per}${c}${per}\\\\s*(?:,\\\\s*${num_per}\\\\s*)?\\\\)$`\n );\n var parseHslLegacy = (color) => {\n let match = color.match(hsl_old);\n if (!match) return;\n let res = { mode: \"hsl\" };\n if (match[3] !== void 0) {\n res.h = +match[3];\n } else if (match[1] !== void 0 && match[2] !== void 0) {\n res.h = hue_default(match[1], match[2]);\n }\n if (match[4] !== void 0) {\n res.s = Math.min(Math.max(0, match[4] / 100), 1);\n }\n if (match[5] !== void 0) {\n res.l = Math.min(Math.max(0, match[5] / 100), 1);\n }\n if (match[6] !== void 0) {\n res.alpha = Math.max(0, Math.min(1, match[6] / 100));\n } else if (match[7] !== void 0) {\n res.alpha = Math.max(0, Math.min(1, +match[7]));\n }\n return res;\n };\n var parseHslLegacy_default = parseHslLegacy;\n\n // node_modules/culori/src/hsl/parseHsl.js\n function parseHsl(color, parsed) {\n if (!parsed || parsed[0] !== \"hsl\" && parsed[0] !== \"hsla\") {\n return void 0;\n }\n const res = { mode: \"hsl\" };\n const [, h, s, l, alpha2] = parsed;\n if (h.type !== Tok.None) {\n if (h.type === Tok.Percentage) {\n return void 0;\n }\n res.h = h.value;\n }\n if (s.type !== Tok.None) {\n if (s.type === Tok.Hue) {\n return void 0;\n }\n res.s = s.value / 100;\n }\n if (l.type !== Tok.None) {\n if (l.type === Tok.Hue) {\n return void 0;\n }\n res.l = l.value / 100;\n }\n if (alpha2.type !== Tok.None) {\n res.alpha = Math.min(\n 1,\n Math.max(\n 0,\n alpha2.type === Tok.Number ? alpha2.value : alpha2.value / 100\n )\n );\n }\n return res;\n }\n var parseHsl_default = parseHsl;\n\n // node_modules/culori/src/hsl/definition.js\n var definition7 = {\n mode: \"hsl\",\n toMode: {\n rgb: convertHslToRgb\n },\n fromMode: {\n rgb: convertRgbToHsl\n },\n channels: [\"h\", \"s\", \"l\", \"alpha\"],\n ranges: {\n h: [0, 360]\n },\n gamut: \"rgb\",\n parse: [parseHsl_default, parseHslLegacy_default],\n serialize: (c2) => `hsl(${c2.h !== void 0 ? c2.h : \"none\"} ${c2.s !== void 0 ? c2.s * 100 + \"%\" : \"none\"} ${c2.l !== void 0 ? c2.l * 100 + \"%\" : \"none\"}${c2.alpha < 1 ? ` / ${c2.alpha}` : \"\"})`,\n interpolate: {\n h: { use: interpolatorLinear, fixup: fixupHueShorter },\n s: interpolatorLinear,\n l: interpolatorLinear,\n alpha: { use: interpolatorLinear, fixup: fixupAlpha }\n },\n difference: {\n h: differenceHueSaturation\n },\n average: {\n h: averageAngle\n }\n };\n var definition_default7 = definition7;\n\n // node_modules/culori/src/hsv/convertHsvToRgb.js\n function convertHsvToRgb({ h, s, v, alpha: alpha2 }) {\n h = normalizeHue_default(h !== void 0 ? h : 0);\n if (s === void 0) s = 0;\n if (v === void 0) v = 0;\n let f3 = Math.abs(h / 60 % 2 - 1);\n let res;\n switch (Math.floor(h / 60)) {\n case 0:\n res = { r: v, g: v * (1 - s * f3), b: v * (1 - s) };\n break;\n case 1:\n res = { r: v * (1 - s * f3), g: v, b: v * (1 - s) };\n break;\n case 2:\n res = { r: v * (1 - s), g: v, b: v * (1 - s * f3) };\n break;\n case 3:\n res = { r: v * (1 - s), g: v * (1 - s * f3), b: v };\n break;\n case 4:\n res = { r: v * (1 - s * f3), g: v * (1 - s), b: v };\n break;\n case 5:\n res = { r: v, g: v * (1 - s), b: v * (1 - s * f3) };\n break;\n default:\n res = { r: v * (1 - s), g: v * (1 - s), b: v * (1 - s) };\n }\n res.mode = \"rgb\";\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n }\n\n // node_modules/culori/src/hsv/convertRgbToHsv.js\n function convertRgbToHsv({ r: r2, g, b, alpha: alpha2 }) {\n if (r2 === void 0) r2 = 0;\n if (g === void 0) g = 0;\n if (b === void 0) b = 0;\n let M3 = Math.max(r2, g, b), m = Math.min(r2, g, b);\n let res = {\n mode: \"hsv\",\n s: M3 === 0 ? 0 : 1 - m / M3,\n v: M3\n };\n if (M3 - m !== 0)\n res.h = (M3 === r2 ? (g - b) / (M3 - m) + (g < b) * 6 : M3 === g ? (b - r2) / (M3 - m) + 2 : (r2 - g) / (M3 - m) + 4) * 60;\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n }\n\n // node_modules/culori/src/hsv/definition.js\n var definition8 = {\n mode: \"hsv\",\n toMode: {\n rgb: convertHsvToRgb\n },\n parse: [\"--hsv\"],\n serialize: \"--hsv\",\n fromMode: {\n rgb: convertRgbToHsv\n },\n channels: [\"h\", \"s\", \"v\", \"alpha\"],\n ranges: {\n h: [0, 360]\n },\n gamut: \"rgb\",\n interpolate: {\n h: { use: interpolatorLinear, fixup: fixupHueShorter },\n s: interpolatorLinear,\n v: interpolatorLinear,\n alpha: { use: interpolatorLinear, fixup: fixupAlpha }\n },\n difference: {\n h: differenceHueSaturation\n },\n average: {\n h: averageAngle\n }\n };\n var definition_default8 = definition8;\n\n // node_modules/culori/src/hwb/convertHwbToRgb.js\n function convertHwbToRgb({ h, w, b, alpha: alpha2 }) {\n if (w === void 0) w = 0;\n if (b === void 0) b = 0;\n if (w + b > 1) {\n let s = w + b;\n w /= s;\n b /= s;\n }\n return convertHsvToRgb({\n h,\n s: b === 1 ? 1 : 1 - w / (1 - b),\n v: 1 - b,\n alpha: alpha2\n });\n }\n\n // node_modules/culori/src/hwb/convertRgbToHwb.js\n function convertRgbToHwb(rgba) {\n let hsv2 = convertRgbToHsv(rgba);\n if (hsv2 === void 0) return void 0;\n let s = hsv2.s !== void 0 ? hsv2.s : 0;\n let v = hsv2.v !== void 0 ? hsv2.v : 0;\n let res = {\n mode: \"hwb\",\n w: (1 - s) * v,\n b: 1 - v\n };\n if (hsv2.h !== void 0) res.h = hsv2.h;\n if (hsv2.alpha !== void 0) res.alpha = hsv2.alpha;\n return res;\n }\n\n // node_modules/culori/src/hwb/parseHwb.js\n function ParseHwb(color, parsed) {\n if (!parsed || parsed[0] !== \"hwb\") {\n return void 0;\n }\n const res = { mode: \"hwb\" };\n const [, h, w, b, alpha2] = parsed;\n if (h.type !== Tok.None) {\n if (h.type === Tok.Percentage) {\n return void 0;\n }\n res.h = h.value;\n }\n if (w.type !== Tok.None) {\n if (w.type === Tok.Hue) {\n return void 0;\n }\n res.w = w.value / 100;\n }\n if (b.type !== Tok.None) {\n if (b.type === Tok.Hue) {\n return void 0;\n }\n res.b = b.value / 100;\n }\n if (alpha2.type !== Tok.None) {\n res.alpha = Math.min(\n 1,\n Math.max(\n 0,\n alpha2.type === Tok.Number ? alpha2.value : alpha2.value / 100\n )\n );\n }\n return res;\n }\n var parseHwb_default = ParseHwb;\n\n // node_modules/culori/src/hwb/definition.js\n var definition9 = {\n mode: \"hwb\",\n toMode: {\n rgb: convertHwbToRgb\n },\n fromMode: {\n rgb: convertRgbToHwb\n },\n channels: [\"h\", \"w\", \"b\", \"alpha\"],\n ranges: {\n h: [0, 360]\n },\n gamut: \"rgb\",\n parse: [parseHwb_default],\n serialize: (c2) => `hwb(${c2.h !== void 0 ? c2.h : \"none\"} ${c2.w !== void 0 ? c2.w * 100 + \"%\" : \"none\"} ${c2.b !== void 0 ? c2.b * 100 + \"%\" : \"none\"}${c2.alpha < 1 ? ` / ${c2.alpha}` : \"\"})`,\n interpolate: {\n h: { use: interpolatorLinear, fixup: fixupHueShorter },\n w: interpolatorLinear,\n b: interpolatorLinear,\n alpha: { use: interpolatorLinear, fixup: fixupAlpha }\n },\n difference: {\n h: differenceHueNaive\n },\n average: {\n h: averageAngle\n }\n };\n var definition_default9 = definition9;\n\n // node_modules/culori/src/hdr/constants.js\n var YW = 203;\n\n // node_modules/culori/src/hdr/transfer.js\n var M1 = 0.1593017578125;\n var M2 = 78.84375;\n var C1 = 0.8359375;\n var C2 = 18.8515625;\n var C3 = 18.6875;\n function transferPqDecode(v) {\n if (v < 0) return 0;\n const c2 = Math.pow(v, 1 / M2);\n return 1e4 * Math.pow(Math.max(0, c2 - C1) / (C2 - C3 * c2), 1 / M1);\n }\n function transferPqEncode(v) {\n if (v < 0) return 0;\n const c2 = Math.pow(v / 1e4, M1);\n return Math.pow((C1 + C2 * c2) / (1 + C3 * c2), M2);\n }\n\n // node_modules/culori/src/itp/convertItpToXyz65.js\n var toRel = (c2) => Math.max(c2 / YW, 0);\n var convertItpToXyz65 = ({ i, t, p: p4, alpha: alpha2 }) => {\n if (i === void 0) i = 0;\n if (t === void 0) t = 0;\n if (p4 === void 0) p4 = 0;\n const l = transferPqDecode(\n i + 0.008609037037932761 * t + 0.11102962500302593 * p4\n );\n const m = transferPqDecode(\n i - 0.00860903703793275 * t - 0.11102962500302599 * p4\n );\n const s = transferPqDecode(\n i + 0.5600313357106791 * t - 0.32062717498731885 * p4\n );\n const res = {\n mode: \"xyz65\",\n x: toRel(\n 2.070152218389422 * l - 1.3263473389671556 * m + 0.2066510476294051 * s\n ),\n y: toRel(\n 0.3647385209748074 * l + 0.680566024947227 * m - 0.0453045459220346 * s\n ),\n z: toRel(\n -0.049747207535812 * l - 0.0492609666966138 * m + 1.1880659249923042 * s\n )\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertItpToXyz65_default = convertItpToXyz65;\n\n // node_modules/culori/src/itp/convertXyz65ToItp.js\n var toAbs = (c2 = 0) => Math.max(c2 * YW, 0);\n var convertXyz65ToItp = ({ x, y, z, alpha: alpha2 }) => {\n const absX = toAbs(x);\n const absY = toAbs(y);\n const absZ = toAbs(z);\n const l = transferPqEncode(\n 0.3592832590121217 * absX + 0.6976051147779502 * absY - 0.0358915932320289 * absZ\n );\n const m = transferPqEncode(\n -0.1920808463704995 * absX + 1.1004767970374323 * absY + 0.0753748658519118 * absZ\n );\n const s = transferPqEncode(\n 0.0070797844607477 * absX + 0.0748396662186366 * absY + 0.8433265453898765 * absZ\n );\n const i = 0.5 * l + 0.5 * m;\n const t = 1.61376953125 * l - 3.323486328125 * m + 1.709716796875 * s;\n const p4 = 4.378173828125 * l - 4.24560546875 * m - 0.132568359375 * s;\n const res = { mode: \"itp\", i, t, p: p4 };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertXyz65ToItp_default = convertXyz65ToItp;\n\n // node_modules/culori/src/itp/definition.js\n var definition10 = {\n mode: \"itp\",\n channels: [\"i\", \"t\", \"p\", \"alpha\"],\n parse: [\"--ictcp\"],\n serialize: \"--ictcp\",\n toMode: {\n xyz65: convertItpToXyz65_default,\n rgb: (color) => convertXyz65ToRgb_default(convertItpToXyz65_default(color))\n },\n fromMode: {\n xyz65: convertXyz65ToItp_default,\n rgb: (color) => convertXyz65ToItp_default(convertRgbToXyz65_default(color))\n },\n ranges: {\n i: [0, 0.581],\n t: [-0.369, 0.272],\n p: [-0.164, 0.331]\n },\n interpolate: {\n i: interpolatorLinear,\n t: interpolatorLinear,\n p: interpolatorLinear,\n alpha: { use: interpolatorLinear, fixup: fixupAlpha }\n }\n };\n var definition_default10 = definition10;\n\n // node_modules/culori/src/jab/convertXyz65ToJab.js\n var p = 134.03437499999998;\n var d0 = 16295499532821565e-27;\n var jabPqEncode = (v) => {\n if (v < 0) return 0;\n let vn3 = Math.pow(v / 1e4, M1);\n return Math.pow((C1 + C2 * vn3) / (1 + C3 * vn3), p);\n };\n var abs = (v = 0) => Math.max(v * 203, 0);\n var convertXyz65ToJab = ({ x, y, z, alpha: alpha2 }) => {\n x = abs(x);\n y = abs(y);\n z = abs(z);\n let xp = 1.15 * x - 0.15 * z;\n let yp = 0.66 * y + 0.34 * x;\n let l = jabPqEncode(0.41478972 * xp + 0.579999 * yp + 0.014648 * z);\n let m = jabPqEncode(-0.20151 * xp + 1.120649 * yp + 0.0531008 * z);\n let s = jabPqEncode(-0.0166008 * xp + 0.2648 * yp + 0.6684799 * z);\n let i = (l + m) / 2;\n let res = {\n mode: \"jab\",\n j: 0.44 * i / (1 - 0.56 * i) - d0,\n a: 3.524 * l - 4.066708 * m + 0.542708 * s,\n b: 0.199076 * l + 1.096799 * m - 1.295875 * s\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertXyz65ToJab_default = convertXyz65ToJab;\n\n // node_modules/culori/src/jab/convertJabToXyz65.js\n var p2 = 134.03437499999998;\n var d02 = 16295499532821565e-27;\n var jabPqDecode = (v) => {\n if (v < 0) return 0;\n let vp = Math.pow(v, 1 / p2);\n return 1e4 * Math.pow((C1 - vp) / (C3 * vp - C2), 1 / M1);\n };\n var rel = (v) => v / 203;\n var convertJabToXyz65 = ({ j, a, b, alpha: alpha2 }) => {\n if (j === void 0) j = 0;\n if (a === void 0) a = 0;\n if (b === void 0) b = 0;\n let i = (j + d02) / (0.44 + 0.56 * (j + d02));\n let l = jabPqDecode(i + 0.13860504 * a + 0.058047316 * b);\n let m = jabPqDecode(i - 0.13860504 * a - 0.058047316 * b);\n let s = jabPqDecode(i - 0.096019242 * a - 0.8118919 * b);\n let res = {\n mode: \"xyz65\",\n x: rel(\n 1.661373024652174 * l - 0.914523081304348 * m + 0.23136208173913045 * s\n ),\n y: rel(\n -0.3250758611844533 * l + 1.571847026732543 * m - 0.21825383453227928 * s\n ),\n z: rel(-0.090982811 * l - 0.31272829 * m + 1.5227666 * s)\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertJabToXyz65_default = convertJabToXyz65;\n\n // node_modules/culori/src/jab/convertRgbToJab.js\n var convertRgbToJab = (rgb4) => {\n let res = convertXyz65ToJab_default(convertRgbToXyz65_default(rgb4));\n if (rgb4.r === rgb4.b && rgb4.b === rgb4.g) {\n res.a = res.b = 0;\n }\n return res;\n };\n var convertRgbToJab_default = convertRgbToJab;\n\n // node_modules/culori/src/jab/convertJabToRgb.js\n var convertJabToRgb = (color) => convertXyz65ToRgb_default(convertJabToXyz65_default(color));\n var convertJabToRgb_default = convertJabToRgb;\n\n // node_modules/culori/src/jab/definition.js\n var definition11 = {\n mode: \"jab\",\n channels: [\"j\", \"a\", \"b\", \"alpha\"],\n parse: [\"--jzazbz\"],\n serialize: \"--jzazbz\",\n fromMode: {\n rgb: convertRgbToJab_default,\n xyz65: convertXyz65ToJab_default\n },\n toMode: {\n rgb: convertJabToRgb_default,\n xyz65: convertJabToXyz65_default\n },\n ranges: {\n j: [0, 0.222],\n a: [-0.109, 0.129],\n b: [-0.185, 0.134]\n },\n interpolate: {\n j: interpolatorLinear,\n a: interpolatorLinear,\n b: interpolatorLinear,\n alpha: { use: interpolatorLinear, fixup: fixupAlpha }\n }\n };\n var definition_default11 = definition11;\n\n // node_modules/culori/src/jch/convertJabToJch.js\n var convertJabToJch = ({ j, a, b, alpha: alpha2 }) => {\n if (a === void 0) a = 0;\n if (b === void 0) b = 0;\n let c2 = Math.sqrt(a * a + b * b);\n let res = {\n mode: \"jch\",\n j,\n c: c2\n };\n if (c2) {\n res.h = normalizeHue_default(Math.atan2(b, a) * 180 / Math.PI);\n }\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertJabToJch_default = convertJabToJch;\n\n // node_modules/culori/src/jch/convertJchToJab.js\n var convertJchToJab = ({ j, c: c2, h, alpha: alpha2 }) => {\n if (h === void 0) h = 0;\n let res = {\n mode: \"jab\",\n j,\n a: c2 ? c2 * Math.cos(h / 180 * Math.PI) : 0,\n b: c2 ? c2 * Math.sin(h / 180 * Math.PI) : 0\n };\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n };\n var convertJchToJab_default = convertJchToJab;\n\n // node_modules/culori/src/jch/definition.js\n var definition12 = {\n mode: \"jch\",\n parse: [\"--jzczhz\"],\n serialize: \"--jzczhz\",\n toMode: {\n jab: convertJchToJab_default,\n rgb: (c2) => convertJabToRgb_default(convertJchToJab_default(c2))\n },\n fromMode: {\n rgb: (c2) => convertJabToJch_default(convertRgbToJab_default(c2)),\n jab: convertJabToJch_default\n },\n channels: [\"j\", \"c\", \"h\", \"alpha\"],\n ranges: {\n j: [0, 0.221],\n c: [0, 0.19],\n h: [0, 360]\n },\n interpolate: {\n h: { use: interpolatorLinear, fixup: fixupHueShorter },\n c: interpolatorLinear,\n j: interpolatorLinear,\n alpha: { use: interpolatorLinear, fixup: fixupAlpha }\n },\n difference: {\n h: differenceHueChroma\n },\n average: {\n h: averageAngle\n }\n };\n var definition_default12 = definition12;\n\n // node_modules/culori/src/xyz50/constants.js\n var k3 = Math.pow(29, 3) / Math.pow(3, 3);\n var e3 = Math.pow(6, 3) / Math.pow(29, 3);\n\n // node_modules/culori/src/lab/convertLabToXyz50.js\n var fn4 = (v) => Math.pow(v, 3) > e3 ? Math.pow(v, 3) : (116 * v - 16) / k3;\n var convertLabToXyz50 = ({ l, a, b, alpha: alpha2 }) => {\n if (l === void 0) l = 0;\n if (a === void 0) a = 0;\n if (b === void 0) b = 0;\n let fy = (l + 16) / 116;\n let fx = a / 500 + fy;\n let fz = fy - b / 200;\n let res = {\n mode: \"xyz50\",\n x: fn4(fx) * D50.X,\n y: fn4(fy) * D50.Y,\n z: fn4(fz) * D50.Z\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertLabToXyz50_default = convertLabToXyz50;\n\n // node_modules/culori/src/xyz50/convertXyz50ToRgb.js\n var convertXyz50ToRgb = ({ x, y, z, alpha: alpha2 }) => {\n if (x === void 0) x = 0;\n if (y === void 0) y = 0;\n if (z === void 0) z = 0;\n let res = convertLrgbToRgb_default({\n r: x * 3.1341359569958707 - y * 1.6173863321612538 - 0.4906619460083532 * z,\n g: x * -0.978795502912089 + y * 1.916254567259524 + 0.03344273116131949 * z,\n b: x * 0.07195537988411677 - y * 0.2289768264158322 + 1.405386058324125 * z\n });\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertXyz50ToRgb_default = convertXyz50ToRgb;\n\n // node_modules/culori/src/lab/convertLabToRgb.js\n var convertLabToRgb = (lab2) => convertXyz50ToRgb_default(convertLabToXyz50_default(lab2));\n var convertLabToRgb_default = convertLabToRgb;\n\n // node_modules/culori/src/xyz50/convertRgbToXyz50.js\n var convertRgbToXyz50 = (rgb4) => {\n let { r: r2, g, b, alpha: alpha2 } = convertRgbToLrgb_default(rgb4);\n let res = {\n mode: \"xyz50\",\n x: 0.436065742824811 * r2 + 0.3851514688337912 * g + 0.14307845442264197 * b,\n y: 0.22249319175623702 * r2 + 0.7168870538238823 * g + 0.06061979053616537 * b,\n z: 0.013923904500943465 * r2 + 0.09708128566574634 * g + 0.7140993584005155 * b\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertRgbToXyz50_default = convertRgbToXyz50;\n\n // node_modules/culori/src/lab/convertXyz50ToLab.js\n var f2 = (value) => value > e3 ? Math.cbrt(value) : (k3 * value + 16) / 116;\n var convertXyz50ToLab = ({ x, y, z, alpha: alpha2 }) => {\n if (x === void 0) x = 0;\n if (y === void 0) y = 0;\n if (z === void 0) z = 0;\n let f0 = f2(x / D50.X);\n let f1 = f2(y / D50.Y);\n let f22 = f2(z / D50.Z);\n let res = {\n mode: \"lab\",\n l: 116 * f1 - 16,\n a: 500 * (f0 - f1),\n b: 200 * (f1 - f22)\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertXyz50ToLab_default = convertXyz50ToLab;\n\n // node_modules/culori/src/lab/convertRgbToLab.js\n var convertRgbToLab = (rgb4) => {\n let res = convertXyz50ToLab_default(convertRgbToXyz50_default(rgb4));\n if (rgb4.r === rgb4.b && rgb4.b === rgb4.g) {\n res.a = res.b = 0;\n }\n return res;\n };\n var convertRgbToLab_default = convertRgbToLab;\n\n // node_modules/culori/src/lab/parseLab.js\n function parseLab(color, parsed) {\n if (!parsed || parsed[0] !== \"lab\") {\n return void 0;\n }\n const res = { mode: \"lab\" };\n const [, l, a, b, alpha2] = parsed;\n if (l.type === Tok.Hue || a.type === Tok.Hue || b.type === Tok.Hue) {\n return void 0;\n }\n if (l.type !== Tok.None) {\n res.l = Math.min(Math.max(0, l.value), 100);\n }\n if (a.type !== Tok.None) {\n res.a = a.type === Tok.Number ? a.value : a.value * 125 / 100;\n }\n if (b.type !== Tok.None) {\n res.b = b.type === Tok.Number ? b.value : b.value * 125 / 100;\n }\n if (alpha2.type !== Tok.None) {\n res.alpha = Math.min(\n 1,\n Math.max(\n 0,\n alpha2.type === Tok.Number ? alpha2.value : alpha2.value / 100\n )\n );\n }\n return res;\n }\n var parseLab_default = parseLab;\n\n // node_modules/culori/src/lab/definition.js\n var definition13 = {\n mode: \"lab\",\n toMode: {\n xyz50: convertLabToXyz50_default,\n rgb: convertLabToRgb_default\n },\n fromMode: {\n xyz50: convertXyz50ToLab_default,\n rgb: convertRgbToLab_default\n },\n channels: [\"l\", \"a\", \"b\", \"alpha\"],\n ranges: {\n l: [0, 100],\n a: [-125, 125],\n b: [-125, 125]\n },\n parse: [parseLab_default],\n serialize: (c2) => `lab(${c2.l !== void 0 ? c2.l : \"none\"} ${c2.a !== void 0 ? c2.a : \"none\"} ${c2.b !== void 0 ? c2.b : \"none\"}${c2.alpha < 1 ? ` / ${c2.alpha}` : \"\"})`,\n interpolate: {\n l: interpolatorLinear,\n a: interpolatorLinear,\n b: interpolatorLinear,\n alpha: { use: interpolatorLinear, fixup: fixupAlpha }\n }\n };\n var definition_default13 = definition13;\n\n // node_modules/culori/src/lab65/definition.js\n var definition14 = {\n ...definition_default13,\n mode: \"lab65\",\n parse: [\"--lab-d65\"],\n serialize: \"--lab-d65\",\n toMode: {\n xyz65: convertLab65ToXyz65_default,\n rgb: convertLab65ToRgb_default\n },\n fromMode: {\n xyz65: convertXyz65ToLab65_default,\n rgb: convertRgbToLab65_default\n },\n ranges: {\n l: [0, 100],\n a: [-125, 125],\n b: [-125, 125]\n }\n };\n var definition_default14 = definition14;\n\n // node_modules/culori/src/lch/parseLch.js\n function parseLch(color, parsed) {\n if (!parsed || parsed[0] !== \"lch\") {\n return void 0;\n }\n const res = { mode: \"lch\" };\n const [, l, c2, h, alpha2] = parsed;\n if (l.type !== Tok.None) {\n if (l.type === Tok.Hue) {\n return void 0;\n }\n res.l = Math.min(Math.max(0, l.value), 100);\n }\n if (c2.type !== Tok.None) {\n res.c = Math.max(\n 0,\n c2.type === Tok.Number ? c2.value : c2.value * 150 / 100\n );\n }\n if (h.type !== Tok.None) {\n if (h.type === Tok.Percentage) {\n return void 0;\n }\n res.h = h.value;\n }\n if (alpha2.type !== Tok.None) {\n res.alpha = Math.min(\n 1,\n Math.max(\n 0,\n alpha2.type === Tok.Number ? alpha2.value : alpha2.value / 100\n )\n );\n }\n return res;\n }\n var parseLch_default = parseLch;\n\n // node_modules/culori/src/lch/definition.js\n var definition15 = {\n mode: \"lch\",\n toMode: {\n lab: convertLchToLab_default,\n rgb: (c2) => convertLabToRgb_default(convertLchToLab_default(c2))\n },\n fromMode: {\n rgb: (c2) => convertLabToLch_default(convertRgbToLab_default(c2)),\n lab: convertLabToLch_default\n },\n channels: [\"l\", \"c\", \"h\", \"alpha\"],\n ranges: {\n l: [0, 100],\n c: [0, 150],\n h: [0, 360]\n },\n parse: [parseLch_default],\n serialize: (c2) => `lch(${c2.l !== void 0 ? c2.l : \"none\"} ${c2.c !== void 0 ? c2.c : \"none\"} ${c2.h !== void 0 ? c2.h : \"none\"}${c2.alpha < 1 ? ` / ${c2.alpha}` : \"\"})`,\n interpolate: {\n h: { use: interpolatorLinear, fixup: fixupHueShorter },\n c: interpolatorLinear,\n l: interpolatorLinear,\n alpha: { use: interpolatorLinear, fixup: fixupAlpha }\n },\n difference: {\n h: differenceHueChroma\n },\n average: {\n h: averageAngle\n }\n };\n var definition_default15 = definition15;\n\n // node_modules/culori/src/lch65/definition.js\n var definition16 = {\n ...definition_default15,\n mode: \"lch65\",\n parse: [\"--lch-d65\"],\n serialize: \"--lch-d65\",\n toMode: {\n lab65: (c2) => convertLchToLab_default(c2, \"lab65\"),\n rgb: (c2) => convertLab65ToRgb_default(convertLchToLab_default(c2, \"lab65\"))\n },\n fromMode: {\n rgb: (c2) => convertLabToLch_default(convertRgbToLab65_default(c2), \"lch65\"),\n lab65: (c2) => convertLabToLch_default(c2, \"lch65\")\n },\n ranges: {\n l: [0, 100],\n c: [0, 150],\n h: [0, 360]\n }\n };\n var definition_default16 = definition16;\n\n // node_modules/culori/src/lchuv/convertLuvToLchuv.js\n var convertLuvToLchuv = ({ l, u, v, alpha: alpha2 }) => {\n if (u === void 0) u = 0;\n if (v === void 0) v = 0;\n let c2 = Math.sqrt(u * u + v * v);\n let res = {\n mode: \"lchuv\",\n l,\n c: c2\n };\n if (c2) {\n res.h = normalizeHue_default(Math.atan2(v, u) * 180 / Math.PI);\n }\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertLuvToLchuv_default = convertLuvToLchuv;\n\n // node_modules/culori/src/lchuv/convertLchuvToLuv.js\n var convertLchuvToLuv = ({ l, c: c2, h, alpha: alpha2 }) => {\n if (h === void 0) h = 0;\n let res = {\n mode: \"luv\",\n l,\n u: c2 ? c2 * Math.cos(h / 180 * Math.PI) : 0,\n v: c2 ? c2 * Math.sin(h / 180 * Math.PI) : 0\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertLchuvToLuv_default = convertLchuvToLuv;\n\n // node_modules/culori/src/luv/convertXyz50ToLuv.js\n var u_fn = (x, y, z) => 4 * x / (x + 15 * y + 3 * z);\n var v_fn = (x, y, z) => 9 * y / (x + 15 * y + 3 * z);\n var un = u_fn(D50.X, D50.Y, D50.Z);\n var vn = v_fn(D50.X, D50.Y, D50.Z);\n var l_fn = (value) => value <= e3 ? k3 * value : 116 * Math.cbrt(value) - 16;\n var convertXyz50ToLuv = ({ x, y, z, alpha: alpha2 }) => {\n if (x === void 0) x = 0;\n if (y === void 0) y = 0;\n if (z === void 0) z = 0;\n let l = l_fn(y / D50.Y);\n let u = u_fn(x, y, z);\n let v = v_fn(x, y, z);\n if (!isFinite(u) || !isFinite(v)) {\n l = u = v = 0;\n } else {\n u = 13 * l * (u - un);\n v = 13 * l * (v - vn);\n }\n let res = {\n mode: \"luv\",\n l,\n u,\n v\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertXyz50ToLuv_default = convertXyz50ToLuv;\n\n // node_modules/culori/src/luv/convertLuvToXyz50.js\n var u_fn2 = (x, y, z) => 4 * x / (x + 15 * y + 3 * z);\n var v_fn2 = (x, y, z) => 9 * y / (x + 15 * y + 3 * z);\n var un2 = u_fn2(D50.X, D50.Y, D50.Z);\n var vn2 = v_fn2(D50.X, D50.Y, D50.Z);\n var convertLuvToXyz50 = ({ l, u, v, alpha: alpha2 }) => {\n if (l === void 0) l = 0;\n if (l === 0) {\n return { mode: \"xyz50\", x: 0, y: 0, z: 0 };\n }\n if (u === void 0) u = 0;\n if (v === void 0) v = 0;\n let up = u / (13 * l) + un2;\n let vp = v / (13 * l) + vn2;\n let y = D50.Y * (l <= 8 ? l / k3 : Math.pow((l + 16) / 116, 3));\n let x = y * (9 * up) / (4 * vp);\n let z = y * (12 - 3 * up - 20 * vp) / (4 * vp);\n let res = { mode: \"xyz50\", x, y, z };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertLuvToXyz50_default = convertLuvToXyz50;\n\n // node_modules/culori/src/lchuv/definition.js\n var convertRgbToLchuv = (rgb4) => convertLuvToLchuv_default(convertXyz50ToLuv_default(convertRgbToXyz50_default(rgb4)));\n var convertLchuvToRgb = (lchuv2) => convertXyz50ToRgb_default(convertLuvToXyz50_default(convertLchuvToLuv_default(lchuv2)));\n var definition17 = {\n mode: \"lchuv\",\n toMode: {\n luv: convertLchuvToLuv_default,\n rgb: convertLchuvToRgb\n },\n fromMode: {\n rgb: convertRgbToLchuv,\n luv: convertLuvToLchuv_default\n },\n channels: [\"l\", \"c\", \"h\", \"alpha\"],\n parse: [\"--lchuv\"],\n serialize: \"--lchuv\",\n ranges: {\n l: [0, 100],\n c: [0, 176.956],\n h: [0, 360]\n },\n interpolate: {\n h: { use: interpolatorLinear, fixup: fixupHueShorter },\n c: interpolatorLinear,\n l: interpolatorLinear,\n alpha: { use: interpolatorLinear, fixup: fixupAlpha }\n },\n difference: {\n h: differenceHueChroma\n },\n average: {\n h: averageAngle\n }\n };\n var definition_default17 = definition17;\n\n // node_modules/culori/src/lrgb/definition.js\n var definition18 = {\n ...definition_default,\n mode: \"lrgb\",\n toMode: {\n rgb: convertLrgbToRgb_default\n },\n fromMode: {\n rgb: convertRgbToLrgb_default\n },\n parse: [\"srgb-linear\"],\n serialize: \"srgb-linear\"\n };\n var definition_default18 = definition18;\n\n // node_modules/culori/src/luv/definition.js\n var definition19 = {\n mode: \"luv\",\n toMode: {\n xyz50: convertLuvToXyz50_default,\n rgb: (luv2) => convertXyz50ToRgb_default(convertLuvToXyz50_default(luv2))\n },\n fromMode: {\n xyz50: convertXyz50ToLuv_default,\n rgb: (rgb4) => convertXyz50ToLuv_default(convertRgbToXyz50_default(rgb4))\n },\n channels: [\"l\", \"u\", \"v\", \"alpha\"],\n parse: [\"--luv\"],\n serialize: \"--luv\",\n ranges: {\n l: [0, 100],\n u: [-84.936, 175.042],\n v: [-125.882, 87.243]\n },\n interpolate: {\n l: interpolatorLinear,\n u: interpolatorLinear,\n v: interpolatorLinear,\n alpha: { use: interpolatorLinear, fixup: fixupAlpha }\n }\n };\n var definition_default19 = definition19;\n\n // node_modules/culori/src/oklab/convertLrgbToOklab.js\n var convertLrgbToOklab = ({ r: r2, g, b, alpha: alpha2 }) => {\n if (r2 === void 0) r2 = 0;\n if (g === void 0) g = 0;\n if (b === void 0) b = 0;\n let L = Math.cbrt(\n 0.412221469470763 * r2 + 0.5363325372617348 * g + 0.0514459932675022 * b\n );\n let M3 = Math.cbrt(\n 0.2119034958178252 * r2 + 0.6806995506452344 * g + 0.1073969535369406 * b\n );\n let S = Math.cbrt(\n 0.0883024591900564 * r2 + 0.2817188391361215 * g + 0.6299787016738222 * b\n );\n let res = {\n mode: \"oklab\",\n l: 0.210454268309314 * L + 0.7936177747023054 * M3 - 0.0040720430116193 * S,\n a: 1.9779985324311684 * L - 2.42859224204858 * M3 + 0.450593709617411 * S,\n b: 0.0259040424655478 * L + 0.7827717124575296 * M3 - 0.8086757549230774 * S\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertLrgbToOklab_default = convertLrgbToOklab;\n\n // node_modules/culori/src/oklab/convertRgbToOklab.js\n var convertRgbToOklab = (rgb4) => {\n let res = convertLrgbToOklab_default(convertRgbToLrgb_default(rgb4));\n if (rgb4.r === rgb4.b && rgb4.b === rgb4.g) {\n res.a = res.b = 0;\n }\n return res;\n };\n var convertRgbToOklab_default = convertRgbToOklab;\n\n // node_modules/culori/src/oklab/convertOklabToLrgb.js\n var convertOklabToLrgb = ({ l, a, b, alpha: alpha2 }) => {\n if (l === void 0) l = 0;\n if (a === void 0) a = 0;\n if (b === void 0) b = 0;\n let L = Math.pow(l + 0.3963377773761749 * a + 0.2158037573099136 * b, 3);\n let M3 = Math.pow(l - 0.1055613458156586 * a - 0.0638541728258133 * b, 3);\n let S = Math.pow(l - 0.0894841775298119 * a - 1.2914855480194092 * b, 3);\n let res = {\n mode: \"lrgb\",\n r: 4.076741636075957 * L - 3.3077115392580616 * M3 + 0.2309699031821044 * S,\n g: -1.2684379732850317 * L + 2.6097573492876887 * M3 - 0.3413193760026573 * S,\n b: -0.0041960761386756 * L - 0.7034186179359362 * M3 + 1.7076146940746117 * S\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertOklabToLrgb_default = convertOklabToLrgb;\n\n // node_modules/culori/src/oklab/convertOklabToRgb.js\n var convertOklabToRgb = (c2) => convertLrgbToRgb_default(convertOklabToLrgb_default(c2));\n var convertOklabToRgb_default = convertOklabToRgb;\n\n // node_modules/culori/src/okhsl/helpers.js\n function toe(x) {\n const k_1 = 0.206;\n const k_2 = 0.03;\n const k_3 = (1 + k_1) / (1 + k_2);\n return 0.5 * (k_3 * x - k_1 + Math.sqrt((k_3 * x - k_1) * (k_3 * x - k_1) + 4 * k_2 * k_3 * x));\n }\n function toe_inv(x) {\n const k_1 = 0.206;\n const k_2 = 0.03;\n const k_3 = (1 + k_1) / (1 + k_2);\n return (x * x + k_1 * x) / (k_3 * (x + k_2));\n }\n function compute_max_saturation(a, b) {\n let k0, k1, k22, k32, k4, wl, wm, ws;\n if (-1.88170328 * a - 0.80936493 * b > 1) {\n k0 = 1.19086277;\n k1 = 1.76576728;\n k22 = 0.59662641;\n k32 = 0.75515197;\n k4 = 0.56771245;\n wl = 4.0767416621;\n wm = -3.3077115913;\n ws = 0.2309699292;\n } else if (1.81444104 * a - 1.19445276 * b > 1) {\n k0 = 0.73956515;\n k1 = -0.45954404;\n k22 = 0.08285427;\n k32 = 0.1254107;\n k4 = 0.14503204;\n wl = -1.2684380046;\n wm = 2.6097574011;\n ws = -0.3413193965;\n } else {\n k0 = 1.35733652;\n k1 = -915799e-8;\n k22 = -1.1513021;\n k32 = -0.50559606;\n k4 = 692167e-8;\n wl = -0.0041960863;\n wm = -0.7034186147;\n ws = 1.707614701;\n }\n let S = k0 + k1 * a + k22 * b + k32 * a * a + k4 * a * b;\n let k_l = 0.3963377774 * a + 0.2158037573 * b;\n let k_m = -0.1055613458 * a - 0.0638541728 * b;\n let k_s = -0.0894841775 * a - 1.291485548 * b;\n {\n let l_ = 1 + S * k_l;\n let m_ = 1 + S * k_m;\n let s_ = 1 + S * k_s;\n let l = l_ * l_ * l_;\n let m = m_ * m_ * m_;\n let s = s_ * s_ * s_;\n let l_dS = 3 * k_l * l_ * l_;\n let m_dS = 3 * k_m * m_ * m_;\n let s_dS = 3 * k_s * s_ * s_;\n let l_dS2 = 6 * k_l * k_l * l_;\n let m_dS2 = 6 * k_m * k_m * m_;\n let s_dS2 = 6 * k_s * k_s * s_;\n let f3 = wl * l + wm * m + ws * s;\n let f1 = wl * l_dS + wm * m_dS + ws * s_dS;\n let f22 = wl * l_dS2 + wm * m_dS2 + ws * s_dS2;\n S = S - f3 * f1 / (f1 * f1 - 0.5 * f3 * f22);\n }\n return S;\n }\n function find_cusp(a, b) {\n let S_cusp = compute_max_saturation(a, b);\n let rgb4 = convertOklabToLrgb_default({ l: 1, a: S_cusp * a, b: S_cusp * b });\n let L_cusp = Math.cbrt(1 / Math.max(rgb4.r, rgb4.g, rgb4.b));\n let C_cusp = L_cusp * S_cusp;\n return [L_cusp, C_cusp];\n }\n function find_gamut_intersection(a, b, L1, C12, L0, cusp = null) {\n if (!cusp) {\n cusp = find_cusp(a, b);\n }\n let t;\n if ((L1 - L0) * cusp[1] - (cusp[0] - L0) * C12 <= 0) {\n t = cusp[1] * L0 / (C12 * cusp[0] + cusp[1] * (L0 - L1));\n } else {\n t = cusp[1] * (L0 - 1) / (C12 * (cusp[0] - 1) + cusp[1] * (L0 - L1));\n {\n let dL = L1 - L0;\n let dC = C12;\n let k_l = 0.3963377774 * a + 0.2158037573 * b;\n let k_m = -0.1055613458 * a - 0.0638541728 * b;\n let k_s = -0.0894841775 * a - 1.291485548 * b;\n let l_dt = dL + dC * k_l;\n let m_dt = dL + dC * k_m;\n let s_dt = dL + dC * k_s;\n {\n let L = L0 * (1 - t) + t * L1;\n let C = t * C12;\n let l_ = L + C * k_l;\n let m_ = L + C * k_m;\n let s_ = L + C * k_s;\n let l = l_ * l_ * l_;\n let m = m_ * m_ * m_;\n let s = s_ * s_ * s_;\n let ldt = 3 * l_dt * l_ * l_;\n let mdt = 3 * m_dt * m_ * m_;\n let sdt = 3 * s_dt * s_ * s_;\n let ldt2 = 6 * l_dt * l_dt * l_;\n let mdt2 = 6 * m_dt * m_dt * m_;\n let sdt2 = 6 * s_dt * s_dt * s_;\n let r2 = 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s - 1;\n let r1 = 4.0767416621 * ldt - 3.3077115913 * mdt + 0.2309699292 * sdt;\n let r22 = 4.0767416621 * ldt2 - 3.3077115913 * mdt2 + 0.2309699292 * sdt2;\n let u_r = r1 / (r1 * r1 - 0.5 * r2 * r22);\n let t_r = -r2 * u_r;\n let g = -1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s - 1;\n let g1 = -1.2684380046 * ldt + 2.6097574011 * mdt - 0.3413193965 * sdt;\n let g2 = -1.2684380046 * ldt2 + 2.6097574011 * mdt2 - 0.3413193965 * sdt2;\n let u_g = g1 / (g1 * g1 - 0.5 * g * g2);\n let t_g = -g * u_g;\n let b2 = -0.0041960863 * l - 0.7034186147 * m + 1.707614701 * s - 1;\n let b1 = -0.0041960863 * ldt - 0.7034186147 * mdt + 1.707614701 * sdt;\n let b22 = -0.0041960863 * ldt2 - 0.7034186147 * mdt2 + 1.707614701 * sdt2;\n let u_b = b1 / (b1 * b1 - 0.5 * b2 * b22);\n let t_b = -b2 * u_b;\n t_r = u_r >= 0 ? t_r : 1e6;\n t_g = u_g >= 0 ? t_g : 1e6;\n t_b = u_b >= 0 ? t_b : 1e6;\n t += Math.min(t_r, Math.min(t_g, t_b));\n }\n }\n }\n return t;\n }\n function get_ST_max(a_, b_, cusp = null) {\n if (!cusp) {\n cusp = find_cusp(a_, b_);\n }\n let L = cusp[0];\n let C = cusp[1];\n return [C / L, C / (1 - L)];\n }\n function get_Cs(L, a_, b_) {\n let cusp = find_cusp(a_, b_);\n let C_max = find_gamut_intersection(a_, b_, L, 1, L, cusp);\n let ST_max = get_ST_max(a_, b_, cusp);\n let S_mid = 0.11516993 + 1 / (7.4477897 + 4.1590124 * b_ + a_ * (-2.19557347 + 1.75198401 * b_ + a_ * (-2.13704948 - 10.02301043 * b_ + a_ * (-4.24894561 + 5.38770819 * b_ + 4.69891013 * a_))));\n let T_mid = 0.11239642 + 1 / (1.6132032 - 0.68124379 * b_ + a_ * (0.40370612 + 0.90148123 * b_ + a_ * (-0.27087943 + 0.6122399 * b_ + a_ * (299215e-8 - 0.45399568 * b_ - 0.14661872 * a_))));\n let k4 = C_max / Math.min(L * ST_max[0], (1 - L) * ST_max[1]);\n let C_a = L * S_mid;\n let C_b = (1 - L) * T_mid;\n let C_mid = 0.9 * k4 * Math.sqrt(\n Math.sqrt(\n 1 / (1 / (C_a * C_a * C_a * C_a) + 1 / (C_b * C_b * C_b * C_b))\n )\n );\n C_a = L * 0.4;\n C_b = (1 - L) * 0.8;\n let C_0 = Math.sqrt(1 / (1 / (C_a * C_a) + 1 / (C_b * C_b)));\n return [C_0, C_mid, C_max];\n }\n\n // node_modules/culori/src/okhsl/convertOklabToOkhsl.js\n function convertOklabToOkhsl(lab2) {\n const l = lab2.l !== void 0 ? lab2.l : 0;\n const a = lab2.a !== void 0 ? lab2.a : 0;\n const b = lab2.b !== void 0 ? lab2.b : 0;\n const ret = { mode: \"okhsl\", l: toe(l) };\n if (lab2.alpha !== void 0) {\n ret.alpha = lab2.alpha;\n }\n let c2 = Math.sqrt(a * a + b * b);\n if (!c2) {\n ret.s = 0;\n return ret;\n }\n let [C_0, C_mid, C_max] = get_Cs(l, a / c2, b / c2);\n let s;\n if (c2 < C_mid) {\n let k_0 = 0;\n let k_1 = 0.8 * C_0;\n let k_2 = 1 - k_1 / C_mid;\n let t = (c2 - k_0) / (k_1 + k_2 * (c2 - k_0));\n s = t * 0.8;\n } else {\n let k_0 = C_mid;\n let k_1 = 0.2 * C_mid * C_mid * 1.25 * 1.25 / C_0;\n let k_2 = 1 - k_1 / (C_max - C_mid);\n let t = (c2 - k_0) / (k_1 + k_2 * (c2 - k_0));\n s = 0.8 + 0.2 * t;\n }\n if (s) {\n ret.s = s;\n ret.h = normalizeHue_default(Math.atan2(b, a) * 180 / Math.PI);\n }\n return ret;\n }\n\n // node_modules/culori/src/okhsl/convertOkhslToOklab.js\n function convertOkhslToOklab(hsl3) {\n let h = hsl3.h !== void 0 ? hsl3.h : 0;\n let s = hsl3.s !== void 0 ? hsl3.s : 0;\n let l = hsl3.l !== void 0 ? hsl3.l : 0;\n const ret = { mode: \"oklab\", l: toe_inv(l) };\n if (hsl3.alpha !== void 0) {\n ret.alpha = hsl3.alpha;\n }\n if (!s || l === 1) {\n ret.a = ret.b = 0;\n return ret;\n }\n let a_ = Math.cos(h / 180 * Math.PI);\n let b_ = Math.sin(h / 180 * Math.PI);\n let [C_0, C_mid, C_max] = get_Cs(ret.l, a_, b_);\n let t, k_0, k_1, k_2;\n if (s < 0.8) {\n t = 1.25 * s;\n k_0 = 0;\n k_1 = 0.8 * C_0;\n k_2 = 1 - k_1 / C_mid;\n } else {\n t = 5 * (s - 0.8);\n k_0 = C_mid;\n k_1 = 0.2 * C_mid * C_mid * 1.25 * 1.25 / C_0;\n k_2 = 1 - k_1 / (C_max - C_mid);\n }\n let C = k_0 + t * k_1 / (1 - k_2 * t);\n ret.a = C * a_;\n ret.b = C * b_;\n return ret;\n }\n\n // node_modules/culori/src/okhsl/modeOkhsl.js\n var modeOkhsl = {\n ...definition_default7,\n mode: \"okhsl\",\n channels: [\"h\", \"s\", \"l\", \"alpha\"],\n parse: [\"--okhsl\"],\n serialize: \"--okhsl\",\n fromMode: {\n oklab: convertOklabToOkhsl,\n rgb: (c2) => convertOklabToOkhsl(convertRgbToOklab_default(c2))\n },\n toMode: {\n oklab: convertOkhslToOklab,\n rgb: (c2) => convertOklabToRgb_default(convertOkhslToOklab(c2))\n }\n };\n var modeOkhsl_default = modeOkhsl;\n\n // node_modules/culori/src/okhsv/convertOklabToOkhsv.js\n function convertOklabToOkhsv(lab2) {\n let l = lab2.l !== void 0 ? lab2.l : 0;\n let a = lab2.a !== void 0 ? lab2.a : 0;\n let b = lab2.b !== void 0 ? lab2.b : 0;\n let c2 = Math.sqrt(a * a + b * b);\n let a_ = c2 ? a / c2 : 1;\n let b_ = c2 ? b / c2 : 1;\n let [S_max, T] = get_ST_max(a_, b_);\n let S_0 = 0.5;\n let k4 = 1 - S_0 / S_max;\n let t = T / (c2 + l * T);\n let L_v = t * l;\n let C_v = t * c2;\n let L_vt = toe_inv(L_v);\n let C_vt = C_v * L_vt / L_v;\n let rgb_scale = convertOklabToLrgb_default({ l: L_vt, a: a_ * C_vt, b: b_ * C_vt });\n let scale_L = Math.cbrt(\n 1 / Math.max(rgb_scale.r, rgb_scale.g, rgb_scale.b, 0)\n );\n l = l / scale_L;\n c2 = c2 / scale_L * toe(l) / l;\n l = toe(l);\n const ret = {\n mode: \"okhsv\",\n s: c2 ? (S_0 + T) * C_v / (T * S_0 + T * k4 * C_v) : 0,\n v: l ? l / L_v : 0\n };\n if (ret.s) {\n ret.h = normalizeHue_default(Math.atan2(b, a) * 180 / Math.PI);\n }\n if (lab2.alpha !== void 0) {\n ret.alpha = lab2.alpha;\n }\n return ret;\n }\n\n // node_modules/culori/src/okhsv/convertOkhsvToOklab.js\n function convertOkhsvToOklab(hsv2) {\n const ret = { mode: \"oklab\" };\n if (hsv2.alpha !== void 0) {\n ret.alpha = hsv2.alpha;\n }\n const h = hsv2.h !== void 0 ? hsv2.h : 0;\n const s = hsv2.s !== void 0 ? hsv2.s : 0;\n const v = hsv2.v !== void 0 ? hsv2.v : 0;\n const a_ = Math.cos(h / 180 * Math.PI);\n const b_ = Math.sin(h / 180 * Math.PI);\n const [S_max, T] = get_ST_max(a_, b_);\n const S_0 = 0.5;\n const k4 = 1 - S_0 / S_max;\n const L_v = 1 - s * S_0 / (S_0 + T - T * k4 * s);\n const C_v = s * T * S_0 / (S_0 + T - T * k4 * s);\n const L_vt = toe_inv(L_v);\n const C_vt = C_v * L_vt / L_v;\n const rgb_scale = convertOklabToLrgb_default({\n l: L_vt,\n a: a_ * C_vt,\n b: b_ * C_vt\n });\n const scale_L = Math.cbrt(\n 1 / Math.max(rgb_scale.r, rgb_scale.g, rgb_scale.b, 0)\n );\n const L_new = toe_inv(v * L_v);\n const C = C_v * L_new / L_v;\n ret.l = L_new * scale_L;\n ret.a = C * a_ * scale_L;\n ret.b = C * b_ * scale_L;\n return ret;\n }\n\n // node_modules/culori/src/okhsv/modeOkhsv.js\n var modeOkhsv = {\n ...definition_default8,\n mode: \"okhsv\",\n channels: [\"h\", \"s\", \"v\", \"alpha\"],\n parse: [\"--okhsv\"],\n serialize: \"--okhsv\",\n fromMode: {\n oklab: convertOklabToOkhsv,\n rgb: (c2) => convertOklabToOkhsv(convertRgbToOklab_default(c2))\n },\n toMode: {\n oklab: convertOkhsvToOklab,\n rgb: (c2) => convertOklabToRgb_default(convertOkhsvToOklab(c2))\n }\n };\n var modeOkhsv_default = modeOkhsv;\n\n // node_modules/culori/src/oklab/parseOklab.js\n function parseOklab(color, parsed) {\n if (!parsed || parsed[0] !== \"oklab\") {\n return void 0;\n }\n const res = { mode: \"oklab\" };\n const [, l, a, b, alpha2] = parsed;\n if (l.type === Tok.Hue || a.type === Tok.Hue || b.type === Tok.Hue) {\n return void 0;\n }\n if (l.type !== Tok.None) {\n res.l = Math.min(\n Math.max(0, l.type === Tok.Number ? l.value : l.value / 100),\n 1\n );\n }\n if (a.type !== Tok.None) {\n res.a = a.type === Tok.Number ? a.value : a.value * 0.4 / 100;\n }\n if (b.type !== Tok.None) {\n res.b = b.type === Tok.Number ? b.value : b.value * 0.4 / 100;\n }\n if (alpha2.type !== Tok.None) {\n res.alpha = Math.min(\n 1,\n Math.max(\n 0,\n alpha2.type === Tok.Number ? alpha2.value : alpha2.value / 100\n )\n );\n }\n return res;\n }\n var parseOklab_default = parseOklab;\n\n // node_modules/culori/src/oklab/definition.js\n var definition20 = {\n ...definition_default13,\n mode: \"oklab\",\n toMode: {\n lrgb: convertOklabToLrgb_default,\n rgb: convertOklabToRgb_default\n },\n fromMode: {\n lrgb: convertLrgbToOklab_default,\n rgb: convertRgbToOklab_default\n },\n ranges: {\n l: [0, 1],\n a: [-0.4, 0.4],\n b: [-0.4, 0.4]\n },\n parse: [parseOklab_default],\n serialize: (c2) => `oklab(${c2.l !== void 0 ? c2.l : \"none\"} ${c2.a !== void 0 ? c2.a : \"none\"} ${c2.b !== void 0 ? c2.b : \"none\"}${c2.alpha < 1 ? ` / ${c2.alpha}` : \"\"})`\n };\n var definition_default20 = definition20;\n\n // node_modules/culori/src/oklch/parseOklch.js\n function parseOklch(color, parsed) {\n if (!parsed || parsed[0] !== \"oklch\") {\n return void 0;\n }\n const res = { mode: \"oklch\" };\n const [, l, c2, h, alpha2] = parsed;\n if (l.type !== Tok.None) {\n if (l.type === Tok.Hue) {\n return void 0;\n }\n res.l = Math.min(\n Math.max(0, l.type === Tok.Number ? l.value : l.value / 100),\n 1\n );\n }\n if (c2.type !== Tok.None) {\n res.c = Math.max(\n 0,\n c2.type === Tok.Number ? c2.value : c2.value * 0.4 / 100\n );\n }\n if (h.type !== Tok.None) {\n if (h.type === Tok.Percentage) {\n return void 0;\n }\n res.h = h.value;\n }\n if (alpha2.type !== Tok.None) {\n res.alpha = Math.min(\n 1,\n Math.max(\n 0,\n alpha2.type === Tok.Number ? alpha2.value : alpha2.value / 100\n )\n );\n }\n return res;\n }\n var parseOklch_default = parseOklch;\n\n // node_modules/culori/src/oklch/definition.js\n var definition21 = {\n ...definition_default15,\n mode: \"oklch\",\n toMode: {\n oklab: (c2) => convertLchToLab_default(c2, \"oklab\"),\n rgb: (c2) => convertOklabToRgb_default(convertLchToLab_default(c2, \"oklab\"))\n },\n fromMode: {\n rgb: (c2) => convertLabToLch_default(convertRgbToOklab_default(c2), \"oklch\"),\n oklab: (c2) => convertLabToLch_default(c2, \"oklch\")\n },\n parse: [parseOklch_default],\n serialize: (c2) => `oklch(${c2.l !== void 0 ? c2.l : \"none\"} ${c2.c !== void 0 ? c2.c : \"none\"} ${c2.h !== void 0 ? c2.h : \"none\"}${c2.alpha < 1 ? ` / ${c2.alpha}` : \"\"})`,\n ranges: {\n l: [0, 1],\n c: [0, 0.4],\n h: [0, 360]\n }\n };\n var definition_default21 = definition21;\n\n // node_modules/culori/src/p3/convertP3ToXyz65.js\n var convertP3ToXyz65 = (rgb4) => {\n let { r: r2, g, b, alpha: alpha2 } = convertRgbToLrgb_default(rgb4);\n let res = {\n mode: \"xyz65\",\n x: 0.486570948648216 * r2 + 0.265667693169093 * g + 0.1982172852343625 * b,\n y: 0.2289745640697487 * r2 + 0.6917385218365062 * g + 0.079286914093745 * b,\n z: 0 * r2 + 0.0451133818589026 * g + 1.043944368900976 * b\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertP3ToXyz65_default = convertP3ToXyz65;\n\n // node_modules/culori/src/p3/convertXyz65ToP3.js\n var convertXyz65ToP3 = ({ x, y, z, alpha: alpha2 }) => {\n if (x === void 0) x = 0;\n if (y === void 0) y = 0;\n if (z === void 0) z = 0;\n let res = convertLrgbToRgb_default(\n {\n r: x * 2.4934969119414263 - y * 0.9313836179191242 - 0.402710784450717 * z,\n g: x * -0.8294889695615749 + y * 1.7626640603183465 + 0.0236246858419436 * z,\n b: x * 0.0358458302437845 - y * 0.0761723892680418 + 0.9568845240076871 * z\n },\n \"p3\"\n );\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertXyz65ToP3_default = convertXyz65ToP3;\n\n // node_modules/culori/src/p3/definition.js\n var definition22 = {\n ...definition_default,\n mode: \"p3\",\n parse: [\"display-p3\"],\n serialize: \"display-p3\",\n fromMode: {\n rgb: (color) => convertXyz65ToP3_default(convertRgbToXyz65_default(color)),\n xyz65: convertXyz65ToP3_default\n },\n toMode: {\n rgb: (color) => convertXyz65ToRgb_default(convertP3ToXyz65_default(color)),\n xyz65: convertP3ToXyz65_default\n }\n };\n var definition_default22 = definition22;\n\n // node_modules/culori/src/prophoto/convertXyz50ToProphoto.js\n var gamma2 = (v) => {\n let abs2 = Math.abs(v);\n if (abs2 >= 1 / 512) {\n return Math.sign(v) * Math.pow(abs2, 1 / 1.8);\n }\n return 16 * v;\n };\n var convertXyz50ToProphoto = ({ x, y, z, alpha: alpha2 }) => {\n if (x === void 0) x = 0;\n if (y === void 0) y = 0;\n if (z === void 0) z = 0;\n let res = {\n mode: \"prophoto\",\n r: gamma2(\n x * 1.3457868816471585 - y * 0.2555720873797946 - 0.0511018649755453 * z\n ),\n g: gamma2(\n x * -0.5446307051249019 + y * 1.5082477428451466 + 0.0205274474364214 * z\n ),\n b: gamma2(x * 0 + y * 0 + 1.2119675456389452 * z)\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertXyz50ToProphoto_default = convertXyz50ToProphoto;\n\n // node_modules/culori/src/prophoto/convertProphotoToXyz50.js\n var linearize2 = (v = 0) => {\n let abs2 = Math.abs(v);\n if (abs2 >= 16 / 512) {\n return Math.sign(v) * Math.pow(abs2, 1.8);\n }\n return v / 16;\n };\n var convertProphotoToXyz50 = (prophoto2) => {\n let r2 = linearize2(prophoto2.r);\n let g = linearize2(prophoto2.g);\n let b = linearize2(prophoto2.b);\n let res = {\n mode: \"xyz50\",\n x: 0.7977666449006423 * r2 + 0.1351812974005331 * g + 0.0313477341283922 * b,\n y: 0.2880748288194013 * r2 + 0.7118352342418731 * g + 899369387256e-16 * b,\n z: 0 * r2 + 0 * g + 0.8251046025104602 * b\n };\n if (prophoto2.alpha !== void 0) {\n res.alpha = prophoto2.alpha;\n }\n return res;\n };\n var convertProphotoToXyz50_default = convertProphotoToXyz50;\n\n // node_modules/culori/src/prophoto/definition.js\n var definition23 = {\n ...definition_default,\n mode: \"prophoto\",\n parse: [\"prophoto-rgb\"],\n serialize: \"prophoto-rgb\",\n fromMode: {\n xyz50: convertXyz50ToProphoto_default,\n rgb: (color) => convertXyz50ToProphoto_default(convertRgbToXyz50_default(color))\n },\n toMode: {\n xyz50: convertProphotoToXyz50_default,\n rgb: (color) => convertXyz50ToRgb_default(convertProphotoToXyz50_default(color))\n }\n };\n var definition_default23 = definition23;\n\n // node_modules/culori/src/rec2020/convertXyz65ToRec2020.js\n var \\u03B1 = 1.09929682680944;\n var \\u03B2 = 0.018053968510807;\n var gamma3 = (v) => {\n const abs2 = Math.abs(v);\n if (abs2 > \\u03B2) {\n return (Math.sign(v) || 1) * (\\u03B1 * Math.pow(abs2, 0.45) - (\\u03B1 - 1));\n }\n return 4.5 * v;\n };\n var convertXyz65ToRec2020 = ({ x, y, z, alpha: alpha2 }) => {\n if (x === void 0) x = 0;\n if (y === void 0) y = 0;\n if (z === void 0) z = 0;\n let res = {\n mode: \"rec2020\",\n r: gamma3(\n x * 1.7166511879712683 - y * 0.3556707837763925 - 0.2533662813736599 * z\n ),\n g: gamma3(\n x * -0.6666843518324893 + y * 1.6164812366349395 + 0.0157685458139111 * z\n ),\n b: gamma3(\n x * 0.0176398574453108 - y * 0.0427706132578085 + 0.9421031212354739 * z\n )\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertXyz65ToRec2020_default = convertXyz65ToRec2020;\n\n // node_modules/culori/src/rec2020/convertRec2020ToXyz65.js\n var \\u03B12 = 1.09929682680944;\n var \\u03B22 = 0.018053968510807;\n var linearize3 = (v = 0) => {\n let abs2 = Math.abs(v);\n if (abs2 < \\u03B22 * 4.5) {\n return v / 4.5;\n }\n return (Math.sign(v) || 1) * Math.pow((abs2 + \\u03B12 - 1) / \\u03B12, 1 / 0.45);\n };\n var convertRec2020ToXyz65 = (rec20202) => {\n let r2 = linearize3(rec20202.r);\n let g = linearize3(rec20202.g);\n let b = linearize3(rec20202.b);\n let res = {\n mode: \"xyz65\",\n x: 0.6369580483012911 * r2 + 0.1446169035862083 * g + 0.1688809751641721 * b,\n y: 0.262700212011267 * r2 + 0.6779980715188708 * g + 0.059301716469862 * b,\n z: 0 * r2 + 0.0280726930490874 * g + 1.0609850577107909 * b\n };\n if (rec20202.alpha !== void 0) {\n res.alpha = rec20202.alpha;\n }\n return res;\n };\n var convertRec2020ToXyz65_default = convertRec2020ToXyz65;\n\n // node_modules/culori/src/rec2020/definition.js\n var definition24 = {\n ...definition_default,\n mode: \"rec2020\",\n fromMode: {\n xyz65: convertXyz65ToRec2020_default,\n rgb: (color) => convertXyz65ToRec2020_default(convertRgbToXyz65_default(color))\n },\n toMode: {\n xyz65: convertRec2020ToXyz65_default,\n rgb: (color) => convertXyz65ToRgb_default(convertRec2020ToXyz65_default(color))\n },\n parse: [\"rec2020\"],\n serialize: \"rec2020\"\n };\n var definition_default24 = definition24;\n\n // node_modules/culori/src/xyb/constants.js\n var bias = 0.0037930732552754493;\n var bias_cbrt = Math.cbrt(bias);\n\n // node_modules/culori/src/xyb/convertRgbToXyb.js\n var transfer = (v) => Math.cbrt(v) - bias_cbrt;\n var convertRgbToXyb = (color) => {\n const { r: r2, g, b, alpha: alpha2 } = convertRgbToLrgb_default(color);\n const l = transfer(0.3 * r2 + 0.622 * g + 0.078 * b + bias);\n const m = transfer(0.23 * r2 + 0.692 * g + 0.078 * b + bias);\n const s = transfer(\n 0.2434226892454782 * r2 + 0.2047674442449682 * g + 0.5518098665095535 * b + bias\n );\n const res = {\n mode: \"xyb\",\n x: (l - m) / 2,\n y: (l + m) / 2,\n /* Apply default chroma from luma (subtract Y from B) */\n b: s - (l + m) / 2\n };\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n };\n var convertRgbToXyb_default = convertRgbToXyb;\n\n // node_modules/culori/src/xyb/convertXybToRgb.js\n var transfer2 = (v) => Math.pow(v + bias_cbrt, 3);\n var convertXybToRgb = ({ x, y, b, alpha: alpha2 }) => {\n if (x === void 0) x = 0;\n if (y === void 0) y = 0;\n if (b === void 0) b = 0;\n const l = transfer2(x + y) - bias;\n const m = transfer2(y - x) - bias;\n const s = transfer2(b + y) - bias;\n const res = convertLrgbToRgb_default({\n r: 11.031566904639861 * l - 9.866943908131562 * m - 0.16462299650829934 * s,\n g: -3.2541473810744237 * l + 4.418770377582723 * m - 0.16462299650829934 * s,\n b: -3.6588512867136815 * l + 2.7129230459360922 * m + 1.9459282407775895 * s\n });\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n };\n var convertXybToRgb_default = convertXybToRgb;\n\n // node_modules/culori/src/xyb/definition.js\n var definition25 = {\n mode: \"xyb\",\n channels: [\"x\", \"y\", \"b\", \"alpha\"],\n parse: [\"--xyb\"],\n serialize: \"--xyb\",\n toMode: {\n rgb: convertXybToRgb_default\n },\n fromMode: {\n rgb: convertRgbToXyb_default\n },\n ranges: {\n x: [-0.0154, 0.0281],\n y: [0, 0.8453],\n b: [-0.2778, 0.388]\n },\n interpolate: {\n x: interpolatorLinear,\n y: interpolatorLinear,\n b: interpolatorLinear,\n alpha: { use: interpolatorLinear, fixup: fixupAlpha }\n }\n };\n var definition_default25 = definition25;\n\n // node_modules/culori/src/xyz50/definition.js\n var definition26 = {\n mode: \"xyz50\",\n parse: [\"xyz-d50\"],\n serialize: \"xyz-d50\",\n toMode: {\n rgb: convertXyz50ToRgb_default,\n lab: convertXyz50ToLab_default\n },\n fromMode: {\n rgb: convertRgbToXyz50_default,\n lab: convertLabToXyz50_default\n },\n channels: [\"x\", \"y\", \"z\", \"alpha\"],\n ranges: {\n x: [0, 0.964],\n y: [0, 0.999],\n z: [0, 0.825]\n },\n interpolate: {\n x: interpolatorLinear,\n y: interpolatorLinear,\n z: interpolatorLinear,\n alpha: { use: interpolatorLinear, fixup: fixupAlpha }\n }\n };\n var definition_default26 = definition26;\n\n // node_modules/culori/src/xyz65/convertXyz65ToXyz50.js\n var convertXyz65ToXyz50 = (xyz652) => {\n let { x, y, z, alpha: alpha2 } = xyz652;\n if (x === void 0) x = 0;\n if (y === void 0) y = 0;\n if (z === void 0) z = 0;\n let res = {\n mode: \"xyz50\",\n x: 1.0479298208405488 * x + 0.0229467933410191 * y - 0.0501922295431356 * z,\n y: 0.0296278156881593 * x + 0.990434484573249 * y - 0.0170738250293851 * z,\n z: -0.0092430581525912 * x + 0.0150551448965779 * y + 0.7518742899580008 * z\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertXyz65ToXyz50_default = convertXyz65ToXyz50;\n\n // node_modules/culori/src/xyz65/convertXyz50ToXyz65.js\n var convertXyz50ToXyz65 = (xyz502) => {\n let { x, y, z, alpha: alpha2 } = xyz502;\n if (x === void 0) x = 0;\n if (y === void 0) y = 0;\n if (z === void 0) z = 0;\n let res = {\n mode: \"xyz65\",\n x: 0.9554734527042182 * x - 0.0230985368742614 * y + 0.0632593086610217 * z,\n y: -0.0283697069632081 * x + 1.0099954580058226 * y + 0.021041398966943 * z,\n z: 0.0123140016883199 * x - 0.0205076964334779 * y + 1.3303659366080753 * z\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertXyz50ToXyz65_default = convertXyz50ToXyz65;\n\n // node_modules/culori/src/xyz65/definition.js\n var definition27 = {\n mode: \"xyz65\",\n toMode: {\n rgb: convertXyz65ToRgb_default,\n xyz50: convertXyz65ToXyz50_default\n },\n fromMode: {\n rgb: convertRgbToXyz65_default,\n xyz50: convertXyz50ToXyz65_default\n },\n ranges: {\n x: [0, 0.95],\n y: [0, 1],\n z: [0, 1.088]\n },\n channels: [\"x\", \"y\", \"z\", \"alpha\"],\n parse: [\"xyz\", \"xyz-d65\"],\n serialize: \"xyz-d65\",\n interpolate: {\n x: interpolatorLinear,\n y: interpolatorLinear,\n z: interpolatorLinear,\n alpha: { use: interpolatorLinear, fixup: fixupAlpha }\n }\n };\n var definition_default27 = definition27;\n\n // node_modules/culori/src/yiq/convertRgbToYiq.js\n var convertRgbToYiq = ({ r: r2, g, b, alpha: alpha2 }) => {\n if (r2 === void 0) r2 = 0;\n if (g === void 0) g = 0;\n if (b === void 0) b = 0;\n const res = {\n mode: \"yiq\",\n y: 0.29889531 * r2 + 0.58662247 * g + 0.11448223 * b,\n i: 0.59597799 * r2 - 0.2741761 * g - 0.32180189 * b,\n q: 0.21147017 * r2 - 0.52261711 * g + 0.31114694 * b\n };\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n };\n var convertRgbToYiq_default = convertRgbToYiq;\n\n // node_modules/culori/src/yiq/convertYiqToRgb.js\n var convertYiqToRgb = ({ y, i, q, alpha: alpha2 }) => {\n if (y === void 0) y = 0;\n if (i === void 0) i = 0;\n if (q === void 0) q = 0;\n const res = {\n mode: \"rgb\",\n r: y + 0.95608445 * i + 0.6208885 * q,\n g: y - 0.27137664 * i - 0.6486059 * q,\n b: y - 1.10561724 * i + 1.70250126 * q\n };\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n };\n var convertYiqToRgb_default = convertYiqToRgb;\n\n // node_modules/culori/src/yiq/definition.js\n var definition28 = {\n mode: \"yiq\",\n toMode: {\n rgb: convertYiqToRgb_default\n },\n fromMode: {\n rgb: convertRgbToYiq_default\n },\n channels: [\"y\", \"i\", \"q\", \"alpha\"],\n parse: [\"--yiq\"],\n serialize: \"--yiq\",\n ranges: {\n i: [-0.595, 0.595],\n q: [-0.522, 0.522]\n },\n interpolate: {\n y: interpolatorLinear,\n i: interpolatorLinear,\n q: interpolatorLinear,\n alpha: { use: interpolatorLinear, fixup: fixupAlpha }\n }\n };\n var definition_default28 = definition28;\n\n // node_modules/culori/src/round.js\n var r = (value, precision) => Math.round(value * (precision = Math.pow(10, precision))) / precision;\n var round = (precision = 4) => (value) => typeof value === \"number\" ? r(value, precision) : value;\n var round_default = round;\n\n // node_modules/culori/src/formatter.js\n var twoDecimals = round_default(2);\n var clamp = (value) => Math.max(0, Math.min(1, value || 0));\n var fixup = (value) => Math.round(clamp(value) * 255);\n var rgb = converter_default(\"rgb\");\n var hsl = converter_default(\"hsl\");\n var serializeHex = (color) => {\n if (color === void 0) {\n return void 0;\n }\n let r2 = fixup(color.r);\n let g = fixup(color.g);\n let b = fixup(color.b);\n return \"#\" + (1 << 24 | r2 << 16 | g << 8 | b).toString(16).slice(1);\n };\n var serializeRgb = (color) => {\n if (color === void 0) {\n return void 0;\n }\n let r2 = fixup(color.r);\n let g = fixup(color.g);\n let b = fixup(color.b);\n if (color.alpha === void 0 || color.alpha === 1) {\n return `rgb(${r2}, ${g}, ${b})`;\n } else {\n return `rgba(${r2}, ${g}, ${b}, ${twoDecimals(clamp(color.alpha))})`;\n }\n };\n var formatHex = (c2) => serializeHex(rgb(c2));\n var formatRgb = (c2) => serializeRgb(rgb(c2));\n\n // node_modules/culori/src/clamp.js\n var rgb2 = converter_default(\"rgb\");\n var fixup_rgb = (c2) => {\n const res = {\n mode: c2.mode,\n r: Math.max(0, Math.min(c2.r !== void 0 ? c2.r : 0, 1)),\n g: Math.max(0, Math.min(c2.g !== void 0 ? c2.g : 0, 1)),\n b: Math.max(0, Math.min(c2.b !== void 0 ? c2.b : 0, 1))\n };\n if (c2.alpha !== void 0) {\n res.alpha = c2.alpha;\n }\n return res;\n };\n var to_displayable_srgb = (c2) => fixup_rgb(rgb2(c2));\n var inrange_rgb = (c2) => {\n return c2 !== void 0 && (c2.r === void 0 || c2.r >= 0 && c2.r <= 1) && (c2.g === void 0 || c2.g >= 0 && c2.g <= 1) && (c2.b === void 0 || c2.b >= 0 && c2.b <= 1);\n };\n function displayable(color) {\n return inrange_rgb(rgb2(color));\n }\n function inGamut(mode = \"rgb\") {\n const { gamut } = getMode(mode);\n if (!gamut) {\n return (color) => true;\n }\n const conv = converter_default(typeof gamut === \"string\" ? gamut : mode);\n return (color) => inrange_rgb(conv(color));\n }\n function clampGamut(mode = \"rgb\") {\n const { gamut } = getMode(mode);\n if (!gamut) {\n return (color) => prepare_default(color);\n }\n const destMode = typeof gamut === \"string\" ? gamut : mode;\n const destConv = converter_default(destMode);\n const inDestGamut = inGamut(destMode);\n return (color) => {\n const original = prepare_default(color);\n if (!original) {\n return void 0;\n }\n const converted = destConv(original);\n if (inDestGamut(converted)) {\n return original;\n }\n const clamped = fixup_rgb(converted);\n if (original.mode === clamped.mode) {\n return clamped;\n }\n return converter_default(original.mode)(clamped);\n };\n }\n function clampChroma(color, mode = \"lch\", rgbGamut = \"rgb\") {\n color = prepare_default(color);\n let inDestinationGamut = rgbGamut === \"rgb\" ? displayable : inGamut(rgbGamut);\n let clipToGamut = rgbGamut === \"rgb\" ? to_displayable_srgb : clampGamut(rgbGamut);\n if (color === void 0 || inDestinationGamut(color)) return color;\n let conv = converter_default(color.mode);\n color = converter_default(mode)(color);\n let clamped = { ...color, c: 0 };\n if (!inDestinationGamut(clamped)) {\n return conv(clipToGamut(clamped));\n }\n let start = 0;\n let end = color.c !== void 0 ? color.c : 0;\n let range = getMode(mode).ranges.c;\n let resolution = (range[1] - range[0]) / Math.pow(2, 13);\n let _last_good_c = clamped.c;\n while (end - start > resolution) {\n clamped.c = start + (end - start) * 0.5;\n if (inDestinationGamut(clamped)) {\n _last_good_c = clamped.c;\n start = clamped.c;\n } else {\n end = clamped.c;\n }\n }\n return conv(\n inDestinationGamut(clamped) ? clamped : { ...clamped, c: _last_good_c }\n );\n }\n\n // node_modules/culori/src/wcag.js\n function luminance(color) {\n let c2 = converter_default(\"lrgb\")(color);\n return 0.2126 * c2.r + 0.7152 * c2.g + 0.0722 * c2.b;\n }\n function contrast(a, b) {\n let L1 = luminance(a);\n let L2 = luminance(b);\n return (Math.max(L1, L2) + 0.05) / (Math.min(L1, L2) + 0.05);\n }\n\n // node_modules/culori/src/index.js\n var a98 = useMode(definition_default2);\n var cubehelix = useMode(definition_default3);\n var dlab = useMode(definition_default4);\n var dlch = useMode(definition_default5);\n var hsi = useMode(definition_default6);\n var hsl2 = useMode(definition_default7);\n var hsv = useMode(definition_default8);\n var hwb = useMode(definition_default9);\n var itp = useMode(definition_default10);\n var jab = useMode(definition_default11);\n var jch = useMode(definition_default12);\n var lab = useMode(definition_default13);\n var lab65 = useMode(definition_default14);\n var lch = useMode(definition_default15);\n var lch65 = useMode(definition_default16);\n var lchuv = useMode(definition_default17);\n var lrgb = useMode(definition_default18);\n var luv = useMode(definition_default19);\n var okhsl = useMode(modeOkhsl_default);\n var okhsv = useMode(modeOkhsv_default);\n var oklab = useMode(definition_default20);\n var oklch = useMode(definition_default21);\n var p3 = useMode(definition_default22);\n var prophoto = useMode(definition_default23);\n var rec2020 = useMode(definition_default24);\n var rgb3 = useMode(definition_default);\n var xyb = useMode(definition_default25);\n var xyz50 = useMode(definition_default26);\n var xyz65 = useMode(definition_default27);\n var yiq = useMode(definition_default28);\n\n // packages/xtyle/dist/color.js\n var toOklch = converter_default(\"oklch\");\n var DEFAULT_OKLCH = { l: 0, c: 0, h: 0, alpha: 1 };\n function toOklchColor(input) {\n if (typeof input !== \"string\")\n return input;\n const parsed = parse_default(input);\n if (!parsed)\n throw new Error(`xtyle: unparseable color \"${input}\"`);\n const o = toOklch(parsed);\n if (!o)\n throw new Error(`xtyle: cannot convert color \"${input}\" to oklch`);\n return {\n l: clamp01(o.l ?? 0),\n c: Math.max(0, o.c ?? 0),\n h: o.h ?? 0,\n alpha: o.alpha ?? 1\n };\n }\n function oklch2(l, c2, h, alpha2 = 1) {\n return { l: clamp01(l), c: Math.max(0, c2), h: (h % 360 + 360) % 360, alpha: alpha2 };\n }\n function withLightness(color, l) {\n return { ...color, l: clamp01(l) };\n }\n function withAlpha(color, alpha2) {\n return { ...color, alpha: clamp01(alpha2) };\n }\n function hueDelta(from, to) {\n let d = ((to - from) % 360 + 360) % 360;\n if (d > 180)\n d -= 360;\n return d;\n }\n function lightness(input) {\n return toOklchColor(input).l;\n }\n function contrast2(a, b) {\n const value = contrast(formatCss2(a), formatCss2(b));\n return value ?? 1;\n }\n function clampToGamut(color) {\n const mapped = clampChroma({ mode: \"oklch\", l: color.l, c: color.c, h: color.h, alpha: color.alpha }, \"oklch\", \"rgb\");\n return {\n l: mapped.l ?? color.l,\n c: Math.max(0, mapped.c ?? 0),\n h: mapped.h ?? color.h,\n alpha: mapped.alpha ?? color.alpha\n };\n }\n function formatCss2(input) {\n const source = typeof input === \"string\" ? toOklchColor(input) : input;\n const color = clampToGamut(source);\n const culoriColor = {\n mode: \"oklch\",\n l: color.l,\n c: color.c,\n h: color.h,\n alpha: color.alpha\n };\n if (color.alpha < 1) {\n return formatRgb(culoriColor) ?? formatHex(culoriColor) ?? \"#000000\";\n }\n return formatHex(culoriColor) ?? \"#000000\";\n }\n function schemeOf(bg) {\n return lightness(bg) < 0.5 ? \"dark\" : \"light\";\n }\n function pickReadable(fill, options, floor = 4.5) {\n let best = options[0] ?? DEFAULT_OKLCH;\n let bestContrast = -1;\n for (const option of options) {\n const ratio = contrast2(fill, option);\n if (ratio >= floor)\n return formatCss2(option);\n if (ratio > bestContrast) {\n bestContrast = ratio;\n best = option;\n }\n }\n return formatCss2(best);\n }\n function clamp01(value) {\n if (Number.isNaN(value))\n return 0;\n return Math.min(1, Math.max(0, value));\n }\n\n // packages/xtyle/dist/graph.js\n var CycleError = class extends Error {\n constructor(cycle) {\n super(`xtyle: cycle detected in token graph: ${cycle.join(\" -> \")}`);\n __publicField(this, \"cycle\");\n this.cycle = cycle;\n this.name = \"CycleError\";\n }\n };\n function resolveGraph(nodes) {\n const byName = /* @__PURE__ */ new Map();\n for (const node of nodes)\n byName.set(node.name, node);\n const computed = /* @__PURE__ */ new Map();\n const visiting = /* @__PURE__ */ new Set();\n const done = /* @__PURE__ */ new Set();\n const stack = [];\n const visit = (name) => {\n if (done.has(name))\n return;\n const node = byName.get(name);\n if (!node)\n return;\n if (visiting.has(name)) {\n const start = stack.indexOf(name);\n throw new CycleError([...stack.slice(start), name]);\n }\n visiting.add(name);\n stack.push(name);\n for (const ref of node.refs ?? [])\n visit(ref);\n if (node.resolve) {\n const inputs = {};\n for (const [key, value] of computed)\n inputs[key] = value;\n computed.set(name, node.resolve(inputs));\n } else if (node.value !== void 0) {\n computed.set(name, node.value);\n }\n stack.pop();\n visiting.delete(name);\n done.add(name);\n };\n for (const node of nodes)\n visit(node.name);\n const resolved = {};\n for (const node of nodes) {\n const value = computed.get(node.name);\n if (value !== void 0)\n resolved[node.name] = value;\n }\n return resolved;\n }\n\n // packages/xtyle/dist/vocab.js\n var TONES = [\"accent\", \"neutral\", \"danger\", \"success\", \"warn\", \"info\"];\n var ACCENT_VARIANTS = [\"accent-2\", \"accent-3\", \"accent-4\"];\n var HUES = [\n \"red\",\n \"orange\",\n \"yellow\",\n \"green\",\n \"blue\",\n \"purple\",\n \"brown\",\n \"pink\",\n \"cyan\",\n \"gray\",\n \"white\",\n \"black\"\n ];\n var FULL_TONES = [...TONES, ...ACCENT_VARIANTS, ...HUES];\n\n // packages/xtyle/dist/algorithms/factory.js\n var AA = 4.5;\n var AAA = 7;\n var ENFORCE = AA + 0.2;\n var SURFACE_SEPARATION = 1.5;\n var BORDER_SEPARATION = 1.5;\n var DIVIDER_SEPARATION = 1.8;\n var DEFAULT_SHIFT_STEP = 90;\n var DEFAULT_ACCENT_SPLIT = 45;\n var DERIVED_SURFACE_TINT_C = 0.02;\n var ACCENT_FAN = \"split-complement\";\n var ACHROMATIC_CHROMA = 0.02;\n var DERIVED_ACCENT_HUE_ROTATION = 150;\n var DERIVED_ACCENT_FALLBACK_HUE = 250;\n var DERIVED_ACCENT_L = 0.62;\n var DERIVED_ACCENT_C = 0.16;\n var ACCENT_RAMP_L_MIN = 0.1;\n var ACCENT_RAMP_L_MAX = 0.95;\n var HUE_STABLE_CHROMA = 0.1;\n var FAN_MIN_CHROMA = 0.045;\n var HUE_TOLERANCE = 8;\n var LIGHTNESS_TOLERANCE = 0.05;\n var DEFAULT_TYPE_SCALE = 1.2;\n var DEFAULT_RADIUS_SCALE = 1;\n var BASE_TEXT_REM = 1;\n var DEFAULT_FONTS = {\n sans: 'system-ui, -apple-system, \"Segoe UI\", Roboto, sans-serif',\n mono: 'ui-monospace, \"SF Mono\", \"Cascadia Code\", Consolas, monospace',\n display: '\"Avenir Next\", \"Futura\", \"Century Gothic\", \"Trebuchet MS\", system-ui, -apple-system, \"Segoe UI\", sans-serif'\n };\n var TEXT_LIGHT = { l: 0.98, c: 0, h: 0, alpha: 1 };\n var TEXT_DARK = { l: 0.15, c: 0, h: 0, alpha: 1 };\n var TRUE_WHITE = { l: 1, c: 0, h: 0, alpha: 1 };\n var TRUE_BLACK = { l: 0, c: 0, h: 0, alpha: 1 };\n var TEXT_POLES = [TRUE_WHITE, TRUE_BLACK];\n function bestTruePole(bg) {\n return contrast2(TRUE_BLACK, bg) >= contrast2(TRUE_WHITE, bg) ? TRUE_BLACK : TRUE_WHITE;\n }\n var STATUS_TO_HUE = {\n success: \"green\",\n warn: \"yellow\",\n danger: \"red\",\n info: \"blue\"\n };\n var NEUTRAL_ACCENT_CHROMA = 0.13;\n var PALETTE_HUES = {\n red: { h: 25, c: 0.2 },\n orange: { h: 55, c: 0.18 },\n yellow: { h: 95, c: 0.17 },\n green: { h: 145, c: 0.18 },\n blue: { h: 250, c: 0.18 },\n purple: { h: 300, c: 0.18 },\n brown: { h: 50, c: 0.08 },\n pink: { h: 350, c: 0.16 },\n cyan: { h: 200, c: 0.14 },\n gray: \"gray\",\n white: \"white\",\n black: \"black\"\n };\n var PALETTE_STOPS = [\"subtle\", \"muted\", \"base\", \"strong\", \"contrast\"];\n var CODE_VIVID_ROLES = [\n \"keyword\",\n \"number\",\n \"function\",\n \"type\",\n \"string\",\n \"tag\",\n \"attr\",\n \"regexp\"\n ];\n var CODE_HUE_RANK = [0, 4, 2, 6, 1, 5, 3, 7];\n var CODE_STRUCTURAL_ROLES = [\"comment\", \"operator\", \"punctuation\", \"variable\"];\n var CODE_SCOPES = [...CODE_VIVID_ROLES, ...CODE_STRUCTURAL_ROLES];\n var CODE_SURFACES = [\"--code-bg\", \"--code-fg\", \"--code-line-highlight\", \"--code-selection\"];\n var SURFACES = [\"--body-bg\", \"--bg-0\", \"--bg-1\", \"--bg-2\", \"--bg-3\"];\n var PANEL_REF_INDEX = SURFACES.indexOf(\"--bg-2\");\n var PANEL_SURFACES = [\"--bg-1\", \"--bg-2\"];\n var TEXT_STEPS = [\"xs\", \"sm\", \"body\", \"lg\", \"xl\", \"2xl\", \"3xl\", \"4xl\", \"5xl\"];\n var LEADING_STEPS = [\"tight\", \"normal\", \"loose\"];\n var WEIGHT_STEPS = [\"normal\", \"medium\", \"semibold\", \"bold\"];\n var RADIUS_STEPS = [\"none\", \"sm\", \"md\", \"lg\", \"full\"];\n var BORDER_STEPS = [\"thin\", \"normal\", \"thick\"];\n var DURATION_STEPS = [\"fast\", \"base\", \"slow\"];\n var EASE_STEPS = [\"standard\", \"emphasized\"];\n var SPACE_STEPS = [0, 1, 2, 3, 4, 5, 6, 7, 8];\n var ELEVATION_STEPS = [0, 1, 2, 3, 4, 5];\n var WEIGHT_VALUES = {\n normal: 400,\n medium: 500,\n semibold: 600,\n bold: 700\n };\n var LEADING_VALUES = {\n tight: 1.2,\n normal: 1.5,\n loose: 1.8\n };\n var DENSITY_MULTIPLIER = {\n compact: 0.8,\n normal: 1,\n comfortable: 1.25\n };\n var SPACE_BASE_REM = 0.25;\n function buildProduces() {\n const produces = [];\n const categories = {};\n const add = (name, category) => {\n produces.push(name);\n categories[name] = category;\n };\n add(\"--bg-sunken\", \"color\");\n for (const s of SURFACES)\n add(s, \"color\");\n add(\"--scrim\", \"color\");\n add(\"--surface-overlay\", \"color\");\n add(\"--surface-overlay-border\", \"color\");\n for (let i = 0; i <= 3; i++)\n add(`--fg-${i}`, \"color\");\n add(\"--fg-disabled\", \"color\");\n add(\"--placeholder\", \"color\");\n add(\"--line\", \"color\");\n add(\"--line-2\", \"color\");\n add(\"--ring\", \"color\");\n add(\"--ring-bg\", \"color\");\n add(\"--accent\", \"color\");\n add(\"--accent-hover\", \"color\");\n add(\"--accent-active\", \"color\");\n add(\"--accent-bg\", \"color\");\n add(\"--accent-fg\", \"color\");\n add(\"--accent-text\", \"color\");\n add(\"--accent-vivid\", \"color\");\n for (const n of [\"2\", \"3\", \"4\"]) {\n add(`--accent-${n}`, \"color\");\n add(`--accent-${n}-bg`, \"color\");\n add(`--accent-${n}-fg`, \"color\");\n add(`--accent-${n}-text`, \"color\");\n add(`--accent-${n}-vivid`, \"color\");\n }\n add(\"--accent-shift-step\", \"number\");\n add(\"--neutral\", \"color\");\n add(\"--neutral-bg\", \"color\");\n add(\"--neutral-fg\", \"color\");\n add(\"--neutral-text\", \"color\");\n add(\"--neutral-vivid\", \"color\");\n add(\"--field-bg\", \"color\");\n add(\"--field-border\", \"color\");\n for (const role of Object.keys(STATUS_TO_HUE)) {\n add(`--${role}`, \"color\");\n add(`--${role}-bg`, \"color\");\n add(`--${role}-fg`, \"color\");\n add(`--${role}-text`, \"color\");\n add(`--${role}-vivid`, \"color\");\n }\n for (const s of [\"hover\", \"press\", \"selected\", \"disabled\", \"drag\"]) {\n add(`--state-${s}`, \"color\");\n }\n add(\"--link\", \"color\");\n add(\"--link-hover\", \"color\");\n add(\"--selection\", \"color\");\n add(\"--highlight\", \"color\");\n add(\"--selection-cue\", \"keyword\");\n add(\"--shadow\", \"shadow\");\n for (const hue3 of Object.keys(PALETTE_HUES)) {\n add(`--color-${hue3}`, \"color\");\n for (const stop of PALETTE_STOPS)\n add(`--color-${hue3}-${stop}`, \"color\");\n add(`--${hue3}`, \"color\");\n add(`--${hue3}-bg`, \"color\");\n add(`--${hue3}-fg`, \"color\");\n add(`--${hue3}-text`, \"color\");\n add(`--${hue3}-vivid`, \"color\");\n }\n for (const t of CODE_SURFACES)\n add(t, \"color\");\n for (const role of CODE_SCOPES)\n add(`--code-${role}`, \"color\");\n add(\"--font-sans\", \"font\");\n add(\"--font-mono\", \"font\");\n add(\"--font-display\", \"font\");\n for (const step of TEXT_STEPS)\n add(`--text-${step}`, \"length\");\n for (const step of LEADING_STEPS)\n add(`--leading-${step}`, \"number\");\n for (const step of WEIGHT_STEPS)\n add(`--weight-${step}`, \"number\");\n for (const step of RADIUS_STEPS)\n add(`--radius-${step}`, \"length\");\n for (const step of BORDER_STEPS)\n add(`--border-${step}`, \"length\");\n for (const step of DURATION_STEPS)\n add(`--duration-${step}`, \"duration\");\n for (const step of EASE_STEPS)\n add(`--ease-${step}`, \"easing\");\n for (const step of ELEVATION_STEPS)\n add(`--elevation-${step}`, \"shadow\");\n for (const step of SPACE_STEPS)\n add(`--space-${step}`, \"length\");\n return { produces, categories };\n }\n var { produces: PRODUCES, categories: CATEGORIES } = buildProduces();\n var KEYWORD_DOMAINS = {\n \"--selection-cue\": [\"tint\", \"marker\"]\n };\n function stepLightness(base, scheme, step, index) {\n const direction = scheme === \"dark\" ? 1 : -1;\n return base + direction * step * index;\n }\n function contrastBandFloor(knobs) {\n const band = knobs.contrastBand;\n if (typeof band === \"number\")\n return band;\n if (band === \"aaa\")\n return AAA;\n if (band === \"aa\")\n return AA;\n return void 0;\n }\n function vibrancyOf(knobs, preset) {\n const v = typeof knobs.vibrancy === \"number\" ? knobs.vibrancy : preset.defaultVibrancy;\n return Math.min(1, Math.max(0, v));\n }\n function typeScaleOf(knobs) {\n const v = typeof knobs.typeScale === \"number\" ? knobs.typeScale : DEFAULT_TYPE_SCALE;\n return Math.min(2, Math.max(1.05, v));\n }\n function radiusScaleOf(knobs) {\n const v = typeof knobs.radiusScale === \"number\" ? knobs.radiusScale : DEFAULT_RADIUS_SCALE;\n return Math.max(0, v);\n }\n function densityOf(knobs) {\n const d = knobs.density;\n if (typeof d === \"number\")\n return Math.max(0.4, d);\n if (d === \"compact\" || d === \"comfortable\")\n return DENSITY_MULTIPLIER[d];\n return DENSITY_MULTIPLIER.normal;\n }\n function fontsOf(knobs) {\n return {\n sans: knobs.fonts?.sans ?? DEFAULT_FONTS.sans,\n mono: knobs.fonts?.mono ?? DEFAULT_FONTS.mono,\n display: knobs.fonts?.display ?? DEFAULT_FONTS.display\n };\n }\n function emittedContrast(fg, bgCss) {\n return contrast2(formatCss2(fg), bgCss);\n }\n function enforceContrastFloor(fg, bg, scheme, floor = ENFORCE) {\n const bgCss = formatCss2(bg);\n if (emittedContrast(fg, bgCss) >= floor)\n return fg;\n const preferred = scheme === \"dark\" ? TRUE_WHITE.l : TRUE_BLACK.l;\n const other = scheme === \"dark\" ? TRUE_BLACK.l : TRUE_WHITE.l;\n const swept = sweepToward(fg, bgCss, preferred, floor) ?? sweepToward(fg, bgCss, other, floor);\n const pole = bestTruePole(bgCss);\n if (!swept)\n return pole;\n return emittedContrast(pole, bgCss) > emittedContrast(swept, bgCss) ? pole : swept;\n }\n function sweepToward(fg, bgCss, targetL, floor) {\n for (let i = 0; i <= 100; i++) {\n const t = i / 100;\n const candidate = {\n l: fg.l + (targetL - fg.l) * t,\n c: fg.c * (1 - t),\n h: fg.h,\n alpha: fg.alpha\n };\n if (emittedContrast(candidate, bgCss) >= floor)\n return candidate;\n }\n return null;\n }\n function bestPoleContrast(bg) {\n return Math.max(contrast2(TEXT_LIGHT, bg), contrast2(TEXT_DARK, bg));\n }\n function ensureTextHeadroom(bg, scheme, floor = ENFORCE) {\n if (bestPoleContrast(bg) >= floor)\n return bg;\n const target = scheme === \"dark\" ? 0 : 1;\n let candidate = bg;\n for (let i = 1; i <= 100; i++) {\n const t = i / 100;\n candidate = withLightness(bg, bg.l + (target - bg.l) * t);\n if (bestPoleContrast(candidate) >= floor)\n return candidate;\n }\n return withLightness(bg, target);\n }\n function fillWithTextHeadroom(l, c2, h, floor = ENFORCE) {\n const seed = oklch2(l, c2, h);\n if (bestPoleContrast(seed) >= floor)\n return seed;\n let fallback = seed;\n for (let i = 1; i <= 100; i++) {\n const down = oklch2(l - l * i / 100, c2, h);\n if (bestPoleContrast(down) >= floor)\n return down;\n const up = oklch2(l + (1 - l) * i / 100, c2, h);\n if (bestPoleContrast(up) >= floor)\n return up;\n fallback = bestPoleContrast(down) >= bestPoleContrast(up) ? down : up;\n }\n return fallback;\n }\n function lightnessForContrast(pole, bg, bgCss, target) {\n let bestL = pole.l;\n for (let i = 0; i <= 200; i++) {\n const t = i / 200;\n const candidateL = pole.l + (bg.l - pole.l) * t;\n if (emittedContrast(withLightness(pole, candidateL), bgCss) >= target)\n bestL = candidateL;\n else\n break;\n }\n return bestL;\n }\n function liftStopForContrast(fg, bgCss, target, towardLight) {\n if (contrast2(formatCss2(fg), bgCss) >= target)\n return fg;\n const poleL = towardLight ? 1 : 0;\n let best = fg;\n for (let i = 1; i <= 100; i++) {\n const candidate = clampToGamut(oklch2(fg.l + (poleL - fg.l) * (i / 100), fg.c, fg.h));\n best = candidate;\n if (contrast2(formatCss2(candidate), bgCss) >= target)\n return candidate;\n }\n return best;\n }\n function separateFillFromSurface(fill, surface, separation, textFloor) {\n const surfaceCss = formatCss2(surface);\n if (contrast2(formatCss2(fill), surfaceCss) >= separation)\n return fill;\n const headroom = Math.min(textFloor, bestPoleContrast(fill));\n const poleL = surface.l < 0.5 ? 1 : 0;\n let best = fill;\n for (let i = 1; i <= 100; i++) {\n const candidate = clampToGamut(oklch2(fill.l + (poleL - fill.l) * (i / 100), fill.c, fill.h));\n best = candidate;\n if (contrast2(formatCss2(candidate), surfaceCss) >= separation && bestPoleContrast(candidate) >= headroom - 0.01) {\n return candidate;\n }\n }\n return best;\n }\n function borderForContrast(seed, surface, minContrast) {\n const surfaceCss = formatCss2(surface);\n if (emittedContrast(seed, surfaceCss) >= minContrast)\n return seed;\n const targetL = surface.l < 0.5 ? 1 : 0;\n let candidate = seed;\n for (let i = 1; i <= 100; i++) {\n candidate = withLightness(seed, seed.l + (targetL - seed.l) * (i / 100));\n if (emittedContrast(candidate, surfaceCss) >= minContrast)\n break;\n }\n return candidate;\n }\n function readableOnTint(tint, hue3, floor, inkChroma) {\n const tintCss = formatCss2(tint);\n const towardDark = contrast2(\"#000000\", tintCss) >= contrast2(\"#ffffff\", tintCss);\n const targetL = towardDark ? 0 : 1;\n const seedChroma = inkChroma ?? (towardDark ? 0.06 : 0.04);\n const seed = oklch2(tint.l + (towardDark ? -0.4 : 0.4), seedChroma, hue3);\n for (let i = 0; i <= 100; i++) {\n const t = i / 100;\n const css = formatCss2({\n l: seed.l + (targetL - seed.l) * t,\n c: seed.c * (1 - t),\n h: hue3,\n alpha: 1\n });\n if (contrast2(css, tintCss) >= floor)\n return css;\n }\n return towardDark ? \"#000000\" : \"#ffffff\";\n }\n function readableHuedOnTintAndPanel(tint, hue3, tintFloor, panels, panelFloor, seedChroma) {\n const tintCss = formatCss2(tint);\n const panelCss = panels.map((p4) => formatCss2(p4));\n const sweep = (towardDark) => {\n const targetL = towardDark ? 0 : 1;\n const seed = towardDark ? oklch2(tint.l - 0.4, seedChroma, hue3) : oklch2(tint.l + 0.4, seedChroma * 0.667, hue3);\n const out = [];\n for (let i = 0; i <= 100; i++) {\n const t = i / 100;\n out.push(formatCss2({\n l: seed.l + (targetL - seed.l) * t,\n c: seed.c * (1 - t),\n h: hue3,\n alpha: 1\n }));\n }\n return out;\n };\n const minPanel = (css) => panelCss.length === 0 ? Infinity : Math.min(...panelCss.map((p4) => contrast2(css, p4)));\n let best = null;\n let bestMin = -1;\n for (const towardDark of [true, false]) {\n for (const css of sweep(towardDark)) {\n if (contrast2(css, tintCss) < tintFloor)\n continue;\n const m = minPanel(css);\n if (m >= panelFloor)\n return css;\n if (m > bestMin) {\n bestMin = m;\n best = css;\n }\n }\n }\n return best ?? readableOnTint(tint, hue3, tintFloor);\n }\n function vividOnPanel(hue3, panels, floor, targetChroma) {\n const panelCss = panels.map((p4) => formatCss2(p4));\n const minPanel = (css) => panelCss.length === 0 ? Infinity : Math.min(...panelCss.map((p4) => contrast2(css, p4)));\n const avgL = panels.reduce((sum, p4) => sum + p4.l, 0) / Math.max(1, panels.length);\n const towardLight = avgL < 0.5;\n let best = null;\n let bestChroma = -1;\n for (let i = 0; i <= 80; i++) {\n const t = i / 80;\n const l = towardLight ? 0.5 + t * 0.45 : 0.5 - t * 0.42;\n const chroma = clampToGamut(oklch2(l, targetChroma, hue3)).c;\n const css = formatCss2(oklch2(l, chroma, hue3));\n if (minPanel(css) >= floor && chroma > bestChroma) {\n bestChroma = chroma;\n best = css;\n }\n }\n return best ?? (towardLight ? \"#ffffff\" : \"#000000\");\n }\n function deriveAccentAnchor(bg, fg) {\n const sourceHue = bg.c >= ACHROMATIC_CHROMA ? bg.h : fg.c >= ACHROMATIC_CHROMA ? fg.h : void 0;\n const hue3 = sourceHue === void 0 ? DERIVED_ACCENT_FALLBACK_HUE : ((sourceHue + DERIVED_ACCENT_HUE_ROTATION) % 360 + 360) % 360;\n return clampToGamut(oklch2(DERIVED_ACCENT_L, DERIVED_ACCENT_C, hue3));\n }\n function shadowString(scheme, level, vibrancy, preset) {\n if (level <= 0)\n return \"none\";\n const baseAlpha = (scheme === \"dark\" ? 0.5 : 0.16) + vibrancy * 0.1 + preset.elevationAlphaBoost;\n const y = Math.max(1, Math.round(level * 2 * preset.elevationStrengthMul));\n const blur = Math.max(1, Math.round(level * 4 * preset.elevationStrengthMul));\n const spread = Math.max(0, level - 3);\n const alpha2 = Math.min(0.92, baseAlpha + level * 0.04);\n const ambientY = Math.max(1, Math.round(level / 2));\n const ambientBlur = Math.max(1, Math.round(level * 2 * preset.elevationStrengthMul));\n const ambientAlpha = Math.min(0.7, alpha2 * 0.6);\n return [\n `0 ${y}px ${blur}px ${spread}px rgba(0, 0, 0, ${alpha2.toFixed(2)})`,\n `0 ${ambientY}px ${ambientBlur}px 0 rgba(0, 0, 0, ${ambientAlpha.toFixed(2)})`\n ].join(\", \");\n }\n function paletteRamp(register, hue3, spec2, scheme, vibrancy, floor, preset, accent, panels, pinnedBase) {\n const set = (suffix, color) => {\n register[suffix ? `--color-${hue3}-${suffix}` : `--color-${hue3}`] = formatCss2(color);\n };\n const family = (solid, bg, fg, text, vivid) => {\n register[`--${hue3}`] = solid;\n register[`--${hue3}-bg`] = bg;\n register[`--${hue3}-fg`] = fg;\n register[`--${hue3}-text`] = text;\n register[`--${hue3}-vivid`] = vivid;\n };\n const grayscale = (lights, chroma2) => {\n const stops2 = lights.map((l) => oklch2(l, chroma2, 0));\n const baseStop = stops2[2];\n const subtleStop2 = stops2[0];\n const strongStop2 = liftStopForContrast(stops2[3], formatCss2(subtleStop2), AA + 0.2, stops2[3].l >= subtleStop2.l);\n const contrast4 = readableOnTint(baseStop, 0, AA + 0.3, 0);\n set(\"\", baseStop);\n set(\"subtle\", subtleStop2);\n set(\"muted\", stops2[1]);\n set(\"base\", baseStop);\n set(\"strong\", strongStop2);\n register[`--color-${hue3}-contrast`] = contrast4;\n family(formatCss2(baseStop), formatCss2(subtleStop2), contrast4, readableOnTint(subtleStop2, 0, AA + 0.2, 0), vividOnPanel(0, panels, floor, 0));\n };\n if (spec2 === \"white\") {\n grayscale([0.82, 0.9, 0.97, 1], 0);\n return;\n }\n if (spec2 === \"black\") {\n grayscale([0.05, 0.12, 0.2, 0.32], 0);\n return;\n }\n if (spec2 === \"gray\") {\n grayscale([0.4, 0.55, 0.68, 0.82], 5e-3);\n return;\n }\n const accentChromaFactor = Math.max(0.5, Math.min(1.6, accent.c / NEUTRAL_ACCENT_CHROMA));\n const chroma = spec2.c * accentChromaFactor * (0.6 + vibrancy * 0.7) * preset.paletteChromaMul;\n const baseL = scheme === \"dark\" ? 0.7 : 0.55;\n const lBias = Math.max(-0.06, Math.min(0.06, (accent.l - baseL) * 0.25));\n const ladderL = (scheme === \"dark\" ? [0.45, 0.58, baseL, 0.82] : [0.78, 0.66, baseL, 0.42]).map((l) => Math.max(0.05, Math.min(0.97, l + lBias)));\n const ladderC = [chroma * 0.7, chroma * 0.9, chroma, chroma * 0.85];\n const stops = ladderL.map((l, i) => clampToGamut(oklch2(l, ladderC[i], spec2.h)));\n const base = stops[2];\n const solidBase = pinnedBase ?? base;\n const subtleStop = stops[0];\n const strongStop = liftStopForContrast(stops[3], formatCss2(subtleStop), AA + 0.2, stops[3].l >= subtleStop.l);\n const contrast3 = readableOnTint(solidBase, spec2.h, Math.max(floor, AA + 0.3));\n set(\"\", base);\n set(\"subtle\", subtleStop);\n set(\"muted\", stops[1]);\n set(\"base\", base);\n set(\"strong\", strongStop);\n register[`--color-${hue3}-contrast`] = contrast3;\n const bg0p = panels[0];\n const washL = scheme === \"dark\" ? Math.max(0.2, bg0p.l + 0.08) : Math.min(0.92, bg0p.l - 0.04);\n const bgTint = ensureTextHeadroom(oklch2(washL, chroma * 0.35, spec2.h), scheme, AA + 0.3);\n const bgText = readableHuedOnTintAndPanel(bgTint, spec2.h, AA + 0.3, panels.slice(1), AA + 0.05, chroma);\n family(formatCss2(solidBase), formatCss2(bgTint), contrast3, bgText, vividOnPanel(spec2.h, panels, floor, chroma));\n }\n function schemeFromFg(fg) {\n return fg.l >= 0.5 ? \"dark\" : \"light\";\n }\n function deriveSurface(scheme, hue3, chroma, depth, floor) {\n const l = scheme === \"dark\" ? depth : 1 - depth;\n return ensureTextHeadroom(oklch2(l, chroma, hue3), scheme, floor);\n }\n function completeAnchors(preset, opts) {\n const pin = opts.constraints ?? {};\n const givenBg = parsePin(pin[\"--bg-0\"]);\n const givenFg = parsePin(pin[\"--fg-0\"]);\n const givenAccent = parsePin(pin[\"--accent\"]);\n const defBg = toOklchColor(preset.defaultAnchors.bg);\n const defFg = toOklchColor(preset.defaultAnchors.fg);\n const defScheme = schemeOf(defBg);\n const surfaceDepth = defScheme === \"dark\" ? defBg.l : 1 - defBg.l;\n const floor = Math.max(ENFORCE, preset.contrastFloor);\n const inferredScheme = givenBg ? schemeOf(givenBg) : givenFg ? schemeFromFg(givenFg) : defScheme;\n const scheme = opts.knobs?.scheme ?? inferredScheme;\n let bg;\n if (givenBg) {\n bg = scheme === schemeOf(givenBg) ? givenBg : withLightness(givenBg, 1 - givenBg.l);\n } else if (givenAccent || givenFg) {\n const hue3 = givenAccent?.h ?? givenFg.h;\n const tint = givenAccent ? DERIVED_SURFACE_TINT_C : 5e-3;\n bg = deriveSurface(scheme, hue3, tint, surfaceDepth, floor);\n } else {\n bg = scheme === defScheme ? defBg : withLightness(defBg, 1 - defBg.l);\n }\n const fg = givenFg ?? defFg;\n const accentExplicit = givenAccent !== null || preset.defaultAnchors.accent !== void 0;\n const accent = givenAccent ?? (preset.defaultAnchors.accent ? toOklchColor(preset.defaultAnchors.accent) : deriveAccentAnchor(bg, fg));\n return { bg, fg, accent, scheme, accentExplicit };\n }\n function parsePin(value) {\n if (!value)\n return null;\n try {\n const o = toOklchColor(value);\n if (Number.isNaN(o.l) || Number.isNaN(o.c))\n return null;\n return o;\n } catch {\n return null;\n }\n }\n function parseChromaticPin(value) {\n const o = parsePin(value);\n if (!o || Number.isNaN(o.h) || o.c < ACHROMATIC_CHROMA)\n return null;\n return o;\n }\n function paletteHueAngle(name) {\n const spec2 = PALETTE_HUES[name];\n return typeof spec2 === \"object\" ? spec2.h : 0;\n }\n function resolveStatusHue(role, pinned) {\n const name = STATUS_TO_HUE[role] ?? \"red\";\n const pin = parseChromaticPin(pinned[`--${name}`] ?? pinned[`--color-${name}-base`] ?? pinned[`--color-${name}`]);\n return pin ? pin.h : paletteHueAngle(name);\n }\n function buildGraph(preset, opts) {\n const completed = completeAnchors(preset, opts);\n const bg = completed.bg;\n const fgAnchor = completed.fg;\n const pinned = opts.constraints ?? {};\n const accent = pinned[\"--accent\"] ? toOklchColor(pinned[\"--accent\"]) : completed.accent;\n const scheme = completed.scheme;\n const knobs = opts.knobs ?? {};\n const shiftStep = typeof knobs.accentShiftStep === \"number\" ? knobs.accentShiftStep : DEFAULT_SHIFT_STEP;\n const accentSplit = typeof knobs.accentSplit === \"number\" ? knobs.accentSplit : DEFAULT_ACCENT_SPLIT;\n const band = contrastBandFloor(knobs);\n const floor = Math.max(ENFORCE, preset.contrastFloor, (band ?? 0) + 0.2);\n const extreme = preset.extreme === true;\n let vibrancy = vibrancyOf(knobs, preset);\n if (extreme)\n vibrancy = 1;\n const typeScale = typeScaleOf(knobs);\n const radiusScale = radiusScaleOf(knobs);\n const density = densityOf(knobs);\n const fonts = fontsOf(knobs);\n const surfaceStep = 0.045;\n const nodes = [];\n const lit = (name, value, refs) => {\n nodes.push(refs && refs.length ? { name, value, refs } : { name, value });\n };\n const pinKeys = new Set(Object.keys(pinned));\n const refIfPinned = (...names) => names.filter((n) => pinKeys.has(n));\n lit(\"--scheme\", scheme);\n const bg0 = pinned[\"--bg-0\"] ? toOklchColor(pinned[\"--bg-0\"]) : extreme ? oklch2(scheme === \"dark\" ? 0 : 1, 0, 0) : ensureTextHeadroom(withLightness(bg, stepLightness(bg.l, scheme, surfaceStep, 1)), scheme, floor);\n const pageFloor = (fill) => separateFillFromSurface(fill, bg0, SURFACE_SEPARATION, floor);\n const direction = scheme === \"dark\" ? 1 : -1;\n const surfaceColors = SURFACES.map((_, index) => withLightness(bg0, bg0.l + direction * surfaceStep * (index - 1)));\n SURFACES.forEach((name, index) => {\n lit(name, formatCss2(surfaceColors[index]), refIfPinned(\"--bg-0\"));\n });\n lit(\"--bg-sunken\", formatCss2(withLightness(bg0, bg0.l - direction * surfaceStep * 2)), refIfPinned(\"--bg-0\"));\n lit(\"--scrim\", formatCss2(oklch2(scheme === \"dark\" ? 0 : 0.1, 0, 0, 0.6)));\n const overlayBase = withLightness(bg0, scheme === \"dark\" ? bg0.l + 0.07 : bg0.l + 0.03);\n lit(\"--surface-overlay\", formatCss2(overlayBase), refIfPinned(\"--bg-0\"));\n lit(\"--surface-overlay-border\", formatCss2(withAlpha(withLightness(bg0, scheme === \"dark\" ? bg0.l + 0.25 : bg0.l - 0.2), 0.6)), refIfPinned(\"--bg-0\"));\n const fg0 = pinned[\"--fg-0\"] ? toOklchColor(pinned[\"--fg-0\"]) : extreme ? bestTruePole(formatCss2(bg0)) : enforceContrastFloor(withLightness(fgAnchor, scheme === \"dark\" ? Math.max(fgAnchor.l, 0.9) : Math.min(fgAnchor.l, 0.2)), bg0, scheme, floor);\n lit(\"--fg-0\", formatCss2(fg0), refIfPinned(\"--bg-0\", \"--fg-0\"));\n const fgBg0Css = formatCss2(bg0);\n const fg0Contrast = emittedContrast(fg0, fgBg0Css);\n const panelRef = surfaceColors[PANEL_REF_INDEX];\n const panelRefCss = formatCss2(panelRef);\n const panelSurfaces = PANEL_SURFACES.map((s) => surfaceColors[SURFACES.indexOf(s)]);\n const rampFloor = extreme ? Math.min(fg0Contrast, Math.max(floor, fg0Contrast * 0.66)) : Math.min(floor, fg0Contrast);\n const conservativeFloorL = (target) => {\n const againstBg0 = lightnessForContrast(fg0, bg0, fgBg0Css, target);\n const againstPanel = lightnessForContrast(fg0, panelRef, panelRefCss, target);\n return Math.abs(againstBg0 - fg0.l) <= Math.abs(againstPanel - fg0.l) ? againstBg0 : againstPanel;\n };\n const textLight = scheme === \"dark\";\n const enforceOnPanels = (color) => {\n const onBg0 = enforceContrastFloor(color, bg0, scheme, floor);\n const sameSidePanels = panelSurfaces.filter((p4) => p4.l < 0.5 === textLight);\n if (sameSidePanels.length === 0)\n return onBg0;\n const panelCss = sameSidePanels.map((p4) => formatCss2(p4));\n const minPanel = (c2) => Math.min(...panelCss.map((p4) => emittedContrast(c2, p4)));\n if (minPanel(onBg0) >= floor - 0.01)\n return onBg0;\n const targetL = textLight ? 1 : 0;\n let best = onBg0;\n let bestMin = minPanel(onBg0);\n for (let i = 1; i <= 100; i++) {\n const t = i / 100;\n const candidate = withLightness(onBg0, onBg0.l + (targetL - onBg0.l) * t);\n if (emittedContrast(candidate, fgBg0Css) < floor - 0.01)\n break;\n const m = minPanel(candidate);\n if (m > bestMin) {\n bestMin = m;\n best = candidate;\n }\n if (m >= floor)\n break;\n }\n return best;\n };\n const enforceChromaticOnPanels = (color) => {\n const bg0Css = formatCss2(bg0);\n const sameSidePanels = panelSurfaces.filter((p4) => p4.l < 0.5 === textLight);\n const refsCss = [bg0Css, ...sameSidePanels.map((p4) => formatCss2(p4))];\n const minRef = (c2) => Math.min(...refsCss.map((r2) => emittedContrast(c2, r2)));\n if (minRef(color) >= floor - 0.01)\n return color;\n const targetL = textLight ? 1 : 0;\n for (let i = 1; i <= 100; i++) {\n const candidate = withLightness(color, color.l + (targetL - color.l) * (i / 100));\n if (minRef(candidate) >= floor)\n return candidate;\n }\n return enforceOnPanels(color);\n };\n const floorL = conservativeFloorL(rampFloor);\n for (let i = 1; i <= 3; i++) {\n const reduced = withLightness(fg0, fg0.l + (floorL - fg0.l) * (i / 3));\n lit(`--fg-${i}`, formatCss2(reduced), [\"--fg-0\", ...refIfPinned(\"--bg-0\")]);\n }\n lit(\"--fg-disabled\", formatCss2(withLightness(fg0, conservativeFloorL(3))), [\"--fg-0\", ...refIfPinned(\"--bg-0\")]);\n const placeholderFloor = extreme ? rampFloor : Math.min(floor, fg0Contrast);\n const placeholderL = conservativeFloorL(placeholderFloor);\n lit(\"--placeholder\", formatCss2(withLightness(fg0, placeholderL)), [\"--fg-0\", ...refIfPinned(\"--bg-0\")]);\n const accentFill = pinned[\"--accent\"] || completed.accentExplicit ? accent : pageFloor(fillWithTextHeadroom(accent.l, accent.c * (0.6 + vibrancy * 0.8) * preset.accentChromaMul, accent.h, floor));\n const accentValue = pinned[\"--accent\"] ?? formatCss2(accentFill);\n lit(\"--accent\", accentValue, refIfPinned(\"--accent\"));\n lit(\"--accent-fg\", pickReadable(accentFill, TEXT_POLES, floor), [\"--accent\"]);\n const accentTextColor = enforceChromaticOnPanels(accentFill);\n const accentTextCss = formatCss2(accentTextColor);\n const accentTint = liftStopForContrast(oklch2(scheme === \"dark\" ? Math.max(0.2, bg0.l + 0.08) : Math.min(0.92, bg0.l - 0.04), accentFill.c * preset.accentTintChromaMul, accentFill.h), accentTextCss, AA + 0.2, accentTextColor.l < 0.5);\n lit(\"--accent-bg\", formatCss2(accentTint), [\"--accent\", ...refIfPinned(\"--bg-0\")]);\n lit(\"--accent-text\", accentTextCss, [\"--accent\", ...refIfPinned(\"--bg-0\")]);\n lit(\"--accent-vivid\", vividOnPanel(accentFill.h, [bg0, ...panelSurfaces], floor, accentFill.c), [\"--accent\", ...refIfPinned(\"--bg-0\")]);\n const pinnedNeutral = parsePin(pinned[\"--neutral\"]);\n const neutralFill = pinnedNeutral ?? pageFloor(fillWithTextHeadroom(scheme === \"dark\" ? 0.6 : 0.5, preset.neutralChroma, accentFill.h, floor));\n const neutralTintHue = Number.isFinite(neutralFill.h) ? neutralFill.h : accentFill.h;\n lit(\"--neutral\", formatCss2(neutralFill), [\"--accent\", ...refIfPinned(\"--neutral\")]);\n const neutralTextColor = enforceOnPanels(neutralFill);\n const neutralTextCss = formatCss2(neutralTextColor);\n const neutralTint = liftStopForContrast(oklch2(scheme === \"dark\" ? Math.max(0.2, bg0.l + 0.06) : Math.min(0.92, bg0.l - 0.04), 5e-3, neutralTintHue), neutralTextCss, AA + 0.2, neutralTextColor.l < 0.5);\n lit(\"--neutral-bg\", formatCss2(neutralTint), [\"--accent\", ...refIfPinned(\"--bg-0\")]);\n lit(\"--neutral-fg\", pickReadable(neutralFill, TEXT_POLES, floor), [\"--neutral\"]);\n lit(\"--neutral-text\", neutralTextCss, [\"--neutral\", ...refIfPinned(\"--bg-0\")]);\n lit(\"--neutral-vivid\", neutralTextCss, [\"--neutral-text\", ...refIfPinned(\"--bg-0\")]);\n const lineSeed = extreme ? oklch2(scheme === \"dark\" ? 0.7 : 0.3, 0, 0) : withLightness(bg0, scheme === \"dark\" ? bg0.l + 0.12 : bg0.l - 0.12);\n lit(\"--line\", formatCss2(borderForContrast(lineSeed, bg0, BORDER_SEPARATION)), refIfPinned(\"--bg-0\"));\n const line2Seed = extreme ? oklch2(scheme === \"dark\" ? 0.85 : 0.15, 0, 0) : withLightness(bg0, scheme === \"dark\" ? bg0.l + 0.2 : bg0.l - 0.2);\n lit(\"--line-2\", formatCss2(borderForContrast(line2Seed, bg0, DIVIDER_SEPARATION)), refIfPinned(\"--bg-0\"));\n lit(\"--ring\", formatCss2(withAlpha(accentFill, 0.7)), [\"--accent\"]);\n lit(\"--ring-bg\", formatCss2(withAlpha(accentFill, 0.18)), [\"--accent\"]);\n const fieldBg = withLightness(bg0, scheme === \"dark\" ? bg0.l - 0.03 : bg0.l + 0.02);\n lit(\"--field-bg\", formatCss2(fieldBg), refIfPinned(\"--bg-0\"));\n const fieldBorderSeed = extreme ? oklch2(scheme === \"dark\" ? 0.8 : 0.2, 0, 0) : withLightness(bg0, scheme === \"dark\" ? bg0.l + 0.16 : bg0.l - 0.16);\n lit(\"--field-border\", formatCss2(borderForContrast(fieldBorderSeed, fieldBg, BORDER_SEPARATION)), refIfPinned(\"--bg-0\"));\n lit(\"--accent-hover\", formatCss2(withLightness(accentFill, accentFill.l + (scheme === \"dark\" ? 0.06 : -0.06))), [\"--accent\"]);\n lit(\"--accent-active\", formatCss2(withLightness(accentFill, accentFill.l + (scheme === \"dark\" ? -0.06 : 0.06))), [\"--accent\"]);\n const accentDisplay = toOklchColor(accentValue);\n const accentDelta = (from, to) => ({\n dL: to.l - from.l,\n dC: to.c - from.c,\n dH: hueDelta(from.h, to.h)\n });\n const applyAccentDelta = (from, delta) => {\n const rawL = from.l + delta.dL;\n const l = delta.dL === 0 ? Math.min(1, Math.max(0, rawL)) : Math.min(ACCENT_RAMP_L_MAX, Math.max(ACCENT_RAMP_L_MIN, rawL));\n return {\n l,\n c: Math.max(0, from.c + delta.dC),\n h: ((from.h + delta.dH) % 360 + 360) % 360,\n alpha: 1\n };\n };\n const emitAccent = (color) => {\n const maxC = clampToGamut({ l: color.l, c: color.c, h: color.h, alpha: 1 }).c;\n return formatCss2({ ...color, c: Math.min(color.c, maxC) });\n };\n const a1 = accentDisplay;\n const fanBase = { ...a1, c: Math.max(a1.c, FAN_MIN_CHROMA) };\n const rotate = (deg) => ({ dL: 0, dC: 0, dH: deg });\n const fanned = (n, derived) => pinned[`--accent-${n}`] ? toOklchColor(pinned[`--accent-${n}`]) : derived;\n let a2;\n let a3;\n let a4;\n let a2Refs;\n let a3Refs;\n let a4Refs;\n if (ACCENT_FAN === \"split-complement\") {\n const mirrorOf = (c2) => applyAccentDelta(fanBase, rotate(-hueDelta(a1.h, c2.h)));\n const a2Pin = pinned[\"--accent-2\"];\n const a3Pin = pinned[\"--accent-3\"];\n let a2Derived = applyAccentDelta(fanBase, rotate(-accentSplit));\n let a3Derived = applyAccentDelta(fanBase, rotate(accentSplit));\n if (a2Pin && !a3Pin)\n a3Derived = mirrorOf(toOklchColor(a2Pin));\n else if (a3Pin && !a2Pin)\n a2Derived = mirrorOf(toOklchColor(a3Pin));\n a2 = fanned(\"2\", a2Derived);\n a3 = fanned(\"3\", a3Derived);\n a4 = fanned(\"4\", applyAccentDelta(fanBase, rotate(180)));\n a2Refs = a3Pin && !a2Pin ? [\"--accent\", \"--accent-3\"] : [\"--accent\"];\n a3Refs = a2Pin && !a3Pin ? [\"--accent\", \"--accent-2\"] : [\"--accent\"];\n a4Refs = [\"--accent\"];\n } else {\n a2 = fanned(\"2\", applyAccentDelta(fanBase, rotate(shiftStep)));\n a3 = fanned(\"3\", applyAccentDelta(a2, accentDelta(fanBase, a2)));\n a4 = fanned(\"4\", applyAccentDelta(a3, accentDelta(a2, a3)));\n a2Refs = [\"--accent\", \"--accent-shift-step\"];\n a3Refs = [\"--accent-2\", \"--accent\"];\n a4Refs = [\"--accent-3\", \"--accent-2\"];\n }\n lit(\"--accent-2\", emitAccent(a2), a2Refs);\n lit(\"--accent-3\", emitAccent(a3), a3Refs);\n lit(\"--accent-4\", emitAccent(a4), a4Refs);\n lit(\"--accent-shift-step\", String(shiftStep));\n const emitAccentFamily = (n, raw) => {\n const color = toOklchColor(emitAccent(raw));\n lit(`--accent-${n}-fg`, pickReadable(color, TEXT_POLES, floor), [`--accent-${n}`]);\n const tint = oklch2(scheme === \"dark\" ? Math.max(0.2, bg0.l + 0.08) : Math.min(0.92, bg0.l - 0.04), color.c * preset.accentTintChromaMul, color.h);\n lit(`--accent-${n}-bg`, formatCss2(tint), [`--accent-${n}`, ...refIfPinned(\"--bg-0\")]);\n lit(`--accent-${n}-text`, readableHuedOnTintAndPanel(tint, color.h, AA + 0.3, panelSurfaces, AA + 0.05, color.c), [`--accent-${n}-bg`, ...refIfPinned(\"--bg-0\")]);\n lit(`--accent-${n}-vivid`, vividOnPanel(color.h, [bg0, ...panelSurfaces], floor, color.c), [`--accent-${n}`, ...refIfPinned(\"--bg-0\")]);\n };\n emitAccentFamily(\"2\", a2);\n emitAccentFamily(\"3\", a3);\n emitAccentFamily(\"4\", a4);\n lit(\"--selection-cue\", extreme || knobs.cues === \"redundant\" ? \"marker\" : \"tint\");\n const statusChroma = Math.max(0.12, accent.c) * (0.6 + vibrancy * 0.7) * preset.statusChromaMul;\n for (const role of Object.keys(STATUS_TO_HUE)) {\n const namedHue = resolveStatusHue(role, pinned);\n const pinnedFill = parseChromaticPin(pinned[`--${role}`]);\n const roleHue = pinnedFill ? pinnedFill.h : namedHue;\n const fillL = scheme === \"dark\" ? 0.62 : 0.52;\n const fill = pinnedFill ?? pageFloor(fillWithTextHeadroom(fillL, statusChroma, roleHue, floor));\n const tintL = scheme === \"dark\" ? Math.min(0.3, bg0.l + 0.08) : Math.min(0.92, bg0.l - 0.04);\n const tint = ensureTextHeadroom(oklch2(tintL, statusChroma * 0.35, roleHue), scheme, AA + 0.3);\n const fillRefs = refIfPinned(\"--accent\", `--${role}`);\n lit(`--${role}`, formatCss2(fill), fillRefs);\n lit(`--${role}-bg`, formatCss2(tint), [`--${role}`, ...refIfPinned(\"--bg-0\")]);\n lit(`--${role}-fg`, pickReadable(fill, TEXT_POLES, floor), [`--${role}`]);\n lit(`--${role}-text`, readableHuedOnTintAndPanel(tint, roleHue, AA + 0.3, panelSurfaces, AA + 0.05, statusChroma), [`--${role}-bg`, ...refIfPinned(\"--bg-0\")]);\n lit(`--${role}-vivid`, vividOnPanel(roleHue, [bg0, ...panelSurfaces], floor, statusChroma), [`--${role}`, ...refIfPinned(\"--bg-0\")]);\n }\n const overlayL = scheme === \"dark\" ? 1 : 0;\n const extremeDist = scheme === \"dark\" ? bg0.l : 1 - bg0.l;\n const overlayBoost = 1 + Math.max(0, (0.15 - extremeDist) / 0.15) * 0.8;\n const overlay = (a) => formatCss2(oklch2(overlayL, 0, 0, Math.min(0.4, a * overlayBoost)));\n lit(\"--state-hover\", overlay(0.06));\n lit(\"--state-press\", overlay(0.12));\n lit(\"--state-selected\", overlay(0.16));\n lit(\"--state-disabled\", overlay(0.08));\n lit(\"--state-drag\", overlay(0.1));\n lit(\"--selection\", formatCss2(withAlpha(accentFill, 0.3)), [\"--accent\"]);\n lit(\"--highlight\", formatCss2(withAlpha(oklch2(scheme === \"dark\" ? 0.85 : 0.9, 0.16, paletteHueAngle(\"yellow\")), 0.35)));\n const linkColor = enforceChromaticOnPanels(accent);\n const linkCss = formatCss2(linkColor);\n let linkHoverColor = enforceChromaticOnPanels(withLightness(accent, accent.l + (scheme === \"dark\" ? 0.08 : -0.08)));\n if (formatCss2(linkHoverColor) === linkCss) {\n const pole = textLight ? 1 : 0;\n const toward = linkColor.l < pole ? 1 : -1;\n const distinctHover = (candidate) => {\n const enforced = enforceChromaticOnPanels(candidate);\n return formatCss2(enforced) === linkCss ? void 0 : enforced;\n };\n let hover;\n for (let step = 0.1; step <= 0.6 && !hover; step += 0.05) {\n hover = distinctHover(withLightness(linkColor, linkColor.l + toward * step));\n }\n for (let step = 0.1; step <= 0.6 && !hover; step += 0.05) {\n hover = distinctHover(withLightness(linkColor, linkColor.l - toward * step));\n }\n for (let cut = 0.7; cut >= 0.05 && !hover; cut -= 0.15) {\n hover = distinctHover(oklch2(linkColor.l, linkColor.c * cut, linkColor.h));\n }\n linkHoverColor = hover ?? linkHoverColor;\n }\n lit(\"--link\", formatCss2(linkColor), [\"--accent\", ...refIfPinned(\"--bg-0\")]);\n lit(\"--link-hover\", formatCss2(linkHoverColor), [\"--link\", ...refIfPinned(\"--bg-0\")]);\n for (const [hue3, spec2] of Object.entries(PALETTE_HUES)) {\n const pinnedBase = typeof spec2 === \"object\" ? parseChromaticPin(pinned[`--${hue3}`] ?? pinned[`--color-${hue3}-base`] ?? pinned[`--color-${hue3}`]) : null;\n const effectiveSpec = pinnedBase && typeof spec2 === \"object\" ? { h: pinnedBase.h, c: pinnedBase.c } : spec2;\n const ramp = {};\n paletteRamp(ramp, hue3, effectiveSpec, scheme, vibrancy, floor, preset, accent, [bg0, ...panelSurfaces], pinnedBase ?? void 0);\n lit(`--color-${hue3}`, ramp[`--color-${hue3}`]);\n for (const stop of PALETTE_STOPS) {\n lit(`--color-${hue3}-${stop}`, ramp[`--color-${hue3}-${stop}`], [\n `--color-${hue3}`\n ]);\n }\n lit(`--${hue3}`, ramp[`--${hue3}`], [`--color-${hue3}-base`]);\n lit(`--${hue3}-bg`, ramp[`--${hue3}-bg`], [`--color-${hue3}-subtle`]);\n lit(`--${hue3}-fg`, ramp[`--${hue3}-fg`], [`--color-${hue3}-base`]);\n lit(`--${hue3}-text`, ramp[`--${hue3}-text`], [`--color-${hue3}-subtle`]);\n lit(`--${hue3}-vivid`, ramp[`--${hue3}-vivid`], [\n `--color-${hue3}-base`,\n ...refIfPinned(\"--bg-0\")\n ]);\n }\n const codeBg = ensureTextHeadroom(withLightness(bg0, scheme === \"dark\" ? bg0.l - 0.02 : bg0.l + 0.012), scheme, floor);\n const codeBgCss = formatCss2(codeBg);\n lit(\"--code-bg\", codeBgCss, refIfPinned(\"--bg-0\"));\n const codeFg = enforceContrastFloor(fg0, codeBg, scheme, floor);\n const codeFgCss = formatCss2(codeFg);\n lit(\"--code-fg\", codeFgCss, [\"--fg-0\", ...refIfPinned(\"--bg-0\")]);\n lit(\"--code-line-highlight\", formatCss2(withAlpha(accentFill, 0.1)), [\"--accent\"]);\n lit(\"--code-selection\", formatCss2(withAlpha(accentFill, 0.3)), [\"--accent\"]);\n const codeTowardLight = contrast2(\"#ffffff\", codeBgCss) >= contrast2(\"#000000\", codeBgCss);\n const codePole = codeTowardLight ? 1 : 0;\n const codeFloor = AA;\n const readableHuedOnCode = (l, c2, h, fl) => {\n const seed = oklch2(l, c2, h);\n let best = seed;\n let bestContrast = emittedContrast(seed, codeBgCss);\n if (bestContrast >= fl)\n return seed;\n for (let i = 1; i <= 100; i++) {\n const cand = withLightness(seed, seed.l + (codePole - seed.l) * (i / 100));\n const ct = emittedContrast(cand, codeBgCss);\n if (ct >= fl)\n return cand;\n if (ct > bestContrast) {\n bestContrast = ct;\n best = cand;\n }\n }\n return best;\n };\n const codeChroma = Math.max(0.08, Math.max(0.1, accent.c) * (0.7 + vibrancy * 0.7) * preset.paletteChromaMul);\n const codeBaseHue = Number.isFinite(accent.h) ? accent.h : DERIVED_ACCENT_FALLBACK_HUE;\n const codeBaseL = codeTowardLight ? 0.76 : 0.46;\n const codePoleL = codeTowardLight ? 1 : 0;\n const aaEdgeL = lightnessForContrast(oklch2(codePoleL, 0, 0), codeBg, codeBgCss, codeFloor);\n const bandLo = aaEdgeL + (codePoleL - aaEdgeL) * 0.06;\n const bandHi = codePoleL - (codePoleL - aaEdgeL) * 0.32;\n CODE_VIVID_ROLES.forEach((role, rank) => {\n const hue3 = ((codeBaseHue + CODE_HUE_RANK[rank] * 45) % 360 + 360) % 360;\n const bandL = bandLo + (bandHi - bandLo) * (rank / 7);\n const fill = readableHuedOnCode(bandL, codeChroma, hue3, codeFloor);\n lit(`--code-${role}`, formatCss2(fill), [\"--accent\", \"--code-bg\"]);\n });\n const commentFloor = Math.max(3, codeFloor * 0.62);\n const commentL = codeTowardLight ? 0.6 : 0.56;\n lit(\"--code-comment\", formatCss2(readableHuedOnCode(commentL, Math.min(0.03, codeChroma * 0.3), codeBaseHue, commentFloor)), [\"--accent\", \"--code-bg\"]);\n lit(\"--code-operator\", formatCss2(readableHuedOnCode(codeBaseL, codeChroma * 0.5, codeBaseHue, codeFloor)), [\"--accent\", \"--code-bg\"]);\n lit(\"--code-punctuation\", formatCss2(enforceContrastFloor(withLightness(codeFg, codeFg.l + (codePole - codeFg.l) * 0.18), codeBg, scheme, codeFloor)), [\"--code-fg\", \"--code-bg\"]);\n lit(\"--code-variable\", codeFgCss, [\"--code-fg\"]);\n lit(\"--font-sans\", fonts.sans);\n lit(\"--font-mono\", fonts.mono);\n lit(\"--font-display\", fonts.display);\n const bodyIndex = TEXT_STEPS.indexOf(\"body\");\n TEXT_STEPS.forEach((step, index) => {\n const rem = BASE_TEXT_REM * typeScale ** (index - bodyIndex);\n lit(`--text-${step}`, `${rem.toFixed(4).replace(/\\.?0+$/, \"\")}rem`);\n });\n for (const step of LEADING_STEPS) {\n lit(`--leading-${step}`, String(LEADING_VALUES[step]));\n }\n for (const step of WEIGHT_STEPS) {\n lit(`--weight-${step}`, String(WEIGHT_VALUES[step]));\n }\n const radiusPx = {\n none: 0,\n sm: 2 * radiusScale,\n md: 4 * radiusScale,\n lg: 8 * radiusScale,\n full: 9999\n };\n for (const step of RADIUS_STEPS) {\n lit(`--radius-${step}`, `${radiusPx[step]}px`);\n }\n const borderPx = { thin: 1, normal: 1.5, thick: 2 };\n for (const step of BORDER_STEPS) {\n lit(`--border-${step}`, `${borderPx[step]}px`);\n }\n const durationMs = { fast: 120, base: 200, slow: 320 };\n for (const step of DURATION_STEPS) {\n lit(`--duration-${step}`, `${durationMs[step]}ms`);\n }\n lit(\"--ease-standard\", \"cubic-bezier(0.2, 0, 0, 1)\");\n lit(\"--ease-emphasized\", \"cubic-bezier(0.3, 0, 0, 1)\");\n const elevationStrings = {};\n for (const level of ELEVATION_STEPS) {\n const value = shadowString(scheme, level, vibrancy, preset);\n elevationStrings[level] = value;\n lit(`--elevation-${level}`, value);\n }\n lit(\"--shadow\", elevationStrings[3], [\"--elevation-3\"]);\n for (const step of SPACE_STEPS) {\n const rem = SPACE_BASE_REM * step * density;\n lit(`--space-${step}`, `${rem.toFixed(4).replace(/\\.?0+$/, \"\")}rem`);\n }\n const producedNames = new Set(nodes.map((n) => n.name));\n for (const [name, value] of Object.entries(pinned)) {\n if (producedNames.has(name)) {\n for (const node of nodes) {\n if (node.name === name) {\n node.value = value;\n node.resolve = void 0;\n node.refs = void 0;\n }\n }\n } else {\n nodes.push({ name, value });\n }\n }\n return nodes;\n }\n function resolveBaseInputs(preset, opts) {\n const completed = completeAnchors(preset, opts);\n return {\n knobs: opts.knobs ?? {},\n scheme: completed.scheme,\n pinned: opts.constraints ?? {}\n };\n }\n function buildPassContext(preset, opts, passIndex) {\n const base = resolveBaseInputs(preset, opts);\n return { ...base, passIndex };\n }\n function runPipeline(passes, makeCtx) {\n let register = {};\n const trace = [];\n passes.forEach((pass, index) => {\n register = pass.run(register, makeCtx(index));\n trace.push({ name: pass.name, register });\n });\n return { register, trace };\n }\n function settlePass(preset, opts) {\n return {\n name: \"settle\",\n run: () => resolveGraph(buildGraph(preset, opts))\n };\n }\n function registerToNodes(register) {\n return Object.entries(register).map(([name, value]) => ({ name, value }));\n }\n function alpha(value) {\n if (!value)\n return 1;\n const rgba = /rgba?\\([^)]*?,\\s*([0-9.]+)\\s*\\)/.exec(value);\n if (rgba && rgba[1] !== void 0)\n return Number.parseFloat(rgba[1]);\n if (value.startsWith(\"#\") && value.length === 9) {\n return Number.parseInt(value.slice(7, 9), 16) / 255;\n }\n if (value.startsWith(\"#\") && value.length === 5) {\n return Number.parseInt(value.slice(4, 5).repeat(2), 16) / 255;\n }\n return 1;\n }\n function parseRem(value) {\n if (!value)\n return Number.NaN;\n const m = /^(-?[0-9.]+)(rem|px)$/.exec(value.trim());\n return m ? Number.parseFloat(m[1]) : Number.NaN;\n }\n function parseMs(value) {\n if (!value)\n return Number.NaN;\n const m = /^(-?[0-9.]+)ms$/.exec(value.trim());\n return m ? Number.parseFloat(m[1]) : Number.NaN;\n }\n function shadowStrength(value) {\n if (!value || value === \"none\")\n return 0;\n let total = 0;\n const offsets = value.match(/([0-9.]+)px/g) ?? [];\n for (const off of offsets)\n total += Number.parseFloat(off);\n const alphas = value.match(/rgba?\\([^)]*,\\s*([0-9.]+)\\)/g) ?? [];\n for (const a of alphas) {\n const m = /,\\s*([0-9.]+)\\)/.exec(a);\n if (m)\n total += Number.parseFloat(m[1]) * 20;\n }\n return total;\n }\n var STATE_TOKENS = [\n \"--state-hover\",\n \"--state-press\",\n \"--state-selected\",\n \"--state-disabled\",\n \"--state-drag\"\n ];\n var CEILING_EPSILON = 0.05;\n function achievableFloor(declaredFloor, bgCss) {\n if (!bgCss)\n return declaredFloor;\n const ceiling = Math.max(contrast2(\"#000000\", bgCss), contrast2(\"#ffffff\", bgCss));\n return Math.min(declaredFloor, ceiling - CEILING_EPSILON);\n }\n function oklabDist(a, b) {\n const x = toOklchColor(a);\n const y = toOklchColor(b);\n const rad = Math.PI / 180;\n const ax = x.c * Math.cos(x.h * rad);\n const ay = x.c * Math.sin(x.h * rad);\n const bx = y.c * Math.cos(y.h * rad);\n const by = y.c * Math.sin(y.h * rad);\n return Math.hypot(x.l - y.l, ax - bx, ay - by);\n }\n function makeInvariants(preset) {\n const onFillFloor = preset.declaredTextOnFillFloor;\n return [\n (ctx) => {\n for (const name of PRODUCES) {\n const value = ctx.register[name];\n const category = ctx.categories[name];\n if (typeof value !== \"string\" || value.length === 0) {\n return {\n name: \"every token non-empty and format-valid for its category\",\n ok: false,\n detail: `${name} is ${value === void 0 ? \"missing\" : \"empty\"}`\n };\n }\n if (/nan/i.test(value)) {\n return {\n name: \"every token non-empty and format-valid for its category\",\n ok: false,\n detail: `${name} contains NaN: ${value}`\n };\n }\n switch (category) {\n case \"color\": {\n try {\n const o = toOklchColor(value);\n if (Number.isNaN(o.l) || Number.isNaN(o.c) || Number.isNaN(o.h) || Number.isNaN(alpha(value))) {\n return {\n name: \"every token non-empty and format-valid for its category\",\n ok: false,\n detail: `${name} parses to NaN: ${value}`\n };\n }\n } catch (error) {\n return {\n name: \"every token non-empty and format-valid for its category\",\n ok: false,\n detail: `${name} unparseable color: ${value} (${String(error)})`\n };\n }\n break;\n }\n case \"length\": {\n if (Number.isNaN(parseRem(value))) {\n return {\n name: \"every token non-empty and format-valid for its category\",\n ok: false,\n detail: `${name} not a css length: ${value}`\n };\n }\n break;\n }\n case \"duration\": {\n if (Number.isNaN(parseMs(value))) {\n return {\n name: \"every token non-empty and format-valid for its category\",\n ok: false,\n detail: `${name} not a duration: ${value}`\n };\n }\n break;\n }\n case \"number\": {\n if (Number.isNaN(Number.parseFloat(value))) {\n return {\n name: \"every token non-empty and format-valid for its category\",\n ok: false,\n detail: `${name} not a number: ${value}`\n };\n }\n break;\n }\n case \"easing\": {\n if (!value.startsWith(\"cubic-bezier(\")) {\n return {\n name: \"every token non-empty and format-valid for its category\",\n ok: false,\n detail: `${name} not an easing: ${value}`\n };\n }\n break;\n }\n case \"shadow\": {\n if (value !== \"none\" && !value.includes(\"rgba\")) {\n return {\n name: \"every token non-empty and format-valid for its category\",\n ok: false,\n detail: `${name} not a shadow: ${value}`\n };\n }\n break;\n }\n case \"font\":\n break;\n case \"keyword\": {\n const domain = KEYWORD_DOMAINS[name];\n if (domain && !domain.includes(value)) {\n return {\n name: \"every token non-empty and format-valid for its category\",\n ok: false,\n detail: `${name} not in {${domain.join(\" | \")}}: ${value}`\n };\n }\n break;\n }\n }\n }\n return { name: \"every token non-empty and format-valid for its category\", ok: true };\n },\n (ctx) => {\n const name = `fg-0 on bg-0 clears ${onFillFloor >= AAA - 0.01 ? \"AAA\" : \"AA\"}`;\n if (ctx.constraints[\"--fg-0\"]) {\n return { name, ok: true, detail: \"skipped (pinned text)\" };\n }\n const fg0 = ctx.register[\"--fg-0\"];\n const bg0 = ctx.register[\"--bg-0\"];\n const ratio = fg0 && bg0 ? contrast2(fg0, bg0) : 0;\n const required = achievableFloor(onFillFloor, ctx.constraints[\"--bg-0\"] ? bg0 : void 0);\n return {\n name,\n ok: ratio >= required - 0.01,\n detail: `contrast ${ratio.toFixed(2)} (floor ${required.toFixed(2)}${ctx.constraints[\"--bg-0\"] ? ` best-achievable, declared ${onFillFloor}` : \"\"})`\n };\n },\n (ctx) => {\n const name = `fg ramp clears ${preset.contrastFloor >= AAA - 0.01 ? \"AAA\" : \"AA\"}`;\n if (ctx.constraints[\"--fg-0\"]) {\n return { name, ok: true, detail: \"skipped (pinned text)\" };\n }\n const bg0 = ctx.register[\"--bg-0\"];\n if (!bg0)\n return { name, ok: false, detail: \"missing --bg-0\" };\n const required = achievableFloor(preset.contrastFloor, ctx.constraints[\"--bg-0\"] ? bg0 : void 0);\n for (let i = 1; i <= 3; i++) {\n const key = `--fg-${i}`;\n if (ctx.constraints[key])\n continue;\n const fg = ctx.register[key];\n const ratio = fg ? contrast2(fg, bg0) : 0;\n if (ratio < required - 0.01) {\n return {\n name,\n ok: false,\n detail: `${key} contrast ${ratio.toFixed(2)} (floor ${required.toFixed(2)}${ctx.constraints[\"--bg-0\"] ? ` best-achievable, declared ${preset.contrastFloor}` : \"\"})`\n };\n }\n }\n return { name, ok: true };\n },\n (ctx) => {\n const pairs = [\n [\"--accent-fg\", \"--accent\"],\n [\"--neutral-fg\", \"--neutral\"],\n [\"--success-fg\", \"--success\"],\n [\"--warn-fg\", \"--warn\"],\n [\"--danger-fg\", \"--danger\"],\n [\"--info-fg\", \"--info\"],\n [\"--accent-text\", \"--bg-0\"],\n [\"--neutral-text\", \"--bg-0\"]\n ];\n const surfaceFill = new Set(SURFACES);\n for (const [fgName, fillName] of pairs) {\n const fill = ctx.register[fillName];\n const pinned = Boolean(ctx.constraints[fillName]);\n if (pinned && !surfaceFill.has(fillName))\n continue;\n const fg = ctx.register[fgName];\n if (!fg || !fill)\n continue;\n const required = pinned ? achievableFloor(onFillFloor, fill) : onFillFloor;\n if (contrast2(fg, fill) < required - 0.01) {\n return {\n name: `on-fill text clears ${onFillFloor >= AAA - 0.01 ? \"AAA\" : \"AA\"}`,\n ok: false,\n detail: `${fgName} on ${fillName} = ${contrast2(fg, fill).toFixed(2)} (floor ${required.toFixed(2)}${pinned ? \" best-achievable\" : \"\"})`\n };\n }\n }\n return {\n name: `on-fill text clears ${onFillFloor >= AAA - 0.01 ? \"AAA\" : \"AA\"}`,\n ok: true\n };\n },\n (ctx) => {\n const pairs = [\n [\"--success-text\", \"--success-bg\"],\n [\"--warn-text\", \"--warn-bg\"],\n [\"--danger-text\", \"--danger-bg\"],\n [\"--info-text\", \"--info-bg\"]\n ];\n for (const [fgName, fillName] of pairs) {\n const fg = ctx.register[fgName];\n const fill = ctx.register[fillName];\n if (!fg || !fill)\n continue;\n if (contrast2(fg, fill) < AA - 0.01) {\n return {\n name: \"text-on-tint clears AA\",\n ok: false,\n detail: `${fgName} on ${fillName} = ${contrast2(fg, fill).toFixed(2)}`\n };\n }\n }\n return { name: \"text-on-tint clears AA\", ok: true };\n },\n (ctx) => {\n const name = \"achromatic tone inks stay neutral\";\n const achromatic = [\"gray\", \"white\", \"black\"];\n for (const hue3 of achromatic) {\n for (const token of [`--${hue3}-fg`, `--${hue3}-text`, `--color-${hue3}-contrast`]) {\n const value = ctx.register[token];\n if (!value)\n continue;\n const c2 = toOklchColor(value).c;\n if (c2 >= ACHROMATIC_CHROMA) {\n return { name, ok: false, detail: `${token} = ${value} (chroma ${c2.toFixed(3)} \\u2265 ${ACHROMATIC_CHROMA})` };\n }\n }\n }\n return { name, ok: true };\n },\n (ctx) => {\n const name = \"panel text clears AA on --bg-1 and --bg-2\";\n const neutralText = [\n \"--fg-1\",\n \"--fg-2\",\n \"--fg-3\",\n \"--placeholder\",\n \"--link\",\n \"--accent-text\",\n \"--neutral-text\",\n \"--neutral-vivid\"\n ];\n if (ctx.constraints[\"--bg-0\"])\n return { name, ok: true, detail: \"skipped (pinned bg-0)\" };\n const bg0 = ctx.register[\"--bg-0\"];\n if (!bg0)\n return { name, ok: true };\n const textLight = ctx.scheme === \"dark\";\n const themePole = textLight ? \"#ffffff\" : \"#000000\";\n const band = contrastBandFloor(ctx.knobs);\n const inkFloor = Math.max(ENFORCE, preset.contrastFloor, (band ?? 0) + 0.2);\n const statusRoles = Object.keys(STATUS_TO_HUE);\n for (const panel of PANEL_SURFACES) {\n const bg = ctx.register[panel];\n if (!bg)\n continue;\n const bgL = toOklchColor(bg).l;\n if (bgL < 0.5 !== textLight)\n continue;\n const poleCeiling = contrast2(themePole, bg);\n const required = Math.min(AA, poleCeiling - CEILING_EPSILON);\n const fg0Reach = (() => {\n const v = ctx.register[\"--fg-0\"];\n return v ? contrast2(v, bg) : Infinity;\n })();\n const inkReach = (source) => {\n const v = ctx.register[source];\n if (!v)\n return Infinity;\n const ink = toOklchColor(v);\n const targetL = textLight ? 1 : 0;\n let reach = contrast2(v, bg);\n for (let i = 1; i <= 100; i++) {\n const t = i / 100;\n const candidate = withLightness(ink, ink.l + (targetL - ink.l) * t);\n if (contrast2(formatCss2(candidate), bg0) < inkFloor - 0.01)\n break;\n reach = Math.max(reach, contrast2(formatCss2(candidate), bg));\n }\n return reach;\n };\n const accentInkReach = inkReach(\"--accent\");\n const neutralInkReach = inkReach(\"--neutral\");\n const check = (token, ceilingReach = Infinity) => {\n const fg = ctx.register[token];\n if (!fg)\n return null;\n const floorFor = Math.min(required, ceilingReach);\n const ratio = contrast2(fg, bg);\n if (ratio < floorFor - 0.05) {\n return {\n name,\n ok: false,\n detail: `${token} on ${panel} = ${ratio.toFixed(2)} (floor ${floorFor.toFixed(2)})`\n };\n }\n return null;\n };\n const fg0Bounded = /* @__PURE__ */ new Set([\"--fg-1\", \"--fg-2\", \"--fg-3\", \"--placeholder\"]);\n const accentBounded = /* @__PURE__ */ new Set([\"--link\", \"--accent-text\"]);\n const reachFor = (token) => {\n if (fg0Bounded.has(token))\n return fg0Reach;\n if (accentBounded.has(token))\n return accentInkReach;\n if (token === \"--neutral-text\" || token === \"--neutral-vivid\")\n return neutralInkReach;\n return Infinity;\n };\n for (const token of neutralText) {\n const fail = check(token, reachFor(token));\n if (fail)\n return fail;\n }\n for (const role of statusRoles) {\n const tintBg = ctx.register[`--${role}-bg`];\n if (tintBg) {\n const whiteJoint = contrast2(\"#ffffff\", tintBg) >= AA && contrast2(\"#ffffff\", bg) >= AA;\n const blackJoint = contrast2(\"#000000\", tintBg) >= AA && contrast2(\"#000000\", bg) >= AA;\n if (!whiteJoint && !blackJoint)\n continue;\n }\n const fail = check(`--${role}-text`);\n if (fail)\n return fail;\n const failVivid = check(`--${role}-vivid`);\n if (failVivid)\n return failVivid;\n }\n }\n return { name, ok: true };\n },\n (ctx) => {\n const name = \"solid fills separate from --bg-0\";\n const bg0 = ctx.register[\"--bg-0\"];\n if (!bg0)\n return { name, ok: true };\n const fills = [\"--accent\", \"--neutral\", ...Object.keys(STATUS_TO_HUE).map((r2) => `--${r2}`)];\n for (const token of fills) {\n if (ctx.constraints[token])\n continue;\n const fill = ctx.register[token];\n if (!fill)\n continue;\n const ratio = contrast2(fill, bg0);\n if (ratio < SURFACE_SEPARATION - 0.05) {\n return { name, ok: false, detail: `${token} = ${ratio.toFixed(2)} on --bg-0 (floor ${SURFACE_SEPARATION})` };\n }\n }\n return { name, ok: true };\n },\n (ctx) => {\n const name = \"borders separate from their surface\";\n const borders = [\n [\"--line\", \"--bg-0\", BORDER_SEPARATION],\n [\"--line-2\", \"--bg-0\", DIVIDER_SEPARATION],\n [\"--field-border\", \"--field-bg\", BORDER_SEPARATION]\n ];\n for (const [token, surface, separation] of borders) {\n if (ctx.constraints[token])\n continue;\n const border = ctx.register[token];\n const bg = ctx.register[surface];\n if (!border || !bg)\n continue;\n const ratio = contrast2(border, bg);\n if (ratio < separation - 0.05) {\n return { name, ok: false, detail: `${token} = ${ratio.toFixed(2)} on ${surface} (floor ${separation})` };\n }\n }\n return { name, ok: true };\n },\n (ctx) => {\n const ladder = [\"--bg-sunken\", ...SURFACES];\n const ls = ladder.map((name) => {\n const value = ctx.register[name];\n return value ? toOklchColor(value).l : 0;\n });\n const ascending = ctx.scheme === \"dark\";\n for (let i = 1; i < ls.length; i++) {\n const prev = ls[i - 1];\n const cur = ls[i];\n const ok = ascending ? cur >= prev - 1e-6 : cur <= prev + 1e-6;\n if (!ok) {\n return {\n name: \"surface lightness monotonic\",\n ok: false,\n detail: `${ladder[i - 1]}=${prev.toFixed(3)} ${ladder[i]}=${cur.toFixed(3)} (${ctx.scheme})`\n };\n }\n }\n return { name: \"surface lightness monotonic\", ok: true };\n },\n (ctx) => {\n for (const name of STATE_TOKENS) {\n const value = ctx.register[name];\n if (!value)\n continue;\n const a = alpha(value);\n if (a >= 1) {\n return {\n name: \"state overlays translucent\",\n ok: false,\n detail: `${name} alpha ${a}`\n };\n }\n }\n return { name: \"state overlays translucent\", ok: true };\n },\n (ctx) => {\n const linkName = `links clear ${onFillFloor >= AAA - 0.01 ? \"AAA\" : \"AA\"} on bg-0`;\n const bg0 = ctx.register[\"--bg-0\"];\n const required = achievableFloor(onFillFloor, ctx.constraints[\"--bg-0\"] ? bg0 : void 0);\n for (const name of [\"--link\", \"--link-hover\"]) {\n const link = ctx.register[name];\n if (!link || !bg0)\n continue;\n const ratio = contrast2(link, bg0);\n if (ratio < required - 0.01) {\n return {\n name: linkName,\n ok: false,\n detail: `${name} on --bg-0 = ${ratio.toFixed(2)} (floor ${required.toFixed(2)}${ctx.constraints[\"--bg-0\"] ? \" best-achievable\" : \"\"})`\n };\n }\n }\n return { name: linkName, ok: true };\n },\n (ctx) => {\n const name = \"link hover distinct from link\";\n const link = ctx.register[\"--link\"];\n const hover = ctx.register[\"--link-hover\"];\n if (!link || !hover)\n return { name, ok: true };\n if (ctx.constraints[\"--link\"] || ctx.constraints[\"--link-hover\"])\n return { name, ok: true };\n if (link === hover) {\n if (link === \"#000000\" || link === \"#ffffff\")\n return { name, ok: true };\n return { name, ok: false, detail: `--link and --link-hover both ${link}` };\n }\n return { name, ok: true };\n },\n (ctx) => {\n const name = \"unpinned accent ramp holds its fan at constant L/C\";\n const accentValue = ctx.register[\"--accent\"];\n if (!accentValue) {\n return { name, ok: true };\n }\n const accent = toOklchColor(accentValue);\n if (accent.c < HUE_STABLE_CHROMA) {\n return { name, ok: true };\n }\n const step = typeof ctx.knobs.accentShiftStep === \"number\" ? ctx.knobs.accentShiftStep : DEFAULT_SHIFT_STEP;\n const split = typeof ctx.knobs.accentSplit === \"number\" ? ctx.knobs.accentSplit : DEFAULT_ACCENT_SPLIT;\n const accent2Value = ctx.register[\"--accent-2\"];\n const accent3Value = ctx.register[\"--accent-3\"];\n const pinnedAccent2 = ctx.constraints[\"--accent-2\"] && accent2Value ? toOklchColor(accent2Value) : null;\n const pinnedAccent3 = ctx.constraints[\"--accent-3\"] && accent3Value ? toOklchColor(accent3Value) : null;\n const fanOffset = (n) => ACCENT_FAN === \"split-complement\" ? n === 2 ? pinnedAccent3 ? -hueDelta(accent.h, pinnedAccent3.h) : -split : n === 3 ? pinnedAccent2 ? -hueDelta(accent.h, pinnedAccent2.h) : split : 180 : step * (n - 1);\n for (let n = 2; n <= 4; n++) {\n if (ctx.constraints[`--accent-${n}`])\n continue;\n const value = ctx.register[`--accent-${n}`];\n if (!value)\n continue;\n const rotated = toOklchColor(value);\n const wantH = ((accent.h + fanOffset(n)) % 360 + 360) % 360;\n if (rotated.c >= HUE_STABLE_CHROMA) {\n let dh = Math.abs(rotated.h - wantH) % 360;\n if (dh > 180)\n dh = 360 - dh;\n if (dh > HUE_TOLERANCE) {\n return {\n name,\n ok: false,\n detail: `--accent-${n} h=${rotated.h.toFixed(1)} want ${wantH.toFixed(1)}`\n };\n }\n }\n if (Math.abs(rotated.l - accent.l) > LIGHTNESS_TOLERANCE) {\n return {\n name,\n ok: false,\n detail: `--accent-${n} l=${rotated.l.toFixed(3)} want ${accent.l.toFixed(3)}`\n };\n }\n const maxChroma = clampToGamut({ l: accent.l, c: accent.c, h: wantH, alpha: 1 }).c;\n const expectedChroma = Math.min(accent.c, maxChroma);\n if (Math.abs(rotated.c - expectedChroma) > 0.02) {\n return {\n name,\n ok: false,\n detail: `--accent-${n} chroma ${rotated.c.toFixed(3)} want max-at-hue ${expectedChroma.toFixed(3)}`\n };\n }\n }\n return { name, ok: true };\n },\n (ctx) => {\n for (const name of [\"--ring\", \"--ring-bg\", \"--scrim\", \"--selection\", \"--highlight\"]) {\n const value = ctx.register[name];\n if (!value)\n continue;\n if (alpha(value) >= 1) {\n return {\n name: \"ring/scrim/selection/highlight carry alpha < 1\",\n ok: false,\n detail: `${name} alpha ${alpha(value)}`\n };\n }\n }\n return { name: \"ring/scrim/selection/highlight carry alpha < 1\", ok: true };\n },\n (ctx) => {\n let prev = -Infinity;\n for (const step of TEXT_STEPS) {\n const rem = parseRem(ctx.register[`--text-${step}`]);\n if (Number.isNaN(rem)) {\n return {\n name: \"type scale strictly increasing\",\n ok: false,\n detail: `--text-${step} not a length`\n };\n }\n if (rem <= prev) {\n return {\n name: \"type scale strictly increasing\",\n ok: false,\n detail: `--text-${step}=${rem} not > ${prev}`\n };\n }\n prev = rem;\n }\n return { name: \"type scale strictly increasing\", ok: true };\n },\n (ctx) => {\n let prev = -Infinity;\n for (const step of WEIGHT_STEPS) {\n const w = Number.parseFloat(ctx.register[`--weight-${step}`] ?? \"\");\n if (Number.isNaN(w) || w <= prev) {\n return {\n name: \"weights strictly increasing\",\n ok: false,\n detail: `--weight-${step}=${w} not > ${prev}`\n };\n }\n prev = w;\n }\n return { name: \"weights strictly increasing\", ok: true };\n },\n (ctx) => {\n let prev = -Infinity;\n for (const step of LEADING_STEPS) {\n const v = Number.parseFloat(ctx.register[`--leading-${step}`] ?? \"\");\n if (Number.isNaN(v) || v <= prev) {\n return {\n name: \"leading strictly increasing\",\n ok: false,\n detail: `--leading-${step}=${v} not > ${prev}`\n };\n }\n prev = v;\n }\n return { name: \"leading strictly increasing\", ok: true };\n },\n (ctx) => {\n let prev = -Infinity;\n for (const step of RADIUS_STEPS) {\n const v = parseRem(ctx.register[`--radius-${step}`]);\n if (Number.isNaN(v) || v < prev - 1e-9) {\n return {\n name: \"radius ladder non-decreasing\",\n ok: false,\n detail: `--radius-${step}=${v} < ${prev}`\n };\n }\n prev = v;\n }\n return { name: \"radius ladder non-decreasing\", ok: true };\n },\n (ctx) => {\n let prev = -Infinity;\n for (const step of BORDER_STEPS) {\n const v = parseRem(ctx.register[`--border-${step}`]);\n if (Number.isNaN(v) || v <= prev) {\n return {\n name: \"borders strictly increasing\",\n ok: false,\n detail: `--border-${step}=${v} not > ${prev}`\n };\n }\n prev = v;\n }\n return { name: \"borders strictly increasing\", ok: true };\n },\n (ctx) => {\n let prev = -Infinity;\n for (const step of DURATION_STEPS) {\n const v = parseMs(ctx.register[`--duration-${step}`]);\n if (Number.isNaN(v) || v <= prev) {\n return {\n name: \"durations strictly increasing\",\n ok: false,\n detail: `--duration-${step}=${v} not > ${prev}`\n };\n }\n prev = v;\n }\n return { name: \"durations strictly increasing\", ok: true };\n },\n (ctx) => {\n let prev = -Infinity;\n for (const level of ELEVATION_STEPS) {\n const v = shadowStrength(ctx.register[`--elevation-${level}`]);\n if (v < prev - 1e-9) {\n return {\n name: \"elevation strength non-decreasing\",\n ok: false,\n detail: `--elevation-${level}=${v} < ${prev}`\n };\n }\n prev = v;\n }\n return { name: \"elevation strength non-decreasing\", ok: true };\n },\n (ctx) => {\n let prev = -Infinity;\n for (const step of SPACE_STEPS) {\n const v = parseRem(ctx.register[`--space-${step}`]);\n if (Number.isNaN(v) || v < prev - 1e-9) {\n return {\n name: \"space ramp non-decreasing\",\n ok: false,\n detail: `--space-${step}=${v} < ${prev}`\n };\n }\n prev = v;\n }\n return { name: \"space ramp non-decreasing\", ok: true };\n },\n (ctx) => {\n for (const [hue3, spec2] of Object.entries(PALETTE_HUES)) {\n const stops = PALETTE_STOPS.filter((s) => s !== \"contrast\").map((stop) => ctx.register[`--color-${hue3}-${stop}`]);\n const ls = stops.map((v) => v ? toOklchColor(v).l : Number.NaN);\n if (ls.some((l) => Number.isNaN(l))) {\n return {\n name: \"palette ramps monotonic in OKLCH lightness\",\n ok: false,\n detail: `--color-${hue3} ramp has a non-color stop`\n };\n }\n const ascending = ls[ls.length - 1] >= ls[0];\n for (let i = 1; i < ls.length; i++) {\n const prev = ls[i - 1];\n const cur = ls[i];\n const ok = ascending ? cur > prev + 1e-9 : cur < prev - 1e-9;\n if (!ok) {\n return {\n name: \"palette ramps monotonic in OKLCH lightness\",\n ok: false,\n detail: `--color-${hue3} ramp l[${i}]=${cur} not strictly ${ascending ? \">\" : \"<\"} ${prev}`\n };\n }\n }\n const base = ctx.register[`--color-${hue3}-base`];\n const contrastStop = ctx.register[`--color-${hue3}-contrast`];\n if (base && contrastStop && contrast2(base, contrastStop) < AA - 0.01) {\n return {\n name: \"palette ramps monotonic in OKLCH lightness\",\n ok: false,\n detail: `--color-${hue3}-contrast on -base = ${contrast2(base, contrastStop).toFixed(2)}`\n };\n }\n if (spec2 !== \"white\" && spec2 !== \"black\") {\n const subtle = ctx.register[`--color-${hue3}-subtle`];\n const strong = ctx.register[`--color-${hue3}-strong`];\n if (subtle && strong && contrast2(subtle, strong) < AA - 0.01) {\n return {\n name: \"palette ramps monotonic in OKLCH lightness\",\n ok: false,\n detail: `--color-${hue3}-strong on -subtle = ${contrast2(subtle, strong).toFixed(2)}`\n };\n }\n }\n if (typeof spec2 === \"object\" && base) {\n const o = toOklchColor(base);\n if (o.c >= HUE_STABLE_CHROMA) {\n let dh = Math.abs(o.h - spec2.h) % 360;\n if (dh > 180)\n dh = 360 - dh;\n if (dh > 20) {\n return {\n name: \"palette ramps monotonic in OKLCH lightness\",\n ok: false,\n detail: `--color-${hue3}-base h=${o.h.toFixed(1)} strayed from ${spec2.h}`\n };\n }\n }\n }\n }\n return { name: \"palette ramps monotonic in OKLCH lightness\", ok: true };\n },\n (ctx) => {\n const name = \"every tone family clears AA (fg on solid, text on bg)\";\n for (const tone of FULL_TONES) {\n const solid = ctx.register[`--${tone}`];\n const fg = ctx.register[`--${tone}-fg`];\n const bg = ctx.register[`--${tone}-bg`];\n const text = ctx.register[`--${tone}-text`];\n if (!solid || !fg || !bg || !text) {\n return { name, ok: false, detail: `--${tone} family is incomplete` };\n }\n if (contrast2(solid, fg) < AA - 0.01) {\n return { name, ok: false, detail: `--${tone}-fg on --${tone} = ${contrast2(solid, fg).toFixed(2)}` };\n }\n if (contrast2(bg, text) < AA - 0.01) {\n return { name, ok: false, detail: `--${tone}-text on --${tone}-bg = ${contrast2(bg, text).toFixed(2)}` };\n }\n }\n return { name, ok: true };\n },\n (ctx) => {\n const name = \"code palette readable on --code-bg\";\n const codeBg = ctx.register[\"--code-bg\"];\n if (!codeBg)\n return { name, ok: false, detail: \"--code-bg missing\" };\n const readFloor = achievableFloor(AA, codeBg);\n const commentFloor = achievableFloor(3, codeBg);\n for (const role of [...CODE_VIVID_ROLES, \"operator\"]) {\n const v = ctx.register[`--code-${role}`];\n const ratio = v ? contrast2(v, codeBg) : 0;\n if (ratio < readFloor - 0.05) {\n return { name, ok: false, detail: `--code-${role} on --code-bg = ${ratio.toFixed(2)} (floor ${readFloor.toFixed(2)})` };\n }\n }\n const commentRatio = contrast2(ctx.register[\"--code-comment\"] ?? \"#000\", codeBg);\n if (commentRatio < commentFloor - 0.05) {\n return { name, ok: false, detail: `--code-comment on --code-bg = ${commentRatio.toFixed(2)} (floor ${commentFloor.toFixed(2)})` };\n }\n return { name, ok: true };\n },\n (ctx) => {\n const name = \"code scopes mutually distinguishable\";\n const MIN_DE = 6e-3;\n const distinct = [...CODE_VIVID_ROLES, \"comment\"].map((r2) => `--code-${r2}`);\n for (let i = 0; i < distinct.length; i++) {\n for (let j = i + 1; j < distinct.length; j++) {\n const ni = distinct[i];\n const nj = distinct[j];\n const a = ctx.register[ni];\n const b = ctx.register[nj];\n if (!a || !b)\n continue;\n const d = oklabDist(a, b);\n if (d < MIN_DE) {\n return { name, ok: false, detail: `${ni} vs ${nj} \\u0394E=${d.toFixed(4)} (min ${MIN_DE})` };\n }\n }\n }\n return { name, ok: true };\n },\n (ctx) => {\n const name = \"status roles mutually distinguishable\";\n const MIN_DE = 0.02;\n const roles = Object.keys(STATUS_TO_HUE).map((r2) => `--${r2}`);\n for (let i = 0; i < roles.length; i++) {\n for (let j = i + 1; j < roles.length; j++) {\n const ni = roles[i];\n const nj = roles[j];\n const a = ctx.register[ni];\n const b = ctx.register[nj];\n if (!a || !b)\n continue;\n const d = oklabDist(a, b);\n if (d < MIN_DE) {\n return { name, ok: false, detail: `${ni} vs ${nj} \\u0394E=${d.toFixed(4)} (min ${MIN_DE})` };\n }\n }\n }\n return { name, ok: true };\n }\n ];\n }\n var PRODUCED_TOKENS = PRODUCES;\n var TOKEN_CATEGORIES = CATEGORIES;\n var SHARED_KNOBS = [\n \"scheme\",\n \"accentShiftStep\",\n \"accentSplit\",\n \"contrastBand\",\n \"vibrancy\",\n \"typeScale\",\n \"radiusScale\",\n \"density\",\n \"cues\",\n \"fonts\",\n \"anchors\"\n ];\n var DEFAULT_ANCHORS = {\n bg: \"#0f1115\",\n fg: \"#e8eaed\"\n };\n\n // packages/xtyle/dist/authoring.js\n function toLineage(nodes) {\n return nodes.map(({ name, value, refs }) => refs && refs.length ? { name, value, refs } : { name, value });\n }\n function registerExports(graph, traced, manifest, invariants) {\n xript.exports.register(\"graph\", (...args) => toLineage(graph(args[0] ?? {})));\n xript.exports.register(\"traced\", (...args) => traced(args[0] ?? {}));\n xript.exports.register(\"manifest\", () => ({ ...manifest, invariantCount: invariants.length }));\n xript.exports.register(\"invariants\", (...args) => invariants.map((invariant) => invariant(args[0])));\n }\n function tracePreset(preset, buildPasses, input) {\n return runPipeline(buildPasses(preset, input), (passIndex) => buildPassContext(preset, input, passIndex)).trace;\n }\n function toPreset(spec2) {\n const chroma = spec2.chroma ?? {};\n const elevation = spec2.elevation ?? {};\n const contrast3 = spec2.contrast ?? {};\n const preset = {\n id: spec2.id,\n knobs: spec2.knobs ?? SHARED_KNOBS,\n // Merge over the full default so a spec that names only some anchors (e.g. just `bg` and\n // `accent`) still yields a complete `bg`/`fg` default — derivation reads both, so a partial\n // `defaultAnchors` would crash when invoked with no anchor overrides.\n defaultAnchors: spec2.anchors ? { ...DEFAULT_ANCHORS, ...spec2.anchors } : DEFAULT_ANCHORS,\n contrastFloor: contrast3.floor ?? 4.7,\n declaredTextOnFillFloor: contrast3.textOnFill ?? 4.5,\n defaultVibrancy: spec2.vibrancy ?? 0.5,\n accentChromaMul: chroma.accent ?? 1,\n statusChromaMul: chroma.status ?? 1,\n paletteChromaMul: chroma.palette ?? 1,\n neutralChroma: chroma.neutral ?? 0.01,\n elevationStrengthMul: elevation.strength ?? 1,\n elevationAlphaBoost: elevation.alphaBoost ?? 0,\n accentTintChromaMul: chroma.accentTint ?? 0.3\n };\n if (spec2.extreme)\n preset.extreme = true;\n return preset;\n }\n function defineXtyleAlgorithm(spec2) {\n const preset = toPreset(spec2);\n const buildPasses = spec2.passes ?? ((p4, input) => [settlePass(p4, input)]);\n const singlePass = buildPasses(preset, {}).length === 1;\n const finalNodes = (input) => singlePass ? buildGraph(preset, input) : registerToNodes(runPipeline(buildPasses(preset, input), (passIndex) => buildPassContext(preset, input, passIndex)).register);\n registerExports(finalNodes, (input) => tracePreset(preset, buildPasses, input), {\n produces: PRODUCED_TOKENS,\n categories: TOKEN_CATEGORIES,\n knobs: preset.knobs,\n passNames: buildPasses(preset, {}).map((pass) => pass.name)\n }, makeInvariants(preset));\n }\n\n // algorithms/xtyle-default/src/preset.ts\n var spec = { id: \"xtyle-default\" };\n\n // algorithms/xtyle-default/src/mod.ts\n defineXtyleAlgorithm(spec);\n})();\n" }, "xtyle-hc": { "manifest": { "$schema": "https://xript.dev/schema/mod-manifest/v0.7.json", "xript": "0.7", "name": "xtyle-hc", "version": "0.1.0", "title": "Xtyle High Contrast", "family": "xtyle", "capabilities": ["color-math"], "entry": { "script": "src/mod.js", "format": "script", "exports": { "graph": { "description": "Token lineage nodes for anchors+knobs.", "params": [{ "name": "input", "type": "DeriveInput" }], "returns": { "array": "TokenNode" } }, "traced": { "description": "Per-pass register snapshots for anchors+knobs.", "params": [{ "name": "input", "type": "DeriveInput" }], "returns": { "array": "TraceSnapshot" } }, "manifest": { "description": "produces + categories + knobs.", "returns": "AlgorithmManifest" }, "invariants": { "description": "Evaluate per-algorithm invariants.", "params": [{ "name": "ctx", "type": "map" }], "returns": { "array": "InvariantResult" } } } } }, "source": "(() => {\n var __defProp = Object.defineProperty;\n var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\n var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\n\n // node_modules/culori/src/rgb/parseNumber.js\n var parseNumber = (color, len) => {\n if (typeof color !== \"number\") return;\n if (len === 3) {\n return {\n mode: \"rgb\",\n r: (color >> 8 & 15 | color >> 4 & 240) / 255,\n g: (color >> 4 & 15 | color & 240) / 255,\n b: (color & 15 | color << 4 & 240) / 255\n };\n }\n if (len === 4) {\n return {\n mode: \"rgb\",\n r: (color >> 12 & 15 | color >> 8 & 240) / 255,\n g: (color >> 8 & 15 | color >> 4 & 240) / 255,\n b: (color >> 4 & 15 | color & 240) / 255,\n alpha: (color & 15 | color << 4 & 240) / 255\n };\n }\n if (len === 6) {\n return {\n mode: \"rgb\",\n r: (color >> 16 & 255) / 255,\n g: (color >> 8 & 255) / 255,\n b: (color & 255) / 255\n };\n }\n if (len === 8) {\n return {\n mode: \"rgb\",\n r: (color >> 24 & 255) / 255,\n g: (color >> 16 & 255) / 255,\n b: (color >> 8 & 255) / 255,\n alpha: (color & 255) / 255\n };\n }\n };\n var parseNumber_default = parseNumber;\n\n // node_modules/culori/src/colors/named.js\n var named = {\n aliceblue: 15792383,\n antiquewhite: 16444375,\n aqua: 65535,\n aquamarine: 8388564,\n azure: 15794175,\n beige: 16119260,\n bisque: 16770244,\n black: 0,\n blanchedalmond: 16772045,\n blue: 255,\n blueviolet: 9055202,\n brown: 10824234,\n burlywood: 14596231,\n cadetblue: 6266528,\n chartreuse: 8388352,\n chocolate: 13789470,\n coral: 16744272,\n cornflowerblue: 6591981,\n cornsilk: 16775388,\n crimson: 14423100,\n cyan: 65535,\n darkblue: 139,\n darkcyan: 35723,\n darkgoldenrod: 12092939,\n darkgray: 11119017,\n darkgreen: 25600,\n darkgrey: 11119017,\n darkkhaki: 12433259,\n darkmagenta: 9109643,\n darkolivegreen: 5597999,\n darkorange: 16747520,\n darkorchid: 10040012,\n darkred: 9109504,\n darksalmon: 15308410,\n darkseagreen: 9419919,\n darkslateblue: 4734347,\n darkslategray: 3100495,\n darkslategrey: 3100495,\n darkturquoise: 52945,\n darkviolet: 9699539,\n deeppink: 16716947,\n deepskyblue: 49151,\n dimgray: 6908265,\n dimgrey: 6908265,\n dodgerblue: 2003199,\n firebrick: 11674146,\n floralwhite: 16775920,\n forestgreen: 2263842,\n fuchsia: 16711935,\n gainsboro: 14474460,\n ghostwhite: 16316671,\n gold: 16766720,\n goldenrod: 14329120,\n gray: 8421504,\n green: 32768,\n greenyellow: 11403055,\n grey: 8421504,\n honeydew: 15794160,\n hotpink: 16738740,\n indianred: 13458524,\n indigo: 4915330,\n ivory: 16777200,\n khaki: 15787660,\n lavender: 15132410,\n lavenderblush: 16773365,\n lawngreen: 8190976,\n lemonchiffon: 16775885,\n lightblue: 11393254,\n lightcoral: 15761536,\n lightcyan: 14745599,\n lightgoldenrodyellow: 16448210,\n lightgray: 13882323,\n lightgreen: 9498256,\n lightgrey: 13882323,\n lightpink: 16758465,\n lightsalmon: 16752762,\n lightseagreen: 2142890,\n lightskyblue: 8900346,\n lightslategray: 7833753,\n lightslategrey: 7833753,\n lightsteelblue: 11584734,\n lightyellow: 16777184,\n lime: 65280,\n limegreen: 3329330,\n linen: 16445670,\n magenta: 16711935,\n maroon: 8388608,\n mediumaquamarine: 6737322,\n mediumblue: 205,\n mediumorchid: 12211667,\n mediumpurple: 9662683,\n mediumseagreen: 3978097,\n mediumslateblue: 8087790,\n mediumspringgreen: 64154,\n mediumturquoise: 4772300,\n mediumvioletred: 13047173,\n midnightblue: 1644912,\n mintcream: 16121850,\n mistyrose: 16770273,\n moccasin: 16770229,\n navajowhite: 16768685,\n navy: 128,\n oldlace: 16643558,\n olive: 8421376,\n olivedrab: 7048739,\n orange: 16753920,\n orangered: 16729344,\n orchid: 14315734,\n palegoldenrod: 15657130,\n palegreen: 10025880,\n paleturquoise: 11529966,\n palevioletred: 14381203,\n papayawhip: 16773077,\n peachpuff: 16767673,\n peru: 13468991,\n pink: 16761035,\n plum: 14524637,\n powderblue: 11591910,\n purple: 8388736,\n // Added in CSS Colors Level 4:\n // https://drafts.csswg.org/css-color/#changes-from-3\n rebeccapurple: 6697881,\n red: 16711680,\n rosybrown: 12357519,\n royalblue: 4286945,\n saddlebrown: 9127187,\n salmon: 16416882,\n sandybrown: 16032864,\n seagreen: 3050327,\n seashell: 16774638,\n sienna: 10506797,\n silver: 12632256,\n skyblue: 8900331,\n slateblue: 6970061,\n slategray: 7372944,\n slategrey: 7372944,\n snow: 16775930,\n springgreen: 65407,\n steelblue: 4620980,\n tan: 13808780,\n teal: 32896,\n thistle: 14204888,\n tomato: 16737095,\n turquoise: 4251856,\n violet: 15631086,\n wheat: 16113331,\n white: 16777215,\n whitesmoke: 16119285,\n yellow: 16776960,\n yellowgreen: 10145074\n };\n var named_default = named;\n\n // node_modules/culori/src/rgb/parseNamed.js\n var parseNamed = (color) => {\n return parseNumber_default(named_default[color.toLowerCase()], 6);\n };\n var parseNamed_default = parseNamed;\n\n // node_modules/culori/src/rgb/parseHex.js\n var hex = /^#?([0-9a-f]{8}|[0-9a-f]{6}|[0-9a-f]{4}|[0-9a-f]{3})$/i;\n var parseHex = (color) => {\n let match;\n return (match = color.match(hex)) ? parseNumber_default(parseInt(match[1], 16), match[1].length) : void 0;\n };\n var parseHex_default = parseHex;\n\n // node_modules/culori/src/util/regex.js\n var num = \"([+-]?\\\\d*\\\\.?\\\\d+(?:[eE][+-]?\\\\d+)?)\";\n var num_none = `(?:${num}|none)`;\n var per = `${num}%`;\n var per_none = `(?:${num}%|none)`;\n var num_per = `(?:${num}%|${num})`;\n var num_per_none = `(?:${num}%|${num}|none)`;\n var hue = `(?:${num}(deg|grad|rad|turn)|${num})`;\n var hue_none = `(?:${num}(deg|grad|rad|turn)|${num}|none)`;\n var c = `\\\\s*,\\\\s*`;\n var rx_num_per_none = new RegExp(\"^\" + num_per_none + \"$\");\n\n // node_modules/culori/src/rgb/parseRgbLegacy.js\n var rgb_num_old = new RegExp(\n `^rgba?\\\\(\\\\s*${num}${c}${num}${c}${num}\\\\s*(?:,\\\\s*${num_per}\\\\s*)?\\\\)$`\n );\n var rgb_per_old = new RegExp(\n `^rgba?\\\\(\\\\s*${per}${c}${per}${c}${per}\\\\s*(?:,\\\\s*${num_per}\\\\s*)?\\\\)$`\n );\n var parseRgbLegacy = (color) => {\n let res = { mode: \"rgb\" };\n let match;\n if (match = color.match(rgb_num_old)) {\n if (match[1] !== void 0) {\n res.r = match[1] / 255;\n }\n if (match[2] !== void 0) {\n res.g = match[2] / 255;\n }\n if (match[3] !== void 0) {\n res.b = match[3] / 255;\n }\n } else if (match = color.match(rgb_per_old)) {\n if (match[1] !== void 0) {\n res.r = match[1] / 100;\n }\n if (match[2] !== void 0) {\n res.g = match[2] / 100;\n }\n if (match[3] !== void 0) {\n res.b = match[3] / 100;\n }\n } else {\n return void 0;\n }\n if (match[4] !== void 0) {\n res.alpha = Math.max(0, Math.min(1, match[4] / 100));\n } else if (match[5] !== void 0) {\n res.alpha = Math.max(0, Math.min(1, +match[5]));\n }\n return res;\n };\n var parseRgbLegacy_default = parseRgbLegacy;\n\n // node_modules/culori/src/_prepare.js\n var prepare = (color, mode) => color === void 0 ? void 0 : typeof color !== \"object\" ? parse_default(color) : color.mode !== void 0 ? color : mode ? { ...color, mode } : void 0;\n var prepare_default = prepare;\n\n // node_modules/culori/src/converter.js\n var converter = (target_mode = \"rgb\") => (color) => (color = prepare_default(color, target_mode)) !== void 0 ? (\n // if the color's mode corresponds to our target mode\n color.mode === target_mode ? (\n // then just return the color\n color\n ) : (\n // otherwise check to see if we have a dedicated\n // converter for the target mode\n converters[color.mode][target_mode] ? (\n // and return its result...\n converters[color.mode][target_mode](color)\n ) : (\n // ...otherwise pass through RGB as an intermediary step.\n // if the target mode is RGB...\n target_mode === \"rgb\" ? (\n // just return the RGB\n converters[color.mode].rgb(color)\n ) : (\n // otherwise convert color.mode -> RGB -> target_mode\n converters.rgb[target_mode](converters[color.mode].rgb(color))\n )\n )\n )\n ) : void 0;\n var converter_default = converter;\n\n // node_modules/culori/src/modes.js\n var converters = {};\n var modes = {};\n var parsers = [];\n var colorProfiles = {};\n var identity = (v) => v;\n var useMode = (definition29) => {\n converters[definition29.mode] = {\n ...converters[definition29.mode],\n ...definition29.toMode\n };\n Object.keys(definition29.fromMode || {}).forEach((k4) => {\n if (!converters[k4]) {\n converters[k4] = {};\n }\n converters[k4][definition29.mode] = definition29.fromMode[k4];\n });\n if (!definition29.ranges) {\n definition29.ranges = {};\n }\n if (!definition29.difference) {\n definition29.difference = {};\n }\n definition29.channels.forEach((channel) => {\n if (definition29.ranges[channel] === void 0) {\n definition29.ranges[channel] = [0, 1];\n }\n if (!definition29.interpolate[channel]) {\n throw new Error(`Missing interpolator for: ${channel}`);\n }\n if (typeof definition29.interpolate[channel] === \"function\") {\n definition29.interpolate[channel] = {\n use: definition29.interpolate[channel]\n };\n }\n if (!definition29.interpolate[channel].fixup) {\n definition29.interpolate[channel].fixup = identity;\n }\n });\n modes[definition29.mode] = definition29;\n (definition29.parse || []).forEach((parser) => {\n useParser(parser, definition29.mode);\n });\n return converter_default(definition29.mode);\n };\n var getMode = (mode) => modes[mode];\n var useParser = (parser, mode) => {\n if (typeof parser === \"string\") {\n if (!mode) {\n throw new Error(`'mode' required when 'parser' is a string`);\n }\n colorProfiles[parser] = mode;\n } else if (typeof parser === \"function\") {\n if (parsers.indexOf(parser) < 0) {\n parsers.push(parser);\n }\n }\n };\n\n // node_modules/culori/src/parse.js\n var IdentStartCodePoint = /[^\\x00-\\x7F]|[a-zA-Z_]/;\n var IdentCodePoint = /[^\\x00-\\x7F]|[-\\w]/;\n var Tok = {\n Function: \"function\",\n Ident: \"ident\",\n Number: \"number\",\n Percentage: \"percentage\",\n ParenClose: \")\",\n None: \"none\",\n Hue: \"hue\",\n Alpha: \"alpha\"\n };\n var _i = 0;\n function is_num(chars) {\n let ch = chars[_i];\n let ch1 = chars[_i + 1];\n if (ch === \"-\" || ch === \"+\") {\n return /\\d/.test(ch1) || ch1 === \".\" && /\\d/.test(chars[_i + 2]);\n }\n if (ch === \".\") {\n return /\\d/.test(ch1);\n }\n return /\\d/.test(ch);\n }\n function is_ident(chars) {\n if (_i >= chars.length) {\n return false;\n }\n let ch = chars[_i];\n if (IdentStartCodePoint.test(ch)) {\n return true;\n }\n if (ch === \"-\") {\n if (chars.length - _i < 2) {\n return false;\n }\n let ch1 = chars[_i + 1];\n if (ch1 === \"-\" || IdentStartCodePoint.test(ch1)) {\n return true;\n }\n return false;\n }\n return false;\n }\n var huenits = {\n deg: 1,\n rad: 180 / Math.PI,\n grad: 9 / 10,\n turn: 360\n };\n function num2(chars) {\n let value = \"\";\n if (chars[_i] === \"-\" || chars[_i] === \"+\") {\n value += chars[_i++];\n }\n value += digits(chars);\n if (chars[_i] === \".\" && /\\d/.test(chars[_i + 1])) {\n value += chars[_i++] + digits(chars);\n }\n if (chars[_i] === \"e\" || chars[_i] === \"E\") {\n if ((chars[_i + 1] === \"-\" || chars[_i + 1] === \"+\") && /\\d/.test(chars[_i + 2])) {\n value += chars[_i++] + chars[_i++] + digits(chars);\n } else if (/\\d/.test(chars[_i + 1])) {\n value += chars[_i++] + digits(chars);\n }\n }\n if (is_ident(chars)) {\n let id = ident(chars);\n if (id === \"deg\" || id === \"rad\" || id === \"turn\" || id === \"grad\") {\n return { type: Tok.Hue, value: value * huenits[id] };\n }\n return void 0;\n }\n if (chars[_i] === \"%\") {\n _i++;\n return { type: Tok.Percentage, value: +value };\n }\n return { type: Tok.Number, value: +value };\n }\n function digits(chars) {\n let v = \"\";\n while (/\\d/.test(chars[_i])) {\n v += chars[_i++];\n }\n return v;\n }\n function ident(chars) {\n let v = \"\";\n while (_i < chars.length && IdentCodePoint.test(chars[_i])) {\n v += chars[_i++];\n }\n return v;\n }\n function identlike(chars) {\n let v = ident(chars);\n if (chars[_i] === \"(\") {\n _i++;\n return { type: Tok.Function, value: v };\n }\n if (v === \"none\") {\n return { type: Tok.None, value: void 0 };\n }\n return { type: Tok.Ident, value: v };\n }\n function tokenize(str = \"\") {\n let chars = str.trim();\n let tokens = [];\n let ch;\n _i = 0;\n while (_i < chars.length) {\n ch = chars[_i++];\n if (ch === \"\\n\" || ch === \"\t\" || ch === \" \") {\n while (_i < chars.length && (chars[_i] === \"\\n\" || chars[_i] === \"\t\" || chars[_i] === \" \")) {\n _i++;\n }\n continue;\n }\n if (ch === \",\") {\n return void 0;\n }\n if (ch === \")\") {\n tokens.push({ type: Tok.ParenClose });\n continue;\n }\n if (ch === \"+\") {\n _i--;\n if (is_num(chars)) {\n tokens.push(num2(chars));\n continue;\n }\n return void 0;\n }\n if (ch === \"-\") {\n _i--;\n if (is_num(chars)) {\n tokens.push(num2(chars));\n continue;\n }\n if (is_ident(chars)) {\n tokens.push({ type: Tok.Ident, value: ident(chars) });\n continue;\n }\n return void 0;\n }\n if (ch === \".\") {\n _i--;\n if (is_num(chars)) {\n tokens.push(num2(chars));\n continue;\n }\n return void 0;\n }\n if (ch === \"/\") {\n while (_i < chars.length && (chars[_i] === \"\\n\" || chars[_i] === \"\t\" || chars[_i] === \" \")) {\n _i++;\n }\n let alpha2;\n if (is_num(chars)) {\n alpha2 = num2(chars);\n if (alpha2.type !== Tok.Hue) {\n tokens.push({ type: Tok.Alpha, value: alpha2 });\n continue;\n }\n }\n if (is_ident(chars)) {\n if (ident(chars) === \"none\") {\n tokens.push({\n type: Tok.Alpha,\n value: { type: Tok.None, value: void 0 }\n });\n continue;\n }\n }\n return void 0;\n }\n if (/\\d/.test(ch)) {\n _i--;\n tokens.push(num2(chars));\n continue;\n }\n if (IdentStartCodePoint.test(ch)) {\n _i--;\n tokens.push(identlike(chars));\n continue;\n }\n return void 0;\n }\n return tokens;\n }\n function parseColorSyntax(tokens) {\n tokens._i = 0;\n let token = tokens[tokens._i++];\n if (!token || token.type !== Tok.Function || token.value !== \"color\") {\n return void 0;\n }\n token = tokens[tokens._i++];\n if (token.type !== Tok.Ident) {\n return void 0;\n }\n const mode = colorProfiles[token.value];\n if (!mode) {\n return void 0;\n }\n const res = { mode };\n const coords = consumeCoords(tokens, false);\n if (!coords) {\n return void 0;\n }\n const channels = getMode(mode).channels;\n for (let ii = 0, c2, ch; ii < channels.length; ii++) {\n c2 = coords[ii];\n ch = channels[ii];\n if (c2.type !== Tok.None) {\n res[ch] = c2.type === Tok.Number ? c2.value : c2.value / 100;\n if (ch === \"alpha\") {\n res[ch] = Math.max(0, Math.min(1, res[ch]));\n }\n }\n }\n return res;\n }\n function consumeCoords(tokens, includeHue) {\n const coords = [];\n let token;\n while (tokens._i < tokens.length) {\n token = tokens[tokens._i++];\n if (token.type === Tok.None || token.type === Tok.Number || token.type === Tok.Alpha || token.type === Tok.Percentage || includeHue && token.type === Tok.Hue) {\n coords.push(token);\n continue;\n }\n if (token.type === Tok.ParenClose) {\n if (tokens._i < tokens.length) {\n return void 0;\n }\n continue;\n }\n return void 0;\n }\n if (coords.length < 3 || coords.length > 4) {\n return void 0;\n }\n if (coords.length === 4) {\n if (coords[3].type !== Tok.Alpha) {\n return void 0;\n }\n coords[3] = coords[3].value;\n }\n if (coords.length === 3) {\n coords.push({ type: Tok.None, value: void 0 });\n }\n return coords.every((c2) => c2.type !== Tok.Alpha) ? coords : void 0;\n }\n function parseModernSyntax(tokens, includeHue) {\n tokens._i = 0;\n let token = tokens[tokens._i++];\n if (!token || token.type !== Tok.Function) {\n return void 0;\n }\n let coords = consumeCoords(tokens, includeHue);\n if (!coords) {\n return void 0;\n }\n coords.unshift(token.value);\n return coords;\n }\n var parse = (color) => {\n if (typeof color !== \"string\") {\n return void 0;\n }\n const tokens = tokenize(color);\n const parsed = tokens ? parseModernSyntax(tokens, true) : void 0;\n let result = void 0;\n let i = 0;\n let len = parsers.length;\n while (i < len) {\n if ((result = parsers[i++](color, parsed)) !== void 0) {\n return result;\n }\n }\n return tokens ? parseColorSyntax(tokens) : void 0;\n };\n var parse_default = parse;\n\n // node_modules/culori/src/rgb/parseRgb.js\n function parseRgb(color, parsed) {\n if (!parsed || parsed[0] !== \"rgb\" && parsed[0] !== \"rgba\") {\n return void 0;\n }\n const res = { mode: \"rgb\" };\n const [, r2, g, b, alpha2] = parsed;\n if (r2.type === Tok.Hue || g.type === Tok.Hue || b.type === Tok.Hue) {\n return void 0;\n }\n if (r2.type !== Tok.None) {\n res.r = r2.type === Tok.Number ? r2.value / 255 : r2.value / 100;\n }\n if (g.type !== Tok.None) {\n res.g = g.type === Tok.Number ? g.value / 255 : g.value / 100;\n }\n if (b.type !== Tok.None) {\n res.b = b.type === Tok.Number ? b.value / 255 : b.value / 100;\n }\n if (alpha2.type !== Tok.None) {\n res.alpha = Math.min(\n 1,\n Math.max(\n 0,\n alpha2.type === Tok.Number ? alpha2.value : alpha2.value / 100\n )\n );\n }\n return res;\n }\n var parseRgb_default = parseRgb;\n\n // node_modules/culori/src/rgb/parseTransparent.js\n var parseTransparent = (c2) => c2 === \"transparent\" ? { mode: \"rgb\", r: 0, g: 0, b: 0, alpha: 0 } : void 0;\n var parseTransparent_default = parseTransparent;\n\n // node_modules/culori/src/interpolate/lerp.js\n var lerp = (a, b, t) => a + t * (b - a);\n\n // node_modules/culori/src/interpolate/piecewise.js\n var get_classes = (arr) => {\n let classes = [];\n for (let i = 0; i < arr.length - 1; i++) {\n let a = arr[i];\n let b = arr[i + 1];\n if (a === void 0 && b === void 0) {\n classes.push(void 0);\n } else if (a !== void 0 && b !== void 0) {\n classes.push([a, b]);\n } else {\n classes.push(a !== void 0 ? [a, a] : [b, b]);\n }\n }\n return classes;\n };\n var interpolatorPiecewise = (interpolator) => (arr) => {\n let classes = get_classes(arr);\n return (t) => {\n let cls = t * classes.length;\n let idx = t >= 1 ? classes.length - 1 : Math.max(Math.floor(cls), 0);\n let pair = classes[idx];\n return pair === void 0 ? void 0 : interpolator(pair[0], pair[1], cls - idx);\n };\n };\n\n // node_modules/culori/src/interpolate/linear.js\n var interpolatorLinear = interpolatorPiecewise(lerp);\n\n // node_modules/culori/src/fixup/alpha.js\n var fixupAlpha = (arr) => {\n let some_defined = false;\n let res = arr.map((v) => {\n if (v !== void 0) {\n some_defined = true;\n return v;\n }\n return 1;\n });\n return some_defined ? res : arr;\n };\n\n // node_modules/culori/src/rgb/definition.js\n var definition = {\n mode: \"rgb\",\n channels: [\"r\", \"g\", \"b\", \"alpha\"],\n parse: [\n parseRgb_default,\n parseHex_default,\n parseRgbLegacy_default,\n parseNamed_default,\n parseTransparent_default,\n \"srgb\"\n ],\n serialize: \"srgb\",\n interpolate: {\n r: interpolatorLinear,\n g: interpolatorLinear,\n b: interpolatorLinear,\n alpha: { use: interpolatorLinear, fixup: fixupAlpha }\n },\n gamut: true,\n white: { r: 1, g: 1, b: 1 },\n black: { r: 0, g: 0, b: 0 }\n };\n var definition_default = definition;\n\n // node_modules/culori/src/a98/convertA98ToXyz65.js\n var linearize = (v = 0) => Math.pow(Math.abs(v), 563 / 256) * Math.sign(v);\n var convertA98ToXyz65 = (a982) => {\n let r2 = linearize(a982.r);\n let g = linearize(a982.g);\n let b = linearize(a982.b);\n let res = {\n mode: \"xyz65\",\n x: 0.5766690429101305 * r2 + 0.1855582379065463 * g + 0.1882286462349947 * b,\n y: 0.297344975250536 * r2 + 0.6273635662554661 * g + 0.0752914584939979 * b,\n z: 0.0270313613864123 * r2 + 0.0706888525358272 * g + 0.9913375368376386 * b\n };\n if (a982.alpha !== void 0) {\n res.alpha = a982.alpha;\n }\n return res;\n };\n var convertA98ToXyz65_default = convertA98ToXyz65;\n\n // node_modules/culori/src/a98/convertXyz65ToA98.js\n var gamma = (v) => Math.pow(Math.abs(v), 256 / 563) * Math.sign(v);\n var convertXyz65ToA98 = ({ x, y, z, alpha: alpha2 }) => {\n if (x === void 0) x = 0;\n if (y === void 0) y = 0;\n if (z === void 0) z = 0;\n let res = {\n mode: \"a98\",\n r: gamma(\n x * 2.0415879038107465 - y * 0.5650069742788597 - 0.3447313507783297 * z\n ),\n g: gamma(\n x * -0.9692436362808798 + y * 1.8759675015077206 + 0.0415550574071756 * z\n ),\n b: gamma(\n x * 0.0134442806320312 - y * 0.1183623922310184 + 1.0151749943912058 * z\n )\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertXyz65ToA98_default = convertXyz65ToA98;\n\n // node_modules/culori/src/lrgb/convertRgbToLrgb.js\n var fn = (c2 = 0) => {\n const abs2 = Math.abs(c2);\n if (abs2 <= 0.04045) {\n return c2 / 12.92;\n }\n return (Math.sign(c2) || 1) * Math.pow((abs2 + 0.055) / 1.055, 2.4);\n };\n var convertRgbToLrgb = ({ r: r2, g, b, alpha: alpha2 }) => {\n let res = {\n mode: \"lrgb\",\n r: fn(r2),\n g: fn(g),\n b: fn(b)\n };\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n };\n var convertRgbToLrgb_default = convertRgbToLrgb;\n\n // node_modules/culori/src/xyz65/convertRgbToXyz65.js\n var convertRgbToXyz65 = (rgb4) => {\n let { r: r2, g, b, alpha: alpha2 } = convertRgbToLrgb_default(rgb4);\n let res = {\n mode: \"xyz65\",\n x: 0.4123907992659593 * r2 + 0.357584339383878 * g + 0.1804807884018343 * b,\n y: 0.2126390058715102 * r2 + 0.715168678767756 * g + 0.0721923153607337 * b,\n z: 0.0193308187155918 * r2 + 0.119194779794626 * g + 0.9505321522496607 * b\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertRgbToXyz65_default = convertRgbToXyz65;\n\n // node_modules/culori/src/lrgb/convertLrgbToRgb.js\n var fn2 = (c2 = 0) => {\n const abs2 = Math.abs(c2);\n if (abs2 > 31308e-7) {\n return (Math.sign(c2) || 1) * (1.055 * Math.pow(abs2, 1 / 2.4) - 0.055);\n }\n return c2 * 12.92;\n };\n var convertLrgbToRgb = ({ r: r2, g, b, alpha: alpha2 }, mode = \"rgb\") => {\n let res = {\n mode,\n r: fn2(r2),\n g: fn2(g),\n b: fn2(b)\n };\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n };\n var convertLrgbToRgb_default = convertLrgbToRgb;\n\n // node_modules/culori/src/xyz65/convertXyz65ToRgb.js\n var convertXyz65ToRgb = ({ x, y, z, alpha: alpha2 }) => {\n if (x === void 0) x = 0;\n if (y === void 0) y = 0;\n if (z === void 0) z = 0;\n let res = convertLrgbToRgb_default({\n r: x * 3.2409699419045226 - y * 1.537383177570094 - 0.4986107602930034 * z,\n g: x * -0.9692436362808796 + y * 1.8759675015077204 + 0.0415550574071756 * z,\n b: x * 0.0556300796969936 - y * 0.2039769588889765 + 1.0569715142428784 * z\n });\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertXyz65ToRgb_default = convertXyz65ToRgb;\n\n // node_modules/culori/src/a98/definition.js\n var definition2 = {\n ...definition_default,\n mode: \"a98\",\n parse: [\"a98-rgb\"],\n serialize: \"a98-rgb\",\n fromMode: {\n rgb: (color) => convertXyz65ToA98_default(convertRgbToXyz65_default(color)),\n xyz65: convertXyz65ToA98_default\n },\n toMode: {\n rgb: (color) => convertXyz65ToRgb_default(convertA98ToXyz65_default(color)),\n xyz65: convertA98ToXyz65_default\n }\n };\n var definition_default2 = definition2;\n\n // node_modules/culori/src/util/normalizeHue.js\n var normalizeHue = (hue3) => (hue3 = hue3 % 360) < 0 ? hue3 + 360 : hue3;\n var normalizeHue_default = normalizeHue;\n\n // node_modules/culori/src/fixup/hue.js\n var hue2 = (hues, fn5) => {\n return hues.map((hue3, idx, arr) => {\n if (hue3 === void 0) {\n return hue3;\n }\n let normalized = normalizeHue_default(hue3);\n if (idx === 0 || hues[idx - 1] === void 0) {\n return normalized;\n }\n return fn5(normalized - normalizeHue_default(arr[idx - 1]));\n }).reduce((acc, curr) => {\n if (!acc.length || curr === void 0 || acc[acc.length - 1] === void 0) {\n acc.push(curr);\n return acc;\n }\n acc.push(curr + acc[acc.length - 1]);\n return acc;\n }, []);\n };\n var fixupHueShorter = (arr) => hue2(arr, (d) => Math.abs(d) <= 180 ? d : d - 360 * Math.sign(d));\n\n // node_modules/culori/src/cubehelix/constants.js\n var M = [-0.14861, 1.78277, -0.29227, -0.90649, 1.97294, 0];\n var degToRad = Math.PI / 180;\n var radToDeg = 180 / Math.PI;\n\n // node_modules/culori/src/cubehelix/convertRgbToCubehelix.js\n var DE = M[3] * M[4];\n var BE = M[1] * M[4];\n var BCAD = M[1] * M[2] - M[0] * M[3];\n var convertRgbToCubehelix = ({ r: r2, g, b, alpha: alpha2 }) => {\n if (r2 === void 0) r2 = 0;\n if (g === void 0) g = 0;\n if (b === void 0) b = 0;\n let l = (BCAD * b + r2 * DE - g * BE) / (BCAD + DE - BE);\n let x = b - l;\n let y = (M[4] * (g - l) - M[2] * x) / M[3];\n let res = {\n mode: \"cubehelix\",\n l,\n s: l === 0 || l === 1 ? void 0 : Math.sqrt(x * x + y * y) / (M[4] * l * (1 - l))\n };\n if (res.s) res.h = Math.atan2(y, x) * radToDeg - 120;\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n };\n var convertRgbToCubehelix_default = convertRgbToCubehelix;\n\n // node_modules/culori/src/cubehelix/convertCubehelixToRgb.js\n var convertCubehelixToRgb = ({ h, s, l, alpha: alpha2 }) => {\n let res = { mode: \"rgb\" };\n h = (h === void 0 ? 0 : h + 120) * degToRad;\n if (l === void 0) l = 0;\n let amp = s === void 0 ? 0 : s * l * (1 - l);\n let cosh = Math.cos(h);\n let sinh = Math.sin(h);\n res.r = l + amp * (M[0] * cosh + M[1] * sinh);\n res.g = l + amp * (M[2] * cosh + M[3] * sinh);\n res.b = l + amp * (M[4] * cosh + M[5] * sinh);\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n };\n var convertCubehelixToRgb_default = convertCubehelixToRgb;\n\n // node_modules/culori/src/difference.js\n var differenceHueSaturation = (std, smp) => {\n if (std.h === void 0 || smp.h === void 0 || !std.s || !smp.s) {\n return 0;\n }\n let std_h = normalizeHue_default(std.h);\n let smp_h = normalizeHue_default(smp.h);\n let dH = Math.sin((smp_h - std_h + 360) / 2 * Math.PI / 180);\n return 2 * Math.sqrt(std.s * smp.s) * dH;\n };\n var differenceHueNaive = (std, smp) => {\n if (std.h === void 0 || smp.h === void 0) {\n return 0;\n }\n let std_h = normalizeHue_default(std.h);\n let smp_h = normalizeHue_default(smp.h);\n if (Math.abs(smp_h - std_h) > 180) {\n return std_h - (smp_h - 360 * Math.sign(smp_h - std_h));\n }\n return smp_h - std_h;\n };\n var differenceHueChroma = (std, smp) => {\n if (std.h === void 0 || smp.h === void 0 || !std.c || !smp.c) {\n return 0;\n }\n let std_h = normalizeHue_default(std.h);\n let smp_h = normalizeHue_default(smp.h);\n let dH = Math.sin((smp_h - std_h + 360) / 2 * Math.PI / 180);\n return 2 * Math.sqrt(std.c * smp.c) * dH;\n };\n\n // node_modules/culori/src/average.js\n var averageAngle = (val) => {\n let sum = val.reduce(\n (sum2, val2) => {\n if (val2 !== void 0) {\n let rad = val2 * Math.PI / 180;\n sum2.sin += Math.sin(rad);\n sum2.cos += Math.cos(rad);\n }\n return sum2;\n },\n { sin: 0, cos: 0 }\n );\n let angle = Math.atan2(sum.sin, sum.cos) * 180 / Math.PI;\n return angle < 0 ? 360 + angle : angle;\n };\n\n // node_modules/culori/src/cubehelix/definition.js\n var definition3 = {\n mode: \"cubehelix\",\n channels: [\"h\", \"s\", \"l\", \"alpha\"],\n parse: [\"--cubehelix\"],\n serialize: \"--cubehelix\",\n ranges: {\n h: [0, 360],\n s: [0, 4.614],\n l: [0, 1]\n },\n fromMode: {\n rgb: convertRgbToCubehelix_default\n },\n toMode: {\n rgb: convertCubehelixToRgb_default\n },\n interpolate: {\n h: {\n use: interpolatorLinear,\n fixup: fixupHueShorter\n },\n s: interpolatorLinear,\n l: interpolatorLinear,\n alpha: {\n use: interpolatorLinear,\n fixup: fixupAlpha\n }\n },\n difference: {\n h: differenceHueSaturation\n },\n average: {\n h: averageAngle\n }\n };\n var definition_default3 = definition3;\n\n // node_modules/culori/src/lch/convertLabToLch.js\n var convertLabToLch = ({ l, a, b, alpha: alpha2 }, mode = \"lch\") => {\n if (a === void 0) a = 0;\n if (b === void 0) b = 0;\n let c2 = Math.sqrt(a * a + b * b);\n let res = { mode, l, c: c2 };\n if (c2) res.h = normalizeHue_default(Math.atan2(b, a) * 180 / Math.PI);\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n };\n var convertLabToLch_default = convertLabToLch;\n\n // node_modules/culori/src/lch/convertLchToLab.js\n var convertLchToLab = ({ l, c: c2, h, alpha: alpha2 }, mode = \"lab\") => {\n if (h === void 0) h = 0;\n let res = {\n mode,\n l,\n a: c2 ? c2 * Math.cos(h / 180 * Math.PI) : 0,\n b: c2 ? c2 * Math.sin(h / 180 * Math.PI) : 0\n };\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n };\n var convertLchToLab_default = convertLchToLab;\n\n // node_modules/culori/src/xyz65/constants.js\n var k = Math.pow(29, 3) / Math.pow(3, 3);\n var e = Math.pow(6, 3) / Math.pow(29, 3);\n\n // node_modules/culori/src/constants.js\n var D50 = {\n X: 0.3457 / 0.3585,\n Y: 1,\n Z: (1 - 0.3457 - 0.3585) / 0.3585\n };\n var D65 = {\n X: 0.3127 / 0.329,\n Y: 1,\n Z: (1 - 0.3127 - 0.329) / 0.329\n };\n var k2 = Math.pow(29, 3) / Math.pow(3, 3);\n var e2 = Math.pow(6, 3) / Math.pow(29, 3);\n\n // node_modules/culori/src/lab65/convertLab65ToXyz65.js\n var fn3 = (v) => Math.pow(v, 3) > e ? Math.pow(v, 3) : (116 * v - 16) / k;\n var convertLab65ToXyz65 = ({ l, a, b, alpha: alpha2 }) => {\n if (l === void 0) l = 0;\n if (a === void 0) a = 0;\n if (b === void 0) b = 0;\n let fy = (l + 16) / 116;\n let fx = a / 500 + fy;\n let fz = fy - b / 200;\n let res = {\n mode: \"xyz65\",\n x: fn3(fx) * D65.X,\n y: fn3(fy) * D65.Y,\n z: fn3(fz) * D65.Z\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertLab65ToXyz65_default = convertLab65ToXyz65;\n\n // node_modules/culori/src/lab65/convertLab65ToRgb.js\n var convertLab65ToRgb = (lab2) => convertXyz65ToRgb_default(convertLab65ToXyz65_default(lab2));\n var convertLab65ToRgb_default = convertLab65ToRgb;\n\n // node_modules/culori/src/lab65/convertXyz65ToLab65.js\n var f = (value) => value > e ? Math.cbrt(value) : (k * value + 16) / 116;\n var convertXyz65ToLab65 = ({ x, y, z, alpha: alpha2 }) => {\n if (x === void 0) x = 0;\n if (y === void 0) y = 0;\n if (z === void 0) z = 0;\n let f0 = f(x / D65.X);\n let f1 = f(y / D65.Y);\n let f22 = f(z / D65.Z);\n let res = {\n mode: \"lab65\",\n l: 116 * f1 - 16,\n a: 500 * (f0 - f1),\n b: 200 * (f1 - f22)\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertXyz65ToLab65_default = convertXyz65ToLab65;\n\n // node_modules/culori/src/lab65/convertRgbToLab65.js\n var convertRgbToLab65 = (rgb4) => {\n let res = convertXyz65ToLab65_default(convertRgbToXyz65_default(rgb4));\n if (rgb4.r === rgb4.b && rgb4.b === rgb4.g) {\n res.a = res.b = 0;\n }\n return res;\n };\n var convertRgbToLab65_default = convertRgbToLab65;\n\n // node_modules/culori/src/dlch/constants.js\n var kE = 1;\n var kCH = 1;\n var \\u03B8 = 26 / 180 * Math.PI;\n var cos\\u03B8 = Math.cos(\\u03B8);\n var sin\\u03B8 = Math.sin(\\u03B8);\n var factor = 100 / Math.log(139 / 100);\n\n // node_modules/culori/src/dlch/convertDlchToLab65.js\n var convertDlchToLab65 = ({ l, c: c2, h, alpha: alpha2 }) => {\n if (l === void 0) l = 0;\n if (c2 === void 0) c2 = 0;\n if (h === void 0) h = 0;\n let res = {\n mode: \"lab65\",\n l: (Math.exp(l * kE / factor) - 1) / 39e-4\n };\n let G = (Math.exp(0.0435 * c2 * kCH * kE) - 1) / 0.075;\n let e4 = G * Math.cos(h / 180 * Math.PI - \\u03B8);\n let f3 = G * Math.sin(h / 180 * Math.PI - \\u03B8);\n res.a = e4 * cos\\u03B8 - f3 / 0.83 * sin\\u03B8;\n res.b = e4 * sin\\u03B8 + f3 / 0.83 * cos\\u03B8;\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n };\n var convertDlchToLab65_default = convertDlchToLab65;\n\n // node_modules/culori/src/dlch/convertLab65ToDlch.js\n var convertLab65ToDlch = ({ l, a, b, alpha: alpha2 }) => {\n if (l === void 0) l = 0;\n if (a === void 0) a = 0;\n if (b === void 0) b = 0;\n let e4 = a * cos\\u03B8 + b * sin\\u03B8;\n let f3 = 0.83 * (b * cos\\u03B8 - a * sin\\u03B8);\n let G = Math.sqrt(e4 * e4 + f3 * f3);\n let res = {\n mode: \"dlch\",\n l: factor / kE * Math.log(1 + 39e-4 * l),\n c: Math.log(1 + 0.075 * G) / (0.0435 * kCH * kE)\n };\n if (res.c) {\n res.h = normalizeHue_default((Math.atan2(f3, e4) + \\u03B8) / Math.PI * 180);\n }\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n };\n var convertLab65ToDlch_default = convertLab65ToDlch;\n\n // node_modules/culori/src/dlab/definition.js\n var convertDlabToLab65 = (c2) => convertDlchToLab65_default(convertLabToLch_default(c2, \"dlch\"));\n var convertLab65ToDlab = (c2) => convertLchToLab_default(convertLab65ToDlch_default(c2), \"dlab\");\n var definition4 = {\n mode: \"dlab\",\n parse: [\"--din99o-lab\"],\n serialize: \"--din99o-lab\",\n toMode: {\n lab65: convertDlabToLab65,\n rgb: (c2) => convertLab65ToRgb_default(convertDlabToLab65(c2))\n },\n fromMode: {\n lab65: convertLab65ToDlab,\n rgb: (c2) => convertLab65ToDlab(convertRgbToLab65_default(c2))\n },\n channels: [\"l\", \"a\", \"b\", \"alpha\"],\n ranges: {\n l: [0, 100],\n a: [-40.09, 45.501],\n b: [-40.469, 44.344]\n },\n interpolate: {\n l: interpolatorLinear,\n a: interpolatorLinear,\n b: interpolatorLinear,\n alpha: {\n use: interpolatorLinear,\n fixup: fixupAlpha\n }\n }\n };\n var definition_default4 = definition4;\n\n // node_modules/culori/src/dlch/definition.js\n var definition5 = {\n mode: \"dlch\",\n parse: [\"--din99o-lch\"],\n serialize: \"--din99o-lch\",\n toMode: {\n lab65: convertDlchToLab65_default,\n dlab: (c2) => convertLchToLab_default(c2, \"dlab\"),\n rgb: (c2) => convertLab65ToRgb_default(convertDlchToLab65_default(c2))\n },\n fromMode: {\n lab65: convertLab65ToDlch_default,\n dlab: (c2) => convertLabToLch_default(c2, \"dlch\"),\n rgb: (c2) => convertLab65ToDlch_default(convertRgbToLab65_default(c2))\n },\n channels: [\"l\", \"c\", \"h\", \"alpha\"],\n ranges: {\n l: [0, 100],\n c: [0, 51.484],\n h: [0, 360]\n },\n interpolate: {\n l: interpolatorLinear,\n c: interpolatorLinear,\n h: {\n use: interpolatorLinear,\n fixup: fixupHueShorter\n },\n alpha: {\n use: interpolatorLinear,\n fixup: fixupAlpha\n }\n },\n difference: {\n h: differenceHueChroma\n },\n average: {\n h: averageAngle\n }\n };\n var definition_default5 = definition5;\n\n // node_modules/culori/src/hsi/convertHsiToRgb.js\n function convertHsiToRgb({ h, s, i, alpha: alpha2 }) {\n h = normalizeHue_default(h !== void 0 ? h : 0);\n if (s === void 0) s = 0;\n if (i === void 0) i = 0;\n let f3 = Math.abs(h / 60 % 2 - 1);\n let res;\n switch (Math.floor(h / 60)) {\n case 0:\n res = {\n r: i * (1 + s * (3 / (2 - f3) - 1)),\n g: i * (1 + s * (3 * (1 - f3) / (2 - f3) - 1)),\n b: i * (1 - s)\n };\n break;\n case 1:\n res = {\n r: i * (1 + s * (3 * (1 - f3) / (2 - f3) - 1)),\n g: i * (1 + s * (3 / (2 - f3) - 1)),\n b: i * (1 - s)\n };\n break;\n case 2:\n res = {\n r: i * (1 - s),\n g: i * (1 + s * (3 / (2 - f3) - 1)),\n b: i * (1 + s * (3 * (1 - f3) / (2 - f3) - 1))\n };\n break;\n case 3:\n res = {\n r: i * (1 - s),\n g: i * (1 + s * (3 * (1 - f3) / (2 - f3) - 1)),\n b: i * (1 + s * (3 / (2 - f3) - 1))\n };\n break;\n case 4:\n res = {\n r: i * (1 + s * (3 * (1 - f3) / (2 - f3) - 1)),\n g: i * (1 - s),\n b: i * (1 + s * (3 / (2 - f3) - 1))\n };\n break;\n case 5:\n res = {\n r: i * (1 + s * (3 / (2 - f3) - 1)),\n g: i * (1 - s),\n b: i * (1 + s * (3 * (1 - f3) / (2 - f3) - 1))\n };\n break;\n default:\n res = { r: i * (1 - s), g: i * (1 - s), b: i * (1 - s) };\n }\n res.mode = \"rgb\";\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n }\n\n // node_modules/culori/src/hsi/convertRgbToHsi.js\n function convertRgbToHsi({ r: r2, g, b, alpha: alpha2 }) {\n if (r2 === void 0) r2 = 0;\n if (g === void 0) g = 0;\n if (b === void 0) b = 0;\n let M3 = Math.max(r2, g, b), m = Math.min(r2, g, b);\n let res = {\n mode: \"hsi\",\n s: r2 + g + b === 0 ? 0 : 1 - 3 * m / (r2 + g + b),\n i: (r2 + g + b) / 3\n };\n if (M3 - m !== 0)\n res.h = (M3 === r2 ? (g - b) / (M3 - m) + (g < b) * 6 : M3 === g ? (b - r2) / (M3 - m) + 2 : (r2 - g) / (M3 - m) + 4) * 60;\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n }\n\n // node_modules/culori/src/hsi/definition.js\n var definition6 = {\n mode: \"hsi\",\n toMode: {\n rgb: convertHsiToRgb\n },\n parse: [\"--hsi\"],\n serialize: \"--hsi\",\n fromMode: {\n rgb: convertRgbToHsi\n },\n channels: [\"h\", \"s\", \"i\", \"alpha\"],\n ranges: {\n h: [0, 360]\n },\n gamut: \"rgb\",\n interpolate: {\n h: { use: interpolatorLinear, fixup: fixupHueShorter },\n s: interpolatorLinear,\n i: interpolatorLinear,\n alpha: { use: interpolatorLinear, fixup: fixupAlpha }\n },\n difference: {\n h: differenceHueSaturation\n },\n average: {\n h: averageAngle\n }\n };\n var definition_default6 = definition6;\n\n // node_modules/culori/src/hsl/convertHslToRgb.js\n function convertHslToRgb({ h, s, l, alpha: alpha2 }) {\n h = normalizeHue_default(h !== void 0 ? h : 0);\n if (s === void 0) s = 0;\n if (l === void 0) l = 0;\n let m1 = l + s * (l < 0.5 ? l : 1 - l);\n let m2 = m1 - (m1 - l) * 2 * Math.abs(h / 60 % 2 - 1);\n let res;\n switch (Math.floor(h / 60)) {\n case 0:\n res = { r: m1, g: m2, b: 2 * l - m1 };\n break;\n case 1:\n res = { r: m2, g: m1, b: 2 * l - m1 };\n break;\n case 2:\n res = { r: 2 * l - m1, g: m1, b: m2 };\n break;\n case 3:\n res = { r: 2 * l - m1, g: m2, b: m1 };\n break;\n case 4:\n res = { r: m2, g: 2 * l - m1, b: m1 };\n break;\n case 5:\n res = { r: m1, g: 2 * l - m1, b: m2 };\n break;\n default:\n res = { r: 2 * l - m1, g: 2 * l - m1, b: 2 * l - m1 };\n }\n res.mode = \"rgb\";\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n }\n\n // node_modules/culori/src/hsl/convertRgbToHsl.js\n function convertRgbToHsl({ r: r2, g, b, alpha: alpha2 }) {\n if (r2 === void 0) r2 = 0;\n if (g === void 0) g = 0;\n if (b === void 0) b = 0;\n let M3 = Math.max(r2, g, b), m = Math.min(r2, g, b);\n let res = {\n mode: \"hsl\",\n s: M3 === m ? 0 : (M3 - m) / (1 - Math.abs(M3 + m - 1)),\n l: 0.5 * (M3 + m)\n };\n if (M3 - m !== 0)\n res.h = (M3 === r2 ? (g - b) / (M3 - m) + (g < b) * 6 : M3 === g ? (b - r2) / (M3 - m) + 2 : (r2 - g) / (M3 - m) + 4) * 60;\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n }\n\n // node_modules/culori/src/util/hue.js\n var hueToDeg = (val, unit) => {\n switch (unit) {\n case \"deg\":\n return +val;\n case \"rad\":\n return val / Math.PI * 180;\n case \"grad\":\n return val / 10 * 9;\n case \"turn\":\n return val * 360;\n }\n };\n var hue_default = hueToDeg;\n\n // node_modules/culori/src/hsl/parseHslLegacy.js\n var hsl_old = new RegExp(\n `^hsla?\\\\(\\\\s*${hue}${c}${per}${c}${per}\\\\s*(?:,\\\\s*${num_per}\\\\s*)?\\\\)$`\n );\n var parseHslLegacy = (color) => {\n let match = color.match(hsl_old);\n if (!match) return;\n let res = { mode: \"hsl\" };\n if (match[3] !== void 0) {\n res.h = +match[3];\n } else if (match[1] !== void 0 && match[2] !== void 0) {\n res.h = hue_default(match[1], match[2]);\n }\n if (match[4] !== void 0) {\n res.s = Math.min(Math.max(0, match[4] / 100), 1);\n }\n if (match[5] !== void 0) {\n res.l = Math.min(Math.max(0, match[5] / 100), 1);\n }\n if (match[6] !== void 0) {\n res.alpha = Math.max(0, Math.min(1, match[6] / 100));\n } else if (match[7] !== void 0) {\n res.alpha = Math.max(0, Math.min(1, +match[7]));\n }\n return res;\n };\n var parseHslLegacy_default = parseHslLegacy;\n\n // node_modules/culori/src/hsl/parseHsl.js\n function parseHsl(color, parsed) {\n if (!parsed || parsed[0] !== \"hsl\" && parsed[0] !== \"hsla\") {\n return void 0;\n }\n const res = { mode: \"hsl\" };\n const [, h, s, l, alpha2] = parsed;\n if (h.type !== Tok.None) {\n if (h.type === Tok.Percentage) {\n return void 0;\n }\n res.h = h.value;\n }\n if (s.type !== Tok.None) {\n if (s.type === Tok.Hue) {\n return void 0;\n }\n res.s = s.value / 100;\n }\n if (l.type !== Tok.None) {\n if (l.type === Tok.Hue) {\n return void 0;\n }\n res.l = l.value / 100;\n }\n if (alpha2.type !== Tok.None) {\n res.alpha = Math.min(\n 1,\n Math.max(\n 0,\n alpha2.type === Tok.Number ? alpha2.value : alpha2.value / 100\n )\n );\n }\n return res;\n }\n var parseHsl_default = parseHsl;\n\n // node_modules/culori/src/hsl/definition.js\n var definition7 = {\n mode: \"hsl\",\n toMode: {\n rgb: convertHslToRgb\n },\n fromMode: {\n rgb: convertRgbToHsl\n },\n channels: [\"h\", \"s\", \"l\", \"alpha\"],\n ranges: {\n h: [0, 360]\n },\n gamut: \"rgb\",\n parse: [parseHsl_default, parseHslLegacy_default],\n serialize: (c2) => `hsl(${c2.h !== void 0 ? c2.h : \"none\"} ${c2.s !== void 0 ? c2.s * 100 + \"%\" : \"none\"} ${c2.l !== void 0 ? c2.l * 100 + \"%\" : \"none\"}${c2.alpha < 1 ? ` / ${c2.alpha}` : \"\"})`,\n interpolate: {\n h: { use: interpolatorLinear, fixup: fixupHueShorter },\n s: interpolatorLinear,\n l: interpolatorLinear,\n alpha: { use: interpolatorLinear, fixup: fixupAlpha }\n },\n difference: {\n h: differenceHueSaturation\n },\n average: {\n h: averageAngle\n }\n };\n var definition_default7 = definition7;\n\n // node_modules/culori/src/hsv/convertHsvToRgb.js\n function convertHsvToRgb({ h, s, v, alpha: alpha2 }) {\n h = normalizeHue_default(h !== void 0 ? h : 0);\n if (s === void 0) s = 0;\n if (v === void 0) v = 0;\n let f3 = Math.abs(h / 60 % 2 - 1);\n let res;\n switch (Math.floor(h / 60)) {\n case 0:\n res = { r: v, g: v * (1 - s * f3), b: v * (1 - s) };\n break;\n case 1:\n res = { r: v * (1 - s * f3), g: v, b: v * (1 - s) };\n break;\n case 2:\n res = { r: v * (1 - s), g: v, b: v * (1 - s * f3) };\n break;\n case 3:\n res = { r: v * (1 - s), g: v * (1 - s * f3), b: v };\n break;\n case 4:\n res = { r: v * (1 - s * f3), g: v * (1 - s), b: v };\n break;\n case 5:\n res = { r: v, g: v * (1 - s), b: v * (1 - s * f3) };\n break;\n default:\n res = { r: v * (1 - s), g: v * (1 - s), b: v * (1 - s) };\n }\n res.mode = \"rgb\";\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n }\n\n // node_modules/culori/src/hsv/convertRgbToHsv.js\n function convertRgbToHsv({ r: r2, g, b, alpha: alpha2 }) {\n if (r2 === void 0) r2 = 0;\n if (g === void 0) g = 0;\n if (b === void 0) b = 0;\n let M3 = Math.max(r2, g, b), m = Math.min(r2, g, b);\n let res = {\n mode: \"hsv\",\n s: M3 === 0 ? 0 : 1 - m / M3,\n v: M3\n };\n if (M3 - m !== 0)\n res.h = (M3 === r2 ? (g - b) / (M3 - m) + (g < b) * 6 : M3 === g ? (b - r2) / (M3 - m) + 2 : (r2 - g) / (M3 - m) + 4) * 60;\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n }\n\n // node_modules/culori/src/hsv/definition.js\n var definition8 = {\n mode: \"hsv\",\n toMode: {\n rgb: convertHsvToRgb\n },\n parse: [\"--hsv\"],\n serialize: \"--hsv\",\n fromMode: {\n rgb: convertRgbToHsv\n },\n channels: [\"h\", \"s\", \"v\", \"alpha\"],\n ranges: {\n h: [0, 360]\n },\n gamut: \"rgb\",\n interpolate: {\n h: { use: interpolatorLinear, fixup: fixupHueShorter },\n s: interpolatorLinear,\n v: interpolatorLinear,\n alpha: { use: interpolatorLinear, fixup: fixupAlpha }\n },\n difference: {\n h: differenceHueSaturation\n },\n average: {\n h: averageAngle\n }\n };\n var definition_default8 = definition8;\n\n // node_modules/culori/src/hwb/convertHwbToRgb.js\n function convertHwbToRgb({ h, w, b, alpha: alpha2 }) {\n if (w === void 0) w = 0;\n if (b === void 0) b = 0;\n if (w + b > 1) {\n let s = w + b;\n w /= s;\n b /= s;\n }\n return convertHsvToRgb({\n h,\n s: b === 1 ? 1 : 1 - w / (1 - b),\n v: 1 - b,\n alpha: alpha2\n });\n }\n\n // node_modules/culori/src/hwb/convertRgbToHwb.js\n function convertRgbToHwb(rgba) {\n let hsv2 = convertRgbToHsv(rgba);\n if (hsv2 === void 0) return void 0;\n let s = hsv2.s !== void 0 ? hsv2.s : 0;\n let v = hsv2.v !== void 0 ? hsv2.v : 0;\n let res = {\n mode: \"hwb\",\n w: (1 - s) * v,\n b: 1 - v\n };\n if (hsv2.h !== void 0) res.h = hsv2.h;\n if (hsv2.alpha !== void 0) res.alpha = hsv2.alpha;\n return res;\n }\n\n // node_modules/culori/src/hwb/parseHwb.js\n function ParseHwb(color, parsed) {\n if (!parsed || parsed[0] !== \"hwb\") {\n return void 0;\n }\n const res = { mode: \"hwb\" };\n const [, h, w, b, alpha2] = parsed;\n if (h.type !== Tok.None) {\n if (h.type === Tok.Percentage) {\n return void 0;\n }\n res.h = h.value;\n }\n if (w.type !== Tok.None) {\n if (w.type === Tok.Hue) {\n return void 0;\n }\n res.w = w.value / 100;\n }\n if (b.type !== Tok.None) {\n if (b.type === Tok.Hue) {\n return void 0;\n }\n res.b = b.value / 100;\n }\n if (alpha2.type !== Tok.None) {\n res.alpha = Math.min(\n 1,\n Math.max(\n 0,\n alpha2.type === Tok.Number ? alpha2.value : alpha2.value / 100\n )\n );\n }\n return res;\n }\n var parseHwb_default = ParseHwb;\n\n // node_modules/culori/src/hwb/definition.js\n var definition9 = {\n mode: \"hwb\",\n toMode: {\n rgb: convertHwbToRgb\n },\n fromMode: {\n rgb: convertRgbToHwb\n },\n channels: [\"h\", \"w\", \"b\", \"alpha\"],\n ranges: {\n h: [0, 360]\n },\n gamut: \"rgb\",\n parse: [parseHwb_default],\n serialize: (c2) => `hwb(${c2.h !== void 0 ? c2.h : \"none\"} ${c2.w !== void 0 ? c2.w * 100 + \"%\" : \"none\"} ${c2.b !== void 0 ? c2.b * 100 + \"%\" : \"none\"}${c2.alpha < 1 ? ` / ${c2.alpha}` : \"\"})`,\n interpolate: {\n h: { use: interpolatorLinear, fixup: fixupHueShorter },\n w: interpolatorLinear,\n b: interpolatorLinear,\n alpha: { use: interpolatorLinear, fixup: fixupAlpha }\n },\n difference: {\n h: differenceHueNaive\n },\n average: {\n h: averageAngle\n }\n };\n var definition_default9 = definition9;\n\n // node_modules/culori/src/hdr/constants.js\n var YW = 203;\n\n // node_modules/culori/src/hdr/transfer.js\n var M1 = 0.1593017578125;\n var M2 = 78.84375;\n var C1 = 0.8359375;\n var C2 = 18.8515625;\n var C3 = 18.6875;\n function transferPqDecode(v) {\n if (v < 0) return 0;\n const c2 = Math.pow(v, 1 / M2);\n return 1e4 * Math.pow(Math.max(0, c2 - C1) / (C2 - C3 * c2), 1 / M1);\n }\n function transferPqEncode(v) {\n if (v < 0) return 0;\n const c2 = Math.pow(v / 1e4, M1);\n return Math.pow((C1 + C2 * c2) / (1 + C3 * c2), M2);\n }\n\n // node_modules/culori/src/itp/convertItpToXyz65.js\n var toRel = (c2) => Math.max(c2 / YW, 0);\n var convertItpToXyz65 = ({ i, t, p: p4, alpha: alpha2 }) => {\n if (i === void 0) i = 0;\n if (t === void 0) t = 0;\n if (p4 === void 0) p4 = 0;\n const l = transferPqDecode(\n i + 0.008609037037932761 * t + 0.11102962500302593 * p4\n );\n const m = transferPqDecode(\n i - 0.00860903703793275 * t - 0.11102962500302599 * p4\n );\n const s = transferPqDecode(\n i + 0.5600313357106791 * t - 0.32062717498731885 * p4\n );\n const res = {\n mode: \"xyz65\",\n x: toRel(\n 2.070152218389422 * l - 1.3263473389671556 * m + 0.2066510476294051 * s\n ),\n y: toRel(\n 0.3647385209748074 * l + 0.680566024947227 * m - 0.0453045459220346 * s\n ),\n z: toRel(\n -0.049747207535812 * l - 0.0492609666966138 * m + 1.1880659249923042 * s\n )\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertItpToXyz65_default = convertItpToXyz65;\n\n // node_modules/culori/src/itp/convertXyz65ToItp.js\n var toAbs = (c2 = 0) => Math.max(c2 * YW, 0);\n var convertXyz65ToItp = ({ x, y, z, alpha: alpha2 }) => {\n const absX = toAbs(x);\n const absY = toAbs(y);\n const absZ = toAbs(z);\n const l = transferPqEncode(\n 0.3592832590121217 * absX + 0.6976051147779502 * absY - 0.0358915932320289 * absZ\n );\n const m = transferPqEncode(\n -0.1920808463704995 * absX + 1.1004767970374323 * absY + 0.0753748658519118 * absZ\n );\n const s = transferPqEncode(\n 0.0070797844607477 * absX + 0.0748396662186366 * absY + 0.8433265453898765 * absZ\n );\n const i = 0.5 * l + 0.5 * m;\n const t = 1.61376953125 * l - 3.323486328125 * m + 1.709716796875 * s;\n const p4 = 4.378173828125 * l - 4.24560546875 * m - 0.132568359375 * s;\n const res = { mode: \"itp\", i, t, p: p4 };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertXyz65ToItp_default = convertXyz65ToItp;\n\n // node_modules/culori/src/itp/definition.js\n var definition10 = {\n mode: \"itp\",\n channels: [\"i\", \"t\", \"p\", \"alpha\"],\n parse: [\"--ictcp\"],\n serialize: \"--ictcp\",\n toMode: {\n xyz65: convertItpToXyz65_default,\n rgb: (color) => convertXyz65ToRgb_default(convertItpToXyz65_default(color))\n },\n fromMode: {\n xyz65: convertXyz65ToItp_default,\n rgb: (color) => convertXyz65ToItp_default(convertRgbToXyz65_default(color))\n },\n ranges: {\n i: [0, 0.581],\n t: [-0.369, 0.272],\n p: [-0.164, 0.331]\n },\n interpolate: {\n i: interpolatorLinear,\n t: interpolatorLinear,\n p: interpolatorLinear,\n alpha: { use: interpolatorLinear, fixup: fixupAlpha }\n }\n };\n var definition_default10 = definition10;\n\n // node_modules/culori/src/jab/convertXyz65ToJab.js\n var p = 134.03437499999998;\n var d0 = 16295499532821565e-27;\n var jabPqEncode = (v) => {\n if (v < 0) return 0;\n let vn3 = Math.pow(v / 1e4, M1);\n return Math.pow((C1 + C2 * vn3) / (1 + C3 * vn3), p);\n };\n var abs = (v = 0) => Math.max(v * 203, 0);\n var convertXyz65ToJab = ({ x, y, z, alpha: alpha2 }) => {\n x = abs(x);\n y = abs(y);\n z = abs(z);\n let xp = 1.15 * x - 0.15 * z;\n let yp = 0.66 * y + 0.34 * x;\n let l = jabPqEncode(0.41478972 * xp + 0.579999 * yp + 0.014648 * z);\n let m = jabPqEncode(-0.20151 * xp + 1.120649 * yp + 0.0531008 * z);\n let s = jabPqEncode(-0.0166008 * xp + 0.2648 * yp + 0.6684799 * z);\n let i = (l + m) / 2;\n let res = {\n mode: \"jab\",\n j: 0.44 * i / (1 - 0.56 * i) - d0,\n a: 3.524 * l - 4.066708 * m + 0.542708 * s,\n b: 0.199076 * l + 1.096799 * m - 1.295875 * s\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertXyz65ToJab_default = convertXyz65ToJab;\n\n // node_modules/culori/src/jab/convertJabToXyz65.js\n var p2 = 134.03437499999998;\n var d02 = 16295499532821565e-27;\n var jabPqDecode = (v) => {\n if (v < 0) return 0;\n let vp = Math.pow(v, 1 / p2);\n return 1e4 * Math.pow((C1 - vp) / (C3 * vp - C2), 1 / M1);\n };\n var rel = (v) => v / 203;\n var convertJabToXyz65 = ({ j, a, b, alpha: alpha2 }) => {\n if (j === void 0) j = 0;\n if (a === void 0) a = 0;\n if (b === void 0) b = 0;\n let i = (j + d02) / (0.44 + 0.56 * (j + d02));\n let l = jabPqDecode(i + 0.13860504 * a + 0.058047316 * b);\n let m = jabPqDecode(i - 0.13860504 * a - 0.058047316 * b);\n let s = jabPqDecode(i - 0.096019242 * a - 0.8118919 * b);\n let res = {\n mode: \"xyz65\",\n x: rel(\n 1.661373024652174 * l - 0.914523081304348 * m + 0.23136208173913045 * s\n ),\n y: rel(\n -0.3250758611844533 * l + 1.571847026732543 * m - 0.21825383453227928 * s\n ),\n z: rel(-0.090982811 * l - 0.31272829 * m + 1.5227666 * s)\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertJabToXyz65_default = convertJabToXyz65;\n\n // node_modules/culori/src/jab/convertRgbToJab.js\n var convertRgbToJab = (rgb4) => {\n let res = convertXyz65ToJab_default(convertRgbToXyz65_default(rgb4));\n if (rgb4.r === rgb4.b && rgb4.b === rgb4.g) {\n res.a = res.b = 0;\n }\n return res;\n };\n var convertRgbToJab_default = convertRgbToJab;\n\n // node_modules/culori/src/jab/convertJabToRgb.js\n var convertJabToRgb = (color) => convertXyz65ToRgb_default(convertJabToXyz65_default(color));\n var convertJabToRgb_default = convertJabToRgb;\n\n // node_modules/culori/src/jab/definition.js\n var definition11 = {\n mode: \"jab\",\n channels: [\"j\", \"a\", \"b\", \"alpha\"],\n parse: [\"--jzazbz\"],\n serialize: \"--jzazbz\",\n fromMode: {\n rgb: convertRgbToJab_default,\n xyz65: convertXyz65ToJab_default\n },\n toMode: {\n rgb: convertJabToRgb_default,\n xyz65: convertJabToXyz65_default\n },\n ranges: {\n j: [0, 0.222],\n a: [-0.109, 0.129],\n b: [-0.185, 0.134]\n },\n interpolate: {\n j: interpolatorLinear,\n a: interpolatorLinear,\n b: interpolatorLinear,\n alpha: { use: interpolatorLinear, fixup: fixupAlpha }\n }\n };\n var definition_default11 = definition11;\n\n // node_modules/culori/src/jch/convertJabToJch.js\n var convertJabToJch = ({ j, a, b, alpha: alpha2 }) => {\n if (a === void 0) a = 0;\n if (b === void 0) b = 0;\n let c2 = Math.sqrt(a * a + b * b);\n let res = {\n mode: \"jch\",\n j,\n c: c2\n };\n if (c2) {\n res.h = normalizeHue_default(Math.atan2(b, a) * 180 / Math.PI);\n }\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertJabToJch_default = convertJabToJch;\n\n // node_modules/culori/src/jch/convertJchToJab.js\n var convertJchToJab = ({ j, c: c2, h, alpha: alpha2 }) => {\n if (h === void 0) h = 0;\n let res = {\n mode: \"jab\",\n j,\n a: c2 ? c2 * Math.cos(h / 180 * Math.PI) : 0,\n b: c2 ? c2 * Math.sin(h / 180 * Math.PI) : 0\n };\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n };\n var convertJchToJab_default = convertJchToJab;\n\n // node_modules/culori/src/jch/definition.js\n var definition12 = {\n mode: \"jch\",\n parse: [\"--jzczhz\"],\n serialize: \"--jzczhz\",\n toMode: {\n jab: convertJchToJab_default,\n rgb: (c2) => convertJabToRgb_default(convertJchToJab_default(c2))\n },\n fromMode: {\n rgb: (c2) => convertJabToJch_default(convertRgbToJab_default(c2)),\n jab: convertJabToJch_default\n },\n channels: [\"j\", \"c\", \"h\", \"alpha\"],\n ranges: {\n j: [0, 0.221],\n c: [0, 0.19],\n h: [0, 360]\n },\n interpolate: {\n h: { use: interpolatorLinear, fixup: fixupHueShorter },\n c: interpolatorLinear,\n j: interpolatorLinear,\n alpha: { use: interpolatorLinear, fixup: fixupAlpha }\n },\n difference: {\n h: differenceHueChroma\n },\n average: {\n h: averageAngle\n }\n };\n var definition_default12 = definition12;\n\n // node_modules/culori/src/xyz50/constants.js\n var k3 = Math.pow(29, 3) / Math.pow(3, 3);\n var e3 = Math.pow(6, 3) / Math.pow(29, 3);\n\n // node_modules/culori/src/lab/convertLabToXyz50.js\n var fn4 = (v) => Math.pow(v, 3) > e3 ? Math.pow(v, 3) : (116 * v - 16) / k3;\n var convertLabToXyz50 = ({ l, a, b, alpha: alpha2 }) => {\n if (l === void 0) l = 0;\n if (a === void 0) a = 0;\n if (b === void 0) b = 0;\n let fy = (l + 16) / 116;\n let fx = a / 500 + fy;\n let fz = fy - b / 200;\n let res = {\n mode: \"xyz50\",\n x: fn4(fx) * D50.X,\n y: fn4(fy) * D50.Y,\n z: fn4(fz) * D50.Z\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertLabToXyz50_default = convertLabToXyz50;\n\n // node_modules/culori/src/xyz50/convertXyz50ToRgb.js\n var convertXyz50ToRgb = ({ x, y, z, alpha: alpha2 }) => {\n if (x === void 0) x = 0;\n if (y === void 0) y = 0;\n if (z === void 0) z = 0;\n let res = convertLrgbToRgb_default({\n r: x * 3.1341359569958707 - y * 1.6173863321612538 - 0.4906619460083532 * z,\n g: x * -0.978795502912089 + y * 1.916254567259524 + 0.03344273116131949 * z,\n b: x * 0.07195537988411677 - y * 0.2289768264158322 + 1.405386058324125 * z\n });\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertXyz50ToRgb_default = convertXyz50ToRgb;\n\n // node_modules/culori/src/lab/convertLabToRgb.js\n var convertLabToRgb = (lab2) => convertXyz50ToRgb_default(convertLabToXyz50_default(lab2));\n var convertLabToRgb_default = convertLabToRgb;\n\n // node_modules/culori/src/xyz50/convertRgbToXyz50.js\n var convertRgbToXyz50 = (rgb4) => {\n let { r: r2, g, b, alpha: alpha2 } = convertRgbToLrgb_default(rgb4);\n let res = {\n mode: \"xyz50\",\n x: 0.436065742824811 * r2 + 0.3851514688337912 * g + 0.14307845442264197 * b,\n y: 0.22249319175623702 * r2 + 0.7168870538238823 * g + 0.06061979053616537 * b,\n z: 0.013923904500943465 * r2 + 0.09708128566574634 * g + 0.7140993584005155 * b\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertRgbToXyz50_default = convertRgbToXyz50;\n\n // node_modules/culori/src/lab/convertXyz50ToLab.js\n var f2 = (value) => value > e3 ? Math.cbrt(value) : (k3 * value + 16) / 116;\n var convertXyz50ToLab = ({ x, y, z, alpha: alpha2 }) => {\n if (x === void 0) x = 0;\n if (y === void 0) y = 0;\n if (z === void 0) z = 0;\n let f0 = f2(x / D50.X);\n let f1 = f2(y / D50.Y);\n let f22 = f2(z / D50.Z);\n let res = {\n mode: \"lab\",\n l: 116 * f1 - 16,\n a: 500 * (f0 - f1),\n b: 200 * (f1 - f22)\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertXyz50ToLab_default = convertXyz50ToLab;\n\n // node_modules/culori/src/lab/convertRgbToLab.js\n var convertRgbToLab = (rgb4) => {\n let res = convertXyz50ToLab_default(convertRgbToXyz50_default(rgb4));\n if (rgb4.r === rgb4.b && rgb4.b === rgb4.g) {\n res.a = res.b = 0;\n }\n return res;\n };\n var convertRgbToLab_default = convertRgbToLab;\n\n // node_modules/culori/src/lab/parseLab.js\n function parseLab(color, parsed) {\n if (!parsed || parsed[0] !== \"lab\") {\n return void 0;\n }\n const res = { mode: \"lab\" };\n const [, l, a, b, alpha2] = parsed;\n if (l.type === Tok.Hue || a.type === Tok.Hue || b.type === Tok.Hue) {\n return void 0;\n }\n if (l.type !== Tok.None) {\n res.l = Math.min(Math.max(0, l.value), 100);\n }\n if (a.type !== Tok.None) {\n res.a = a.type === Tok.Number ? a.value : a.value * 125 / 100;\n }\n if (b.type !== Tok.None) {\n res.b = b.type === Tok.Number ? b.value : b.value * 125 / 100;\n }\n if (alpha2.type !== Tok.None) {\n res.alpha = Math.min(\n 1,\n Math.max(\n 0,\n alpha2.type === Tok.Number ? alpha2.value : alpha2.value / 100\n )\n );\n }\n return res;\n }\n var parseLab_default = parseLab;\n\n // node_modules/culori/src/lab/definition.js\n var definition13 = {\n mode: \"lab\",\n toMode: {\n xyz50: convertLabToXyz50_default,\n rgb: convertLabToRgb_default\n },\n fromMode: {\n xyz50: convertXyz50ToLab_default,\n rgb: convertRgbToLab_default\n },\n channels: [\"l\", \"a\", \"b\", \"alpha\"],\n ranges: {\n l: [0, 100],\n a: [-125, 125],\n b: [-125, 125]\n },\n parse: [parseLab_default],\n serialize: (c2) => `lab(${c2.l !== void 0 ? c2.l : \"none\"} ${c2.a !== void 0 ? c2.a : \"none\"} ${c2.b !== void 0 ? c2.b : \"none\"}${c2.alpha < 1 ? ` / ${c2.alpha}` : \"\"})`,\n interpolate: {\n l: interpolatorLinear,\n a: interpolatorLinear,\n b: interpolatorLinear,\n alpha: { use: interpolatorLinear, fixup: fixupAlpha }\n }\n };\n var definition_default13 = definition13;\n\n // node_modules/culori/src/lab65/definition.js\n var definition14 = {\n ...definition_default13,\n mode: \"lab65\",\n parse: [\"--lab-d65\"],\n serialize: \"--lab-d65\",\n toMode: {\n xyz65: convertLab65ToXyz65_default,\n rgb: convertLab65ToRgb_default\n },\n fromMode: {\n xyz65: convertXyz65ToLab65_default,\n rgb: convertRgbToLab65_default\n },\n ranges: {\n l: [0, 100],\n a: [-125, 125],\n b: [-125, 125]\n }\n };\n var definition_default14 = definition14;\n\n // node_modules/culori/src/lch/parseLch.js\n function parseLch(color, parsed) {\n if (!parsed || parsed[0] !== \"lch\") {\n return void 0;\n }\n const res = { mode: \"lch\" };\n const [, l, c2, h, alpha2] = parsed;\n if (l.type !== Tok.None) {\n if (l.type === Tok.Hue) {\n return void 0;\n }\n res.l = Math.min(Math.max(0, l.value), 100);\n }\n if (c2.type !== Tok.None) {\n res.c = Math.max(\n 0,\n c2.type === Tok.Number ? c2.value : c2.value * 150 / 100\n );\n }\n if (h.type !== Tok.None) {\n if (h.type === Tok.Percentage) {\n return void 0;\n }\n res.h = h.value;\n }\n if (alpha2.type !== Tok.None) {\n res.alpha = Math.min(\n 1,\n Math.max(\n 0,\n alpha2.type === Tok.Number ? alpha2.value : alpha2.value / 100\n )\n );\n }\n return res;\n }\n var parseLch_default = parseLch;\n\n // node_modules/culori/src/lch/definition.js\n var definition15 = {\n mode: \"lch\",\n toMode: {\n lab: convertLchToLab_default,\n rgb: (c2) => convertLabToRgb_default(convertLchToLab_default(c2))\n },\n fromMode: {\n rgb: (c2) => convertLabToLch_default(convertRgbToLab_default(c2)),\n lab: convertLabToLch_default\n },\n channels: [\"l\", \"c\", \"h\", \"alpha\"],\n ranges: {\n l: [0, 100],\n c: [0, 150],\n h: [0, 360]\n },\n parse: [parseLch_default],\n serialize: (c2) => `lch(${c2.l !== void 0 ? c2.l : \"none\"} ${c2.c !== void 0 ? c2.c : \"none\"} ${c2.h !== void 0 ? c2.h : \"none\"}${c2.alpha < 1 ? ` / ${c2.alpha}` : \"\"})`,\n interpolate: {\n h: { use: interpolatorLinear, fixup: fixupHueShorter },\n c: interpolatorLinear,\n l: interpolatorLinear,\n alpha: { use: interpolatorLinear, fixup: fixupAlpha }\n },\n difference: {\n h: differenceHueChroma\n },\n average: {\n h: averageAngle\n }\n };\n var definition_default15 = definition15;\n\n // node_modules/culori/src/lch65/definition.js\n var definition16 = {\n ...definition_default15,\n mode: \"lch65\",\n parse: [\"--lch-d65\"],\n serialize: \"--lch-d65\",\n toMode: {\n lab65: (c2) => convertLchToLab_default(c2, \"lab65\"),\n rgb: (c2) => convertLab65ToRgb_default(convertLchToLab_default(c2, \"lab65\"))\n },\n fromMode: {\n rgb: (c2) => convertLabToLch_default(convertRgbToLab65_default(c2), \"lch65\"),\n lab65: (c2) => convertLabToLch_default(c2, \"lch65\")\n },\n ranges: {\n l: [0, 100],\n c: [0, 150],\n h: [0, 360]\n }\n };\n var definition_default16 = definition16;\n\n // node_modules/culori/src/lchuv/convertLuvToLchuv.js\n var convertLuvToLchuv = ({ l, u, v, alpha: alpha2 }) => {\n if (u === void 0) u = 0;\n if (v === void 0) v = 0;\n let c2 = Math.sqrt(u * u + v * v);\n let res = {\n mode: \"lchuv\",\n l,\n c: c2\n };\n if (c2) {\n res.h = normalizeHue_default(Math.atan2(v, u) * 180 / Math.PI);\n }\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertLuvToLchuv_default = convertLuvToLchuv;\n\n // node_modules/culori/src/lchuv/convertLchuvToLuv.js\n var convertLchuvToLuv = ({ l, c: c2, h, alpha: alpha2 }) => {\n if (h === void 0) h = 0;\n let res = {\n mode: \"luv\",\n l,\n u: c2 ? c2 * Math.cos(h / 180 * Math.PI) : 0,\n v: c2 ? c2 * Math.sin(h / 180 * Math.PI) : 0\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertLchuvToLuv_default = convertLchuvToLuv;\n\n // node_modules/culori/src/luv/convertXyz50ToLuv.js\n var u_fn = (x, y, z) => 4 * x / (x + 15 * y + 3 * z);\n var v_fn = (x, y, z) => 9 * y / (x + 15 * y + 3 * z);\n var un = u_fn(D50.X, D50.Y, D50.Z);\n var vn = v_fn(D50.X, D50.Y, D50.Z);\n var l_fn = (value) => value <= e3 ? k3 * value : 116 * Math.cbrt(value) - 16;\n var convertXyz50ToLuv = ({ x, y, z, alpha: alpha2 }) => {\n if (x === void 0) x = 0;\n if (y === void 0) y = 0;\n if (z === void 0) z = 0;\n let l = l_fn(y / D50.Y);\n let u = u_fn(x, y, z);\n let v = v_fn(x, y, z);\n if (!isFinite(u) || !isFinite(v)) {\n l = u = v = 0;\n } else {\n u = 13 * l * (u - un);\n v = 13 * l * (v - vn);\n }\n let res = {\n mode: \"luv\",\n l,\n u,\n v\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertXyz50ToLuv_default = convertXyz50ToLuv;\n\n // node_modules/culori/src/luv/convertLuvToXyz50.js\n var u_fn2 = (x, y, z) => 4 * x / (x + 15 * y + 3 * z);\n var v_fn2 = (x, y, z) => 9 * y / (x + 15 * y + 3 * z);\n var un2 = u_fn2(D50.X, D50.Y, D50.Z);\n var vn2 = v_fn2(D50.X, D50.Y, D50.Z);\n var convertLuvToXyz50 = ({ l, u, v, alpha: alpha2 }) => {\n if (l === void 0) l = 0;\n if (l === 0) {\n return { mode: \"xyz50\", x: 0, y: 0, z: 0 };\n }\n if (u === void 0) u = 0;\n if (v === void 0) v = 0;\n let up = u / (13 * l) + un2;\n let vp = v / (13 * l) + vn2;\n let y = D50.Y * (l <= 8 ? l / k3 : Math.pow((l + 16) / 116, 3));\n let x = y * (9 * up) / (4 * vp);\n let z = y * (12 - 3 * up - 20 * vp) / (4 * vp);\n let res = { mode: \"xyz50\", x, y, z };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertLuvToXyz50_default = convertLuvToXyz50;\n\n // node_modules/culori/src/lchuv/definition.js\n var convertRgbToLchuv = (rgb4) => convertLuvToLchuv_default(convertXyz50ToLuv_default(convertRgbToXyz50_default(rgb4)));\n var convertLchuvToRgb = (lchuv2) => convertXyz50ToRgb_default(convertLuvToXyz50_default(convertLchuvToLuv_default(lchuv2)));\n var definition17 = {\n mode: \"lchuv\",\n toMode: {\n luv: convertLchuvToLuv_default,\n rgb: convertLchuvToRgb\n },\n fromMode: {\n rgb: convertRgbToLchuv,\n luv: convertLuvToLchuv_default\n },\n channels: [\"l\", \"c\", \"h\", \"alpha\"],\n parse: [\"--lchuv\"],\n serialize: \"--lchuv\",\n ranges: {\n l: [0, 100],\n c: [0, 176.956],\n h: [0, 360]\n },\n interpolate: {\n h: { use: interpolatorLinear, fixup: fixupHueShorter },\n c: interpolatorLinear,\n l: interpolatorLinear,\n alpha: { use: interpolatorLinear, fixup: fixupAlpha }\n },\n difference: {\n h: differenceHueChroma\n },\n average: {\n h: averageAngle\n }\n };\n var definition_default17 = definition17;\n\n // node_modules/culori/src/lrgb/definition.js\n var definition18 = {\n ...definition_default,\n mode: \"lrgb\",\n toMode: {\n rgb: convertLrgbToRgb_default\n },\n fromMode: {\n rgb: convertRgbToLrgb_default\n },\n parse: [\"srgb-linear\"],\n serialize: \"srgb-linear\"\n };\n var definition_default18 = definition18;\n\n // node_modules/culori/src/luv/definition.js\n var definition19 = {\n mode: \"luv\",\n toMode: {\n xyz50: convertLuvToXyz50_default,\n rgb: (luv2) => convertXyz50ToRgb_default(convertLuvToXyz50_default(luv2))\n },\n fromMode: {\n xyz50: convertXyz50ToLuv_default,\n rgb: (rgb4) => convertXyz50ToLuv_default(convertRgbToXyz50_default(rgb4))\n },\n channels: [\"l\", \"u\", \"v\", \"alpha\"],\n parse: [\"--luv\"],\n serialize: \"--luv\",\n ranges: {\n l: [0, 100],\n u: [-84.936, 175.042],\n v: [-125.882, 87.243]\n },\n interpolate: {\n l: interpolatorLinear,\n u: interpolatorLinear,\n v: interpolatorLinear,\n alpha: { use: interpolatorLinear, fixup: fixupAlpha }\n }\n };\n var definition_default19 = definition19;\n\n // node_modules/culori/src/oklab/convertLrgbToOklab.js\n var convertLrgbToOklab = ({ r: r2, g, b, alpha: alpha2 }) => {\n if (r2 === void 0) r2 = 0;\n if (g === void 0) g = 0;\n if (b === void 0) b = 0;\n let L = Math.cbrt(\n 0.412221469470763 * r2 + 0.5363325372617348 * g + 0.0514459932675022 * b\n );\n let M3 = Math.cbrt(\n 0.2119034958178252 * r2 + 0.6806995506452344 * g + 0.1073969535369406 * b\n );\n let S = Math.cbrt(\n 0.0883024591900564 * r2 + 0.2817188391361215 * g + 0.6299787016738222 * b\n );\n let res = {\n mode: \"oklab\",\n l: 0.210454268309314 * L + 0.7936177747023054 * M3 - 0.0040720430116193 * S,\n a: 1.9779985324311684 * L - 2.42859224204858 * M3 + 0.450593709617411 * S,\n b: 0.0259040424655478 * L + 0.7827717124575296 * M3 - 0.8086757549230774 * S\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertLrgbToOklab_default = convertLrgbToOklab;\n\n // node_modules/culori/src/oklab/convertRgbToOklab.js\n var convertRgbToOklab = (rgb4) => {\n let res = convertLrgbToOklab_default(convertRgbToLrgb_default(rgb4));\n if (rgb4.r === rgb4.b && rgb4.b === rgb4.g) {\n res.a = res.b = 0;\n }\n return res;\n };\n var convertRgbToOklab_default = convertRgbToOklab;\n\n // node_modules/culori/src/oklab/convertOklabToLrgb.js\n var convertOklabToLrgb = ({ l, a, b, alpha: alpha2 }) => {\n if (l === void 0) l = 0;\n if (a === void 0) a = 0;\n if (b === void 0) b = 0;\n let L = Math.pow(l + 0.3963377773761749 * a + 0.2158037573099136 * b, 3);\n let M3 = Math.pow(l - 0.1055613458156586 * a - 0.0638541728258133 * b, 3);\n let S = Math.pow(l - 0.0894841775298119 * a - 1.2914855480194092 * b, 3);\n let res = {\n mode: \"lrgb\",\n r: 4.076741636075957 * L - 3.3077115392580616 * M3 + 0.2309699031821044 * S,\n g: -1.2684379732850317 * L + 2.6097573492876887 * M3 - 0.3413193760026573 * S,\n b: -0.0041960761386756 * L - 0.7034186179359362 * M3 + 1.7076146940746117 * S\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertOklabToLrgb_default = convertOklabToLrgb;\n\n // node_modules/culori/src/oklab/convertOklabToRgb.js\n var convertOklabToRgb = (c2) => convertLrgbToRgb_default(convertOklabToLrgb_default(c2));\n var convertOklabToRgb_default = convertOklabToRgb;\n\n // node_modules/culori/src/okhsl/helpers.js\n function toe(x) {\n const k_1 = 0.206;\n const k_2 = 0.03;\n const k_3 = (1 + k_1) / (1 + k_2);\n return 0.5 * (k_3 * x - k_1 + Math.sqrt((k_3 * x - k_1) * (k_3 * x - k_1) + 4 * k_2 * k_3 * x));\n }\n function toe_inv(x) {\n const k_1 = 0.206;\n const k_2 = 0.03;\n const k_3 = (1 + k_1) / (1 + k_2);\n return (x * x + k_1 * x) / (k_3 * (x + k_2));\n }\n function compute_max_saturation(a, b) {\n let k0, k1, k22, k32, k4, wl, wm, ws;\n if (-1.88170328 * a - 0.80936493 * b > 1) {\n k0 = 1.19086277;\n k1 = 1.76576728;\n k22 = 0.59662641;\n k32 = 0.75515197;\n k4 = 0.56771245;\n wl = 4.0767416621;\n wm = -3.3077115913;\n ws = 0.2309699292;\n } else if (1.81444104 * a - 1.19445276 * b > 1) {\n k0 = 0.73956515;\n k1 = -0.45954404;\n k22 = 0.08285427;\n k32 = 0.1254107;\n k4 = 0.14503204;\n wl = -1.2684380046;\n wm = 2.6097574011;\n ws = -0.3413193965;\n } else {\n k0 = 1.35733652;\n k1 = -915799e-8;\n k22 = -1.1513021;\n k32 = -0.50559606;\n k4 = 692167e-8;\n wl = -0.0041960863;\n wm = -0.7034186147;\n ws = 1.707614701;\n }\n let S = k0 + k1 * a + k22 * b + k32 * a * a + k4 * a * b;\n let k_l = 0.3963377774 * a + 0.2158037573 * b;\n let k_m = -0.1055613458 * a - 0.0638541728 * b;\n let k_s = -0.0894841775 * a - 1.291485548 * b;\n {\n let l_ = 1 + S * k_l;\n let m_ = 1 + S * k_m;\n let s_ = 1 + S * k_s;\n let l = l_ * l_ * l_;\n let m = m_ * m_ * m_;\n let s = s_ * s_ * s_;\n let l_dS = 3 * k_l * l_ * l_;\n let m_dS = 3 * k_m * m_ * m_;\n let s_dS = 3 * k_s * s_ * s_;\n let l_dS2 = 6 * k_l * k_l * l_;\n let m_dS2 = 6 * k_m * k_m * m_;\n let s_dS2 = 6 * k_s * k_s * s_;\n let f3 = wl * l + wm * m + ws * s;\n let f1 = wl * l_dS + wm * m_dS + ws * s_dS;\n let f22 = wl * l_dS2 + wm * m_dS2 + ws * s_dS2;\n S = S - f3 * f1 / (f1 * f1 - 0.5 * f3 * f22);\n }\n return S;\n }\n function find_cusp(a, b) {\n let S_cusp = compute_max_saturation(a, b);\n let rgb4 = convertOklabToLrgb_default({ l: 1, a: S_cusp * a, b: S_cusp * b });\n let L_cusp = Math.cbrt(1 / Math.max(rgb4.r, rgb4.g, rgb4.b));\n let C_cusp = L_cusp * S_cusp;\n return [L_cusp, C_cusp];\n }\n function find_gamut_intersection(a, b, L1, C12, L0, cusp = null) {\n if (!cusp) {\n cusp = find_cusp(a, b);\n }\n let t;\n if ((L1 - L0) * cusp[1] - (cusp[0] - L0) * C12 <= 0) {\n t = cusp[1] * L0 / (C12 * cusp[0] + cusp[1] * (L0 - L1));\n } else {\n t = cusp[1] * (L0 - 1) / (C12 * (cusp[0] - 1) + cusp[1] * (L0 - L1));\n {\n let dL = L1 - L0;\n let dC = C12;\n let k_l = 0.3963377774 * a + 0.2158037573 * b;\n let k_m = -0.1055613458 * a - 0.0638541728 * b;\n let k_s = -0.0894841775 * a - 1.291485548 * b;\n let l_dt = dL + dC * k_l;\n let m_dt = dL + dC * k_m;\n let s_dt = dL + dC * k_s;\n {\n let L = L0 * (1 - t) + t * L1;\n let C = t * C12;\n let l_ = L + C * k_l;\n let m_ = L + C * k_m;\n let s_ = L + C * k_s;\n let l = l_ * l_ * l_;\n let m = m_ * m_ * m_;\n let s = s_ * s_ * s_;\n let ldt = 3 * l_dt * l_ * l_;\n let mdt = 3 * m_dt * m_ * m_;\n let sdt = 3 * s_dt * s_ * s_;\n let ldt2 = 6 * l_dt * l_dt * l_;\n let mdt2 = 6 * m_dt * m_dt * m_;\n let sdt2 = 6 * s_dt * s_dt * s_;\n let r2 = 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s - 1;\n let r1 = 4.0767416621 * ldt - 3.3077115913 * mdt + 0.2309699292 * sdt;\n let r22 = 4.0767416621 * ldt2 - 3.3077115913 * mdt2 + 0.2309699292 * sdt2;\n let u_r = r1 / (r1 * r1 - 0.5 * r2 * r22);\n let t_r = -r2 * u_r;\n let g = -1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s - 1;\n let g1 = -1.2684380046 * ldt + 2.6097574011 * mdt - 0.3413193965 * sdt;\n let g2 = -1.2684380046 * ldt2 + 2.6097574011 * mdt2 - 0.3413193965 * sdt2;\n let u_g = g1 / (g1 * g1 - 0.5 * g * g2);\n let t_g = -g * u_g;\n let b2 = -0.0041960863 * l - 0.7034186147 * m + 1.707614701 * s - 1;\n let b1 = -0.0041960863 * ldt - 0.7034186147 * mdt + 1.707614701 * sdt;\n let b22 = -0.0041960863 * ldt2 - 0.7034186147 * mdt2 + 1.707614701 * sdt2;\n let u_b = b1 / (b1 * b1 - 0.5 * b2 * b22);\n let t_b = -b2 * u_b;\n t_r = u_r >= 0 ? t_r : 1e6;\n t_g = u_g >= 0 ? t_g : 1e6;\n t_b = u_b >= 0 ? t_b : 1e6;\n t += Math.min(t_r, Math.min(t_g, t_b));\n }\n }\n }\n return t;\n }\n function get_ST_max(a_, b_, cusp = null) {\n if (!cusp) {\n cusp = find_cusp(a_, b_);\n }\n let L = cusp[0];\n let C = cusp[1];\n return [C / L, C / (1 - L)];\n }\n function get_Cs(L, a_, b_) {\n let cusp = find_cusp(a_, b_);\n let C_max = find_gamut_intersection(a_, b_, L, 1, L, cusp);\n let ST_max = get_ST_max(a_, b_, cusp);\n let S_mid = 0.11516993 + 1 / (7.4477897 + 4.1590124 * b_ + a_ * (-2.19557347 + 1.75198401 * b_ + a_ * (-2.13704948 - 10.02301043 * b_ + a_ * (-4.24894561 + 5.38770819 * b_ + 4.69891013 * a_))));\n let T_mid = 0.11239642 + 1 / (1.6132032 - 0.68124379 * b_ + a_ * (0.40370612 + 0.90148123 * b_ + a_ * (-0.27087943 + 0.6122399 * b_ + a_ * (299215e-8 - 0.45399568 * b_ - 0.14661872 * a_))));\n let k4 = C_max / Math.min(L * ST_max[0], (1 - L) * ST_max[1]);\n let C_a = L * S_mid;\n let C_b = (1 - L) * T_mid;\n let C_mid = 0.9 * k4 * Math.sqrt(\n Math.sqrt(\n 1 / (1 / (C_a * C_a * C_a * C_a) + 1 / (C_b * C_b * C_b * C_b))\n )\n );\n C_a = L * 0.4;\n C_b = (1 - L) * 0.8;\n let C_0 = Math.sqrt(1 / (1 / (C_a * C_a) + 1 / (C_b * C_b)));\n return [C_0, C_mid, C_max];\n }\n\n // node_modules/culori/src/okhsl/convertOklabToOkhsl.js\n function convertOklabToOkhsl(lab2) {\n const l = lab2.l !== void 0 ? lab2.l : 0;\n const a = lab2.a !== void 0 ? lab2.a : 0;\n const b = lab2.b !== void 0 ? lab2.b : 0;\n const ret = { mode: \"okhsl\", l: toe(l) };\n if (lab2.alpha !== void 0) {\n ret.alpha = lab2.alpha;\n }\n let c2 = Math.sqrt(a * a + b * b);\n if (!c2) {\n ret.s = 0;\n return ret;\n }\n let [C_0, C_mid, C_max] = get_Cs(l, a / c2, b / c2);\n let s;\n if (c2 < C_mid) {\n let k_0 = 0;\n let k_1 = 0.8 * C_0;\n let k_2 = 1 - k_1 / C_mid;\n let t = (c2 - k_0) / (k_1 + k_2 * (c2 - k_0));\n s = t * 0.8;\n } else {\n let k_0 = C_mid;\n let k_1 = 0.2 * C_mid * C_mid * 1.25 * 1.25 / C_0;\n let k_2 = 1 - k_1 / (C_max - C_mid);\n let t = (c2 - k_0) / (k_1 + k_2 * (c2 - k_0));\n s = 0.8 + 0.2 * t;\n }\n if (s) {\n ret.s = s;\n ret.h = normalizeHue_default(Math.atan2(b, a) * 180 / Math.PI);\n }\n return ret;\n }\n\n // node_modules/culori/src/okhsl/convertOkhslToOklab.js\n function convertOkhslToOklab(hsl3) {\n let h = hsl3.h !== void 0 ? hsl3.h : 0;\n let s = hsl3.s !== void 0 ? hsl3.s : 0;\n let l = hsl3.l !== void 0 ? hsl3.l : 0;\n const ret = { mode: \"oklab\", l: toe_inv(l) };\n if (hsl3.alpha !== void 0) {\n ret.alpha = hsl3.alpha;\n }\n if (!s || l === 1) {\n ret.a = ret.b = 0;\n return ret;\n }\n let a_ = Math.cos(h / 180 * Math.PI);\n let b_ = Math.sin(h / 180 * Math.PI);\n let [C_0, C_mid, C_max] = get_Cs(ret.l, a_, b_);\n let t, k_0, k_1, k_2;\n if (s < 0.8) {\n t = 1.25 * s;\n k_0 = 0;\n k_1 = 0.8 * C_0;\n k_2 = 1 - k_1 / C_mid;\n } else {\n t = 5 * (s - 0.8);\n k_0 = C_mid;\n k_1 = 0.2 * C_mid * C_mid * 1.25 * 1.25 / C_0;\n k_2 = 1 - k_1 / (C_max - C_mid);\n }\n let C = k_0 + t * k_1 / (1 - k_2 * t);\n ret.a = C * a_;\n ret.b = C * b_;\n return ret;\n }\n\n // node_modules/culori/src/okhsl/modeOkhsl.js\n var modeOkhsl = {\n ...definition_default7,\n mode: \"okhsl\",\n channels: [\"h\", \"s\", \"l\", \"alpha\"],\n parse: [\"--okhsl\"],\n serialize: \"--okhsl\",\n fromMode: {\n oklab: convertOklabToOkhsl,\n rgb: (c2) => convertOklabToOkhsl(convertRgbToOklab_default(c2))\n },\n toMode: {\n oklab: convertOkhslToOklab,\n rgb: (c2) => convertOklabToRgb_default(convertOkhslToOklab(c2))\n }\n };\n var modeOkhsl_default = modeOkhsl;\n\n // node_modules/culori/src/okhsv/convertOklabToOkhsv.js\n function convertOklabToOkhsv(lab2) {\n let l = lab2.l !== void 0 ? lab2.l : 0;\n let a = lab2.a !== void 0 ? lab2.a : 0;\n let b = lab2.b !== void 0 ? lab2.b : 0;\n let c2 = Math.sqrt(a * a + b * b);\n let a_ = c2 ? a / c2 : 1;\n let b_ = c2 ? b / c2 : 1;\n let [S_max, T] = get_ST_max(a_, b_);\n let S_0 = 0.5;\n let k4 = 1 - S_0 / S_max;\n let t = T / (c2 + l * T);\n let L_v = t * l;\n let C_v = t * c2;\n let L_vt = toe_inv(L_v);\n let C_vt = C_v * L_vt / L_v;\n let rgb_scale = convertOklabToLrgb_default({ l: L_vt, a: a_ * C_vt, b: b_ * C_vt });\n let scale_L = Math.cbrt(\n 1 / Math.max(rgb_scale.r, rgb_scale.g, rgb_scale.b, 0)\n );\n l = l / scale_L;\n c2 = c2 / scale_L * toe(l) / l;\n l = toe(l);\n const ret = {\n mode: \"okhsv\",\n s: c2 ? (S_0 + T) * C_v / (T * S_0 + T * k4 * C_v) : 0,\n v: l ? l / L_v : 0\n };\n if (ret.s) {\n ret.h = normalizeHue_default(Math.atan2(b, a) * 180 / Math.PI);\n }\n if (lab2.alpha !== void 0) {\n ret.alpha = lab2.alpha;\n }\n return ret;\n }\n\n // node_modules/culori/src/okhsv/convertOkhsvToOklab.js\n function convertOkhsvToOklab(hsv2) {\n const ret = { mode: \"oklab\" };\n if (hsv2.alpha !== void 0) {\n ret.alpha = hsv2.alpha;\n }\n const h = hsv2.h !== void 0 ? hsv2.h : 0;\n const s = hsv2.s !== void 0 ? hsv2.s : 0;\n const v = hsv2.v !== void 0 ? hsv2.v : 0;\n const a_ = Math.cos(h / 180 * Math.PI);\n const b_ = Math.sin(h / 180 * Math.PI);\n const [S_max, T] = get_ST_max(a_, b_);\n const S_0 = 0.5;\n const k4 = 1 - S_0 / S_max;\n const L_v = 1 - s * S_0 / (S_0 + T - T * k4 * s);\n const C_v = s * T * S_0 / (S_0 + T - T * k4 * s);\n const L_vt = toe_inv(L_v);\n const C_vt = C_v * L_vt / L_v;\n const rgb_scale = convertOklabToLrgb_default({\n l: L_vt,\n a: a_ * C_vt,\n b: b_ * C_vt\n });\n const scale_L = Math.cbrt(\n 1 / Math.max(rgb_scale.r, rgb_scale.g, rgb_scale.b, 0)\n );\n const L_new = toe_inv(v * L_v);\n const C = C_v * L_new / L_v;\n ret.l = L_new * scale_L;\n ret.a = C * a_ * scale_L;\n ret.b = C * b_ * scale_L;\n return ret;\n }\n\n // node_modules/culori/src/okhsv/modeOkhsv.js\n var modeOkhsv = {\n ...definition_default8,\n mode: \"okhsv\",\n channels: [\"h\", \"s\", \"v\", \"alpha\"],\n parse: [\"--okhsv\"],\n serialize: \"--okhsv\",\n fromMode: {\n oklab: convertOklabToOkhsv,\n rgb: (c2) => convertOklabToOkhsv(convertRgbToOklab_default(c2))\n },\n toMode: {\n oklab: convertOkhsvToOklab,\n rgb: (c2) => convertOklabToRgb_default(convertOkhsvToOklab(c2))\n }\n };\n var modeOkhsv_default = modeOkhsv;\n\n // node_modules/culori/src/oklab/parseOklab.js\n function parseOklab(color, parsed) {\n if (!parsed || parsed[0] !== \"oklab\") {\n return void 0;\n }\n const res = { mode: \"oklab\" };\n const [, l, a, b, alpha2] = parsed;\n if (l.type === Tok.Hue || a.type === Tok.Hue || b.type === Tok.Hue) {\n return void 0;\n }\n if (l.type !== Tok.None) {\n res.l = Math.min(\n Math.max(0, l.type === Tok.Number ? l.value : l.value / 100),\n 1\n );\n }\n if (a.type !== Tok.None) {\n res.a = a.type === Tok.Number ? a.value : a.value * 0.4 / 100;\n }\n if (b.type !== Tok.None) {\n res.b = b.type === Tok.Number ? b.value : b.value * 0.4 / 100;\n }\n if (alpha2.type !== Tok.None) {\n res.alpha = Math.min(\n 1,\n Math.max(\n 0,\n alpha2.type === Tok.Number ? alpha2.value : alpha2.value / 100\n )\n );\n }\n return res;\n }\n var parseOklab_default = parseOklab;\n\n // node_modules/culori/src/oklab/definition.js\n var definition20 = {\n ...definition_default13,\n mode: \"oklab\",\n toMode: {\n lrgb: convertOklabToLrgb_default,\n rgb: convertOklabToRgb_default\n },\n fromMode: {\n lrgb: convertLrgbToOklab_default,\n rgb: convertRgbToOklab_default\n },\n ranges: {\n l: [0, 1],\n a: [-0.4, 0.4],\n b: [-0.4, 0.4]\n },\n parse: [parseOklab_default],\n serialize: (c2) => `oklab(${c2.l !== void 0 ? c2.l : \"none\"} ${c2.a !== void 0 ? c2.a : \"none\"} ${c2.b !== void 0 ? c2.b : \"none\"}${c2.alpha < 1 ? ` / ${c2.alpha}` : \"\"})`\n };\n var definition_default20 = definition20;\n\n // node_modules/culori/src/oklch/parseOklch.js\n function parseOklch(color, parsed) {\n if (!parsed || parsed[0] !== \"oklch\") {\n return void 0;\n }\n const res = { mode: \"oklch\" };\n const [, l, c2, h, alpha2] = parsed;\n if (l.type !== Tok.None) {\n if (l.type === Tok.Hue) {\n return void 0;\n }\n res.l = Math.min(\n Math.max(0, l.type === Tok.Number ? l.value : l.value / 100),\n 1\n );\n }\n if (c2.type !== Tok.None) {\n res.c = Math.max(\n 0,\n c2.type === Tok.Number ? c2.value : c2.value * 0.4 / 100\n );\n }\n if (h.type !== Tok.None) {\n if (h.type === Tok.Percentage) {\n return void 0;\n }\n res.h = h.value;\n }\n if (alpha2.type !== Tok.None) {\n res.alpha = Math.min(\n 1,\n Math.max(\n 0,\n alpha2.type === Tok.Number ? alpha2.value : alpha2.value / 100\n )\n );\n }\n return res;\n }\n var parseOklch_default = parseOklch;\n\n // node_modules/culori/src/oklch/definition.js\n var definition21 = {\n ...definition_default15,\n mode: \"oklch\",\n toMode: {\n oklab: (c2) => convertLchToLab_default(c2, \"oklab\"),\n rgb: (c2) => convertOklabToRgb_default(convertLchToLab_default(c2, \"oklab\"))\n },\n fromMode: {\n rgb: (c2) => convertLabToLch_default(convertRgbToOklab_default(c2), \"oklch\"),\n oklab: (c2) => convertLabToLch_default(c2, \"oklch\")\n },\n parse: [parseOklch_default],\n serialize: (c2) => `oklch(${c2.l !== void 0 ? c2.l : \"none\"} ${c2.c !== void 0 ? c2.c : \"none\"} ${c2.h !== void 0 ? c2.h : \"none\"}${c2.alpha < 1 ? ` / ${c2.alpha}` : \"\"})`,\n ranges: {\n l: [0, 1],\n c: [0, 0.4],\n h: [0, 360]\n }\n };\n var definition_default21 = definition21;\n\n // node_modules/culori/src/p3/convertP3ToXyz65.js\n var convertP3ToXyz65 = (rgb4) => {\n let { r: r2, g, b, alpha: alpha2 } = convertRgbToLrgb_default(rgb4);\n let res = {\n mode: \"xyz65\",\n x: 0.486570948648216 * r2 + 0.265667693169093 * g + 0.1982172852343625 * b,\n y: 0.2289745640697487 * r2 + 0.6917385218365062 * g + 0.079286914093745 * b,\n z: 0 * r2 + 0.0451133818589026 * g + 1.043944368900976 * b\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertP3ToXyz65_default = convertP3ToXyz65;\n\n // node_modules/culori/src/p3/convertXyz65ToP3.js\n var convertXyz65ToP3 = ({ x, y, z, alpha: alpha2 }) => {\n if (x === void 0) x = 0;\n if (y === void 0) y = 0;\n if (z === void 0) z = 0;\n let res = convertLrgbToRgb_default(\n {\n r: x * 2.4934969119414263 - y * 0.9313836179191242 - 0.402710784450717 * z,\n g: x * -0.8294889695615749 + y * 1.7626640603183465 + 0.0236246858419436 * z,\n b: x * 0.0358458302437845 - y * 0.0761723892680418 + 0.9568845240076871 * z\n },\n \"p3\"\n );\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertXyz65ToP3_default = convertXyz65ToP3;\n\n // node_modules/culori/src/p3/definition.js\n var definition22 = {\n ...definition_default,\n mode: \"p3\",\n parse: [\"display-p3\"],\n serialize: \"display-p3\",\n fromMode: {\n rgb: (color) => convertXyz65ToP3_default(convertRgbToXyz65_default(color)),\n xyz65: convertXyz65ToP3_default\n },\n toMode: {\n rgb: (color) => convertXyz65ToRgb_default(convertP3ToXyz65_default(color)),\n xyz65: convertP3ToXyz65_default\n }\n };\n var definition_default22 = definition22;\n\n // node_modules/culori/src/prophoto/convertXyz50ToProphoto.js\n var gamma2 = (v) => {\n let abs2 = Math.abs(v);\n if (abs2 >= 1 / 512) {\n return Math.sign(v) * Math.pow(abs2, 1 / 1.8);\n }\n return 16 * v;\n };\n var convertXyz50ToProphoto = ({ x, y, z, alpha: alpha2 }) => {\n if (x === void 0) x = 0;\n if (y === void 0) y = 0;\n if (z === void 0) z = 0;\n let res = {\n mode: \"prophoto\",\n r: gamma2(\n x * 1.3457868816471585 - y * 0.2555720873797946 - 0.0511018649755453 * z\n ),\n g: gamma2(\n x * -0.5446307051249019 + y * 1.5082477428451466 + 0.0205274474364214 * z\n ),\n b: gamma2(x * 0 + y * 0 + 1.2119675456389452 * z)\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertXyz50ToProphoto_default = convertXyz50ToProphoto;\n\n // node_modules/culori/src/prophoto/convertProphotoToXyz50.js\n var linearize2 = (v = 0) => {\n let abs2 = Math.abs(v);\n if (abs2 >= 16 / 512) {\n return Math.sign(v) * Math.pow(abs2, 1.8);\n }\n return v / 16;\n };\n var convertProphotoToXyz50 = (prophoto2) => {\n let r2 = linearize2(prophoto2.r);\n let g = linearize2(prophoto2.g);\n let b = linearize2(prophoto2.b);\n let res = {\n mode: \"xyz50\",\n x: 0.7977666449006423 * r2 + 0.1351812974005331 * g + 0.0313477341283922 * b,\n y: 0.2880748288194013 * r2 + 0.7118352342418731 * g + 899369387256e-16 * b,\n z: 0 * r2 + 0 * g + 0.8251046025104602 * b\n };\n if (prophoto2.alpha !== void 0) {\n res.alpha = prophoto2.alpha;\n }\n return res;\n };\n var convertProphotoToXyz50_default = convertProphotoToXyz50;\n\n // node_modules/culori/src/prophoto/definition.js\n var definition23 = {\n ...definition_default,\n mode: \"prophoto\",\n parse: [\"prophoto-rgb\"],\n serialize: \"prophoto-rgb\",\n fromMode: {\n xyz50: convertXyz50ToProphoto_default,\n rgb: (color) => convertXyz50ToProphoto_default(convertRgbToXyz50_default(color))\n },\n toMode: {\n xyz50: convertProphotoToXyz50_default,\n rgb: (color) => convertXyz50ToRgb_default(convertProphotoToXyz50_default(color))\n }\n };\n var definition_default23 = definition23;\n\n // node_modules/culori/src/rec2020/convertXyz65ToRec2020.js\n var \\u03B1 = 1.09929682680944;\n var \\u03B2 = 0.018053968510807;\n var gamma3 = (v) => {\n const abs2 = Math.abs(v);\n if (abs2 > \\u03B2) {\n return (Math.sign(v) || 1) * (\\u03B1 * Math.pow(abs2, 0.45) - (\\u03B1 - 1));\n }\n return 4.5 * v;\n };\n var convertXyz65ToRec2020 = ({ x, y, z, alpha: alpha2 }) => {\n if (x === void 0) x = 0;\n if (y === void 0) y = 0;\n if (z === void 0) z = 0;\n let res = {\n mode: \"rec2020\",\n r: gamma3(\n x * 1.7166511879712683 - y * 0.3556707837763925 - 0.2533662813736599 * z\n ),\n g: gamma3(\n x * -0.6666843518324893 + y * 1.6164812366349395 + 0.0157685458139111 * z\n ),\n b: gamma3(\n x * 0.0176398574453108 - y * 0.0427706132578085 + 0.9421031212354739 * z\n )\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertXyz65ToRec2020_default = convertXyz65ToRec2020;\n\n // node_modules/culori/src/rec2020/convertRec2020ToXyz65.js\n var \\u03B12 = 1.09929682680944;\n var \\u03B22 = 0.018053968510807;\n var linearize3 = (v = 0) => {\n let abs2 = Math.abs(v);\n if (abs2 < \\u03B22 * 4.5) {\n return v / 4.5;\n }\n return (Math.sign(v) || 1) * Math.pow((abs2 + \\u03B12 - 1) / \\u03B12, 1 / 0.45);\n };\n var convertRec2020ToXyz65 = (rec20202) => {\n let r2 = linearize3(rec20202.r);\n let g = linearize3(rec20202.g);\n let b = linearize3(rec20202.b);\n let res = {\n mode: \"xyz65\",\n x: 0.6369580483012911 * r2 + 0.1446169035862083 * g + 0.1688809751641721 * b,\n y: 0.262700212011267 * r2 + 0.6779980715188708 * g + 0.059301716469862 * b,\n z: 0 * r2 + 0.0280726930490874 * g + 1.0609850577107909 * b\n };\n if (rec20202.alpha !== void 0) {\n res.alpha = rec20202.alpha;\n }\n return res;\n };\n var convertRec2020ToXyz65_default = convertRec2020ToXyz65;\n\n // node_modules/culori/src/rec2020/definition.js\n var definition24 = {\n ...definition_default,\n mode: \"rec2020\",\n fromMode: {\n xyz65: convertXyz65ToRec2020_default,\n rgb: (color) => convertXyz65ToRec2020_default(convertRgbToXyz65_default(color))\n },\n toMode: {\n xyz65: convertRec2020ToXyz65_default,\n rgb: (color) => convertXyz65ToRgb_default(convertRec2020ToXyz65_default(color))\n },\n parse: [\"rec2020\"],\n serialize: \"rec2020\"\n };\n var definition_default24 = definition24;\n\n // node_modules/culori/src/xyb/constants.js\n var bias = 0.0037930732552754493;\n var bias_cbrt = Math.cbrt(bias);\n\n // node_modules/culori/src/xyb/convertRgbToXyb.js\n var transfer = (v) => Math.cbrt(v) - bias_cbrt;\n var convertRgbToXyb = (color) => {\n const { r: r2, g, b, alpha: alpha2 } = convertRgbToLrgb_default(color);\n const l = transfer(0.3 * r2 + 0.622 * g + 0.078 * b + bias);\n const m = transfer(0.23 * r2 + 0.692 * g + 0.078 * b + bias);\n const s = transfer(\n 0.2434226892454782 * r2 + 0.2047674442449682 * g + 0.5518098665095535 * b + bias\n );\n const res = {\n mode: \"xyb\",\n x: (l - m) / 2,\n y: (l + m) / 2,\n /* Apply default chroma from luma (subtract Y from B) */\n b: s - (l + m) / 2\n };\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n };\n var convertRgbToXyb_default = convertRgbToXyb;\n\n // node_modules/culori/src/xyb/convertXybToRgb.js\n var transfer2 = (v) => Math.pow(v + bias_cbrt, 3);\n var convertXybToRgb = ({ x, y, b, alpha: alpha2 }) => {\n if (x === void 0) x = 0;\n if (y === void 0) y = 0;\n if (b === void 0) b = 0;\n const l = transfer2(x + y) - bias;\n const m = transfer2(y - x) - bias;\n const s = transfer2(b + y) - bias;\n const res = convertLrgbToRgb_default({\n r: 11.031566904639861 * l - 9.866943908131562 * m - 0.16462299650829934 * s,\n g: -3.2541473810744237 * l + 4.418770377582723 * m - 0.16462299650829934 * s,\n b: -3.6588512867136815 * l + 2.7129230459360922 * m + 1.9459282407775895 * s\n });\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n };\n var convertXybToRgb_default = convertXybToRgb;\n\n // node_modules/culori/src/xyb/definition.js\n var definition25 = {\n mode: \"xyb\",\n channels: [\"x\", \"y\", \"b\", \"alpha\"],\n parse: [\"--xyb\"],\n serialize: \"--xyb\",\n toMode: {\n rgb: convertXybToRgb_default\n },\n fromMode: {\n rgb: convertRgbToXyb_default\n },\n ranges: {\n x: [-0.0154, 0.0281],\n y: [0, 0.8453],\n b: [-0.2778, 0.388]\n },\n interpolate: {\n x: interpolatorLinear,\n y: interpolatorLinear,\n b: interpolatorLinear,\n alpha: { use: interpolatorLinear, fixup: fixupAlpha }\n }\n };\n var definition_default25 = definition25;\n\n // node_modules/culori/src/xyz50/definition.js\n var definition26 = {\n mode: \"xyz50\",\n parse: [\"xyz-d50\"],\n serialize: \"xyz-d50\",\n toMode: {\n rgb: convertXyz50ToRgb_default,\n lab: convertXyz50ToLab_default\n },\n fromMode: {\n rgb: convertRgbToXyz50_default,\n lab: convertLabToXyz50_default\n },\n channels: [\"x\", \"y\", \"z\", \"alpha\"],\n ranges: {\n x: [0, 0.964],\n y: [0, 0.999],\n z: [0, 0.825]\n },\n interpolate: {\n x: interpolatorLinear,\n y: interpolatorLinear,\n z: interpolatorLinear,\n alpha: { use: interpolatorLinear, fixup: fixupAlpha }\n }\n };\n var definition_default26 = definition26;\n\n // node_modules/culori/src/xyz65/convertXyz65ToXyz50.js\n var convertXyz65ToXyz50 = (xyz652) => {\n let { x, y, z, alpha: alpha2 } = xyz652;\n if (x === void 0) x = 0;\n if (y === void 0) y = 0;\n if (z === void 0) z = 0;\n let res = {\n mode: \"xyz50\",\n x: 1.0479298208405488 * x + 0.0229467933410191 * y - 0.0501922295431356 * z,\n y: 0.0296278156881593 * x + 0.990434484573249 * y - 0.0170738250293851 * z,\n z: -0.0092430581525912 * x + 0.0150551448965779 * y + 0.7518742899580008 * z\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertXyz65ToXyz50_default = convertXyz65ToXyz50;\n\n // node_modules/culori/src/xyz65/convertXyz50ToXyz65.js\n var convertXyz50ToXyz65 = (xyz502) => {\n let { x, y, z, alpha: alpha2 } = xyz502;\n if (x === void 0) x = 0;\n if (y === void 0) y = 0;\n if (z === void 0) z = 0;\n let res = {\n mode: \"xyz65\",\n x: 0.9554734527042182 * x - 0.0230985368742614 * y + 0.0632593086610217 * z,\n y: -0.0283697069632081 * x + 1.0099954580058226 * y + 0.021041398966943 * z,\n z: 0.0123140016883199 * x - 0.0205076964334779 * y + 1.3303659366080753 * z\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertXyz50ToXyz65_default = convertXyz50ToXyz65;\n\n // node_modules/culori/src/xyz65/definition.js\n var definition27 = {\n mode: \"xyz65\",\n toMode: {\n rgb: convertXyz65ToRgb_default,\n xyz50: convertXyz65ToXyz50_default\n },\n fromMode: {\n rgb: convertRgbToXyz65_default,\n xyz50: convertXyz50ToXyz65_default\n },\n ranges: {\n x: [0, 0.95],\n y: [0, 1],\n z: [0, 1.088]\n },\n channels: [\"x\", \"y\", \"z\", \"alpha\"],\n parse: [\"xyz\", \"xyz-d65\"],\n serialize: \"xyz-d65\",\n interpolate: {\n x: interpolatorLinear,\n y: interpolatorLinear,\n z: interpolatorLinear,\n alpha: { use: interpolatorLinear, fixup: fixupAlpha }\n }\n };\n var definition_default27 = definition27;\n\n // node_modules/culori/src/yiq/convertRgbToYiq.js\n var convertRgbToYiq = ({ r: r2, g, b, alpha: alpha2 }) => {\n if (r2 === void 0) r2 = 0;\n if (g === void 0) g = 0;\n if (b === void 0) b = 0;\n const res = {\n mode: \"yiq\",\n y: 0.29889531 * r2 + 0.58662247 * g + 0.11448223 * b,\n i: 0.59597799 * r2 - 0.2741761 * g - 0.32180189 * b,\n q: 0.21147017 * r2 - 0.52261711 * g + 0.31114694 * b\n };\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n };\n var convertRgbToYiq_default = convertRgbToYiq;\n\n // node_modules/culori/src/yiq/convertYiqToRgb.js\n var convertYiqToRgb = ({ y, i, q, alpha: alpha2 }) => {\n if (y === void 0) y = 0;\n if (i === void 0) i = 0;\n if (q === void 0) q = 0;\n const res = {\n mode: \"rgb\",\n r: y + 0.95608445 * i + 0.6208885 * q,\n g: y - 0.27137664 * i - 0.6486059 * q,\n b: y - 1.10561724 * i + 1.70250126 * q\n };\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n };\n var convertYiqToRgb_default = convertYiqToRgb;\n\n // node_modules/culori/src/yiq/definition.js\n var definition28 = {\n mode: \"yiq\",\n toMode: {\n rgb: convertYiqToRgb_default\n },\n fromMode: {\n rgb: convertRgbToYiq_default\n },\n channels: [\"y\", \"i\", \"q\", \"alpha\"],\n parse: [\"--yiq\"],\n serialize: \"--yiq\",\n ranges: {\n i: [-0.595, 0.595],\n q: [-0.522, 0.522]\n },\n interpolate: {\n y: interpolatorLinear,\n i: interpolatorLinear,\n q: interpolatorLinear,\n alpha: { use: interpolatorLinear, fixup: fixupAlpha }\n }\n };\n var definition_default28 = definition28;\n\n // node_modules/culori/src/round.js\n var r = (value, precision) => Math.round(value * (precision = Math.pow(10, precision))) / precision;\n var round = (precision = 4) => (value) => typeof value === \"number\" ? r(value, precision) : value;\n var round_default = round;\n\n // node_modules/culori/src/formatter.js\n var twoDecimals = round_default(2);\n var clamp = (value) => Math.max(0, Math.min(1, value || 0));\n var fixup = (value) => Math.round(clamp(value) * 255);\n var rgb = converter_default(\"rgb\");\n var hsl = converter_default(\"hsl\");\n var serializeHex = (color) => {\n if (color === void 0) {\n return void 0;\n }\n let r2 = fixup(color.r);\n let g = fixup(color.g);\n let b = fixup(color.b);\n return \"#\" + (1 << 24 | r2 << 16 | g << 8 | b).toString(16).slice(1);\n };\n var serializeRgb = (color) => {\n if (color === void 0) {\n return void 0;\n }\n let r2 = fixup(color.r);\n let g = fixup(color.g);\n let b = fixup(color.b);\n if (color.alpha === void 0 || color.alpha === 1) {\n return `rgb(${r2}, ${g}, ${b})`;\n } else {\n return `rgba(${r2}, ${g}, ${b}, ${twoDecimals(clamp(color.alpha))})`;\n }\n };\n var formatHex = (c2) => serializeHex(rgb(c2));\n var formatRgb = (c2) => serializeRgb(rgb(c2));\n\n // node_modules/culori/src/clamp.js\n var rgb2 = converter_default(\"rgb\");\n var fixup_rgb = (c2) => {\n const res = {\n mode: c2.mode,\n r: Math.max(0, Math.min(c2.r !== void 0 ? c2.r : 0, 1)),\n g: Math.max(0, Math.min(c2.g !== void 0 ? c2.g : 0, 1)),\n b: Math.max(0, Math.min(c2.b !== void 0 ? c2.b : 0, 1))\n };\n if (c2.alpha !== void 0) {\n res.alpha = c2.alpha;\n }\n return res;\n };\n var to_displayable_srgb = (c2) => fixup_rgb(rgb2(c2));\n var inrange_rgb = (c2) => {\n return c2 !== void 0 && (c2.r === void 0 || c2.r >= 0 && c2.r <= 1) && (c2.g === void 0 || c2.g >= 0 && c2.g <= 1) && (c2.b === void 0 || c2.b >= 0 && c2.b <= 1);\n };\n function displayable(color) {\n return inrange_rgb(rgb2(color));\n }\n function inGamut(mode = \"rgb\") {\n const { gamut } = getMode(mode);\n if (!gamut) {\n return (color) => true;\n }\n const conv = converter_default(typeof gamut === \"string\" ? gamut : mode);\n return (color) => inrange_rgb(conv(color));\n }\n function clampGamut(mode = \"rgb\") {\n const { gamut } = getMode(mode);\n if (!gamut) {\n return (color) => prepare_default(color);\n }\n const destMode = typeof gamut === \"string\" ? gamut : mode;\n const destConv = converter_default(destMode);\n const inDestGamut = inGamut(destMode);\n return (color) => {\n const original = prepare_default(color);\n if (!original) {\n return void 0;\n }\n const converted = destConv(original);\n if (inDestGamut(converted)) {\n return original;\n }\n const clamped = fixup_rgb(converted);\n if (original.mode === clamped.mode) {\n return clamped;\n }\n return converter_default(original.mode)(clamped);\n };\n }\n function clampChroma(color, mode = \"lch\", rgbGamut = \"rgb\") {\n color = prepare_default(color);\n let inDestinationGamut = rgbGamut === \"rgb\" ? displayable : inGamut(rgbGamut);\n let clipToGamut = rgbGamut === \"rgb\" ? to_displayable_srgb : clampGamut(rgbGamut);\n if (color === void 0 || inDestinationGamut(color)) return color;\n let conv = converter_default(color.mode);\n color = converter_default(mode)(color);\n let clamped = { ...color, c: 0 };\n if (!inDestinationGamut(clamped)) {\n return conv(clipToGamut(clamped));\n }\n let start = 0;\n let end = color.c !== void 0 ? color.c : 0;\n let range = getMode(mode).ranges.c;\n let resolution = (range[1] - range[0]) / Math.pow(2, 13);\n let _last_good_c = clamped.c;\n while (end - start > resolution) {\n clamped.c = start + (end - start) * 0.5;\n if (inDestinationGamut(clamped)) {\n _last_good_c = clamped.c;\n start = clamped.c;\n } else {\n end = clamped.c;\n }\n }\n return conv(\n inDestinationGamut(clamped) ? clamped : { ...clamped, c: _last_good_c }\n );\n }\n\n // node_modules/culori/src/wcag.js\n function luminance(color) {\n let c2 = converter_default(\"lrgb\")(color);\n return 0.2126 * c2.r + 0.7152 * c2.g + 0.0722 * c2.b;\n }\n function contrast(a, b) {\n let L1 = luminance(a);\n let L2 = luminance(b);\n return (Math.max(L1, L2) + 0.05) / (Math.min(L1, L2) + 0.05);\n }\n\n // node_modules/culori/src/index.js\n var a98 = useMode(definition_default2);\n var cubehelix = useMode(definition_default3);\n var dlab = useMode(definition_default4);\n var dlch = useMode(definition_default5);\n var hsi = useMode(definition_default6);\n var hsl2 = useMode(definition_default7);\n var hsv = useMode(definition_default8);\n var hwb = useMode(definition_default9);\n var itp = useMode(definition_default10);\n var jab = useMode(definition_default11);\n var jch = useMode(definition_default12);\n var lab = useMode(definition_default13);\n var lab65 = useMode(definition_default14);\n var lch = useMode(definition_default15);\n var lch65 = useMode(definition_default16);\n var lchuv = useMode(definition_default17);\n var lrgb = useMode(definition_default18);\n var luv = useMode(definition_default19);\n var okhsl = useMode(modeOkhsl_default);\n var okhsv = useMode(modeOkhsv_default);\n var oklab = useMode(definition_default20);\n var oklch = useMode(definition_default21);\n var p3 = useMode(definition_default22);\n var prophoto = useMode(definition_default23);\n var rec2020 = useMode(definition_default24);\n var rgb3 = useMode(definition_default);\n var xyb = useMode(definition_default25);\n var xyz50 = useMode(definition_default26);\n var xyz65 = useMode(definition_default27);\n var yiq = useMode(definition_default28);\n\n // packages/xtyle/dist/color.js\n var toOklch = converter_default(\"oklch\");\n var DEFAULT_OKLCH = { l: 0, c: 0, h: 0, alpha: 1 };\n function toOklchColor(input) {\n if (typeof input !== \"string\")\n return input;\n const parsed = parse_default(input);\n if (!parsed)\n throw new Error(`xtyle: unparseable color \"${input}\"`);\n const o = toOklch(parsed);\n if (!o)\n throw new Error(`xtyle: cannot convert color \"${input}\" to oklch`);\n return {\n l: clamp01(o.l ?? 0),\n c: Math.max(0, o.c ?? 0),\n h: o.h ?? 0,\n alpha: o.alpha ?? 1\n };\n }\n function oklch2(l, c2, h, alpha2 = 1) {\n return { l: clamp01(l), c: Math.max(0, c2), h: (h % 360 + 360) % 360, alpha: alpha2 };\n }\n function withLightness(color, l) {\n return { ...color, l: clamp01(l) };\n }\n function withAlpha(color, alpha2) {\n return { ...color, alpha: clamp01(alpha2) };\n }\n function hueDelta(from, to) {\n let d = ((to - from) % 360 + 360) % 360;\n if (d > 180)\n d -= 360;\n return d;\n }\n function lightness(input) {\n return toOklchColor(input).l;\n }\n function contrast2(a, b) {\n const value = contrast(formatCss2(a), formatCss2(b));\n return value ?? 1;\n }\n function clampToGamut(color) {\n const mapped = clampChroma({ mode: \"oklch\", l: color.l, c: color.c, h: color.h, alpha: color.alpha }, \"oklch\", \"rgb\");\n return {\n l: mapped.l ?? color.l,\n c: Math.max(0, mapped.c ?? 0),\n h: mapped.h ?? color.h,\n alpha: mapped.alpha ?? color.alpha\n };\n }\n function formatCss2(input) {\n const source = typeof input === \"string\" ? toOklchColor(input) : input;\n const color = clampToGamut(source);\n const culoriColor = {\n mode: \"oklch\",\n l: color.l,\n c: color.c,\n h: color.h,\n alpha: color.alpha\n };\n if (color.alpha < 1) {\n return formatRgb(culoriColor) ?? formatHex(culoriColor) ?? \"#000000\";\n }\n return formatHex(culoriColor) ?? \"#000000\";\n }\n function schemeOf(bg) {\n return lightness(bg) < 0.5 ? \"dark\" : \"light\";\n }\n function pickReadable(fill, options, floor = 4.5) {\n let best = options[0] ?? DEFAULT_OKLCH;\n let bestContrast = -1;\n for (const option of options) {\n const ratio = contrast2(fill, option);\n if (ratio >= floor)\n return formatCss2(option);\n if (ratio > bestContrast) {\n bestContrast = ratio;\n best = option;\n }\n }\n return formatCss2(best);\n }\n function clamp01(value) {\n if (Number.isNaN(value))\n return 0;\n return Math.min(1, Math.max(0, value));\n }\n\n // packages/xtyle/dist/graph.js\n var CycleError = class extends Error {\n constructor(cycle) {\n super(`xtyle: cycle detected in token graph: ${cycle.join(\" -> \")}`);\n __publicField(this, \"cycle\");\n this.cycle = cycle;\n this.name = \"CycleError\";\n }\n };\n function resolveGraph(nodes) {\n const byName = /* @__PURE__ */ new Map();\n for (const node of nodes)\n byName.set(node.name, node);\n const computed = /* @__PURE__ */ new Map();\n const visiting = /* @__PURE__ */ new Set();\n const done = /* @__PURE__ */ new Set();\n const stack = [];\n const visit = (name) => {\n if (done.has(name))\n return;\n const node = byName.get(name);\n if (!node)\n return;\n if (visiting.has(name)) {\n const start = stack.indexOf(name);\n throw new CycleError([...stack.slice(start), name]);\n }\n visiting.add(name);\n stack.push(name);\n for (const ref of node.refs ?? [])\n visit(ref);\n if (node.resolve) {\n const inputs = {};\n for (const [key, value] of computed)\n inputs[key] = value;\n computed.set(name, node.resolve(inputs));\n } else if (node.value !== void 0) {\n computed.set(name, node.value);\n }\n stack.pop();\n visiting.delete(name);\n done.add(name);\n };\n for (const node of nodes)\n visit(node.name);\n const resolved = {};\n for (const node of nodes) {\n const value = computed.get(node.name);\n if (value !== void 0)\n resolved[node.name] = value;\n }\n return resolved;\n }\n\n // packages/xtyle/dist/vocab.js\n var TONES = [\"accent\", \"neutral\", \"danger\", \"success\", \"warn\", \"info\"];\n var ACCENT_VARIANTS = [\"accent-2\", \"accent-3\", \"accent-4\"];\n var HUES = [\n \"red\",\n \"orange\",\n \"yellow\",\n \"green\",\n \"blue\",\n \"purple\",\n \"brown\",\n \"pink\",\n \"cyan\",\n \"gray\",\n \"white\",\n \"black\"\n ];\n var FULL_TONES = [...TONES, ...ACCENT_VARIANTS, ...HUES];\n\n // packages/xtyle/dist/algorithms/factory.js\n var AA = 4.5;\n var AAA = 7;\n var ENFORCE = AA + 0.2;\n var SURFACE_SEPARATION = 1.5;\n var BORDER_SEPARATION = 1.5;\n var DIVIDER_SEPARATION = 1.8;\n var DEFAULT_SHIFT_STEP = 90;\n var DEFAULT_ACCENT_SPLIT = 45;\n var DERIVED_SURFACE_TINT_C = 0.02;\n var ACCENT_FAN = \"split-complement\";\n var ACHROMATIC_CHROMA = 0.02;\n var DERIVED_ACCENT_HUE_ROTATION = 150;\n var DERIVED_ACCENT_FALLBACK_HUE = 250;\n var DERIVED_ACCENT_L = 0.62;\n var DERIVED_ACCENT_C = 0.16;\n var ACCENT_RAMP_L_MIN = 0.1;\n var ACCENT_RAMP_L_MAX = 0.95;\n var HUE_STABLE_CHROMA = 0.1;\n var FAN_MIN_CHROMA = 0.045;\n var HUE_TOLERANCE = 8;\n var LIGHTNESS_TOLERANCE = 0.05;\n var DEFAULT_TYPE_SCALE = 1.2;\n var DEFAULT_RADIUS_SCALE = 1;\n var BASE_TEXT_REM = 1;\n var DEFAULT_FONTS = {\n sans: 'system-ui, -apple-system, \"Segoe UI\", Roboto, sans-serif',\n mono: 'ui-monospace, \"SF Mono\", \"Cascadia Code\", Consolas, monospace',\n display: '\"Avenir Next\", \"Futura\", \"Century Gothic\", \"Trebuchet MS\", system-ui, -apple-system, \"Segoe UI\", sans-serif'\n };\n var TEXT_LIGHT = { l: 0.98, c: 0, h: 0, alpha: 1 };\n var TEXT_DARK = { l: 0.15, c: 0, h: 0, alpha: 1 };\n var TRUE_WHITE = { l: 1, c: 0, h: 0, alpha: 1 };\n var TRUE_BLACK = { l: 0, c: 0, h: 0, alpha: 1 };\n var TEXT_POLES = [TRUE_WHITE, TRUE_BLACK];\n function bestTruePole(bg) {\n return contrast2(TRUE_BLACK, bg) >= contrast2(TRUE_WHITE, bg) ? TRUE_BLACK : TRUE_WHITE;\n }\n var STATUS_TO_HUE = {\n success: \"green\",\n warn: \"yellow\",\n danger: \"red\",\n info: \"blue\"\n };\n var NEUTRAL_ACCENT_CHROMA = 0.13;\n var PALETTE_HUES = {\n red: { h: 25, c: 0.2 },\n orange: { h: 55, c: 0.18 },\n yellow: { h: 95, c: 0.17 },\n green: { h: 145, c: 0.18 },\n blue: { h: 250, c: 0.18 },\n purple: { h: 300, c: 0.18 },\n brown: { h: 50, c: 0.08 },\n pink: { h: 350, c: 0.16 },\n cyan: { h: 200, c: 0.14 },\n gray: \"gray\",\n white: \"white\",\n black: \"black\"\n };\n var PALETTE_STOPS = [\"subtle\", \"muted\", \"base\", \"strong\", \"contrast\"];\n var CODE_VIVID_ROLES = [\n \"keyword\",\n \"number\",\n \"function\",\n \"type\",\n \"string\",\n \"tag\",\n \"attr\",\n \"regexp\"\n ];\n var CODE_HUE_RANK = [0, 4, 2, 6, 1, 5, 3, 7];\n var CODE_STRUCTURAL_ROLES = [\"comment\", \"operator\", \"punctuation\", \"variable\"];\n var CODE_SCOPES = [...CODE_VIVID_ROLES, ...CODE_STRUCTURAL_ROLES];\n var CODE_SURFACES = [\"--code-bg\", \"--code-fg\", \"--code-line-highlight\", \"--code-selection\"];\n var SURFACES = [\"--body-bg\", \"--bg-0\", \"--bg-1\", \"--bg-2\", \"--bg-3\"];\n var PANEL_REF_INDEX = SURFACES.indexOf(\"--bg-2\");\n var PANEL_SURFACES = [\"--bg-1\", \"--bg-2\"];\n var TEXT_STEPS = [\"xs\", \"sm\", \"body\", \"lg\", \"xl\", \"2xl\", \"3xl\", \"4xl\", \"5xl\"];\n var LEADING_STEPS = [\"tight\", \"normal\", \"loose\"];\n var WEIGHT_STEPS = [\"normal\", \"medium\", \"semibold\", \"bold\"];\n var RADIUS_STEPS = [\"none\", \"sm\", \"md\", \"lg\", \"full\"];\n var BORDER_STEPS = [\"thin\", \"normal\", \"thick\"];\n var DURATION_STEPS = [\"fast\", \"base\", \"slow\"];\n var EASE_STEPS = [\"standard\", \"emphasized\"];\n var SPACE_STEPS = [0, 1, 2, 3, 4, 5, 6, 7, 8];\n var ELEVATION_STEPS = [0, 1, 2, 3, 4, 5];\n var WEIGHT_VALUES = {\n normal: 400,\n medium: 500,\n semibold: 600,\n bold: 700\n };\n var LEADING_VALUES = {\n tight: 1.2,\n normal: 1.5,\n loose: 1.8\n };\n var DENSITY_MULTIPLIER = {\n compact: 0.8,\n normal: 1,\n comfortable: 1.25\n };\n var SPACE_BASE_REM = 0.25;\n function buildProduces() {\n const produces = [];\n const categories = {};\n const add = (name, category) => {\n produces.push(name);\n categories[name] = category;\n };\n add(\"--bg-sunken\", \"color\");\n for (const s of SURFACES)\n add(s, \"color\");\n add(\"--scrim\", \"color\");\n add(\"--surface-overlay\", \"color\");\n add(\"--surface-overlay-border\", \"color\");\n for (let i = 0; i <= 3; i++)\n add(`--fg-${i}`, \"color\");\n add(\"--fg-disabled\", \"color\");\n add(\"--placeholder\", \"color\");\n add(\"--line\", \"color\");\n add(\"--line-2\", \"color\");\n add(\"--ring\", \"color\");\n add(\"--ring-bg\", \"color\");\n add(\"--accent\", \"color\");\n add(\"--accent-hover\", \"color\");\n add(\"--accent-active\", \"color\");\n add(\"--accent-bg\", \"color\");\n add(\"--accent-fg\", \"color\");\n add(\"--accent-text\", \"color\");\n add(\"--accent-vivid\", \"color\");\n for (const n of [\"2\", \"3\", \"4\"]) {\n add(`--accent-${n}`, \"color\");\n add(`--accent-${n}-bg`, \"color\");\n add(`--accent-${n}-fg`, \"color\");\n add(`--accent-${n}-text`, \"color\");\n add(`--accent-${n}-vivid`, \"color\");\n }\n add(\"--accent-shift-step\", \"number\");\n add(\"--neutral\", \"color\");\n add(\"--neutral-bg\", \"color\");\n add(\"--neutral-fg\", \"color\");\n add(\"--neutral-text\", \"color\");\n add(\"--neutral-vivid\", \"color\");\n add(\"--field-bg\", \"color\");\n add(\"--field-border\", \"color\");\n for (const role of Object.keys(STATUS_TO_HUE)) {\n add(`--${role}`, \"color\");\n add(`--${role}-bg`, \"color\");\n add(`--${role}-fg`, \"color\");\n add(`--${role}-text`, \"color\");\n add(`--${role}-vivid`, \"color\");\n }\n for (const s of [\"hover\", \"press\", \"selected\", \"disabled\", \"drag\"]) {\n add(`--state-${s}`, \"color\");\n }\n add(\"--link\", \"color\");\n add(\"--link-hover\", \"color\");\n add(\"--selection\", \"color\");\n add(\"--highlight\", \"color\");\n add(\"--selection-cue\", \"keyword\");\n add(\"--shadow\", \"shadow\");\n for (const hue3 of Object.keys(PALETTE_HUES)) {\n add(`--color-${hue3}`, \"color\");\n for (const stop of PALETTE_STOPS)\n add(`--color-${hue3}-${stop}`, \"color\");\n add(`--${hue3}`, \"color\");\n add(`--${hue3}-bg`, \"color\");\n add(`--${hue3}-fg`, \"color\");\n add(`--${hue3}-text`, \"color\");\n add(`--${hue3}-vivid`, \"color\");\n }\n for (const t of CODE_SURFACES)\n add(t, \"color\");\n for (const role of CODE_SCOPES)\n add(`--code-${role}`, \"color\");\n add(\"--font-sans\", \"font\");\n add(\"--font-mono\", \"font\");\n add(\"--font-display\", \"font\");\n for (const step of TEXT_STEPS)\n add(`--text-${step}`, \"length\");\n for (const step of LEADING_STEPS)\n add(`--leading-${step}`, \"number\");\n for (const step of WEIGHT_STEPS)\n add(`--weight-${step}`, \"number\");\n for (const step of RADIUS_STEPS)\n add(`--radius-${step}`, \"length\");\n for (const step of BORDER_STEPS)\n add(`--border-${step}`, \"length\");\n for (const step of DURATION_STEPS)\n add(`--duration-${step}`, \"duration\");\n for (const step of EASE_STEPS)\n add(`--ease-${step}`, \"easing\");\n for (const step of ELEVATION_STEPS)\n add(`--elevation-${step}`, \"shadow\");\n for (const step of SPACE_STEPS)\n add(`--space-${step}`, \"length\");\n return { produces, categories };\n }\n var { produces: PRODUCES, categories: CATEGORIES } = buildProduces();\n var KEYWORD_DOMAINS = {\n \"--selection-cue\": [\"tint\", \"marker\"]\n };\n function stepLightness(base, scheme, step, index) {\n const direction = scheme === \"dark\" ? 1 : -1;\n return base + direction * step * index;\n }\n function contrastBandFloor(knobs) {\n const band = knobs.contrastBand;\n if (typeof band === \"number\")\n return band;\n if (band === \"aaa\")\n return AAA;\n if (band === \"aa\")\n return AA;\n return void 0;\n }\n function vibrancyOf(knobs, preset) {\n const v = typeof knobs.vibrancy === \"number\" ? knobs.vibrancy : preset.defaultVibrancy;\n return Math.min(1, Math.max(0, v));\n }\n function typeScaleOf(knobs) {\n const v = typeof knobs.typeScale === \"number\" ? knobs.typeScale : DEFAULT_TYPE_SCALE;\n return Math.min(2, Math.max(1.05, v));\n }\n function radiusScaleOf(knobs) {\n const v = typeof knobs.radiusScale === \"number\" ? knobs.radiusScale : DEFAULT_RADIUS_SCALE;\n return Math.max(0, v);\n }\n function densityOf(knobs) {\n const d = knobs.density;\n if (typeof d === \"number\")\n return Math.max(0.4, d);\n if (d === \"compact\" || d === \"comfortable\")\n return DENSITY_MULTIPLIER[d];\n return DENSITY_MULTIPLIER.normal;\n }\n function fontsOf(knobs) {\n return {\n sans: knobs.fonts?.sans ?? DEFAULT_FONTS.sans,\n mono: knobs.fonts?.mono ?? DEFAULT_FONTS.mono,\n display: knobs.fonts?.display ?? DEFAULT_FONTS.display\n };\n }\n function emittedContrast(fg, bgCss) {\n return contrast2(formatCss2(fg), bgCss);\n }\n function enforceContrastFloor(fg, bg, scheme, floor = ENFORCE) {\n const bgCss = formatCss2(bg);\n if (emittedContrast(fg, bgCss) >= floor)\n return fg;\n const preferred = scheme === \"dark\" ? TRUE_WHITE.l : TRUE_BLACK.l;\n const other = scheme === \"dark\" ? TRUE_BLACK.l : TRUE_WHITE.l;\n const swept = sweepToward(fg, bgCss, preferred, floor) ?? sweepToward(fg, bgCss, other, floor);\n const pole = bestTruePole(bgCss);\n if (!swept)\n return pole;\n return emittedContrast(pole, bgCss) > emittedContrast(swept, bgCss) ? pole : swept;\n }\n function sweepToward(fg, bgCss, targetL, floor) {\n for (let i = 0; i <= 100; i++) {\n const t = i / 100;\n const candidate = {\n l: fg.l + (targetL - fg.l) * t,\n c: fg.c * (1 - t),\n h: fg.h,\n alpha: fg.alpha\n };\n if (emittedContrast(candidate, bgCss) >= floor)\n return candidate;\n }\n return null;\n }\n function bestPoleContrast(bg) {\n return Math.max(contrast2(TEXT_LIGHT, bg), contrast2(TEXT_DARK, bg));\n }\n function ensureTextHeadroom(bg, scheme, floor = ENFORCE) {\n if (bestPoleContrast(bg) >= floor)\n return bg;\n const target = scheme === \"dark\" ? 0 : 1;\n let candidate = bg;\n for (let i = 1; i <= 100; i++) {\n const t = i / 100;\n candidate = withLightness(bg, bg.l + (target - bg.l) * t);\n if (bestPoleContrast(candidate) >= floor)\n return candidate;\n }\n return withLightness(bg, target);\n }\n function fillWithTextHeadroom(l, c2, h, floor = ENFORCE) {\n const seed = oklch2(l, c2, h);\n if (bestPoleContrast(seed) >= floor)\n return seed;\n let fallback = seed;\n for (let i = 1; i <= 100; i++) {\n const down = oklch2(l - l * i / 100, c2, h);\n if (bestPoleContrast(down) >= floor)\n return down;\n const up = oklch2(l + (1 - l) * i / 100, c2, h);\n if (bestPoleContrast(up) >= floor)\n return up;\n fallback = bestPoleContrast(down) >= bestPoleContrast(up) ? down : up;\n }\n return fallback;\n }\n function lightnessForContrast(pole, bg, bgCss, target) {\n let bestL = pole.l;\n for (let i = 0; i <= 200; i++) {\n const t = i / 200;\n const candidateL = pole.l + (bg.l - pole.l) * t;\n if (emittedContrast(withLightness(pole, candidateL), bgCss) >= target)\n bestL = candidateL;\n else\n break;\n }\n return bestL;\n }\n function liftStopForContrast(fg, bgCss, target, towardLight) {\n if (contrast2(formatCss2(fg), bgCss) >= target)\n return fg;\n const poleL = towardLight ? 1 : 0;\n let best = fg;\n for (let i = 1; i <= 100; i++) {\n const candidate = clampToGamut(oklch2(fg.l + (poleL - fg.l) * (i / 100), fg.c, fg.h));\n best = candidate;\n if (contrast2(formatCss2(candidate), bgCss) >= target)\n return candidate;\n }\n return best;\n }\n function separateFillFromSurface(fill, surface, separation, textFloor) {\n const surfaceCss = formatCss2(surface);\n if (contrast2(formatCss2(fill), surfaceCss) >= separation)\n return fill;\n const headroom = Math.min(textFloor, bestPoleContrast(fill));\n const poleL = surface.l < 0.5 ? 1 : 0;\n let best = fill;\n for (let i = 1; i <= 100; i++) {\n const candidate = clampToGamut(oklch2(fill.l + (poleL - fill.l) * (i / 100), fill.c, fill.h));\n best = candidate;\n if (contrast2(formatCss2(candidate), surfaceCss) >= separation && bestPoleContrast(candidate) >= headroom - 0.01) {\n return candidate;\n }\n }\n return best;\n }\n function borderForContrast(seed, surface, minContrast) {\n const surfaceCss = formatCss2(surface);\n if (emittedContrast(seed, surfaceCss) >= minContrast)\n return seed;\n const targetL = surface.l < 0.5 ? 1 : 0;\n let candidate = seed;\n for (let i = 1; i <= 100; i++) {\n candidate = withLightness(seed, seed.l + (targetL - seed.l) * (i / 100));\n if (emittedContrast(candidate, surfaceCss) >= minContrast)\n break;\n }\n return candidate;\n }\n function readableOnTint(tint, hue3, floor, inkChroma) {\n const tintCss = formatCss2(tint);\n const towardDark = contrast2(\"#000000\", tintCss) >= contrast2(\"#ffffff\", tintCss);\n const targetL = towardDark ? 0 : 1;\n const seedChroma = inkChroma ?? (towardDark ? 0.06 : 0.04);\n const seed = oklch2(tint.l + (towardDark ? -0.4 : 0.4), seedChroma, hue3);\n for (let i = 0; i <= 100; i++) {\n const t = i / 100;\n const css = formatCss2({\n l: seed.l + (targetL - seed.l) * t,\n c: seed.c * (1 - t),\n h: hue3,\n alpha: 1\n });\n if (contrast2(css, tintCss) >= floor)\n return css;\n }\n return towardDark ? \"#000000\" : \"#ffffff\";\n }\n function readableHuedOnTintAndPanel(tint, hue3, tintFloor, panels, panelFloor, seedChroma) {\n const tintCss = formatCss2(tint);\n const panelCss = panels.map((p4) => formatCss2(p4));\n const sweep = (towardDark) => {\n const targetL = towardDark ? 0 : 1;\n const seed = towardDark ? oklch2(tint.l - 0.4, seedChroma, hue3) : oklch2(tint.l + 0.4, seedChroma * 0.667, hue3);\n const out = [];\n for (let i = 0; i <= 100; i++) {\n const t = i / 100;\n out.push(formatCss2({\n l: seed.l + (targetL - seed.l) * t,\n c: seed.c * (1 - t),\n h: hue3,\n alpha: 1\n }));\n }\n return out;\n };\n const minPanel = (css) => panelCss.length === 0 ? Infinity : Math.min(...panelCss.map((p4) => contrast2(css, p4)));\n let best = null;\n let bestMin = -1;\n for (const towardDark of [true, false]) {\n for (const css of sweep(towardDark)) {\n if (contrast2(css, tintCss) < tintFloor)\n continue;\n const m = minPanel(css);\n if (m >= panelFloor)\n return css;\n if (m > bestMin) {\n bestMin = m;\n best = css;\n }\n }\n }\n return best ?? readableOnTint(tint, hue3, tintFloor);\n }\n function vividOnPanel(hue3, panels, floor, targetChroma) {\n const panelCss = panels.map((p4) => formatCss2(p4));\n const minPanel = (css) => panelCss.length === 0 ? Infinity : Math.min(...panelCss.map((p4) => contrast2(css, p4)));\n const avgL = panels.reduce((sum, p4) => sum + p4.l, 0) / Math.max(1, panels.length);\n const towardLight = avgL < 0.5;\n let best = null;\n let bestChroma = -1;\n for (let i = 0; i <= 80; i++) {\n const t = i / 80;\n const l = towardLight ? 0.5 + t * 0.45 : 0.5 - t * 0.42;\n const chroma = clampToGamut(oklch2(l, targetChroma, hue3)).c;\n const css = formatCss2(oklch2(l, chroma, hue3));\n if (minPanel(css) >= floor && chroma > bestChroma) {\n bestChroma = chroma;\n best = css;\n }\n }\n return best ?? (towardLight ? \"#ffffff\" : \"#000000\");\n }\n function deriveAccentAnchor(bg, fg) {\n const sourceHue = bg.c >= ACHROMATIC_CHROMA ? bg.h : fg.c >= ACHROMATIC_CHROMA ? fg.h : void 0;\n const hue3 = sourceHue === void 0 ? DERIVED_ACCENT_FALLBACK_HUE : ((sourceHue + DERIVED_ACCENT_HUE_ROTATION) % 360 + 360) % 360;\n return clampToGamut(oklch2(DERIVED_ACCENT_L, DERIVED_ACCENT_C, hue3));\n }\n function shadowString(scheme, level, vibrancy, preset) {\n if (level <= 0)\n return \"none\";\n const baseAlpha = (scheme === \"dark\" ? 0.5 : 0.16) + vibrancy * 0.1 + preset.elevationAlphaBoost;\n const y = Math.max(1, Math.round(level * 2 * preset.elevationStrengthMul));\n const blur = Math.max(1, Math.round(level * 4 * preset.elevationStrengthMul));\n const spread = Math.max(0, level - 3);\n const alpha2 = Math.min(0.92, baseAlpha + level * 0.04);\n const ambientY = Math.max(1, Math.round(level / 2));\n const ambientBlur = Math.max(1, Math.round(level * 2 * preset.elevationStrengthMul));\n const ambientAlpha = Math.min(0.7, alpha2 * 0.6);\n return [\n `0 ${y}px ${blur}px ${spread}px rgba(0, 0, 0, ${alpha2.toFixed(2)})`,\n `0 ${ambientY}px ${ambientBlur}px 0 rgba(0, 0, 0, ${ambientAlpha.toFixed(2)})`\n ].join(\", \");\n }\n function paletteRamp(register, hue3, spec2, scheme, vibrancy, floor, preset, accent, panels, pinnedBase) {\n const set = (suffix, color) => {\n register[suffix ? `--color-${hue3}-${suffix}` : `--color-${hue3}`] = formatCss2(color);\n };\n const family = (solid, bg, fg, text, vivid) => {\n register[`--${hue3}`] = solid;\n register[`--${hue3}-bg`] = bg;\n register[`--${hue3}-fg`] = fg;\n register[`--${hue3}-text`] = text;\n register[`--${hue3}-vivid`] = vivid;\n };\n const grayscale = (lights, chroma2) => {\n const stops2 = lights.map((l) => oklch2(l, chroma2, 0));\n const baseStop = stops2[2];\n const subtleStop2 = stops2[0];\n const strongStop2 = liftStopForContrast(stops2[3], formatCss2(subtleStop2), AA + 0.2, stops2[3].l >= subtleStop2.l);\n const contrast4 = readableOnTint(baseStop, 0, AA + 0.3, 0);\n set(\"\", baseStop);\n set(\"subtle\", subtleStop2);\n set(\"muted\", stops2[1]);\n set(\"base\", baseStop);\n set(\"strong\", strongStop2);\n register[`--color-${hue3}-contrast`] = contrast4;\n family(formatCss2(baseStop), formatCss2(subtleStop2), contrast4, readableOnTint(subtleStop2, 0, AA + 0.2, 0), vividOnPanel(0, panels, floor, 0));\n };\n if (spec2 === \"white\") {\n grayscale([0.82, 0.9, 0.97, 1], 0);\n return;\n }\n if (spec2 === \"black\") {\n grayscale([0.05, 0.12, 0.2, 0.32], 0);\n return;\n }\n if (spec2 === \"gray\") {\n grayscale([0.4, 0.55, 0.68, 0.82], 5e-3);\n return;\n }\n const accentChromaFactor = Math.max(0.5, Math.min(1.6, accent.c / NEUTRAL_ACCENT_CHROMA));\n const chroma = spec2.c * accentChromaFactor * (0.6 + vibrancy * 0.7) * preset.paletteChromaMul;\n const baseL = scheme === \"dark\" ? 0.7 : 0.55;\n const lBias = Math.max(-0.06, Math.min(0.06, (accent.l - baseL) * 0.25));\n const ladderL = (scheme === \"dark\" ? [0.45, 0.58, baseL, 0.82] : [0.78, 0.66, baseL, 0.42]).map((l) => Math.max(0.05, Math.min(0.97, l + lBias)));\n const ladderC = [chroma * 0.7, chroma * 0.9, chroma, chroma * 0.85];\n const stops = ladderL.map((l, i) => clampToGamut(oklch2(l, ladderC[i], spec2.h)));\n const base = stops[2];\n const solidBase = pinnedBase ?? base;\n const subtleStop = stops[0];\n const strongStop = liftStopForContrast(stops[3], formatCss2(subtleStop), AA + 0.2, stops[3].l >= subtleStop.l);\n const contrast3 = readableOnTint(solidBase, spec2.h, Math.max(floor, AA + 0.3));\n set(\"\", base);\n set(\"subtle\", subtleStop);\n set(\"muted\", stops[1]);\n set(\"base\", base);\n set(\"strong\", strongStop);\n register[`--color-${hue3}-contrast`] = contrast3;\n const bg0p = panels[0];\n const washL = scheme === \"dark\" ? Math.max(0.2, bg0p.l + 0.08) : Math.min(0.92, bg0p.l - 0.04);\n const bgTint = ensureTextHeadroom(oklch2(washL, chroma * 0.35, spec2.h), scheme, AA + 0.3);\n const bgText = readableHuedOnTintAndPanel(bgTint, spec2.h, AA + 0.3, panels.slice(1), AA + 0.05, chroma);\n family(formatCss2(solidBase), formatCss2(bgTint), contrast3, bgText, vividOnPanel(spec2.h, panels, floor, chroma));\n }\n function schemeFromFg(fg) {\n return fg.l >= 0.5 ? \"dark\" : \"light\";\n }\n function deriveSurface(scheme, hue3, chroma, depth, floor) {\n const l = scheme === \"dark\" ? depth : 1 - depth;\n return ensureTextHeadroom(oklch2(l, chroma, hue3), scheme, floor);\n }\n function completeAnchors(preset, opts) {\n const pin = opts.constraints ?? {};\n const givenBg = parsePin(pin[\"--bg-0\"]);\n const givenFg = parsePin(pin[\"--fg-0\"]);\n const givenAccent = parsePin(pin[\"--accent\"]);\n const defBg = toOklchColor(preset.defaultAnchors.bg);\n const defFg = toOklchColor(preset.defaultAnchors.fg);\n const defScheme = schemeOf(defBg);\n const surfaceDepth = defScheme === \"dark\" ? defBg.l : 1 - defBg.l;\n const floor = Math.max(ENFORCE, preset.contrastFloor);\n const inferredScheme = givenBg ? schemeOf(givenBg) : givenFg ? schemeFromFg(givenFg) : defScheme;\n const scheme = opts.knobs?.scheme ?? inferredScheme;\n let bg;\n if (givenBg) {\n bg = scheme === schemeOf(givenBg) ? givenBg : withLightness(givenBg, 1 - givenBg.l);\n } else if (givenAccent || givenFg) {\n const hue3 = givenAccent?.h ?? givenFg.h;\n const tint = givenAccent ? DERIVED_SURFACE_TINT_C : 5e-3;\n bg = deriveSurface(scheme, hue3, tint, surfaceDepth, floor);\n } else {\n bg = scheme === defScheme ? defBg : withLightness(defBg, 1 - defBg.l);\n }\n const fg = givenFg ?? defFg;\n const accentExplicit = givenAccent !== null || preset.defaultAnchors.accent !== void 0;\n const accent = givenAccent ?? (preset.defaultAnchors.accent ? toOklchColor(preset.defaultAnchors.accent) : deriveAccentAnchor(bg, fg));\n return { bg, fg, accent, scheme, accentExplicit };\n }\n function parsePin(value) {\n if (!value)\n return null;\n try {\n const o = toOklchColor(value);\n if (Number.isNaN(o.l) || Number.isNaN(o.c))\n return null;\n return o;\n } catch {\n return null;\n }\n }\n function parseChromaticPin(value) {\n const o = parsePin(value);\n if (!o || Number.isNaN(o.h) || o.c < ACHROMATIC_CHROMA)\n return null;\n return o;\n }\n function paletteHueAngle(name) {\n const spec2 = PALETTE_HUES[name];\n return typeof spec2 === \"object\" ? spec2.h : 0;\n }\n function resolveStatusHue(role, pinned) {\n const name = STATUS_TO_HUE[role] ?? \"red\";\n const pin = parseChromaticPin(pinned[`--${name}`] ?? pinned[`--color-${name}-base`] ?? pinned[`--color-${name}`]);\n return pin ? pin.h : paletteHueAngle(name);\n }\n function buildGraph(preset, opts) {\n const completed = completeAnchors(preset, opts);\n const bg = completed.bg;\n const fgAnchor = completed.fg;\n const pinned = opts.constraints ?? {};\n const accent = pinned[\"--accent\"] ? toOklchColor(pinned[\"--accent\"]) : completed.accent;\n const scheme = completed.scheme;\n const knobs = opts.knobs ?? {};\n const shiftStep = typeof knobs.accentShiftStep === \"number\" ? knobs.accentShiftStep : DEFAULT_SHIFT_STEP;\n const accentSplit = typeof knobs.accentSplit === \"number\" ? knobs.accentSplit : DEFAULT_ACCENT_SPLIT;\n const band = contrastBandFloor(knobs);\n const floor = Math.max(ENFORCE, preset.contrastFloor, (band ?? 0) + 0.2);\n const extreme = preset.extreme === true;\n let vibrancy = vibrancyOf(knobs, preset);\n if (extreme)\n vibrancy = 1;\n const typeScale = typeScaleOf(knobs);\n const radiusScale = radiusScaleOf(knobs);\n const density = densityOf(knobs);\n const fonts = fontsOf(knobs);\n const surfaceStep = 0.045;\n const nodes = [];\n const lit = (name, value, refs) => {\n nodes.push(refs && refs.length ? { name, value, refs } : { name, value });\n };\n const pinKeys = new Set(Object.keys(pinned));\n const refIfPinned = (...names) => names.filter((n) => pinKeys.has(n));\n lit(\"--scheme\", scheme);\n const bg0 = pinned[\"--bg-0\"] ? toOklchColor(pinned[\"--bg-0\"]) : extreme ? oklch2(scheme === \"dark\" ? 0 : 1, 0, 0) : ensureTextHeadroom(withLightness(bg, stepLightness(bg.l, scheme, surfaceStep, 1)), scheme, floor);\n const pageFloor = (fill) => separateFillFromSurface(fill, bg0, SURFACE_SEPARATION, floor);\n const direction = scheme === \"dark\" ? 1 : -1;\n const surfaceColors = SURFACES.map((_, index) => withLightness(bg0, bg0.l + direction * surfaceStep * (index - 1)));\n SURFACES.forEach((name, index) => {\n lit(name, formatCss2(surfaceColors[index]), refIfPinned(\"--bg-0\"));\n });\n lit(\"--bg-sunken\", formatCss2(withLightness(bg0, bg0.l - direction * surfaceStep * 2)), refIfPinned(\"--bg-0\"));\n lit(\"--scrim\", formatCss2(oklch2(scheme === \"dark\" ? 0 : 0.1, 0, 0, 0.6)));\n const overlayBase = withLightness(bg0, scheme === \"dark\" ? bg0.l + 0.07 : bg0.l + 0.03);\n lit(\"--surface-overlay\", formatCss2(overlayBase), refIfPinned(\"--bg-0\"));\n lit(\"--surface-overlay-border\", formatCss2(withAlpha(withLightness(bg0, scheme === \"dark\" ? bg0.l + 0.25 : bg0.l - 0.2), 0.6)), refIfPinned(\"--bg-0\"));\n const fg0 = pinned[\"--fg-0\"] ? toOklchColor(pinned[\"--fg-0\"]) : extreme ? bestTruePole(formatCss2(bg0)) : enforceContrastFloor(withLightness(fgAnchor, scheme === \"dark\" ? Math.max(fgAnchor.l, 0.9) : Math.min(fgAnchor.l, 0.2)), bg0, scheme, floor);\n lit(\"--fg-0\", formatCss2(fg0), refIfPinned(\"--bg-0\", \"--fg-0\"));\n const fgBg0Css = formatCss2(bg0);\n const fg0Contrast = emittedContrast(fg0, fgBg0Css);\n const panelRef = surfaceColors[PANEL_REF_INDEX];\n const panelRefCss = formatCss2(panelRef);\n const panelSurfaces = PANEL_SURFACES.map((s) => surfaceColors[SURFACES.indexOf(s)]);\n const rampFloor = extreme ? Math.min(fg0Contrast, Math.max(floor, fg0Contrast * 0.66)) : Math.min(floor, fg0Contrast);\n const conservativeFloorL = (target) => {\n const againstBg0 = lightnessForContrast(fg0, bg0, fgBg0Css, target);\n const againstPanel = lightnessForContrast(fg0, panelRef, panelRefCss, target);\n return Math.abs(againstBg0 - fg0.l) <= Math.abs(againstPanel - fg0.l) ? againstBg0 : againstPanel;\n };\n const textLight = scheme === \"dark\";\n const enforceOnPanels = (color) => {\n const onBg0 = enforceContrastFloor(color, bg0, scheme, floor);\n const sameSidePanels = panelSurfaces.filter((p4) => p4.l < 0.5 === textLight);\n if (sameSidePanels.length === 0)\n return onBg0;\n const panelCss = sameSidePanels.map((p4) => formatCss2(p4));\n const minPanel = (c2) => Math.min(...panelCss.map((p4) => emittedContrast(c2, p4)));\n if (minPanel(onBg0) >= floor - 0.01)\n return onBg0;\n const targetL = textLight ? 1 : 0;\n let best = onBg0;\n let bestMin = minPanel(onBg0);\n for (let i = 1; i <= 100; i++) {\n const t = i / 100;\n const candidate = withLightness(onBg0, onBg0.l + (targetL - onBg0.l) * t);\n if (emittedContrast(candidate, fgBg0Css) < floor - 0.01)\n break;\n const m = minPanel(candidate);\n if (m > bestMin) {\n bestMin = m;\n best = candidate;\n }\n if (m >= floor)\n break;\n }\n return best;\n };\n const enforceChromaticOnPanels = (color) => {\n const bg0Css = formatCss2(bg0);\n const sameSidePanels = panelSurfaces.filter((p4) => p4.l < 0.5 === textLight);\n const refsCss = [bg0Css, ...sameSidePanels.map((p4) => formatCss2(p4))];\n const minRef = (c2) => Math.min(...refsCss.map((r2) => emittedContrast(c2, r2)));\n if (minRef(color) >= floor - 0.01)\n return color;\n const targetL = textLight ? 1 : 0;\n for (let i = 1; i <= 100; i++) {\n const candidate = withLightness(color, color.l + (targetL - color.l) * (i / 100));\n if (minRef(candidate) >= floor)\n return candidate;\n }\n return enforceOnPanels(color);\n };\n const floorL = conservativeFloorL(rampFloor);\n for (let i = 1; i <= 3; i++) {\n const reduced = withLightness(fg0, fg0.l + (floorL - fg0.l) * (i / 3));\n lit(`--fg-${i}`, formatCss2(reduced), [\"--fg-0\", ...refIfPinned(\"--bg-0\")]);\n }\n lit(\"--fg-disabled\", formatCss2(withLightness(fg0, conservativeFloorL(3))), [\"--fg-0\", ...refIfPinned(\"--bg-0\")]);\n const placeholderFloor = extreme ? rampFloor : Math.min(floor, fg0Contrast);\n const placeholderL = conservativeFloorL(placeholderFloor);\n lit(\"--placeholder\", formatCss2(withLightness(fg0, placeholderL)), [\"--fg-0\", ...refIfPinned(\"--bg-0\")]);\n const accentFill = pinned[\"--accent\"] || completed.accentExplicit ? accent : pageFloor(fillWithTextHeadroom(accent.l, accent.c * (0.6 + vibrancy * 0.8) * preset.accentChromaMul, accent.h, floor));\n const accentValue = pinned[\"--accent\"] ?? formatCss2(accentFill);\n lit(\"--accent\", accentValue, refIfPinned(\"--accent\"));\n lit(\"--accent-fg\", pickReadable(accentFill, TEXT_POLES, floor), [\"--accent\"]);\n const accentTextColor = enforceChromaticOnPanels(accentFill);\n const accentTextCss = formatCss2(accentTextColor);\n const accentTint = liftStopForContrast(oklch2(scheme === \"dark\" ? Math.max(0.2, bg0.l + 0.08) : Math.min(0.92, bg0.l - 0.04), accentFill.c * preset.accentTintChromaMul, accentFill.h), accentTextCss, AA + 0.2, accentTextColor.l < 0.5);\n lit(\"--accent-bg\", formatCss2(accentTint), [\"--accent\", ...refIfPinned(\"--bg-0\")]);\n lit(\"--accent-text\", accentTextCss, [\"--accent\", ...refIfPinned(\"--bg-0\")]);\n lit(\"--accent-vivid\", vividOnPanel(accentFill.h, [bg0, ...panelSurfaces], floor, accentFill.c), [\"--accent\", ...refIfPinned(\"--bg-0\")]);\n const pinnedNeutral = parsePin(pinned[\"--neutral\"]);\n const neutralFill = pinnedNeutral ?? pageFloor(fillWithTextHeadroom(scheme === \"dark\" ? 0.6 : 0.5, preset.neutralChroma, accentFill.h, floor));\n const neutralTintHue = Number.isFinite(neutralFill.h) ? neutralFill.h : accentFill.h;\n lit(\"--neutral\", formatCss2(neutralFill), [\"--accent\", ...refIfPinned(\"--neutral\")]);\n const neutralTextColor = enforceOnPanels(neutralFill);\n const neutralTextCss = formatCss2(neutralTextColor);\n const neutralTint = liftStopForContrast(oklch2(scheme === \"dark\" ? Math.max(0.2, bg0.l + 0.06) : Math.min(0.92, bg0.l - 0.04), 5e-3, neutralTintHue), neutralTextCss, AA + 0.2, neutralTextColor.l < 0.5);\n lit(\"--neutral-bg\", formatCss2(neutralTint), [\"--accent\", ...refIfPinned(\"--bg-0\")]);\n lit(\"--neutral-fg\", pickReadable(neutralFill, TEXT_POLES, floor), [\"--neutral\"]);\n lit(\"--neutral-text\", neutralTextCss, [\"--neutral\", ...refIfPinned(\"--bg-0\")]);\n lit(\"--neutral-vivid\", neutralTextCss, [\"--neutral-text\", ...refIfPinned(\"--bg-0\")]);\n const lineSeed = extreme ? oklch2(scheme === \"dark\" ? 0.7 : 0.3, 0, 0) : withLightness(bg0, scheme === \"dark\" ? bg0.l + 0.12 : bg0.l - 0.12);\n lit(\"--line\", formatCss2(borderForContrast(lineSeed, bg0, BORDER_SEPARATION)), refIfPinned(\"--bg-0\"));\n const line2Seed = extreme ? oklch2(scheme === \"dark\" ? 0.85 : 0.15, 0, 0) : withLightness(bg0, scheme === \"dark\" ? bg0.l + 0.2 : bg0.l - 0.2);\n lit(\"--line-2\", formatCss2(borderForContrast(line2Seed, bg0, DIVIDER_SEPARATION)), refIfPinned(\"--bg-0\"));\n lit(\"--ring\", formatCss2(withAlpha(accentFill, 0.7)), [\"--accent\"]);\n lit(\"--ring-bg\", formatCss2(withAlpha(accentFill, 0.18)), [\"--accent\"]);\n const fieldBg = withLightness(bg0, scheme === \"dark\" ? bg0.l - 0.03 : bg0.l + 0.02);\n lit(\"--field-bg\", formatCss2(fieldBg), refIfPinned(\"--bg-0\"));\n const fieldBorderSeed = extreme ? oklch2(scheme === \"dark\" ? 0.8 : 0.2, 0, 0) : withLightness(bg0, scheme === \"dark\" ? bg0.l + 0.16 : bg0.l - 0.16);\n lit(\"--field-border\", formatCss2(borderForContrast(fieldBorderSeed, fieldBg, BORDER_SEPARATION)), refIfPinned(\"--bg-0\"));\n lit(\"--accent-hover\", formatCss2(withLightness(accentFill, accentFill.l + (scheme === \"dark\" ? 0.06 : -0.06))), [\"--accent\"]);\n lit(\"--accent-active\", formatCss2(withLightness(accentFill, accentFill.l + (scheme === \"dark\" ? -0.06 : 0.06))), [\"--accent\"]);\n const accentDisplay = toOklchColor(accentValue);\n const accentDelta = (from, to) => ({\n dL: to.l - from.l,\n dC: to.c - from.c,\n dH: hueDelta(from.h, to.h)\n });\n const applyAccentDelta = (from, delta) => {\n const rawL = from.l + delta.dL;\n const l = delta.dL === 0 ? Math.min(1, Math.max(0, rawL)) : Math.min(ACCENT_RAMP_L_MAX, Math.max(ACCENT_RAMP_L_MIN, rawL));\n return {\n l,\n c: Math.max(0, from.c + delta.dC),\n h: ((from.h + delta.dH) % 360 + 360) % 360,\n alpha: 1\n };\n };\n const emitAccent = (color) => {\n const maxC = clampToGamut({ l: color.l, c: color.c, h: color.h, alpha: 1 }).c;\n return formatCss2({ ...color, c: Math.min(color.c, maxC) });\n };\n const a1 = accentDisplay;\n const fanBase = { ...a1, c: Math.max(a1.c, FAN_MIN_CHROMA) };\n const rotate = (deg) => ({ dL: 0, dC: 0, dH: deg });\n const fanned = (n, derived) => pinned[`--accent-${n}`] ? toOklchColor(pinned[`--accent-${n}`]) : derived;\n let a2;\n let a3;\n let a4;\n let a2Refs;\n let a3Refs;\n let a4Refs;\n if (ACCENT_FAN === \"split-complement\") {\n const mirrorOf = (c2) => applyAccentDelta(fanBase, rotate(-hueDelta(a1.h, c2.h)));\n const a2Pin = pinned[\"--accent-2\"];\n const a3Pin = pinned[\"--accent-3\"];\n let a2Derived = applyAccentDelta(fanBase, rotate(-accentSplit));\n let a3Derived = applyAccentDelta(fanBase, rotate(accentSplit));\n if (a2Pin && !a3Pin)\n a3Derived = mirrorOf(toOklchColor(a2Pin));\n else if (a3Pin && !a2Pin)\n a2Derived = mirrorOf(toOklchColor(a3Pin));\n a2 = fanned(\"2\", a2Derived);\n a3 = fanned(\"3\", a3Derived);\n a4 = fanned(\"4\", applyAccentDelta(fanBase, rotate(180)));\n a2Refs = a3Pin && !a2Pin ? [\"--accent\", \"--accent-3\"] : [\"--accent\"];\n a3Refs = a2Pin && !a3Pin ? [\"--accent\", \"--accent-2\"] : [\"--accent\"];\n a4Refs = [\"--accent\"];\n } else {\n a2 = fanned(\"2\", applyAccentDelta(fanBase, rotate(shiftStep)));\n a3 = fanned(\"3\", applyAccentDelta(a2, accentDelta(fanBase, a2)));\n a4 = fanned(\"4\", applyAccentDelta(a3, accentDelta(a2, a3)));\n a2Refs = [\"--accent\", \"--accent-shift-step\"];\n a3Refs = [\"--accent-2\", \"--accent\"];\n a4Refs = [\"--accent-3\", \"--accent-2\"];\n }\n lit(\"--accent-2\", emitAccent(a2), a2Refs);\n lit(\"--accent-3\", emitAccent(a3), a3Refs);\n lit(\"--accent-4\", emitAccent(a4), a4Refs);\n lit(\"--accent-shift-step\", String(shiftStep));\n const emitAccentFamily = (n, raw) => {\n const color = toOklchColor(emitAccent(raw));\n lit(`--accent-${n}-fg`, pickReadable(color, TEXT_POLES, floor), [`--accent-${n}`]);\n const tint = oklch2(scheme === \"dark\" ? Math.max(0.2, bg0.l + 0.08) : Math.min(0.92, bg0.l - 0.04), color.c * preset.accentTintChromaMul, color.h);\n lit(`--accent-${n}-bg`, formatCss2(tint), [`--accent-${n}`, ...refIfPinned(\"--bg-0\")]);\n lit(`--accent-${n}-text`, readableHuedOnTintAndPanel(tint, color.h, AA + 0.3, panelSurfaces, AA + 0.05, color.c), [`--accent-${n}-bg`, ...refIfPinned(\"--bg-0\")]);\n lit(`--accent-${n}-vivid`, vividOnPanel(color.h, [bg0, ...panelSurfaces], floor, color.c), [`--accent-${n}`, ...refIfPinned(\"--bg-0\")]);\n };\n emitAccentFamily(\"2\", a2);\n emitAccentFamily(\"3\", a3);\n emitAccentFamily(\"4\", a4);\n lit(\"--selection-cue\", extreme || knobs.cues === \"redundant\" ? \"marker\" : \"tint\");\n const statusChroma = Math.max(0.12, accent.c) * (0.6 + vibrancy * 0.7) * preset.statusChromaMul;\n for (const role of Object.keys(STATUS_TO_HUE)) {\n const namedHue = resolveStatusHue(role, pinned);\n const pinnedFill = parseChromaticPin(pinned[`--${role}`]);\n const roleHue = pinnedFill ? pinnedFill.h : namedHue;\n const fillL = scheme === \"dark\" ? 0.62 : 0.52;\n const fill = pinnedFill ?? pageFloor(fillWithTextHeadroom(fillL, statusChroma, roleHue, floor));\n const tintL = scheme === \"dark\" ? Math.min(0.3, bg0.l + 0.08) : Math.min(0.92, bg0.l - 0.04);\n const tint = ensureTextHeadroom(oklch2(tintL, statusChroma * 0.35, roleHue), scheme, AA + 0.3);\n const fillRefs = refIfPinned(\"--accent\", `--${role}`);\n lit(`--${role}`, formatCss2(fill), fillRefs);\n lit(`--${role}-bg`, formatCss2(tint), [`--${role}`, ...refIfPinned(\"--bg-0\")]);\n lit(`--${role}-fg`, pickReadable(fill, TEXT_POLES, floor), [`--${role}`]);\n lit(`--${role}-text`, readableHuedOnTintAndPanel(tint, roleHue, AA + 0.3, panelSurfaces, AA + 0.05, statusChroma), [`--${role}-bg`, ...refIfPinned(\"--bg-0\")]);\n lit(`--${role}-vivid`, vividOnPanel(roleHue, [bg0, ...panelSurfaces], floor, statusChroma), [`--${role}`, ...refIfPinned(\"--bg-0\")]);\n }\n const overlayL = scheme === \"dark\" ? 1 : 0;\n const extremeDist = scheme === \"dark\" ? bg0.l : 1 - bg0.l;\n const overlayBoost = 1 + Math.max(0, (0.15 - extremeDist) / 0.15) * 0.8;\n const overlay = (a) => formatCss2(oklch2(overlayL, 0, 0, Math.min(0.4, a * overlayBoost)));\n lit(\"--state-hover\", overlay(0.06));\n lit(\"--state-press\", overlay(0.12));\n lit(\"--state-selected\", overlay(0.16));\n lit(\"--state-disabled\", overlay(0.08));\n lit(\"--state-drag\", overlay(0.1));\n lit(\"--selection\", formatCss2(withAlpha(accentFill, 0.3)), [\"--accent\"]);\n lit(\"--highlight\", formatCss2(withAlpha(oklch2(scheme === \"dark\" ? 0.85 : 0.9, 0.16, paletteHueAngle(\"yellow\")), 0.35)));\n const linkColor = enforceChromaticOnPanels(accent);\n const linkCss = formatCss2(linkColor);\n let linkHoverColor = enforceChromaticOnPanels(withLightness(accent, accent.l + (scheme === \"dark\" ? 0.08 : -0.08)));\n if (formatCss2(linkHoverColor) === linkCss) {\n const pole = textLight ? 1 : 0;\n const toward = linkColor.l < pole ? 1 : -1;\n const distinctHover = (candidate) => {\n const enforced = enforceChromaticOnPanels(candidate);\n return formatCss2(enforced) === linkCss ? void 0 : enforced;\n };\n let hover;\n for (let step = 0.1; step <= 0.6 && !hover; step += 0.05) {\n hover = distinctHover(withLightness(linkColor, linkColor.l + toward * step));\n }\n for (let step = 0.1; step <= 0.6 && !hover; step += 0.05) {\n hover = distinctHover(withLightness(linkColor, linkColor.l - toward * step));\n }\n for (let cut = 0.7; cut >= 0.05 && !hover; cut -= 0.15) {\n hover = distinctHover(oklch2(linkColor.l, linkColor.c * cut, linkColor.h));\n }\n linkHoverColor = hover ?? linkHoverColor;\n }\n lit(\"--link\", formatCss2(linkColor), [\"--accent\", ...refIfPinned(\"--bg-0\")]);\n lit(\"--link-hover\", formatCss2(linkHoverColor), [\"--link\", ...refIfPinned(\"--bg-0\")]);\n for (const [hue3, spec2] of Object.entries(PALETTE_HUES)) {\n const pinnedBase = typeof spec2 === \"object\" ? parseChromaticPin(pinned[`--${hue3}`] ?? pinned[`--color-${hue3}-base`] ?? pinned[`--color-${hue3}`]) : null;\n const effectiveSpec = pinnedBase && typeof spec2 === \"object\" ? { h: pinnedBase.h, c: pinnedBase.c } : spec2;\n const ramp = {};\n paletteRamp(ramp, hue3, effectiveSpec, scheme, vibrancy, floor, preset, accent, [bg0, ...panelSurfaces], pinnedBase ?? void 0);\n lit(`--color-${hue3}`, ramp[`--color-${hue3}`]);\n for (const stop of PALETTE_STOPS) {\n lit(`--color-${hue3}-${stop}`, ramp[`--color-${hue3}-${stop}`], [\n `--color-${hue3}`\n ]);\n }\n lit(`--${hue3}`, ramp[`--${hue3}`], [`--color-${hue3}-base`]);\n lit(`--${hue3}-bg`, ramp[`--${hue3}-bg`], [`--color-${hue3}-subtle`]);\n lit(`--${hue3}-fg`, ramp[`--${hue3}-fg`], [`--color-${hue3}-base`]);\n lit(`--${hue3}-text`, ramp[`--${hue3}-text`], [`--color-${hue3}-subtle`]);\n lit(`--${hue3}-vivid`, ramp[`--${hue3}-vivid`], [\n `--color-${hue3}-base`,\n ...refIfPinned(\"--bg-0\")\n ]);\n }\n const codeBg = ensureTextHeadroom(withLightness(bg0, scheme === \"dark\" ? bg0.l - 0.02 : bg0.l + 0.012), scheme, floor);\n const codeBgCss = formatCss2(codeBg);\n lit(\"--code-bg\", codeBgCss, refIfPinned(\"--bg-0\"));\n const codeFg = enforceContrastFloor(fg0, codeBg, scheme, floor);\n const codeFgCss = formatCss2(codeFg);\n lit(\"--code-fg\", codeFgCss, [\"--fg-0\", ...refIfPinned(\"--bg-0\")]);\n lit(\"--code-line-highlight\", formatCss2(withAlpha(accentFill, 0.1)), [\"--accent\"]);\n lit(\"--code-selection\", formatCss2(withAlpha(accentFill, 0.3)), [\"--accent\"]);\n const codeTowardLight = contrast2(\"#ffffff\", codeBgCss) >= contrast2(\"#000000\", codeBgCss);\n const codePole = codeTowardLight ? 1 : 0;\n const codeFloor = AA;\n const readableHuedOnCode = (l, c2, h, fl) => {\n const seed = oklch2(l, c2, h);\n let best = seed;\n let bestContrast = emittedContrast(seed, codeBgCss);\n if (bestContrast >= fl)\n return seed;\n for (let i = 1; i <= 100; i++) {\n const cand = withLightness(seed, seed.l + (codePole - seed.l) * (i / 100));\n const ct = emittedContrast(cand, codeBgCss);\n if (ct >= fl)\n return cand;\n if (ct > bestContrast) {\n bestContrast = ct;\n best = cand;\n }\n }\n return best;\n };\n const codeChroma = Math.max(0.08, Math.max(0.1, accent.c) * (0.7 + vibrancy * 0.7) * preset.paletteChromaMul);\n const codeBaseHue = Number.isFinite(accent.h) ? accent.h : DERIVED_ACCENT_FALLBACK_HUE;\n const codeBaseL = codeTowardLight ? 0.76 : 0.46;\n const codePoleL = codeTowardLight ? 1 : 0;\n const aaEdgeL = lightnessForContrast(oklch2(codePoleL, 0, 0), codeBg, codeBgCss, codeFloor);\n const bandLo = aaEdgeL + (codePoleL - aaEdgeL) * 0.06;\n const bandHi = codePoleL - (codePoleL - aaEdgeL) * 0.32;\n CODE_VIVID_ROLES.forEach((role, rank) => {\n const hue3 = ((codeBaseHue + CODE_HUE_RANK[rank] * 45) % 360 + 360) % 360;\n const bandL = bandLo + (bandHi - bandLo) * (rank / 7);\n const fill = readableHuedOnCode(bandL, codeChroma, hue3, codeFloor);\n lit(`--code-${role}`, formatCss2(fill), [\"--accent\", \"--code-bg\"]);\n });\n const commentFloor = Math.max(3, codeFloor * 0.62);\n const commentL = codeTowardLight ? 0.6 : 0.56;\n lit(\"--code-comment\", formatCss2(readableHuedOnCode(commentL, Math.min(0.03, codeChroma * 0.3), codeBaseHue, commentFloor)), [\"--accent\", \"--code-bg\"]);\n lit(\"--code-operator\", formatCss2(readableHuedOnCode(codeBaseL, codeChroma * 0.5, codeBaseHue, codeFloor)), [\"--accent\", \"--code-bg\"]);\n lit(\"--code-punctuation\", formatCss2(enforceContrastFloor(withLightness(codeFg, codeFg.l + (codePole - codeFg.l) * 0.18), codeBg, scheme, codeFloor)), [\"--code-fg\", \"--code-bg\"]);\n lit(\"--code-variable\", codeFgCss, [\"--code-fg\"]);\n lit(\"--font-sans\", fonts.sans);\n lit(\"--font-mono\", fonts.mono);\n lit(\"--font-display\", fonts.display);\n const bodyIndex = TEXT_STEPS.indexOf(\"body\");\n TEXT_STEPS.forEach((step, index) => {\n const rem = BASE_TEXT_REM * typeScale ** (index - bodyIndex);\n lit(`--text-${step}`, `${rem.toFixed(4).replace(/\\.?0+$/, \"\")}rem`);\n });\n for (const step of LEADING_STEPS) {\n lit(`--leading-${step}`, String(LEADING_VALUES[step]));\n }\n for (const step of WEIGHT_STEPS) {\n lit(`--weight-${step}`, String(WEIGHT_VALUES[step]));\n }\n const radiusPx = {\n none: 0,\n sm: 2 * radiusScale,\n md: 4 * radiusScale,\n lg: 8 * radiusScale,\n full: 9999\n };\n for (const step of RADIUS_STEPS) {\n lit(`--radius-${step}`, `${radiusPx[step]}px`);\n }\n const borderPx = { thin: 1, normal: 1.5, thick: 2 };\n for (const step of BORDER_STEPS) {\n lit(`--border-${step}`, `${borderPx[step]}px`);\n }\n const durationMs = { fast: 120, base: 200, slow: 320 };\n for (const step of DURATION_STEPS) {\n lit(`--duration-${step}`, `${durationMs[step]}ms`);\n }\n lit(\"--ease-standard\", \"cubic-bezier(0.2, 0, 0, 1)\");\n lit(\"--ease-emphasized\", \"cubic-bezier(0.3, 0, 0, 1)\");\n const elevationStrings = {};\n for (const level of ELEVATION_STEPS) {\n const value = shadowString(scheme, level, vibrancy, preset);\n elevationStrings[level] = value;\n lit(`--elevation-${level}`, value);\n }\n lit(\"--shadow\", elevationStrings[3], [\"--elevation-3\"]);\n for (const step of SPACE_STEPS) {\n const rem = SPACE_BASE_REM * step * density;\n lit(`--space-${step}`, `${rem.toFixed(4).replace(/\\.?0+$/, \"\")}rem`);\n }\n const producedNames = new Set(nodes.map((n) => n.name));\n for (const [name, value] of Object.entries(pinned)) {\n if (producedNames.has(name)) {\n for (const node of nodes) {\n if (node.name === name) {\n node.value = value;\n node.resolve = void 0;\n node.refs = void 0;\n }\n }\n } else {\n nodes.push({ name, value });\n }\n }\n return nodes;\n }\n function resolveBaseInputs(preset, opts) {\n const completed = completeAnchors(preset, opts);\n return {\n knobs: opts.knobs ?? {},\n scheme: completed.scheme,\n pinned: opts.constraints ?? {}\n };\n }\n function buildPassContext(preset, opts, passIndex) {\n const base = resolveBaseInputs(preset, opts);\n return { ...base, passIndex };\n }\n function runPipeline(passes, makeCtx) {\n let register = {};\n const trace = [];\n passes.forEach((pass, index) => {\n register = pass.run(register, makeCtx(index));\n trace.push({ name: pass.name, register });\n });\n return { register, trace };\n }\n function settlePass(preset, opts) {\n return {\n name: \"settle\",\n run: () => resolveGraph(buildGraph(preset, opts))\n };\n }\n function registerToNodes(register) {\n return Object.entries(register).map(([name, value]) => ({ name, value }));\n }\n function alpha(value) {\n if (!value)\n return 1;\n const rgba = /rgba?\\([^)]*?,\\s*([0-9.]+)\\s*\\)/.exec(value);\n if (rgba && rgba[1] !== void 0)\n return Number.parseFloat(rgba[1]);\n if (value.startsWith(\"#\") && value.length === 9) {\n return Number.parseInt(value.slice(7, 9), 16) / 255;\n }\n if (value.startsWith(\"#\") && value.length === 5) {\n return Number.parseInt(value.slice(4, 5).repeat(2), 16) / 255;\n }\n return 1;\n }\n function parseRem(value) {\n if (!value)\n return Number.NaN;\n const m = /^(-?[0-9.]+)(rem|px)$/.exec(value.trim());\n return m ? Number.parseFloat(m[1]) : Number.NaN;\n }\n function parseMs(value) {\n if (!value)\n return Number.NaN;\n const m = /^(-?[0-9.]+)ms$/.exec(value.trim());\n return m ? Number.parseFloat(m[1]) : Number.NaN;\n }\n function shadowStrength(value) {\n if (!value || value === \"none\")\n return 0;\n let total = 0;\n const offsets = value.match(/([0-9.]+)px/g) ?? [];\n for (const off of offsets)\n total += Number.parseFloat(off);\n const alphas = value.match(/rgba?\\([^)]*,\\s*([0-9.]+)\\)/g) ?? [];\n for (const a of alphas) {\n const m = /,\\s*([0-9.]+)\\)/.exec(a);\n if (m)\n total += Number.parseFloat(m[1]) * 20;\n }\n return total;\n }\n var STATE_TOKENS = [\n \"--state-hover\",\n \"--state-press\",\n \"--state-selected\",\n \"--state-disabled\",\n \"--state-drag\"\n ];\n var CEILING_EPSILON = 0.05;\n function achievableFloor(declaredFloor, bgCss) {\n if (!bgCss)\n return declaredFloor;\n const ceiling = Math.max(contrast2(\"#000000\", bgCss), contrast2(\"#ffffff\", bgCss));\n return Math.min(declaredFloor, ceiling - CEILING_EPSILON);\n }\n function oklabDist(a, b) {\n const x = toOklchColor(a);\n const y = toOklchColor(b);\n const rad = Math.PI / 180;\n const ax = x.c * Math.cos(x.h * rad);\n const ay = x.c * Math.sin(x.h * rad);\n const bx = y.c * Math.cos(y.h * rad);\n const by = y.c * Math.sin(y.h * rad);\n return Math.hypot(x.l - y.l, ax - bx, ay - by);\n }\n function makeInvariants(preset) {\n const onFillFloor = preset.declaredTextOnFillFloor;\n return [\n (ctx) => {\n for (const name of PRODUCES) {\n const value = ctx.register[name];\n const category = ctx.categories[name];\n if (typeof value !== \"string\" || value.length === 0) {\n return {\n name: \"every token non-empty and format-valid for its category\",\n ok: false,\n detail: `${name} is ${value === void 0 ? \"missing\" : \"empty\"}`\n };\n }\n if (/nan/i.test(value)) {\n return {\n name: \"every token non-empty and format-valid for its category\",\n ok: false,\n detail: `${name} contains NaN: ${value}`\n };\n }\n switch (category) {\n case \"color\": {\n try {\n const o = toOklchColor(value);\n if (Number.isNaN(o.l) || Number.isNaN(o.c) || Number.isNaN(o.h) || Number.isNaN(alpha(value))) {\n return {\n name: \"every token non-empty and format-valid for its category\",\n ok: false,\n detail: `${name} parses to NaN: ${value}`\n };\n }\n } catch (error) {\n return {\n name: \"every token non-empty and format-valid for its category\",\n ok: false,\n detail: `${name} unparseable color: ${value} (${String(error)})`\n };\n }\n break;\n }\n case \"length\": {\n if (Number.isNaN(parseRem(value))) {\n return {\n name: \"every token non-empty and format-valid for its category\",\n ok: false,\n detail: `${name} not a css length: ${value}`\n };\n }\n break;\n }\n case \"duration\": {\n if (Number.isNaN(parseMs(value))) {\n return {\n name: \"every token non-empty and format-valid for its category\",\n ok: false,\n detail: `${name} not a duration: ${value}`\n };\n }\n break;\n }\n case \"number\": {\n if (Number.isNaN(Number.parseFloat(value))) {\n return {\n name: \"every token non-empty and format-valid for its category\",\n ok: false,\n detail: `${name} not a number: ${value}`\n };\n }\n break;\n }\n case \"easing\": {\n if (!value.startsWith(\"cubic-bezier(\")) {\n return {\n name: \"every token non-empty and format-valid for its category\",\n ok: false,\n detail: `${name} not an easing: ${value}`\n };\n }\n break;\n }\n case \"shadow\": {\n if (value !== \"none\" && !value.includes(\"rgba\")) {\n return {\n name: \"every token non-empty and format-valid for its category\",\n ok: false,\n detail: `${name} not a shadow: ${value}`\n };\n }\n break;\n }\n case \"font\":\n break;\n case \"keyword\": {\n const domain = KEYWORD_DOMAINS[name];\n if (domain && !domain.includes(value)) {\n return {\n name: \"every token non-empty and format-valid for its category\",\n ok: false,\n detail: `${name} not in {${domain.join(\" | \")}}: ${value}`\n };\n }\n break;\n }\n }\n }\n return { name: \"every token non-empty and format-valid for its category\", ok: true };\n },\n (ctx) => {\n const name = `fg-0 on bg-0 clears ${onFillFloor >= AAA - 0.01 ? \"AAA\" : \"AA\"}`;\n if (ctx.constraints[\"--fg-0\"]) {\n return { name, ok: true, detail: \"skipped (pinned text)\" };\n }\n const fg0 = ctx.register[\"--fg-0\"];\n const bg0 = ctx.register[\"--bg-0\"];\n const ratio = fg0 && bg0 ? contrast2(fg0, bg0) : 0;\n const required = achievableFloor(onFillFloor, ctx.constraints[\"--bg-0\"] ? bg0 : void 0);\n return {\n name,\n ok: ratio >= required - 0.01,\n detail: `contrast ${ratio.toFixed(2)} (floor ${required.toFixed(2)}${ctx.constraints[\"--bg-0\"] ? ` best-achievable, declared ${onFillFloor}` : \"\"})`\n };\n },\n (ctx) => {\n const name = `fg ramp clears ${preset.contrastFloor >= AAA - 0.01 ? \"AAA\" : \"AA\"}`;\n if (ctx.constraints[\"--fg-0\"]) {\n return { name, ok: true, detail: \"skipped (pinned text)\" };\n }\n const bg0 = ctx.register[\"--bg-0\"];\n if (!bg0)\n return { name, ok: false, detail: \"missing --bg-0\" };\n const required = achievableFloor(preset.contrastFloor, ctx.constraints[\"--bg-0\"] ? bg0 : void 0);\n for (let i = 1; i <= 3; i++) {\n const key = `--fg-${i}`;\n if (ctx.constraints[key])\n continue;\n const fg = ctx.register[key];\n const ratio = fg ? contrast2(fg, bg0) : 0;\n if (ratio < required - 0.01) {\n return {\n name,\n ok: false,\n detail: `${key} contrast ${ratio.toFixed(2)} (floor ${required.toFixed(2)}${ctx.constraints[\"--bg-0\"] ? ` best-achievable, declared ${preset.contrastFloor}` : \"\"})`\n };\n }\n }\n return { name, ok: true };\n },\n (ctx) => {\n const pairs = [\n [\"--accent-fg\", \"--accent\"],\n [\"--neutral-fg\", \"--neutral\"],\n [\"--success-fg\", \"--success\"],\n [\"--warn-fg\", \"--warn\"],\n [\"--danger-fg\", \"--danger\"],\n [\"--info-fg\", \"--info\"],\n [\"--accent-text\", \"--bg-0\"],\n [\"--neutral-text\", \"--bg-0\"]\n ];\n const surfaceFill = new Set(SURFACES);\n for (const [fgName, fillName] of pairs) {\n const fill = ctx.register[fillName];\n const pinned = Boolean(ctx.constraints[fillName]);\n if (pinned && !surfaceFill.has(fillName))\n continue;\n const fg = ctx.register[fgName];\n if (!fg || !fill)\n continue;\n const required = pinned ? achievableFloor(onFillFloor, fill) : onFillFloor;\n if (contrast2(fg, fill) < required - 0.01) {\n return {\n name: `on-fill text clears ${onFillFloor >= AAA - 0.01 ? \"AAA\" : \"AA\"}`,\n ok: false,\n detail: `${fgName} on ${fillName} = ${contrast2(fg, fill).toFixed(2)} (floor ${required.toFixed(2)}${pinned ? \" best-achievable\" : \"\"})`\n };\n }\n }\n return {\n name: `on-fill text clears ${onFillFloor >= AAA - 0.01 ? \"AAA\" : \"AA\"}`,\n ok: true\n };\n },\n (ctx) => {\n const pairs = [\n [\"--success-text\", \"--success-bg\"],\n [\"--warn-text\", \"--warn-bg\"],\n [\"--danger-text\", \"--danger-bg\"],\n [\"--info-text\", \"--info-bg\"]\n ];\n for (const [fgName, fillName] of pairs) {\n const fg = ctx.register[fgName];\n const fill = ctx.register[fillName];\n if (!fg || !fill)\n continue;\n if (contrast2(fg, fill) < AA - 0.01) {\n return {\n name: \"text-on-tint clears AA\",\n ok: false,\n detail: `${fgName} on ${fillName} = ${contrast2(fg, fill).toFixed(2)}`\n };\n }\n }\n return { name: \"text-on-tint clears AA\", ok: true };\n },\n (ctx) => {\n const name = \"achromatic tone inks stay neutral\";\n const achromatic = [\"gray\", \"white\", \"black\"];\n for (const hue3 of achromatic) {\n for (const token of [`--${hue3}-fg`, `--${hue3}-text`, `--color-${hue3}-contrast`]) {\n const value = ctx.register[token];\n if (!value)\n continue;\n const c2 = toOklchColor(value).c;\n if (c2 >= ACHROMATIC_CHROMA) {\n return { name, ok: false, detail: `${token} = ${value} (chroma ${c2.toFixed(3)} \\u2265 ${ACHROMATIC_CHROMA})` };\n }\n }\n }\n return { name, ok: true };\n },\n (ctx) => {\n const name = \"panel text clears AA on --bg-1 and --bg-2\";\n const neutralText = [\n \"--fg-1\",\n \"--fg-2\",\n \"--fg-3\",\n \"--placeholder\",\n \"--link\",\n \"--accent-text\",\n \"--neutral-text\",\n \"--neutral-vivid\"\n ];\n if (ctx.constraints[\"--bg-0\"])\n return { name, ok: true, detail: \"skipped (pinned bg-0)\" };\n const bg0 = ctx.register[\"--bg-0\"];\n if (!bg0)\n return { name, ok: true };\n const textLight = ctx.scheme === \"dark\";\n const themePole = textLight ? \"#ffffff\" : \"#000000\";\n const band = contrastBandFloor(ctx.knobs);\n const inkFloor = Math.max(ENFORCE, preset.contrastFloor, (band ?? 0) + 0.2);\n const statusRoles = Object.keys(STATUS_TO_HUE);\n for (const panel of PANEL_SURFACES) {\n const bg = ctx.register[panel];\n if (!bg)\n continue;\n const bgL = toOklchColor(bg).l;\n if (bgL < 0.5 !== textLight)\n continue;\n const poleCeiling = contrast2(themePole, bg);\n const required = Math.min(AA, poleCeiling - CEILING_EPSILON);\n const fg0Reach = (() => {\n const v = ctx.register[\"--fg-0\"];\n return v ? contrast2(v, bg) : Infinity;\n })();\n const inkReach = (source) => {\n const v = ctx.register[source];\n if (!v)\n return Infinity;\n const ink = toOklchColor(v);\n const targetL = textLight ? 1 : 0;\n let reach = contrast2(v, bg);\n for (let i = 1; i <= 100; i++) {\n const t = i / 100;\n const candidate = withLightness(ink, ink.l + (targetL - ink.l) * t);\n if (contrast2(formatCss2(candidate), bg0) < inkFloor - 0.01)\n break;\n reach = Math.max(reach, contrast2(formatCss2(candidate), bg));\n }\n return reach;\n };\n const accentInkReach = inkReach(\"--accent\");\n const neutralInkReach = inkReach(\"--neutral\");\n const check = (token, ceilingReach = Infinity) => {\n const fg = ctx.register[token];\n if (!fg)\n return null;\n const floorFor = Math.min(required, ceilingReach);\n const ratio = contrast2(fg, bg);\n if (ratio < floorFor - 0.05) {\n return {\n name,\n ok: false,\n detail: `${token} on ${panel} = ${ratio.toFixed(2)} (floor ${floorFor.toFixed(2)})`\n };\n }\n return null;\n };\n const fg0Bounded = /* @__PURE__ */ new Set([\"--fg-1\", \"--fg-2\", \"--fg-3\", \"--placeholder\"]);\n const accentBounded = /* @__PURE__ */ new Set([\"--link\", \"--accent-text\"]);\n const reachFor = (token) => {\n if (fg0Bounded.has(token))\n return fg0Reach;\n if (accentBounded.has(token))\n return accentInkReach;\n if (token === \"--neutral-text\" || token === \"--neutral-vivid\")\n return neutralInkReach;\n return Infinity;\n };\n for (const token of neutralText) {\n const fail = check(token, reachFor(token));\n if (fail)\n return fail;\n }\n for (const role of statusRoles) {\n const tintBg = ctx.register[`--${role}-bg`];\n if (tintBg) {\n const whiteJoint = contrast2(\"#ffffff\", tintBg) >= AA && contrast2(\"#ffffff\", bg) >= AA;\n const blackJoint = contrast2(\"#000000\", tintBg) >= AA && contrast2(\"#000000\", bg) >= AA;\n if (!whiteJoint && !blackJoint)\n continue;\n }\n const fail = check(`--${role}-text`);\n if (fail)\n return fail;\n const failVivid = check(`--${role}-vivid`);\n if (failVivid)\n return failVivid;\n }\n }\n return { name, ok: true };\n },\n (ctx) => {\n const name = \"solid fills separate from --bg-0\";\n const bg0 = ctx.register[\"--bg-0\"];\n if (!bg0)\n return { name, ok: true };\n const fills = [\"--accent\", \"--neutral\", ...Object.keys(STATUS_TO_HUE).map((r2) => `--${r2}`)];\n for (const token of fills) {\n if (ctx.constraints[token])\n continue;\n const fill = ctx.register[token];\n if (!fill)\n continue;\n const ratio = contrast2(fill, bg0);\n if (ratio < SURFACE_SEPARATION - 0.05) {\n return { name, ok: false, detail: `${token} = ${ratio.toFixed(2)} on --bg-0 (floor ${SURFACE_SEPARATION})` };\n }\n }\n return { name, ok: true };\n },\n (ctx) => {\n const name = \"borders separate from their surface\";\n const borders = [\n [\"--line\", \"--bg-0\", BORDER_SEPARATION],\n [\"--line-2\", \"--bg-0\", DIVIDER_SEPARATION],\n [\"--field-border\", \"--field-bg\", BORDER_SEPARATION]\n ];\n for (const [token, surface, separation] of borders) {\n if (ctx.constraints[token])\n continue;\n const border = ctx.register[token];\n const bg = ctx.register[surface];\n if (!border || !bg)\n continue;\n const ratio = contrast2(border, bg);\n if (ratio < separation - 0.05) {\n return { name, ok: false, detail: `${token} = ${ratio.toFixed(2)} on ${surface} (floor ${separation})` };\n }\n }\n return { name, ok: true };\n },\n (ctx) => {\n const ladder = [\"--bg-sunken\", ...SURFACES];\n const ls = ladder.map((name) => {\n const value = ctx.register[name];\n return value ? toOklchColor(value).l : 0;\n });\n const ascending = ctx.scheme === \"dark\";\n for (let i = 1; i < ls.length; i++) {\n const prev = ls[i - 1];\n const cur = ls[i];\n const ok = ascending ? cur >= prev - 1e-6 : cur <= prev + 1e-6;\n if (!ok) {\n return {\n name: \"surface lightness monotonic\",\n ok: false,\n detail: `${ladder[i - 1]}=${prev.toFixed(3)} ${ladder[i]}=${cur.toFixed(3)} (${ctx.scheme})`\n };\n }\n }\n return { name: \"surface lightness monotonic\", ok: true };\n },\n (ctx) => {\n for (const name of STATE_TOKENS) {\n const value = ctx.register[name];\n if (!value)\n continue;\n const a = alpha(value);\n if (a >= 1) {\n return {\n name: \"state overlays translucent\",\n ok: false,\n detail: `${name} alpha ${a}`\n };\n }\n }\n return { name: \"state overlays translucent\", ok: true };\n },\n (ctx) => {\n const linkName = `links clear ${onFillFloor >= AAA - 0.01 ? \"AAA\" : \"AA\"} on bg-0`;\n const bg0 = ctx.register[\"--bg-0\"];\n const required = achievableFloor(onFillFloor, ctx.constraints[\"--bg-0\"] ? bg0 : void 0);\n for (const name of [\"--link\", \"--link-hover\"]) {\n const link = ctx.register[name];\n if (!link || !bg0)\n continue;\n const ratio = contrast2(link, bg0);\n if (ratio < required - 0.01) {\n return {\n name: linkName,\n ok: false,\n detail: `${name} on --bg-0 = ${ratio.toFixed(2)} (floor ${required.toFixed(2)}${ctx.constraints[\"--bg-0\"] ? \" best-achievable\" : \"\"})`\n };\n }\n }\n return { name: linkName, ok: true };\n },\n (ctx) => {\n const name = \"link hover distinct from link\";\n const link = ctx.register[\"--link\"];\n const hover = ctx.register[\"--link-hover\"];\n if (!link || !hover)\n return { name, ok: true };\n if (ctx.constraints[\"--link\"] || ctx.constraints[\"--link-hover\"])\n return { name, ok: true };\n if (link === hover) {\n if (link === \"#000000\" || link === \"#ffffff\")\n return { name, ok: true };\n return { name, ok: false, detail: `--link and --link-hover both ${link}` };\n }\n return { name, ok: true };\n },\n (ctx) => {\n const name = \"unpinned accent ramp holds its fan at constant L/C\";\n const accentValue = ctx.register[\"--accent\"];\n if (!accentValue) {\n return { name, ok: true };\n }\n const accent = toOklchColor(accentValue);\n if (accent.c < HUE_STABLE_CHROMA) {\n return { name, ok: true };\n }\n const step = typeof ctx.knobs.accentShiftStep === \"number\" ? ctx.knobs.accentShiftStep : DEFAULT_SHIFT_STEP;\n const split = typeof ctx.knobs.accentSplit === \"number\" ? ctx.knobs.accentSplit : DEFAULT_ACCENT_SPLIT;\n const accent2Value = ctx.register[\"--accent-2\"];\n const accent3Value = ctx.register[\"--accent-3\"];\n const pinnedAccent2 = ctx.constraints[\"--accent-2\"] && accent2Value ? toOklchColor(accent2Value) : null;\n const pinnedAccent3 = ctx.constraints[\"--accent-3\"] && accent3Value ? toOklchColor(accent3Value) : null;\n const fanOffset = (n) => ACCENT_FAN === \"split-complement\" ? n === 2 ? pinnedAccent3 ? -hueDelta(accent.h, pinnedAccent3.h) : -split : n === 3 ? pinnedAccent2 ? -hueDelta(accent.h, pinnedAccent2.h) : split : 180 : step * (n - 1);\n for (let n = 2; n <= 4; n++) {\n if (ctx.constraints[`--accent-${n}`])\n continue;\n const value = ctx.register[`--accent-${n}`];\n if (!value)\n continue;\n const rotated = toOklchColor(value);\n const wantH = ((accent.h + fanOffset(n)) % 360 + 360) % 360;\n if (rotated.c >= HUE_STABLE_CHROMA) {\n let dh = Math.abs(rotated.h - wantH) % 360;\n if (dh > 180)\n dh = 360 - dh;\n if (dh > HUE_TOLERANCE) {\n return {\n name,\n ok: false,\n detail: `--accent-${n} h=${rotated.h.toFixed(1)} want ${wantH.toFixed(1)}`\n };\n }\n }\n if (Math.abs(rotated.l - accent.l) > LIGHTNESS_TOLERANCE) {\n return {\n name,\n ok: false,\n detail: `--accent-${n} l=${rotated.l.toFixed(3)} want ${accent.l.toFixed(3)}`\n };\n }\n const maxChroma = clampToGamut({ l: accent.l, c: accent.c, h: wantH, alpha: 1 }).c;\n const expectedChroma = Math.min(accent.c, maxChroma);\n if (Math.abs(rotated.c - expectedChroma) > 0.02) {\n return {\n name,\n ok: false,\n detail: `--accent-${n} chroma ${rotated.c.toFixed(3)} want max-at-hue ${expectedChroma.toFixed(3)}`\n };\n }\n }\n return { name, ok: true };\n },\n (ctx) => {\n for (const name of [\"--ring\", \"--ring-bg\", \"--scrim\", \"--selection\", \"--highlight\"]) {\n const value = ctx.register[name];\n if (!value)\n continue;\n if (alpha(value) >= 1) {\n return {\n name: \"ring/scrim/selection/highlight carry alpha < 1\",\n ok: false,\n detail: `${name} alpha ${alpha(value)}`\n };\n }\n }\n return { name: \"ring/scrim/selection/highlight carry alpha < 1\", ok: true };\n },\n (ctx) => {\n let prev = -Infinity;\n for (const step of TEXT_STEPS) {\n const rem = parseRem(ctx.register[`--text-${step}`]);\n if (Number.isNaN(rem)) {\n return {\n name: \"type scale strictly increasing\",\n ok: false,\n detail: `--text-${step} not a length`\n };\n }\n if (rem <= prev) {\n return {\n name: \"type scale strictly increasing\",\n ok: false,\n detail: `--text-${step}=${rem} not > ${prev}`\n };\n }\n prev = rem;\n }\n return { name: \"type scale strictly increasing\", ok: true };\n },\n (ctx) => {\n let prev = -Infinity;\n for (const step of WEIGHT_STEPS) {\n const w = Number.parseFloat(ctx.register[`--weight-${step}`] ?? \"\");\n if (Number.isNaN(w) || w <= prev) {\n return {\n name: \"weights strictly increasing\",\n ok: false,\n detail: `--weight-${step}=${w} not > ${prev}`\n };\n }\n prev = w;\n }\n return { name: \"weights strictly increasing\", ok: true };\n },\n (ctx) => {\n let prev = -Infinity;\n for (const step of LEADING_STEPS) {\n const v = Number.parseFloat(ctx.register[`--leading-${step}`] ?? \"\");\n if (Number.isNaN(v) || v <= prev) {\n return {\n name: \"leading strictly increasing\",\n ok: false,\n detail: `--leading-${step}=${v} not > ${prev}`\n };\n }\n prev = v;\n }\n return { name: \"leading strictly increasing\", ok: true };\n },\n (ctx) => {\n let prev = -Infinity;\n for (const step of RADIUS_STEPS) {\n const v = parseRem(ctx.register[`--radius-${step}`]);\n if (Number.isNaN(v) || v < prev - 1e-9) {\n return {\n name: \"radius ladder non-decreasing\",\n ok: false,\n detail: `--radius-${step}=${v} < ${prev}`\n };\n }\n prev = v;\n }\n return { name: \"radius ladder non-decreasing\", ok: true };\n },\n (ctx) => {\n let prev = -Infinity;\n for (const step of BORDER_STEPS) {\n const v = parseRem(ctx.register[`--border-${step}`]);\n if (Number.isNaN(v) || v <= prev) {\n return {\n name: \"borders strictly increasing\",\n ok: false,\n detail: `--border-${step}=${v} not > ${prev}`\n };\n }\n prev = v;\n }\n return { name: \"borders strictly increasing\", ok: true };\n },\n (ctx) => {\n let prev = -Infinity;\n for (const step of DURATION_STEPS) {\n const v = parseMs(ctx.register[`--duration-${step}`]);\n if (Number.isNaN(v) || v <= prev) {\n return {\n name: \"durations strictly increasing\",\n ok: false,\n detail: `--duration-${step}=${v} not > ${prev}`\n };\n }\n prev = v;\n }\n return { name: \"durations strictly increasing\", ok: true };\n },\n (ctx) => {\n let prev = -Infinity;\n for (const level of ELEVATION_STEPS) {\n const v = shadowStrength(ctx.register[`--elevation-${level}`]);\n if (v < prev - 1e-9) {\n return {\n name: \"elevation strength non-decreasing\",\n ok: false,\n detail: `--elevation-${level}=${v} < ${prev}`\n };\n }\n prev = v;\n }\n return { name: \"elevation strength non-decreasing\", ok: true };\n },\n (ctx) => {\n let prev = -Infinity;\n for (const step of SPACE_STEPS) {\n const v = parseRem(ctx.register[`--space-${step}`]);\n if (Number.isNaN(v) || v < prev - 1e-9) {\n return {\n name: \"space ramp non-decreasing\",\n ok: false,\n detail: `--space-${step}=${v} < ${prev}`\n };\n }\n prev = v;\n }\n return { name: \"space ramp non-decreasing\", ok: true };\n },\n (ctx) => {\n for (const [hue3, spec2] of Object.entries(PALETTE_HUES)) {\n const stops = PALETTE_STOPS.filter((s) => s !== \"contrast\").map((stop) => ctx.register[`--color-${hue3}-${stop}`]);\n const ls = stops.map((v) => v ? toOklchColor(v).l : Number.NaN);\n if (ls.some((l) => Number.isNaN(l))) {\n return {\n name: \"palette ramps monotonic in OKLCH lightness\",\n ok: false,\n detail: `--color-${hue3} ramp has a non-color stop`\n };\n }\n const ascending = ls[ls.length - 1] >= ls[0];\n for (let i = 1; i < ls.length; i++) {\n const prev = ls[i - 1];\n const cur = ls[i];\n const ok = ascending ? cur > prev + 1e-9 : cur < prev - 1e-9;\n if (!ok) {\n return {\n name: \"palette ramps monotonic in OKLCH lightness\",\n ok: false,\n detail: `--color-${hue3} ramp l[${i}]=${cur} not strictly ${ascending ? \">\" : \"<\"} ${prev}`\n };\n }\n }\n const base = ctx.register[`--color-${hue3}-base`];\n const contrastStop = ctx.register[`--color-${hue3}-contrast`];\n if (base && contrastStop && contrast2(base, contrastStop) < AA - 0.01) {\n return {\n name: \"palette ramps monotonic in OKLCH lightness\",\n ok: false,\n detail: `--color-${hue3}-contrast on -base = ${contrast2(base, contrastStop).toFixed(2)}`\n };\n }\n if (spec2 !== \"white\" && spec2 !== \"black\") {\n const subtle = ctx.register[`--color-${hue3}-subtle`];\n const strong = ctx.register[`--color-${hue3}-strong`];\n if (subtle && strong && contrast2(subtle, strong) < AA - 0.01) {\n return {\n name: \"palette ramps monotonic in OKLCH lightness\",\n ok: false,\n detail: `--color-${hue3}-strong on -subtle = ${contrast2(subtle, strong).toFixed(2)}`\n };\n }\n }\n if (typeof spec2 === \"object\" && base) {\n const o = toOklchColor(base);\n if (o.c >= HUE_STABLE_CHROMA) {\n let dh = Math.abs(o.h - spec2.h) % 360;\n if (dh > 180)\n dh = 360 - dh;\n if (dh > 20) {\n return {\n name: \"palette ramps monotonic in OKLCH lightness\",\n ok: false,\n detail: `--color-${hue3}-base h=${o.h.toFixed(1)} strayed from ${spec2.h}`\n };\n }\n }\n }\n }\n return { name: \"palette ramps monotonic in OKLCH lightness\", ok: true };\n },\n (ctx) => {\n const name = \"every tone family clears AA (fg on solid, text on bg)\";\n for (const tone of FULL_TONES) {\n const solid = ctx.register[`--${tone}`];\n const fg = ctx.register[`--${tone}-fg`];\n const bg = ctx.register[`--${tone}-bg`];\n const text = ctx.register[`--${tone}-text`];\n if (!solid || !fg || !bg || !text) {\n return { name, ok: false, detail: `--${tone} family is incomplete` };\n }\n if (contrast2(solid, fg) < AA - 0.01) {\n return { name, ok: false, detail: `--${tone}-fg on --${tone} = ${contrast2(solid, fg).toFixed(2)}` };\n }\n if (contrast2(bg, text) < AA - 0.01) {\n return { name, ok: false, detail: `--${tone}-text on --${tone}-bg = ${contrast2(bg, text).toFixed(2)}` };\n }\n }\n return { name, ok: true };\n },\n (ctx) => {\n const name = \"code palette readable on --code-bg\";\n const codeBg = ctx.register[\"--code-bg\"];\n if (!codeBg)\n return { name, ok: false, detail: \"--code-bg missing\" };\n const readFloor = achievableFloor(AA, codeBg);\n const commentFloor = achievableFloor(3, codeBg);\n for (const role of [...CODE_VIVID_ROLES, \"operator\"]) {\n const v = ctx.register[`--code-${role}`];\n const ratio = v ? contrast2(v, codeBg) : 0;\n if (ratio < readFloor - 0.05) {\n return { name, ok: false, detail: `--code-${role} on --code-bg = ${ratio.toFixed(2)} (floor ${readFloor.toFixed(2)})` };\n }\n }\n const commentRatio = contrast2(ctx.register[\"--code-comment\"] ?? \"#000\", codeBg);\n if (commentRatio < commentFloor - 0.05) {\n return { name, ok: false, detail: `--code-comment on --code-bg = ${commentRatio.toFixed(2)} (floor ${commentFloor.toFixed(2)})` };\n }\n return { name, ok: true };\n },\n (ctx) => {\n const name = \"code scopes mutually distinguishable\";\n const MIN_DE = 6e-3;\n const distinct = [...CODE_VIVID_ROLES, \"comment\"].map((r2) => `--code-${r2}`);\n for (let i = 0; i < distinct.length; i++) {\n for (let j = i + 1; j < distinct.length; j++) {\n const ni = distinct[i];\n const nj = distinct[j];\n const a = ctx.register[ni];\n const b = ctx.register[nj];\n if (!a || !b)\n continue;\n const d = oklabDist(a, b);\n if (d < MIN_DE) {\n return { name, ok: false, detail: `${ni} vs ${nj} \\u0394E=${d.toFixed(4)} (min ${MIN_DE})` };\n }\n }\n }\n return { name, ok: true };\n },\n (ctx) => {\n const name = \"status roles mutually distinguishable\";\n const MIN_DE = 0.02;\n const roles = Object.keys(STATUS_TO_HUE).map((r2) => `--${r2}`);\n for (let i = 0; i < roles.length; i++) {\n for (let j = i + 1; j < roles.length; j++) {\n const ni = roles[i];\n const nj = roles[j];\n const a = ctx.register[ni];\n const b = ctx.register[nj];\n if (!a || !b)\n continue;\n const d = oklabDist(a, b);\n if (d < MIN_DE) {\n return { name, ok: false, detail: `${ni} vs ${nj} \\u0394E=${d.toFixed(4)} (min ${MIN_DE})` };\n }\n }\n }\n return { name, ok: true };\n }\n ];\n }\n var PRODUCED_TOKENS = PRODUCES;\n var TOKEN_CATEGORIES = CATEGORIES;\n var SHARED_KNOBS = [\n \"scheme\",\n \"accentShiftStep\",\n \"accentSplit\",\n \"contrastBand\",\n \"vibrancy\",\n \"typeScale\",\n \"radiusScale\",\n \"density\",\n \"cues\",\n \"fonts\",\n \"anchors\"\n ];\n var DEFAULT_ANCHORS = {\n bg: \"#0f1115\",\n fg: \"#e8eaed\"\n };\n\n // packages/xtyle/dist/authoring.js\n function toLineage(nodes) {\n return nodes.map(({ name, value, refs }) => refs && refs.length ? { name, value, refs } : { name, value });\n }\n function registerExports(graph, traced, manifest, invariants) {\n xript.exports.register(\"graph\", (...args) => toLineage(graph(args[0] ?? {})));\n xript.exports.register(\"traced\", (...args) => traced(args[0] ?? {}));\n xript.exports.register(\"manifest\", () => ({ ...manifest, invariantCount: invariants.length }));\n xript.exports.register(\"invariants\", (...args) => invariants.map((invariant) => invariant(args[0])));\n }\n function tracePreset(preset, buildPasses, input) {\n return runPipeline(buildPasses(preset, input), (passIndex) => buildPassContext(preset, input, passIndex)).trace;\n }\n function toPreset(spec2) {\n const chroma = spec2.chroma ?? {};\n const elevation = spec2.elevation ?? {};\n const contrast3 = spec2.contrast ?? {};\n const preset = {\n id: spec2.id,\n knobs: spec2.knobs ?? SHARED_KNOBS,\n // Merge over the full default so a spec that names only some anchors (e.g. just `bg` and\n // `accent`) still yields a complete `bg`/`fg` default — derivation reads both, so a partial\n // `defaultAnchors` would crash when invoked with no anchor overrides.\n defaultAnchors: spec2.anchors ? { ...DEFAULT_ANCHORS, ...spec2.anchors } : DEFAULT_ANCHORS,\n contrastFloor: contrast3.floor ?? 4.7,\n declaredTextOnFillFloor: contrast3.textOnFill ?? 4.5,\n defaultVibrancy: spec2.vibrancy ?? 0.5,\n accentChromaMul: chroma.accent ?? 1,\n statusChromaMul: chroma.status ?? 1,\n paletteChromaMul: chroma.palette ?? 1,\n neutralChroma: chroma.neutral ?? 0.01,\n elevationStrengthMul: elevation.strength ?? 1,\n elevationAlphaBoost: elevation.alphaBoost ?? 0,\n accentTintChromaMul: chroma.accentTint ?? 0.3\n };\n if (spec2.extreme)\n preset.extreme = true;\n return preset;\n }\n function defineXtyleAlgorithm(spec2) {\n const preset = toPreset(spec2);\n const buildPasses = spec2.passes ?? ((p4, input) => [settlePass(p4, input)]);\n const singlePass = buildPasses(preset, {}).length === 1;\n const finalNodes = (input) => singlePass ? buildGraph(preset, input) : registerToNodes(runPipeline(buildPasses(preset, input), (passIndex) => buildPassContext(preset, input, passIndex)).register);\n registerExports(finalNodes, (input) => tracePreset(preset, buildPasses, input), {\n produces: PRODUCED_TOKENS,\n categories: TOKEN_CATEGORIES,\n knobs: preset.knobs,\n passNames: buildPasses(preset, {}).map((pass) => pass.name)\n }, makeInvariants(preset));\n }\n\n // algorithms/xtyle-hc/src/preset.ts\n var spec = {\n id: \"xtyle-hc\",\n contrast: { floor: 7, textOnFill: 7 },\n vibrancy: 1,\n chroma: { accent: 1.8, status: 1.7, palette: 1.7, neutral: 5e-3, accentTint: 0.6 },\n elevation: { alphaBoost: 0.05 },\n extreme: true\n };\n\n // algorithms/xtyle-hc/src/mod.ts\n defineXtyleAlgorithm(spec);\n})();\n" }, "xtyle-loud": { "manifest": { "$schema": "https://xript.dev/schema/mod-manifest/v0.7.json", "xript": "0.7", "name": "xtyle-loud", "version": "0.1.0", "title": "Xtyle Loud", "family": "xtyle", "capabilities": ["color-math"], "entry": { "script": "src/mod.js", "format": "script", "exports": { "graph": { "description": "Token lineage nodes for anchors+knobs.", "params": [{ "name": "input", "type": "DeriveInput" }], "returns": { "array": "TokenNode" } }, "traced": { "description": "Per-pass register snapshots for anchors+knobs.", "params": [{ "name": "input", "type": "DeriveInput" }], "returns": { "array": "TraceSnapshot" } }, "manifest": { "description": "produces + categories + knobs.", "returns": "AlgorithmManifest" }, "invariants": { "description": "Evaluate per-algorithm invariants.", "params": [{ "name": "ctx", "type": "map" }], "returns": { "array": "InvariantResult" } } } } }, "source": "(() => {\n var __defProp = Object.defineProperty;\n var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\n var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\n\n // node_modules/culori/src/rgb/parseNumber.js\n var parseNumber = (color, len) => {\n if (typeof color !== \"number\") return;\n if (len === 3) {\n return {\n mode: \"rgb\",\n r: (color >> 8 & 15 | color >> 4 & 240) / 255,\n g: (color >> 4 & 15 | color & 240) / 255,\n b: (color & 15 | color << 4 & 240) / 255\n };\n }\n if (len === 4) {\n return {\n mode: \"rgb\",\n r: (color >> 12 & 15 | color >> 8 & 240) / 255,\n g: (color >> 8 & 15 | color >> 4 & 240) / 255,\n b: (color >> 4 & 15 | color & 240) / 255,\n alpha: (color & 15 | color << 4 & 240) / 255\n };\n }\n if (len === 6) {\n return {\n mode: \"rgb\",\n r: (color >> 16 & 255) / 255,\n g: (color >> 8 & 255) / 255,\n b: (color & 255) / 255\n };\n }\n if (len === 8) {\n return {\n mode: \"rgb\",\n r: (color >> 24 & 255) / 255,\n g: (color >> 16 & 255) / 255,\n b: (color >> 8 & 255) / 255,\n alpha: (color & 255) / 255\n };\n }\n };\n var parseNumber_default = parseNumber;\n\n // node_modules/culori/src/colors/named.js\n var named = {\n aliceblue: 15792383,\n antiquewhite: 16444375,\n aqua: 65535,\n aquamarine: 8388564,\n azure: 15794175,\n beige: 16119260,\n bisque: 16770244,\n black: 0,\n blanchedalmond: 16772045,\n blue: 255,\n blueviolet: 9055202,\n brown: 10824234,\n burlywood: 14596231,\n cadetblue: 6266528,\n chartreuse: 8388352,\n chocolate: 13789470,\n coral: 16744272,\n cornflowerblue: 6591981,\n cornsilk: 16775388,\n crimson: 14423100,\n cyan: 65535,\n darkblue: 139,\n darkcyan: 35723,\n darkgoldenrod: 12092939,\n darkgray: 11119017,\n darkgreen: 25600,\n darkgrey: 11119017,\n darkkhaki: 12433259,\n darkmagenta: 9109643,\n darkolivegreen: 5597999,\n darkorange: 16747520,\n darkorchid: 10040012,\n darkred: 9109504,\n darksalmon: 15308410,\n darkseagreen: 9419919,\n darkslateblue: 4734347,\n darkslategray: 3100495,\n darkslategrey: 3100495,\n darkturquoise: 52945,\n darkviolet: 9699539,\n deeppink: 16716947,\n deepskyblue: 49151,\n dimgray: 6908265,\n dimgrey: 6908265,\n dodgerblue: 2003199,\n firebrick: 11674146,\n floralwhite: 16775920,\n forestgreen: 2263842,\n fuchsia: 16711935,\n gainsboro: 14474460,\n ghostwhite: 16316671,\n gold: 16766720,\n goldenrod: 14329120,\n gray: 8421504,\n green: 32768,\n greenyellow: 11403055,\n grey: 8421504,\n honeydew: 15794160,\n hotpink: 16738740,\n indianred: 13458524,\n indigo: 4915330,\n ivory: 16777200,\n khaki: 15787660,\n lavender: 15132410,\n lavenderblush: 16773365,\n lawngreen: 8190976,\n lemonchiffon: 16775885,\n lightblue: 11393254,\n lightcoral: 15761536,\n lightcyan: 14745599,\n lightgoldenrodyellow: 16448210,\n lightgray: 13882323,\n lightgreen: 9498256,\n lightgrey: 13882323,\n lightpink: 16758465,\n lightsalmon: 16752762,\n lightseagreen: 2142890,\n lightskyblue: 8900346,\n lightslategray: 7833753,\n lightslategrey: 7833753,\n lightsteelblue: 11584734,\n lightyellow: 16777184,\n lime: 65280,\n limegreen: 3329330,\n linen: 16445670,\n magenta: 16711935,\n maroon: 8388608,\n mediumaquamarine: 6737322,\n mediumblue: 205,\n mediumorchid: 12211667,\n mediumpurple: 9662683,\n mediumseagreen: 3978097,\n mediumslateblue: 8087790,\n mediumspringgreen: 64154,\n mediumturquoise: 4772300,\n mediumvioletred: 13047173,\n midnightblue: 1644912,\n mintcream: 16121850,\n mistyrose: 16770273,\n moccasin: 16770229,\n navajowhite: 16768685,\n navy: 128,\n oldlace: 16643558,\n olive: 8421376,\n olivedrab: 7048739,\n orange: 16753920,\n orangered: 16729344,\n orchid: 14315734,\n palegoldenrod: 15657130,\n palegreen: 10025880,\n paleturquoise: 11529966,\n palevioletred: 14381203,\n papayawhip: 16773077,\n peachpuff: 16767673,\n peru: 13468991,\n pink: 16761035,\n plum: 14524637,\n powderblue: 11591910,\n purple: 8388736,\n // Added in CSS Colors Level 4:\n // https://drafts.csswg.org/css-color/#changes-from-3\n rebeccapurple: 6697881,\n red: 16711680,\n rosybrown: 12357519,\n royalblue: 4286945,\n saddlebrown: 9127187,\n salmon: 16416882,\n sandybrown: 16032864,\n seagreen: 3050327,\n seashell: 16774638,\n sienna: 10506797,\n silver: 12632256,\n skyblue: 8900331,\n slateblue: 6970061,\n slategray: 7372944,\n slategrey: 7372944,\n snow: 16775930,\n springgreen: 65407,\n steelblue: 4620980,\n tan: 13808780,\n teal: 32896,\n thistle: 14204888,\n tomato: 16737095,\n turquoise: 4251856,\n violet: 15631086,\n wheat: 16113331,\n white: 16777215,\n whitesmoke: 16119285,\n yellow: 16776960,\n yellowgreen: 10145074\n };\n var named_default = named;\n\n // node_modules/culori/src/rgb/parseNamed.js\n var parseNamed = (color) => {\n return parseNumber_default(named_default[color.toLowerCase()], 6);\n };\n var parseNamed_default = parseNamed;\n\n // node_modules/culori/src/rgb/parseHex.js\n var hex = /^#?([0-9a-f]{8}|[0-9a-f]{6}|[0-9a-f]{4}|[0-9a-f]{3})$/i;\n var parseHex = (color) => {\n let match;\n return (match = color.match(hex)) ? parseNumber_default(parseInt(match[1], 16), match[1].length) : void 0;\n };\n var parseHex_default = parseHex;\n\n // node_modules/culori/src/util/regex.js\n var num = \"([+-]?\\\\d*\\\\.?\\\\d+(?:[eE][+-]?\\\\d+)?)\";\n var num_none = `(?:${num}|none)`;\n var per = `${num}%`;\n var per_none = `(?:${num}%|none)`;\n var num_per = `(?:${num}%|${num})`;\n var num_per_none = `(?:${num}%|${num}|none)`;\n var hue = `(?:${num}(deg|grad|rad|turn)|${num})`;\n var hue_none = `(?:${num}(deg|grad|rad|turn)|${num}|none)`;\n var c = `\\\\s*,\\\\s*`;\n var rx_num_per_none = new RegExp(\"^\" + num_per_none + \"$\");\n\n // node_modules/culori/src/rgb/parseRgbLegacy.js\n var rgb_num_old = new RegExp(\n `^rgba?\\\\(\\\\s*${num}${c}${num}${c}${num}\\\\s*(?:,\\\\s*${num_per}\\\\s*)?\\\\)$`\n );\n var rgb_per_old = new RegExp(\n `^rgba?\\\\(\\\\s*${per}${c}${per}${c}${per}\\\\s*(?:,\\\\s*${num_per}\\\\s*)?\\\\)$`\n );\n var parseRgbLegacy = (color) => {\n let res = { mode: \"rgb\" };\n let match;\n if (match = color.match(rgb_num_old)) {\n if (match[1] !== void 0) {\n res.r = match[1] / 255;\n }\n if (match[2] !== void 0) {\n res.g = match[2] / 255;\n }\n if (match[3] !== void 0) {\n res.b = match[3] / 255;\n }\n } else if (match = color.match(rgb_per_old)) {\n if (match[1] !== void 0) {\n res.r = match[1] / 100;\n }\n if (match[2] !== void 0) {\n res.g = match[2] / 100;\n }\n if (match[3] !== void 0) {\n res.b = match[3] / 100;\n }\n } else {\n return void 0;\n }\n if (match[4] !== void 0) {\n res.alpha = Math.max(0, Math.min(1, match[4] / 100));\n } else if (match[5] !== void 0) {\n res.alpha = Math.max(0, Math.min(1, +match[5]));\n }\n return res;\n };\n var parseRgbLegacy_default = parseRgbLegacy;\n\n // node_modules/culori/src/_prepare.js\n var prepare = (color, mode) => color === void 0 ? void 0 : typeof color !== \"object\" ? parse_default(color) : color.mode !== void 0 ? color : mode ? { ...color, mode } : void 0;\n var prepare_default = prepare;\n\n // node_modules/culori/src/converter.js\n var converter = (target_mode = \"rgb\") => (color) => (color = prepare_default(color, target_mode)) !== void 0 ? (\n // if the color's mode corresponds to our target mode\n color.mode === target_mode ? (\n // then just return the color\n color\n ) : (\n // otherwise check to see if we have a dedicated\n // converter for the target mode\n converters[color.mode][target_mode] ? (\n // and return its result...\n converters[color.mode][target_mode](color)\n ) : (\n // ...otherwise pass through RGB as an intermediary step.\n // if the target mode is RGB...\n target_mode === \"rgb\" ? (\n // just return the RGB\n converters[color.mode].rgb(color)\n ) : (\n // otherwise convert color.mode -> RGB -> target_mode\n converters.rgb[target_mode](converters[color.mode].rgb(color))\n )\n )\n )\n ) : void 0;\n var converter_default = converter;\n\n // node_modules/culori/src/modes.js\n var converters = {};\n var modes = {};\n var parsers = [];\n var colorProfiles = {};\n var identity = (v) => v;\n var useMode = (definition29) => {\n converters[definition29.mode] = {\n ...converters[definition29.mode],\n ...definition29.toMode\n };\n Object.keys(definition29.fromMode || {}).forEach((k4) => {\n if (!converters[k4]) {\n converters[k4] = {};\n }\n converters[k4][definition29.mode] = definition29.fromMode[k4];\n });\n if (!definition29.ranges) {\n definition29.ranges = {};\n }\n if (!definition29.difference) {\n definition29.difference = {};\n }\n definition29.channels.forEach((channel) => {\n if (definition29.ranges[channel] === void 0) {\n definition29.ranges[channel] = [0, 1];\n }\n if (!definition29.interpolate[channel]) {\n throw new Error(`Missing interpolator for: ${channel}`);\n }\n if (typeof definition29.interpolate[channel] === \"function\") {\n definition29.interpolate[channel] = {\n use: definition29.interpolate[channel]\n };\n }\n if (!definition29.interpolate[channel].fixup) {\n definition29.interpolate[channel].fixup = identity;\n }\n });\n modes[definition29.mode] = definition29;\n (definition29.parse || []).forEach((parser) => {\n useParser(parser, definition29.mode);\n });\n return converter_default(definition29.mode);\n };\n var getMode = (mode) => modes[mode];\n var useParser = (parser, mode) => {\n if (typeof parser === \"string\") {\n if (!mode) {\n throw new Error(`'mode' required when 'parser' is a string`);\n }\n colorProfiles[parser] = mode;\n } else if (typeof parser === \"function\") {\n if (parsers.indexOf(parser) < 0) {\n parsers.push(parser);\n }\n }\n };\n\n // node_modules/culori/src/parse.js\n var IdentStartCodePoint = /[^\\x00-\\x7F]|[a-zA-Z_]/;\n var IdentCodePoint = /[^\\x00-\\x7F]|[-\\w]/;\n var Tok = {\n Function: \"function\",\n Ident: \"ident\",\n Number: \"number\",\n Percentage: \"percentage\",\n ParenClose: \")\",\n None: \"none\",\n Hue: \"hue\",\n Alpha: \"alpha\"\n };\n var _i = 0;\n function is_num(chars) {\n let ch = chars[_i];\n let ch1 = chars[_i + 1];\n if (ch === \"-\" || ch === \"+\") {\n return /\\d/.test(ch1) || ch1 === \".\" && /\\d/.test(chars[_i + 2]);\n }\n if (ch === \".\") {\n return /\\d/.test(ch1);\n }\n return /\\d/.test(ch);\n }\n function is_ident(chars) {\n if (_i >= chars.length) {\n return false;\n }\n let ch = chars[_i];\n if (IdentStartCodePoint.test(ch)) {\n return true;\n }\n if (ch === \"-\") {\n if (chars.length - _i < 2) {\n return false;\n }\n let ch1 = chars[_i + 1];\n if (ch1 === \"-\" || IdentStartCodePoint.test(ch1)) {\n return true;\n }\n return false;\n }\n return false;\n }\n var huenits = {\n deg: 1,\n rad: 180 / Math.PI,\n grad: 9 / 10,\n turn: 360\n };\n function num2(chars) {\n let value = \"\";\n if (chars[_i] === \"-\" || chars[_i] === \"+\") {\n value += chars[_i++];\n }\n value += digits(chars);\n if (chars[_i] === \".\" && /\\d/.test(chars[_i + 1])) {\n value += chars[_i++] + digits(chars);\n }\n if (chars[_i] === \"e\" || chars[_i] === \"E\") {\n if ((chars[_i + 1] === \"-\" || chars[_i + 1] === \"+\") && /\\d/.test(chars[_i + 2])) {\n value += chars[_i++] + chars[_i++] + digits(chars);\n } else if (/\\d/.test(chars[_i + 1])) {\n value += chars[_i++] + digits(chars);\n }\n }\n if (is_ident(chars)) {\n let id = ident(chars);\n if (id === \"deg\" || id === \"rad\" || id === \"turn\" || id === \"grad\") {\n return { type: Tok.Hue, value: value * huenits[id] };\n }\n return void 0;\n }\n if (chars[_i] === \"%\") {\n _i++;\n return { type: Tok.Percentage, value: +value };\n }\n return { type: Tok.Number, value: +value };\n }\n function digits(chars) {\n let v = \"\";\n while (/\\d/.test(chars[_i])) {\n v += chars[_i++];\n }\n return v;\n }\n function ident(chars) {\n let v = \"\";\n while (_i < chars.length && IdentCodePoint.test(chars[_i])) {\n v += chars[_i++];\n }\n return v;\n }\n function identlike(chars) {\n let v = ident(chars);\n if (chars[_i] === \"(\") {\n _i++;\n return { type: Tok.Function, value: v };\n }\n if (v === \"none\") {\n return { type: Tok.None, value: void 0 };\n }\n return { type: Tok.Ident, value: v };\n }\n function tokenize(str = \"\") {\n let chars = str.trim();\n let tokens = [];\n let ch;\n _i = 0;\n while (_i < chars.length) {\n ch = chars[_i++];\n if (ch === \"\\n\" || ch === \"\t\" || ch === \" \") {\n while (_i < chars.length && (chars[_i] === \"\\n\" || chars[_i] === \"\t\" || chars[_i] === \" \")) {\n _i++;\n }\n continue;\n }\n if (ch === \",\") {\n return void 0;\n }\n if (ch === \")\") {\n tokens.push({ type: Tok.ParenClose });\n continue;\n }\n if (ch === \"+\") {\n _i--;\n if (is_num(chars)) {\n tokens.push(num2(chars));\n continue;\n }\n return void 0;\n }\n if (ch === \"-\") {\n _i--;\n if (is_num(chars)) {\n tokens.push(num2(chars));\n continue;\n }\n if (is_ident(chars)) {\n tokens.push({ type: Tok.Ident, value: ident(chars) });\n continue;\n }\n return void 0;\n }\n if (ch === \".\") {\n _i--;\n if (is_num(chars)) {\n tokens.push(num2(chars));\n continue;\n }\n return void 0;\n }\n if (ch === \"/\") {\n while (_i < chars.length && (chars[_i] === \"\\n\" || chars[_i] === \"\t\" || chars[_i] === \" \")) {\n _i++;\n }\n let alpha2;\n if (is_num(chars)) {\n alpha2 = num2(chars);\n if (alpha2.type !== Tok.Hue) {\n tokens.push({ type: Tok.Alpha, value: alpha2 });\n continue;\n }\n }\n if (is_ident(chars)) {\n if (ident(chars) === \"none\") {\n tokens.push({\n type: Tok.Alpha,\n value: { type: Tok.None, value: void 0 }\n });\n continue;\n }\n }\n return void 0;\n }\n if (/\\d/.test(ch)) {\n _i--;\n tokens.push(num2(chars));\n continue;\n }\n if (IdentStartCodePoint.test(ch)) {\n _i--;\n tokens.push(identlike(chars));\n continue;\n }\n return void 0;\n }\n return tokens;\n }\n function parseColorSyntax(tokens) {\n tokens._i = 0;\n let token = tokens[tokens._i++];\n if (!token || token.type !== Tok.Function || token.value !== \"color\") {\n return void 0;\n }\n token = tokens[tokens._i++];\n if (token.type !== Tok.Ident) {\n return void 0;\n }\n const mode = colorProfiles[token.value];\n if (!mode) {\n return void 0;\n }\n const res = { mode };\n const coords = consumeCoords(tokens, false);\n if (!coords) {\n return void 0;\n }\n const channels = getMode(mode).channels;\n for (let ii = 0, c2, ch; ii < channels.length; ii++) {\n c2 = coords[ii];\n ch = channels[ii];\n if (c2.type !== Tok.None) {\n res[ch] = c2.type === Tok.Number ? c2.value : c2.value / 100;\n if (ch === \"alpha\") {\n res[ch] = Math.max(0, Math.min(1, res[ch]));\n }\n }\n }\n return res;\n }\n function consumeCoords(tokens, includeHue) {\n const coords = [];\n let token;\n while (tokens._i < tokens.length) {\n token = tokens[tokens._i++];\n if (token.type === Tok.None || token.type === Tok.Number || token.type === Tok.Alpha || token.type === Tok.Percentage || includeHue && token.type === Tok.Hue) {\n coords.push(token);\n continue;\n }\n if (token.type === Tok.ParenClose) {\n if (tokens._i < tokens.length) {\n return void 0;\n }\n continue;\n }\n return void 0;\n }\n if (coords.length < 3 || coords.length > 4) {\n return void 0;\n }\n if (coords.length === 4) {\n if (coords[3].type !== Tok.Alpha) {\n return void 0;\n }\n coords[3] = coords[3].value;\n }\n if (coords.length === 3) {\n coords.push({ type: Tok.None, value: void 0 });\n }\n return coords.every((c2) => c2.type !== Tok.Alpha) ? coords : void 0;\n }\n function parseModernSyntax(tokens, includeHue) {\n tokens._i = 0;\n let token = tokens[tokens._i++];\n if (!token || token.type !== Tok.Function) {\n return void 0;\n }\n let coords = consumeCoords(tokens, includeHue);\n if (!coords) {\n return void 0;\n }\n coords.unshift(token.value);\n return coords;\n }\n var parse = (color) => {\n if (typeof color !== \"string\") {\n return void 0;\n }\n const tokens = tokenize(color);\n const parsed = tokens ? parseModernSyntax(tokens, true) : void 0;\n let result = void 0;\n let i = 0;\n let len = parsers.length;\n while (i < len) {\n if ((result = parsers[i++](color, parsed)) !== void 0) {\n return result;\n }\n }\n return tokens ? parseColorSyntax(tokens) : void 0;\n };\n var parse_default = parse;\n\n // node_modules/culori/src/rgb/parseRgb.js\n function parseRgb(color, parsed) {\n if (!parsed || parsed[0] !== \"rgb\" && parsed[0] !== \"rgba\") {\n return void 0;\n }\n const res = { mode: \"rgb\" };\n const [, r2, g, b, alpha2] = parsed;\n if (r2.type === Tok.Hue || g.type === Tok.Hue || b.type === Tok.Hue) {\n return void 0;\n }\n if (r2.type !== Tok.None) {\n res.r = r2.type === Tok.Number ? r2.value / 255 : r2.value / 100;\n }\n if (g.type !== Tok.None) {\n res.g = g.type === Tok.Number ? g.value / 255 : g.value / 100;\n }\n if (b.type !== Tok.None) {\n res.b = b.type === Tok.Number ? b.value / 255 : b.value / 100;\n }\n if (alpha2.type !== Tok.None) {\n res.alpha = Math.min(\n 1,\n Math.max(\n 0,\n alpha2.type === Tok.Number ? alpha2.value : alpha2.value / 100\n )\n );\n }\n return res;\n }\n var parseRgb_default = parseRgb;\n\n // node_modules/culori/src/rgb/parseTransparent.js\n var parseTransparent = (c2) => c2 === \"transparent\" ? { mode: \"rgb\", r: 0, g: 0, b: 0, alpha: 0 } : void 0;\n var parseTransparent_default = parseTransparent;\n\n // node_modules/culori/src/interpolate/lerp.js\n var lerp = (a, b, t) => a + t * (b - a);\n\n // node_modules/culori/src/interpolate/piecewise.js\n var get_classes = (arr) => {\n let classes = [];\n for (let i = 0; i < arr.length - 1; i++) {\n let a = arr[i];\n let b = arr[i + 1];\n if (a === void 0 && b === void 0) {\n classes.push(void 0);\n } else if (a !== void 0 && b !== void 0) {\n classes.push([a, b]);\n } else {\n classes.push(a !== void 0 ? [a, a] : [b, b]);\n }\n }\n return classes;\n };\n var interpolatorPiecewise = (interpolator) => (arr) => {\n let classes = get_classes(arr);\n return (t) => {\n let cls = t * classes.length;\n let idx = t >= 1 ? classes.length - 1 : Math.max(Math.floor(cls), 0);\n let pair = classes[idx];\n return pair === void 0 ? void 0 : interpolator(pair[0], pair[1], cls - idx);\n };\n };\n\n // node_modules/culori/src/interpolate/linear.js\n var interpolatorLinear = interpolatorPiecewise(lerp);\n\n // node_modules/culori/src/fixup/alpha.js\n var fixupAlpha = (arr) => {\n let some_defined = false;\n let res = arr.map((v) => {\n if (v !== void 0) {\n some_defined = true;\n return v;\n }\n return 1;\n });\n return some_defined ? res : arr;\n };\n\n // node_modules/culori/src/rgb/definition.js\n var definition = {\n mode: \"rgb\",\n channels: [\"r\", \"g\", \"b\", \"alpha\"],\n parse: [\n parseRgb_default,\n parseHex_default,\n parseRgbLegacy_default,\n parseNamed_default,\n parseTransparent_default,\n \"srgb\"\n ],\n serialize: \"srgb\",\n interpolate: {\n r: interpolatorLinear,\n g: interpolatorLinear,\n b: interpolatorLinear,\n alpha: { use: interpolatorLinear, fixup: fixupAlpha }\n },\n gamut: true,\n white: { r: 1, g: 1, b: 1 },\n black: { r: 0, g: 0, b: 0 }\n };\n var definition_default = definition;\n\n // node_modules/culori/src/a98/convertA98ToXyz65.js\n var linearize = (v = 0) => Math.pow(Math.abs(v), 563 / 256) * Math.sign(v);\n var convertA98ToXyz65 = (a982) => {\n let r2 = linearize(a982.r);\n let g = linearize(a982.g);\n let b = linearize(a982.b);\n let res = {\n mode: \"xyz65\",\n x: 0.5766690429101305 * r2 + 0.1855582379065463 * g + 0.1882286462349947 * b,\n y: 0.297344975250536 * r2 + 0.6273635662554661 * g + 0.0752914584939979 * b,\n z: 0.0270313613864123 * r2 + 0.0706888525358272 * g + 0.9913375368376386 * b\n };\n if (a982.alpha !== void 0) {\n res.alpha = a982.alpha;\n }\n return res;\n };\n var convertA98ToXyz65_default = convertA98ToXyz65;\n\n // node_modules/culori/src/a98/convertXyz65ToA98.js\n var gamma = (v) => Math.pow(Math.abs(v), 256 / 563) * Math.sign(v);\n var convertXyz65ToA98 = ({ x, y, z, alpha: alpha2 }) => {\n if (x === void 0) x = 0;\n if (y === void 0) y = 0;\n if (z === void 0) z = 0;\n let res = {\n mode: \"a98\",\n r: gamma(\n x * 2.0415879038107465 - y * 0.5650069742788597 - 0.3447313507783297 * z\n ),\n g: gamma(\n x * -0.9692436362808798 + y * 1.8759675015077206 + 0.0415550574071756 * z\n ),\n b: gamma(\n x * 0.0134442806320312 - y * 0.1183623922310184 + 1.0151749943912058 * z\n )\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertXyz65ToA98_default = convertXyz65ToA98;\n\n // node_modules/culori/src/lrgb/convertRgbToLrgb.js\n var fn = (c2 = 0) => {\n const abs2 = Math.abs(c2);\n if (abs2 <= 0.04045) {\n return c2 / 12.92;\n }\n return (Math.sign(c2) || 1) * Math.pow((abs2 + 0.055) / 1.055, 2.4);\n };\n var convertRgbToLrgb = ({ r: r2, g, b, alpha: alpha2 }) => {\n let res = {\n mode: \"lrgb\",\n r: fn(r2),\n g: fn(g),\n b: fn(b)\n };\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n };\n var convertRgbToLrgb_default = convertRgbToLrgb;\n\n // node_modules/culori/src/xyz65/convertRgbToXyz65.js\n var convertRgbToXyz65 = (rgb4) => {\n let { r: r2, g, b, alpha: alpha2 } = convertRgbToLrgb_default(rgb4);\n let res = {\n mode: \"xyz65\",\n x: 0.4123907992659593 * r2 + 0.357584339383878 * g + 0.1804807884018343 * b,\n y: 0.2126390058715102 * r2 + 0.715168678767756 * g + 0.0721923153607337 * b,\n z: 0.0193308187155918 * r2 + 0.119194779794626 * g + 0.9505321522496607 * b\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertRgbToXyz65_default = convertRgbToXyz65;\n\n // node_modules/culori/src/lrgb/convertLrgbToRgb.js\n var fn2 = (c2 = 0) => {\n const abs2 = Math.abs(c2);\n if (abs2 > 31308e-7) {\n return (Math.sign(c2) || 1) * (1.055 * Math.pow(abs2, 1 / 2.4) - 0.055);\n }\n return c2 * 12.92;\n };\n var convertLrgbToRgb = ({ r: r2, g, b, alpha: alpha2 }, mode = \"rgb\") => {\n let res = {\n mode,\n r: fn2(r2),\n g: fn2(g),\n b: fn2(b)\n };\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n };\n var convertLrgbToRgb_default = convertLrgbToRgb;\n\n // node_modules/culori/src/xyz65/convertXyz65ToRgb.js\n var convertXyz65ToRgb = ({ x, y, z, alpha: alpha2 }) => {\n if (x === void 0) x = 0;\n if (y === void 0) y = 0;\n if (z === void 0) z = 0;\n let res = convertLrgbToRgb_default({\n r: x * 3.2409699419045226 - y * 1.537383177570094 - 0.4986107602930034 * z,\n g: x * -0.9692436362808796 + y * 1.8759675015077204 + 0.0415550574071756 * z,\n b: x * 0.0556300796969936 - y * 0.2039769588889765 + 1.0569715142428784 * z\n });\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertXyz65ToRgb_default = convertXyz65ToRgb;\n\n // node_modules/culori/src/a98/definition.js\n var definition2 = {\n ...definition_default,\n mode: \"a98\",\n parse: [\"a98-rgb\"],\n serialize: \"a98-rgb\",\n fromMode: {\n rgb: (color) => convertXyz65ToA98_default(convertRgbToXyz65_default(color)),\n xyz65: convertXyz65ToA98_default\n },\n toMode: {\n rgb: (color) => convertXyz65ToRgb_default(convertA98ToXyz65_default(color)),\n xyz65: convertA98ToXyz65_default\n }\n };\n var definition_default2 = definition2;\n\n // node_modules/culori/src/util/normalizeHue.js\n var normalizeHue = (hue3) => (hue3 = hue3 % 360) < 0 ? hue3 + 360 : hue3;\n var normalizeHue_default = normalizeHue;\n\n // node_modules/culori/src/fixup/hue.js\n var hue2 = (hues, fn5) => {\n return hues.map((hue3, idx, arr) => {\n if (hue3 === void 0) {\n return hue3;\n }\n let normalized = normalizeHue_default(hue3);\n if (idx === 0 || hues[idx - 1] === void 0) {\n return normalized;\n }\n return fn5(normalized - normalizeHue_default(arr[idx - 1]));\n }).reduce((acc, curr) => {\n if (!acc.length || curr === void 0 || acc[acc.length - 1] === void 0) {\n acc.push(curr);\n return acc;\n }\n acc.push(curr + acc[acc.length - 1]);\n return acc;\n }, []);\n };\n var fixupHueShorter = (arr) => hue2(arr, (d) => Math.abs(d) <= 180 ? d : d - 360 * Math.sign(d));\n\n // node_modules/culori/src/cubehelix/constants.js\n var M = [-0.14861, 1.78277, -0.29227, -0.90649, 1.97294, 0];\n var degToRad = Math.PI / 180;\n var radToDeg = 180 / Math.PI;\n\n // node_modules/culori/src/cubehelix/convertRgbToCubehelix.js\n var DE = M[3] * M[4];\n var BE = M[1] * M[4];\n var BCAD = M[1] * M[2] - M[0] * M[3];\n var convertRgbToCubehelix = ({ r: r2, g, b, alpha: alpha2 }) => {\n if (r2 === void 0) r2 = 0;\n if (g === void 0) g = 0;\n if (b === void 0) b = 0;\n let l = (BCAD * b + r2 * DE - g * BE) / (BCAD + DE - BE);\n let x = b - l;\n let y = (M[4] * (g - l) - M[2] * x) / M[3];\n let res = {\n mode: \"cubehelix\",\n l,\n s: l === 0 || l === 1 ? void 0 : Math.sqrt(x * x + y * y) / (M[4] * l * (1 - l))\n };\n if (res.s) res.h = Math.atan2(y, x) * radToDeg - 120;\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n };\n var convertRgbToCubehelix_default = convertRgbToCubehelix;\n\n // node_modules/culori/src/cubehelix/convertCubehelixToRgb.js\n var convertCubehelixToRgb = ({ h, s, l, alpha: alpha2 }) => {\n let res = { mode: \"rgb\" };\n h = (h === void 0 ? 0 : h + 120) * degToRad;\n if (l === void 0) l = 0;\n let amp = s === void 0 ? 0 : s * l * (1 - l);\n let cosh = Math.cos(h);\n let sinh = Math.sin(h);\n res.r = l + amp * (M[0] * cosh + M[1] * sinh);\n res.g = l + amp * (M[2] * cosh + M[3] * sinh);\n res.b = l + amp * (M[4] * cosh + M[5] * sinh);\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n };\n var convertCubehelixToRgb_default = convertCubehelixToRgb;\n\n // node_modules/culori/src/difference.js\n var differenceHueSaturation = (std, smp) => {\n if (std.h === void 0 || smp.h === void 0 || !std.s || !smp.s) {\n return 0;\n }\n let std_h = normalizeHue_default(std.h);\n let smp_h = normalizeHue_default(smp.h);\n let dH = Math.sin((smp_h - std_h + 360) / 2 * Math.PI / 180);\n return 2 * Math.sqrt(std.s * smp.s) * dH;\n };\n var differenceHueNaive = (std, smp) => {\n if (std.h === void 0 || smp.h === void 0) {\n return 0;\n }\n let std_h = normalizeHue_default(std.h);\n let smp_h = normalizeHue_default(smp.h);\n if (Math.abs(smp_h - std_h) > 180) {\n return std_h - (smp_h - 360 * Math.sign(smp_h - std_h));\n }\n return smp_h - std_h;\n };\n var differenceHueChroma = (std, smp) => {\n if (std.h === void 0 || smp.h === void 0 || !std.c || !smp.c) {\n return 0;\n }\n let std_h = normalizeHue_default(std.h);\n let smp_h = normalizeHue_default(smp.h);\n let dH = Math.sin((smp_h - std_h + 360) / 2 * Math.PI / 180);\n return 2 * Math.sqrt(std.c * smp.c) * dH;\n };\n\n // node_modules/culori/src/average.js\n var averageAngle = (val) => {\n let sum = val.reduce(\n (sum2, val2) => {\n if (val2 !== void 0) {\n let rad = val2 * Math.PI / 180;\n sum2.sin += Math.sin(rad);\n sum2.cos += Math.cos(rad);\n }\n return sum2;\n },\n { sin: 0, cos: 0 }\n );\n let angle = Math.atan2(sum.sin, sum.cos) * 180 / Math.PI;\n return angle < 0 ? 360 + angle : angle;\n };\n\n // node_modules/culori/src/cubehelix/definition.js\n var definition3 = {\n mode: \"cubehelix\",\n channels: [\"h\", \"s\", \"l\", \"alpha\"],\n parse: [\"--cubehelix\"],\n serialize: \"--cubehelix\",\n ranges: {\n h: [0, 360],\n s: [0, 4.614],\n l: [0, 1]\n },\n fromMode: {\n rgb: convertRgbToCubehelix_default\n },\n toMode: {\n rgb: convertCubehelixToRgb_default\n },\n interpolate: {\n h: {\n use: interpolatorLinear,\n fixup: fixupHueShorter\n },\n s: interpolatorLinear,\n l: interpolatorLinear,\n alpha: {\n use: interpolatorLinear,\n fixup: fixupAlpha\n }\n },\n difference: {\n h: differenceHueSaturation\n },\n average: {\n h: averageAngle\n }\n };\n var definition_default3 = definition3;\n\n // node_modules/culori/src/lch/convertLabToLch.js\n var convertLabToLch = ({ l, a, b, alpha: alpha2 }, mode = \"lch\") => {\n if (a === void 0) a = 0;\n if (b === void 0) b = 0;\n let c2 = Math.sqrt(a * a + b * b);\n let res = { mode, l, c: c2 };\n if (c2) res.h = normalizeHue_default(Math.atan2(b, a) * 180 / Math.PI);\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n };\n var convertLabToLch_default = convertLabToLch;\n\n // node_modules/culori/src/lch/convertLchToLab.js\n var convertLchToLab = ({ l, c: c2, h, alpha: alpha2 }, mode = \"lab\") => {\n if (h === void 0) h = 0;\n let res = {\n mode,\n l,\n a: c2 ? c2 * Math.cos(h / 180 * Math.PI) : 0,\n b: c2 ? c2 * Math.sin(h / 180 * Math.PI) : 0\n };\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n };\n var convertLchToLab_default = convertLchToLab;\n\n // node_modules/culori/src/xyz65/constants.js\n var k = Math.pow(29, 3) / Math.pow(3, 3);\n var e = Math.pow(6, 3) / Math.pow(29, 3);\n\n // node_modules/culori/src/constants.js\n var D50 = {\n X: 0.3457 / 0.3585,\n Y: 1,\n Z: (1 - 0.3457 - 0.3585) / 0.3585\n };\n var D65 = {\n X: 0.3127 / 0.329,\n Y: 1,\n Z: (1 - 0.3127 - 0.329) / 0.329\n };\n var k2 = Math.pow(29, 3) / Math.pow(3, 3);\n var e2 = Math.pow(6, 3) / Math.pow(29, 3);\n\n // node_modules/culori/src/lab65/convertLab65ToXyz65.js\n var fn3 = (v) => Math.pow(v, 3) > e ? Math.pow(v, 3) : (116 * v - 16) / k;\n var convertLab65ToXyz65 = ({ l, a, b, alpha: alpha2 }) => {\n if (l === void 0) l = 0;\n if (a === void 0) a = 0;\n if (b === void 0) b = 0;\n let fy = (l + 16) / 116;\n let fx = a / 500 + fy;\n let fz = fy - b / 200;\n let res = {\n mode: \"xyz65\",\n x: fn3(fx) * D65.X,\n y: fn3(fy) * D65.Y,\n z: fn3(fz) * D65.Z\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertLab65ToXyz65_default = convertLab65ToXyz65;\n\n // node_modules/culori/src/lab65/convertLab65ToRgb.js\n var convertLab65ToRgb = (lab2) => convertXyz65ToRgb_default(convertLab65ToXyz65_default(lab2));\n var convertLab65ToRgb_default = convertLab65ToRgb;\n\n // node_modules/culori/src/lab65/convertXyz65ToLab65.js\n var f = (value) => value > e ? Math.cbrt(value) : (k * value + 16) / 116;\n var convertXyz65ToLab65 = ({ x, y, z, alpha: alpha2 }) => {\n if (x === void 0) x = 0;\n if (y === void 0) y = 0;\n if (z === void 0) z = 0;\n let f0 = f(x / D65.X);\n let f1 = f(y / D65.Y);\n let f22 = f(z / D65.Z);\n let res = {\n mode: \"lab65\",\n l: 116 * f1 - 16,\n a: 500 * (f0 - f1),\n b: 200 * (f1 - f22)\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertXyz65ToLab65_default = convertXyz65ToLab65;\n\n // node_modules/culori/src/lab65/convertRgbToLab65.js\n var convertRgbToLab65 = (rgb4) => {\n let res = convertXyz65ToLab65_default(convertRgbToXyz65_default(rgb4));\n if (rgb4.r === rgb4.b && rgb4.b === rgb4.g) {\n res.a = res.b = 0;\n }\n return res;\n };\n var convertRgbToLab65_default = convertRgbToLab65;\n\n // node_modules/culori/src/dlch/constants.js\n var kE = 1;\n var kCH = 1;\n var \\u03B8 = 26 / 180 * Math.PI;\n var cos\\u03B8 = Math.cos(\\u03B8);\n var sin\\u03B8 = Math.sin(\\u03B8);\n var factor = 100 / Math.log(139 / 100);\n\n // node_modules/culori/src/dlch/convertDlchToLab65.js\n var convertDlchToLab65 = ({ l, c: c2, h, alpha: alpha2 }) => {\n if (l === void 0) l = 0;\n if (c2 === void 0) c2 = 0;\n if (h === void 0) h = 0;\n let res = {\n mode: \"lab65\",\n l: (Math.exp(l * kE / factor) - 1) / 39e-4\n };\n let G = (Math.exp(0.0435 * c2 * kCH * kE) - 1) / 0.075;\n let e4 = G * Math.cos(h / 180 * Math.PI - \\u03B8);\n let f3 = G * Math.sin(h / 180 * Math.PI - \\u03B8);\n res.a = e4 * cos\\u03B8 - f3 / 0.83 * sin\\u03B8;\n res.b = e4 * sin\\u03B8 + f3 / 0.83 * cos\\u03B8;\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n };\n var convertDlchToLab65_default = convertDlchToLab65;\n\n // node_modules/culori/src/dlch/convertLab65ToDlch.js\n var convertLab65ToDlch = ({ l, a, b, alpha: alpha2 }) => {\n if (l === void 0) l = 0;\n if (a === void 0) a = 0;\n if (b === void 0) b = 0;\n let e4 = a * cos\\u03B8 + b * sin\\u03B8;\n let f3 = 0.83 * (b * cos\\u03B8 - a * sin\\u03B8);\n let G = Math.sqrt(e4 * e4 + f3 * f3);\n let res = {\n mode: \"dlch\",\n l: factor / kE * Math.log(1 + 39e-4 * l),\n c: Math.log(1 + 0.075 * G) / (0.0435 * kCH * kE)\n };\n if (res.c) {\n res.h = normalizeHue_default((Math.atan2(f3, e4) + \\u03B8) / Math.PI * 180);\n }\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n };\n var convertLab65ToDlch_default = convertLab65ToDlch;\n\n // node_modules/culori/src/dlab/definition.js\n var convertDlabToLab65 = (c2) => convertDlchToLab65_default(convertLabToLch_default(c2, \"dlch\"));\n var convertLab65ToDlab = (c2) => convertLchToLab_default(convertLab65ToDlch_default(c2), \"dlab\");\n var definition4 = {\n mode: \"dlab\",\n parse: [\"--din99o-lab\"],\n serialize: \"--din99o-lab\",\n toMode: {\n lab65: convertDlabToLab65,\n rgb: (c2) => convertLab65ToRgb_default(convertDlabToLab65(c2))\n },\n fromMode: {\n lab65: convertLab65ToDlab,\n rgb: (c2) => convertLab65ToDlab(convertRgbToLab65_default(c2))\n },\n channels: [\"l\", \"a\", \"b\", \"alpha\"],\n ranges: {\n l: [0, 100],\n a: [-40.09, 45.501],\n b: [-40.469, 44.344]\n },\n interpolate: {\n l: interpolatorLinear,\n a: interpolatorLinear,\n b: interpolatorLinear,\n alpha: {\n use: interpolatorLinear,\n fixup: fixupAlpha\n }\n }\n };\n var definition_default4 = definition4;\n\n // node_modules/culori/src/dlch/definition.js\n var definition5 = {\n mode: \"dlch\",\n parse: [\"--din99o-lch\"],\n serialize: \"--din99o-lch\",\n toMode: {\n lab65: convertDlchToLab65_default,\n dlab: (c2) => convertLchToLab_default(c2, \"dlab\"),\n rgb: (c2) => convertLab65ToRgb_default(convertDlchToLab65_default(c2))\n },\n fromMode: {\n lab65: convertLab65ToDlch_default,\n dlab: (c2) => convertLabToLch_default(c2, \"dlch\"),\n rgb: (c2) => convertLab65ToDlch_default(convertRgbToLab65_default(c2))\n },\n channels: [\"l\", \"c\", \"h\", \"alpha\"],\n ranges: {\n l: [0, 100],\n c: [0, 51.484],\n h: [0, 360]\n },\n interpolate: {\n l: interpolatorLinear,\n c: interpolatorLinear,\n h: {\n use: interpolatorLinear,\n fixup: fixupHueShorter\n },\n alpha: {\n use: interpolatorLinear,\n fixup: fixupAlpha\n }\n },\n difference: {\n h: differenceHueChroma\n },\n average: {\n h: averageAngle\n }\n };\n var definition_default5 = definition5;\n\n // node_modules/culori/src/hsi/convertHsiToRgb.js\n function convertHsiToRgb({ h, s, i, alpha: alpha2 }) {\n h = normalizeHue_default(h !== void 0 ? h : 0);\n if (s === void 0) s = 0;\n if (i === void 0) i = 0;\n let f3 = Math.abs(h / 60 % 2 - 1);\n let res;\n switch (Math.floor(h / 60)) {\n case 0:\n res = {\n r: i * (1 + s * (3 / (2 - f3) - 1)),\n g: i * (1 + s * (3 * (1 - f3) / (2 - f3) - 1)),\n b: i * (1 - s)\n };\n break;\n case 1:\n res = {\n r: i * (1 + s * (3 * (1 - f3) / (2 - f3) - 1)),\n g: i * (1 + s * (3 / (2 - f3) - 1)),\n b: i * (1 - s)\n };\n break;\n case 2:\n res = {\n r: i * (1 - s),\n g: i * (1 + s * (3 / (2 - f3) - 1)),\n b: i * (1 + s * (3 * (1 - f3) / (2 - f3) - 1))\n };\n break;\n case 3:\n res = {\n r: i * (1 - s),\n g: i * (1 + s * (3 * (1 - f3) / (2 - f3) - 1)),\n b: i * (1 + s * (3 / (2 - f3) - 1))\n };\n break;\n case 4:\n res = {\n r: i * (1 + s * (3 * (1 - f3) / (2 - f3) - 1)),\n g: i * (1 - s),\n b: i * (1 + s * (3 / (2 - f3) - 1))\n };\n break;\n case 5:\n res = {\n r: i * (1 + s * (3 / (2 - f3) - 1)),\n g: i * (1 - s),\n b: i * (1 + s * (3 * (1 - f3) / (2 - f3) - 1))\n };\n break;\n default:\n res = { r: i * (1 - s), g: i * (1 - s), b: i * (1 - s) };\n }\n res.mode = \"rgb\";\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n }\n\n // node_modules/culori/src/hsi/convertRgbToHsi.js\n function convertRgbToHsi({ r: r2, g, b, alpha: alpha2 }) {\n if (r2 === void 0) r2 = 0;\n if (g === void 0) g = 0;\n if (b === void 0) b = 0;\n let M3 = Math.max(r2, g, b), m = Math.min(r2, g, b);\n let res = {\n mode: \"hsi\",\n s: r2 + g + b === 0 ? 0 : 1 - 3 * m / (r2 + g + b),\n i: (r2 + g + b) / 3\n };\n if (M3 - m !== 0)\n res.h = (M3 === r2 ? (g - b) / (M3 - m) + (g < b) * 6 : M3 === g ? (b - r2) / (M3 - m) + 2 : (r2 - g) / (M3 - m) + 4) * 60;\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n }\n\n // node_modules/culori/src/hsi/definition.js\n var definition6 = {\n mode: \"hsi\",\n toMode: {\n rgb: convertHsiToRgb\n },\n parse: [\"--hsi\"],\n serialize: \"--hsi\",\n fromMode: {\n rgb: convertRgbToHsi\n },\n channels: [\"h\", \"s\", \"i\", \"alpha\"],\n ranges: {\n h: [0, 360]\n },\n gamut: \"rgb\",\n interpolate: {\n h: { use: interpolatorLinear, fixup: fixupHueShorter },\n s: interpolatorLinear,\n i: interpolatorLinear,\n alpha: { use: interpolatorLinear, fixup: fixupAlpha }\n },\n difference: {\n h: differenceHueSaturation\n },\n average: {\n h: averageAngle\n }\n };\n var definition_default6 = definition6;\n\n // node_modules/culori/src/hsl/convertHslToRgb.js\n function convertHslToRgb({ h, s, l, alpha: alpha2 }) {\n h = normalizeHue_default(h !== void 0 ? h : 0);\n if (s === void 0) s = 0;\n if (l === void 0) l = 0;\n let m1 = l + s * (l < 0.5 ? l : 1 - l);\n let m2 = m1 - (m1 - l) * 2 * Math.abs(h / 60 % 2 - 1);\n let res;\n switch (Math.floor(h / 60)) {\n case 0:\n res = { r: m1, g: m2, b: 2 * l - m1 };\n break;\n case 1:\n res = { r: m2, g: m1, b: 2 * l - m1 };\n break;\n case 2:\n res = { r: 2 * l - m1, g: m1, b: m2 };\n break;\n case 3:\n res = { r: 2 * l - m1, g: m2, b: m1 };\n break;\n case 4:\n res = { r: m2, g: 2 * l - m1, b: m1 };\n break;\n case 5:\n res = { r: m1, g: 2 * l - m1, b: m2 };\n break;\n default:\n res = { r: 2 * l - m1, g: 2 * l - m1, b: 2 * l - m1 };\n }\n res.mode = \"rgb\";\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n }\n\n // node_modules/culori/src/hsl/convertRgbToHsl.js\n function convertRgbToHsl({ r: r2, g, b, alpha: alpha2 }) {\n if (r2 === void 0) r2 = 0;\n if (g === void 0) g = 0;\n if (b === void 0) b = 0;\n let M3 = Math.max(r2, g, b), m = Math.min(r2, g, b);\n let res = {\n mode: \"hsl\",\n s: M3 === m ? 0 : (M3 - m) / (1 - Math.abs(M3 + m - 1)),\n l: 0.5 * (M3 + m)\n };\n if (M3 - m !== 0)\n res.h = (M3 === r2 ? (g - b) / (M3 - m) + (g < b) * 6 : M3 === g ? (b - r2) / (M3 - m) + 2 : (r2 - g) / (M3 - m) + 4) * 60;\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n }\n\n // node_modules/culori/src/util/hue.js\n var hueToDeg = (val, unit) => {\n switch (unit) {\n case \"deg\":\n return +val;\n case \"rad\":\n return val / Math.PI * 180;\n case \"grad\":\n return val / 10 * 9;\n case \"turn\":\n return val * 360;\n }\n };\n var hue_default = hueToDeg;\n\n // node_modules/culori/src/hsl/parseHslLegacy.js\n var hsl_old = new RegExp(\n `^hsla?\\\\(\\\\s*${hue}${c}${per}${c}${per}\\\\s*(?:,\\\\s*${num_per}\\\\s*)?\\\\)$`\n );\n var parseHslLegacy = (color) => {\n let match = color.match(hsl_old);\n if (!match) return;\n let res = { mode: \"hsl\" };\n if (match[3] !== void 0) {\n res.h = +match[3];\n } else if (match[1] !== void 0 && match[2] !== void 0) {\n res.h = hue_default(match[1], match[2]);\n }\n if (match[4] !== void 0) {\n res.s = Math.min(Math.max(0, match[4] / 100), 1);\n }\n if (match[5] !== void 0) {\n res.l = Math.min(Math.max(0, match[5] / 100), 1);\n }\n if (match[6] !== void 0) {\n res.alpha = Math.max(0, Math.min(1, match[6] / 100));\n } else if (match[7] !== void 0) {\n res.alpha = Math.max(0, Math.min(1, +match[7]));\n }\n return res;\n };\n var parseHslLegacy_default = parseHslLegacy;\n\n // node_modules/culori/src/hsl/parseHsl.js\n function parseHsl(color, parsed) {\n if (!parsed || parsed[0] !== \"hsl\" && parsed[0] !== \"hsla\") {\n return void 0;\n }\n const res = { mode: \"hsl\" };\n const [, h, s, l, alpha2] = parsed;\n if (h.type !== Tok.None) {\n if (h.type === Tok.Percentage) {\n return void 0;\n }\n res.h = h.value;\n }\n if (s.type !== Tok.None) {\n if (s.type === Tok.Hue) {\n return void 0;\n }\n res.s = s.value / 100;\n }\n if (l.type !== Tok.None) {\n if (l.type === Tok.Hue) {\n return void 0;\n }\n res.l = l.value / 100;\n }\n if (alpha2.type !== Tok.None) {\n res.alpha = Math.min(\n 1,\n Math.max(\n 0,\n alpha2.type === Tok.Number ? alpha2.value : alpha2.value / 100\n )\n );\n }\n return res;\n }\n var parseHsl_default = parseHsl;\n\n // node_modules/culori/src/hsl/definition.js\n var definition7 = {\n mode: \"hsl\",\n toMode: {\n rgb: convertHslToRgb\n },\n fromMode: {\n rgb: convertRgbToHsl\n },\n channels: [\"h\", \"s\", \"l\", \"alpha\"],\n ranges: {\n h: [0, 360]\n },\n gamut: \"rgb\",\n parse: [parseHsl_default, parseHslLegacy_default],\n serialize: (c2) => `hsl(${c2.h !== void 0 ? c2.h : \"none\"} ${c2.s !== void 0 ? c2.s * 100 + \"%\" : \"none\"} ${c2.l !== void 0 ? c2.l * 100 + \"%\" : \"none\"}${c2.alpha < 1 ? ` / ${c2.alpha}` : \"\"})`,\n interpolate: {\n h: { use: interpolatorLinear, fixup: fixupHueShorter },\n s: interpolatorLinear,\n l: interpolatorLinear,\n alpha: { use: interpolatorLinear, fixup: fixupAlpha }\n },\n difference: {\n h: differenceHueSaturation\n },\n average: {\n h: averageAngle\n }\n };\n var definition_default7 = definition7;\n\n // node_modules/culori/src/hsv/convertHsvToRgb.js\n function convertHsvToRgb({ h, s, v, alpha: alpha2 }) {\n h = normalizeHue_default(h !== void 0 ? h : 0);\n if (s === void 0) s = 0;\n if (v === void 0) v = 0;\n let f3 = Math.abs(h / 60 % 2 - 1);\n let res;\n switch (Math.floor(h / 60)) {\n case 0:\n res = { r: v, g: v * (1 - s * f3), b: v * (1 - s) };\n break;\n case 1:\n res = { r: v * (1 - s * f3), g: v, b: v * (1 - s) };\n break;\n case 2:\n res = { r: v * (1 - s), g: v, b: v * (1 - s * f3) };\n break;\n case 3:\n res = { r: v * (1 - s), g: v * (1 - s * f3), b: v };\n break;\n case 4:\n res = { r: v * (1 - s * f3), g: v * (1 - s), b: v };\n break;\n case 5:\n res = { r: v, g: v * (1 - s), b: v * (1 - s * f3) };\n break;\n default:\n res = { r: v * (1 - s), g: v * (1 - s), b: v * (1 - s) };\n }\n res.mode = \"rgb\";\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n }\n\n // node_modules/culori/src/hsv/convertRgbToHsv.js\n function convertRgbToHsv({ r: r2, g, b, alpha: alpha2 }) {\n if (r2 === void 0) r2 = 0;\n if (g === void 0) g = 0;\n if (b === void 0) b = 0;\n let M3 = Math.max(r2, g, b), m = Math.min(r2, g, b);\n let res = {\n mode: \"hsv\",\n s: M3 === 0 ? 0 : 1 - m / M3,\n v: M3\n };\n if (M3 - m !== 0)\n res.h = (M3 === r2 ? (g - b) / (M3 - m) + (g < b) * 6 : M3 === g ? (b - r2) / (M3 - m) + 2 : (r2 - g) / (M3 - m) + 4) * 60;\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n }\n\n // node_modules/culori/src/hsv/definition.js\n var definition8 = {\n mode: \"hsv\",\n toMode: {\n rgb: convertHsvToRgb\n },\n parse: [\"--hsv\"],\n serialize: \"--hsv\",\n fromMode: {\n rgb: convertRgbToHsv\n },\n channels: [\"h\", \"s\", \"v\", \"alpha\"],\n ranges: {\n h: [0, 360]\n },\n gamut: \"rgb\",\n interpolate: {\n h: { use: interpolatorLinear, fixup: fixupHueShorter },\n s: interpolatorLinear,\n v: interpolatorLinear,\n alpha: { use: interpolatorLinear, fixup: fixupAlpha }\n },\n difference: {\n h: differenceHueSaturation\n },\n average: {\n h: averageAngle\n }\n };\n var definition_default8 = definition8;\n\n // node_modules/culori/src/hwb/convertHwbToRgb.js\n function convertHwbToRgb({ h, w, b, alpha: alpha2 }) {\n if (w === void 0) w = 0;\n if (b === void 0) b = 0;\n if (w + b > 1) {\n let s = w + b;\n w /= s;\n b /= s;\n }\n return convertHsvToRgb({\n h,\n s: b === 1 ? 1 : 1 - w / (1 - b),\n v: 1 - b,\n alpha: alpha2\n });\n }\n\n // node_modules/culori/src/hwb/convertRgbToHwb.js\n function convertRgbToHwb(rgba) {\n let hsv2 = convertRgbToHsv(rgba);\n if (hsv2 === void 0) return void 0;\n let s = hsv2.s !== void 0 ? hsv2.s : 0;\n let v = hsv2.v !== void 0 ? hsv2.v : 0;\n let res = {\n mode: \"hwb\",\n w: (1 - s) * v,\n b: 1 - v\n };\n if (hsv2.h !== void 0) res.h = hsv2.h;\n if (hsv2.alpha !== void 0) res.alpha = hsv2.alpha;\n return res;\n }\n\n // node_modules/culori/src/hwb/parseHwb.js\n function ParseHwb(color, parsed) {\n if (!parsed || parsed[0] !== \"hwb\") {\n return void 0;\n }\n const res = { mode: \"hwb\" };\n const [, h, w, b, alpha2] = parsed;\n if (h.type !== Tok.None) {\n if (h.type === Tok.Percentage) {\n return void 0;\n }\n res.h = h.value;\n }\n if (w.type !== Tok.None) {\n if (w.type === Tok.Hue) {\n return void 0;\n }\n res.w = w.value / 100;\n }\n if (b.type !== Tok.None) {\n if (b.type === Tok.Hue) {\n return void 0;\n }\n res.b = b.value / 100;\n }\n if (alpha2.type !== Tok.None) {\n res.alpha = Math.min(\n 1,\n Math.max(\n 0,\n alpha2.type === Tok.Number ? alpha2.value : alpha2.value / 100\n )\n );\n }\n return res;\n }\n var parseHwb_default = ParseHwb;\n\n // node_modules/culori/src/hwb/definition.js\n var definition9 = {\n mode: \"hwb\",\n toMode: {\n rgb: convertHwbToRgb\n },\n fromMode: {\n rgb: convertRgbToHwb\n },\n channels: [\"h\", \"w\", \"b\", \"alpha\"],\n ranges: {\n h: [0, 360]\n },\n gamut: \"rgb\",\n parse: [parseHwb_default],\n serialize: (c2) => `hwb(${c2.h !== void 0 ? c2.h : \"none\"} ${c2.w !== void 0 ? c2.w * 100 + \"%\" : \"none\"} ${c2.b !== void 0 ? c2.b * 100 + \"%\" : \"none\"}${c2.alpha < 1 ? ` / ${c2.alpha}` : \"\"})`,\n interpolate: {\n h: { use: interpolatorLinear, fixup: fixupHueShorter },\n w: interpolatorLinear,\n b: interpolatorLinear,\n alpha: { use: interpolatorLinear, fixup: fixupAlpha }\n },\n difference: {\n h: differenceHueNaive\n },\n average: {\n h: averageAngle\n }\n };\n var definition_default9 = definition9;\n\n // node_modules/culori/src/hdr/constants.js\n var YW = 203;\n\n // node_modules/culori/src/hdr/transfer.js\n var M1 = 0.1593017578125;\n var M2 = 78.84375;\n var C1 = 0.8359375;\n var C2 = 18.8515625;\n var C3 = 18.6875;\n function transferPqDecode(v) {\n if (v < 0) return 0;\n const c2 = Math.pow(v, 1 / M2);\n return 1e4 * Math.pow(Math.max(0, c2 - C1) / (C2 - C3 * c2), 1 / M1);\n }\n function transferPqEncode(v) {\n if (v < 0) return 0;\n const c2 = Math.pow(v / 1e4, M1);\n return Math.pow((C1 + C2 * c2) / (1 + C3 * c2), M2);\n }\n\n // node_modules/culori/src/itp/convertItpToXyz65.js\n var toRel = (c2) => Math.max(c2 / YW, 0);\n var convertItpToXyz65 = ({ i, t, p: p4, alpha: alpha2 }) => {\n if (i === void 0) i = 0;\n if (t === void 0) t = 0;\n if (p4 === void 0) p4 = 0;\n const l = transferPqDecode(\n i + 0.008609037037932761 * t + 0.11102962500302593 * p4\n );\n const m = transferPqDecode(\n i - 0.00860903703793275 * t - 0.11102962500302599 * p4\n );\n const s = transferPqDecode(\n i + 0.5600313357106791 * t - 0.32062717498731885 * p4\n );\n const res = {\n mode: \"xyz65\",\n x: toRel(\n 2.070152218389422 * l - 1.3263473389671556 * m + 0.2066510476294051 * s\n ),\n y: toRel(\n 0.3647385209748074 * l + 0.680566024947227 * m - 0.0453045459220346 * s\n ),\n z: toRel(\n -0.049747207535812 * l - 0.0492609666966138 * m + 1.1880659249923042 * s\n )\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertItpToXyz65_default = convertItpToXyz65;\n\n // node_modules/culori/src/itp/convertXyz65ToItp.js\n var toAbs = (c2 = 0) => Math.max(c2 * YW, 0);\n var convertXyz65ToItp = ({ x, y, z, alpha: alpha2 }) => {\n const absX = toAbs(x);\n const absY = toAbs(y);\n const absZ = toAbs(z);\n const l = transferPqEncode(\n 0.3592832590121217 * absX + 0.6976051147779502 * absY - 0.0358915932320289 * absZ\n );\n const m = transferPqEncode(\n -0.1920808463704995 * absX + 1.1004767970374323 * absY + 0.0753748658519118 * absZ\n );\n const s = transferPqEncode(\n 0.0070797844607477 * absX + 0.0748396662186366 * absY + 0.8433265453898765 * absZ\n );\n const i = 0.5 * l + 0.5 * m;\n const t = 1.61376953125 * l - 3.323486328125 * m + 1.709716796875 * s;\n const p4 = 4.378173828125 * l - 4.24560546875 * m - 0.132568359375 * s;\n const res = { mode: \"itp\", i, t, p: p4 };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertXyz65ToItp_default = convertXyz65ToItp;\n\n // node_modules/culori/src/itp/definition.js\n var definition10 = {\n mode: \"itp\",\n channels: [\"i\", \"t\", \"p\", \"alpha\"],\n parse: [\"--ictcp\"],\n serialize: \"--ictcp\",\n toMode: {\n xyz65: convertItpToXyz65_default,\n rgb: (color) => convertXyz65ToRgb_default(convertItpToXyz65_default(color))\n },\n fromMode: {\n xyz65: convertXyz65ToItp_default,\n rgb: (color) => convertXyz65ToItp_default(convertRgbToXyz65_default(color))\n },\n ranges: {\n i: [0, 0.581],\n t: [-0.369, 0.272],\n p: [-0.164, 0.331]\n },\n interpolate: {\n i: interpolatorLinear,\n t: interpolatorLinear,\n p: interpolatorLinear,\n alpha: { use: interpolatorLinear, fixup: fixupAlpha }\n }\n };\n var definition_default10 = definition10;\n\n // node_modules/culori/src/jab/convertXyz65ToJab.js\n var p = 134.03437499999998;\n var d0 = 16295499532821565e-27;\n var jabPqEncode = (v) => {\n if (v < 0) return 0;\n let vn3 = Math.pow(v / 1e4, M1);\n return Math.pow((C1 + C2 * vn3) / (1 + C3 * vn3), p);\n };\n var abs = (v = 0) => Math.max(v * 203, 0);\n var convertXyz65ToJab = ({ x, y, z, alpha: alpha2 }) => {\n x = abs(x);\n y = abs(y);\n z = abs(z);\n let xp = 1.15 * x - 0.15 * z;\n let yp = 0.66 * y + 0.34 * x;\n let l = jabPqEncode(0.41478972 * xp + 0.579999 * yp + 0.014648 * z);\n let m = jabPqEncode(-0.20151 * xp + 1.120649 * yp + 0.0531008 * z);\n let s = jabPqEncode(-0.0166008 * xp + 0.2648 * yp + 0.6684799 * z);\n let i = (l + m) / 2;\n let res = {\n mode: \"jab\",\n j: 0.44 * i / (1 - 0.56 * i) - d0,\n a: 3.524 * l - 4.066708 * m + 0.542708 * s,\n b: 0.199076 * l + 1.096799 * m - 1.295875 * s\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertXyz65ToJab_default = convertXyz65ToJab;\n\n // node_modules/culori/src/jab/convertJabToXyz65.js\n var p2 = 134.03437499999998;\n var d02 = 16295499532821565e-27;\n var jabPqDecode = (v) => {\n if (v < 0) return 0;\n let vp = Math.pow(v, 1 / p2);\n return 1e4 * Math.pow((C1 - vp) / (C3 * vp - C2), 1 / M1);\n };\n var rel = (v) => v / 203;\n var convertJabToXyz65 = ({ j, a, b, alpha: alpha2 }) => {\n if (j === void 0) j = 0;\n if (a === void 0) a = 0;\n if (b === void 0) b = 0;\n let i = (j + d02) / (0.44 + 0.56 * (j + d02));\n let l = jabPqDecode(i + 0.13860504 * a + 0.058047316 * b);\n let m = jabPqDecode(i - 0.13860504 * a - 0.058047316 * b);\n let s = jabPqDecode(i - 0.096019242 * a - 0.8118919 * b);\n let res = {\n mode: \"xyz65\",\n x: rel(\n 1.661373024652174 * l - 0.914523081304348 * m + 0.23136208173913045 * s\n ),\n y: rel(\n -0.3250758611844533 * l + 1.571847026732543 * m - 0.21825383453227928 * s\n ),\n z: rel(-0.090982811 * l - 0.31272829 * m + 1.5227666 * s)\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertJabToXyz65_default = convertJabToXyz65;\n\n // node_modules/culori/src/jab/convertRgbToJab.js\n var convertRgbToJab = (rgb4) => {\n let res = convertXyz65ToJab_default(convertRgbToXyz65_default(rgb4));\n if (rgb4.r === rgb4.b && rgb4.b === rgb4.g) {\n res.a = res.b = 0;\n }\n return res;\n };\n var convertRgbToJab_default = convertRgbToJab;\n\n // node_modules/culori/src/jab/convertJabToRgb.js\n var convertJabToRgb = (color) => convertXyz65ToRgb_default(convertJabToXyz65_default(color));\n var convertJabToRgb_default = convertJabToRgb;\n\n // node_modules/culori/src/jab/definition.js\n var definition11 = {\n mode: \"jab\",\n channels: [\"j\", \"a\", \"b\", \"alpha\"],\n parse: [\"--jzazbz\"],\n serialize: \"--jzazbz\",\n fromMode: {\n rgb: convertRgbToJab_default,\n xyz65: convertXyz65ToJab_default\n },\n toMode: {\n rgb: convertJabToRgb_default,\n xyz65: convertJabToXyz65_default\n },\n ranges: {\n j: [0, 0.222],\n a: [-0.109, 0.129],\n b: [-0.185, 0.134]\n },\n interpolate: {\n j: interpolatorLinear,\n a: interpolatorLinear,\n b: interpolatorLinear,\n alpha: { use: interpolatorLinear, fixup: fixupAlpha }\n }\n };\n var definition_default11 = definition11;\n\n // node_modules/culori/src/jch/convertJabToJch.js\n var convertJabToJch = ({ j, a, b, alpha: alpha2 }) => {\n if (a === void 0) a = 0;\n if (b === void 0) b = 0;\n let c2 = Math.sqrt(a * a + b * b);\n let res = {\n mode: \"jch\",\n j,\n c: c2\n };\n if (c2) {\n res.h = normalizeHue_default(Math.atan2(b, a) * 180 / Math.PI);\n }\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertJabToJch_default = convertJabToJch;\n\n // node_modules/culori/src/jch/convertJchToJab.js\n var convertJchToJab = ({ j, c: c2, h, alpha: alpha2 }) => {\n if (h === void 0) h = 0;\n let res = {\n mode: \"jab\",\n j,\n a: c2 ? c2 * Math.cos(h / 180 * Math.PI) : 0,\n b: c2 ? c2 * Math.sin(h / 180 * Math.PI) : 0\n };\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n };\n var convertJchToJab_default = convertJchToJab;\n\n // node_modules/culori/src/jch/definition.js\n var definition12 = {\n mode: \"jch\",\n parse: [\"--jzczhz\"],\n serialize: \"--jzczhz\",\n toMode: {\n jab: convertJchToJab_default,\n rgb: (c2) => convertJabToRgb_default(convertJchToJab_default(c2))\n },\n fromMode: {\n rgb: (c2) => convertJabToJch_default(convertRgbToJab_default(c2)),\n jab: convertJabToJch_default\n },\n channels: [\"j\", \"c\", \"h\", \"alpha\"],\n ranges: {\n j: [0, 0.221],\n c: [0, 0.19],\n h: [0, 360]\n },\n interpolate: {\n h: { use: interpolatorLinear, fixup: fixupHueShorter },\n c: interpolatorLinear,\n j: interpolatorLinear,\n alpha: { use: interpolatorLinear, fixup: fixupAlpha }\n },\n difference: {\n h: differenceHueChroma\n },\n average: {\n h: averageAngle\n }\n };\n var definition_default12 = definition12;\n\n // node_modules/culori/src/xyz50/constants.js\n var k3 = Math.pow(29, 3) / Math.pow(3, 3);\n var e3 = Math.pow(6, 3) / Math.pow(29, 3);\n\n // node_modules/culori/src/lab/convertLabToXyz50.js\n var fn4 = (v) => Math.pow(v, 3) > e3 ? Math.pow(v, 3) : (116 * v - 16) / k3;\n var convertLabToXyz50 = ({ l, a, b, alpha: alpha2 }) => {\n if (l === void 0) l = 0;\n if (a === void 0) a = 0;\n if (b === void 0) b = 0;\n let fy = (l + 16) / 116;\n let fx = a / 500 + fy;\n let fz = fy - b / 200;\n let res = {\n mode: \"xyz50\",\n x: fn4(fx) * D50.X,\n y: fn4(fy) * D50.Y,\n z: fn4(fz) * D50.Z\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertLabToXyz50_default = convertLabToXyz50;\n\n // node_modules/culori/src/xyz50/convertXyz50ToRgb.js\n var convertXyz50ToRgb = ({ x, y, z, alpha: alpha2 }) => {\n if (x === void 0) x = 0;\n if (y === void 0) y = 0;\n if (z === void 0) z = 0;\n let res = convertLrgbToRgb_default({\n r: x * 3.1341359569958707 - y * 1.6173863321612538 - 0.4906619460083532 * z,\n g: x * -0.978795502912089 + y * 1.916254567259524 + 0.03344273116131949 * z,\n b: x * 0.07195537988411677 - y * 0.2289768264158322 + 1.405386058324125 * z\n });\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertXyz50ToRgb_default = convertXyz50ToRgb;\n\n // node_modules/culori/src/lab/convertLabToRgb.js\n var convertLabToRgb = (lab2) => convertXyz50ToRgb_default(convertLabToXyz50_default(lab2));\n var convertLabToRgb_default = convertLabToRgb;\n\n // node_modules/culori/src/xyz50/convertRgbToXyz50.js\n var convertRgbToXyz50 = (rgb4) => {\n let { r: r2, g, b, alpha: alpha2 } = convertRgbToLrgb_default(rgb4);\n let res = {\n mode: \"xyz50\",\n x: 0.436065742824811 * r2 + 0.3851514688337912 * g + 0.14307845442264197 * b,\n y: 0.22249319175623702 * r2 + 0.7168870538238823 * g + 0.06061979053616537 * b,\n z: 0.013923904500943465 * r2 + 0.09708128566574634 * g + 0.7140993584005155 * b\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertRgbToXyz50_default = convertRgbToXyz50;\n\n // node_modules/culori/src/lab/convertXyz50ToLab.js\n var f2 = (value) => value > e3 ? Math.cbrt(value) : (k3 * value + 16) / 116;\n var convertXyz50ToLab = ({ x, y, z, alpha: alpha2 }) => {\n if (x === void 0) x = 0;\n if (y === void 0) y = 0;\n if (z === void 0) z = 0;\n let f0 = f2(x / D50.X);\n let f1 = f2(y / D50.Y);\n let f22 = f2(z / D50.Z);\n let res = {\n mode: \"lab\",\n l: 116 * f1 - 16,\n a: 500 * (f0 - f1),\n b: 200 * (f1 - f22)\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertXyz50ToLab_default = convertXyz50ToLab;\n\n // node_modules/culori/src/lab/convertRgbToLab.js\n var convertRgbToLab = (rgb4) => {\n let res = convertXyz50ToLab_default(convertRgbToXyz50_default(rgb4));\n if (rgb4.r === rgb4.b && rgb4.b === rgb4.g) {\n res.a = res.b = 0;\n }\n return res;\n };\n var convertRgbToLab_default = convertRgbToLab;\n\n // node_modules/culori/src/lab/parseLab.js\n function parseLab(color, parsed) {\n if (!parsed || parsed[0] !== \"lab\") {\n return void 0;\n }\n const res = { mode: \"lab\" };\n const [, l, a, b, alpha2] = parsed;\n if (l.type === Tok.Hue || a.type === Tok.Hue || b.type === Tok.Hue) {\n return void 0;\n }\n if (l.type !== Tok.None) {\n res.l = Math.min(Math.max(0, l.value), 100);\n }\n if (a.type !== Tok.None) {\n res.a = a.type === Tok.Number ? a.value : a.value * 125 / 100;\n }\n if (b.type !== Tok.None) {\n res.b = b.type === Tok.Number ? b.value : b.value * 125 / 100;\n }\n if (alpha2.type !== Tok.None) {\n res.alpha = Math.min(\n 1,\n Math.max(\n 0,\n alpha2.type === Tok.Number ? alpha2.value : alpha2.value / 100\n )\n );\n }\n return res;\n }\n var parseLab_default = parseLab;\n\n // node_modules/culori/src/lab/definition.js\n var definition13 = {\n mode: \"lab\",\n toMode: {\n xyz50: convertLabToXyz50_default,\n rgb: convertLabToRgb_default\n },\n fromMode: {\n xyz50: convertXyz50ToLab_default,\n rgb: convertRgbToLab_default\n },\n channels: [\"l\", \"a\", \"b\", \"alpha\"],\n ranges: {\n l: [0, 100],\n a: [-125, 125],\n b: [-125, 125]\n },\n parse: [parseLab_default],\n serialize: (c2) => `lab(${c2.l !== void 0 ? c2.l : \"none\"} ${c2.a !== void 0 ? c2.a : \"none\"} ${c2.b !== void 0 ? c2.b : \"none\"}${c2.alpha < 1 ? ` / ${c2.alpha}` : \"\"})`,\n interpolate: {\n l: interpolatorLinear,\n a: interpolatorLinear,\n b: interpolatorLinear,\n alpha: { use: interpolatorLinear, fixup: fixupAlpha }\n }\n };\n var definition_default13 = definition13;\n\n // node_modules/culori/src/lab65/definition.js\n var definition14 = {\n ...definition_default13,\n mode: \"lab65\",\n parse: [\"--lab-d65\"],\n serialize: \"--lab-d65\",\n toMode: {\n xyz65: convertLab65ToXyz65_default,\n rgb: convertLab65ToRgb_default\n },\n fromMode: {\n xyz65: convertXyz65ToLab65_default,\n rgb: convertRgbToLab65_default\n },\n ranges: {\n l: [0, 100],\n a: [-125, 125],\n b: [-125, 125]\n }\n };\n var definition_default14 = definition14;\n\n // node_modules/culori/src/lch/parseLch.js\n function parseLch(color, parsed) {\n if (!parsed || parsed[0] !== \"lch\") {\n return void 0;\n }\n const res = { mode: \"lch\" };\n const [, l, c2, h, alpha2] = parsed;\n if (l.type !== Tok.None) {\n if (l.type === Tok.Hue) {\n return void 0;\n }\n res.l = Math.min(Math.max(0, l.value), 100);\n }\n if (c2.type !== Tok.None) {\n res.c = Math.max(\n 0,\n c2.type === Tok.Number ? c2.value : c2.value * 150 / 100\n );\n }\n if (h.type !== Tok.None) {\n if (h.type === Tok.Percentage) {\n return void 0;\n }\n res.h = h.value;\n }\n if (alpha2.type !== Tok.None) {\n res.alpha = Math.min(\n 1,\n Math.max(\n 0,\n alpha2.type === Tok.Number ? alpha2.value : alpha2.value / 100\n )\n );\n }\n return res;\n }\n var parseLch_default = parseLch;\n\n // node_modules/culori/src/lch/definition.js\n var definition15 = {\n mode: \"lch\",\n toMode: {\n lab: convertLchToLab_default,\n rgb: (c2) => convertLabToRgb_default(convertLchToLab_default(c2))\n },\n fromMode: {\n rgb: (c2) => convertLabToLch_default(convertRgbToLab_default(c2)),\n lab: convertLabToLch_default\n },\n channels: [\"l\", \"c\", \"h\", \"alpha\"],\n ranges: {\n l: [0, 100],\n c: [0, 150],\n h: [0, 360]\n },\n parse: [parseLch_default],\n serialize: (c2) => `lch(${c2.l !== void 0 ? c2.l : \"none\"} ${c2.c !== void 0 ? c2.c : \"none\"} ${c2.h !== void 0 ? c2.h : \"none\"}${c2.alpha < 1 ? ` / ${c2.alpha}` : \"\"})`,\n interpolate: {\n h: { use: interpolatorLinear, fixup: fixupHueShorter },\n c: interpolatorLinear,\n l: interpolatorLinear,\n alpha: { use: interpolatorLinear, fixup: fixupAlpha }\n },\n difference: {\n h: differenceHueChroma\n },\n average: {\n h: averageAngle\n }\n };\n var definition_default15 = definition15;\n\n // node_modules/culori/src/lch65/definition.js\n var definition16 = {\n ...definition_default15,\n mode: \"lch65\",\n parse: [\"--lch-d65\"],\n serialize: \"--lch-d65\",\n toMode: {\n lab65: (c2) => convertLchToLab_default(c2, \"lab65\"),\n rgb: (c2) => convertLab65ToRgb_default(convertLchToLab_default(c2, \"lab65\"))\n },\n fromMode: {\n rgb: (c2) => convertLabToLch_default(convertRgbToLab65_default(c2), \"lch65\"),\n lab65: (c2) => convertLabToLch_default(c2, \"lch65\")\n },\n ranges: {\n l: [0, 100],\n c: [0, 150],\n h: [0, 360]\n }\n };\n var definition_default16 = definition16;\n\n // node_modules/culori/src/lchuv/convertLuvToLchuv.js\n var convertLuvToLchuv = ({ l, u, v, alpha: alpha2 }) => {\n if (u === void 0) u = 0;\n if (v === void 0) v = 0;\n let c2 = Math.sqrt(u * u + v * v);\n let res = {\n mode: \"lchuv\",\n l,\n c: c2\n };\n if (c2) {\n res.h = normalizeHue_default(Math.atan2(v, u) * 180 / Math.PI);\n }\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertLuvToLchuv_default = convertLuvToLchuv;\n\n // node_modules/culori/src/lchuv/convertLchuvToLuv.js\n var convertLchuvToLuv = ({ l, c: c2, h, alpha: alpha2 }) => {\n if (h === void 0) h = 0;\n let res = {\n mode: \"luv\",\n l,\n u: c2 ? c2 * Math.cos(h / 180 * Math.PI) : 0,\n v: c2 ? c2 * Math.sin(h / 180 * Math.PI) : 0\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertLchuvToLuv_default = convertLchuvToLuv;\n\n // node_modules/culori/src/luv/convertXyz50ToLuv.js\n var u_fn = (x, y, z) => 4 * x / (x + 15 * y + 3 * z);\n var v_fn = (x, y, z) => 9 * y / (x + 15 * y + 3 * z);\n var un = u_fn(D50.X, D50.Y, D50.Z);\n var vn = v_fn(D50.X, D50.Y, D50.Z);\n var l_fn = (value) => value <= e3 ? k3 * value : 116 * Math.cbrt(value) - 16;\n var convertXyz50ToLuv = ({ x, y, z, alpha: alpha2 }) => {\n if (x === void 0) x = 0;\n if (y === void 0) y = 0;\n if (z === void 0) z = 0;\n let l = l_fn(y / D50.Y);\n let u = u_fn(x, y, z);\n let v = v_fn(x, y, z);\n if (!isFinite(u) || !isFinite(v)) {\n l = u = v = 0;\n } else {\n u = 13 * l * (u - un);\n v = 13 * l * (v - vn);\n }\n let res = {\n mode: \"luv\",\n l,\n u,\n v\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertXyz50ToLuv_default = convertXyz50ToLuv;\n\n // node_modules/culori/src/luv/convertLuvToXyz50.js\n var u_fn2 = (x, y, z) => 4 * x / (x + 15 * y + 3 * z);\n var v_fn2 = (x, y, z) => 9 * y / (x + 15 * y + 3 * z);\n var un2 = u_fn2(D50.X, D50.Y, D50.Z);\n var vn2 = v_fn2(D50.X, D50.Y, D50.Z);\n var convertLuvToXyz50 = ({ l, u, v, alpha: alpha2 }) => {\n if (l === void 0) l = 0;\n if (l === 0) {\n return { mode: \"xyz50\", x: 0, y: 0, z: 0 };\n }\n if (u === void 0) u = 0;\n if (v === void 0) v = 0;\n let up = u / (13 * l) + un2;\n let vp = v / (13 * l) + vn2;\n let y = D50.Y * (l <= 8 ? l / k3 : Math.pow((l + 16) / 116, 3));\n let x = y * (9 * up) / (4 * vp);\n let z = y * (12 - 3 * up - 20 * vp) / (4 * vp);\n let res = { mode: \"xyz50\", x, y, z };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertLuvToXyz50_default = convertLuvToXyz50;\n\n // node_modules/culori/src/lchuv/definition.js\n var convertRgbToLchuv = (rgb4) => convertLuvToLchuv_default(convertXyz50ToLuv_default(convertRgbToXyz50_default(rgb4)));\n var convertLchuvToRgb = (lchuv2) => convertXyz50ToRgb_default(convertLuvToXyz50_default(convertLchuvToLuv_default(lchuv2)));\n var definition17 = {\n mode: \"lchuv\",\n toMode: {\n luv: convertLchuvToLuv_default,\n rgb: convertLchuvToRgb\n },\n fromMode: {\n rgb: convertRgbToLchuv,\n luv: convertLuvToLchuv_default\n },\n channels: [\"l\", \"c\", \"h\", \"alpha\"],\n parse: [\"--lchuv\"],\n serialize: \"--lchuv\",\n ranges: {\n l: [0, 100],\n c: [0, 176.956],\n h: [0, 360]\n },\n interpolate: {\n h: { use: interpolatorLinear, fixup: fixupHueShorter },\n c: interpolatorLinear,\n l: interpolatorLinear,\n alpha: { use: interpolatorLinear, fixup: fixupAlpha }\n },\n difference: {\n h: differenceHueChroma\n },\n average: {\n h: averageAngle\n }\n };\n var definition_default17 = definition17;\n\n // node_modules/culori/src/lrgb/definition.js\n var definition18 = {\n ...definition_default,\n mode: \"lrgb\",\n toMode: {\n rgb: convertLrgbToRgb_default\n },\n fromMode: {\n rgb: convertRgbToLrgb_default\n },\n parse: [\"srgb-linear\"],\n serialize: \"srgb-linear\"\n };\n var definition_default18 = definition18;\n\n // node_modules/culori/src/luv/definition.js\n var definition19 = {\n mode: \"luv\",\n toMode: {\n xyz50: convertLuvToXyz50_default,\n rgb: (luv2) => convertXyz50ToRgb_default(convertLuvToXyz50_default(luv2))\n },\n fromMode: {\n xyz50: convertXyz50ToLuv_default,\n rgb: (rgb4) => convertXyz50ToLuv_default(convertRgbToXyz50_default(rgb4))\n },\n channels: [\"l\", \"u\", \"v\", \"alpha\"],\n parse: [\"--luv\"],\n serialize: \"--luv\",\n ranges: {\n l: [0, 100],\n u: [-84.936, 175.042],\n v: [-125.882, 87.243]\n },\n interpolate: {\n l: interpolatorLinear,\n u: interpolatorLinear,\n v: interpolatorLinear,\n alpha: { use: interpolatorLinear, fixup: fixupAlpha }\n }\n };\n var definition_default19 = definition19;\n\n // node_modules/culori/src/oklab/convertLrgbToOklab.js\n var convertLrgbToOklab = ({ r: r2, g, b, alpha: alpha2 }) => {\n if (r2 === void 0) r2 = 0;\n if (g === void 0) g = 0;\n if (b === void 0) b = 0;\n let L = Math.cbrt(\n 0.412221469470763 * r2 + 0.5363325372617348 * g + 0.0514459932675022 * b\n );\n let M3 = Math.cbrt(\n 0.2119034958178252 * r2 + 0.6806995506452344 * g + 0.1073969535369406 * b\n );\n let S = Math.cbrt(\n 0.0883024591900564 * r2 + 0.2817188391361215 * g + 0.6299787016738222 * b\n );\n let res = {\n mode: \"oklab\",\n l: 0.210454268309314 * L + 0.7936177747023054 * M3 - 0.0040720430116193 * S,\n a: 1.9779985324311684 * L - 2.42859224204858 * M3 + 0.450593709617411 * S,\n b: 0.0259040424655478 * L + 0.7827717124575296 * M3 - 0.8086757549230774 * S\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertLrgbToOklab_default = convertLrgbToOklab;\n\n // node_modules/culori/src/oklab/convertRgbToOklab.js\n var convertRgbToOklab = (rgb4) => {\n let res = convertLrgbToOklab_default(convertRgbToLrgb_default(rgb4));\n if (rgb4.r === rgb4.b && rgb4.b === rgb4.g) {\n res.a = res.b = 0;\n }\n return res;\n };\n var convertRgbToOklab_default = convertRgbToOklab;\n\n // node_modules/culori/src/oklab/convertOklabToLrgb.js\n var convertOklabToLrgb = ({ l, a, b, alpha: alpha2 }) => {\n if (l === void 0) l = 0;\n if (a === void 0) a = 0;\n if (b === void 0) b = 0;\n let L = Math.pow(l + 0.3963377773761749 * a + 0.2158037573099136 * b, 3);\n let M3 = Math.pow(l - 0.1055613458156586 * a - 0.0638541728258133 * b, 3);\n let S = Math.pow(l - 0.0894841775298119 * a - 1.2914855480194092 * b, 3);\n let res = {\n mode: \"lrgb\",\n r: 4.076741636075957 * L - 3.3077115392580616 * M3 + 0.2309699031821044 * S,\n g: -1.2684379732850317 * L + 2.6097573492876887 * M3 - 0.3413193760026573 * S,\n b: -0.0041960761386756 * L - 0.7034186179359362 * M3 + 1.7076146940746117 * S\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertOklabToLrgb_default = convertOklabToLrgb;\n\n // node_modules/culori/src/oklab/convertOklabToRgb.js\n var convertOklabToRgb = (c2) => convertLrgbToRgb_default(convertOklabToLrgb_default(c2));\n var convertOklabToRgb_default = convertOklabToRgb;\n\n // node_modules/culori/src/okhsl/helpers.js\n function toe(x) {\n const k_1 = 0.206;\n const k_2 = 0.03;\n const k_3 = (1 + k_1) / (1 + k_2);\n return 0.5 * (k_3 * x - k_1 + Math.sqrt((k_3 * x - k_1) * (k_3 * x - k_1) + 4 * k_2 * k_3 * x));\n }\n function toe_inv(x) {\n const k_1 = 0.206;\n const k_2 = 0.03;\n const k_3 = (1 + k_1) / (1 + k_2);\n return (x * x + k_1 * x) / (k_3 * (x + k_2));\n }\n function compute_max_saturation(a, b) {\n let k0, k1, k22, k32, k4, wl, wm, ws;\n if (-1.88170328 * a - 0.80936493 * b > 1) {\n k0 = 1.19086277;\n k1 = 1.76576728;\n k22 = 0.59662641;\n k32 = 0.75515197;\n k4 = 0.56771245;\n wl = 4.0767416621;\n wm = -3.3077115913;\n ws = 0.2309699292;\n } else if (1.81444104 * a - 1.19445276 * b > 1) {\n k0 = 0.73956515;\n k1 = -0.45954404;\n k22 = 0.08285427;\n k32 = 0.1254107;\n k4 = 0.14503204;\n wl = -1.2684380046;\n wm = 2.6097574011;\n ws = -0.3413193965;\n } else {\n k0 = 1.35733652;\n k1 = -915799e-8;\n k22 = -1.1513021;\n k32 = -0.50559606;\n k4 = 692167e-8;\n wl = -0.0041960863;\n wm = -0.7034186147;\n ws = 1.707614701;\n }\n let S = k0 + k1 * a + k22 * b + k32 * a * a + k4 * a * b;\n let k_l = 0.3963377774 * a + 0.2158037573 * b;\n let k_m = -0.1055613458 * a - 0.0638541728 * b;\n let k_s = -0.0894841775 * a - 1.291485548 * b;\n {\n let l_ = 1 + S * k_l;\n let m_ = 1 + S * k_m;\n let s_ = 1 + S * k_s;\n let l = l_ * l_ * l_;\n let m = m_ * m_ * m_;\n let s = s_ * s_ * s_;\n let l_dS = 3 * k_l * l_ * l_;\n let m_dS = 3 * k_m * m_ * m_;\n let s_dS = 3 * k_s * s_ * s_;\n let l_dS2 = 6 * k_l * k_l * l_;\n let m_dS2 = 6 * k_m * k_m * m_;\n let s_dS2 = 6 * k_s * k_s * s_;\n let f3 = wl * l + wm * m + ws * s;\n let f1 = wl * l_dS + wm * m_dS + ws * s_dS;\n let f22 = wl * l_dS2 + wm * m_dS2 + ws * s_dS2;\n S = S - f3 * f1 / (f1 * f1 - 0.5 * f3 * f22);\n }\n return S;\n }\n function find_cusp(a, b) {\n let S_cusp = compute_max_saturation(a, b);\n let rgb4 = convertOklabToLrgb_default({ l: 1, a: S_cusp * a, b: S_cusp * b });\n let L_cusp = Math.cbrt(1 / Math.max(rgb4.r, rgb4.g, rgb4.b));\n let C_cusp = L_cusp * S_cusp;\n return [L_cusp, C_cusp];\n }\n function find_gamut_intersection(a, b, L1, C12, L0, cusp = null) {\n if (!cusp) {\n cusp = find_cusp(a, b);\n }\n let t;\n if ((L1 - L0) * cusp[1] - (cusp[0] - L0) * C12 <= 0) {\n t = cusp[1] * L0 / (C12 * cusp[0] + cusp[1] * (L0 - L1));\n } else {\n t = cusp[1] * (L0 - 1) / (C12 * (cusp[0] - 1) + cusp[1] * (L0 - L1));\n {\n let dL = L1 - L0;\n let dC = C12;\n let k_l = 0.3963377774 * a + 0.2158037573 * b;\n let k_m = -0.1055613458 * a - 0.0638541728 * b;\n let k_s = -0.0894841775 * a - 1.291485548 * b;\n let l_dt = dL + dC * k_l;\n let m_dt = dL + dC * k_m;\n let s_dt = dL + dC * k_s;\n {\n let L = L0 * (1 - t) + t * L1;\n let C = t * C12;\n let l_ = L + C * k_l;\n let m_ = L + C * k_m;\n let s_ = L + C * k_s;\n let l = l_ * l_ * l_;\n let m = m_ * m_ * m_;\n let s = s_ * s_ * s_;\n let ldt = 3 * l_dt * l_ * l_;\n let mdt = 3 * m_dt * m_ * m_;\n let sdt = 3 * s_dt * s_ * s_;\n let ldt2 = 6 * l_dt * l_dt * l_;\n let mdt2 = 6 * m_dt * m_dt * m_;\n let sdt2 = 6 * s_dt * s_dt * s_;\n let r2 = 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s - 1;\n let r1 = 4.0767416621 * ldt - 3.3077115913 * mdt + 0.2309699292 * sdt;\n let r22 = 4.0767416621 * ldt2 - 3.3077115913 * mdt2 + 0.2309699292 * sdt2;\n let u_r = r1 / (r1 * r1 - 0.5 * r2 * r22);\n let t_r = -r2 * u_r;\n let g = -1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s - 1;\n let g1 = -1.2684380046 * ldt + 2.6097574011 * mdt - 0.3413193965 * sdt;\n let g2 = -1.2684380046 * ldt2 + 2.6097574011 * mdt2 - 0.3413193965 * sdt2;\n let u_g = g1 / (g1 * g1 - 0.5 * g * g2);\n let t_g = -g * u_g;\n let b2 = -0.0041960863 * l - 0.7034186147 * m + 1.707614701 * s - 1;\n let b1 = -0.0041960863 * ldt - 0.7034186147 * mdt + 1.707614701 * sdt;\n let b22 = -0.0041960863 * ldt2 - 0.7034186147 * mdt2 + 1.707614701 * sdt2;\n let u_b = b1 / (b1 * b1 - 0.5 * b2 * b22);\n let t_b = -b2 * u_b;\n t_r = u_r >= 0 ? t_r : 1e6;\n t_g = u_g >= 0 ? t_g : 1e6;\n t_b = u_b >= 0 ? t_b : 1e6;\n t += Math.min(t_r, Math.min(t_g, t_b));\n }\n }\n }\n return t;\n }\n function get_ST_max(a_, b_, cusp = null) {\n if (!cusp) {\n cusp = find_cusp(a_, b_);\n }\n let L = cusp[0];\n let C = cusp[1];\n return [C / L, C / (1 - L)];\n }\n function get_Cs(L, a_, b_) {\n let cusp = find_cusp(a_, b_);\n let C_max = find_gamut_intersection(a_, b_, L, 1, L, cusp);\n let ST_max = get_ST_max(a_, b_, cusp);\n let S_mid = 0.11516993 + 1 / (7.4477897 + 4.1590124 * b_ + a_ * (-2.19557347 + 1.75198401 * b_ + a_ * (-2.13704948 - 10.02301043 * b_ + a_ * (-4.24894561 + 5.38770819 * b_ + 4.69891013 * a_))));\n let T_mid = 0.11239642 + 1 / (1.6132032 - 0.68124379 * b_ + a_ * (0.40370612 + 0.90148123 * b_ + a_ * (-0.27087943 + 0.6122399 * b_ + a_ * (299215e-8 - 0.45399568 * b_ - 0.14661872 * a_))));\n let k4 = C_max / Math.min(L * ST_max[0], (1 - L) * ST_max[1]);\n let C_a = L * S_mid;\n let C_b = (1 - L) * T_mid;\n let C_mid = 0.9 * k4 * Math.sqrt(\n Math.sqrt(\n 1 / (1 / (C_a * C_a * C_a * C_a) + 1 / (C_b * C_b * C_b * C_b))\n )\n );\n C_a = L * 0.4;\n C_b = (1 - L) * 0.8;\n let C_0 = Math.sqrt(1 / (1 / (C_a * C_a) + 1 / (C_b * C_b)));\n return [C_0, C_mid, C_max];\n }\n\n // node_modules/culori/src/okhsl/convertOklabToOkhsl.js\n function convertOklabToOkhsl(lab2) {\n const l = lab2.l !== void 0 ? lab2.l : 0;\n const a = lab2.a !== void 0 ? lab2.a : 0;\n const b = lab2.b !== void 0 ? lab2.b : 0;\n const ret = { mode: \"okhsl\", l: toe(l) };\n if (lab2.alpha !== void 0) {\n ret.alpha = lab2.alpha;\n }\n let c2 = Math.sqrt(a * a + b * b);\n if (!c2) {\n ret.s = 0;\n return ret;\n }\n let [C_0, C_mid, C_max] = get_Cs(l, a / c2, b / c2);\n let s;\n if (c2 < C_mid) {\n let k_0 = 0;\n let k_1 = 0.8 * C_0;\n let k_2 = 1 - k_1 / C_mid;\n let t = (c2 - k_0) / (k_1 + k_2 * (c2 - k_0));\n s = t * 0.8;\n } else {\n let k_0 = C_mid;\n let k_1 = 0.2 * C_mid * C_mid * 1.25 * 1.25 / C_0;\n let k_2 = 1 - k_1 / (C_max - C_mid);\n let t = (c2 - k_0) / (k_1 + k_2 * (c2 - k_0));\n s = 0.8 + 0.2 * t;\n }\n if (s) {\n ret.s = s;\n ret.h = normalizeHue_default(Math.atan2(b, a) * 180 / Math.PI);\n }\n return ret;\n }\n\n // node_modules/culori/src/okhsl/convertOkhslToOklab.js\n function convertOkhslToOklab(hsl3) {\n let h = hsl3.h !== void 0 ? hsl3.h : 0;\n let s = hsl3.s !== void 0 ? hsl3.s : 0;\n let l = hsl3.l !== void 0 ? hsl3.l : 0;\n const ret = { mode: \"oklab\", l: toe_inv(l) };\n if (hsl3.alpha !== void 0) {\n ret.alpha = hsl3.alpha;\n }\n if (!s || l === 1) {\n ret.a = ret.b = 0;\n return ret;\n }\n let a_ = Math.cos(h / 180 * Math.PI);\n let b_ = Math.sin(h / 180 * Math.PI);\n let [C_0, C_mid, C_max] = get_Cs(ret.l, a_, b_);\n let t, k_0, k_1, k_2;\n if (s < 0.8) {\n t = 1.25 * s;\n k_0 = 0;\n k_1 = 0.8 * C_0;\n k_2 = 1 - k_1 / C_mid;\n } else {\n t = 5 * (s - 0.8);\n k_0 = C_mid;\n k_1 = 0.2 * C_mid * C_mid * 1.25 * 1.25 / C_0;\n k_2 = 1 - k_1 / (C_max - C_mid);\n }\n let C = k_0 + t * k_1 / (1 - k_2 * t);\n ret.a = C * a_;\n ret.b = C * b_;\n return ret;\n }\n\n // node_modules/culori/src/okhsl/modeOkhsl.js\n var modeOkhsl = {\n ...definition_default7,\n mode: \"okhsl\",\n channels: [\"h\", \"s\", \"l\", \"alpha\"],\n parse: [\"--okhsl\"],\n serialize: \"--okhsl\",\n fromMode: {\n oklab: convertOklabToOkhsl,\n rgb: (c2) => convertOklabToOkhsl(convertRgbToOklab_default(c2))\n },\n toMode: {\n oklab: convertOkhslToOklab,\n rgb: (c2) => convertOklabToRgb_default(convertOkhslToOklab(c2))\n }\n };\n var modeOkhsl_default = modeOkhsl;\n\n // node_modules/culori/src/okhsv/convertOklabToOkhsv.js\n function convertOklabToOkhsv(lab2) {\n let l = lab2.l !== void 0 ? lab2.l : 0;\n let a = lab2.a !== void 0 ? lab2.a : 0;\n let b = lab2.b !== void 0 ? lab2.b : 0;\n let c2 = Math.sqrt(a * a + b * b);\n let a_ = c2 ? a / c2 : 1;\n let b_ = c2 ? b / c2 : 1;\n let [S_max, T] = get_ST_max(a_, b_);\n let S_0 = 0.5;\n let k4 = 1 - S_0 / S_max;\n let t = T / (c2 + l * T);\n let L_v = t * l;\n let C_v = t * c2;\n let L_vt = toe_inv(L_v);\n let C_vt = C_v * L_vt / L_v;\n let rgb_scale = convertOklabToLrgb_default({ l: L_vt, a: a_ * C_vt, b: b_ * C_vt });\n let scale_L = Math.cbrt(\n 1 / Math.max(rgb_scale.r, rgb_scale.g, rgb_scale.b, 0)\n );\n l = l / scale_L;\n c2 = c2 / scale_L * toe(l) / l;\n l = toe(l);\n const ret = {\n mode: \"okhsv\",\n s: c2 ? (S_0 + T) * C_v / (T * S_0 + T * k4 * C_v) : 0,\n v: l ? l / L_v : 0\n };\n if (ret.s) {\n ret.h = normalizeHue_default(Math.atan2(b, a) * 180 / Math.PI);\n }\n if (lab2.alpha !== void 0) {\n ret.alpha = lab2.alpha;\n }\n return ret;\n }\n\n // node_modules/culori/src/okhsv/convertOkhsvToOklab.js\n function convertOkhsvToOklab(hsv2) {\n const ret = { mode: \"oklab\" };\n if (hsv2.alpha !== void 0) {\n ret.alpha = hsv2.alpha;\n }\n const h = hsv2.h !== void 0 ? hsv2.h : 0;\n const s = hsv2.s !== void 0 ? hsv2.s : 0;\n const v = hsv2.v !== void 0 ? hsv2.v : 0;\n const a_ = Math.cos(h / 180 * Math.PI);\n const b_ = Math.sin(h / 180 * Math.PI);\n const [S_max, T] = get_ST_max(a_, b_);\n const S_0 = 0.5;\n const k4 = 1 - S_0 / S_max;\n const L_v = 1 - s * S_0 / (S_0 + T - T * k4 * s);\n const C_v = s * T * S_0 / (S_0 + T - T * k4 * s);\n const L_vt = toe_inv(L_v);\n const C_vt = C_v * L_vt / L_v;\n const rgb_scale = convertOklabToLrgb_default({\n l: L_vt,\n a: a_ * C_vt,\n b: b_ * C_vt\n });\n const scale_L = Math.cbrt(\n 1 / Math.max(rgb_scale.r, rgb_scale.g, rgb_scale.b, 0)\n );\n const L_new = toe_inv(v * L_v);\n const C = C_v * L_new / L_v;\n ret.l = L_new * scale_L;\n ret.a = C * a_ * scale_L;\n ret.b = C * b_ * scale_L;\n return ret;\n }\n\n // node_modules/culori/src/okhsv/modeOkhsv.js\n var modeOkhsv = {\n ...definition_default8,\n mode: \"okhsv\",\n channels: [\"h\", \"s\", \"v\", \"alpha\"],\n parse: [\"--okhsv\"],\n serialize: \"--okhsv\",\n fromMode: {\n oklab: convertOklabToOkhsv,\n rgb: (c2) => convertOklabToOkhsv(convertRgbToOklab_default(c2))\n },\n toMode: {\n oklab: convertOkhsvToOklab,\n rgb: (c2) => convertOklabToRgb_default(convertOkhsvToOklab(c2))\n }\n };\n var modeOkhsv_default = modeOkhsv;\n\n // node_modules/culori/src/oklab/parseOklab.js\n function parseOklab(color, parsed) {\n if (!parsed || parsed[0] !== \"oklab\") {\n return void 0;\n }\n const res = { mode: \"oklab\" };\n const [, l, a, b, alpha2] = parsed;\n if (l.type === Tok.Hue || a.type === Tok.Hue || b.type === Tok.Hue) {\n return void 0;\n }\n if (l.type !== Tok.None) {\n res.l = Math.min(\n Math.max(0, l.type === Tok.Number ? l.value : l.value / 100),\n 1\n );\n }\n if (a.type !== Tok.None) {\n res.a = a.type === Tok.Number ? a.value : a.value * 0.4 / 100;\n }\n if (b.type !== Tok.None) {\n res.b = b.type === Tok.Number ? b.value : b.value * 0.4 / 100;\n }\n if (alpha2.type !== Tok.None) {\n res.alpha = Math.min(\n 1,\n Math.max(\n 0,\n alpha2.type === Tok.Number ? alpha2.value : alpha2.value / 100\n )\n );\n }\n return res;\n }\n var parseOklab_default = parseOklab;\n\n // node_modules/culori/src/oklab/definition.js\n var definition20 = {\n ...definition_default13,\n mode: \"oklab\",\n toMode: {\n lrgb: convertOklabToLrgb_default,\n rgb: convertOklabToRgb_default\n },\n fromMode: {\n lrgb: convertLrgbToOklab_default,\n rgb: convertRgbToOklab_default\n },\n ranges: {\n l: [0, 1],\n a: [-0.4, 0.4],\n b: [-0.4, 0.4]\n },\n parse: [parseOklab_default],\n serialize: (c2) => `oklab(${c2.l !== void 0 ? c2.l : \"none\"} ${c2.a !== void 0 ? c2.a : \"none\"} ${c2.b !== void 0 ? c2.b : \"none\"}${c2.alpha < 1 ? ` / ${c2.alpha}` : \"\"})`\n };\n var definition_default20 = definition20;\n\n // node_modules/culori/src/oklch/parseOklch.js\n function parseOklch(color, parsed) {\n if (!parsed || parsed[0] !== \"oklch\") {\n return void 0;\n }\n const res = { mode: \"oklch\" };\n const [, l, c2, h, alpha2] = parsed;\n if (l.type !== Tok.None) {\n if (l.type === Tok.Hue) {\n return void 0;\n }\n res.l = Math.min(\n Math.max(0, l.type === Tok.Number ? l.value : l.value / 100),\n 1\n );\n }\n if (c2.type !== Tok.None) {\n res.c = Math.max(\n 0,\n c2.type === Tok.Number ? c2.value : c2.value * 0.4 / 100\n );\n }\n if (h.type !== Tok.None) {\n if (h.type === Tok.Percentage) {\n return void 0;\n }\n res.h = h.value;\n }\n if (alpha2.type !== Tok.None) {\n res.alpha = Math.min(\n 1,\n Math.max(\n 0,\n alpha2.type === Tok.Number ? alpha2.value : alpha2.value / 100\n )\n );\n }\n return res;\n }\n var parseOklch_default = parseOklch;\n\n // node_modules/culori/src/oklch/definition.js\n var definition21 = {\n ...definition_default15,\n mode: \"oklch\",\n toMode: {\n oklab: (c2) => convertLchToLab_default(c2, \"oklab\"),\n rgb: (c2) => convertOklabToRgb_default(convertLchToLab_default(c2, \"oklab\"))\n },\n fromMode: {\n rgb: (c2) => convertLabToLch_default(convertRgbToOklab_default(c2), \"oklch\"),\n oklab: (c2) => convertLabToLch_default(c2, \"oklch\")\n },\n parse: [parseOklch_default],\n serialize: (c2) => `oklch(${c2.l !== void 0 ? c2.l : \"none\"} ${c2.c !== void 0 ? c2.c : \"none\"} ${c2.h !== void 0 ? c2.h : \"none\"}${c2.alpha < 1 ? ` / ${c2.alpha}` : \"\"})`,\n ranges: {\n l: [0, 1],\n c: [0, 0.4],\n h: [0, 360]\n }\n };\n var definition_default21 = definition21;\n\n // node_modules/culori/src/p3/convertP3ToXyz65.js\n var convertP3ToXyz65 = (rgb4) => {\n let { r: r2, g, b, alpha: alpha2 } = convertRgbToLrgb_default(rgb4);\n let res = {\n mode: \"xyz65\",\n x: 0.486570948648216 * r2 + 0.265667693169093 * g + 0.1982172852343625 * b,\n y: 0.2289745640697487 * r2 + 0.6917385218365062 * g + 0.079286914093745 * b,\n z: 0 * r2 + 0.0451133818589026 * g + 1.043944368900976 * b\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertP3ToXyz65_default = convertP3ToXyz65;\n\n // node_modules/culori/src/p3/convertXyz65ToP3.js\n var convertXyz65ToP3 = ({ x, y, z, alpha: alpha2 }) => {\n if (x === void 0) x = 0;\n if (y === void 0) y = 0;\n if (z === void 0) z = 0;\n let res = convertLrgbToRgb_default(\n {\n r: x * 2.4934969119414263 - y * 0.9313836179191242 - 0.402710784450717 * z,\n g: x * -0.8294889695615749 + y * 1.7626640603183465 + 0.0236246858419436 * z,\n b: x * 0.0358458302437845 - y * 0.0761723892680418 + 0.9568845240076871 * z\n },\n \"p3\"\n );\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertXyz65ToP3_default = convertXyz65ToP3;\n\n // node_modules/culori/src/p3/definition.js\n var definition22 = {\n ...definition_default,\n mode: \"p3\",\n parse: [\"display-p3\"],\n serialize: \"display-p3\",\n fromMode: {\n rgb: (color) => convertXyz65ToP3_default(convertRgbToXyz65_default(color)),\n xyz65: convertXyz65ToP3_default\n },\n toMode: {\n rgb: (color) => convertXyz65ToRgb_default(convertP3ToXyz65_default(color)),\n xyz65: convertP3ToXyz65_default\n }\n };\n var definition_default22 = definition22;\n\n // node_modules/culori/src/prophoto/convertXyz50ToProphoto.js\n var gamma2 = (v) => {\n let abs2 = Math.abs(v);\n if (abs2 >= 1 / 512) {\n return Math.sign(v) * Math.pow(abs2, 1 / 1.8);\n }\n return 16 * v;\n };\n var convertXyz50ToProphoto = ({ x, y, z, alpha: alpha2 }) => {\n if (x === void 0) x = 0;\n if (y === void 0) y = 0;\n if (z === void 0) z = 0;\n let res = {\n mode: \"prophoto\",\n r: gamma2(\n x * 1.3457868816471585 - y * 0.2555720873797946 - 0.0511018649755453 * z\n ),\n g: gamma2(\n x * -0.5446307051249019 + y * 1.5082477428451466 + 0.0205274474364214 * z\n ),\n b: gamma2(x * 0 + y * 0 + 1.2119675456389452 * z)\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertXyz50ToProphoto_default = convertXyz50ToProphoto;\n\n // node_modules/culori/src/prophoto/convertProphotoToXyz50.js\n var linearize2 = (v = 0) => {\n let abs2 = Math.abs(v);\n if (abs2 >= 16 / 512) {\n return Math.sign(v) * Math.pow(abs2, 1.8);\n }\n return v / 16;\n };\n var convertProphotoToXyz50 = (prophoto2) => {\n let r2 = linearize2(prophoto2.r);\n let g = linearize2(prophoto2.g);\n let b = linearize2(prophoto2.b);\n let res = {\n mode: \"xyz50\",\n x: 0.7977666449006423 * r2 + 0.1351812974005331 * g + 0.0313477341283922 * b,\n y: 0.2880748288194013 * r2 + 0.7118352342418731 * g + 899369387256e-16 * b,\n z: 0 * r2 + 0 * g + 0.8251046025104602 * b\n };\n if (prophoto2.alpha !== void 0) {\n res.alpha = prophoto2.alpha;\n }\n return res;\n };\n var convertProphotoToXyz50_default = convertProphotoToXyz50;\n\n // node_modules/culori/src/prophoto/definition.js\n var definition23 = {\n ...definition_default,\n mode: \"prophoto\",\n parse: [\"prophoto-rgb\"],\n serialize: \"prophoto-rgb\",\n fromMode: {\n xyz50: convertXyz50ToProphoto_default,\n rgb: (color) => convertXyz50ToProphoto_default(convertRgbToXyz50_default(color))\n },\n toMode: {\n xyz50: convertProphotoToXyz50_default,\n rgb: (color) => convertXyz50ToRgb_default(convertProphotoToXyz50_default(color))\n }\n };\n var definition_default23 = definition23;\n\n // node_modules/culori/src/rec2020/convertXyz65ToRec2020.js\n var \\u03B1 = 1.09929682680944;\n var \\u03B2 = 0.018053968510807;\n var gamma3 = (v) => {\n const abs2 = Math.abs(v);\n if (abs2 > \\u03B2) {\n return (Math.sign(v) || 1) * (\\u03B1 * Math.pow(abs2, 0.45) - (\\u03B1 - 1));\n }\n return 4.5 * v;\n };\n var convertXyz65ToRec2020 = ({ x, y, z, alpha: alpha2 }) => {\n if (x === void 0) x = 0;\n if (y === void 0) y = 0;\n if (z === void 0) z = 0;\n let res = {\n mode: \"rec2020\",\n r: gamma3(\n x * 1.7166511879712683 - y * 0.3556707837763925 - 0.2533662813736599 * z\n ),\n g: gamma3(\n x * -0.6666843518324893 + y * 1.6164812366349395 + 0.0157685458139111 * z\n ),\n b: gamma3(\n x * 0.0176398574453108 - y * 0.0427706132578085 + 0.9421031212354739 * z\n )\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertXyz65ToRec2020_default = convertXyz65ToRec2020;\n\n // node_modules/culori/src/rec2020/convertRec2020ToXyz65.js\n var \\u03B12 = 1.09929682680944;\n var \\u03B22 = 0.018053968510807;\n var linearize3 = (v = 0) => {\n let abs2 = Math.abs(v);\n if (abs2 < \\u03B22 * 4.5) {\n return v / 4.5;\n }\n return (Math.sign(v) || 1) * Math.pow((abs2 + \\u03B12 - 1) / \\u03B12, 1 / 0.45);\n };\n var convertRec2020ToXyz65 = (rec20202) => {\n let r2 = linearize3(rec20202.r);\n let g = linearize3(rec20202.g);\n let b = linearize3(rec20202.b);\n let res = {\n mode: \"xyz65\",\n x: 0.6369580483012911 * r2 + 0.1446169035862083 * g + 0.1688809751641721 * b,\n y: 0.262700212011267 * r2 + 0.6779980715188708 * g + 0.059301716469862 * b,\n z: 0 * r2 + 0.0280726930490874 * g + 1.0609850577107909 * b\n };\n if (rec20202.alpha !== void 0) {\n res.alpha = rec20202.alpha;\n }\n return res;\n };\n var convertRec2020ToXyz65_default = convertRec2020ToXyz65;\n\n // node_modules/culori/src/rec2020/definition.js\n var definition24 = {\n ...definition_default,\n mode: \"rec2020\",\n fromMode: {\n xyz65: convertXyz65ToRec2020_default,\n rgb: (color) => convertXyz65ToRec2020_default(convertRgbToXyz65_default(color))\n },\n toMode: {\n xyz65: convertRec2020ToXyz65_default,\n rgb: (color) => convertXyz65ToRgb_default(convertRec2020ToXyz65_default(color))\n },\n parse: [\"rec2020\"],\n serialize: \"rec2020\"\n };\n var definition_default24 = definition24;\n\n // node_modules/culori/src/xyb/constants.js\n var bias = 0.0037930732552754493;\n var bias_cbrt = Math.cbrt(bias);\n\n // node_modules/culori/src/xyb/convertRgbToXyb.js\n var transfer = (v) => Math.cbrt(v) - bias_cbrt;\n var convertRgbToXyb = (color) => {\n const { r: r2, g, b, alpha: alpha2 } = convertRgbToLrgb_default(color);\n const l = transfer(0.3 * r2 + 0.622 * g + 0.078 * b + bias);\n const m = transfer(0.23 * r2 + 0.692 * g + 0.078 * b + bias);\n const s = transfer(\n 0.2434226892454782 * r2 + 0.2047674442449682 * g + 0.5518098665095535 * b + bias\n );\n const res = {\n mode: \"xyb\",\n x: (l - m) / 2,\n y: (l + m) / 2,\n /* Apply default chroma from luma (subtract Y from B) */\n b: s - (l + m) / 2\n };\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n };\n var convertRgbToXyb_default = convertRgbToXyb;\n\n // node_modules/culori/src/xyb/convertXybToRgb.js\n var transfer2 = (v) => Math.pow(v + bias_cbrt, 3);\n var convertXybToRgb = ({ x, y, b, alpha: alpha2 }) => {\n if (x === void 0) x = 0;\n if (y === void 0) y = 0;\n if (b === void 0) b = 0;\n const l = transfer2(x + y) - bias;\n const m = transfer2(y - x) - bias;\n const s = transfer2(b + y) - bias;\n const res = convertLrgbToRgb_default({\n r: 11.031566904639861 * l - 9.866943908131562 * m - 0.16462299650829934 * s,\n g: -3.2541473810744237 * l + 4.418770377582723 * m - 0.16462299650829934 * s,\n b: -3.6588512867136815 * l + 2.7129230459360922 * m + 1.9459282407775895 * s\n });\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n };\n var convertXybToRgb_default = convertXybToRgb;\n\n // node_modules/culori/src/xyb/definition.js\n var definition25 = {\n mode: \"xyb\",\n channels: [\"x\", \"y\", \"b\", \"alpha\"],\n parse: [\"--xyb\"],\n serialize: \"--xyb\",\n toMode: {\n rgb: convertXybToRgb_default\n },\n fromMode: {\n rgb: convertRgbToXyb_default\n },\n ranges: {\n x: [-0.0154, 0.0281],\n y: [0, 0.8453],\n b: [-0.2778, 0.388]\n },\n interpolate: {\n x: interpolatorLinear,\n y: interpolatorLinear,\n b: interpolatorLinear,\n alpha: { use: interpolatorLinear, fixup: fixupAlpha }\n }\n };\n var definition_default25 = definition25;\n\n // node_modules/culori/src/xyz50/definition.js\n var definition26 = {\n mode: \"xyz50\",\n parse: [\"xyz-d50\"],\n serialize: \"xyz-d50\",\n toMode: {\n rgb: convertXyz50ToRgb_default,\n lab: convertXyz50ToLab_default\n },\n fromMode: {\n rgb: convertRgbToXyz50_default,\n lab: convertLabToXyz50_default\n },\n channels: [\"x\", \"y\", \"z\", \"alpha\"],\n ranges: {\n x: [0, 0.964],\n y: [0, 0.999],\n z: [0, 0.825]\n },\n interpolate: {\n x: interpolatorLinear,\n y: interpolatorLinear,\n z: interpolatorLinear,\n alpha: { use: interpolatorLinear, fixup: fixupAlpha }\n }\n };\n var definition_default26 = definition26;\n\n // node_modules/culori/src/xyz65/convertXyz65ToXyz50.js\n var convertXyz65ToXyz50 = (xyz652) => {\n let { x, y, z, alpha: alpha2 } = xyz652;\n if (x === void 0) x = 0;\n if (y === void 0) y = 0;\n if (z === void 0) z = 0;\n let res = {\n mode: \"xyz50\",\n x: 1.0479298208405488 * x + 0.0229467933410191 * y - 0.0501922295431356 * z,\n y: 0.0296278156881593 * x + 0.990434484573249 * y - 0.0170738250293851 * z,\n z: -0.0092430581525912 * x + 0.0150551448965779 * y + 0.7518742899580008 * z\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertXyz65ToXyz50_default = convertXyz65ToXyz50;\n\n // node_modules/culori/src/xyz65/convertXyz50ToXyz65.js\n var convertXyz50ToXyz65 = (xyz502) => {\n let { x, y, z, alpha: alpha2 } = xyz502;\n if (x === void 0) x = 0;\n if (y === void 0) y = 0;\n if (z === void 0) z = 0;\n let res = {\n mode: \"xyz65\",\n x: 0.9554734527042182 * x - 0.0230985368742614 * y + 0.0632593086610217 * z,\n y: -0.0283697069632081 * x + 1.0099954580058226 * y + 0.021041398966943 * z,\n z: 0.0123140016883199 * x - 0.0205076964334779 * y + 1.3303659366080753 * z\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertXyz50ToXyz65_default = convertXyz50ToXyz65;\n\n // node_modules/culori/src/xyz65/definition.js\n var definition27 = {\n mode: \"xyz65\",\n toMode: {\n rgb: convertXyz65ToRgb_default,\n xyz50: convertXyz65ToXyz50_default\n },\n fromMode: {\n rgb: convertRgbToXyz65_default,\n xyz50: convertXyz50ToXyz65_default\n },\n ranges: {\n x: [0, 0.95],\n y: [0, 1],\n z: [0, 1.088]\n },\n channels: [\"x\", \"y\", \"z\", \"alpha\"],\n parse: [\"xyz\", \"xyz-d65\"],\n serialize: \"xyz-d65\",\n interpolate: {\n x: interpolatorLinear,\n y: interpolatorLinear,\n z: interpolatorLinear,\n alpha: { use: interpolatorLinear, fixup: fixupAlpha }\n }\n };\n var definition_default27 = definition27;\n\n // node_modules/culori/src/yiq/convertRgbToYiq.js\n var convertRgbToYiq = ({ r: r2, g, b, alpha: alpha2 }) => {\n if (r2 === void 0) r2 = 0;\n if (g === void 0) g = 0;\n if (b === void 0) b = 0;\n const res = {\n mode: \"yiq\",\n y: 0.29889531 * r2 + 0.58662247 * g + 0.11448223 * b,\n i: 0.59597799 * r2 - 0.2741761 * g - 0.32180189 * b,\n q: 0.21147017 * r2 - 0.52261711 * g + 0.31114694 * b\n };\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n };\n var convertRgbToYiq_default = convertRgbToYiq;\n\n // node_modules/culori/src/yiq/convertYiqToRgb.js\n var convertYiqToRgb = ({ y, i, q, alpha: alpha2 }) => {\n if (y === void 0) y = 0;\n if (i === void 0) i = 0;\n if (q === void 0) q = 0;\n const res = {\n mode: \"rgb\",\n r: y + 0.95608445 * i + 0.6208885 * q,\n g: y - 0.27137664 * i - 0.6486059 * q,\n b: y - 1.10561724 * i + 1.70250126 * q\n };\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n };\n var convertYiqToRgb_default = convertYiqToRgb;\n\n // node_modules/culori/src/yiq/definition.js\n var definition28 = {\n mode: \"yiq\",\n toMode: {\n rgb: convertYiqToRgb_default\n },\n fromMode: {\n rgb: convertRgbToYiq_default\n },\n channels: [\"y\", \"i\", \"q\", \"alpha\"],\n parse: [\"--yiq\"],\n serialize: \"--yiq\",\n ranges: {\n i: [-0.595, 0.595],\n q: [-0.522, 0.522]\n },\n interpolate: {\n y: interpolatorLinear,\n i: interpolatorLinear,\n q: interpolatorLinear,\n alpha: { use: interpolatorLinear, fixup: fixupAlpha }\n }\n };\n var definition_default28 = definition28;\n\n // node_modules/culori/src/round.js\n var r = (value, precision) => Math.round(value * (precision = Math.pow(10, precision))) / precision;\n var round = (precision = 4) => (value) => typeof value === \"number\" ? r(value, precision) : value;\n var round_default = round;\n\n // node_modules/culori/src/formatter.js\n var twoDecimals = round_default(2);\n var clamp = (value) => Math.max(0, Math.min(1, value || 0));\n var fixup = (value) => Math.round(clamp(value) * 255);\n var rgb = converter_default(\"rgb\");\n var hsl = converter_default(\"hsl\");\n var serializeHex = (color) => {\n if (color === void 0) {\n return void 0;\n }\n let r2 = fixup(color.r);\n let g = fixup(color.g);\n let b = fixup(color.b);\n return \"#\" + (1 << 24 | r2 << 16 | g << 8 | b).toString(16).slice(1);\n };\n var serializeRgb = (color) => {\n if (color === void 0) {\n return void 0;\n }\n let r2 = fixup(color.r);\n let g = fixup(color.g);\n let b = fixup(color.b);\n if (color.alpha === void 0 || color.alpha === 1) {\n return `rgb(${r2}, ${g}, ${b})`;\n } else {\n return `rgba(${r2}, ${g}, ${b}, ${twoDecimals(clamp(color.alpha))})`;\n }\n };\n var formatHex = (c2) => serializeHex(rgb(c2));\n var formatRgb = (c2) => serializeRgb(rgb(c2));\n\n // node_modules/culori/src/clamp.js\n var rgb2 = converter_default(\"rgb\");\n var fixup_rgb = (c2) => {\n const res = {\n mode: c2.mode,\n r: Math.max(0, Math.min(c2.r !== void 0 ? c2.r : 0, 1)),\n g: Math.max(0, Math.min(c2.g !== void 0 ? c2.g : 0, 1)),\n b: Math.max(0, Math.min(c2.b !== void 0 ? c2.b : 0, 1))\n };\n if (c2.alpha !== void 0) {\n res.alpha = c2.alpha;\n }\n return res;\n };\n var to_displayable_srgb = (c2) => fixup_rgb(rgb2(c2));\n var inrange_rgb = (c2) => {\n return c2 !== void 0 && (c2.r === void 0 || c2.r >= 0 && c2.r <= 1) && (c2.g === void 0 || c2.g >= 0 && c2.g <= 1) && (c2.b === void 0 || c2.b >= 0 && c2.b <= 1);\n };\n function displayable(color) {\n return inrange_rgb(rgb2(color));\n }\n function inGamut(mode = \"rgb\") {\n const { gamut } = getMode(mode);\n if (!gamut) {\n return (color) => true;\n }\n const conv = converter_default(typeof gamut === \"string\" ? gamut : mode);\n return (color) => inrange_rgb(conv(color));\n }\n function clampGamut(mode = \"rgb\") {\n const { gamut } = getMode(mode);\n if (!gamut) {\n return (color) => prepare_default(color);\n }\n const destMode = typeof gamut === \"string\" ? gamut : mode;\n const destConv = converter_default(destMode);\n const inDestGamut = inGamut(destMode);\n return (color) => {\n const original = prepare_default(color);\n if (!original) {\n return void 0;\n }\n const converted = destConv(original);\n if (inDestGamut(converted)) {\n return original;\n }\n const clamped = fixup_rgb(converted);\n if (original.mode === clamped.mode) {\n return clamped;\n }\n return converter_default(original.mode)(clamped);\n };\n }\n function clampChroma(color, mode = \"lch\", rgbGamut = \"rgb\") {\n color = prepare_default(color);\n let inDestinationGamut = rgbGamut === \"rgb\" ? displayable : inGamut(rgbGamut);\n let clipToGamut = rgbGamut === \"rgb\" ? to_displayable_srgb : clampGamut(rgbGamut);\n if (color === void 0 || inDestinationGamut(color)) return color;\n let conv = converter_default(color.mode);\n color = converter_default(mode)(color);\n let clamped = { ...color, c: 0 };\n if (!inDestinationGamut(clamped)) {\n return conv(clipToGamut(clamped));\n }\n let start = 0;\n let end = color.c !== void 0 ? color.c : 0;\n let range = getMode(mode).ranges.c;\n let resolution = (range[1] - range[0]) / Math.pow(2, 13);\n let _last_good_c = clamped.c;\n while (end - start > resolution) {\n clamped.c = start + (end - start) * 0.5;\n if (inDestinationGamut(clamped)) {\n _last_good_c = clamped.c;\n start = clamped.c;\n } else {\n end = clamped.c;\n }\n }\n return conv(\n inDestinationGamut(clamped) ? clamped : { ...clamped, c: _last_good_c }\n );\n }\n\n // node_modules/culori/src/wcag.js\n function luminance(color) {\n let c2 = converter_default(\"lrgb\")(color);\n return 0.2126 * c2.r + 0.7152 * c2.g + 0.0722 * c2.b;\n }\n function contrast(a, b) {\n let L1 = luminance(a);\n let L2 = luminance(b);\n return (Math.max(L1, L2) + 0.05) / (Math.min(L1, L2) + 0.05);\n }\n\n // node_modules/culori/src/index.js\n var a98 = useMode(definition_default2);\n var cubehelix = useMode(definition_default3);\n var dlab = useMode(definition_default4);\n var dlch = useMode(definition_default5);\n var hsi = useMode(definition_default6);\n var hsl2 = useMode(definition_default7);\n var hsv = useMode(definition_default8);\n var hwb = useMode(definition_default9);\n var itp = useMode(definition_default10);\n var jab = useMode(definition_default11);\n var jch = useMode(definition_default12);\n var lab = useMode(definition_default13);\n var lab65 = useMode(definition_default14);\n var lch = useMode(definition_default15);\n var lch65 = useMode(definition_default16);\n var lchuv = useMode(definition_default17);\n var lrgb = useMode(definition_default18);\n var luv = useMode(definition_default19);\n var okhsl = useMode(modeOkhsl_default);\n var okhsv = useMode(modeOkhsv_default);\n var oklab = useMode(definition_default20);\n var oklch = useMode(definition_default21);\n var p3 = useMode(definition_default22);\n var prophoto = useMode(definition_default23);\n var rec2020 = useMode(definition_default24);\n var rgb3 = useMode(definition_default);\n var xyb = useMode(definition_default25);\n var xyz50 = useMode(definition_default26);\n var xyz65 = useMode(definition_default27);\n var yiq = useMode(definition_default28);\n\n // packages/xtyle/dist/color.js\n var toOklch = converter_default(\"oklch\");\n var DEFAULT_OKLCH = { l: 0, c: 0, h: 0, alpha: 1 };\n function toOklchColor(input) {\n if (typeof input !== \"string\")\n return input;\n const parsed = parse_default(input);\n if (!parsed)\n throw new Error(`xtyle: unparseable color \"${input}\"`);\n const o = toOklch(parsed);\n if (!o)\n throw new Error(`xtyle: cannot convert color \"${input}\" to oklch`);\n return {\n l: clamp01(o.l ?? 0),\n c: Math.max(0, o.c ?? 0),\n h: o.h ?? 0,\n alpha: o.alpha ?? 1\n };\n }\n function oklch2(l, c2, h, alpha2 = 1) {\n return { l: clamp01(l), c: Math.max(0, c2), h: (h % 360 + 360) % 360, alpha: alpha2 };\n }\n function withLightness(color, l) {\n return { ...color, l: clamp01(l) };\n }\n function withAlpha(color, alpha2) {\n return { ...color, alpha: clamp01(alpha2) };\n }\n function hueDelta(from, to) {\n let d = ((to - from) % 360 + 360) % 360;\n if (d > 180)\n d -= 360;\n return d;\n }\n function lightness(input) {\n return toOklchColor(input).l;\n }\n function contrast2(a, b) {\n const value = contrast(formatCss2(a), formatCss2(b));\n return value ?? 1;\n }\n function clampToGamut(color) {\n const mapped = clampChroma({ mode: \"oklch\", l: color.l, c: color.c, h: color.h, alpha: color.alpha }, \"oklch\", \"rgb\");\n return {\n l: mapped.l ?? color.l,\n c: Math.max(0, mapped.c ?? 0),\n h: mapped.h ?? color.h,\n alpha: mapped.alpha ?? color.alpha\n };\n }\n function formatCss2(input) {\n const source = typeof input === \"string\" ? toOklchColor(input) : input;\n const color = clampToGamut(source);\n const culoriColor = {\n mode: \"oklch\",\n l: color.l,\n c: color.c,\n h: color.h,\n alpha: color.alpha\n };\n if (color.alpha < 1) {\n return formatRgb(culoriColor) ?? formatHex(culoriColor) ?? \"#000000\";\n }\n return formatHex(culoriColor) ?? \"#000000\";\n }\n function schemeOf(bg) {\n return lightness(bg) < 0.5 ? \"dark\" : \"light\";\n }\n function pickReadable(fill, options, floor = 4.5) {\n let best = options[0] ?? DEFAULT_OKLCH;\n let bestContrast = -1;\n for (const option of options) {\n const ratio = contrast2(fill, option);\n if (ratio >= floor)\n return formatCss2(option);\n if (ratio > bestContrast) {\n bestContrast = ratio;\n best = option;\n }\n }\n return formatCss2(best);\n }\n function clamp01(value) {\n if (Number.isNaN(value))\n return 0;\n return Math.min(1, Math.max(0, value));\n }\n\n // packages/xtyle/dist/graph.js\n var CycleError = class extends Error {\n constructor(cycle) {\n super(`xtyle: cycle detected in token graph: ${cycle.join(\" -> \")}`);\n __publicField(this, \"cycle\");\n this.cycle = cycle;\n this.name = \"CycleError\";\n }\n };\n function resolveGraph(nodes) {\n const byName = /* @__PURE__ */ new Map();\n for (const node of nodes)\n byName.set(node.name, node);\n const computed = /* @__PURE__ */ new Map();\n const visiting = /* @__PURE__ */ new Set();\n const done = /* @__PURE__ */ new Set();\n const stack = [];\n const visit = (name) => {\n if (done.has(name))\n return;\n const node = byName.get(name);\n if (!node)\n return;\n if (visiting.has(name)) {\n const start = stack.indexOf(name);\n throw new CycleError([...stack.slice(start), name]);\n }\n visiting.add(name);\n stack.push(name);\n for (const ref of node.refs ?? [])\n visit(ref);\n if (node.resolve) {\n const inputs = {};\n for (const [key, value] of computed)\n inputs[key] = value;\n computed.set(name, node.resolve(inputs));\n } else if (node.value !== void 0) {\n computed.set(name, node.value);\n }\n stack.pop();\n visiting.delete(name);\n done.add(name);\n };\n for (const node of nodes)\n visit(node.name);\n const resolved = {};\n for (const node of nodes) {\n const value = computed.get(node.name);\n if (value !== void 0)\n resolved[node.name] = value;\n }\n return resolved;\n }\n\n // packages/xtyle/dist/vocab.js\n var TONES = [\"accent\", \"neutral\", \"danger\", \"success\", \"warn\", \"info\"];\n var ACCENT_VARIANTS = [\"accent-2\", \"accent-3\", \"accent-4\"];\n var HUES = [\n \"red\",\n \"orange\",\n \"yellow\",\n \"green\",\n \"blue\",\n \"purple\",\n \"brown\",\n \"pink\",\n \"cyan\",\n \"gray\",\n \"white\",\n \"black\"\n ];\n var FULL_TONES = [...TONES, ...ACCENT_VARIANTS, ...HUES];\n\n // packages/xtyle/dist/algorithms/factory.js\n var AA = 4.5;\n var AAA = 7;\n var ENFORCE = AA + 0.2;\n var SURFACE_SEPARATION = 1.5;\n var BORDER_SEPARATION = 1.5;\n var DIVIDER_SEPARATION = 1.8;\n var DEFAULT_SHIFT_STEP = 90;\n var DEFAULT_ACCENT_SPLIT = 45;\n var DERIVED_SURFACE_TINT_C = 0.02;\n var ACCENT_FAN = \"split-complement\";\n var ACHROMATIC_CHROMA = 0.02;\n var DERIVED_ACCENT_HUE_ROTATION = 150;\n var DERIVED_ACCENT_FALLBACK_HUE = 250;\n var DERIVED_ACCENT_L = 0.62;\n var DERIVED_ACCENT_C = 0.16;\n var ACCENT_RAMP_L_MIN = 0.1;\n var ACCENT_RAMP_L_MAX = 0.95;\n var HUE_STABLE_CHROMA = 0.1;\n var FAN_MIN_CHROMA = 0.045;\n var HUE_TOLERANCE = 8;\n var LIGHTNESS_TOLERANCE = 0.05;\n var DEFAULT_TYPE_SCALE = 1.2;\n var DEFAULT_RADIUS_SCALE = 1;\n var BASE_TEXT_REM = 1;\n var DEFAULT_FONTS = {\n sans: 'system-ui, -apple-system, \"Segoe UI\", Roboto, sans-serif',\n mono: 'ui-monospace, \"SF Mono\", \"Cascadia Code\", Consolas, monospace',\n display: '\"Avenir Next\", \"Futura\", \"Century Gothic\", \"Trebuchet MS\", system-ui, -apple-system, \"Segoe UI\", sans-serif'\n };\n var TEXT_LIGHT = { l: 0.98, c: 0, h: 0, alpha: 1 };\n var TEXT_DARK = { l: 0.15, c: 0, h: 0, alpha: 1 };\n var TRUE_WHITE = { l: 1, c: 0, h: 0, alpha: 1 };\n var TRUE_BLACK = { l: 0, c: 0, h: 0, alpha: 1 };\n var TEXT_POLES = [TRUE_WHITE, TRUE_BLACK];\n function bestTruePole(bg) {\n return contrast2(TRUE_BLACK, bg) >= contrast2(TRUE_WHITE, bg) ? TRUE_BLACK : TRUE_WHITE;\n }\n var STATUS_TO_HUE = {\n success: \"green\",\n warn: \"yellow\",\n danger: \"red\",\n info: \"blue\"\n };\n var NEUTRAL_ACCENT_CHROMA = 0.13;\n var PALETTE_HUES = {\n red: { h: 25, c: 0.2 },\n orange: { h: 55, c: 0.18 },\n yellow: { h: 95, c: 0.17 },\n green: { h: 145, c: 0.18 },\n blue: { h: 250, c: 0.18 },\n purple: { h: 300, c: 0.18 },\n brown: { h: 50, c: 0.08 },\n pink: { h: 350, c: 0.16 },\n cyan: { h: 200, c: 0.14 },\n gray: \"gray\",\n white: \"white\",\n black: \"black\"\n };\n var PALETTE_STOPS = [\"subtle\", \"muted\", \"base\", \"strong\", \"contrast\"];\n var CODE_VIVID_ROLES = [\n \"keyword\",\n \"number\",\n \"function\",\n \"type\",\n \"string\",\n \"tag\",\n \"attr\",\n \"regexp\"\n ];\n var CODE_HUE_RANK = [0, 4, 2, 6, 1, 5, 3, 7];\n var CODE_STRUCTURAL_ROLES = [\"comment\", \"operator\", \"punctuation\", \"variable\"];\n var CODE_SCOPES = [...CODE_VIVID_ROLES, ...CODE_STRUCTURAL_ROLES];\n var CODE_SURFACES = [\"--code-bg\", \"--code-fg\", \"--code-line-highlight\", \"--code-selection\"];\n var SURFACES = [\"--body-bg\", \"--bg-0\", \"--bg-1\", \"--bg-2\", \"--bg-3\"];\n var PANEL_REF_INDEX = SURFACES.indexOf(\"--bg-2\");\n var PANEL_SURFACES = [\"--bg-1\", \"--bg-2\"];\n var TEXT_STEPS = [\"xs\", \"sm\", \"body\", \"lg\", \"xl\", \"2xl\", \"3xl\", \"4xl\", \"5xl\"];\n var LEADING_STEPS = [\"tight\", \"normal\", \"loose\"];\n var WEIGHT_STEPS = [\"normal\", \"medium\", \"semibold\", \"bold\"];\n var RADIUS_STEPS = [\"none\", \"sm\", \"md\", \"lg\", \"full\"];\n var BORDER_STEPS = [\"thin\", \"normal\", \"thick\"];\n var DURATION_STEPS = [\"fast\", \"base\", \"slow\"];\n var EASE_STEPS = [\"standard\", \"emphasized\"];\n var SPACE_STEPS = [0, 1, 2, 3, 4, 5, 6, 7, 8];\n var ELEVATION_STEPS = [0, 1, 2, 3, 4, 5];\n var WEIGHT_VALUES = {\n normal: 400,\n medium: 500,\n semibold: 600,\n bold: 700\n };\n var LEADING_VALUES = {\n tight: 1.2,\n normal: 1.5,\n loose: 1.8\n };\n var DENSITY_MULTIPLIER = {\n compact: 0.8,\n normal: 1,\n comfortable: 1.25\n };\n var SPACE_BASE_REM = 0.25;\n function buildProduces() {\n const produces = [];\n const categories = {};\n const add = (name, category) => {\n produces.push(name);\n categories[name] = category;\n };\n add(\"--bg-sunken\", \"color\");\n for (const s of SURFACES)\n add(s, \"color\");\n add(\"--scrim\", \"color\");\n add(\"--surface-overlay\", \"color\");\n add(\"--surface-overlay-border\", \"color\");\n for (let i = 0; i <= 3; i++)\n add(`--fg-${i}`, \"color\");\n add(\"--fg-disabled\", \"color\");\n add(\"--placeholder\", \"color\");\n add(\"--line\", \"color\");\n add(\"--line-2\", \"color\");\n add(\"--ring\", \"color\");\n add(\"--ring-bg\", \"color\");\n add(\"--accent\", \"color\");\n add(\"--accent-hover\", \"color\");\n add(\"--accent-active\", \"color\");\n add(\"--accent-bg\", \"color\");\n add(\"--accent-fg\", \"color\");\n add(\"--accent-text\", \"color\");\n add(\"--accent-vivid\", \"color\");\n for (const n of [\"2\", \"3\", \"4\"]) {\n add(`--accent-${n}`, \"color\");\n add(`--accent-${n}-bg`, \"color\");\n add(`--accent-${n}-fg`, \"color\");\n add(`--accent-${n}-text`, \"color\");\n add(`--accent-${n}-vivid`, \"color\");\n }\n add(\"--accent-shift-step\", \"number\");\n add(\"--neutral\", \"color\");\n add(\"--neutral-bg\", \"color\");\n add(\"--neutral-fg\", \"color\");\n add(\"--neutral-text\", \"color\");\n add(\"--neutral-vivid\", \"color\");\n add(\"--field-bg\", \"color\");\n add(\"--field-border\", \"color\");\n for (const role of Object.keys(STATUS_TO_HUE)) {\n add(`--${role}`, \"color\");\n add(`--${role}-bg`, \"color\");\n add(`--${role}-fg`, \"color\");\n add(`--${role}-text`, \"color\");\n add(`--${role}-vivid`, \"color\");\n }\n for (const s of [\"hover\", \"press\", \"selected\", \"disabled\", \"drag\"]) {\n add(`--state-${s}`, \"color\");\n }\n add(\"--link\", \"color\");\n add(\"--link-hover\", \"color\");\n add(\"--selection\", \"color\");\n add(\"--highlight\", \"color\");\n add(\"--selection-cue\", \"keyword\");\n add(\"--shadow\", \"shadow\");\n for (const hue3 of Object.keys(PALETTE_HUES)) {\n add(`--color-${hue3}`, \"color\");\n for (const stop of PALETTE_STOPS)\n add(`--color-${hue3}-${stop}`, \"color\");\n add(`--${hue3}`, \"color\");\n add(`--${hue3}-bg`, \"color\");\n add(`--${hue3}-fg`, \"color\");\n add(`--${hue3}-text`, \"color\");\n add(`--${hue3}-vivid`, \"color\");\n }\n for (const t of CODE_SURFACES)\n add(t, \"color\");\n for (const role of CODE_SCOPES)\n add(`--code-${role}`, \"color\");\n add(\"--font-sans\", \"font\");\n add(\"--font-mono\", \"font\");\n add(\"--font-display\", \"font\");\n for (const step of TEXT_STEPS)\n add(`--text-${step}`, \"length\");\n for (const step of LEADING_STEPS)\n add(`--leading-${step}`, \"number\");\n for (const step of WEIGHT_STEPS)\n add(`--weight-${step}`, \"number\");\n for (const step of RADIUS_STEPS)\n add(`--radius-${step}`, \"length\");\n for (const step of BORDER_STEPS)\n add(`--border-${step}`, \"length\");\n for (const step of DURATION_STEPS)\n add(`--duration-${step}`, \"duration\");\n for (const step of EASE_STEPS)\n add(`--ease-${step}`, \"easing\");\n for (const step of ELEVATION_STEPS)\n add(`--elevation-${step}`, \"shadow\");\n for (const step of SPACE_STEPS)\n add(`--space-${step}`, \"length\");\n return { produces, categories };\n }\n var { produces: PRODUCES, categories: CATEGORIES } = buildProduces();\n var KEYWORD_DOMAINS = {\n \"--selection-cue\": [\"tint\", \"marker\"]\n };\n function stepLightness(base, scheme, step, index) {\n const direction = scheme === \"dark\" ? 1 : -1;\n return base + direction * step * index;\n }\n function contrastBandFloor(knobs) {\n const band = knobs.contrastBand;\n if (typeof band === \"number\")\n return band;\n if (band === \"aaa\")\n return AAA;\n if (band === \"aa\")\n return AA;\n return void 0;\n }\n function vibrancyOf(knobs, preset) {\n const v = typeof knobs.vibrancy === \"number\" ? knobs.vibrancy : preset.defaultVibrancy;\n return Math.min(1, Math.max(0, v));\n }\n function typeScaleOf(knobs) {\n const v = typeof knobs.typeScale === \"number\" ? knobs.typeScale : DEFAULT_TYPE_SCALE;\n return Math.min(2, Math.max(1.05, v));\n }\n function radiusScaleOf(knobs) {\n const v = typeof knobs.radiusScale === \"number\" ? knobs.radiusScale : DEFAULT_RADIUS_SCALE;\n return Math.max(0, v);\n }\n function densityOf(knobs) {\n const d = knobs.density;\n if (typeof d === \"number\")\n return Math.max(0.4, d);\n if (d === \"compact\" || d === \"comfortable\")\n return DENSITY_MULTIPLIER[d];\n return DENSITY_MULTIPLIER.normal;\n }\n function fontsOf(knobs) {\n return {\n sans: knobs.fonts?.sans ?? DEFAULT_FONTS.sans,\n mono: knobs.fonts?.mono ?? DEFAULT_FONTS.mono,\n display: knobs.fonts?.display ?? DEFAULT_FONTS.display\n };\n }\n function emittedContrast(fg, bgCss) {\n return contrast2(formatCss2(fg), bgCss);\n }\n function enforceContrastFloor(fg, bg, scheme, floor = ENFORCE) {\n const bgCss = formatCss2(bg);\n if (emittedContrast(fg, bgCss) >= floor)\n return fg;\n const preferred = scheme === \"dark\" ? TRUE_WHITE.l : TRUE_BLACK.l;\n const other = scheme === \"dark\" ? TRUE_BLACK.l : TRUE_WHITE.l;\n const swept = sweepToward(fg, bgCss, preferred, floor) ?? sweepToward(fg, bgCss, other, floor);\n const pole = bestTruePole(bgCss);\n if (!swept)\n return pole;\n return emittedContrast(pole, bgCss) > emittedContrast(swept, bgCss) ? pole : swept;\n }\n function sweepToward(fg, bgCss, targetL, floor) {\n for (let i = 0; i <= 100; i++) {\n const t = i / 100;\n const candidate = {\n l: fg.l + (targetL - fg.l) * t,\n c: fg.c * (1 - t),\n h: fg.h,\n alpha: fg.alpha\n };\n if (emittedContrast(candidate, bgCss) >= floor)\n return candidate;\n }\n return null;\n }\n function bestPoleContrast(bg) {\n return Math.max(contrast2(TEXT_LIGHT, bg), contrast2(TEXT_DARK, bg));\n }\n function ensureTextHeadroom(bg, scheme, floor = ENFORCE) {\n if (bestPoleContrast(bg) >= floor)\n return bg;\n const target = scheme === \"dark\" ? 0 : 1;\n let candidate = bg;\n for (let i = 1; i <= 100; i++) {\n const t = i / 100;\n candidate = withLightness(bg, bg.l + (target - bg.l) * t);\n if (bestPoleContrast(candidate) >= floor)\n return candidate;\n }\n return withLightness(bg, target);\n }\n function fillWithTextHeadroom(l, c2, h, floor = ENFORCE) {\n const seed = oklch2(l, c2, h);\n if (bestPoleContrast(seed) >= floor)\n return seed;\n let fallback = seed;\n for (let i = 1; i <= 100; i++) {\n const down = oklch2(l - l * i / 100, c2, h);\n if (bestPoleContrast(down) >= floor)\n return down;\n const up = oklch2(l + (1 - l) * i / 100, c2, h);\n if (bestPoleContrast(up) >= floor)\n return up;\n fallback = bestPoleContrast(down) >= bestPoleContrast(up) ? down : up;\n }\n return fallback;\n }\n function lightnessForContrast(pole, bg, bgCss, target) {\n let bestL = pole.l;\n for (let i = 0; i <= 200; i++) {\n const t = i / 200;\n const candidateL = pole.l + (bg.l - pole.l) * t;\n if (emittedContrast(withLightness(pole, candidateL), bgCss) >= target)\n bestL = candidateL;\n else\n break;\n }\n return bestL;\n }\n function liftStopForContrast(fg, bgCss, target, towardLight) {\n if (contrast2(formatCss2(fg), bgCss) >= target)\n return fg;\n const poleL = towardLight ? 1 : 0;\n let best = fg;\n for (let i = 1; i <= 100; i++) {\n const candidate = clampToGamut(oklch2(fg.l + (poleL - fg.l) * (i / 100), fg.c, fg.h));\n best = candidate;\n if (contrast2(formatCss2(candidate), bgCss) >= target)\n return candidate;\n }\n return best;\n }\n function separateFillFromSurface(fill, surface, separation, textFloor) {\n const surfaceCss = formatCss2(surface);\n if (contrast2(formatCss2(fill), surfaceCss) >= separation)\n return fill;\n const headroom = Math.min(textFloor, bestPoleContrast(fill));\n const poleL = surface.l < 0.5 ? 1 : 0;\n let best = fill;\n for (let i = 1; i <= 100; i++) {\n const candidate = clampToGamut(oklch2(fill.l + (poleL - fill.l) * (i / 100), fill.c, fill.h));\n best = candidate;\n if (contrast2(formatCss2(candidate), surfaceCss) >= separation && bestPoleContrast(candidate) >= headroom - 0.01) {\n return candidate;\n }\n }\n return best;\n }\n function borderForContrast(seed, surface, minContrast) {\n const surfaceCss = formatCss2(surface);\n if (emittedContrast(seed, surfaceCss) >= minContrast)\n return seed;\n const targetL = surface.l < 0.5 ? 1 : 0;\n let candidate = seed;\n for (let i = 1; i <= 100; i++) {\n candidate = withLightness(seed, seed.l + (targetL - seed.l) * (i / 100));\n if (emittedContrast(candidate, surfaceCss) >= minContrast)\n break;\n }\n return candidate;\n }\n function readableOnTint(tint, hue3, floor, inkChroma) {\n const tintCss = formatCss2(tint);\n const towardDark = contrast2(\"#000000\", tintCss) >= contrast2(\"#ffffff\", tintCss);\n const targetL = towardDark ? 0 : 1;\n const seedChroma = inkChroma ?? (towardDark ? 0.06 : 0.04);\n const seed = oklch2(tint.l + (towardDark ? -0.4 : 0.4), seedChroma, hue3);\n for (let i = 0; i <= 100; i++) {\n const t = i / 100;\n const css = formatCss2({\n l: seed.l + (targetL - seed.l) * t,\n c: seed.c * (1 - t),\n h: hue3,\n alpha: 1\n });\n if (contrast2(css, tintCss) >= floor)\n return css;\n }\n return towardDark ? \"#000000\" : \"#ffffff\";\n }\n function readableHuedOnTintAndPanel(tint, hue3, tintFloor, panels, panelFloor, seedChroma) {\n const tintCss = formatCss2(tint);\n const panelCss = panels.map((p4) => formatCss2(p4));\n const sweep = (towardDark) => {\n const targetL = towardDark ? 0 : 1;\n const seed = towardDark ? oklch2(tint.l - 0.4, seedChroma, hue3) : oklch2(tint.l + 0.4, seedChroma * 0.667, hue3);\n const out = [];\n for (let i = 0; i <= 100; i++) {\n const t = i / 100;\n out.push(formatCss2({\n l: seed.l + (targetL - seed.l) * t,\n c: seed.c * (1 - t),\n h: hue3,\n alpha: 1\n }));\n }\n return out;\n };\n const minPanel = (css) => panelCss.length === 0 ? Infinity : Math.min(...panelCss.map((p4) => contrast2(css, p4)));\n let best = null;\n let bestMin = -1;\n for (const towardDark of [true, false]) {\n for (const css of sweep(towardDark)) {\n if (contrast2(css, tintCss) < tintFloor)\n continue;\n const m = minPanel(css);\n if (m >= panelFloor)\n return css;\n if (m > bestMin) {\n bestMin = m;\n best = css;\n }\n }\n }\n return best ?? readableOnTint(tint, hue3, tintFloor);\n }\n function vividOnPanel(hue3, panels, floor, targetChroma) {\n const panelCss = panels.map((p4) => formatCss2(p4));\n const minPanel = (css) => panelCss.length === 0 ? Infinity : Math.min(...panelCss.map((p4) => contrast2(css, p4)));\n const avgL = panels.reduce((sum, p4) => sum + p4.l, 0) / Math.max(1, panels.length);\n const towardLight = avgL < 0.5;\n let best = null;\n let bestChroma = -1;\n for (let i = 0; i <= 80; i++) {\n const t = i / 80;\n const l = towardLight ? 0.5 + t * 0.45 : 0.5 - t * 0.42;\n const chroma = clampToGamut(oklch2(l, targetChroma, hue3)).c;\n const css = formatCss2(oklch2(l, chroma, hue3));\n if (minPanel(css) >= floor && chroma > bestChroma) {\n bestChroma = chroma;\n best = css;\n }\n }\n return best ?? (towardLight ? \"#ffffff\" : \"#000000\");\n }\n function deriveAccentAnchor(bg, fg) {\n const sourceHue = bg.c >= ACHROMATIC_CHROMA ? bg.h : fg.c >= ACHROMATIC_CHROMA ? fg.h : void 0;\n const hue3 = sourceHue === void 0 ? DERIVED_ACCENT_FALLBACK_HUE : ((sourceHue + DERIVED_ACCENT_HUE_ROTATION) % 360 + 360) % 360;\n return clampToGamut(oklch2(DERIVED_ACCENT_L, DERIVED_ACCENT_C, hue3));\n }\n function shadowString(scheme, level, vibrancy, preset) {\n if (level <= 0)\n return \"none\";\n const baseAlpha = (scheme === \"dark\" ? 0.5 : 0.16) + vibrancy * 0.1 + preset.elevationAlphaBoost;\n const y = Math.max(1, Math.round(level * 2 * preset.elevationStrengthMul));\n const blur = Math.max(1, Math.round(level * 4 * preset.elevationStrengthMul));\n const spread = Math.max(0, level - 3);\n const alpha2 = Math.min(0.92, baseAlpha + level * 0.04);\n const ambientY = Math.max(1, Math.round(level / 2));\n const ambientBlur = Math.max(1, Math.round(level * 2 * preset.elevationStrengthMul));\n const ambientAlpha = Math.min(0.7, alpha2 * 0.6);\n return [\n `0 ${y}px ${blur}px ${spread}px rgba(0, 0, 0, ${alpha2.toFixed(2)})`,\n `0 ${ambientY}px ${ambientBlur}px 0 rgba(0, 0, 0, ${ambientAlpha.toFixed(2)})`\n ].join(\", \");\n }\n function paletteRamp(register, hue3, spec2, scheme, vibrancy, floor, preset, accent, panels, pinnedBase) {\n const set = (suffix, color) => {\n register[suffix ? `--color-${hue3}-${suffix}` : `--color-${hue3}`] = formatCss2(color);\n };\n const family = (solid, bg, fg, text, vivid) => {\n register[`--${hue3}`] = solid;\n register[`--${hue3}-bg`] = bg;\n register[`--${hue3}-fg`] = fg;\n register[`--${hue3}-text`] = text;\n register[`--${hue3}-vivid`] = vivid;\n };\n const grayscale = (lights, chroma2) => {\n const stops2 = lights.map((l) => oklch2(l, chroma2, 0));\n const baseStop = stops2[2];\n const subtleStop2 = stops2[0];\n const strongStop2 = liftStopForContrast(stops2[3], formatCss2(subtleStop2), AA + 0.2, stops2[3].l >= subtleStop2.l);\n const contrast4 = readableOnTint(baseStop, 0, AA + 0.3, 0);\n set(\"\", baseStop);\n set(\"subtle\", subtleStop2);\n set(\"muted\", stops2[1]);\n set(\"base\", baseStop);\n set(\"strong\", strongStop2);\n register[`--color-${hue3}-contrast`] = contrast4;\n family(formatCss2(baseStop), formatCss2(subtleStop2), contrast4, readableOnTint(subtleStop2, 0, AA + 0.2, 0), vividOnPanel(0, panels, floor, 0));\n };\n if (spec2 === \"white\") {\n grayscale([0.82, 0.9, 0.97, 1], 0);\n return;\n }\n if (spec2 === \"black\") {\n grayscale([0.05, 0.12, 0.2, 0.32], 0);\n return;\n }\n if (spec2 === \"gray\") {\n grayscale([0.4, 0.55, 0.68, 0.82], 5e-3);\n return;\n }\n const accentChromaFactor = Math.max(0.5, Math.min(1.6, accent.c / NEUTRAL_ACCENT_CHROMA));\n const chroma = spec2.c * accentChromaFactor * (0.6 + vibrancy * 0.7) * preset.paletteChromaMul;\n const baseL = scheme === \"dark\" ? 0.7 : 0.55;\n const lBias = Math.max(-0.06, Math.min(0.06, (accent.l - baseL) * 0.25));\n const ladderL = (scheme === \"dark\" ? [0.45, 0.58, baseL, 0.82] : [0.78, 0.66, baseL, 0.42]).map((l) => Math.max(0.05, Math.min(0.97, l + lBias)));\n const ladderC = [chroma * 0.7, chroma * 0.9, chroma, chroma * 0.85];\n const stops = ladderL.map((l, i) => clampToGamut(oklch2(l, ladderC[i], spec2.h)));\n const base = stops[2];\n const solidBase = pinnedBase ?? base;\n const subtleStop = stops[0];\n const strongStop = liftStopForContrast(stops[3], formatCss2(subtleStop), AA + 0.2, stops[3].l >= subtleStop.l);\n const contrast3 = readableOnTint(solidBase, spec2.h, Math.max(floor, AA + 0.3));\n set(\"\", base);\n set(\"subtle\", subtleStop);\n set(\"muted\", stops[1]);\n set(\"base\", base);\n set(\"strong\", strongStop);\n register[`--color-${hue3}-contrast`] = contrast3;\n const bg0p = panels[0];\n const washL = scheme === \"dark\" ? Math.max(0.2, bg0p.l + 0.08) : Math.min(0.92, bg0p.l - 0.04);\n const bgTint = ensureTextHeadroom(oklch2(washL, chroma * 0.35, spec2.h), scheme, AA + 0.3);\n const bgText = readableHuedOnTintAndPanel(bgTint, spec2.h, AA + 0.3, panels.slice(1), AA + 0.05, chroma);\n family(formatCss2(solidBase), formatCss2(bgTint), contrast3, bgText, vividOnPanel(spec2.h, panels, floor, chroma));\n }\n function schemeFromFg(fg) {\n return fg.l >= 0.5 ? \"dark\" : \"light\";\n }\n function deriveSurface(scheme, hue3, chroma, depth, floor) {\n const l = scheme === \"dark\" ? depth : 1 - depth;\n return ensureTextHeadroom(oklch2(l, chroma, hue3), scheme, floor);\n }\n function completeAnchors(preset, opts) {\n const pin = opts.constraints ?? {};\n const givenBg = parsePin(pin[\"--bg-0\"]);\n const givenFg = parsePin(pin[\"--fg-0\"]);\n const givenAccent = parsePin(pin[\"--accent\"]);\n const defBg = toOklchColor(preset.defaultAnchors.bg);\n const defFg = toOklchColor(preset.defaultAnchors.fg);\n const defScheme = schemeOf(defBg);\n const surfaceDepth = defScheme === \"dark\" ? defBg.l : 1 - defBg.l;\n const floor = Math.max(ENFORCE, preset.contrastFloor);\n const inferredScheme = givenBg ? schemeOf(givenBg) : givenFg ? schemeFromFg(givenFg) : defScheme;\n const scheme = opts.knobs?.scheme ?? inferredScheme;\n let bg;\n if (givenBg) {\n bg = scheme === schemeOf(givenBg) ? givenBg : withLightness(givenBg, 1 - givenBg.l);\n } else if (givenAccent || givenFg) {\n const hue3 = givenAccent?.h ?? givenFg.h;\n const tint = givenAccent ? DERIVED_SURFACE_TINT_C : 5e-3;\n bg = deriveSurface(scheme, hue3, tint, surfaceDepth, floor);\n } else {\n bg = scheme === defScheme ? defBg : withLightness(defBg, 1 - defBg.l);\n }\n const fg = givenFg ?? defFg;\n const accentExplicit = givenAccent !== null || preset.defaultAnchors.accent !== void 0;\n const accent = givenAccent ?? (preset.defaultAnchors.accent ? toOklchColor(preset.defaultAnchors.accent) : deriveAccentAnchor(bg, fg));\n return { bg, fg, accent, scheme, accentExplicit };\n }\n function parsePin(value) {\n if (!value)\n return null;\n try {\n const o = toOklchColor(value);\n if (Number.isNaN(o.l) || Number.isNaN(o.c))\n return null;\n return o;\n } catch {\n return null;\n }\n }\n function parseChromaticPin(value) {\n const o = parsePin(value);\n if (!o || Number.isNaN(o.h) || o.c < ACHROMATIC_CHROMA)\n return null;\n return o;\n }\n function paletteHueAngle(name) {\n const spec2 = PALETTE_HUES[name];\n return typeof spec2 === \"object\" ? spec2.h : 0;\n }\n function resolveStatusHue(role, pinned) {\n const name = STATUS_TO_HUE[role] ?? \"red\";\n const pin = parseChromaticPin(pinned[`--${name}`] ?? pinned[`--color-${name}-base`] ?? pinned[`--color-${name}`]);\n return pin ? pin.h : paletteHueAngle(name);\n }\n function buildGraph(preset, opts) {\n const completed = completeAnchors(preset, opts);\n const bg = completed.bg;\n const fgAnchor = completed.fg;\n const pinned = opts.constraints ?? {};\n const accent = pinned[\"--accent\"] ? toOklchColor(pinned[\"--accent\"]) : completed.accent;\n const scheme = completed.scheme;\n const knobs = opts.knobs ?? {};\n const shiftStep = typeof knobs.accentShiftStep === \"number\" ? knobs.accentShiftStep : DEFAULT_SHIFT_STEP;\n const accentSplit = typeof knobs.accentSplit === \"number\" ? knobs.accentSplit : DEFAULT_ACCENT_SPLIT;\n const band = contrastBandFloor(knobs);\n const floor = Math.max(ENFORCE, preset.contrastFloor, (band ?? 0) + 0.2);\n const extreme = preset.extreme === true;\n let vibrancy = vibrancyOf(knobs, preset);\n if (extreme)\n vibrancy = 1;\n const typeScale = typeScaleOf(knobs);\n const radiusScale = radiusScaleOf(knobs);\n const density = densityOf(knobs);\n const fonts = fontsOf(knobs);\n const surfaceStep = 0.045;\n const nodes = [];\n const lit = (name, value, refs) => {\n nodes.push(refs && refs.length ? { name, value, refs } : { name, value });\n };\n const pinKeys = new Set(Object.keys(pinned));\n const refIfPinned = (...names) => names.filter((n) => pinKeys.has(n));\n lit(\"--scheme\", scheme);\n const bg0 = pinned[\"--bg-0\"] ? toOklchColor(pinned[\"--bg-0\"]) : extreme ? oklch2(scheme === \"dark\" ? 0 : 1, 0, 0) : ensureTextHeadroom(withLightness(bg, stepLightness(bg.l, scheme, surfaceStep, 1)), scheme, floor);\n const pageFloor = (fill) => separateFillFromSurface(fill, bg0, SURFACE_SEPARATION, floor);\n const direction = scheme === \"dark\" ? 1 : -1;\n const surfaceColors = SURFACES.map((_, index) => withLightness(bg0, bg0.l + direction * surfaceStep * (index - 1)));\n SURFACES.forEach((name, index) => {\n lit(name, formatCss2(surfaceColors[index]), refIfPinned(\"--bg-0\"));\n });\n lit(\"--bg-sunken\", formatCss2(withLightness(bg0, bg0.l - direction * surfaceStep * 2)), refIfPinned(\"--bg-0\"));\n lit(\"--scrim\", formatCss2(oklch2(scheme === \"dark\" ? 0 : 0.1, 0, 0, 0.6)));\n const overlayBase = withLightness(bg0, scheme === \"dark\" ? bg0.l + 0.07 : bg0.l + 0.03);\n lit(\"--surface-overlay\", formatCss2(overlayBase), refIfPinned(\"--bg-0\"));\n lit(\"--surface-overlay-border\", formatCss2(withAlpha(withLightness(bg0, scheme === \"dark\" ? bg0.l + 0.25 : bg0.l - 0.2), 0.6)), refIfPinned(\"--bg-0\"));\n const fg0 = pinned[\"--fg-0\"] ? toOklchColor(pinned[\"--fg-0\"]) : extreme ? bestTruePole(formatCss2(bg0)) : enforceContrastFloor(withLightness(fgAnchor, scheme === \"dark\" ? Math.max(fgAnchor.l, 0.9) : Math.min(fgAnchor.l, 0.2)), bg0, scheme, floor);\n lit(\"--fg-0\", formatCss2(fg0), refIfPinned(\"--bg-0\", \"--fg-0\"));\n const fgBg0Css = formatCss2(bg0);\n const fg0Contrast = emittedContrast(fg0, fgBg0Css);\n const panelRef = surfaceColors[PANEL_REF_INDEX];\n const panelRefCss = formatCss2(panelRef);\n const panelSurfaces = PANEL_SURFACES.map((s) => surfaceColors[SURFACES.indexOf(s)]);\n const rampFloor = extreme ? Math.min(fg0Contrast, Math.max(floor, fg0Contrast * 0.66)) : Math.min(floor, fg0Contrast);\n const conservativeFloorL = (target) => {\n const againstBg0 = lightnessForContrast(fg0, bg0, fgBg0Css, target);\n const againstPanel = lightnessForContrast(fg0, panelRef, panelRefCss, target);\n return Math.abs(againstBg0 - fg0.l) <= Math.abs(againstPanel - fg0.l) ? againstBg0 : againstPanel;\n };\n const textLight = scheme === \"dark\";\n const enforceOnPanels = (color) => {\n const onBg0 = enforceContrastFloor(color, bg0, scheme, floor);\n const sameSidePanels = panelSurfaces.filter((p4) => p4.l < 0.5 === textLight);\n if (sameSidePanels.length === 0)\n return onBg0;\n const panelCss = sameSidePanels.map((p4) => formatCss2(p4));\n const minPanel = (c2) => Math.min(...panelCss.map((p4) => emittedContrast(c2, p4)));\n if (minPanel(onBg0) >= floor - 0.01)\n return onBg0;\n const targetL = textLight ? 1 : 0;\n let best = onBg0;\n let bestMin = minPanel(onBg0);\n for (let i = 1; i <= 100; i++) {\n const t = i / 100;\n const candidate = withLightness(onBg0, onBg0.l + (targetL - onBg0.l) * t);\n if (emittedContrast(candidate, fgBg0Css) < floor - 0.01)\n break;\n const m = minPanel(candidate);\n if (m > bestMin) {\n bestMin = m;\n best = candidate;\n }\n if (m >= floor)\n break;\n }\n return best;\n };\n const enforceChromaticOnPanels = (color) => {\n const bg0Css = formatCss2(bg0);\n const sameSidePanels = panelSurfaces.filter((p4) => p4.l < 0.5 === textLight);\n const refsCss = [bg0Css, ...sameSidePanels.map((p4) => formatCss2(p4))];\n const minRef = (c2) => Math.min(...refsCss.map((r2) => emittedContrast(c2, r2)));\n if (minRef(color) >= floor - 0.01)\n return color;\n const targetL = textLight ? 1 : 0;\n for (let i = 1; i <= 100; i++) {\n const candidate = withLightness(color, color.l + (targetL - color.l) * (i / 100));\n if (minRef(candidate) >= floor)\n return candidate;\n }\n return enforceOnPanels(color);\n };\n const floorL = conservativeFloorL(rampFloor);\n for (let i = 1; i <= 3; i++) {\n const reduced = withLightness(fg0, fg0.l + (floorL - fg0.l) * (i / 3));\n lit(`--fg-${i}`, formatCss2(reduced), [\"--fg-0\", ...refIfPinned(\"--bg-0\")]);\n }\n lit(\"--fg-disabled\", formatCss2(withLightness(fg0, conservativeFloorL(3))), [\"--fg-0\", ...refIfPinned(\"--bg-0\")]);\n const placeholderFloor = extreme ? rampFloor : Math.min(floor, fg0Contrast);\n const placeholderL = conservativeFloorL(placeholderFloor);\n lit(\"--placeholder\", formatCss2(withLightness(fg0, placeholderL)), [\"--fg-0\", ...refIfPinned(\"--bg-0\")]);\n const accentFill = pinned[\"--accent\"] || completed.accentExplicit ? accent : pageFloor(fillWithTextHeadroom(accent.l, accent.c * (0.6 + vibrancy * 0.8) * preset.accentChromaMul, accent.h, floor));\n const accentValue = pinned[\"--accent\"] ?? formatCss2(accentFill);\n lit(\"--accent\", accentValue, refIfPinned(\"--accent\"));\n lit(\"--accent-fg\", pickReadable(accentFill, TEXT_POLES, floor), [\"--accent\"]);\n const accentTextColor = enforceChromaticOnPanels(accentFill);\n const accentTextCss = formatCss2(accentTextColor);\n const accentTint = liftStopForContrast(oklch2(scheme === \"dark\" ? Math.max(0.2, bg0.l + 0.08) : Math.min(0.92, bg0.l - 0.04), accentFill.c * preset.accentTintChromaMul, accentFill.h), accentTextCss, AA + 0.2, accentTextColor.l < 0.5);\n lit(\"--accent-bg\", formatCss2(accentTint), [\"--accent\", ...refIfPinned(\"--bg-0\")]);\n lit(\"--accent-text\", accentTextCss, [\"--accent\", ...refIfPinned(\"--bg-0\")]);\n lit(\"--accent-vivid\", vividOnPanel(accentFill.h, [bg0, ...panelSurfaces], floor, accentFill.c), [\"--accent\", ...refIfPinned(\"--bg-0\")]);\n const pinnedNeutral = parsePin(pinned[\"--neutral\"]);\n const neutralFill = pinnedNeutral ?? pageFloor(fillWithTextHeadroom(scheme === \"dark\" ? 0.6 : 0.5, preset.neutralChroma, accentFill.h, floor));\n const neutralTintHue = Number.isFinite(neutralFill.h) ? neutralFill.h : accentFill.h;\n lit(\"--neutral\", formatCss2(neutralFill), [\"--accent\", ...refIfPinned(\"--neutral\")]);\n const neutralTextColor = enforceOnPanels(neutralFill);\n const neutralTextCss = formatCss2(neutralTextColor);\n const neutralTint = liftStopForContrast(oklch2(scheme === \"dark\" ? Math.max(0.2, bg0.l + 0.06) : Math.min(0.92, bg0.l - 0.04), 5e-3, neutralTintHue), neutralTextCss, AA + 0.2, neutralTextColor.l < 0.5);\n lit(\"--neutral-bg\", formatCss2(neutralTint), [\"--accent\", ...refIfPinned(\"--bg-0\")]);\n lit(\"--neutral-fg\", pickReadable(neutralFill, TEXT_POLES, floor), [\"--neutral\"]);\n lit(\"--neutral-text\", neutralTextCss, [\"--neutral\", ...refIfPinned(\"--bg-0\")]);\n lit(\"--neutral-vivid\", neutralTextCss, [\"--neutral-text\", ...refIfPinned(\"--bg-0\")]);\n const lineSeed = extreme ? oklch2(scheme === \"dark\" ? 0.7 : 0.3, 0, 0) : withLightness(bg0, scheme === \"dark\" ? bg0.l + 0.12 : bg0.l - 0.12);\n lit(\"--line\", formatCss2(borderForContrast(lineSeed, bg0, BORDER_SEPARATION)), refIfPinned(\"--bg-0\"));\n const line2Seed = extreme ? oklch2(scheme === \"dark\" ? 0.85 : 0.15, 0, 0) : withLightness(bg0, scheme === \"dark\" ? bg0.l + 0.2 : bg0.l - 0.2);\n lit(\"--line-2\", formatCss2(borderForContrast(line2Seed, bg0, DIVIDER_SEPARATION)), refIfPinned(\"--bg-0\"));\n lit(\"--ring\", formatCss2(withAlpha(accentFill, 0.7)), [\"--accent\"]);\n lit(\"--ring-bg\", formatCss2(withAlpha(accentFill, 0.18)), [\"--accent\"]);\n const fieldBg = withLightness(bg0, scheme === \"dark\" ? bg0.l - 0.03 : bg0.l + 0.02);\n lit(\"--field-bg\", formatCss2(fieldBg), refIfPinned(\"--bg-0\"));\n const fieldBorderSeed = extreme ? oklch2(scheme === \"dark\" ? 0.8 : 0.2, 0, 0) : withLightness(bg0, scheme === \"dark\" ? bg0.l + 0.16 : bg0.l - 0.16);\n lit(\"--field-border\", formatCss2(borderForContrast(fieldBorderSeed, fieldBg, BORDER_SEPARATION)), refIfPinned(\"--bg-0\"));\n lit(\"--accent-hover\", formatCss2(withLightness(accentFill, accentFill.l + (scheme === \"dark\" ? 0.06 : -0.06))), [\"--accent\"]);\n lit(\"--accent-active\", formatCss2(withLightness(accentFill, accentFill.l + (scheme === \"dark\" ? -0.06 : 0.06))), [\"--accent\"]);\n const accentDisplay = toOklchColor(accentValue);\n const accentDelta = (from, to) => ({\n dL: to.l - from.l,\n dC: to.c - from.c,\n dH: hueDelta(from.h, to.h)\n });\n const applyAccentDelta = (from, delta) => {\n const rawL = from.l + delta.dL;\n const l = delta.dL === 0 ? Math.min(1, Math.max(0, rawL)) : Math.min(ACCENT_RAMP_L_MAX, Math.max(ACCENT_RAMP_L_MIN, rawL));\n return {\n l,\n c: Math.max(0, from.c + delta.dC),\n h: ((from.h + delta.dH) % 360 + 360) % 360,\n alpha: 1\n };\n };\n const emitAccent = (color) => {\n const maxC = clampToGamut({ l: color.l, c: color.c, h: color.h, alpha: 1 }).c;\n return formatCss2({ ...color, c: Math.min(color.c, maxC) });\n };\n const a1 = accentDisplay;\n const fanBase = { ...a1, c: Math.max(a1.c, FAN_MIN_CHROMA) };\n const rotate = (deg) => ({ dL: 0, dC: 0, dH: deg });\n const fanned = (n, derived) => pinned[`--accent-${n}`] ? toOklchColor(pinned[`--accent-${n}`]) : derived;\n let a2;\n let a3;\n let a4;\n let a2Refs;\n let a3Refs;\n let a4Refs;\n if (ACCENT_FAN === \"split-complement\") {\n const mirrorOf = (c2) => applyAccentDelta(fanBase, rotate(-hueDelta(a1.h, c2.h)));\n const a2Pin = pinned[\"--accent-2\"];\n const a3Pin = pinned[\"--accent-3\"];\n let a2Derived = applyAccentDelta(fanBase, rotate(-accentSplit));\n let a3Derived = applyAccentDelta(fanBase, rotate(accentSplit));\n if (a2Pin && !a3Pin)\n a3Derived = mirrorOf(toOklchColor(a2Pin));\n else if (a3Pin && !a2Pin)\n a2Derived = mirrorOf(toOklchColor(a3Pin));\n a2 = fanned(\"2\", a2Derived);\n a3 = fanned(\"3\", a3Derived);\n a4 = fanned(\"4\", applyAccentDelta(fanBase, rotate(180)));\n a2Refs = a3Pin && !a2Pin ? [\"--accent\", \"--accent-3\"] : [\"--accent\"];\n a3Refs = a2Pin && !a3Pin ? [\"--accent\", \"--accent-2\"] : [\"--accent\"];\n a4Refs = [\"--accent\"];\n } else {\n a2 = fanned(\"2\", applyAccentDelta(fanBase, rotate(shiftStep)));\n a3 = fanned(\"3\", applyAccentDelta(a2, accentDelta(fanBase, a2)));\n a4 = fanned(\"4\", applyAccentDelta(a3, accentDelta(a2, a3)));\n a2Refs = [\"--accent\", \"--accent-shift-step\"];\n a3Refs = [\"--accent-2\", \"--accent\"];\n a4Refs = [\"--accent-3\", \"--accent-2\"];\n }\n lit(\"--accent-2\", emitAccent(a2), a2Refs);\n lit(\"--accent-3\", emitAccent(a3), a3Refs);\n lit(\"--accent-4\", emitAccent(a4), a4Refs);\n lit(\"--accent-shift-step\", String(shiftStep));\n const emitAccentFamily = (n, raw) => {\n const color = toOklchColor(emitAccent(raw));\n lit(`--accent-${n}-fg`, pickReadable(color, TEXT_POLES, floor), [`--accent-${n}`]);\n const tint = oklch2(scheme === \"dark\" ? Math.max(0.2, bg0.l + 0.08) : Math.min(0.92, bg0.l - 0.04), color.c * preset.accentTintChromaMul, color.h);\n lit(`--accent-${n}-bg`, formatCss2(tint), [`--accent-${n}`, ...refIfPinned(\"--bg-0\")]);\n lit(`--accent-${n}-text`, readableHuedOnTintAndPanel(tint, color.h, AA + 0.3, panelSurfaces, AA + 0.05, color.c), [`--accent-${n}-bg`, ...refIfPinned(\"--bg-0\")]);\n lit(`--accent-${n}-vivid`, vividOnPanel(color.h, [bg0, ...panelSurfaces], floor, color.c), [`--accent-${n}`, ...refIfPinned(\"--bg-0\")]);\n };\n emitAccentFamily(\"2\", a2);\n emitAccentFamily(\"3\", a3);\n emitAccentFamily(\"4\", a4);\n lit(\"--selection-cue\", extreme || knobs.cues === \"redundant\" ? \"marker\" : \"tint\");\n const statusChroma = Math.max(0.12, accent.c) * (0.6 + vibrancy * 0.7) * preset.statusChromaMul;\n for (const role of Object.keys(STATUS_TO_HUE)) {\n const namedHue = resolveStatusHue(role, pinned);\n const pinnedFill = parseChromaticPin(pinned[`--${role}`]);\n const roleHue = pinnedFill ? pinnedFill.h : namedHue;\n const fillL = scheme === \"dark\" ? 0.62 : 0.52;\n const fill = pinnedFill ?? pageFloor(fillWithTextHeadroom(fillL, statusChroma, roleHue, floor));\n const tintL = scheme === \"dark\" ? Math.min(0.3, bg0.l + 0.08) : Math.min(0.92, bg0.l - 0.04);\n const tint = ensureTextHeadroom(oklch2(tintL, statusChroma * 0.35, roleHue), scheme, AA + 0.3);\n const fillRefs = refIfPinned(\"--accent\", `--${role}`);\n lit(`--${role}`, formatCss2(fill), fillRefs);\n lit(`--${role}-bg`, formatCss2(tint), [`--${role}`, ...refIfPinned(\"--bg-0\")]);\n lit(`--${role}-fg`, pickReadable(fill, TEXT_POLES, floor), [`--${role}`]);\n lit(`--${role}-text`, readableHuedOnTintAndPanel(tint, roleHue, AA + 0.3, panelSurfaces, AA + 0.05, statusChroma), [`--${role}-bg`, ...refIfPinned(\"--bg-0\")]);\n lit(`--${role}-vivid`, vividOnPanel(roleHue, [bg0, ...panelSurfaces], floor, statusChroma), [`--${role}`, ...refIfPinned(\"--bg-0\")]);\n }\n const overlayL = scheme === \"dark\" ? 1 : 0;\n const extremeDist = scheme === \"dark\" ? bg0.l : 1 - bg0.l;\n const overlayBoost = 1 + Math.max(0, (0.15 - extremeDist) / 0.15) * 0.8;\n const overlay = (a) => formatCss2(oklch2(overlayL, 0, 0, Math.min(0.4, a * overlayBoost)));\n lit(\"--state-hover\", overlay(0.06));\n lit(\"--state-press\", overlay(0.12));\n lit(\"--state-selected\", overlay(0.16));\n lit(\"--state-disabled\", overlay(0.08));\n lit(\"--state-drag\", overlay(0.1));\n lit(\"--selection\", formatCss2(withAlpha(accentFill, 0.3)), [\"--accent\"]);\n lit(\"--highlight\", formatCss2(withAlpha(oklch2(scheme === \"dark\" ? 0.85 : 0.9, 0.16, paletteHueAngle(\"yellow\")), 0.35)));\n const linkColor = enforceChromaticOnPanels(accent);\n const linkCss = formatCss2(linkColor);\n let linkHoverColor = enforceChromaticOnPanels(withLightness(accent, accent.l + (scheme === \"dark\" ? 0.08 : -0.08)));\n if (formatCss2(linkHoverColor) === linkCss) {\n const pole = textLight ? 1 : 0;\n const toward = linkColor.l < pole ? 1 : -1;\n const distinctHover = (candidate) => {\n const enforced = enforceChromaticOnPanels(candidate);\n return formatCss2(enforced) === linkCss ? void 0 : enforced;\n };\n let hover;\n for (let step = 0.1; step <= 0.6 && !hover; step += 0.05) {\n hover = distinctHover(withLightness(linkColor, linkColor.l + toward * step));\n }\n for (let step = 0.1; step <= 0.6 && !hover; step += 0.05) {\n hover = distinctHover(withLightness(linkColor, linkColor.l - toward * step));\n }\n for (let cut = 0.7; cut >= 0.05 && !hover; cut -= 0.15) {\n hover = distinctHover(oklch2(linkColor.l, linkColor.c * cut, linkColor.h));\n }\n linkHoverColor = hover ?? linkHoverColor;\n }\n lit(\"--link\", formatCss2(linkColor), [\"--accent\", ...refIfPinned(\"--bg-0\")]);\n lit(\"--link-hover\", formatCss2(linkHoverColor), [\"--link\", ...refIfPinned(\"--bg-0\")]);\n for (const [hue3, spec2] of Object.entries(PALETTE_HUES)) {\n const pinnedBase = typeof spec2 === \"object\" ? parseChromaticPin(pinned[`--${hue3}`] ?? pinned[`--color-${hue3}-base`] ?? pinned[`--color-${hue3}`]) : null;\n const effectiveSpec = pinnedBase && typeof spec2 === \"object\" ? { h: pinnedBase.h, c: pinnedBase.c } : spec2;\n const ramp = {};\n paletteRamp(ramp, hue3, effectiveSpec, scheme, vibrancy, floor, preset, accent, [bg0, ...panelSurfaces], pinnedBase ?? void 0);\n lit(`--color-${hue3}`, ramp[`--color-${hue3}`]);\n for (const stop of PALETTE_STOPS) {\n lit(`--color-${hue3}-${stop}`, ramp[`--color-${hue3}-${stop}`], [\n `--color-${hue3}`\n ]);\n }\n lit(`--${hue3}`, ramp[`--${hue3}`], [`--color-${hue3}-base`]);\n lit(`--${hue3}-bg`, ramp[`--${hue3}-bg`], [`--color-${hue3}-subtle`]);\n lit(`--${hue3}-fg`, ramp[`--${hue3}-fg`], [`--color-${hue3}-base`]);\n lit(`--${hue3}-text`, ramp[`--${hue3}-text`], [`--color-${hue3}-subtle`]);\n lit(`--${hue3}-vivid`, ramp[`--${hue3}-vivid`], [\n `--color-${hue3}-base`,\n ...refIfPinned(\"--bg-0\")\n ]);\n }\n const codeBg = ensureTextHeadroom(withLightness(bg0, scheme === \"dark\" ? bg0.l - 0.02 : bg0.l + 0.012), scheme, floor);\n const codeBgCss = formatCss2(codeBg);\n lit(\"--code-bg\", codeBgCss, refIfPinned(\"--bg-0\"));\n const codeFg = enforceContrastFloor(fg0, codeBg, scheme, floor);\n const codeFgCss = formatCss2(codeFg);\n lit(\"--code-fg\", codeFgCss, [\"--fg-0\", ...refIfPinned(\"--bg-0\")]);\n lit(\"--code-line-highlight\", formatCss2(withAlpha(accentFill, 0.1)), [\"--accent\"]);\n lit(\"--code-selection\", formatCss2(withAlpha(accentFill, 0.3)), [\"--accent\"]);\n const codeTowardLight = contrast2(\"#ffffff\", codeBgCss) >= contrast2(\"#000000\", codeBgCss);\n const codePole = codeTowardLight ? 1 : 0;\n const codeFloor = AA;\n const readableHuedOnCode = (l, c2, h, fl) => {\n const seed = oklch2(l, c2, h);\n let best = seed;\n let bestContrast = emittedContrast(seed, codeBgCss);\n if (bestContrast >= fl)\n return seed;\n for (let i = 1; i <= 100; i++) {\n const cand = withLightness(seed, seed.l + (codePole - seed.l) * (i / 100));\n const ct = emittedContrast(cand, codeBgCss);\n if (ct >= fl)\n return cand;\n if (ct > bestContrast) {\n bestContrast = ct;\n best = cand;\n }\n }\n return best;\n };\n const codeChroma = Math.max(0.08, Math.max(0.1, accent.c) * (0.7 + vibrancy * 0.7) * preset.paletteChromaMul);\n const codeBaseHue = Number.isFinite(accent.h) ? accent.h : DERIVED_ACCENT_FALLBACK_HUE;\n const codeBaseL = codeTowardLight ? 0.76 : 0.46;\n const codePoleL = codeTowardLight ? 1 : 0;\n const aaEdgeL = lightnessForContrast(oklch2(codePoleL, 0, 0), codeBg, codeBgCss, codeFloor);\n const bandLo = aaEdgeL + (codePoleL - aaEdgeL) * 0.06;\n const bandHi = codePoleL - (codePoleL - aaEdgeL) * 0.32;\n CODE_VIVID_ROLES.forEach((role, rank) => {\n const hue3 = ((codeBaseHue + CODE_HUE_RANK[rank] * 45) % 360 + 360) % 360;\n const bandL = bandLo + (bandHi - bandLo) * (rank / 7);\n const fill = readableHuedOnCode(bandL, codeChroma, hue3, codeFloor);\n lit(`--code-${role}`, formatCss2(fill), [\"--accent\", \"--code-bg\"]);\n });\n const commentFloor = Math.max(3, codeFloor * 0.62);\n const commentL = codeTowardLight ? 0.6 : 0.56;\n lit(\"--code-comment\", formatCss2(readableHuedOnCode(commentL, Math.min(0.03, codeChroma * 0.3), codeBaseHue, commentFloor)), [\"--accent\", \"--code-bg\"]);\n lit(\"--code-operator\", formatCss2(readableHuedOnCode(codeBaseL, codeChroma * 0.5, codeBaseHue, codeFloor)), [\"--accent\", \"--code-bg\"]);\n lit(\"--code-punctuation\", formatCss2(enforceContrastFloor(withLightness(codeFg, codeFg.l + (codePole - codeFg.l) * 0.18), codeBg, scheme, codeFloor)), [\"--code-fg\", \"--code-bg\"]);\n lit(\"--code-variable\", codeFgCss, [\"--code-fg\"]);\n lit(\"--font-sans\", fonts.sans);\n lit(\"--font-mono\", fonts.mono);\n lit(\"--font-display\", fonts.display);\n const bodyIndex = TEXT_STEPS.indexOf(\"body\");\n TEXT_STEPS.forEach((step, index) => {\n const rem = BASE_TEXT_REM * typeScale ** (index - bodyIndex);\n lit(`--text-${step}`, `${rem.toFixed(4).replace(/\\.?0+$/, \"\")}rem`);\n });\n for (const step of LEADING_STEPS) {\n lit(`--leading-${step}`, String(LEADING_VALUES[step]));\n }\n for (const step of WEIGHT_STEPS) {\n lit(`--weight-${step}`, String(WEIGHT_VALUES[step]));\n }\n const radiusPx = {\n none: 0,\n sm: 2 * radiusScale,\n md: 4 * radiusScale,\n lg: 8 * radiusScale,\n full: 9999\n };\n for (const step of RADIUS_STEPS) {\n lit(`--radius-${step}`, `${radiusPx[step]}px`);\n }\n const borderPx = { thin: 1, normal: 1.5, thick: 2 };\n for (const step of BORDER_STEPS) {\n lit(`--border-${step}`, `${borderPx[step]}px`);\n }\n const durationMs = { fast: 120, base: 200, slow: 320 };\n for (const step of DURATION_STEPS) {\n lit(`--duration-${step}`, `${durationMs[step]}ms`);\n }\n lit(\"--ease-standard\", \"cubic-bezier(0.2, 0, 0, 1)\");\n lit(\"--ease-emphasized\", \"cubic-bezier(0.3, 0, 0, 1)\");\n const elevationStrings = {};\n for (const level of ELEVATION_STEPS) {\n const value = shadowString(scheme, level, vibrancy, preset);\n elevationStrings[level] = value;\n lit(`--elevation-${level}`, value);\n }\n lit(\"--shadow\", elevationStrings[3], [\"--elevation-3\"]);\n for (const step of SPACE_STEPS) {\n const rem = SPACE_BASE_REM * step * density;\n lit(`--space-${step}`, `${rem.toFixed(4).replace(/\\.?0+$/, \"\")}rem`);\n }\n const producedNames = new Set(nodes.map((n) => n.name));\n for (const [name, value] of Object.entries(pinned)) {\n if (producedNames.has(name)) {\n for (const node of nodes) {\n if (node.name === name) {\n node.value = value;\n node.resolve = void 0;\n node.refs = void 0;\n }\n }\n } else {\n nodes.push({ name, value });\n }\n }\n return nodes;\n }\n function resolveBaseInputs(preset, opts) {\n const completed = completeAnchors(preset, opts);\n return {\n knobs: opts.knobs ?? {},\n scheme: completed.scheme,\n pinned: opts.constraints ?? {}\n };\n }\n function buildPassContext(preset, opts, passIndex) {\n const base = resolveBaseInputs(preset, opts);\n return { ...base, passIndex };\n }\n function runPipeline(passes, makeCtx) {\n let register = {};\n const trace = [];\n passes.forEach((pass, index) => {\n register = pass.run(register, makeCtx(index));\n trace.push({ name: pass.name, register });\n });\n return { register, trace };\n }\n function settlePass(preset, opts) {\n return {\n name: \"settle\",\n run: () => resolveGraph(buildGraph(preset, opts))\n };\n }\n function registerToNodes(register) {\n return Object.entries(register).map(([name, value]) => ({ name, value }));\n }\n function alpha(value) {\n if (!value)\n return 1;\n const rgba = /rgba?\\([^)]*?,\\s*([0-9.]+)\\s*\\)/.exec(value);\n if (rgba && rgba[1] !== void 0)\n return Number.parseFloat(rgba[1]);\n if (value.startsWith(\"#\") && value.length === 9) {\n return Number.parseInt(value.slice(7, 9), 16) / 255;\n }\n if (value.startsWith(\"#\") && value.length === 5) {\n return Number.parseInt(value.slice(4, 5).repeat(2), 16) / 255;\n }\n return 1;\n }\n function parseRem(value) {\n if (!value)\n return Number.NaN;\n const m = /^(-?[0-9.]+)(rem|px)$/.exec(value.trim());\n return m ? Number.parseFloat(m[1]) : Number.NaN;\n }\n function parseMs(value) {\n if (!value)\n return Number.NaN;\n const m = /^(-?[0-9.]+)ms$/.exec(value.trim());\n return m ? Number.parseFloat(m[1]) : Number.NaN;\n }\n function shadowStrength(value) {\n if (!value || value === \"none\")\n return 0;\n let total = 0;\n const offsets = value.match(/([0-9.]+)px/g) ?? [];\n for (const off of offsets)\n total += Number.parseFloat(off);\n const alphas = value.match(/rgba?\\([^)]*,\\s*([0-9.]+)\\)/g) ?? [];\n for (const a of alphas) {\n const m = /,\\s*([0-9.]+)\\)/.exec(a);\n if (m)\n total += Number.parseFloat(m[1]) * 20;\n }\n return total;\n }\n var STATE_TOKENS = [\n \"--state-hover\",\n \"--state-press\",\n \"--state-selected\",\n \"--state-disabled\",\n \"--state-drag\"\n ];\n var CEILING_EPSILON = 0.05;\n function achievableFloor(declaredFloor, bgCss) {\n if (!bgCss)\n return declaredFloor;\n const ceiling = Math.max(contrast2(\"#000000\", bgCss), contrast2(\"#ffffff\", bgCss));\n return Math.min(declaredFloor, ceiling - CEILING_EPSILON);\n }\n function oklabDist(a, b) {\n const x = toOklchColor(a);\n const y = toOklchColor(b);\n const rad = Math.PI / 180;\n const ax = x.c * Math.cos(x.h * rad);\n const ay = x.c * Math.sin(x.h * rad);\n const bx = y.c * Math.cos(y.h * rad);\n const by = y.c * Math.sin(y.h * rad);\n return Math.hypot(x.l - y.l, ax - bx, ay - by);\n }\n function makeInvariants(preset) {\n const onFillFloor = preset.declaredTextOnFillFloor;\n return [\n (ctx) => {\n for (const name of PRODUCES) {\n const value = ctx.register[name];\n const category = ctx.categories[name];\n if (typeof value !== \"string\" || value.length === 0) {\n return {\n name: \"every token non-empty and format-valid for its category\",\n ok: false,\n detail: `${name} is ${value === void 0 ? \"missing\" : \"empty\"}`\n };\n }\n if (/nan/i.test(value)) {\n return {\n name: \"every token non-empty and format-valid for its category\",\n ok: false,\n detail: `${name} contains NaN: ${value}`\n };\n }\n switch (category) {\n case \"color\": {\n try {\n const o = toOklchColor(value);\n if (Number.isNaN(o.l) || Number.isNaN(o.c) || Number.isNaN(o.h) || Number.isNaN(alpha(value))) {\n return {\n name: \"every token non-empty and format-valid for its category\",\n ok: false,\n detail: `${name} parses to NaN: ${value}`\n };\n }\n } catch (error) {\n return {\n name: \"every token non-empty and format-valid for its category\",\n ok: false,\n detail: `${name} unparseable color: ${value} (${String(error)})`\n };\n }\n break;\n }\n case \"length\": {\n if (Number.isNaN(parseRem(value))) {\n return {\n name: \"every token non-empty and format-valid for its category\",\n ok: false,\n detail: `${name} not a css length: ${value}`\n };\n }\n break;\n }\n case \"duration\": {\n if (Number.isNaN(parseMs(value))) {\n return {\n name: \"every token non-empty and format-valid for its category\",\n ok: false,\n detail: `${name} not a duration: ${value}`\n };\n }\n break;\n }\n case \"number\": {\n if (Number.isNaN(Number.parseFloat(value))) {\n return {\n name: \"every token non-empty and format-valid for its category\",\n ok: false,\n detail: `${name} not a number: ${value}`\n };\n }\n break;\n }\n case \"easing\": {\n if (!value.startsWith(\"cubic-bezier(\")) {\n return {\n name: \"every token non-empty and format-valid for its category\",\n ok: false,\n detail: `${name} not an easing: ${value}`\n };\n }\n break;\n }\n case \"shadow\": {\n if (value !== \"none\" && !value.includes(\"rgba\")) {\n return {\n name: \"every token non-empty and format-valid for its category\",\n ok: false,\n detail: `${name} not a shadow: ${value}`\n };\n }\n break;\n }\n case \"font\":\n break;\n case \"keyword\": {\n const domain = KEYWORD_DOMAINS[name];\n if (domain && !domain.includes(value)) {\n return {\n name: \"every token non-empty and format-valid for its category\",\n ok: false,\n detail: `${name} not in {${domain.join(\" | \")}}: ${value}`\n };\n }\n break;\n }\n }\n }\n return { name: \"every token non-empty and format-valid for its category\", ok: true };\n },\n (ctx) => {\n const name = `fg-0 on bg-0 clears ${onFillFloor >= AAA - 0.01 ? \"AAA\" : \"AA\"}`;\n if (ctx.constraints[\"--fg-0\"]) {\n return { name, ok: true, detail: \"skipped (pinned text)\" };\n }\n const fg0 = ctx.register[\"--fg-0\"];\n const bg0 = ctx.register[\"--bg-0\"];\n const ratio = fg0 && bg0 ? contrast2(fg0, bg0) : 0;\n const required = achievableFloor(onFillFloor, ctx.constraints[\"--bg-0\"] ? bg0 : void 0);\n return {\n name,\n ok: ratio >= required - 0.01,\n detail: `contrast ${ratio.toFixed(2)} (floor ${required.toFixed(2)}${ctx.constraints[\"--bg-0\"] ? ` best-achievable, declared ${onFillFloor}` : \"\"})`\n };\n },\n (ctx) => {\n const name = `fg ramp clears ${preset.contrastFloor >= AAA - 0.01 ? \"AAA\" : \"AA\"}`;\n if (ctx.constraints[\"--fg-0\"]) {\n return { name, ok: true, detail: \"skipped (pinned text)\" };\n }\n const bg0 = ctx.register[\"--bg-0\"];\n if (!bg0)\n return { name, ok: false, detail: \"missing --bg-0\" };\n const required = achievableFloor(preset.contrastFloor, ctx.constraints[\"--bg-0\"] ? bg0 : void 0);\n for (let i = 1; i <= 3; i++) {\n const key = `--fg-${i}`;\n if (ctx.constraints[key])\n continue;\n const fg = ctx.register[key];\n const ratio = fg ? contrast2(fg, bg0) : 0;\n if (ratio < required - 0.01) {\n return {\n name,\n ok: false,\n detail: `${key} contrast ${ratio.toFixed(2)} (floor ${required.toFixed(2)}${ctx.constraints[\"--bg-0\"] ? ` best-achievable, declared ${preset.contrastFloor}` : \"\"})`\n };\n }\n }\n return { name, ok: true };\n },\n (ctx) => {\n const pairs = [\n [\"--accent-fg\", \"--accent\"],\n [\"--neutral-fg\", \"--neutral\"],\n [\"--success-fg\", \"--success\"],\n [\"--warn-fg\", \"--warn\"],\n [\"--danger-fg\", \"--danger\"],\n [\"--info-fg\", \"--info\"],\n [\"--accent-text\", \"--bg-0\"],\n [\"--neutral-text\", \"--bg-0\"]\n ];\n const surfaceFill = new Set(SURFACES);\n for (const [fgName, fillName] of pairs) {\n const fill = ctx.register[fillName];\n const pinned = Boolean(ctx.constraints[fillName]);\n if (pinned && !surfaceFill.has(fillName))\n continue;\n const fg = ctx.register[fgName];\n if (!fg || !fill)\n continue;\n const required = pinned ? achievableFloor(onFillFloor, fill) : onFillFloor;\n if (contrast2(fg, fill) < required - 0.01) {\n return {\n name: `on-fill text clears ${onFillFloor >= AAA - 0.01 ? \"AAA\" : \"AA\"}`,\n ok: false,\n detail: `${fgName} on ${fillName} = ${contrast2(fg, fill).toFixed(2)} (floor ${required.toFixed(2)}${pinned ? \" best-achievable\" : \"\"})`\n };\n }\n }\n return {\n name: `on-fill text clears ${onFillFloor >= AAA - 0.01 ? \"AAA\" : \"AA\"}`,\n ok: true\n };\n },\n (ctx) => {\n const pairs = [\n [\"--success-text\", \"--success-bg\"],\n [\"--warn-text\", \"--warn-bg\"],\n [\"--danger-text\", \"--danger-bg\"],\n [\"--info-text\", \"--info-bg\"]\n ];\n for (const [fgName, fillName] of pairs) {\n const fg = ctx.register[fgName];\n const fill = ctx.register[fillName];\n if (!fg || !fill)\n continue;\n if (contrast2(fg, fill) < AA - 0.01) {\n return {\n name: \"text-on-tint clears AA\",\n ok: false,\n detail: `${fgName} on ${fillName} = ${contrast2(fg, fill).toFixed(2)}`\n };\n }\n }\n return { name: \"text-on-tint clears AA\", ok: true };\n },\n (ctx) => {\n const name = \"achromatic tone inks stay neutral\";\n const achromatic = [\"gray\", \"white\", \"black\"];\n for (const hue3 of achromatic) {\n for (const token of [`--${hue3}-fg`, `--${hue3}-text`, `--color-${hue3}-contrast`]) {\n const value = ctx.register[token];\n if (!value)\n continue;\n const c2 = toOklchColor(value).c;\n if (c2 >= ACHROMATIC_CHROMA) {\n return { name, ok: false, detail: `${token} = ${value} (chroma ${c2.toFixed(3)} \\u2265 ${ACHROMATIC_CHROMA})` };\n }\n }\n }\n return { name, ok: true };\n },\n (ctx) => {\n const name = \"panel text clears AA on --bg-1 and --bg-2\";\n const neutralText = [\n \"--fg-1\",\n \"--fg-2\",\n \"--fg-3\",\n \"--placeholder\",\n \"--link\",\n \"--accent-text\",\n \"--neutral-text\",\n \"--neutral-vivid\"\n ];\n if (ctx.constraints[\"--bg-0\"])\n return { name, ok: true, detail: \"skipped (pinned bg-0)\" };\n const bg0 = ctx.register[\"--bg-0\"];\n if (!bg0)\n return { name, ok: true };\n const textLight = ctx.scheme === \"dark\";\n const themePole = textLight ? \"#ffffff\" : \"#000000\";\n const band = contrastBandFloor(ctx.knobs);\n const inkFloor = Math.max(ENFORCE, preset.contrastFloor, (band ?? 0) + 0.2);\n const statusRoles = Object.keys(STATUS_TO_HUE);\n for (const panel of PANEL_SURFACES) {\n const bg = ctx.register[panel];\n if (!bg)\n continue;\n const bgL = toOklchColor(bg).l;\n if (bgL < 0.5 !== textLight)\n continue;\n const poleCeiling = contrast2(themePole, bg);\n const required = Math.min(AA, poleCeiling - CEILING_EPSILON);\n const fg0Reach = (() => {\n const v = ctx.register[\"--fg-0\"];\n return v ? contrast2(v, bg) : Infinity;\n })();\n const inkReach = (source) => {\n const v = ctx.register[source];\n if (!v)\n return Infinity;\n const ink = toOklchColor(v);\n const targetL = textLight ? 1 : 0;\n let reach = contrast2(v, bg);\n for (let i = 1; i <= 100; i++) {\n const t = i / 100;\n const candidate = withLightness(ink, ink.l + (targetL - ink.l) * t);\n if (contrast2(formatCss2(candidate), bg0) < inkFloor - 0.01)\n break;\n reach = Math.max(reach, contrast2(formatCss2(candidate), bg));\n }\n return reach;\n };\n const accentInkReach = inkReach(\"--accent\");\n const neutralInkReach = inkReach(\"--neutral\");\n const check = (token, ceilingReach = Infinity) => {\n const fg = ctx.register[token];\n if (!fg)\n return null;\n const floorFor = Math.min(required, ceilingReach);\n const ratio = contrast2(fg, bg);\n if (ratio < floorFor - 0.05) {\n return {\n name,\n ok: false,\n detail: `${token} on ${panel} = ${ratio.toFixed(2)} (floor ${floorFor.toFixed(2)})`\n };\n }\n return null;\n };\n const fg0Bounded = /* @__PURE__ */ new Set([\"--fg-1\", \"--fg-2\", \"--fg-3\", \"--placeholder\"]);\n const accentBounded = /* @__PURE__ */ new Set([\"--link\", \"--accent-text\"]);\n const reachFor = (token) => {\n if (fg0Bounded.has(token))\n return fg0Reach;\n if (accentBounded.has(token))\n return accentInkReach;\n if (token === \"--neutral-text\" || token === \"--neutral-vivid\")\n return neutralInkReach;\n return Infinity;\n };\n for (const token of neutralText) {\n const fail = check(token, reachFor(token));\n if (fail)\n return fail;\n }\n for (const role of statusRoles) {\n const tintBg = ctx.register[`--${role}-bg`];\n if (tintBg) {\n const whiteJoint = contrast2(\"#ffffff\", tintBg) >= AA && contrast2(\"#ffffff\", bg) >= AA;\n const blackJoint = contrast2(\"#000000\", tintBg) >= AA && contrast2(\"#000000\", bg) >= AA;\n if (!whiteJoint && !blackJoint)\n continue;\n }\n const fail = check(`--${role}-text`);\n if (fail)\n return fail;\n const failVivid = check(`--${role}-vivid`);\n if (failVivid)\n return failVivid;\n }\n }\n return { name, ok: true };\n },\n (ctx) => {\n const name = \"solid fills separate from --bg-0\";\n const bg0 = ctx.register[\"--bg-0\"];\n if (!bg0)\n return { name, ok: true };\n const fills = [\"--accent\", \"--neutral\", ...Object.keys(STATUS_TO_HUE).map((r2) => `--${r2}`)];\n for (const token of fills) {\n if (ctx.constraints[token])\n continue;\n const fill = ctx.register[token];\n if (!fill)\n continue;\n const ratio = contrast2(fill, bg0);\n if (ratio < SURFACE_SEPARATION - 0.05) {\n return { name, ok: false, detail: `${token} = ${ratio.toFixed(2)} on --bg-0 (floor ${SURFACE_SEPARATION})` };\n }\n }\n return { name, ok: true };\n },\n (ctx) => {\n const name = \"borders separate from their surface\";\n const borders = [\n [\"--line\", \"--bg-0\", BORDER_SEPARATION],\n [\"--line-2\", \"--bg-0\", DIVIDER_SEPARATION],\n [\"--field-border\", \"--field-bg\", BORDER_SEPARATION]\n ];\n for (const [token, surface, separation] of borders) {\n if (ctx.constraints[token])\n continue;\n const border = ctx.register[token];\n const bg = ctx.register[surface];\n if (!border || !bg)\n continue;\n const ratio = contrast2(border, bg);\n if (ratio < separation - 0.05) {\n return { name, ok: false, detail: `${token} = ${ratio.toFixed(2)} on ${surface} (floor ${separation})` };\n }\n }\n return { name, ok: true };\n },\n (ctx) => {\n const ladder = [\"--bg-sunken\", ...SURFACES];\n const ls = ladder.map((name) => {\n const value = ctx.register[name];\n return value ? toOklchColor(value).l : 0;\n });\n const ascending = ctx.scheme === \"dark\";\n for (let i = 1; i < ls.length; i++) {\n const prev = ls[i - 1];\n const cur = ls[i];\n const ok = ascending ? cur >= prev - 1e-6 : cur <= prev + 1e-6;\n if (!ok) {\n return {\n name: \"surface lightness monotonic\",\n ok: false,\n detail: `${ladder[i - 1]}=${prev.toFixed(3)} ${ladder[i]}=${cur.toFixed(3)} (${ctx.scheme})`\n };\n }\n }\n return { name: \"surface lightness monotonic\", ok: true };\n },\n (ctx) => {\n for (const name of STATE_TOKENS) {\n const value = ctx.register[name];\n if (!value)\n continue;\n const a = alpha(value);\n if (a >= 1) {\n return {\n name: \"state overlays translucent\",\n ok: false,\n detail: `${name} alpha ${a}`\n };\n }\n }\n return { name: \"state overlays translucent\", ok: true };\n },\n (ctx) => {\n const linkName = `links clear ${onFillFloor >= AAA - 0.01 ? \"AAA\" : \"AA\"} on bg-0`;\n const bg0 = ctx.register[\"--bg-0\"];\n const required = achievableFloor(onFillFloor, ctx.constraints[\"--bg-0\"] ? bg0 : void 0);\n for (const name of [\"--link\", \"--link-hover\"]) {\n const link = ctx.register[name];\n if (!link || !bg0)\n continue;\n const ratio = contrast2(link, bg0);\n if (ratio < required - 0.01) {\n return {\n name: linkName,\n ok: false,\n detail: `${name} on --bg-0 = ${ratio.toFixed(2)} (floor ${required.toFixed(2)}${ctx.constraints[\"--bg-0\"] ? \" best-achievable\" : \"\"})`\n };\n }\n }\n return { name: linkName, ok: true };\n },\n (ctx) => {\n const name = \"link hover distinct from link\";\n const link = ctx.register[\"--link\"];\n const hover = ctx.register[\"--link-hover\"];\n if (!link || !hover)\n return { name, ok: true };\n if (ctx.constraints[\"--link\"] || ctx.constraints[\"--link-hover\"])\n return { name, ok: true };\n if (link === hover) {\n if (link === \"#000000\" || link === \"#ffffff\")\n return { name, ok: true };\n return { name, ok: false, detail: `--link and --link-hover both ${link}` };\n }\n return { name, ok: true };\n },\n (ctx) => {\n const name = \"unpinned accent ramp holds its fan at constant L/C\";\n const accentValue = ctx.register[\"--accent\"];\n if (!accentValue) {\n return { name, ok: true };\n }\n const accent = toOklchColor(accentValue);\n if (accent.c < HUE_STABLE_CHROMA) {\n return { name, ok: true };\n }\n const step = typeof ctx.knobs.accentShiftStep === \"number\" ? ctx.knobs.accentShiftStep : DEFAULT_SHIFT_STEP;\n const split = typeof ctx.knobs.accentSplit === \"number\" ? ctx.knobs.accentSplit : DEFAULT_ACCENT_SPLIT;\n const accent2Value = ctx.register[\"--accent-2\"];\n const accent3Value = ctx.register[\"--accent-3\"];\n const pinnedAccent2 = ctx.constraints[\"--accent-2\"] && accent2Value ? toOklchColor(accent2Value) : null;\n const pinnedAccent3 = ctx.constraints[\"--accent-3\"] && accent3Value ? toOklchColor(accent3Value) : null;\n const fanOffset = (n) => ACCENT_FAN === \"split-complement\" ? n === 2 ? pinnedAccent3 ? -hueDelta(accent.h, pinnedAccent3.h) : -split : n === 3 ? pinnedAccent2 ? -hueDelta(accent.h, pinnedAccent2.h) : split : 180 : step * (n - 1);\n for (let n = 2; n <= 4; n++) {\n if (ctx.constraints[`--accent-${n}`])\n continue;\n const value = ctx.register[`--accent-${n}`];\n if (!value)\n continue;\n const rotated = toOklchColor(value);\n const wantH = ((accent.h + fanOffset(n)) % 360 + 360) % 360;\n if (rotated.c >= HUE_STABLE_CHROMA) {\n let dh = Math.abs(rotated.h - wantH) % 360;\n if (dh > 180)\n dh = 360 - dh;\n if (dh > HUE_TOLERANCE) {\n return {\n name,\n ok: false,\n detail: `--accent-${n} h=${rotated.h.toFixed(1)} want ${wantH.toFixed(1)}`\n };\n }\n }\n if (Math.abs(rotated.l - accent.l) > LIGHTNESS_TOLERANCE) {\n return {\n name,\n ok: false,\n detail: `--accent-${n} l=${rotated.l.toFixed(3)} want ${accent.l.toFixed(3)}`\n };\n }\n const maxChroma = clampToGamut({ l: accent.l, c: accent.c, h: wantH, alpha: 1 }).c;\n const expectedChroma = Math.min(accent.c, maxChroma);\n if (Math.abs(rotated.c - expectedChroma) > 0.02) {\n return {\n name,\n ok: false,\n detail: `--accent-${n} chroma ${rotated.c.toFixed(3)} want max-at-hue ${expectedChroma.toFixed(3)}`\n };\n }\n }\n return { name, ok: true };\n },\n (ctx) => {\n for (const name of [\"--ring\", \"--ring-bg\", \"--scrim\", \"--selection\", \"--highlight\"]) {\n const value = ctx.register[name];\n if (!value)\n continue;\n if (alpha(value) >= 1) {\n return {\n name: \"ring/scrim/selection/highlight carry alpha < 1\",\n ok: false,\n detail: `${name} alpha ${alpha(value)}`\n };\n }\n }\n return { name: \"ring/scrim/selection/highlight carry alpha < 1\", ok: true };\n },\n (ctx) => {\n let prev = -Infinity;\n for (const step of TEXT_STEPS) {\n const rem = parseRem(ctx.register[`--text-${step}`]);\n if (Number.isNaN(rem)) {\n return {\n name: \"type scale strictly increasing\",\n ok: false,\n detail: `--text-${step} not a length`\n };\n }\n if (rem <= prev) {\n return {\n name: \"type scale strictly increasing\",\n ok: false,\n detail: `--text-${step}=${rem} not > ${prev}`\n };\n }\n prev = rem;\n }\n return { name: \"type scale strictly increasing\", ok: true };\n },\n (ctx) => {\n let prev = -Infinity;\n for (const step of WEIGHT_STEPS) {\n const w = Number.parseFloat(ctx.register[`--weight-${step}`] ?? \"\");\n if (Number.isNaN(w) || w <= prev) {\n return {\n name: \"weights strictly increasing\",\n ok: false,\n detail: `--weight-${step}=${w} not > ${prev}`\n };\n }\n prev = w;\n }\n return { name: \"weights strictly increasing\", ok: true };\n },\n (ctx) => {\n let prev = -Infinity;\n for (const step of LEADING_STEPS) {\n const v = Number.parseFloat(ctx.register[`--leading-${step}`] ?? \"\");\n if (Number.isNaN(v) || v <= prev) {\n return {\n name: \"leading strictly increasing\",\n ok: false,\n detail: `--leading-${step}=${v} not > ${prev}`\n };\n }\n prev = v;\n }\n return { name: \"leading strictly increasing\", ok: true };\n },\n (ctx) => {\n let prev = -Infinity;\n for (const step of RADIUS_STEPS) {\n const v = parseRem(ctx.register[`--radius-${step}`]);\n if (Number.isNaN(v) || v < prev - 1e-9) {\n return {\n name: \"radius ladder non-decreasing\",\n ok: false,\n detail: `--radius-${step}=${v} < ${prev}`\n };\n }\n prev = v;\n }\n return { name: \"radius ladder non-decreasing\", ok: true };\n },\n (ctx) => {\n let prev = -Infinity;\n for (const step of BORDER_STEPS) {\n const v = parseRem(ctx.register[`--border-${step}`]);\n if (Number.isNaN(v) || v <= prev) {\n return {\n name: \"borders strictly increasing\",\n ok: false,\n detail: `--border-${step}=${v} not > ${prev}`\n };\n }\n prev = v;\n }\n return { name: \"borders strictly increasing\", ok: true };\n },\n (ctx) => {\n let prev = -Infinity;\n for (const step of DURATION_STEPS) {\n const v = parseMs(ctx.register[`--duration-${step}`]);\n if (Number.isNaN(v) || v <= prev) {\n return {\n name: \"durations strictly increasing\",\n ok: false,\n detail: `--duration-${step}=${v} not > ${prev}`\n };\n }\n prev = v;\n }\n return { name: \"durations strictly increasing\", ok: true };\n },\n (ctx) => {\n let prev = -Infinity;\n for (const level of ELEVATION_STEPS) {\n const v = shadowStrength(ctx.register[`--elevation-${level}`]);\n if (v < prev - 1e-9) {\n return {\n name: \"elevation strength non-decreasing\",\n ok: false,\n detail: `--elevation-${level}=${v} < ${prev}`\n };\n }\n prev = v;\n }\n return { name: \"elevation strength non-decreasing\", ok: true };\n },\n (ctx) => {\n let prev = -Infinity;\n for (const step of SPACE_STEPS) {\n const v = parseRem(ctx.register[`--space-${step}`]);\n if (Number.isNaN(v) || v < prev - 1e-9) {\n return {\n name: \"space ramp non-decreasing\",\n ok: false,\n detail: `--space-${step}=${v} < ${prev}`\n };\n }\n prev = v;\n }\n return { name: \"space ramp non-decreasing\", ok: true };\n },\n (ctx) => {\n for (const [hue3, spec2] of Object.entries(PALETTE_HUES)) {\n const stops = PALETTE_STOPS.filter((s) => s !== \"contrast\").map((stop) => ctx.register[`--color-${hue3}-${stop}`]);\n const ls = stops.map((v) => v ? toOklchColor(v).l : Number.NaN);\n if (ls.some((l) => Number.isNaN(l))) {\n return {\n name: \"palette ramps monotonic in OKLCH lightness\",\n ok: false,\n detail: `--color-${hue3} ramp has a non-color stop`\n };\n }\n const ascending = ls[ls.length - 1] >= ls[0];\n for (let i = 1; i < ls.length; i++) {\n const prev = ls[i - 1];\n const cur = ls[i];\n const ok = ascending ? cur > prev + 1e-9 : cur < prev - 1e-9;\n if (!ok) {\n return {\n name: \"palette ramps monotonic in OKLCH lightness\",\n ok: false,\n detail: `--color-${hue3} ramp l[${i}]=${cur} not strictly ${ascending ? \">\" : \"<\"} ${prev}`\n };\n }\n }\n const base = ctx.register[`--color-${hue3}-base`];\n const contrastStop = ctx.register[`--color-${hue3}-contrast`];\n if (base && contrastStop && contrast2(base, contrastStop) < AA - 0.01) {\n return {\n name: \"palette ramps monotonic in OKLCH lightness\",\n ok: false,\n detail: `--color-${hue3}-contrast on -base = ${contrast2(base, contrastStop).toFixed(2)}`\n };\n }\n if (spec2 !== \"white\" && spec2 !== \"black\") {\n const subtle = ctx.register[`--color-${hue3}-subtle`];\n const strong = ctx.register[`--color-${hue3}-strong`];\n if (subtle && strong && contrast2(subtle, strong) < AA - 0.01) {\n return {\n name: \"palette ramps monotonic in OKLCH lightness\",\n ok: false,\n detail: `--color-${hue3}-strong on -subtle = ${contrast2(subtle, strong).toFixed(2)}`\n };\n }\n }\n if (typeof spec2 === \"object\" && base) {\n const o = toOklchColor(base);\n if (o.c >= HUE_STABLE_CHROMA) {\n let dh = Math.abs(o.h - spec2.h) % 360;\n if (dh > 180)\n dh = 360 - dh;\n if (dh > 20) {\n return {\n name: \"palette ramps monotonic in OKLCH lightness\",\n ok: false,\n detail: `--color-${hue3}-base h=${o.h.toFixed(1)} strayed from ${spec2.h}`\n };\n }\n }\n }\n }\n return { name: \"palette ramps monotonic in OKLCH lightness\", ok: true };\n },\n (ctx) => {\n const name = \"every tone family clears AA (fg on solid, text on bg)\";\n for (const tone of FULL_TONES) {\n const solid = ctx.register[`--${tone}`];\n const fg = ctx.register[`--${tone}-fg`];\n const bg = ctx.register[`--${tone}-bg`];\n const text = ctx.register[`--${tone}-text`];\n if (!solid || !fg || !bg || !text) {\n return { name, ok: false, detail: `--${tone} family is incomplete` };\n }\n if (contrast2(solid, fg) < AA - 0.01) {\n return { name, ok: false, detail: `--${tone}-fg on --${tone} = ${contrast2(solid, fg).toFixed(2)}` };\n }\n if (contrast2(bg, text) < AA - 0.01) {\n return { name, ok: false, detail: `--${tone}-text on --${tone}-bg = ${contrast2(bg, text).toFixed(2)}` };\n }\n }\n return { name, ok: true };\n },\n (ctx) => {\n const name = \"code palette readable on --code-bg\";\n const codeBg = ctx.register[\"--code-bg\"];\n if (!codeBg)\n return { name, ok: false, detail: \"--code-bg missing\" };\n const readFloor = achievableFloor(AA, codeBg);\n const commentFloor = achievableFloor(3, codeBg);\n for (const role of [...CODE_VIVID_ROLES, \"operator\"]) {\n const v = ctx.register[`--code-${role}`];\n const ratio = v ? contrast2(v, codeBg) : 0;\n if (ratio < readFloor - 0.05) {\n return { name, ok: false, detail: `--code-${role} on --code-bg = ${ratio.toFixed(2)} (floor ${readFloor.toFixed(2)})` };\n }\n }\n const commentRatio = contrast2(ctx.register[\"--code-comment\"] ?? \"#000\", codeBg);\n if (commentRatio < commentFloor - 0.05) {\n return { name, ok: false, detail: `--code-comment on --code-bg = ${commentRatio.toFixed(2)} (floor ${commentFloor.toFixed(2)})` };\n }\n return { name, ok: true };\n },\n (ctx) => {\n const name = \"code scopes mutually distinguishable\";\n const MIN_DE = 6e-3;\n const distinct = [...CODE_VIVID_ROLES, \"comment\"].map((r2) => `--code-${r2}`);\n for (let i = 0; i < distinct.length; i++) {\n for (let j = i + 1; j < distinct.length; j++) {\n const ni = distinct[i];\n const nj = distinct[j];\n const a = ctx.register[ni];\n const b = ctx.register[nj];\n if (!a || !b)\n continue;\n const d = oklabDist(a, b);\n if (d < MIN_DE) {\n return { name, ok: false, detail: `${ni} vs ${nj} \\u0394E=${d.toFixed(4)} (min ${MIN_DE})` };\n }\n }\n }\n return { name, ok: true };\n },\n (ctx) => {\n const name = \"status roles mutually distinguishable\";\n const MIN_DE = 0.02;\n const roles = Object.keys(STATUS_TO_HUE).map((r2) => `--${r2}`);\n for (let i = 0; i < roles.length; i++) {\n for (let j = i + 1; j < roles.length; j++) {\n const ni = roles[i];\n const nj = roles[j];\n const a = ctx.register[ni];\n const b = ctx.register[nj];\n if (!a || !b)\n continue;\n const d = oklabDist(a, b);\n if (d < MIN_DE) {\n return { name, ok: false, detail: `${ni} vs ${nj} \\u0394E=${d.toFixed(4)} (min ${MIN_DE})` };\n }\n }\n }\n return { name, ok: true };\n }\n ];\n }\n var PRODUCED_TOKENS = PRODUCES;\n var TOKEN_CATEGORIES = CATEGORIES;\n var SHARED_KNOBS = [\n \"scheme\",\n \"accentShiftStep\",\n \"accentSplit\",\n \"contrastBand\",\n \"vibrancy\",\n \"typeScale\",\n \"radiusScale\",\n \"density\",\n \"cues\",\n \"fonts\",\n \"anchors\"\n ];\n var DEFAULT_ANCHORS = {\n bg: \"#0f1115\",\n fg: \"#e8eaed\"\n };\n\n // packages/xtyle/dist/authoring.js\n function toLineage(nodes) {\n return nodes.map(({ name, value, refs }) => refs && refs.length ? { name, value, refs } : { name, value });\n }\n function registerExports(graph, traced, manifest, invariants) {\n xript.exports.register(\"graph\", (...args) => toLineage(graph(args[0] ?? {})));\n xript.exports.register(\"traced\", (...args) => traced(args[0] ?? {}));\n xript.exports.register(\"manifest\", () => ({ ...manifest, invariantCount: invariants.length }));\n xript.exports.register(\"invariants\", (...args) => invariants.map((invariant) => invariant(args[0])));\n }\n function tracePreset(preset, buildPasses, input) {\n return runPipeline(buildPasses(preset, input), (passIndex) => buildPassContext(preset, input, passIndex)).trace;\n }\n function toPreset(spec2) {\n const chroma = spec2.chroma ?? {};\n const elevation = spec2.elevation ?? {};\n const contrast3 = spec2.contrast ?? {};\n const preset = {\n id: spec2.id,\n knobs: spec2.knobs ?? SHARED_KNOBS,\n // Merge over the full default so a spec that names only some anchors (e.g. just `bg` and\n // `accent`) still yields a complete `bg`/`fg` default — derivation reads both, so a partial\n // `defaultAnchors` would crash when invoked with no anchor overrides.\n defaultAnchors: spec2.anchors ? { ...DEFAULT_ANCHORS, ...spec2.anchors } : DEFAULT_ANCHORS,\n contrastFloor: contrast3.floor ?? 4.7,\n declaredTextOnFillFloor: contrast3.textOnFill ?? 4.5,\n defaultVibrancy: spec2.vibrancy ?? 0.5,\n accentChromaMul: chroma.accent ?? 1,\n statusChromaMul: chroma.status ?? 1,\n paletteChromaMul: chroma.palette ?? 1,\n neutralChroma: chroma.neutral ?? 0.01,\n elevationStrengthMul: elevation.strength ?? 1,\n elevationAlphaBoost: elevation.alphaBoost ?? 0,\n accentTintChromaMul: chroma.accentTint ?? 0.3\n };\n if (spec2.extreme)\n preset.extreme = true;\n return preset;\n }\n function defineXtyleAlgorithm(spec2) {\n const preset = toPreset(spec2);\n const buildPasses = spec2.passes ?? ((p4, input) => [settlePass(p4, input)]);\n const singlePass = buildPasses(preset, {}).length === 1;\n const finalNodes = (input) => singlePass ? buildGraph(preset, input) : registerToNodes(runPipeline(buildPasses(preset, input), (passIndex) => buildPassContext(preset, input, passIndex)).register);\n registerExports(finalNodes, (input) => tracePreset(preset, buildPasses, input), {\n produces: PRODUCED_TOKENS,\n categories: TOKEN_CATEGORIES,\n knobs: preset.knobs,\n passNames: buildPasses(preset, {}).map((pass) => pass.name)\n }, makeInvariants(preset));\n }\n\n // algorithms/xtyle-loud/src/preset.ts\n var spec = {\n id: \"xtyle-loud\",\n vibrancy: 0.9,\n chroma: { accent: 1.6, status: 1.5, palette: 1.5, neutral: 0.02, accentTint: 0.5 },\n elevation: { strength: 1.6, alphaBoost: 0.12 }\n };\n\n // algorithms/xtyle-loud/src/mod.ts\n defineXtyleAlgorithm(spec);\n})();\n" }, "xtyle-quiet": { "manifest": { "$schema": "https://xript.dev/schema/mod-manifest/v0.7.json", "xript": "0.7", "name": "xtyle-quiet", "version": "0.1.0", "title": "Xtyle Quiet", "family": "xtyle", "capabilities": ["color-math"], "entry": { "script": "src/mod.js", "format": "script", "exports": { "graph": { "description": "Token lineage nodes for anchors+knobs.", "params": [{ "name": "input", "type": "DeriveInput" }], "returns": { "array": "TokenNode" } }, "traced": { "description": "Per-pass register snapshots for anchors+knobs.", "params": [{ "name": "input", "type": "DeriveInput" }], "returns": { "array": "TraceSnapshot" } }, "manifest": { "description": "produces + categories + knobs.", "returns": "AlgorithmManifest" }, "invariants": { "description": "Evaluate per-algorithm invariants.", "params": [{ "name": "ctx", "type": "map" }], "returns": { "array": "InvariantResult" } } } } }, "source": "(() => {\n var __defProp = Object.defineProperty;\n var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\n var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\n\n // node_modules/culori/src/rgb/parseNumber.js\n var parseNumber = (color, len) => {\n if (typeof color !== \"number\") return;\n if (len === 3) {\n return {\n mode: \"rgb\",\n r: (color >> 8 & 15 | color >> 4 & 240) / 255,\n g: (color >> 4 & 15 | color & 240) / 255,\n b: (color & 15 | color << 4 & 240) / 255\n };\n }\n if (len === 4) {\n return {\n mode: \"rgb\",\n r: (color >> 12 & 15 | color >> 8 & 240) / 255,\n g: (color >> 8 & 15 | color >> 4 & 240) / 255,\n b: (color >> 4 & 15 | color & 240) / 255,\n alpha: (color & 15 | color << 4 & 240) / 255\n };\n }\n if (len === 6) {\n return {\n mode: \"rgb\",\n r: (color >> 16 & 255) / 255,\n g: (color >> 8 & 255) / 255,\n b: (color & 255) / 255\n };\n }\n if (len === 8) {\n return {\n mode: \"rgb\",\n r: (color >> 24 & 255) / 255,\n g: (color >> 16 & 255) / 255,\n b: (color >> 8 & 255) / 255,\n alpha: (color & 255) / 255\n };\n }\n };\n var parseNumber_default = parseNumber;\n\n // node_modules/culori/src/colors/named.js\n var named = {\n aliceblue: 15792383,\n antiquewhite: 16444375,\n aqua: 65535,\n aquamarine: 8388564,\n azure: 15794175,\n beige: 16119260,\n bisque: 16770244,\n black: 0,\n blanchedalmond: 16772045,\n blue: 255,\n blueviolet: 9055202,\n brown: 10824234,\n burlywood: 14596231,\n cadetblue: 6266528,\n chartreuse: 8388352,\n chocolate: 13789470,\n coral: 16744272,\n cornflowerblue: 6591981,\n cornsilk: 16775388,\n crimson: 14423100,\n cyan: 65535,\n darkblue: 139,\n darkcyan: 35723,\n darkgoldenrod: 12092939,\n darkgray: 11119017,\n darkgreen: 25600,\n darkgrey: 11119017,\n darkkhaki: 12433259,\n darkmagenta: 9109643,\n darkolivegreen: 5597999,\n darkorange: 16747520,\n darkorchid: 10040012,\n darkred: 9109504,\n darksalmon: 15308410,\n darkseagreen: 9419919,\n darkslateblue: 4734347,\n darkslategray: 3100495,\n darkslategrey: 3100495,\n darkturquoise: 52945,\n darkviolet: 9699539,\n deeppink: 16716947,\n deepskyblue: 49151,\n dimgray: 6908265,\n dimgrey: 6908265,\n dodgerblue: 2003199,\n firebrick: 11674146,\n floralwhite: 16775920,\n forestgreen: 2263842,\n fuchsia: 16711935,\n gainsboro: 14474460,\n ghostwhite: 16316671,\n gold: 16766720,\n goldenrod: 14329120,\n gray: 8421504,\n green: 32768,\n greenyellow: 11403055,\n grey: 8421504,\n honeydew: 15794160,\n hotpink: 16738740,\n indianred: 13458524,\n indigo: 4915330,\n ivory: 16777200,\n khaki: 15787660,\n lavender: 15132410,\n lavenderblush: 16773365,\n lawngreen: 8190976,\n lemonchiffon: 16775885,\n lightblue: 11393254,\n lightcoral: 15761536,\n lightcyan: 14745599,\n lightgoldenrodyellow: 16448210,\n lightgray: 13882323,\n lightgreen: 9498256,\n lightgrey: 13882323,\n lightpink: 16758465,\n lightsalmon: 16752762,\n lightseagreen: 2142890,\n lightskyblue: 8900346,\n lightslategray: 7833753,\n lightslategrey: 7833753,\n lightsteelblue: 11584734,\n lightyellow: 16777184,\n lime: 65280,\n limegreen: 3329330,\n linen: 16445670,\n magenta: 16711935,\n maroon: 8388608,\n mediumaquamarine: 6737322,\n mediumblue: 205,\n mediumorchid: 12211667,\n mediumpurple: 9662683,\n mediumseagreen: 3978097,\n mediumslateblue: 8087790,\n mediumspringgreen: 64154,\n mediumturquoise: 4772300,\n mediumvioletred: 13047173,\n midnightblue: 1644912,\n mintcream: 16121850,\n mistyrose: 16770273,\n moccasin: 16770229,\n navajowhite: 16768685,\n navy: 128,\n oldlace: 16643558,\n olive: 8421376,\n olivedrab: 7048739,\n orange: 16753920,\n orangered: 16729344,\n orchid: 14315734,\n palegoldenrod: 15657130,\n palegreen: 10025880,\n paleturquoise: 11529966,\n palevioletred: 14381203,\n papayawhip: 16773077,\n peachpuff: 16767673,\n peru: 13468991,\n pink: 16761035,\n plum: 14524637,\n powderblue: 11591910,\n purple: 8388736,\n // Added in CSS Colors Level 4:\n // https://drafts.csswg.org/css-color/#changes-from-3\n rebeccapurple: 6697881,\n red: 16711680,\n rosybrown: 12357519,\n royalblue: 4286945,\n saddlebrown: 9127187,\n salmon: 16416882,\n sandybrown: 16032864,\n seagreen: 3050327,\n seashell: 16774638,\n sienna: 10506797,\n silver: 12632256,\n skyblue: 8900331,\n slateblue: 6970061,\n slategray: 7372944,\n slategrey: 7372944,\n snow: 16775930,\n springgreen: 65407,\n steelblue: 4620980,\n tan: 13808780,\n teal: 32896,\n thistle: 14204888,\n tomato: 16737095,\n turquoise: 4251856,\n violet: 15631086,\n wheat: 16113331,\n white: 16777215,\n whitesmoke: 16119285,\n yellow: 16776960,\n yellowgreen: 10145074\n };\n var named_default = named;\n\n // node_modules/culori/src/rgb/parseNamed.js\n var parseNamed = (color) => {\n return parseNumber_default(named_default[color.toLowerCase()], 6);\n };\n var parseNamed_default = parseNamed;\n\n // node_modules/culori/src/rgb/parseHex.js\n var hex = /^#?([0-9a-f]{8}|[0-9a-f]{6}|[0-9a-f]{4}|[0-9a-f]{3})$/i;\n var parseHex = (color) => {\n let match;\n return (match = color.match(hex)) ? parseNumber_default(parseInt(match[1], 16), match[1].length) : void 0;\n };\n var parseHex_default = parseHex;\n\n // node_modules/culori/src/util/regex.js\n var num = \"([+-]?\\\\d*\\\\.?\\\\d+(?:[eE][+-]?\\\\d+)?)\";\n var num_none = `(?:${num}|none)`;\n var per = `${num}%`;\n var per_none = `(?:${num}%|none)`;\n var num_per = `(?:${num}%|${num})`;\n var num_per_none = `(?:${num}%|${num}|none)`;\n var hue = `(?:${num}(deg|grad|rad|turn)|${num})`;\n var hue_none = `(?:${num}(deg|grad|rad|turn)|${num}|none)`;\n var c = `\\\\s*,\\\\s*`;\n var rx_num_per_none = new RegExp(\"^\" + num_per_none + \"$\");\n\n // node_modules/culori/src/rgb/parseRgbLegacy.js\n var rgb_num_old = new RegExp(\n `^rgba?\\\\(\\\\s*${num}${c}${num}${c}${num}\\\\s*(?:,\\\\s*${num_per}\\\\s*)?\\\\)$`\n );\n var rgb_per_old = new RegExp(\n `^rgba?\\\\(\\\\s*${per}${c}${per}${c}${per}\\\\s*(?:,\\\\s*${num_per}\\\\s*)?\\\\)$`\n );\n var parseRgbLegacy = (color) => {\n let res = { mode: \"rgb\" };\n let match;\n if (match = color.match(rgb_num_old)) {\n if (match[1] !== void 0) {\n res.r = match[1] / 255;\n }\n if (match[2] !== void 0) {\n res.g = match[2] / 255;\n }\n if (match[3] !== void 0) {\n res.b = match[3] / 255;\n }\n } else if (match = color.match(rgb_per_old)) {\n if (match[1] !== void 0) {\n res.r = match[1] / 100;\n }\n if (match[2] !== void 0) {\n res.g = match[2] / 100;\n }\n if (match[3] !== void 0) {\n res.b = match[3] / 100;\n }\n } else {\n return void 0;\n }\n if (match[4] !== void 0) {\n res.alpha = Math.max(0, Math.min(1, match[4] / 100));\n } else if (match[5] !== void 0) {\n res.alpha = Math.max(0, Math.min(1, +match[5]));\n }\n return res;\n };\n var parseRgbLegacy_default = parseRgbLegacy;\n\n // node_modules/culori/src/_prepare.js\n var prepare = (color, mode) => color === void 0 ? void 0 : typeof color !== \"object\" ? parse_default(color) : color.mode !== void 0 ? color : mode ? { ...color, mode } : void 0;\n var prepare_default = prepare;\n\n // node_modules/culori/src/converter.js\n var converter = (target_mode = \"rgb\") => (color) => (color = prepare_default(color, target_mode)) !== void 0 ? (\n // if the color's mode corresponds to our target mode\n color.mode === target_mode ? (\n // then just return the color\n color\n ) : (\n // otherwise check to see if we have a dedicated\n // converter for the target mode\n converters[color.mode][target_mode] ? (\n // and return its result...\n converters[color.mode][target_mode](color)\n ) : (\n // ...otherwise pass through RGB as an intermediary step.\n // if the target mode is RGB...\n target_mode === \"rgb\" ? (\n // just return the RGB\n converters[color.mode].rgb(color)\n ) : (\n // otherwise convert color.mode -> RGB -> target_mode\n converters.rgb[target_mode](converters[color.mode].rgb(color))\n )\n )\n )\n ) : void 0;\n var converter_default = converter;\n\n // node_modules/culori/src/modes.js\n var converters = {};\n var modes = {};\n var parsers = [];\n var colorProfiles = {};\n var identity = (v) => v;\n var useMode = (definition29) => {\n converters[definition29.mode] = {\n ...converters[definition29.mode],\n ...definition29.toMode\n };\n Object.keys(definition29.fromMode || {}).forEach((k4) => {\n if (!converters[k4]) {\n converters[k4] = {};\n }\n converters[k4][definition29.mode] = definition29.fromMode[k4];\n });\n if (!definition29.ranges) {\n definition29.ranges = {};\n }\n if (!definition29.difference) {\n definition29.difference = {};\n }\n definition29.channels.forEach((channel) => {\n if (definition29.ranges[channel] === void 0) {\n definition29.ranges[channel] = [0, 1];\n }\n if (!definition29.interpolate[channel]) {\n throw new Error(`Missing interpolator for: ${channel}`);\n }\n if (typeof definition29.interpolate[channel] === \"function\") {\n definition29.interpolate[channel] = {\n use: definition29.interpolate[channel]\n };\n }\n if (!definition29.interpolate[channel].fixup) {\n definition29.interpolate[channel].fixup = identity;\n }\n });\n modes[definition29.mode] = definition29;\n (definition29.parse || []).forEach((parser) => {\n useParser(parser, definition29.mode);\n });\n return converter_default(definition29.mode);\n };\n var getMode = (mode) => modes[mode];\n var useParser = (parser, mode) => {\n if (typeof parser === \"string\") {\n if (!mode) {\n throw new Error(`'mode' required when 'parser' is a string`);\n }\n colorProfiles[parser] = mode;\n } else if (typeof parser === \"function\") {\n if (parsers.indexOf(parser) < 0) {\n parsers.push(parser);\n }\n }\n };\n\n // node_modules/culori/src/parse.js\n var IdentStartCodePoint = /[^\\x00-\\x7F]|[a-zA-Z_]/;\n var IdentCodePoint = /[^\\x00-\\x7F]|[-\\w]/;\n var Tok = {\n Function: \"function\",\n Ident: \"ident\",\n Number: \"number\",\n Percentage: \"percentage\",\n ParenClose: \")\",\n None: \"none\",\n Hue: \"hue\",\n Alpha: \"alpha\"\n };\n var _i = 0;\n function is_num(chars) {\n let ch = chars[_i];\n let ch1 = chars[_i + 1];\n if (ch === \"-\" || ch === \"+\") {\n return /\\d/.test(ch1) || ch1 === \".\" && /\\d/.test(chars[_i + 2]);\n }\n if (ch === \".\") {\n return /\\d/.test(ch1);\n }\n return /\\d/.test(ch);\n }\n function is_ident(chars) {\n if (_i >= chars.length) {\n return false;\n }\n let ch = chars[_i];\n if (IdentStartCodePoint.test(ch)) {\n return true;\n }\n if (ch === \"-\") {\n if (chars.length - _i < 2) {\n return false;\n }\n let ch1 = chars[_i + 1];\n if (ch1 === \"-\" || IdentStartCodePoint.test(ch1)) {\n return true;\n }\n return false;\n }\n return false;\n }\n var huenits = {\n deg: 1,\n rad: 180 / Math.PI,\n grad: 9 / 10,\n turn: 360\n };\n function num2(chars) {\n let value = \"\";\n if (chars[_i] === \"-\" || chars[_i] === \"+\") {\n value += chars[_i++];\n }\n value += digits(chars);\n if (chars[_i] === \".\" && /\\d/.test(chars[_i + 1])) {\n value += chars[_i++] + digits(chars);\n }\n if (chars[_i] === \"e\" || chars[_i] === \"E\") {\n if ((chars[_i + 1] === \"-\" || chars[_i + 1] === \"+\") && /\\d/.test(chars[_i + 2])) {\n value += chars[_i++] + chars[_i++] + digits(chars);\n } else if (/\\d/.test(chars[_i + 1])) {\n value += chars[_i++] + digits(chars);\n }\n }\n if (is_ident(chars)) {\n let id = ident(chars);\n if (id === \"deg\" || id === \"rad\" || id === \"turn\" || id === \"grad\") {\n return { type: Tok.Hue, value: value * huenits[id] };\n }\n return void 0;\n }\n if (chars[_i] === \"%\") {\n _i++;\n return { type: Tok.Percentage, value: +value };\n }\n return { type: Tok.Number, value: +value };\n }\n function digits(chars) {\n let v = \"\";\n while (/\\d/.test(chars[_i])) {\n v += chars[_i++];\n }\n return v;\n }\n function ident(chars) {\n let v = \"\";\n while (_i < chars.length && IdentCodePoint.test(chars[_i])) {\n v += chars[_i++];\n }\n return v;\n }\n function identlike(chars) {\n let v = ident(chars);\n if (chars[_i] === \"(\") {\n _i++;\n return { type: Tok.Function, value: v };\n }\n if (v === \"none\") {\n return { type: Tok.None, value: void 0 };\n }\n return { type: Tok.Ident, value: v };\n }\n function tokenize(str = \"\") {\n let chars = str.trim();\n let tokens = [];\n let ch;\n _i = 0;\n while (_i < chars.length) {\n ch = chars[_i++];\n if (ch === \"\\n\" || ch === \"\t\" || ch === \" \") {\n while (_i < chars.length && (chars[_i] === \"\\n\" || chars[_i] === \"\t\" || chars[_i] === \" \")) {\n _i++;\n }\n continue;\n }\n if (ch === \",\") {\n return void 0;\n }\n if (ch === \")\") {\n tokens.push({ type: Tok.ParenClose });\n continue;\n }\n if (ch === \"+\") {\n _i--;\n if (is_num(chars)) {\n tokens.push(num2(chars));\n continue;\n }\n return void 0;\n }\n if (ch === \"-\") {\n _i--;\n if (is_num(chars)) {\n tokens.push(num2(chars));\n continue;\n }\n if (is_ident(chars)) {\n tokens.push({ type: Tok.Ident, value: ident(chars) });\n continue;\n }\n return void 0;\n }\n if (ch === \".\") {\n _i--;\n if (is_num(chars)) {\n tokens.push(num2(chars));\n continue;\n }\n return void 0;\n }\n if (ch === \"/\") {\n while (_i < chars.length && (chars[_i] === \"\\n\" || chars[_i] === \"\t\" || chars[_i] === \" \")) {\n _i++;\n }\n let alpha2;\n if (is_num(chars)) {\n alpha2 = num2(chars);\n if (alpha2.type !== Tok.Hue) {\n tokens.push({ type: Tok.Alpha, value: alpha2 });\n continue;\n }\n }\n if (is_ident(chars)) {\n if (ident(chars) === \"none\") {\n tokens.push({\n type: Tok.Alpha,\n value: { type: Tok.None, value: void 0 }\n });\n continue;\n }\n }\n return void 0;\n }\n if (/\\d/.test(ch)) {\n _i--;\n tokens.push(num2(chars));\n continue;\n }\n if (IdentStartCodePoint.test(ch)) {\n _i--;\n tokens.push(identlike(chars));\n continue;\n }\n return void 0;\n }\n return tokens;\n }\n function parseColorSyntax(tokens) {\n tokens._i = 0;\n let token = tokens[tokens._i++];\n if (!token || token.type !== Tok.Function || token.value !== \"color\") {\n return void 0;\n }\n token = tokens[tokens._i++];\n if (token.type !== Tok.Ident) {\n return void 0;\n }\n const mode = colorProfiles[token.value];\n if (!mode) {\n return void 0;\n }\n const res = { mode };\n const coords = consumeCoords(tokens, false);\n if (!coords) {\n return void 0;\n }\n const channels = getMode(mode).channels;\n for (let ii = 0, c2, ch; ii < channels.length; ii++) {\n c2 = coords[ii];\n ch = channels[ii];\n if (c2.type !== Tok.None) {\n res[ch] = c2.type === Tok.Number ? c2.value : c2.value / 100;\n if (ch === \"alpha\") {\n res[ch] = Math.max(0, Math.min(1, res[ch]));\n }\n }\n }\n return res;\n }\n function consumeCoords(tokens, includeHue) {\n const coords = [];\n let token;\n while (tokens._i < tokens.length) {\n token = tokens[tokens._i++];\n if (token.type === Tok.None || token.type === Tok.Number || token.type === Tok.Alpha || token.type === Tok.Percentage || includeHue && token.type === Tok.Hue) {\n coords.push(token);\n continue;\n }\n if (token.type === Tok.ParenClose) {\n if (tokens._i < tokens.length) {\n return void 0;\n }\n continue;\n }\n return void 0;\n }\n if (coords.length < 3 || coords.length > 4) {\n return void 0;\n }\n if (coords.length === 4) {\n if (coords[3].type !== Tok.Alpha) {\n return void 0;\n }\n coords[3] = coords[3].value;\n }\n if (coords.length === 3) {\n coords.push({ type: Tok.None, value: void 0 });\n }\n return coords.every((c2) => c2.type !== Tok.Alpha) ? coords : void 0;\n }\n function parseModernSyntax(tokens, includeHue) {\n tokens._i = 0;\n let token = tokens[tokens._i++];\n if (!token || token.type !== Tok.Function) {\n return void 0;\n }\n let coords = consumeCoords(tokens, includeHue);\n if (!coords) {\n return void 0;\n }\n coords.unshift(token.value);\n return coords;\n }\n var parse = (color) => {\n if (typeof color !== \"string\") {\n return void 0;\n }\n const tokens = tokenize(color);\n const parsed = tokens ? parseModernSyntax(tokens, true) : void 0;\n let result = void 0;\n let i = 0;\n let len = parsers.length;\n while (i < len) {\n if ((result = parsers[i++](color, parsed)) !== void 0) {\n return result;\n }\n }\n return tokens ? parseColorSyntax(tokens) : void 0;\n };\n var parse_default = parse;\n\n // node_modules/culori/src/rgb/parseRgb.js\n function parseRgb(color, parsed) {\n if (!parsed || parsed[0] !== \"rgb\" && parsed[0] !== \"rgba\") {\n return void 0;\n }\n const res = { mode: \"rgb\" };\n const [, r2, g, b, alpha2] = parsed;\n if (r2.type === Tok.Hue || g.type === Tok.Hue || b.type === Tok.Hue) {\n return void 0;\n }\n if (r2.type !== Tok.None) {\n res.r = r2.type === Tok.Number ? r2.value / 255 : r2.value / 100;\n }\n if (g.type !== Tok.None) {\n res.g = g.type === Tok.Number ? g.value / 255 : g.value / 100;\n }\n if (b.type !== Tok.None) {\n res.b = b.type === Tok.Number ? b.value / 255 : b.value / 100;\n }\n if (alpha2.type !== Tok.None) {\n res.alpha = Math.min(\n 1,\n Math.max(\n 0,\n alpha2.type === Tok.Number ? alpha2.value : alpha2.value / 100\n )\n );\n }\n return res;\n }\n var parseRgb_default = parseRgb;\n\n // node_modules/culori/src/rgb/parseTransparent.js\n var parseTransparent = (c2) => c2 === \"transparent\" ? { mode: \"rgb\", r: 0, g: 0, b: 0, alpha: 0 } : void 0;\n var parseTransparent_default = parseTransparent;\n\n // node_modules/culori/src/interpolate/lerp.js\n var lerp = (a, b, t) => a + t * (b - a);\n\n // node_modules/culori/src/interpolate/piecewise.js\n var get_classes = (arr) => {\n let classes = [];\n for (let i = 0; i < arr.length - 1; i++) {\n let a = arr[i];\n let b = arr[i + 1];\n if (a === void 0 && b === void 0) {\n classes.push(void 0);\n } else if (a !== void 0 && b !== void 0) {\n classes.push([a, b]);\n } else {\n classes.push(a !== void 0 ? [a, a] : [b, b]);\n }\n }\n return classes;\n };\n var interpolatorPiecewise = (interpolator) => (arr) => {\n let classes = get_classes(arr);\n return (t) => {\n let cls = t * classes.length;\n let idx = t >= 1 ? classes.length - 1 : Math.max(Math.floor(cls), 0);\n let pair = classes[idx];\n return pair === void 0 ? void 0 : interpolator(pair[0], pair[1], cls - idx);\n };\n };\n\n // node_modules/culori/src/interpolate/linear.js\n var interpolatorLinear = interpolatorPiecewise(lerp);\n\n // node_modules/culori/src/fixup/alpha.js\n var fixupAlpha = (arr) => {\n let some_defined = false;\n let res = arr.map((v) => {\n if (v !== void 0) {\n some_defined = true;\n return v;\n }\n return 1;\n });\n return some_defined ? res : arr;\n };\n\n // node_modules/culori/src/rgb/definition.js\n var definition = {\n mode: \"rgb\",\n channels: [\"r\", \"g\", \"b\", \"alpha\"],\n parse: [\n parseRgb_default,\n parseHex_default,\n parseRgbLegacy_default,\n parseNamed_default,\n parseTransparent_default,\n \"srgb\"\n ],\n serialize: \"srgb\",\n interpolate: {\n r: interpolatorLinear,\n g: interpolatorLinear,\n b: interpolatorLinear,\n alpha: { use: interpolatorLinear, fixup: fixupAlpha }\n },\n gamut: true,\n white: { r: 1, g: 1, b: 1 },\n black: { r: 0, g: 0, b: 0 }\n };\n var definition_default = definition;\n\n // node_modules/culori/src/a98/convertA98ToXyz65.js\n var linearize = (v = 0) => Math.pow(Math.abs(v), 563 / 256) * Math.sign(v);\n var convertA98ToXyz65 = (a982) => {\n let r2 = linearize(a982.r);\n let g = linearize(a982.g);\n let b = linearize(a982.b);\n let res = {\n mode: \"xyz65\",\n x: 0.5766690429101305 * r2 + 0.1855582379065463 * g + 0.1882286462349947 * b,\n y: 0.297344975250536 * r2 + 0.6273635662554661 * g + 0.0752914584939979 * b,\n z: 0.0270313613864123 * r2 + 0.0706888525358272 * g + 0.9913375368376386 * b\n };\n if (a982.alpha !== void 0) {\n res.alpha = a982.alpha;\n }\n return res;\n };\n var convertA98ToXyz65_default = convertA98ToXyz65;\n\n // node_modules/culori/src/a98/convertXyz65ToA98.js\n var gamma = (v) => Math.pow(Math.abs(v), 256 / 563) * Math.sign(v);\n var convertXyz65ToA98 = ({ x, y, z, alpha: alpha2 }) => {\n if (x === void 0) x = 0;\n if (y === void 0) y = 0;\n if (z === void 0) z = 0;\n let res = {\n mode: \"a98\",\n r: gamma(\n x * 2.0415879038107465 - y * 0.5650069742788597 - 0.3447313507783297 * z\n ),\n g: gamma(\n x * -0.9692436362808798 + y * 1.8759675015077206 + 0.0415550574071756 * z\n ),\n b: gamma(\n x * 0.0134442806320312 - y * 0.1183623922310184 + 1.0151749943912058 * z\n )\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertXyz65ToA98_default = convertXyz65ToA98;\n\n // node_modules/culori/src/lrgb/convertRgbToLrgb.js\n var fn = (c2 = 0) => {\n const abs2 = Math.abs(c2);\n if (abs2 <= 0.04045) {\n return c2 / 12.92;\n }\n return (Math.sign(c2) || 1) * Math.pow((abs2 + 0.055) / 1.055, 2.4);\n };\n var convertRgbToLrgb = ({ r: r2, g, b, alpha: alpha2 }) => {\n let res = {\n mode: \"lrgb\",\n r: fn(r2),\n g: fn(g),\n b: fn(b)\n };\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n };\n var convertRgbToLrgb_default = convertRgbToLrgb;\n\n // node_modules/culori/src/xyz65/convertRgbToXyz65.js\n var convertRgbToXyz65 = (rgb4) => {\n let { r: r2, g, b, alpha: alpha2 } = convertRgbToLrgb_default(rgb4);\n let res = {\n mode: \"xyz65\",\n x: 0.4123907992659593 * r2 + 0.357584339383878 * g + 0.1804807884018343 * b,\n y: 0.2126390058715102 * r2 + 0.715168678767756 * g + 0.0721923153607337 * b,\n z: 0.0193308187155918 * r2 + 0.119194779794626 * g + 0.9505321522496607 * b\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertRgbToXyz65_default = convertRgbToXyz65;\n\n // node_modules/culori/src/lrgb/convertLrgbToRgb.js\n var fn2 = (c2 = 0) => {\n const abs2 = Math.abs(c2);\n if (abs2 > 31308e-7) {\n return (Math.sign(c2) || 1) * (1.055 * Math.pow(abs2, 1 / 2.4) - 0.055);\n }\n return c2 * 12.92;\n };\n var convertLrgbToRgb = ({ r: r2, g, b, alpha: alpha2 }, mode = \"rgb\") => {\n let res = {\n mode,\n r: fn2(r2),\n g: fn2(g),\n b: fn2(b)\n };\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n };\n var convertLrgbToRgb_default = convertLrgbToRgb;\n\n // node_modules/culori/src/xyz65/convertXyz65ToRgb.js\n var convertXyz65ToRgb = ({ x, y, z, alpha: alpha2 }) => {\n if (x === void 0) x = 0;\n if (y === void 0) y = 0;\n if (z === void 0) z = 0;\n let res = convertLrgbToRgb_default({\n r: x * 3.2409699419045226 - y * 1.537383177570094 - 0.4986107602930034 * z,\n g: x * -0.9692436362808796 + y * 1.8759675015077204 + 0.0415550574071756 * z,\n b: x * 0.0556300796969936 - y * 0.2039769588889765 + 1.0569715142428784 * z\n });\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertXyz65ToRgb_default = convertXyz65ToRgb;\n\n // node_modules/culori/src/a98/definition.js\n var definition2 = {\n ...definition_default,\n mode: \"a98\",\n parse: [\"a98-rgb\"],\n serialize: \"a98-rgb\",\n fromMode: {\n rgb: (color) => convertXyz65ToA98_default(convertRgbToXyz65_default(color)),\n xyz65: convertXyz65ToA98_default\n },\n toMode: {\n rgb: (color) => convertXyz65ToRgb_default(convertA98ToXyz65_default(color)),\n xyz65: convertA98ToXyz65_default\n }\n };\n var definition_default2 = definition2;\n\n // node_modules/culori/src/util/normalizeHue.js\n var normalizeHue = (hue3) => (hue3 = hue3 % 360) < 0 ? hue3 + 360 : hue3;\n var normalizeHue_default = normalizeHue;\n\n // node_modules/culori/src/fixup/hue.js\n var hue2 = (hues, fn5) => {\n return hues.map((hue3, idx, arr) => {\n if (hue3 === void 0) {\n return hue3;\n }\n let normalized = normalizeHue_default(hue3);\n if (idx === 0 || hues[idx - 1] === void 0) {\n return normalized;\n }\n return fn5(normalized - normalizeHue_default(arr[idx - 1]));\n }).reduce((acc, curr) => {\n if (!acc.length || curr === void 0 || acc[acc.length - 1] === void 0) {\n acc.push(curr);\n return acc;\n }\n acc.push(curr + acc[acc.length - 1]);\n return acc;\n }, []);\n };\n var fixupHueShorter = (arr) => hue2(arr, (d) => Math.abs(d) <= 180 ? d : d - 360 * Math.sign(d));\n\n // node_modules/culori/src/cubehelix/constants.js\n var M = [-0.14861, 1.78277, -0.29227, -0.90649, 1.97294, 0];\n var degToRad = Math.PI / 180;\n var radToDeg = 180 / Math.PI;\n\n // node_modules/culori/src/cubehelix/convertRgbToCubehelix.js\n var DE = M[3] * M[4];\n var BE = M[1] * M[4];\n var BCAD = M[1] * M[2] - M[0] * M[3];\n var convertRgbToCubehelix = ({ r: r2, g, b, alpha: alpha2 }) => {\n if (r2 === void 0) r2 = 0;\n if (g === void 0) g = 0;\n if (b === void 0) b = 0;\n let l = (BCAD * b + r2 * DE - g * BE) / (BCAD + DE - BE);\n let x = b - l;\n let y = (M[4] * (g - l) - M[2] * x) / M[3];\n let res = {\n mode: \"cubehelix\",\n l,\n s: l === 0 || l === 1 ? void 0 : Math.sqrt(x * x + y * y) / (M[4] * l * (1 - l))\n };\n if (res.s) res.h = Math.atan2(y, x) * radToDeg - 120;\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n };\n var convertRgbToCubehelix_default = convertRgbToCubehelix;\n\n // node_modules/culori/src/cubehelix/convertCubehelixToRgb.js\n var convertCubehelixToRgb = ({ h, s, l, alpha: alpha2 }) => {\n let res = { mode: \"rgb\" };\n h = (h === void 0 ? 0 : h + 120) * degToRad;\n if (l === void 0) l = 0;\n let amp = s === void 0 ? 0 : s * l * (1 - l);\n let cosh = Math.cos(h);\n let sinh = Math.sin(h);\n res.r = l + amp * (M[0] * cosh + M[1] * sinh);\n res.g = l + amp * (M[2] * cosh + M[3] * sinh);\n res.b = l + amp * (M[4] * cosh + M[5] * sinh);\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n };\n var convertCubehelixToRgb_default = convertCubehelixToRgb;\n\n // node_modules/culori/src/difference.js\n var differenceHueSaturation = (std, smp) => {\n if (std.h === void 0 || smp.h === void 0 || !std.s || !smp.s) {\n return 0;\n }\n let std_h = normalizeHue_default(std.h);\n let smp_h = normalizeHue_default(smp.h);\n let dH = Math.sin((smp_h - std_h + 360) / 2 * Math.PI / 180);\n return 2 * Math.sqrt(std.s * smp.s) * dH;\n };\n var differenceHueNaive = (std, smp) => {\n if (std.h === void 0 || smp.h === void 0) {\n return 0;\n }\n let std_h = normalizeHue_default(std.h);\n let smp_h = normalizeHue_default(smp.h);\n if (Math.abs(smp_h - std_h) > 180) {\n return std_h - (smp_h - 360 * Math.sign(smp_h - std_h));\n }\n return smp_h - std_h;\n };\n var differenceHueChroma = (std, smp) => {\n if (std.h === void 0 || smp.h === void 0 || !std.c || !smp.c) {\n return 0;\n }\n let std_h = normalizeHue_default(std.h);\n let smp_h = normalizeHue_default(smp.h);\n let dH = Math.sin((smp_h - std_h + 360) / 2 * Math.PI / 180);\n return 2 * Math.sqrt(std.c * smp.c) * dH;\n };\n\n // node_modules/culori/src/average.js\n var averageAngle = (val) => {\n let sum = val.reduce(\n (sum2, val2) => {\n if (val2 !== void 0) {\n let rad = val2 * Math.PI / 180;\n sum2.sin += Math.sin(rad);\n sum2.cos += Math.cos(rad);\n }\n return sum2;\n },\n { sin: 0, cos: 0 }\n );\n let angle = Math.atan2(sum.sin, sum.cos) * 180 / Math.PI;\n return angle < 0 ? 360 + angle : angle;\n };\n\n // node_modules/culori/src/cubehelix/definition.js\n var definition3 = {\n mode: \"cubehelix\",\n channels: [\"h\", \"s\", \"l\", \"alpha\"],\n parse: [\"--cubehelix\"],\n serialize: \"--cubehelix\",\n ranges: {\n h: [0, 360],\n s: [0, 4.614],\n l: [0, 1]\n },\n fromMode: {\n rgb: convertRgbToCubehelix_default\n },\n toMode: {\n rgb: convertCubehelixToRgb_default\n },\n interpolate: {\n h: {\n use: interpolatorLinear,\n fixup: fixupHueShorter\n },\n s: interpolatorLinear,\n l: interpolatorLinear,\n alpha: {\n use: interpolatorLinear,\n fixup: fixupAlpha\n }\n },\n difference: {\n h: differenceHueSaturation\n },\n average: {\n h: averageAngle\n }\n };\n var definition_default3 = definition3;\n\n // node_modules/culori/src/lch/convertLabToLch.js\n var convertLabToLch = ({ l, a, b, alpha: alpha2 }, mode = \"lch\") => {\n if (a === void 0) a = 0;\n if (b === void 0) b = 0;\n let c2 = Math.sqrt(a * a + b * b);\n let res = { mode, l, c: c2 };\n if (c2) res.h = normalizeHue_default(Math.atan2(b, a) * 180 / Math.PI);\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n };\n var convertLabToLch_default = convertLabToLch;\n\n // node_modules/culori/src/lch/convertLchToLab.js\n var convertLchToLab = ({ l, c: c2, h, alpha: alpha2 }, mode = \"lab\") => {\n if (h === void 0) h = 0;\n let res = {\n mode,\n l,\n a: c2 ? c2 * Math.cos(h / 180 * Math.PI) : 0,\n b: c2 ? c2 * Math.sin(h / 180 * Math.PI) : 0\n };\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n };\n var convertLchToLab_default = convertLchToLab;\n\n // node_modules/culori/src/xyz65/constants.js\n var k = Math.pow(29, 3) / Math.pow(3, 3);\n var e = Math.pow(6, 3) / Math.pow(29, 3);\n\n // node_modules/culori/src/constants.js\n var D50 = {\n X: 0.3457 / 0.3585,\n Y: 1,\n Z: (1 - 0.3457 - 0.3585) / 0.3585\n };\n var D65 = {\n X: 0.3127 / 0.329,\n Y: 1,\n Z: (1 - 0.3127 - 0.329) / 0.329\n };\n var k2 = Math.pow(29, 3) / Math.pow(3, 3);\n var e2 = Math.pow(6, 3) / Math.pow(29, 3);\n\n // node_modules/culori/src/lab65/convertLab65ToXyz65.js\n var fn3 = (v) => Math.pow(v, 3) > e ? Math.pow(v, 3) : (116 * v - 16) / k;\n var convertLab65ToXyz65 = ({ l, a, b, alpha: alpha2 }) => {\n if (l === void 0) l = 0;\n if (a === void 0) a = 0;\n if (b === void 0) b = 0;\n let fy = (l + 16) / 116;\n let fx = a / 500 + fy;\n let fz = fy - b / 200;\n let res = {\n mode: \"xyz65\",\n x: fn3(fx) * D65.X,\n y: fn3(fy) * D65.Y,\n z: fn3(fz) * D65.Z\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertLab65ToXyz65_default = convertLab65ToXyz65;\n\n // node_modules/culori/src/lab65/convertLab65ToRgb.js\n var convertLab65ToRgb = (lab2) => convertXyz65ToRgb_default(convertLab65ToXyz65_default(lab2));\n var convertLab65ToRgb_default = convertLab65ToRgb;\n\n // node_modules/culori/src/lab65/convertXyz65ToLab65.js\n var f = (value) => value > e ? Math.cbrt(value) : (k * value + 16) / 116;\n var convertXyz65ToLab65 = ({ x, y, z, alpha: alpha2 }) => {\n if (x === void 0) x = 0;\n if (y === void 0) y = 0;\n if (z === void 0) z = 0;\n let f0 = f(x / D65.X);\n let f1 = f(y / D65.Y);\n let f22 = f(z / D65.Z);\n let res = {\n mode: \"lab65\",\n l: 116 * f1 - 16,\n a: 500 * (f0 - f1),\n b: 200 * (f1 - f22)\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertXyz65ToLab65_default = convertXyz65ToLab65;\n\n // node_modules/culori/src/lab65/convertRgbToLab65.js\n var convertRgbToLab65 = (rgb4) => {\n let res = convertXyz65ToLab65_default(convertRgbToXyz65_default(rgb4));\n if (rgb4.r === rgb4.b && rgb4.b === rgb4.g) {\n res.a = res.b = 0;\n }\n return res;\n };\n var convertRgbToLab65_default = convertRgbToLab65;\n\n // node_modules/culori/src/dlch/constants.js\n var kE = 1;\n var kCH = 1;\n var \\u03B8 = 26 / 180 * Math.PI;\n var cos\\u03B8 = Math.cos(\\u03B8);\n var sin\\u03B8 = Math.sin(\\u03B8);\n var factor = 100 / Math.log(139 / 100);\n\n // node_modules/culori/src/dlch/convertDlchToLab65.js\n var convertDlchToLab65 = ({ l, c: c2, h, alpha: alpha2 }) => {\n if (l === void 0) l = 0;\n if (c2 === void 0) c2 = 0;\n if (h === void 0) h = 0;\n let res = {\n mode: \"lab65\",\n l: (Math.exp(l * kE / factor) - 1) / 39e-4\n };\n let G = (Math.exp(0.0435 * c2 * kCH * kE) - 1) / 0.075;\n let e4 = G * Math.cos(h / 180 * Math.PI - \\u03B8);\n let f3 = G * Math.sin(h / 180 * Math.PI - \\u03B8);\n res.a = e4 * cos\\u03B8 - f3 / 0.83 * sin\\u03B8;\n res.b = e4 * sin\\u03B8 + f3 / 0.83 * cos\\u03B8;\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n };\n var convertDlchToLab65_default = convertDlchToLab65;\n\n // node_modules/culori/src/dlch/convertLab65ToDlch.js\n var convertLab65ToDlch = ({ l, a, b, alpha: alpha2 }) => {\n if (l === void 0) l = 0;\n if (a === void 0) a = 0;\n if (b === void 0) b = 0;\n let e4 = a * cos\\u03B8 + b * sin\\u03B8;\n let f3 = 0.83 * (b * cos\\u03B8 - a * sin\\u03B8);\n let G = Math.sqrt(e4 * e4 + f3 * f3);\n let res = {\n mode: \"dlch\",\n l: factor / kE * Math.log(1 + 39e-4 * l),\n c: Math.log(1 + 0.075 * G) / (0.0435 * kCH * kE)\n };\n if (res.c) {\n res.h = normalizeHue_default((Math.atan2(f3, e4) + \\u03B8) / Math.PI * 180);\n }\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n };\n var convertLab65ToDlch_default = convertLab65ToDlch;\n\n // node_modules/culori/src/dlab/definition.js\n var convertDlabToLab65 = (c2) => convertDlchToLab65_default(convertLabToLch_default(c2, \"dlch\"));\n var convertLab65ToDlab = (c2) => convertLchToLab_default(convertLab65ToDlch_default(c2), \"dlab\");\n var definition4 = {\n mode: \"dlab\",\n parse: [\"--din99o-lab\"],\n serialize: \"--din99o-lab\",\n toMode: {\n lab65: convertDlabToLab65,\n rgb: (c2) => convertLab65ToRgb_default(convertDlabToLab65(c2))\n },\n fromMode: {\n lab65: convertLab65ToDlab,\n rgb: (c2) => convertLab65ToDlab(convertRgbToLab65_default(c2))\n },\n channels: [\"l\", \"a\", \"b\", \"alpha\"],\n ranges: {\n l: [0, 100],\n a: [-40.09, 45.501],\n b: [-40.469, 44.344]\n },\n interpolate: {\n l: interpolatorLinear,\n a: interpolatorLinear,\n b: interpolatorLinear,\n alpha: {\n use: interpolatorLinear,\n fixup: fixupAlpha\n }\n }\n };\n var definition_default4 = definition4;\n\n // node_modules/culori/src/dlch/definition.js\n var definition5 = {\n mode: \"dlch\",\n parse: [\"--din99o-lch\"],\n serialize: \"--din99o-lch\",\n toMode: {\n lab65: convertDlchToLab65_default,\n dlab: (c2) => convertLchToLab_default(c2, \"dlab\"),\n rgb: (c2) => convertLab65ToRgb_default(convertDlchToLab65_default(c2))\n },\n fromMode: {\n lab65: convertLab65ToDlch_default,\n dlab: (c2) => convertLabToLch_default(c2, \"dlch\"),\n rgb: (c2) => convertLab65ToDlch_default(convertRgbToLab65_default(c2))\n },\n channels: [\"l\", \"c\", \"h\", \"alpha\"],\n ranges: {\n l: [0, 100],\n c: [0, 51.484],\n h: [0, 360]\n },\n interpolate: {\n l: interpolatorLinear,\n c: interpolatorLinear,\n h: {\n use: interpolatorLinear,\n fixup: fixupHueShorter\n },\n alpha: {\n use: interpolatorLinear,\n fixup: fixupAlpha\n }\n },\n difference: {\n h: differenceHueChroma\n },\n average: {\n h: averageAngle\n }\n };\n var definition_default5 = definition5;\n\n // node_modules/culori/src/hsi/convertHsiToRgb.js\n function convertHsiToRgb({ h, s, i, alpha: alpha2 }) {\n h = normalizeHue_default(h !== void 0 ? h : 0);\n if (s === void 0) s = 0;\n if (i === void 0) i = 0;\n let f3 = Math.abs(h / 60 % 2 - 1);\n let res;\n switch (Math.floor(h / 60)) {\n case 0:\n res = {\n r: i * (1 + s * (3 / (2 - f3) - 1)),\n g: i * (1 + s * (3 * (1 - f3) / (2 - f3) - 1)),\n b: i * (1 - s)\n };\n break;\n case 1:\n res = {\n r: i * (1 + s * (3 * (1 - f3) / (2 - f3) - 1)),\n g: i * (1 + s * (3 / (2 - f3) - 1)),\n b: i * (1 - s)\n };\n break;\n case 2:\n res = {\n r: i * (1 - s),\n g: i * (1 + s * (3 / (2 - f3) - 1)),\n b: i * (1 + s * (3 * (1 - f3) / (2 - f3) - 1))\n };\n break;\n case 3:\n res = {\n r: i * (1 - s),\n g: i * (1 + s * (3 * (1 - f3) / (2 - f3) - 1)),\n b: i * (1 + s * (3 / (2 - f3) - 1))\n };\n break;\n case 4:\n res = {\n r: i * (1 + s * (3 * (1 - f3) / (2 - f3) - 1)),\n g: i * (1 - s),\n b: i * (1 + s * (3 / (2 - f3) - 1))\n };\n break;\n case 5:\n res = {\n r: i * (1 + s * (3 / (2 - f3) - 1)),\n g: i * (1 - s),\n b: i * (1 + s * (3 * (1 - f3) / (2 - f3) - 1))\n };\n break;\n default:\n res = { r: i * (1 - s), g: i * (1 - s), b: i * (1 - s) };\n }\n res.mode = \"rgb\";\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n }\n\n // node_modules/culori/src/hsi/convertRgbToHsi.js\n function convertRgbToHsi({ r: r2, g, b, alpha: alpha2 }) {\n if (r2 === void 0) r2 = 0;\n if (g === void 0) g = 0;\n if (b === void 0) b = 0;\n let M3 = Math.max(r2, g, b), m = Math.min(r2, g, b);\n let res = {\n mode: \"hsi\",\n s: r2 + g + b === 0 ? 0 : 1 - 3 * m / (r2 + g + b),\n i: (r2 + g + b) / 3\n };\n if (M3 - m !== 0)\n res.h = (M3 === r2 ? (g - b) / (M3 - m) + (g < b) * 6 : M3 === g ? (b - r2) / (M3 - m) + 2 : (r2 - g) / (M3 - m) + 4) * 60;\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n }\n\n // node_modules/culori/src/hsi/definition.js\n var definition6 = {\n mode: \"hsi\",\n toMode: {\n rgb: convertHsiToRgb\n },\n parse: [\"--hsi\"],\n serialize: \"--hsi\",\n fromMode: {\n rgb: convertRgbToHsi\n },\n channels: [\"h\", \"s\", \"i\", \"alpha\"],\n ranges: {\n h: [0, 360]\n },\n gamut: \"rgb\",\n interpolate: {\n h: { use: interpolatorLinear, fixup: fixupHueShorter },\n s: interpolatorLinear,\n i: interpolatorLinear,\n alpha: { use: interpolatorLinear, fixup: fixupAlpha }\n },\n difference: {\n h: differenceHueSaturation\n },\n average: {\n h: averageAngle\n }\n };\n var definition_default6 = definition6;\n\n // node_modules/culori/src/hsl/convertHslToRgb.js\n function convertHslToRgb({ h, s, l, alpha: alpha2 }) {\n h = normalizeHue_default(h !== void 0 ? h : 0);\n if (s === void 0) s = 0;\n if (l === void 0) l = 0;\n let m1 = l + s * (l < 0.5 ? l : 1 - l);\n let m2 = m1 - (m1 - l) * 2 * Math.abs(h / 60 % 2 - 1);\n let res;\n switch (Math.floor(h / 60)) {\n case 0:\n res = { r: m1, g: m2, b: 2 * l - m1 };\n break;\n case 1:\n res = { r: m2, g: m1, b: 2 * l - m1 };\n break;\n case 2:\n res = { r: 2 * l - m1, g: m1, b: m2 };\n break;\n case 3:\n res = { r: 2 * l - m1, g: m2, b: m1 };\n break;\n case 4:\n res = { r: m2, g: 2 * l - m1, b: m1 };\n break;\n case 5:\n res = { r: m1, g: 2 * l - m1, b: m2 };\n break;\n default:\n res = { r: 2 * l - m1, g: 2 * l - m1, b: 2 * l - m1 };\n }\n res.mode = \"rgb\";\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n }\n\n // node_modules/culori/src/hsl/convertRgbToHsl.js\n function convertRgbToHsl({ r: r2, g, b, alpha: alpha2 }) {\n if (r2 === void 0) r2 = 0;\n if (g === void 0) g = 0;\n if (b === void 0) b = 0;\n let M3 = Math.max(r2, g, b), m = Math.min(r2, g, b);\n let res = {\n mode: \"hsl\",\n s: M3 === m ? 0 : (M3 - m) / (1 - Math.abs(M3 + m - 1)),\n l: 0.5 * (M3 + m)\n };\n if (M3 - m !== 0)\n res.h = (M3 === r2 ? (g - b) / (M3 - m) + (g < b) * 6 : M3 === g ? (b - r2) / (M3 - m) + 2 : (r2 - g) / (M3 - m) + 4) * 60;\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n }\n\n // node_modules/culori/src/util/hue.js\n var hueToDeg = (val, unit) => {\n switch (unit) {\n case \"deg\":\n return +val;\n case \"rad\":\n return val / Math.PI * 180;\n case \"grad\":\n return val / 10 * 9;\n case \"turn\":\n return val * 360;\n }\n };\n var hue_default = hueToDeg;\n\n // node_modules/culori/src/hsl/parseHslLegacy.js\n var hsl_old = new RegExp(\n `^hsla?\\\\(\\\\s*${hue}${c}${per}${c}${per}\\\\s*(?:,\\\\s*${num_per}\\\\s*)?\\\\)$`\n );\n var parseHslLegacy = (color) => {\n let match = color.match(hsl_old);\n if (!match) return;\n let res = { mode: \"hsl\" };\n if (match[3] !== void 0) {\n res.h = +match[3];\n } else if (match[1] !== void 0 && match[2] !== void 0) {\n res.h = hue_default(match[1], match[2]);\n }\n if (match[4] !== void 0) {\n res.s = Math.min(Math.max(0, match[4] / 100), 1);\n }\n if (match[5] !== void 0) {\n res.l = Math.min(Math.max(0, match[5] / 100), 1);\n }\n if (match[6] !== void 0) {\n res.alpha = Math.max(0, Math.min(1, match[6] / 100));\n } else if (match[7] !== void 0) {\n res.alpha = Math.max(0, Math.min(1, +match[7]));\n }\n return res;\n };\n var parseHslLegacy_default = parseHslLegacy;\n\n // node_modules/culori/src/hsl/parseHsl.js\n function parseHsl(color, parsed) {\n if (!parsed || parsed[0] !== \"hsl\" && parsed[0] !== \"hsla\") {\n return void 0;\n }\n const res = { mode: \"hsl\" };\n const [, h, s, l, alpha2] = parsed;\n if (h.type !== Tok.None) {\n if (h.type === Tok.Percentage) {\n return void 0;\n }\n res.h = h.value;\n }\n if (s.type !== Tok.None) {\n if (s.type === Tok.Hue) {\n return void 0;\n }\n res.s = s.value / 100;\n }\n if (l.type !== Tok.None) {\n if (l.type === Tok.Hue) {\n return void 0;\n }\n res.l = l.value / 100;\n }\n if (alpha2.type !== Tok.None) {\n res.alpha = Math.min(\n 1,\n Math.max(\n 0,\n alpha2.type === Tok.Number ? alpha2.value : alpha2.value / 100\n )\n );\n }\n return res;\n }\n var parseHsl_default = parseHsl;\n\n // node_modules/culori/src/hsl/definition.js\n var definition7 = {\n mode: \"hsl\",\n toMode: {\n rgb: convertHslToRgb\n },\n fromMode: {\n rgb: convertRgbToHsl\n },\n channels: [\"h\", \"s\", \"l\", \"alpha\"],\n ranges: {\n h: [0, 360]\n },\n gamut: \"rgb\",\n parse: [parseHsl_default, parseHslLegacy_default],\n serialize: (c2) => `hsl(${c2.h !== void 0 ? c2.h : \"none\"} ${c2.s !== void 0 ? c2.s * 100 + \"%\" : \"none\"} ${c2.l !== void 0 ? c2.l * 100 + \"%\" : \"none\"}${c2.alpha < 1 ? ` / ${c2.alpha}` : \"\"})`,\n interpolate: {\n h: { use: interpolatorLinear, fixup: fixupHueShorter },\n s: interpolatorLinear,\n l: interpolatorLinear,\n alpha: { use: interpolatorLinear, fixup: fixupAlpha }\n },\n difference: {\n h: differenceHueSaturation\n },\n average: {\n h: averageAngle\n }\n };\n var definition_default7 = definition7;\n\n // node_modules/culori/src/hsv/convertHsvToRgb.js\n function convertHsvToRgb({ h, s, v, alpha: alpha2 }) {\n h = normalizeHue_default(h !== void 0 ? h : 0);\n if (s === void 0) s = 0;\n if (v === void 0) v = 0;\n let f3 = Math.abs(h / 60 % 2 - 1);\n let res;\n switch (Math.floor(h / 60)) {\n case 0:\n res = { r: v, g: v * (1 - s * f3), b: v * (1 - s) };\n break;\n case 1:\n res = { r: v * (1 - s * f3), g: v, b: v * (1 - s) };\n break;\n case 2:\n res = { r: v * (1 - s), g: v, b: v * (1 - s * f3) };\n break;\n case 3:\n res = { r: v * (1 - s), g: v * (1 - s * f3), b: v };\n break;\n case 4:\n res = { r: v * (1 - s * f3), g: v * (1 - s), b: v };\n break;\n case 5:\n res = { r: v, g: v * (1 - s), b: v * (1 - s * f3) };\n break;\n default:\n res = { r: v * (1 - s), g: v * (1 - s), b: v * (1 - s) };\n }\n res.mode = \"rgb\";\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n }\n\n // node_modules/culori/src/hsv/convertRgbToHsv.js\n function convertRgbToHsv({ r: r2, g, b, alpha: alpha2 }) {\n if (r2 === void 0) r2 = 0;\n if (g === void 0) g = 0;\n if (b === void 0) b = 0;\n let M3 = Math.max(r2, g, b), m = Math.min(r2, g, b);\n let res = {\n mode: \"hsv\",\n s: M3 === 0 ? 0 : 1 - m / M3,\n v: M3\n };\n if (M3 - m !== 0)\n res.h = (M3 === r2 ? (g - b) / (M3 - m) + (g < b) * 6 : M3 === g ? (b - r2) / (M3 - m) + 2 : (r2 - g) / (M3 - m) + 4) * 60;\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n }\n\n // node_modules/culori/src/hsv/definition.js\n var definition8 = {\n mode: \"hsv\",\n toMode: {\n rgb: convertHsvToRgb\n },\n parse: [\"--hsv\"],\n serialize: \"--hsv\",\n fromMode: {\n rgb: convertRgbToHsv\n },\n channels: [\"h\", \"s\", \"v\", \"alpha\"],\n ranges: {\n h: [0, 360]\n },\n gamut: \"rgb\",\n interpolate: {\n h: { use: interpolatorLinear, fixup: fixupHueShorter },\n s: interpolatorLinear,\n v: interpolatorLinear,\n alpha: { use: interpolatorLinear, fixup: fixupAlpha }\n },\n difference: {\n h: differenceHueSaturation\n },\n average: {\n h: averageAngle\n }\n };\n var definition_default8 = definition8;\n\n // node_modules/culori/src/hwb/convertHwbToRgb.js\n function convertHwbToRgb({ h, w, b, alpha: alpha2 }) {\n if (w === void 0) w = 0;\n if (b === void 0) b = 0;\n if (w + b > 1) {\n let s = w + b;\n w /= s;\n b /= s;\n }\n return convertHsvToRgb({\n h,\n s: b === 1 ? 1 : 1 - w / (1 - b),\n v: 1 - b,\n alpha: alpha2\n });\n }\n\n // node_modules/culori/src/hwb/convertRgbToHwb.js\n function convertRgbToHwb(rgba) {\n let hsv2 = convertRgbToHsv(rgba);\n if (hsv2 === void 0) return void 0;\n let s = hsv2.s !== void 0 ? hsv2.s : 0;\n let v = hsv2.v !== void 0 ? hsv2.v : 0;\n let res = {\n mode: \"hwb\",\n w: (1 - s) * v,\n b: 1 - v\n };\n if (hsv2.h !== void 0) res.h = hsv2.h;\n if (hsv2.alpha !== void 0) res.alpha = hsv2.alpha;\n return res;\n }\n\n // node_modules/culori/src/hwb/parseHwb.js\n function ParseHwb(color, parsed) {\n if (!parsed || parsed[0] !== \"hwb\") {\n return void 0;\n }\n const res = { mode: \"hwb\" };\n const [, h, w, b, alpha2] = parsed;\n if (h.type !== Tok.None) {\n if (h.type === Tok.Percentage) {\n return void 0;\n }\n res.h = h.value;\n }\n if (w.type !== Tok.None) {\n if (w.type === Tok.Hue) {\n return void 0;\n }\n res.w = w.value / 100;\n }\n if (b.type !== Tok.None) {\n if (b.type === Tok.Hue) {\n return void 0;\n }\n res.b = b.value / 100;\n }\n if (alpha2.type !== Tok.None) {\n res.alpha = Math.min(\n 1,\n Math.max(\n 0,\n alpha2.type === Tok.Number ? alpha2.value : alpha2.value / 100\n )\n );\n }\n return res;\n }\n var parseHwb_default = ParseHwb;\n\n // node_modules/culori/src/hwb/definition.js\n var definition9 = {\n mode: \"hwb\",\n toMode: {\n rgb: convertHwbToRgb\n },\n fromMode: {\n rgb: convertRgbToHwb\n },\n channels: [\"h\", \"w\", \"b\", \"alpha\"],\n ranges: {\n h: [0, 360]\n },\n gamut: \"rgb\",\n parse: [parseHwb_default],\n serialize: (c2) => `hwb(${c2.h !== void 0 ? c2.h : \"none\"} ${c2.w !== void 0 ? c2.w * 100 + \"%\" : \"none\"} ${c2.b !== void 0 ? c2.b * 100 + \"%\" : \"none\"}${c2.alpha < 1 ? ` / ${c2.alpha}` : \"\"})`,\n interpolate: {\n h: { use: interpolatorLinear, fixup: fixupHueShorter },\n w: interpolatorLinear,\n b: interpolatorLinear,\n alpha: { use: interpolatorLinear, fixup: fixupAlpha }\n },\n difference: {\n h: differenceHueNaive\n },\n average: {\n h: averageAngle\n }\n };\n var definition_default9 = definition9;\n\n // node_modules/culori/src/hdr/constants.js\n var YW = 203;\n\n // node_modules/culori/src/hdr/transfer.js\n var M1 = 0.1593017578125;\n var M2 = 78.84375;\n var C1 = 0.8359375;\n var C2 = 18.8515625;\n var C3 = 18.6875;\n function transferPqDecode(v) {\n if (v < 0) return 0;\n const c2 = Math.pow(v, 1 / M2);\n return 1e4 * Math.pow(Math.max(0, c2 - C1) / (C2 - C3 * c2), 1 / M1);\n }\n function transferPqEncode(v) {\n if (v < 0) return 0;\n const c2 = Math.pow(v / 1e4, M1);\n return Math.pow((C1 + C2 * c2) / (1 + C3 * c2), M2);\n }\n\n // node_modules/culori/src/itp/convertItpToXyz65.js\n var toRel = (c2) => Math.max(c2 / YW, 0);\n var convertItpToXyz65 = ({ i, t, p: p4, alpha: alpha2 }) => {\n if (i === void 0) i = 0;\n if (t === void 0) t = 0;\n if (p4 === void 0) p4 = 0;\n const l = transferPqDecode(\n i + 0.008609037037932761 * t + 0.11102962500302593 * p4\n );\n const m = transferPqDecode(\n i - 0.00860903703793275 * t - 0.11102962500302599 * p4\n );\n const s = transferPqDecode(\n i + 0.5600313357106791 * t - 0.32062717498731885 * p4\n );\n const res = {\n mode: \"xyz65\",\n x: toRel(\n 2.070152218389422 * l - 1.3263473389671556 * m + 0.2066510476294051 * s\n ),\n y: toRel(\n 0.3647385209748074 * l + 0.680566024947227 * m - 0.0453045459220346 * s\n ),\n z: toRel(\n -0.049747207535812 * l - 0.0492609666966138 * m + 1.1880659249923042 * s\n )\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertItpToXyz65_default = convertItpToXyz65;\n\n // node_modules/culori/src/itp/convertXyz65ToItp.js\n var toAbs = (c2 = 0) => Math.max(c2 * YW, 0);\n var convertXyz65ToItp = ({ x, y, z, alpha: alpha2 }) => {\n const absX = toAbs(x);\n const absY = toAbs(y);\n const absZ = toAbs(z);\n const l = transferPqEncode(\n 0.3592832590121217 * absX + 0.6976051147779502 * absY - 0.0358915932320289 * absZ\n );\n const m = transferPqEncode(\n -0.1920808463704995 * absX + 1.1004767970374323 * absY + 0.0753748658519118 * absZ\n );\n const s = transferPqEncode(\n 0.0070797844607477 * absX + 0.0748396662186366 * absY + 0.8433265453898765 * absZ\n );\n const i = 0.5 * l + 0.5 * m;\n const t = 1.61376953125 * l - 3.323486328125 * m + 1.709716796875 * s;\n const p4 = 4.378173828125 * l - 4.24560546875 * m - 0.132568359375 * s;\n const res = { mode: \"itp\", i, t, p: p4 };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertXyz65ToItp_default = convertXyz65ToItp;\n\n // node_modules/culori/src/itp/definition.js\n var definition10 = {\n mode: \"itp\",\n channels: [\"i\", \"t\", \"p\", \"alpha\"],\n parse: [\"--ictcp\"],\n serialize: \"--ictcp\",\n toMode: {\n xyz65: convertItpToXyz65_default,\n rgb: (color) => convertXyz65ToRgb_default(convertItpToXyz65_default(color))\n },\n fromMode: {\n xyz65: convertXyz65ToItp_default,\n rgb: (color) => convertXyz65ToItp_default(convertRgbToXyz65_default(color))\n },\n ranges: {\n i: [0, 0.581],\n t: [-0.369, 0.272],\n p: [-0.164, 0.331]\n },\n interpolate: {\n i: interpolatorLinear,\n t: interpolatorLinear,\n p: interpolatorLinear,\n alpha: { use: interpolatorLinear, fixup: fixupAlpha }\n }\n };\n var definition_default10 = definition10;\n\n // node_modules/culori/src/jab/convertXyz65ToJab.js\n var p = 134.03437499999998;\n var d0 = 16295499532821565e-27;\n var jabPqEncode = (v) => {\n if (v < 0) return 0;\n let vn3 = Math.pow(v / 1e4, M1);\n return Math.pow((C1 + C2 * vn3) / (1 + C3 * vn3), p);\n };\n var abs = (v = 0) => Math.max(v * 203, 0);\n var convertXyz65ToJab = ({ x, y, z, alpha: alpha2 }) => {\n x = abs(x);\n y = abs(y);\n z = abs(z);\n let xp = 1.15 * x - 0.15 * z;\n let yp = 0.66 * y + 0.34 * x;\n let l = jabPqEncode(0.41478972 * xp + 0.579999 * yp + 0.014648 * z);\n let m = jabPqEncode(-0.20151 * xp + 1.120649 * yp + 0.0531008 * z);\n let s = jabPqEncode(-0.0166008 * xp + 0.2648 * yp + 0.6684799 * z);\n let i = (l + m) / 2;\n let res = {\n mode: \"jab\",\n j: 0.44 * i / (1 - 0.56 * i) - d0,\n a: 3.524 * l - 4.066708 * m + 0.542708 * s,\n b: 0.199076 * l + 1.096799 * m - 1.295875 * s\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertXyz65ToJab_default = convertXyz65ToJab;\n\n // node_modules/culori/src/jab/convertJabToXyz65.js\n var p2 = 134.03437499999998;\n var d02 = 16295499532821565e-27;\n var jabPqDecode = (v) => {\n if (v < 0) return 0;\n let vp = Math.pow(v, 1 / p2);\n return 1e4 * Math.pow((C1 - vp) / (C3 * vp - C2), 1 / M1);\n };\n var rel = (v) => v / 203;\n var convertJabToXyz65 = ({ j, a, b, alpha: alpha2 }) => {\n if (j === void 0) j = 0;\n if (a === void 0) a = 0;\n if (b === void 0) b = 0;\n let i = (j + d02) / (0.44 + 0.56 * (j + d02));\n let l = jabPqDecode(i + 0.13860504 * a + 0.058047316 * b);\n let m = jabPqDecode(i - 0.13860504 * a - 0.058047316 * b);\n let s = jabPqDecode(i - 0.096019242 * a - 0.8118919 * b);\n let res = {\n mode: \"xyz65\",\n x: rel(\n 1.661373024652174 * l - 0.914523081304348 * m + 0.23136208173913045 * s\n ),\n y: rel(\n -0.3250758611844533 * l + 1.571847026732543 * m - 0.21825383453227928 * s\n ),\n z: rel(-0.090982811 * l - 0.31272829 * m + 1.5227666 * s)\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertJabToXyz65_default = convertJabToXyz65;\n\n // node_modules/culori/src/jab/convertRgbToJab.js\n var convertRgbToJab = (rgb4) => {\n let res = convertXyz65ToJab_default(convertRgbToXyz65_default(rgb4));\n if (rgb4.r === rgb4.b && rgb4.b === rgb4.g) {\n res.a = res.b = 0;\n }\n return res;\n };\n var convertRgbToJab_default = convertRgbToJab;\n\n // node_modules/culori/src/jab/convertJabToRgb.js\n var convertJabToRgb = (color) => convertXyz65ToRgb_default(convertJabToXyz65_default(color));\n var convertJabToRgb_default = convertJabToRgb;\n\n // node_modules/culori/src/jab/definition.js\n var definition11 = {\n mode: \"jab\",\n channels: [\"j\", \"a\", \"b\", \"alpha\"],\n parse: [\"--jzazbz\"],\n serialize: \"--jzazbz\",\n fromMode: {\n rgb: convertRgbToJab_default,\n xyz65: convertXyz65ToJab_default\n },\n toMode: {\n rgb: convertJabToRgb_default,\n xyz65: convertJabToXyz65_default\n },\n ranges: {\n j: [0, 0.222],\n a: [-0.109, 0.129],\n b: [-0.185, 0.134]\n },\n interpolate: {\n j: interpolatorLinear,\n a: interpolatorLinear,\n b: interpolatorLinear,\n alpha: { use: interpolatorLinear, fixup: fixupAlpha }\n }\n };\n var definition_default11 = definition11;\n\n // node_modules/culori/src/jch/convertJabToJch.js\n var convertJabToJch = ({ j, a, b, alpha: alpha2 }) => {\n if (a === void 0) a = 0;\n if (b === void 0) b = 0;\n let c2 = Math.sqrt(a * a + b * b);\n let res = {\n mode: \"jch\",\n j,\n c: c2\n };\n if (c2) {\n res.h = normalizeHue_default(Math.atan2(b, a) * 180 / Math.PI);\n }\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertJabToJch_default = convertJabToJch;\n\n // node_modules/culori/src/jch/convertJchToJab.js\n var convertJchToJab = ({ j, c: c2, h, alpha: alpha2 }) => {\n if (h === void 0) h = 0;\n let res = {\n mode: \"jab\",\n j,\n a: c2 ? c2 * Math.cos(h / 180 * Math.PI) : 0,\n b: c2 ? c2 * Math.sin(h / 180 * Math.PI) : 0\n };\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n };\n var convertJchToJab_default = convertJchToJab;\n\n // node_modules/culori/src/jch/definition.js\n var definition12 = {\n mode: \"jch\",\n parse: [\"--jzczhz\"],\n serialize: \"--jzczhz\",\n toMode: {\n jab: convertJchToJab_default,\n rgb: (c2) => convertJabToRgb_default(convertJchToJab_default(c2))\n },\n fromMode: {\n rgb: (c2) => convertJabToJch_default(convertRgbToJab_default(c2)),\n jab: convertJabToJch_default\n },\n channels: [\"j\", \"c\", \"h\", \"alpha\"],\n ranges: {\n j: [0, 0.221],\n c: [0, 0.19],\n h: [0, 360]\n },\n interpolate: {\n h: { use: interpolatorLinear, fixup: fixupHueShorter },\n c: interpolatorLinear,\n j: interpolatorLinear,\n alpha: { use: interpolatorLinear, fixup: fixupAlpha }\n },\n difference: {\n h: differenceHueChroma\n },\n average: {\n h: averageAngle\n }\n };\n var definition_default12 = definition12;\n\n // node_modules/culori/src/xyz50/constants.js\n var k3 = Math.pow(29, 3) / Math.pow(3, 3);\n var e3 = Math.pow(6, 3) / Math.pow(29, 3);\n\n // node_modules/culori/src/lab/convertLabToXyz50.js\n var fn4 = (v) => Math.pow(v, 3) > e3 ? Math.pow(v, 3) : (116 * v - 16) / k3;\n var convertLabToXyz50 = ({ l, a, b, alpha: alpha2 }) => {\n if (l === void 0) l = 0;\n if (a === void 0) a = 0;\n if (b === void 0) b = 0;\n let fy = (l + 16) / 116;\n let fx = a / 500 + fy;\n let fz = fy - b / 200;\n let res = {\n mode: \"xyz50\",\n x: fn4(fx) * D50.X,\n y: fn4(fy) * D50.Y,\n z: fn4(fz) * D50.Z\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertLabToXyz50_default = convertLabToXyz50;\n\n // node_modules/culori/src/xyz50/convertXyz50ToRgb.js\n var convertXyz50ToRgb = ({ x, y, z, alpha: alpha2 }) => {\n if (x === void 0) x = 0;\n if (y === void 0) y = 0;\n if (z === void 0) z = 0;\n let res = convertLrgbToRgb_default({\n r: x * 3.1341359569958707 - y * 1.6173863321612538 - 0.4906619460083532 * z,\n g: x * -0.978795502912089 + y * 1.916254567259524 + 0.03344273116131949 * z,\n b: x * 0.07195537988411677 - y * 0.2289768264158322 + 1.405386058324125 * z\n });\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertXyz50ToRgb_default = convertXyz50ToRgb;\n\n // node_modules/culori/src/lab/convertLabToRgb.js\n var convertLabToRgb = (lab2) => convertXyz50ToRgb_default(convertLabToXyz50_default(lab2));\n var convertLabToRgb_default = convertLabToRgb;\n\n // node_modules/culori/src/xyz50/convertRgbToXyz50.js\n var convertRgbToXyz50 = (rgb4) => {\n let { r: r2, g, b, alpha: alpha2 } = convertRgbToLrgb_default(rgb4);\n let res = {\n mode: \"xyz50\",\n x: 0.436065742824811 * r2 + 0.3851514688337912 * g + 0.14307845442264197 * b,\n y: 0.22249319175623702 * r2 + 0.7168870538238823 * g + 0.06061979053616537 * b,\n z: 0.013923904500943465 * r2 + 0.09708128566574634 * g + 0.7140993584005155 * b\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertRgbToXyz50_default = convertRgbToXyz50;\n\n // node_modules/culori/src/lab/convertXyz50ToLab.js\n var f2 = (value) => value > e3 ? Math.cbrt(value) : (k3 * value + 16) / 116;\n var convertXyz50ToLab = ({ x, y, z, alpha: alpha2 }) => {\n if (x === void 0) x = 0;\n if (y === void 0) y = 0;\n if (z === void 0) z = 0;\n let f0 = f2(x / D50.X);\n let f1 = f2(y / D50.Y);\n let f22 = f2(z / D50.Z);\n let res = {\n mode: \"lab\",\n l: 116 * f1 - 16,\n a: 500 * (f0 - f1),\n b: 200 * (f1 - f22)\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertXyz50ToLab_default = convertXyz50ToLab;\n\n // node_modules/culori/src/lab/convertRgbToLab.js\n var convertRgbToLab = (rgb4) => {\n let res = convertXyz50ToLab_default(convertRgbToXyz50_default(rgb4));\n if (rgb4.r === rgb4.b && rgb4.b === rgb4.g) {\n res.a = res.b = 0;\n }\n return res;\n };\n var convertRgbToLab_default = convertRgbToLab;\n\n // node_modules/culori/src/lab/parseLab.js\n function parseLab(color, parsed) {\n if (!parsed || parsed[0] !== \"lab\") {\n return void 0;\n }\n const res = { mode: \"lab\" };\n const [, l, a, b, alpha2] = parsed;\n if (l.type === Tok.Hue || a.type === Tok.Hue || b.type === Tok.Hue) {\n return void 0;\n }\n if (l.type !== Tok.None) {\n res.l = Math.min(Math.max(0, l.value), 100);\n }\n if (a.type !== Tok.None) {\n res.a = a.type === Tok.Number ? a.value : a.value * 125 / 100;\n }\n if (b.type !== Tok.None) {\n res.b = b.type === Tok.Number ? b.value : b.value * 125 / 100;\n }\n if (alpha2.type !== Tok.None) {\n res.alpha = Math.min(\n 1,\n Math.max(\n 0,\n alpha2.type === Tok.Number ? alpha2.value : alpha2.value / 100\n )\n );\n }\n return res;\n }\n var parseLab_default = parseLab;\n\n // node_modules/culori/src/lab/definition.js\n var definition13 = {\n mode: \"lab\",\n toMode: {\n xyz50: convertLabToXyz50_default,\n rgb: convertLabToRgb_default\n },\n fromMode: {\n xyz50: convertXyz50ToLab_default,\n rgb: convertRgbToLab_default\n },\n channels: [\"l\", \"a\", \"b\", \"alpha\"],\n ranges: {\n l: [0, 100],\n a: [-125, 125],\n b: [-125, 125]\n },\n parse: [parseLab_default],\n serialize: (c2) => `lab(${c2.l !== void 0 ? c2.l : \"none\"} ${c2.a !== void 0 ? c2.a : \"none\"} ${c2.b !== void 0 ? c2.b : \"none\"}${c2.alpha < 1 ? ` / ${c2.alpha}` : \"\"})`,\n interpolate: {\n l: interpolatorLinear,\n a: interpolatorLinear,\n b: interpolatorLinear,\n alpha: { use: interpolatorLinear, fixup: fixupAlpha }\n }\n };\n var definition_default13 = definition13;\n\n // node_modules/culori/src/lab65/definition.js\n var definition14 = {\n ...definition_default13,\n mode: \"lab65\",\n parse: [\"--lab-d65\"],\n serialize: \"--lab-d65\",\n toMode: {\n xyz65: convertLab65ToXyz65_default,\n rgb: convertLab65ToRgb_default\n },\n fromMode: {\n xyz65: convertXyz65ToLab65_default,\n rgb: convertRgbToLab65_default\n },\n ranges: {\n l: [0, 100],\n a: [-125, 125],\n b: [-125, 125]\n }\n };\n var definition_default14 = definition14;\n\n // node_modules/culori/src/lch/parseLch.js\n function parseLch(color, parsed) {\n if (!parsed || parsed[0] !== \"lch\") {\n return void 0;\n }\n const res = { mode: \"lch\" };\n const [, l, c2, h, alpha2] = parsed;\n if (l.type !== Tok.None) {\n if (l.type === Tok.Hue) {\n return void 0;\n }\n res.l = Math.min(Math.max(0, l.value), 100);\n }\n if (c2.type !== Tok.None) {\n res.c = Math.max(\n 0,\n c2.type === Tok.Number ? c2.value : c2.value * 150 / 100\n );\n }\n if (h.type !== Tok.None) {\n if (h.type === Tok.Percentage) {\n return void 0;\n }\n res.h = h.value;\n }\n if (alpha2.type !== Tok.None) {\n res.alpha = Math.min(\n 1,\n Math.max(\n 0,\n alpha2.type === Tok.Number ? alpha2.value : alpha2.value / 100\n )\n );\n }\n return res;\n }\n var parseLch_default = parseLch;\n\n // node_modules/culori/src/lch/definition.js\n var definition15 = {\n mode: \"lch\",\n toMode: {\n lab: convertLchToLab_default,\n rgb: (c2) => convertLabToRgb_default(convertLchToLab_default(c2))\n },\n fromMode: {\n rgb: (c2) => convertLabToLch_default(convertRgbToLab_default(c2)),\n lab: convertLabToLch_default\n },\n channels: [\"l\", \"c\", \"h\", \"alpha\"],\n ranges: {\n l: [0, 100],\n c: [0, 150],\n h: [0, 360]\n },\n parse: [parseLch_default],\n serialize: (c2) => `lch(${c2.l !== void 0 ? c2.l : \"none\"} ${c2.c !== void 0 ? c2.c : \"none\"} ${c2.h !== void 0 ? c2.h : \"none\"}${c2.alpha < 1 ? ` / ${c2.alpha}` : \"\"})`,\n interpolate: {\n h: { use: interpolatorLinear, fixup: fixupHueShorter },\n c: interpolatorLinear,\n l: interpolatorLinear,\n alpha: { use: interpolatorLinear, fixup: fixupAlpha }\n },\n difference: {\n h: differenceHueChroma\n },\n average: {\n h: averageAngle\n }\n };\n var definition_default15 = definition15;\n\n // node_modules/culori/src/lch65/definition.js\n var definition16 = {\n ...definition_default15,\n mode: \"lch65\",\n parse: [\"--lch-d65\"],\n serialize: \"--lch-d65\",\n toMode: {\n lab65: (c2) => convertLchToLab_default(c2, \"lab65\"),\n rgb: (c2) => convertLab65ToRgb_default(convertLchToLab_default(c2, \"lab65\"))\n },\n fromMode: {\n rgb: (c2) => convertLabToLch_default(convertRgbToLab65_default(c2), \"lch65\"),\n lab65: (c2) => convertLabToLch_default(c2, \"lch65\")\n },\n ranges: {\n l: [0, 100],\n c: [0, 150],\n h: [0, 360]\n }\n };\n var definition_default16 = definition16;\n\n // node_modules/culori/src/lchuv/convertLuvToLchuv.js\n var convertLuvToLchuv = ({ l, u, v, alpha: alpha2 }) => {\n if (u === void 0) u = 0;\n if (v === void 0) v = 0;\n let c2 = Math.sqrt(u * u + v * v);\n let res = {\n mode: \"lchuv\",\n l,\n c: c2\n };\n if (c2) {\n res.h = normalizeHue_default(Math.atan2(v, u) * 180 / Math.PI);\n }\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertLuvToLchuv_default = convertLuvToLchuv;\n\n // node_modules/culori/src/lchuv/convertLchuvToLuv.js\n var convertLchuvToLuv = ({ l, c: c2, h, alpha: alpha2 }) => {\n if (h === void 0) h = 0;\n let res = {\n mode: \"luv\",\n l,\n u: c2 ? c2 * Math.cos(h / 180 * Math.PI) : 0,\n v: c2 ? c2 * Math.sin(h / 180 * Math.PI) : 0\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertLchuvToLuv_default = convertLchuvToLuv;\n\n // node_modules/culori/src/luv/convertXyz50ToLuv.js\n var u_fn = (x, y, z) => 4 * x / (x + 15 * y + 3 * z);\n var v_fn = (x, y, z) => 9 * y / (x + 15 * y + 3 * z);\n var un = u_fn(D50.X, D50.Y, D50.Z);\n var vn = v_fn(D50.X, D50.Y, D50.Z);\n var l_fn = (value) => value <= e3 ? k3 * value : 116 * Math.cbrt(value) - 16;\n var convertXyz50ToLuv = ({ x, y, z, alpha: alpha2 }) => {\n if (x === void 0) x = 0;\n if (y === void 0) y = 0;\n if (z === void 0) z = 0;\n let l = l_fn(y / D50.Y);\n let u = u_fn(x, y, z);\n let v = v_fn(x, y, z);\n if (!isFinite(u) || !isFinite(v)) {\n l = u = v = 0;\n } else {\n u = 13 * l * (u - un);\n v = 13 * l * (v - vn);\n }\n let res = {\n mode: \"luv\",\n l,\n u,\n v\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertXyz50ToLuv_default = convertXyz50ToLuv;\n\n // node_modules/culori/src/luv/convertLuvToXyz50.js\n var u_fn2 = (x, y, z) => 4 * x / (x + 15 * y + 3 * z);\n var v_fn2 = (x, y, z) => 9 * y / (x + 15 * y + 3 * z);\n var un2 = u_fn2(D50.X, D50.Y, D50.Z);\n var vn2 = v_fn2(D50.X, D50.Y, D50.Z);\n var convertLuvToXyz50 = ({ l, u, v, alpha: alpha2 }) => {\n if (l === void 0) l = 0;\n if (l === 0) {\n return { mode: \"xyz50\", x: 0, y: 0, z: 0 };\n }\n if (u === void 0) u = 0;\n if (v === void 0) v = 0;\n let up = u / (13 * l) + un2;\n let vp = v / (13 * l) + vn2;\n let y = D50.Y * (l <= 8 ? l / k3 : Math.pow((l + 16) / 116, 3));\n let x = y * (9 * up) / (4 * vp);\n let z = y * (12 - 3 * up - 20 * vp) / (4 * vp);\n let res = { mode: \"xyz50\", x, y, z };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertLuvToXyz50_default = convertLuvToXyz50;\n\n // node_modules/culori/src/lchuv/definition.js\n var convertRgbToLchuv = (rgb4) => convertLuvToLchuv_default(convertXyz50ToLuv_default(convertRgbToXyz50_default(rgb4)));\n var convertLchuvToRgb = (lchuv2) => convertXyz50ToRgb_default(convertLuvToXyz50_default(convertLchuvToLuv_default(lchuv2)));\n var definition17 = {\n mode: \"lchuv\",\n toMode: {\n luv: convertLchuvToLuv_default,\n rgb: convertLchuvToRgb\n },\n fromMode: {\n rgb: convertRgbToLchuv,\n luv: convertLuvToLchuv_default\n },\n channels: [\"l\", \"c\", \"h\", \"alpha\"],\n parse: [\"--lchuv\"],\n serialize: \"--lchuv\",\n ranges: {\n l: [0, 100],\n c: [0, 176.956],\n h: [0, 360]\n },\n interpolate: {\n h: { use: interpolatorLinear, fixup: fixupHueShorter },\n c: interpolatorLinear,\n l: interpolatorLinear,\n alpha: { use: interpolatorLinear, fixup: fixupAlpha }\n },\n difference: {\n h: differenceHueChroma\n },\n average: {\n h: averageAngle\n }\n };\n var definition_default17 = definition17;\n\n // node_modules/culori/src/lrgb/definition.js\n var definition18 = {\n ...definition_default,\n mode: \"lrgb\",\n toMode: {\n rgb: convertLrgbToRgb_default\n },\n fromMode: {\n rgb: convertRgbToLrgb_default\n },\n parse: [\"srgb-linear\"],\n serialize: \"srgb-linear\"\n };\n var definition_default18 = definition18;\n\n // node_modules/culori/src/luv/definition.js\n var definition19 = {\n mode: \"luv\",\n toMode: {\n xyz50: convertLuvToXyz50_default,\n rgb: (luv2) => convertXyz50ToRgb_default(convertLuvToXyz50_default(luv2))\n },\n fromMode: {\n xyz50: convertXyz50ToLuv_default,\n rgb: (rgb4) => convertXyz50ToLuv_default(convertRgbToXyz50_default(rgb4))\n },\n channels: [\"l\", \"u\", \"v\", \"alpha\"],\n parse: [\"--luv\"],\n serialize: \"--luv\",\n ranges: {\n l: [0, 100],\n u: [-84.936, 175.042],\n v: [-125.882, 87.243]\n },\n interpolate: {\n l: interpolatorLinear,\n u: interpolatorLinear,\n v: interpolatorLinear,\n alpha: { use: interpolatorLinear, fixup: fixupAlpha }\n }\n };\n var definition_default19 = definition19;\n\n // node_modules/culori/src/oklab/convertLrgbToOklab.js\n var convertLrgbToOklab = ({ r: r2, g, b, alpha: alpha2 }) => {\n if (r2 === void 0) r2 = 0;\n if (g === void 0) g = 0;\n if (b === void 0) b = 0;\n let L = Math.cbrt(\n 0.412221469470763 * r2 + 0.5363325372617348 * g + 0.0514459932675022 * b\n );\n let M3 = Math.cbrt(\n 0.2119034958178252 * r2 + 0.6806995506452344 * g + 0.1073969535369406 * b\n );\n let S = Math.cbrt(\n 0.0883024591900564 * r2 + 0.2817188391361215 * g + 0.6299787016738222 * b\n );\n let res = {\n mode: \"oklab\",\n l: 0.210454268309314 * L + 0.7936177747023054 * M3 - 0.0040720430116193 * S,\n a: 1.9779985324311684 * L - 2.42859224204858 * M3 + 0.450593709617411 * S,\n b: 0.0259040424655478 * L + 0.7827717124575296 * M3 - 0.8086757549230774 * S\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertLrgbToOklab_default = convertLrgbToOklab;\n\n // node_modules/culori/src/oklab/convertRgbToOklab.js\n var convertRgbToOklab = (rgb4) => {\n let res = convertLrgbToOklab_default(convertRgbToLrgb_default(rgb4));\n if (rgb4.r === rgb4.b && rgb4.b === rgb4.g) {\n res.a = res.b = 0;\n }\n return res;\n };\n var convertRgbToOklab_default = convertRgbToOklab;\n\n // node_modules/culori/src/oklab/convertOklabToLrgb.js\n var convertOklabToLrgb = ({ l, a, b, alpha: alpha2 }) => {\n if (l === void 0) l = 0;\n if (a === void 0) a = 0;\n if (b === void 0) b = 0;\n let L = Math.pow(l + 0.3963377773761749 * a + 0.2158037573099136 * b, 3);\n let M3 = Math.pow(l - 0.1055613458156586 * a - 0.0638541728258133 * b, 3);\n let S = Math.pow(l - 0.0894841775298119 * a - 1.2914855480194092 * b, 3);\n let res = {\n mode: \"lrgb\",\n r: 4.076741636075957 * L - 3.3077115392580616 * M3 + 0.2309699031821044 * S,\n g: -1.2684379732850317 * L + 2.6097573492876887 * M3 - 0.3413193760026573 * S,\n b: -0.0041960761386756 * L - 0.7034186179359362 * M3 + 1.7076146940746117 * S\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertOklabToLrgb_default = convertOklabToLrgb;\n\n // node_modules/culori/src/oklab/convertOklabToRgb.js\n var convertOklabToRgb = (c2) => convertLrgbToRgb_default(convertOklabToLrgb_default(c2));\n var convertOklabToRgb_default = convertOklabToRgb;\n\n // node_modules/culori/src/okhsl/helpers.js\n function toe(x) {\n const k_1 = 0.206;\n const k_2 = 0.03;\n const k_3 = (1 + k_1) / (1 + k_2);\n return 0.5 * (k_3 * x - k_1 + Math.sqrt((k_3 * x - k_1) * (k_3 * x - k_1) + 4 * k_2 * k_3 * x));\n }\n function toe_inv(x) {\n const k_1 = 0.206;\n const k_2 = 0.03;\n const k_3 = (1 + k_1) / (1 + k_2);\n return (x * x + k_1 * x) / (k_3 * (x + k_2));\n }\n function compute_max_saturation(a, b) {\n let k0, k1, k22, k32, k4, wl, wm, ws;\n if (-1.88170328 * a - 0.80936493 * b > 1) {\n k0 = 1.19086277;\n k1 = 1.76576728;\n k22 = 0.59662641;\n k32 = 0.75515197;\n k4 = 0.56771245;\n wl = 4.0767416621;\n wm = -3.3077115913;\n ws = 0.2309699292;\n } else if (1.81444104 * a - 1.19445276 * b > 1) {\n k0 = 0.73956515;\n k1 = -0.45954404;\n k22 = 0.08285427;\n k32 = 0.1254107;\n k4 = 0.14503204;\n wl = -1.2684380046;\n wm = 2.6097574011;\n ws = -0.3413193965;\n } else {\n k0 = 1.35733652;\n k1 = -915799e-8;\n k22 = -1.1513021;\n k32 = -0.50559606;\n k4 = 692167e-8;\n wl = -0.0041960863;\n wm = -0.7034186147;\n ws = 1.707614701;\n }\n let S = k0 + k1 * a + k22 * b + k32 * a * a + k4 * a * b;\n let k_l = 0.3963377774 * a + 0.2158037573 * b;\n let k_m = -0.1055613458 * a - 0.0638541728 * b;\n let k_s = -0.0894841775 * a - 1.291485548 * b;\n {\n let l_ = 1 + S * k_l;\n let m_ = 1 + S * k_m;\n let s_ = 1 + S * k_s;\n let l = l_ * l_ * l_;\n let m = m_ * m_ * m_;\n let s = s_ * s_ * s_;\n let l_dS = 3 * k_l * l_ * l_;\n let m_dS = 3 * k_m * m_ * m_;\n let s_dS = 3 * k_s * s_ * s_;\n let l_dS2 = 6 * k_l * k_l * l_;\n let m_dS2 = 6 * k_m * k_m * m_;\n let s_dS2 = 6 * k_s * k_s * s_;\n let f3 = wl * l + wm * m + ws * s;\n let f1 = wl * l_dS + wm * m_dS + ws * s_dS;\n let f22 = wl * l_dS2 + wm * m_dS2 + ws * s_dS2;\n S = S - f3 * f1 / (f1 * f1 - 0.5 * f3 * f22);\n }\n return S;\n }\n function find_cusp(a, b) {\n let S_cusp = compute_max_saturation(a, b);\n let rgb4 = convertOklabToLrgb_default({ l: 1, a: S_cusp * a, b: S_cusp * b });\n let L_cusp = Math.cbrt(1 / Math.max(rgb4.r, rgb4.g, rgb4.b));\n let C_cusp = L_cusp * S_cusp;\n return [L_cusp, C_cusp];\n }\n function find_gamut_intersection(a, b, L1, C12, L0, cusp = null) {\n if (!cusp) {\n cusp = find_cusp(a, b);\n }\n let t;\n if ((L1 - L0) * cusp[1] - (cusp[0] - L0) * C12 <= 0) {\n t = cusp[1] * L0 / (C12 * cusp[0] + cusp[1] * (L0 - L1));\n } else {\n t = cusp[1] * (L0 - 1) / (C12 * (cusp[0] - 1) + cusp[1] * (L0 - L1));\n {\n let dL = L1 - L0;\n let dC = C12;\n let k_l = 0.3963377774 * a + 0.2158037573 * b;\n let k_m = -0.1055613458 * a - 0.0638541728 * b;\n let k_s = -0.0894841775 * a - 1.291485548 * b;\n let l_dt = dL + dC * k_l;\n let m_dt = dL + dC * k_m;\n let s_dt = dL + dC * k_s;\n {\n let L = L0 * (1 - t) + t * L1;\n let C = t * C12;\n let l_ = L + C * k_l;\n let m_ = L + C * k_m;\n let s_ = L + C * k_s;\n let l = l_ * l_ * l_;\n let m = m_ * m_ * m_;\n let s = s_ * s_ * s_;\n let ldt = 3 * l_dt * l_ * l_;\n let mdt = 3 * m_dt * m_ * m_;\n let sdt = 3 * s_dt * s_ * s_;\n let ldt2 = 6 * l_dt * l_dt * l_;\n let mdt2 = 6 * m_dt * m_dt * m_;\n let sdt2 = 6 * s_dt * s_dt * s_;\n let r2 = 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s - 1;\n let r1 = 4.0767416621 * ldt - 3.3077115913 * mdt + 0.2309699292 * sdt;\n let r22 = 4.0767416621 * ldt2 - 3.3077115913 * mdt2 + 0.2309699292 * sdt2;\n let u_r = r1 / (r1 * r1 - 0.5 * r2 * r22);\n let t_r = -r2 * u_r;\n let g = -1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s - 1;\n let g1 = -1.2684380046 * ldt + 2.6097574011 * mdt - 0.3413193965 * sdt;\n let g2 = -1.2684380046 * ldt2 + 2.6097574011 * mdt2 - 0.3413193965 * sdt2;\n let u_g = g1 / (g1 * g1 - 0.5 * g * g2);\n let t_g = -g * u_g;\n let b2 = -0.0041960863 * l - 0.7034186147 * m + 1.707614701 * s - 1;\n let b1 = -0.0041960863 * ldt - 0.7034186147 * mdt + 1.707614701 * sdt;\n let b22 = -0.0041960863 * ldt2 - 0.7034186147 * mdt2 + 1.707614701 * sdt2;\n let u_b = b1 / (b1 * b1 - 0.5 * b2 * b22);\n let t_b = -b2 * u_b;\n t_r = u_r >= 0 ? t_r : 1e6;\n t_g = u_g >= 0 ? t_g : 1e6;\n t_b = u_b >= 0 ? t_b : 1e6;\n t += Math.min(t_r, Math.min(t_g, t_b));\n }\n }\n }\n return t;\n }\n function get_ST_max(a_, b_, cusp = null) {\n if (!cusp) {\n cusp = find_cusp(a_, b_);\n }\n let L = cusp[0];\n let C = cusp[1];\n return [C / L, C / (1 - L)];\n }\n function get_Cs(L, a_, b_) {\n let cusp = find_cusp(a_, b_);\n let C_max = find_gamut_intersection(a_, b_, L, 1, L, cusp);\n let ST_max = get_ST_max(a_, b_, cusp);\n let S_mid = 0.11516993 + 1 / (7.4477897 + 4.1590124 * b_ + a_ * (-2.19557347 + 1.75198401 * b_ + a_ * (-2.13704948 - 10.02301043 * b_ + a_ * (-4.24894561 + 5.38770819 * b_ + 4.69891013 * a_))));\n let T_mid = 0.11239642 + 1 / (1.6132032 - 0.68124379 * b_ + a_ * (0.40370612 + 0.90148123 * b_ + a_ * (-0.27087943 + 0.6122399 * b_ + a_ * (299215e-8 - 0.45399568 * b_ - 0.14661872 * a_))));\n let k4 = C_max / Math.min(L * ST_max[0], (1 - L) * ST_max[1]);\n let C_a = L * S_mid;\n let C_b = (1 - L) * T_mid;\n let C_mid = 0.9 * k4 * Math.sqrt(\n Math.sqrt(\n 1 / (1 / (C_a * C_a * C_a * C_a) + 1 / (C_b * C_b * C_b * C_b))\n )\n );\n C_a = L * 0.4;\n C_b = (1 - L) * 0.8;\n let C_0 = Math.sqrt(1 / (1 / (C_a * C_a) + 1 / (C_b * C_b)));\n return [C_0, C_mid, C_max];\n }\n\n // node_modules/culori/src/okhsl/convertOklabToOkhsl.js\n function convertOklabToOkhsl(lab2) {\n const l = lab2.l !== void 0 ? lab2.l : 0;\n const a = lab2.a !== void 0 ? lab2.a : 0;\n const b = lab2.b !== void 0 ? lab2.b : 0;\n const ret = { mode: \"okhsl\", l: toe(l) };\n if (lab2.alpha !== void 0) {\n ret.alpha = lab2.alpha;\n }\n let c2 = Math.sqrt(a * a + b * b);\n if (!c2) {\n ret.s = 0;\n return ret;\n }\n let [C_0, C_mid, C_max] = get_Cs(l, a / c2, b / c2);\n let s;\n if (c2 < C_mid) {\n let k_0 = 0;\n let k_1 = 0.8 * C_0;\n let k_2 = 1 - k_1 / C_mid;\n let t = (c2 - k_0) / (k_1 + k_2 * (c2 - k_0));\n s = t * 0.8;\n } else {\n let k_0 = C_mid;\n let k_1 = 0.2 * C_mid * C_mid * 1.25 * 1.25 / C_0;\n let k_2 = 1 - k_1 / (C_max - C_mid);\n let t = (c2 - k_0) / (k_1 + k_2 * (c2 - k_0));\n s = 0.8 + 0.2 * t;\n }\n if (s) {\n ret.s = s;\n ret.h = normalizeHue_default(Math.atan2(b, a) * 180 / Math.PI);\n }\n return ret;\n }\n\n // node_modules/culori/src/okhsl/convertOkhslToOklab.js\n function convertOkhslToOklab(hsl3) {\n let h = hsl3.h !== void 0 ? hsl3.h : 0;\n let s = hsl3.s !== void 0 ? hsl3.s : 0;\n let l = hsl3.l !== void 0 ? hsl3.l : 0;\n const ret = { mode: \"oklab\", l: toe_inv(l) };\n if (hsl3.alpha !== void 0) {\n ret.alpha = hsl3.alpha;\n }\n if (!s || l === 1) {\n ret.a = ret.b = 0;\n return ret;\n }\n let a_ = Math.cos(h / 180 * Math.PI);\n let b_ = Math.sin(h / 180 * Math.PI);\n let [C_0, C_mid, C_max] = get_Cs(ret.l, a_, b_);\n let t, k_0, k_1, k_2;\n if (s < 0.8) {\n t = 1.25 * s;\n k_0 = 0;\n k_1 = 0.8 * C_0;\n k_2 = 1 - k_1 / C_mid;\n } else {\n t = 5 * (s - 0.8);\n k_0 = C_mid;\n k_1 = 0.2 * C_mid * C_mid * 1.25 * 1.25 / C_0;\n k_2 = 1 - k_1 / (C_max - C_mid);\n }\n let C = k_0 + t * k_1 / (1 - k_2 * t);\n ret.a = C * a_;\n ret.b = C * b_;\n return ret;\n }\n\n // node_modules/culori/src/okhsl/modeOkhsl.js\n var modeOkhsl = {\n ...definition_default7,\n mode: \"okhsl\",\n channels: [\"h\", \"s\", \"l\", \"alpha\"],\n parse: [\"--okhsl\"],\n serialize: \"--okhsl\",\n fromMode: {\n oklab: convertOklabToOkhsl,\n rgb: (c2) => convertOklabToOkhsl(convertRgbToOklab_default(c2))\n },\n toMode: {\n oklab: convertOkhslToOklab,\n rgb: (c2) => convertOklabToRgb_default(convertOkhslToOklab(c2))\n }\n };\n var modeOkhsl_default = modeOkhsl;\n\n // node_modules/culori/src/okhsv/convertOklabToOkhsv.js\n function convertOklabToOkhsv(lab2) {\n let l = lab2.l !== void 0 ? lab2.l : 0;\n let a = lab2.a !== void 0 ? lab2.a : 0;\n let b = lab2.b !== void 0 ? lab2.b : 0;\n let c2 = Math.sqrt(a * a + b * b);\n let a_ = c2 ? a / c2 : 1;\n let b_ = c2 ? b / c2 : 1;\n let [S_max, T] = get_ST_max(a_, b_);\n let S_0 = 0.5;\n let k4 = 1 - S_0 / S_max;\n let t = T / (c2 + l * T);\n let L_v = t * l;\n let C_v = t * c2;\n let L_vt = toe_inv(L_v);\n let C_vt = C_v * L_vt / L_v;\n let rgb_scale = convertOklabToLrgb_default({ l: L_vt, a: a_ * C_vt, b: b_ * C_vt });\n let scale_L = Math.cbrt(\n 1 / Math.max(rgb_scale.r, rgb_scale.g, rgb_scale.b, 0)\n );\n l = l / scale_L;\n c2 = c2 / scale_L * toe(l) / l;\n l = toe(l);\n const ret = {\n mode: \"okhsv\",\n s: c2 ? (S_0 + T) * C_v / (T * S_0 + T * k4 * C_v) : 0,\n v: l ? l / L_v : 0\n };\n if (ret.s) {\n ret.h = normalizeHue_default(Math.atan2(b, a) * 180 / Math.PI);\n }\n if (lab2.alpha !== void 0) {\n ret.alpha = lab2.alpha;\n }\n return ret;\n }\n\n // node_modules/culori/src/okhsv/convertOkhsvToOklab.js\n function convertOkhsvToOklab(hsv2) {\n const ret = { mode: \"oklab\" };\n if (hsv2.alpha !== void 0) {\n ret.alpha = hsv2.alpha;\n }\n const h = hsv2.h !== void 0 ? hsv2.h : 0;\n const s = hsv2.s !== void 0 ? hsv2.s : 0;\n const v = hsv2.v !== void 0 ? hsv2.v : 0;\n const a_ = Math.cos(h / 180 * Math.PI);\n const b_ = Math.sin(h / 180 * Math.PI);\n const [S_max, T] = get_ST_max(a_, b_);\n const S_0 = 0.5;\n const k4 = 1 - S_0 / S_max;\n const L_v = 1 - s * S_0 / (S_0 + T - T * k4 * s);\n const C_v = s * T * S_0 / (S_0 + T - T * k4 * s);\n const L_vt = toe_inv(L_v);\n const C_vt = C_v * L_vt / L_v;\n const rgb_scale = convertOklabToLrgb_default({\n l: L_vt,\n a: a_ * C_vt,\n b: b_ * C_vt\n });\n const scale_L = Math.cbrt(\n 1 / Math.max(rgb_scale.r, rgb_scale.g, rgb_scale.b, 0)\n );\n const L_new = toe_inv(v * L_v);\n const C = C_v * L_new / L_v;\n ret.l = L_new * scale_L;\n ret.a = C * a_ * scale_L;\n ret.b = C * b_ * scale_L;\n return ret;\n }\n\n // node_modules/culori/src/okhsv/modeOkhsv.js\n var modeOkhsv = {\n ...definition_default8,\n mode: \"okhsv\",\n channels: [\"h\", \"s\", \"v\", \"alpha\"],\n parse: [\"--okhsv\"],\n serialize: \"--okhsv\",\n fromMode: {\n oklab: convertOklabToOkhsv,\n rgb: (c2) => convertOklabToOkhsv(convertRgbToOklab_default(c2))\n },\n toMode: {\n oklab: convertOkhsvToOklab,\n rgb: (c2) => convertOklabToRgb_default(convertOkhsvToOklab(c2))\n }\n };\n var modeOkhsv_default = modeOkhsv;\n\n // node_modules/culori/src/oklab/parseOklab.js\n function parseOklab(color, parsed) {\n if (!parsed || parsed[0] !== \"oklab\") {\n return void 0;\n }\n const res = { mode: \"oklab\" };\n const [, l, a, b, alpha2] = parsed;\n if (l.type === Tok.Hue || a.type === Tok.Hue || b.type === Tok.Hue) {\n return void 0;\n }\n if (l.type !== Tok.None) {\n res.l = Math.min(\n Math.max(0, l.type === Tok.Number ? l.value : l.value / 100),\n 1\n );\n }\n if (a.type !== Tok.None) {\n res.a = a.type === Tok.Number ? a.value : a.value * 0.4 / 100;\n }\n if (b.type !== Tok.None) {\n res.b = b.type === Tok.Number ? b.value : b.value * 0.4 / 100;\n }\n if (alpha2.type !== Tok.None) {\n res.alpha = Math.min(\n 1,\n Math.max(\n 0,\n alpha2.type === Tok.Number ? alpha2.value : alpha2.value / 100\n )\n );\n }\n return res;\n }\n var parseOklab_default = parseOklab;\n\n // node_modules/culori/src/oklab/definition.js\n var definition20 = {\n ...definition_default13,\n mode: \"oklab\",\n toMode: {\n lrgb: convertOklabToLrgb_default,\n rgb: convertOklabToRgb_default\n },\n fromMode: {\n lrgb: convertLrgbToOklab_default,\n rgb: convertRgbToOklab_default\n },\n ranges: {\n l: [0, 1],\n a: [-0.4, 0.4],\n b: [-0.4, 0.4]\n },\n parse: [parseOklab_default],\n serialize: (c2) => `oklab(${c2.l !== void 0 ? c2.l : \"none\"} ${c2.a !== void 0 ? c2.a : \"none\"} ${c2.b !== void 0 ? c2.b : \"none\"}${c2.alpha < 1 ? ` / ${c2.alpha}` : \"\"})`\n };\n var definition_default20 = definition20;\n\n // node_modules/culori/src/oklch/parseOklch.js\n function parseOklch(color, parsed) {\n if (!parsed || parsed[0] !== \"oklch\") {\n return void 0;\n }\n const res = { mode: \"oklch\" };\n const [, l, c2, h, alpha2] = parsed;\n if (l.type !== Tok.None) {\n if (l.type === Tok.Hue) {\n return void 0;\n }\n res.l = Math.min(\n Math.max(0, l.type === Tok.Number ? l.value : l.value / 100),\n 1\n );\n }\n if (c2.type !== Tok.None) {\n res.c = Math.max(\n 0,\n c2.type === Tok.Number ? c2.value : c2.value * 0.4 / 100\n );\n }\n if (h.type !== Tok.None) {\n if (h.type === Tok.Percentage) {\n return void 0;\n }\n res.h = h.value;\n }\n if (alpha2.type !== Tok.None) {\n res.alpha = Math.min(\n 1,\n Math.max(\n 0,\n alpha2.type === Tok.Number ? alpha2.value : alpha2.value / 100\n )\n );\n }\n return res;\n }\n var parseOklch_default = parseOklch;\n\n // node_modules/culori/src/oklch/definition.js\n var definition21 = {\n ...definition_default15,\n mode: \"oklch\",\n toMode: {\n oklab: (c2) => convertLchToLab_default(c2, \"oklab\"),\n rgb: (c2) => convertOklabToRgb_default(convertLchToLab_default(c2, \"oklab\"))\n },\n fromMode: {\n rgb: (c2) => convertLabToLch_default(convertRgbToOklab_default(c2), \"oklch\"),\n oklab: (c2) => convertLabToLch_default(c2, \"oklch\")\n },\n parse: [parseOklch_default],\n serialize: (c2) => `oklch(${c2.l !== void 0 ? c2.l : \"none\"} ${c2.c !== void 0 ? c2.c : \"none\"} ${c2.h !== void 0 ? c2.h : \"none\"}${c2.alpha < 1 ? ` / ${c2.alpha}` : \"\"})`,\n ranges: {\n l: [0, 1],\n c: [0, 0.4],\n h: [0, 360]\n }\n };\n var definition_default21 = definition21;\n\n // node_modules/culori/src/p3/convertP3ToXyz65.js\n var convertP3ToXyz65 = (rgb4) => {\n let { r: r2, g, b, alpha: alpha2 } = convertRgbToLrgb_default(rgb4);\n let res = {\n mode: \"xyz65\",\n x: 0.486570948648216 * r2 + 0.265667693169093 * g + 0.1982172852343625 * b,\n y: 0.2289745640697487 * r2 + 0.6917385218365062 * g + 0.079286914093745 * b,\n z: 0 * r2 + 0.0451133818589026 * g + 1.043944368900976 * b\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertP3ToXyz65_default = convertP3ToXyz65;\n\n // node_modules/culori/src/p3/convertXyz65ToP3.js\n var convertXyz65ToP3 = ({ x, y, z, alpha: alpha2 }) => {\n if (x === void 0) x = 0;\n if (y === void 0) y = 0;\n if (z === void 0) z = 0;\n let res = convertLrgbToRgb_default(\n {\n r: x * 2.4934969119414263 - y * 0.9313836179191242 - 0.402710784450717 * z,\n g: x * -0.8294889695615749 + y * 1.7626640603183465 + 0.0236246858419436 * z,\n b: x * 0.0358458302437845 - y * 0.0761723892680418 + 0.9568845240076871 * z\n },\n \"p3\"\n );\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertXyz65ToP3_default = convertXyz65ToP3;\n\n // node_modules/culori/src/p3/definition.js\n var definition22 = {\n ...definition_default,\n mode: \"p3\",\n parse: [\"display-p3\"],\n serialize: \"display-p3\",\n fromMode: {\n rgb: (color) => convertXyz65ToP3_default(convertRgbToXyz65_default(color)),\n xyz65: convertXyz65ToP3_default\n },\n toMode: {\n rgb: (color) => convertXyz65ToRgb_default(convertP3ToXyz65_default(color)),\n xyz65: convertP3ToXyz65_default\n }\n };\n var definition_default22 = definition22;\n\n // node_modules/culori/src/prophoto/convertXyz50ToProphoto.js\n var gamma2 = (v) => {\n let abs2 = Math.abs(v);\n if (abs2 >= 1 / 512) {\n return Math.sign(v) * Math.pow(abs2, 1 / 1.8);\n }\n return 16 * v;\n };\n var convertXyz50ToProphoto = ({ x, y, z, alpha: alpha2 }) => {\n if (x === void 0) x = 0;\n if (y === void 0) y = 0;\n if (z === void 0) z = 0;\n let res = {\n mode: \"prophoto\",\n r: gamma2(\n x * 1.3457868816471585 - y * 0.2555720873797946 - 0.0511018649755453 * z\n ),\n g: gamma2(\n x * -0.5446307051249019 + y * 1.5082477428451466 + 0.0205274474364214 * z\n ),\n b: gamma2(x * 0 + y * 0 + 1.2119675456389452 * z)\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertXyz50ToProphoto_default = convertXyz50ToProphoto;\n\n // node_modules/culori/src/prophoto/convertProphotoToXyz50.js\n var linearize2 = (v = 0) => {\n let abs2 = Math.abs(v);\n if (abs2 >= 16 / 512) {\n return Math.sign(v) * Math.pow(abs2, 1.8);\n }\n return v / 16;\n };\n var convertProphotoToXyz50 = (prophoto2) => {\n let r2 = linearize2(prophoto2.r);\n let g = linearize2(prophoto2.g);\n let b = linearize2(prophoto2.b);\n let res = {\n mode: \"xyz50\",\n x: 0.7977666449006423 * r2 + 0.1351812974005331 * g + 0.0313477341283922 * b,\n y: 0.2880748288194013 * r2 + 0.7118352342418731 * g + 899369387256e-16 * b,\n z: 0 * r2 + 0 * g + 0.8251046025104602 * b\n };\n if (prophoto2.alpha !== void 0) {\n res.alpha = prophoto2.alpha;\n }\n return res;\n };\n var convertProphotoToXyz50_default = convertProphotoToXyz50;\n\n // node_modules/culori/src/prophoto/definition.js\n var definition23 = {\n ...definition_default,\n mode: \"prophoto\",\n parse: [\"prophoto-rgb\"],\n serialize: \"prophoto-rgb\",\n fromMode: {\n xyz50: convertXyz50ToProphoto_default,\n rgb: (color) => convertXyz50ToProphoto_default(convertRgbToXyz50_default(color))\n },\n toMode: {\n xyz50: convertProphotoToXyz50_default,\n rgb: (color) => convertXyz50ToRgb_default(convertProphotoToXyz50_default(color))\n }\n };\n var definition_default23 = definition23;\n\n // node_modules/culori/src/rec2020/convertXyz65ToRec2020.js\n var \\u03B1 = 1.09929682680944;\n var \\u03B2 = 0.018053968510807;\n var gamma3 = (v) => {\n const abs2 = Math.abs(v);\n if (abs2 > \\u03B2) {\n return (Math.sign(v) || 1) * (\\u03B1 * Math.pow(abs2, 0.45) - (\\u03B1 - 1));\n }\n return 4.5 * v;\n };\n var convertXyz65ToRec2020 = ({ x, y, z, alpha: alpha2 }) => {\n if (x === void 0) x = 0;\n if (y === void 0) y = 0;\n if (z === void 0) z = 0;\n let res = {\n mode: \"rec2020\",\n r: gamma3(\n x * 1.7166511879712683 - y * 0.3556707837763925 - 0.2533662813736599 * z\n ),\n g: gamma3(\n x * -0.6666843518324893 + y * 1.6164812366349395 + 0.0157685458139111 * z\n ),\n b: gamma3(\n x * 0.0176398574453108 - y * 0.0427706132578085 + 0.9421031212354739 * z\n )\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertXyz65ToRec2020_default = convertXyz65ToRec2020;\n\n // node_modules/culori/src/rec2020/convertRec2020ToXyz65.js\n var \\u03B12 = 1.09929682680944;\n var \\u03B22 = 0.018053968510807;\n var linearize3 = (v = 0) => {\n let abs2 = Math.abs(v);\n if (abs2 < \\u03B22 * 4.5) {\n return v / 4.5;\n }\n return (Math.sign(v) || 1) * Math.pow((abs2 + \\u03B12 - 1) / \\u03B12, 1 / 0.45);\n };\n var convertRec2020ToXyz65 = (rec20202) => {\n let r2 = linearize3(rec20202.r);\n let g = linearize3(rec20202.g);\n let b = linearize3(rec20202.b);\n let res = {\n mode: \"xyz65\",\n x: 0.6369580483012911 * r2 + 0.1446169035862083 * g + 0.1688809751641721 * b,\n y: 0.262700212011267 * r2 + 0.6779980715188708 * g + 0.059301716469862 * b,\n z: 0 * r2 + 0.0280726930490874 * g + 1.0609850577107909 * b\n };\n if (rec20202.alpha !== void 0) {\n res.alpha = rec20202.alpha;\n }\n return res;\n };\n var convertRec2020ToXyz65_default = convertRec2020ToXyz65;\n\n // node_modules/culori/src/rec2020/definition.js\n var definition24 = {\n ...definition_default,\n mode: \"rec2020\",\n fromMode: {\n xyz65: convertXyz65ToRec2020_default,\n rgb: (color) => convertXyz65ToRec2020_default(convertRgbToXyz65_default(color))\n },\n toMode: {\n xyz65: convertRec2020ToXyz65_default,\n rgb: (color) => convertXyz65ToRgb_default(convertRec2020ToXyz65_default(color))\n },\n parse: [\"rec2020\"],\n serialize: \"rec2020\"\n };\n var definition_default24 = definition24;\n\n // node_modules/culori/src/xyb/constants.js\n var bias = 0.0037930732552754493;\n var bias_cbrt = Math.cbrt(bias);\n\n // node_modules/culori/src/xyb/convertRgbToXyb.js\n var transfer = (v) => Math.cbrt(v) - bias_cbrt;\n var convertRgbToXyb = (color) => {\n const { r: r2, g, b, alpha: alpha2 } = convertRgbToLrgb_default(color);\n const l = transfer(0.3 * r2 + 0.622 * g + 0.078 * b + bias);\n const m = transfer(0.23 * r2 + 0.692 * g + 0.078 * b + bias);\n const s = transfer(\n 0.2434226892454782 * r2 + 0.2047674442449682 * g + 0.5518098665095535 * b + bias\n );\n const res = {\n mode: \"xyb\",\n x: (l - m) / 2,\n y: (l + m) / 2,\n /* Apply default chroma from luma (subtract Y from B) */\n b: s - (l + m) / 2\n };\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n };\n var convertRgbToXyb_default = convertRgbToXyb;\n\n // node_modules/culori/src/xyb/convertXybToRgb.js\n var transfer2 = (v) => Math.pow(v + bias_cbrt, 3);\n var convertXybToRgb = ({ x, y, b, alpha: alpha2 }) => {\n if (x === void 0) x = 0;\n if (y === void 0) y = 0;\n if (b === void 0) b = 0;\n const l = transfer2(x + y) - bias;\n const m = transfer2(y - x) - bias;\n const s = transfer2(b + y) - bias;\n const res = convertLrgbToRgb_default({\n r: 11.031566904639861 * l - 9.866943908131562 * m - 0.16462299650829934 * s,\n g: -3.2541473810744237 * l + 4.418770377582723 * m - 0.16462299650829934 * s,\n b: -3.6588512867136815 * l + 2.7129230459360922 * m + 1.9459282407775895 * s\n });\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n };\n var convertXybToRgb_default = convertXybToRgb;\n\n // node_modules/culori/src/xyb/definition.js\n var definition25 = {\n mode: \"xyb\",\n channels: [\"x\", \"y\", \"b\", \"alpha\"],\n parse: [\"--xyb\"],\n serialize: \"--xyb\",\n toMode: {\n rgb: convertXybToRgb_default\n },\n fromMode: {\n rgb: convertRgbToXyb_default\n },\n ranges: {\n x: [-0.0154, 0.0281],\n y: [0, 0.8453],\n b: [-0.2778, 0.388]\n },\n interpolate: {\n x: interpolatorLinear,\n y: interpolatorLinear,\n b: interpolatorLinear,\n alpha: { use: interpolatorLinear, fixup: fixupAlpha }\n }\n };\n var definition_default25 = definition25;\n\n // node_modules/culori/src/xyz50/definition.js\n var definition26 = {\n mode: \"xyz50\",\n parse: [\"xyz-d50\"],\n serialize: \"xyz-d50\",\n toMode: {\n rgb: convertXyz50ToRgb_default,\n lab: convertXyz50ToLab_default\n },\n fromMode: {\n rgb: convertRgbToXyz50_default,\n lab: convertLabToXyz50_default\n },\n channels: [\"x\", \"y\", \"z\", \"alpha\"],\n ranges: {\n x: [0, 0.964],\n y: [0, 0.999],\n z: [0, 0.825]\n },\n interpolate: {\n x: interpolatorLinear,\n y: interpolatorLinear,\n z: interpolatorLinear,\n alpha: { use: interpolatorLinear, fixup: fixupAlpha }\n }\n };\n var definition_default26 = definition26;\n\n // node_modules/culori/src/xyz65/convertXyz65ToXyz50.js\n var convertXyz65ToXyz50 = (xyz652) => {\n let { x, y, z, alpha: alpha2 } = xyz652;\n if (x === void 0) x = 0;\n if (y === void 0) y = 0;\n if (z === void 0) z = 0;\n let res = {\n mode: \"xyz50\",\n x: 1.0479298208405488 * x + 0.0229467933410191 * y - 0.0501922295431356 * z,\n y: 0.0296278156881593 * x + 0.990434484573249 * y - 0.0170738250293851 * z,\n z: -0.0092430581525912 * x + 0.0150551448965779 * y + 0.7518742899580008 * z\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertXyz65ToXyz50_default = convertXyz65ToXyz50;\n\n // node_modules/culori/src/xyz65/convertXyz50ToXyz65.js\n var convertXyz50ToXyz65 = (xyz502) => {\n let { x, y, z, alpha: alpha2 } = xyz502;\n if (x === void 0) x = 0;\n if (y === void 0) y = 0;\n if (z === void 0) z = 0;\n let res = {\n mode: \"xyz65\",\n x: 0.9554734527042182 * x - 0.0230985368742614 * y + 0.0632593086610217 * z,\n y: -0.0283697069632081 * x + 1.0099954580058226 * y + 0.021041398966943 * z,\n z: 0.0123140016883199 * x - 0.0205076964334779 * y + 1.3303659366080753 * z\n };\n if (alpha2 !== void 0) {\n res.alpha = alpha2;\n }\n return res;\n };\n var convertXyz50ToXyz65_default = convertXyz50ToXyz65;\n\n // node_modules/culori/src/xyz65/definition.js\n var definition27 = {\n mode: \"xyz65\",\n toMode: {\n rgb: convertXyz65ToRgb_default,\n xyz50: convertXyz65ToXyz50_default\n },\n fromMode: {\n rgb: convertRgbToXyz65_default,\n xyz50: convertXyz50ToXyz65_default\n },\n ranges: {\n x: [0, 0.95],\n y: [0, 1],\n z: [0, 1.088]\n },\n channels: [\"x\", \"y\", \"z\", \"alpha\"],\n parse: [\"xyz\", \"xyz-d65\"],\n serialize: \"xyz-d65\",\n interpolate: {\n x: interpolatorLinear,\n y: interpolatorLinear,\n z: interpolatorLinear,\n alpha: { use: interpolatorLinear, fixup: fixupAlpha }\n }\n };\n var definition_default27 = definition27;\n\n // node_modules/culori/src/yiq/convertRgbToYiq.js\n var convertRgbToYiq = ({ r: r2, g, b, alpha: alpha2 }) => {\n if (r2 === void 0) r2 = 0;\n if (g === void 0) g = 0;\n if (b === void 0) b = 0;\n const res = {\n mode: \"yiq\",\n y: 0.29889531 * r2 + 0.58662247 * g + 0.11448223 * b,\n i: 0.59597799 * r2 - 0.2741761 * g - 0.32180189 * b,\n q: 0.21147017 * r2 - 0.52261711 * g + 0.31114694 * b\n };\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n };\n var convertRgbToYiq_default = convertRgbToYiq;\n\n // node_modules/culori/src/yiq/convertYiqToRgb.js\n var convertYiqToRgb = ({ y, i, q, alpha: alpha2 }) => {\n if (y === void 0) y = 0;\n if (i === void 0) i = 0;\n if (q === void 0) q = 0;\n const res = {\n mode: \"rgb\",\n r: y + 0.95608445 * i + 0.6208885 * q,\n g: y - 0.27137664 * i - 0.6486059 * q,\n b: y - 1.10561724 * i + 1.70250126 * q\n };\n if (alpha2 !== void 0) res.alpha = alpha2;\n return res;\n };\n var convertYiqToRgb_default = convertYiqToRgb;\n\n // node_modules/culori/src/yiq/definition.js\n var definition28 = {\n mode: \"yiq\",\n toMode: {\n rgb: convertYiqToRgb_default\n },\n fromMode: {\n rgb: convertRgbToYiq_default\n },\n channels: [\"y\", \"i\", \"q\", \"alpha\"],\n parse: [\"--yiq\"],\n serialize: \"--yiq\",\n ranges: {\n i: [-0.595, 0.595],\n q: [-0.522, 0.522]\n },\n interpolate: {\n y: interpolatorLinear,\n i: interpolatorLinear,\n q: interpolatorLinear,\n alpha: { use: interpolatorLinear, fixup: fixupAlpha }\n }\n };\n var definition_default28 = definition28;\n\n // node_modules/culori/src/round.js\n var r = (value, precision) => Math.round(value * (precision = Math.pow(10, precision))) / precision;\n var round = (precision = 4) => (value) => typeof value === \"number\" ? r(value, precision) : value;\n var round_default = round;\n\n // node_modules/culori/src/formatter.js\n var twoDecimals = round_default(2);\n var clamp = (value) => Math.max(0, Math.min(1, value || 0));\n var fixup = (value) => Math.round(clamp(value) * 255);\n var rgb = converter_default(\"rgb\");\n var hsl = converter_default(\"hsl\");\n var serializeHex = (color) => {\n if (color === void 0) {\n return void 0;\n }\n let r2 = fixup(color.r);\n let g = fixup(color.g);\n let b = fixup(color.b);\n return \"#\" + (1 << 24 | r2 << 16 | g << 8 | b).toString(16).slice(1);\n };\n var serializeRgb = (color) => {\n if (color === void 0) {\n return void 0;\n }\n let r2 = fixup(color.r);\n let g = fixup(color.g);\n let b = fixup(color.b);\n if (color.alpha === void 0 || color.alpha === 1) {\n return `rgb(${r2}, ${g}, ${b})`;\n } else {\n return `rgba(${r2}, ${g}, ${b}, ${twoDecimals(clamp(color.alpha))})`;\n }\n };\n var formatHex = (c2) => serializeHex(rgb(c2));\n var formatRgb = (c2) => serializeRgb(rgb(c2));\n\n // node_modules/culori/src/clamp.js\n var rgb2 = converter_default(\"rgb\");\n var fixup_rgb = (c2) => {\n const res = {\n mode: c2.mode,\n r: Math.max(0, Math.min(c2.r !== void 0 ? c2.r : 0, 1)),\n g: Math.max(0, Math.min(c2.g !== void 0 ? c2.g : 0, 1)),\n b: Math.max(0, Math.min(c2.b !== void 0 ? c2.b : 0, 1))\n };\n if (c2.alpha !== void 0) {\n res.alpha = c2.alpha;\n }\n return res;\n };\n var to_displayable_srgb = (c2) => fixup_rgb(rgb2(c2));\n var inrange_rgb = (c2) => {\n return c2 !== void 0 && (c2.r === void 0 || c2.r >= 0 && c2.r <= 1) && (c2.g === void 0 || c2.g >= 0 && c2.g <= 1) && (c2.b === void 0 || c2.b >= 0 && c2.b <= 1);\n };\n function displayable(color) {\n return inrange_rgb(rgb2(color));\n }\n function inGamut(mode = \"rgb\") {\n const { gamut } = getMode(mode);\n if (!gamut) {\n return (color) => true;\n }\n const conv = converter_default(typeof gamut === \"string\" ? gamut : mode);\n return (color) => inrange_rgb(conv(color));\n }\n function clampGamut(mode = \"rgb\") {\n const { gamut } = getMode(mode);\n if (!gamut) {\n return (color) => prepare_default(color);\n }\n const destMode = typeof gamut === \"string\" ? gamut : mode;\n const destConv = converter_default(destMode);\n const inDestGamut = inGamut(destMode);\n return (color) => {\n const original = prepare_default(color);\n if (!original) {\n return void 0;\n }\n const converted = destConv(original);\n if (inDestGamut(converted)) {\n return original;\n }\n const clamped = fixup_rgb(converted);\n if (original.mode === clamped.mode) {\n return clamped;\n }\n return converter_default(original.mode)(clamped);\n };\n }\n function clampChroma(color, mode = \"lch\", rgbGamut = \"rgb\") {\n color = prepare_default(color);\n let inDestinationGamut = rgbGamut === \"rgb\" ? displayable : inGamut(rgbGamut);\n let clipToGamut = rgbGamut === \"rgb\" ? to_displayable_srgb : clampGamut(rgbGamut);\n if (color === void 0 || inDestinationGamut(color)) return color;\n let conv = converter_default(color.mode);\n color = converter_default(mode)(color);\n let clamped = { ...color, c: 0 };\n if (!inDestinationGamut(clamped)) {\n return conv(clipToGamut(clamped));\n }\n let start = 0;\n let end = color.c !== void 0 ? color.c : 0;\n let range = getMode(mode).ranges.c;\n let resolution = (range[1] - range[0]) / Math.pow(2, 13);\n let _last_good_c = clamped.c;\n while (end - start > resolution) {\n clamped.c = start + (end - start) * 0.5;\n if (inDestinationGamut(clamped)) {\n _last_good_c = clamped.c;\n start = clamped.c;\n } else {\n end = clamped.c;\n }\n }\n return conv(\n inDestinationGamut(clamped) ? clamped : { ...clamped, c: _last_good_c }\n );\n }\n\n // node_modules/culori/src/wcag.js\n function luminance(color) {\n let c2 = converter_default(\"lrgb\")(color);\n return 0.2126 * c2.r + 0.7152 * c2.g + 0.0722 * c2.b;\n }\n function contrast(a, b) {\n let L1 = luminance(a);\n let L2 = luminance(b);\n return (Math.max(L1, L2) + 0.05) / (Math.min(L1, L2) + 0.05);\n }\n\n // node_modules/culori/src/index.js\n var a98 = useMode(definition_default2);\n var cubehelix = useMode(definition_default3);\n var dlab = useMode(definition_default4);\n var dlch = useMode(definition_default5);\n var hsi = useMode(definition_default6);\n var hsl2 = useMode(definition_default7);\n var hsv = useMode(definition_default8);\n var hwb = useMode(definition_default9);\n var itp = useMode(definition_default10);\n var jab = useMode(definition_default11);\n var jch = useMode(definition_default12);\n var lab = useMode(definition_default13);\n var lab65 = useMode(definition_default14);\n var lch = useMode(definition_default15);\n var lch65 = useMode(definition_default16);\n var lchuv = useMode(definition_default17);\n var lrgb = useMode(definition_default18);\n var luv = useMode(definition_default19);\n var okhsl = useMode(modeOkhsl_default);\n var okhsv = useMode(modeOkhsv_default);\n var oklab = useMode(definition_default20);\n var oklch = useMode(definition_default21);\n var p3 = useMode(definition_default22);\n var prophoto = useMode(definition_default23);\n var rec2020 = useMode(definition_default24);\n var rgb3 = useMode(definition_default);\n var xyb = useMode(definition_default25);\n var xyz50 = useMode(definition_default26);\n var xyz65 = useMode(definition_default27);\n var yiq = useMode(definition_default28);\n\n // packages/xtyle/dist/color.js\n var toOklch = converter_default(\"oklch\");\n var DEFAULT_OKLCH = { l: 0, c: 0, h: 0, alpha: 1 };\n function toOklchColor(input) {\n if (typeof input !== \"string\")\n return input;\n const parsed = parse_default(input);\n if (!parsed)\n throw new Error(`xtyle: unparseable color \"${input}\"`);\n const o = toOklch(parsed);\n if (!o)\n throw new Error(`xtyle: cannot convert color \"${input}\" to oklch`);\n return {\n l: clamp01(o.l ?? 0),\n c: Math.max(0, o.c ?? 0),\n h: o.h ?? 0,\n alpha: o.alpha ?? 1\n };\n }\n function oklch2(l, c2, h, alpha2 = 1) {\n return { l: clamp01(l), c: Math.max(0, c2), h: (h % 360 + 360) % 360, alpha: alpha2 };\n }\n function withLightness(color, l) {\n return { ...color, l: clamp01(l) };\n }\n function withAlpha(color, alpha2) {\n return { ...color, alpha: clamp01(alpha2) };\n }\n function hueDelta(from, to) {\n let d = ((to - from) % 360 + 360) % 360;\n if (d > 180)\n d -= 360;\n return d;\n }\n function lightness(input) {\n return toOklchColor(input).l;\n }\n function contrast2(a, b) {\n const value = contrast(formatCss2(a), formatCss2(b));\n return value ?? 1;\n }\n function clampToGamut(color) {\n const mapped = clampChroma({ mode: \"oklch\", l: color.l, c: color.c, h: color.h, alpha: color.alpha }, \"oklch\", \"rgb\");\n return {\n l: mapped.l ?? color.l,\n c: Math.max(0, mapped.c ?? 0),\n h: mapped.h ?? color.h,\n alpha: mapped.alpha ?? color.alpha\n };\n }\n function formatCss2(input) {\n const source = typeof input === \"string\" ? toOklchColor(input) : input;\n const color = clampToGamut(source);\n const culoriColor = {\n mode: \"oklch\",\n l: color.l,\n c: color.c,\n h: color.h,\n alpha: color.alpha\n };\n if (color.alpha < 1) {\n return formatRgb(culoriColor) ?? formatHex(culoriColor) ?? \"#000000\";\n }\n return formatHex(culoriColor) ?? \"#000000\";\n }\n function schemeOf(bg) {\n return lightness(bg) < 0.5 ? \"dark\" : \"light\";\n }\n function pickReadable(fill, options, floor = 4.5) {\n let best = options[0] ?? DEFAULT_OKLCH;\n let bestContrast = -1;\n for (const option of options) {\n const ratio = contrast2(fill, option);\n if (ratio >= floor)\n return formatCss2(option);\n if (ratio > bestContrast) {\n bestContrast = ratio;\n best = option;\n }\n }\n return formatCss2(best);\n }\n function clamp01(value) {\n if (Number.isNaN(value))\n return 0;\n return Math.min(1, Math.max(0, value));\n }\n\n // packages/xtyle/dist/graph.js\n var CycleError = class extends Error {\n constructor(cycle) {\n super(`xtyle: cycle detected in token graph: ${cycle.join(\" -> \")}`);\n __publicField(this, \"cycle\");\n this.cycle = cycle;\n this.name = \"CycleError\";\n }\n };\n function resolveGraph(nodes) {\n const byName = /* @__PURE__ */ new Map();\n for (const node of nodes)\n byName.set(node.name, node);\n const computed = /* @__PURE__ */ new Map();\n const visiting = /* @__PURE__ */ new Set();\n const done = /* @__PURE__ */ new Set();\n const stack = [];\n const visit = (name) => {\n if (done.has(name))\n return;\n const node = byName.get(name);\n if (!node)\n return;\n if (visiting.has(name)) {\n const start = stack.indexOf(name);\n throw new CycleError([...stack.slice(start), name]);\n }\n visiting.add(name);\n stack.push(name);\n for (const ref of node.refs ?? [])\n visit(ref);\n if (node.resolve) {\n const inputs = {};\n for (const [key, value] of computed)\n inputs[key] = value;\n computed.set(name, node.resolve(inputs));\n } else if (node.value !== void 0) {\n computed.set(name, node.value);\n }\n stack.pop();\n visiting.delete(name);\n done.add(name);\n };\n for (const node of nodes)\n visit(node.name);\n const resolved = {};\n for (const node of nodes) {\n const value = computed.get(node.name);\n if (value !== void 0)\n resolved[node.name] = value;\n }\n return resolved;\n }\n\n // packages/xtyle/dist/vocab.js\n var TONES = [\"accent\", \"neutral\", \"danger\", \"success\", \"warn\", \"info\"];\n var ACCENT_VARIANTS = [\"accent-2\", \"accent-3\", \"accent-4\"];\n var HUES = [\n \"red\",\n \"orange\",\n \"yellow\",\n \"green\",\n \"blue\",\n \"purple\",\n \"brown\",\n \"pink\",\n \"cyan\",\n \"gray\",\n \"white\",\n \"black\"\n ];\n var FULL_TONES = [...TONES, ...ACCENT_VARIANTS, ...HUES];\n\n // packages/xtyle/dist/algorithms/factory.js\n var AA = 4.5;\n var AAA = 7;\n var ENFORCE = AA + 0.2;\n var SURFACE_SEPARATION = 1.5;\n var BORDER_SEPARATION = 1.5;\n var DIVIDER_SEPARATION = 1.8;\n var DEFAULT_SHIFT_STEP = 90;\n var DEFAULT_ACCENT_SPLIT = 45;\n var DERIVED_SURFACE_TINT_C = 0.02;\n var ACCENT_FAN = \"split-complement\";\n var ACHROMATIC_CHROMA = 0.02;\n var DERIVED_ACCENT_HUE_ROTATION = 150;\n var DERIVED_ACCENT_FALLBACK_HUE = 250;\n var DERIVED_ACCENT_L = 0.62;\n var DERIVED_ACCENT_C = 0.16;\n var ACCENT_RAMP_L_MIN = 0.1;\n var ACCENT_RAMP_L_MAX = 0.95;\n var HUE_STABLE_CHROMA = 0.1;\n var FAN_MIN_CHROMA = 0.045;\n var HUE_TOLERANCE = 8;\n var LIGHTNESS_TOLERANCE = 0.05;\n var DEFAULT_TYPE_SCALE = 1.2;\n var DEFAULT_RADIUS_SCALE = 1;\n var BASE_TEXT_REM = 1;\n var DEFAULT_FONTS = {\n sans: 'system-ui, -apple-system, \"Segoe UI\", Roboto, sans-serif',\n mono: 'ui-monospace, \"SF Mono\", \"Cascadia Code\", Consolas, monospace',\n display: '\"Avenir Next\", \"Futura\", \"Century Gothic\", \"Trebuchet MS\", system-ui, -apple-system, \"Segoe UI\", sans-serif'\n };\n var TEXT_LIGHT = { l: 0.98, c: 0, h: 0, alpha: 1 };\n var TEXT_DARK = { l: 0.15, c: 0, h: 0, alpha: 1 };\n var TRUE_WHITE = { l: 1, c: 0, h: 0, alpha: 1 };\n var TRUE_BLACK = { l: 0, c: 0, h: 0, alpha: 1 };\n var TEXT_POLES = [TRUE_WHITE, TRUE_BLACK];\n function bestTruePole(bg) {\n return contrast2(TRUE_BLACK, bg) >= contrast2(TRUE_WHITE, bg) ? TRUE_BLACK : TRUE_WHITE;\n }\n var STATUS_TO_HUE = {\n success: \"green\",\n warn: \"yellow\",\n danger: \"red\",\n info: \"blue\"\n };\n var NEUTRAL_ACCENT_CHROMA = 0.13;\n var PALETTE_HUES = {\n red: { h: 25, c: 0.2 },\n orange: { h: 55, c: 0.18 },\n yellow: { h: 95, c: 0.17 },\n green: { h: 145, c: 0.18 },\n blue: { h: 250, c: 0.18 },\n purple: { h: 300, c: 0.18 },\n brown: { h: 50, c: 0.08 },\n pink: { h: 350, c: 0.16 },\n cyan: { h: 200, c: 0.14 },\n gray: \"gray\",\n white: \"white\",\n black: \"black\"\n };\n var PALETTE_STOPS = [\"subtle\", \"muted\", \"base\", \"strong\", \"contrast\"];\n var CODE_VIVID_ROLES = [\n \"keyword\",\n \"number\",\n \"function\",\n \"type\",\n \"string\",\n \"tag\",\n \"attr\",\n \"regexp\"\n ];\n var CODE_HUE_RANK = [0, 4, 2, 6, 1, 5, 3, 7];\n var CODE_STRUCTURAL_ROLES = [\"comment\", \"operator\", \"punctuation\", \"variable\"];\n var CODE_SCOPES = [...CODE_VIVID_ROLES, ...CODE_STRUCTURAL_ROLES];\n var CODE_SURFACES = [\"--code-bg\", \"--code-fg\", \"--code-line-highlight\", \"--code-selection\"];\n var SURFACES = [\"--body-bg\", \"--bg-0\", \"--bg-1\", \"--bg-2\", \"--bg-3\"];\n var PANEL_REF_INDEX = SURFACES.indexOf(\"--bg-2\");\n var PANEL_SURFACES = [\"--bg-1\", \"--bg-2\"];\n var TEXT_STEPS = [\"xs\", \"sm\", \"body\", \"lg\", \"xl\", \"2xl\", \"3xl\", \"4xl\", \"5xl\"];\n var LEADING_STEPS = [\"tight\", \"normal\", \"loose\"];\n var WEIGHT_STEPS = [\"normal\", \"medium\", \"semibold\", \"bold\"];\n var RADIUS_STEPS = [\"none\", \"sm\", \"md\", \"lg\", \"full\"];\n var BORDER_STEPS = [\"thin\", \"normal\", \"thick\"];\n var DURATION_STEPS = [\"fast\", \"base\", \"slow\"];\n var EASE_STEPS = [\"standard\", \"emphasized\"];\n var SPACE_STEPS = [0, 1, 2, 3, 4, 5, 6, 7, 8];\n var ELEVATION_STEPS = [0, 1, 2, 3, 4, 5];\n var WEIGHT_VALUES = {\n normal: 400,\n medium: 500,\n semibold: 600,\n bold: 700\n };\n var LEADING_VALUES = {\n tight: 1.2,\n normal: 1.5,\n loose: 1.8\n };\n var DENSITY_MULTIPLIER = {\n compact: 0.8,\n normal: 1,\n comfortable: 1.25\n };\n var SPACE_BASE_REM = 0.25;\n function buildProduces() {\n const produces = [];\n const categories = {};\n const add = (name, category) => {\n produces.push(name);\n categories[name] = category;\n };\n add(\"--bg-sunken\", \"color\");\n for (const s of SURFACES)\n add(s, \"color\");\n add(\"--scrim\", \"color\");\n add(\"--surface-overlay\", \"color\");\n add(\"--surface-overlay-border\", \"color\");\n for (let i = 0; i <= 3; i++)\n add(`--fg-${i}`, \"color\");\n add(\"--fg-disabled\", \"color\");\n add(\"--placeholder\", \"color\");\n add(\"--line\", \"color\");\n add(\"--line-2\", \"color\");\n add(\"--ring\", \"color\");\n add(\"--ring-bg\", \"color\");\n add(\"--accent\", \"color\");\n add(\"--accent-hover\", \"color\");\n add(\"--accent-active\", \"color\");\n add(\"--accent-bg\", \"color\");\n add(\"--accent-fg\", \"color\");\n add(\"--accent-text\", \"color\");\n add(\"--accent-vivid\", \"color\");\n for (const n of [\"2\", \"3\", \"4\"]) {\n add(`--accent-${n}`, \"color\");\n add(`--accent-${n}-bg`, \"color\");\n add(`--accent-${n}-fg`, \"color\");\n add(`--accent-${n}-text`, \"color\");\n add(`--accent-${n}-vivid`, \"color\");\n }\n add(\"--accent-shift-step\", \"number\");\n add(\"--neutral\", \"color\");\n add(\"--neutral-bg\", \"color\");\n add(\"--neutral-fg\", \"color\");\n add(\"--neutral-text\", \"color\");\n add(\"--neutral-vivid\", \"color\");\n add(\"--field-bg\", \"color\");\n add(\"--field-border\", \"color\");\n for (const role of Object.keys(STATUS_TO_HUE)) {\n add(`--${role}`, \"color\");\n add(`--${role}-bg`, \"color\");\n add(`--${role}-fg`, \"color\");\n add(`--${role}-text`, \"color\");\n add(`--${role}-vivid`, \"color\");\n }\n for (const s of [\"hover\", \"press\", \"selected\", \"disabled\", \"drag\"]) {\n add(`--state-${s}`, \"color\");\n }\n add(\"--link\", \"color\");\n add(\"--link-hover\", \"color\");\n add(\"--selection\", \"color\");\n add(\"--highlight\", \"color\");\n add(\"--selection-cue\", \"keyword\");\n add(\"--shadow\", \"shadow\");\n for (const hue3 of Object.keys(PALETTE_HUES)) {\n add(`--color-${hue3}`, \"color\");\n for (const stop of PALETTE_STOPS)\n add(`--color-${hue3}-${stop}`, \"color\");\n add(`--${hue3}`, \"color\");\n add(`--${hue3}-bg`, \"color\");\n add(`--${hue3}-fg`, \"color\");\n add(`--${hue3}-text`, \"color\");\n add(`--${hue3}-vivid`, \"color\");\n }\n for (const t of CODE_SURFACES)\n add(t, \"color\");\n for (const role of CODE_SCOPES)\n add(`--code-${role}`, \"color\");\n add(\"--font-sans\", \"font\");\n add(\"--font-mono\", \"font\");\n add(\"--font-display\", \"font\");\n for (const step of TEXT_STEPS)\n add(`--text-${step}`, \"length\");\n for (const step of LEADING_STEPS)\n add(`--leading-${step}`, \"number\");\n for (const step of WEIGHT_STEPS)\n add(`--weight-${step}`, \"number\");\n for (const step of RADIUS_STEPS)\n add(`--radius-${step}`, \"length\");\n for (const step of BORDER_STEPS)\n add(`--border-${step}`, \"length\");\n for (const step of DURATION_STEPS)\n add(`--duration-${step}`, \"duration\");\n for (const step of EASE_STEPS)\n add(`--ease-${step}`, \"easing\");\n for (const step of ELEVATION_STEPS)\n add(`--elevation-${step}`, \"shadow\");\n for (const step of SPACE_STEPS)\n add(`--space-${step}`, \"length\");\n return { produces, categories };\n }\n var { produces: PRODUCES, categories: CATEGORIES } = buildProduces();\n var KEYWORD_DOMAINS = {\n \"--selection-cue\": [\"tint\", \"marker\"]\n };\n function stepLightness(base, scheme, step, index) {\n const direction = scheme === \"dark\" ? 1 : -1;\n return base + direction * step * index;\n }\n function contrastBandFloor(knobs) {\n const band = knobs.contrastBand;\n if (typeof band === \"number\")\n return band;\n if (band === \"aaa\")\n return AAA;\n if (band === \"aa\")\n return AA;\n return void 0;\n }\n function vibrancyOf(knobs, preset) {\n const v = typeof knobs.vibrancy === \"number\" ? knobs.vibrancy : preset.defaultVibrancy;\n return Math.min(1, Math.max(0, v));\n }\n function typeScaleOf(knobs) {\n const v = typeof knobs.typeScale === \"number\" ? knobs.typeScale : DEFAULT_TYPE_SCALE;\n return Math.min(2, Math.max(1.05, v));\n }\n function radiusScaleOf(knobs) {\n const v = typeof knobs.radiusScale === \"number\" ? knobs.radiusScale : DEFAULT_RADIUS_SCALE;\n return Math.max(0, v);\n }\n function densityOf(knobs) {\n const d = knobs.density;\n if (typeof d === \"number\")\n return Math.max(0.4, d);\n if (d === \"compact\" || d === \"comfortable\")\n return DENSITY_MULTIPLIER[d];\n return DENSITY_MULTIPLIER.normal;\n }\n function fontsOf(knobs) {\n return {\n sans: knobs.fonts?.sans ?? DEFAULT_FONTS.sans,\n mono: knobs.fonts?.mono ?? DEFAULT_FONTS.mono,\n display: knobs.fonts?.display ?? DEFAULT_FONTS.display\n };\n }\n function emittedContrast(fg, bgCss) {\n return contrast2(formatCss2(fg), bgCss);\n }\n function enforceContrastFloor(fg, bg, scheme, floor = ENFORCE) {\n const bgCss = formatCss2(bg);\n if (emittedContrast(fg, bgCss) >= floor)\n return fg;\n const preferred = scheme === \"dark\" ? TRUE_WHITE.l : TRUE_BLACK.l;\n const other = scheme === \"dark\" ? TRUE_BLACK.l : TRUE_WHITE.l;\n const swept = sweepToward(fg, bgCss, preferred, floor) ?? sweepToward(fg, bgCss, other, floor);\n const pole = bestTruePole(bgCss);\n if (!swept)\n return pole;\n return emittedContrast(pole, bgCss) > emittedContrast(swept, bgCss) ? pole : swept;\n }\n function sweepToward(fg, bgCss, targetL, floor) {\n for (let i = 0; i <= 100; i++) {\n const t = i / 100;\n const candidate = {\n l: fg.l + (targetL - fg.l) * t,\n c: fg.c * (1 - t),\n h: fg.h,\n alpha: fg.alpha\n };\n if (emittedContrast(candidate, bgCss) >= floor)\n return candidate;\n }\n return null;\n }\n function bestPoleContrast(bg) {\n return Math.max(contrast2(TEXT_LIGHT, bg), contrast2(TEXT_DARK, bg));\n }\n function ensureTextHeadroom(bg, scheme, floor = ENFORCE) {\n if (bestPoleContrast(bg) >= floor)\n return bg;\n const target = scheme === \"dark\" ? 0 : 1;\n let candidate = bg;\n for (let i = 1; i <= 100; i++) {\n const t = i / 100;\n candidate = withLightness(bg, bg.l + (target - bg.l) * t);\n if (bestPoleContrast(candidate) >= floor)\n return candidate;\n }\n return withLightness(bg, target);\n }\n function fillWithTextHeadroom(l, c2, h, floor = ENFORCE) {\n const seed = oklch2(l, c2, h);\n if (bestPoleContrast(seed) >= floor)\n return seed;\n let fallback = seed;\n for (let i = 1; i <= 100; i++) {\n const down = oklch2(l - l * i / 100, c2, h);\n if (bestPoleContrast(down) >= floor)\n return down;\n const up = oklch2(l + (1 - l) * i / 100, c2, h);\n if (bestPoleContrast(up) >= floor)\n return up;\n fallback = bestPoleContrast(down) >= bestPoleContrast(up) ? down : up;\n }\n return fallback;\n }\n function lightnessForContrast(pole, bg, bgCss, target) {\n let bestL = pole.l;\n for (let i = 0; i <= 200; i++) {\n const t = i / 200;\n const candidateL = pole.l + (bg.l - pole.l) * t;\n if (emittedContrast(withLightness(pole, candidateL), bgCss) >= target)\n bestL = candidateL;\n else\n break;\n }\n return bestL;\n }\n function liftStopForContrast(fg, bgCss, target, towardLight) {\n if (contrast2(formatCss2(fg), bgCss) >= target)\n return fg;\n const poleL = towardLight ? 1 : 0;\n let best = fg;\n for (let i = 1; i <= 100; i++) {\n const candidate = clampToGamut(oklch2(fg.l + (poleL - fg.l) * (i / 100), fg.c, fg.h));\n best = candidate;\n if (contrast2(formatCss2(candidate), bgCss) >= target)\n return candidate;\n }\n return best;\n }\n function separateFillFromSurface(fill, surface, separation, textFloor) {\n const surfaceCss = formatCss2(surface);\n if (contrast2(formatCss2(fill), surfaceCss) >= separation)\n return fill;\n const headroom = Math.min(textFloor, bestPoleContrast(fill));\n const poleL = surface.l < 0.5 ? 1 : 0;\n let best = fill;\n for (let i = 1; i <= 100; i++) {\n const candidate = clampToGamut(oklch2(fill.l + (poleL - fill.l) * (i / 100), fill.c, fill.h));\n best = candidate;\n if (contrast2(formatCss2(candidate), surfaceCss) >= separation && bestPoleContrast(candidate) >= headroom - 0.01) {\n return candidate;\n }\n }\n return best;\n }\n function borderForContrast(seed, surface, minContrast) {\n const surfaceCss = formatCss2(surface);\n if (emittedContrast(seed, surfaceCss) >= minContrast)\n return seed;\n const targetL = surface.l < 0.5 ? 1 : 0;\n let candidate = seed;\n for (let i = 1; i <= 100; i++) {\n candidate = withLightness(seed, seed.l + (targetL - seed.l) * (i / 100));\n if (emittedContrast(candidate, surfaceCss) >= minContrast)\n break;\n }\n return candidate;\n }\n function readableOnTint(tint, hue3, floor, inkChroma) {\n const tintCss = formatCss2(tint);\n const towardDark = contrast2(\"#000000\", tintCss) >= contrast2(\"#ffffff\", tintCss);\n const targetL = towardDark ? 0 : 1;\n const seedChroma = inkChroma ?? (towardDark ? 0.06 : 0.04);\n const seed = oklch2(tint.l + (towardDark ? -0.4 : 0.4), seedChroma, hue3);\n for (let i = 0; i <= 100; i++) {\n const t = i / 100;\n const css = formatCss2({\n l: seed.l + (targetL - seed.l) * t,\n c: seed.c * (1 - t),\n h: hue3,\n alpha: 1\n });\n if (contrast2(css, tintCss) >= floor)\n return css;\n }\n return towardDark ? \"#000000\" : \"#ffffff\";\n }\n function readableHuedOnTintAndPanel(tint, hue3, tintFloor, panels, panelFloor, seedChroma) {\n const tintCss = formatCss2(tint);\n const panelCss = panels.map((p4) => formatCss2(p4));\n const sweep = (towardDark) => {\n const targetL = towardDark ? 0 : 1;\n const seed = towardDark ? oklch2(tint.l - 0.4, seedChroma, hue3) : oklch2(tint.l + 0.4, seedChroma * 0.667, hue3);\n const out = [];\n for (let i = 0; i <= 100; i++) {\n const t = i / 100;\n out.push(formatCss2({\n l: seed.l + (targetL - seed.l) * t,\n c: seed.c * (1 - t),\n h: hue3,\n alpha: 1\n }));\n }\n return out;\n };\n const minPanel = (css) => panelCss.length === 0 ? Infinity : Math.min(...panelCss.map((p4) => contrast2(css, p4)));\n let best = null;\n let bestMin = -1;\n for (const towardDark of [true, false]) {\n for (const css of sweep(towardDark)) {\n if (contrast2(css, tintCss) < tintFloor)\n continue;\n const m = minPanel(css);\n if (m >= panelFloor)\n return css;\n if (m > bestMin) {\n bestMin = m;\n best = css;\n }\n }\n }\n return best ?? readableOnTint(tint, hue3, tintFloor);\n }\n function vividOnPanel(hue3, panels, floor, targetChroma) {\n const panelCss = panels.map((p4) => formatCss2(p4));\n const minPanel = (css) => panelCss.length === 0 ? Infinity : Math.min(...panelCss.map((p4) => contrast2(css, p4)));\n const avgL = panels.reduce((sum, p4) => sum + p4.l, 0) / Math.max(1, panels.length);\n const towardLight = avgL < 0.5;\n let best = null;\n let bestChroma = -1;\n for (let i = 0; i <= 80; i++) {\n const t = i / 80;\n const l = towardLight ? 0.5 + t * 0.45 : 0.5 - t * 0.42;\n const chroma = clampToGamut(oklch2(l, targetChroma, hue3)).c;\n const css = formatCss2(oklch2(l, chroma, hue3));\n if (minPanel(css) >= floor && chroma > bestChroma) {\n bestChroma = chroma;\n best = css;\n }\n }\n return best ?? (towardLight ? \"#ffffff\" : \"#000000\");\n }\n function deriveAccentAnchor(bg, fg) {\n const sourceHue = bg.c >= ACHROMATIC_CHROMA ? bg.h : fg.c >= ACHROMATIC_CHROMA ? fg.h : void 0;\n const hue3 = sourceHue === void 0 ? DERIVED_ACCENT_FALLBACK_HUE : ((sourceHue + DERIVED_ACCENT_HUE_ROTATION) % 360 + 360) % 360;\n return clampToGamut(oklch2(DERIVED_ACCENT_L, DERIVED_ACCENT_C, hue3));\n }\n function shadowString(scheme, level, vibrancy, preset) {\n if (level <= 0)\n return \"none\";\n const baseAlpha = (scheme === \"dark\" ? 0.5 : 0.16) + vibrancy * 0.1 + preset.elevationAlphaBoost;\n const y = Math.max(1, Math.round(level * 2 * preset.elevationStrengthMul));\n const blur = Math.max(1, Math.round(level * 4 * preset.elevationStrengthMul));\n const spread = Math.max(0, level - 3);\n const alpha2 = Math.min(0.92, baseAlpha + level * 0.04);\n const ambientY = Math.max(1, Math.round(level / 2));\n const ambientBlur = Math.max(1, Math.round(level * 2 * preset.elevationStrengthMul));\n const ambientAlpha = Math.min(0.7, alpha2 * 0.6);\n return [\n `0 ${y}px ${blur}px ${spread}px rgba(0, 0, 0, ${alpha2.toFixed(2)})`,\n `0 ${ambientY}px ${ambientBlur}px 0 rgba(0, 0, 0, ${ambientAlpha.toFixed(2)})`\n ].join(\", \");\n }\n function paletteRamp(register, hue3, spec2, scheme, vibrancy, floor, preset, accent, panels, pinnedBase) {\n const set = (suffix, color) => {\n register[suffix ? `--color-${hue3}-${suffix}` : `--color-${hue3}`] = formatCss2(color);\n };\n const family = (solid, bg, fg, text, vivid) => {\n register[`--${hue3}`] = solid;\n register[`--${hue3}-bg`] = bg;\n register[`--${hue3}-fg`] = fg;\n register[`--${hue3}-text`] = text;\n register[`--${hue3}-vivid`] = vivid;\n };\n const grayscale = (lights, chroma2) => {\n const stops2 = lights.map((l) => oklch2(l, chroma2, 0));\n const baseStop = stops2[2];\n const subtleStop2 = stops2[0];\n const strongStop2 = liftStopForContrast(stops2[3], formatCss2(subtleStop2), AA + 0.2, stops2[3].l >= subtleStop2.l);\n const contrast4 = readableOnTint(baseStop, 0, AA + 0.3, 0);\n set(\"\", baseStop);\n set(\"subtle\", subtleStop2);\n set(\"muted\", stops2[1]);\n set(\"base\", baseStop);\n set(\"strong\", strongStop2);\n register[`--color-${hue3}-contrast`] = contrast4;\n family(formatCss2(baseStop), formatCss2(subtleStop2), contrast4, readableOnTint(subtleStop2, 0, AA + 0.2, 0), vividOnPanel(0, panels, floor, 0));\n };\n if (spec2 === \"white\") {\n grayscale([0.82, 0.9, 0.97, 1], 0);\n return;\n }\n if (spec2 === \"black\") {\n grayscale([0.05, 0.12, 0.2, 0.32], 0);\n return;\n }\n if (spec2 === \"gray\") {\n grayscale([0.4, 0.55, 0.68, 0.82], 5e-3);\n return;\n }\n const accentChromaFactor = Math.max(0.5, Math.min(1.6, accent.c / NEUTRAL_ACCENT_CHROMA));\n const chroma = spec2.c * accentChromaFactor * (0.6 + vibrancy * 0.7) * preset.paletteChromaMul;\n const baseL = scheme === \"dark\" ? 0.7 : 0.55;\n const lBias = Math.max(-0.06, Math.min(0.06, (accent.l - baseL) * 0.25));\n const ladderL = (scheme === \"dark\" ? [0.45, 0.58, baseL, 0.82] : [0.78, 0.66, baseL, 0.42]).map((l) => Math.max(0.05, Math.min(0.97, l + lBias)));\n const ladderC = [chroma * 0.7, chroma * 0.9, chroma, chroma * 0.85];\n const stops = ladderL.map((l, i) => clampToGamut(oklch2(l, ladderC[i], spec2.h)));\n const base = stops[2];\n const solidBase = pinnedBase ?? base;\n const subtleStop = stops[0];\n const strongStop = liftStopForContrast(stops[3], formatCss2(subtleStop), AA + 0.2, stops[3].l >= subtleStop.l);\n const contrast3 = readableOnTint(solidBase, spec2.h, Math.max(floor, AA + 0.3));\n set(\"\", base);\n set(\"subtle\", subtleStop);\n set(\"muted\", stops[1]);\n set(\"base\", base);\n set(\"strong\", strongStop);\n register[`--color-${hue3}-contrast`] = contrast3;\n const bg0p = panels[0];\n const washL = scheme === \"dark\" ? Math.max(0.2, bg0p.l + 0.08) : Math.min(0.92, bg0p.l - 0.04);\n const bgTint = ensureTextHeadroom(oklch2(washL, chroma * 0.35, spec2.h), scheme, AA + 0.3);\n const bgText = readableHuedOnTintAndPanel(bgTint, spec2.h, AA + 0.3, panels.slice(1), AA + 0.05, chroma);\n family(formatCss2(solidBase), formatCss2(bgTint), contrast3, bgText, vividOnPanel(spec2.h, panels, floor, chroma));\n }\n function schemeFromFg(fg) {\n return fg.l >= 0.5 ? \"dark\" : \"light\";\n }\n function deriveSurface(scheme, hue3, chroma, depth, floor) {\n const l = scheme === \"dark\" ? depth : 1 - depth;\n return ensureTextHeadroom(oklch2(l, chroma, hue3), scheme, floor);\n }\n function completeAnchors(preset, opts) {\n const pin = opts.constraints ?? {};\n const givenBg = parsePin(pin[\"--bg-0\"]);\n const givenFg = parsePin(pin[\"--fg-0\"]);\n const givenAccent = parsePin(pin[\"--accent\"]);\n const defBg = toOklchColor(preset.defaultAnchors.bg);\n const defFg = toOklchColor(preset.defaultAnchors.fg);\n const defScheme = schemeOf(defBg);\n const surfaceDepth = defScheme === \"dark\" ? defBg.l : 1 - defBg.l;\n const floor = Math.max(ENFORCE, preset.contrastFloor);\n const inferredScheme = givenBg ? schemeOf(givenBg) : givenFg ? schemeFromFg(givenFg) : defScheme;\n const scheme = opts.knobs?.scheme ?? inferredScheme;\n let bg;\n if (givenBg) {\n bg = scheme === schemeOf(givenBg) ? givenBg : withLightness(givenBg, 1 - givenBg.l);\n } else if (givenAccent || givenFg) {\n const hue3 = givenAccent?.h ?? givenFg.h;\n const tint = givenAccent ? DERIVED_SURFACE_TINT_C : 5e-3;\n bg = deriveSurface(scheme, hue3, tint, surfaceDepth, floor);\n } else {\n bg = scheme === defScheme ? defBg : withLightness(defBg, 1 - defBg.l);\n }\n const fg = givenFg ?? defFg;\n const accentExplicit = givenAccent !== null || preset.defaultAnchors.accent !== void 0;\n const accent = givenAccent ?? (preset.defaultAnchors.accent ? toOklchColor(preset.defaultAnchors.accent) : deriveAccentAnchor(bg, fg));\n return { bg, fg, accent, scheme, accentExplicit };\n }\n function parsePin(value) {\n if (!value)\n return null;\n try {\n const o = toOklchColor(value);\n if (Number.isNaN(o.l) || Number.isNaN(o.c))\n return null;\n return o;\n } catch {\n return null;\n }\n }\n function parseChromaticPin(value) {\n const o = parsePin(value);\n if (!o || Number.isNaN(o.h) || o.c < ACHROMATIC_CHROMA)\n return null;\n return o;\n }\n function paletteHueAngle(name) {\n const spec2 = PALETTE_HUES[name];\n return typeof spec2 === \"object\" ? spec2.h : 0;\n }\n function resolveStatusHue(role, pinned) {\n const name = STATUS_TO_HUE[role] ?? \"red\";\n const pin = parseChromaticPin(pinned[`--${name}`] ?? pinned[`--color-${name}-base`] ?? pinned[`--color-${name}`]);\n return pin ? pin.h : paletteHueAngle(name);\n }\n function buildGraph(preset, opts) {\n const completed = completeAnchors(preset, opts);\n const bg = completed.bg;\n const fgAnchor = completed.fg;\n const pinned = opts.constraints ?? {};\n const accent = pinned[\"--accent\"] ? toOklchColor(pinned[\"--accent\"]) : completed.accent;\n const scheme = completed.scheme;\n const knobs = opts.knobs ?? {};\n const shiftStep = typeof knobs.accentShiftStep === \"number\" ? knobs.accentShiftStep : DEFAULT_SHIFT_STEP;\n const accentSplit = typeof knobs.accentSplit === \"number\" ? knobs.accentSplit : DEFAULT_ACCENT_SPLIT;\n const band = contrastBandFloor(knobs);\n const floor = Math.max(ENFORCE, preset.contrastFloor, (band ?? 0) + 0.2);\n const extreme = preset.extreme === true;\n let vibrancy = vibrancyOf(knobs, preset);\n if (extreme)\n vibrancy = 1;\n const typeScale = typeScaleOf(knobs);\n const radiusScale = radiusScaleOf(knobs);\n const density = densityOf(knobs);\n const fonts = fontsOf(knobs);\n const surfaceStep = 0.045;\n const nodes = [];\n const lit = (name, value, refs) => {\n nodes.push(refs && refs.length ? { name, value, refs } : { name, value });\n };\n const pinKeys = new Set(Object.keys(pinned));\n const refIfPinned = (...names) => names.filter((n) => pinKeys.has(n));\n lit(\"--scheme\", scheme);\n const bg0 = pinned[\"--bg-0\"] ? toOklchColor(pinned[\"--bg-0\"]) : extreme ? oklch2(scheme === \"dark\" ? 0 : 1, 0, 0) : ensureTextHeadroom(withLightness(bg, stepLightness(bg.l, scheme, surfaceStep, 1)), scheme, floor);\n const pageFloor = (fill) => separateFillFromSurface(fill, bg0, SURFACE_SEPARATION, floor);\n const direction = scheme === \"dark\" ? 1 : -1;\n const surfaceColors = SURFACES.map((_, index) => withLightness(bg0, bg0.l + direction * surfaceStep * (index - 1)));\n SURFACES.forEach((name, index) => {\n lit(name, formatCss2(surfaceColors[index]), refIfPinned(\"--bg-0\"));\n });\n lit(\"--bg-sunken\", formatCss2(withLightness(bg0, bg0.l - direction * surfaceStep * 2)), refIfPinned(\"--bg-0\"));\n lit(\"--scrim\", formatCss2(oklch2(scheme === \"dark\" ? 0 : 0.1, 0, 0, 0.6)));\n const overlayBase = withLightness(bg0, scheme === \"dark\" ? bg0.l + 0.07 : bg0.l + 0.03);\n lit(\"--surface-overlay\", formatCss2(overlayBase), refIfPinned(\"--bg-0\"));\n lit(\"--surface-overlay-border\", formatCss2(withAlpha(withLightness(bg0, scheme === \"dark\" ? bg0.l + 0.25 : bg0.l - 0.2), 0.6)), refIfPinned(\"--bg-0\"));\n const fg0 = pinned[\"--fg-0\"] ? toOklchColor(pinned[\"--fg-0\"]) : extreme ? bestTruePole(formatCss2(bg0)) : enforceContrastFloor(withLightness(fgAnchor, scheme === \"dark\" ? Math.max(fgAnchor.l, 0.9) : Math.min(fgAnchor.l, 0.2)), bg0, scheme, floor);\n lit(\"--fg-0\", formatCss2(fg0), refIfPinned(\"--bg-0\", \"--fg-0\"));\n const fgBg0Css = formatCss2(bg0);\n const fg0Contrast = emittedContrast(fg0, fgBg0Css);\n const panelRef = surfaceColors[PANEL_REF_INDEX];\n const panelRefCss = formatCss2(panelRef);\n const panelSurfaces = PANEL_SURFACES.map((s) => surfaceColors[SURFACES.indexOf(s)]);\n const rampFloor = extreme ? Math.min(fg0Contrast, Math.max(floor, fg0Contrast * 0.66)) : Math.min(floor, fg0Contrast);\n const conservativeFloorL = (target) => {\n const againstBg0 = lightnessForContrast(fg0, bg0, fgBg0Css, target);\n const againstPanel = lightnessForContrast(fg0, panelRef, panelRefCss, target);\n return Math.abs(againstBg0 - fg0.l) <= Math.abs(againstPanel - fg0.l) ? againstBg0 : againstPanel;\n };\n const textLight = scheme === \"dark\";\n const enforceOnPanels = (color) => {\n const onBg0 = enforceContrastFloor(color, bg0, scheme, floor);\n const sameSidePanels = panelSurfaces.filter((p4) => p4.l < 0.5 === textLight);\n if (sameSidePanels.length === 0)\n return onBg0;\n const panelCss = sameSidePanels.map((p4) => formatCss2(p4));\n const minPanel = (c2) => Math.min(...panelCss.map((p4) => emittedContrast(c2, p4)));\n if (minPanel(onBg0) >= floor - 0.01)\n return onBg0;\n const targetL = textLight ? 1 : 0;\n let best = onBg0;\n let bestMin = minPanel(onBg0);\n for (let i = 1; i <= 100; i++) {\n const t = i / 100;\n const candidate = withLightness(onBg0, onBg0.l + (targetL - onBg0.l) * t);\n if (emittedContrast(candidate, fgBg0Css) < floor - 0.01)\n break;\n const m = minPanel(candidate);\n if (m > bestMin) {\n bestMin = m;\n best = candidate;\n }\n if (m >= floor)\n break;\n }\n return best;\n };\n const enforceChromaticOnPanels = (color) => {\n const bg0Css = formatCss2(bg0);\n const sameSidePanels = panelSurfaces.filter((p4) => p4.l < 0.5 === textLight);\n const refsCss = [bg0Css, ...sameSidePanels.map((p4) => formatCss2(p4))];\n const minRef = (c2) => Math.min(...refsCss.map((r2) => emittedContrast(c2, r2)));\n if (minRef(color) >= floor - 0.01)\n return color;\n const targetL = textLight ? 1 : 0;\n for (let i = 1; i <= 100; i++) {\n const candidate = withLightness(color, color.l + (targetL - color.l) * (i / 100));\n if (minRef(candidate) >= floor)\n return candidate;\n }\n return enforceOnPanels(color);\n };\n const floorL = conservativeFloorL(rampFloor);\n for (let i = 1; i <= 3; i++) {\n const reduced = withLightness(fg0, fg0.l + (floorL - fg0.l) * (i / 3));\n lit(`--fg-${i}`, formatCss2(reduced), [\"--fg-0\", ...refIfPinned(\"--bg-0\")]);\n }\n lit(\"--fg-disabled\", formatCss2(withLightness(fg0, conservativeFloorL(3))), [\"--fg-0\", ...refIfPinned(\"--bg-0\")]);\n const placeholderFloor = extreme ? rampFloor : Math.min(floor, fg0Contrast);\n const placeholderL = conservativeFloorL(placeholderFloor);\n lit(\"--placeholder\", formatCss2(withLightness(fg0, placeholderL)), [\"--fg-0\", ...refIfPinned(\"--bg-0\")]);\n const accentFill = pinned[\"--accent\"] || completed.accentExplicit ? accent : pageFloor(fillWithTextHeadroom(accent.l, accent.c * (0.6 + vibrancy * 0.8) * preset.accentChromaMul, accent.h, floor));\n const accentValue = pinned[\"--accent\"] ?? formatCss2(accentFill);\n lit(\"--accent\", accentValue, refIfPinned(\"--accent\"));\n lit(\"--accent-fg\", pickReadable(accentFill, TEXT_POLES, floor), [\"--accent\"]);\n const accentTextColor = enforceChromaticOnPanels(accentFill);\n const accentTextCss = formatCss2(accentTextColor);\n const accentTint = liftStopForContrast(oklch2(scheme === \"dark\" ? Math.max(0.2, bg0.l + 0.08) : Math.min(0.92, bg0.l - 0.04), accentFill.c * preset.accentTintChromaMul, accentFill.h), accentTextCss, AA + 0.2, accentTextColor.l < 0.5);\n lit(\"--accent-bg\", formatCss2(accentTint), [\"--accent\", ...refIfPinned(\"--bg-0\")]);\n lit(\"--accent-text\", accentTextCss, [\"--accent\", ...refIfPinned(\"--bg-0\")]);\n lit(\"--accent-vivid\", vividOnPanel(accentFill.h, [bg0, ...panelSurfaces], floor, accentFill.c), [\"--accent\", ...refIfPinned(\"--bg-0\")]);\n const pinnedNeutral = parsePin(pinned[\"--neutral\"]);\n const neutralFill = pinnedNeutral ?? pageFloor(fillWithTextHeadroom(scheme === \"dark\" ? 0.6 : 0.5, preset.neutralChroma, accentFill.h, floor));\n const neutralTintHue = Number.isFinite(neutralFill.h) ? neutralFill.h : accentFill.h;\n lit(\"--neutral\", formatCss2(neutralFill), [\"--accent\", ...refIfPinned(\"--neutral\")]);\n const neutralTextColor = enforceOnPanels(neutralFill);\n const neutralTextCss = formatCss2(neutralTextColor);\n const neutralTint = liftStopForContrast(oklch2(scheme === \"dark\" ? Math.max(0.2, bg0.l + 0.06) : Math.min(0.92, bg0.l - 0.04), 5e-3, neutralTintHue), neutralTextCss, AA + 0.2, neutralTextColor.l < 0.5);\n lit(\"--neutral-bg\", formatCss2(neutralTint), [\"--accent\", ...refIfPinned(\"--bg-0\")]);\n lit(\"--neutral-fg\", pickReadable(neutralFill, TEXT_POLES, floor), [\"--neutral\"]);\n lit(\"--neutral-text\", neutralTextCss, [\"--neutral\", ...refIfPinned(\"--bg-0\")]);\n lit(\"--neutral-vivid\", neutralTextCss, [\"--neutral-text\", ...refIfPinned(\"--bg-0\")]);\n const lineSeed = extreme ? oklch2(scheme === \"dark\" ? 0.7 : 0.3, 0, 0) : withLightness(bg0, scheme === \"dark\" ? bg0.l + 0.12 : bg0.l - 0.12);\n lit(\"--line\", formatCss2(borderForContrast(lineSeed, bg0, BORDER_SEPARATION)), refIfPinned(\"--bg-0\"));\n const line2Seed = extreme ? oklch2(scheme === \"dark\" ? 0.85 : 0.15, 0, 0) : withLightness(bg0, scheme === \"dark\" ? bg0.l + 0.2 : bg0.l - 0.2);\n lit(\"--line-2\", formatCss2(borderForContrast(line2Seed, bg0, DIVIDER_SEPARATION)), refIfPinned(\"--bg-0\"));\n lit(\"--ring\", formatCss2(withAlpha(accentFill, 0.7)), [\"--accent\"]);\n lit(\"--ring-bg\", formatCss2(withAlpha(accentFill, 0.18)), [\"--accent\"]);\n const fieldBg = withLightness(bg0, scheme === \"dark\" ? bg0.l - 0.03 : bg0.l + 0.02);\n lit(\"--field-bg\", formatCss2(fieldBg), refIfPinned(\"--bg-0\"));\n const fieldBorderSeed = extreme ? oklch2(scheme === \"dark\" ? 0.8 : 0.2, 0, 0) : withLightness(bg0, scheme === \"dark\" ? bg0.l + 0.16 : bg0.l - 0.16);\n lit(\"--field-border\", formatCss2(borderForContrast(fieldBorderSeed, fieldBg, BORDER_SEPARATION)), refIfPinned(\"--bg-0\"));\n lit(\"--accent-hover\", formatCss2(withLightness(accentFill, accentFill.l + (scheme === \"dark\" ? 0.06 : -0.06))), [\"--accent\"]);\n lit(\"--accent-active\", formatCss2(withLightness(accentFill, accentFill.l + (scheme === \"dark\" ? -0.06 : 0.06))), [\"--accent\"]);\n const accentDisplay = toOklchColor(accentValue);\n const accentDelta = (from, to) => ({\n dL: to.l - from.l,\n dC: to.c - from.c,\n dH: hueDelta(from.h, to.h)\n });\n const applyAccentDelta = (from, delta) => {\n const rawL = from.l + delta.dL;\n const l = delta.dL === 0 ? Math.min(1, Math.max(0, rawL)) : Math.min(ACCENT_RAMP_L_MAX, Math.max(ACCENT_RAMP_L_MIN, rawL));\n return {\n l,\n c: Math.max(0, from.c + delta.dC),\n h: ((from.h + delta.dH) % 360 + 360) % 360,\n alpha: 1\n };\n };\n const emitAccent = (color) => {\n const maxC = clampToGamut({ l: color.l, c: color.c, h: color.h, alpha: 1 }).c;\n return formatCss2({ ...color, c: Math.min(color.c, maxC) });\n };\n const a1 = accentDisplay;\n const fanBase = { ...a1, c: Math.max(a1.c, FAN_MIN_CHROMA) };\n const rotate = (deg) => ({ dL: 0, dC: 0, dH: deg });\n const fanned = (n, derived) => pinned[`--accent-${n}`] ? toOklchColor(pinned[`--accent-${n}`]) : derived;\n let a2;\n let a3;\n let a4;\n let a2Refs;\n let a3Refs;\n let a4Refs;\n if (ACCENT_FAN === \"split-complement\") {\n const mirrorOf = (c2) => applyAccentDelta(fanBase, rotate(-hueDelta(a1.h, c2.h)));\n const a2Pin = pinned[\"--accent-2\"];\n const a3Pin = pinned[\"--accent-3\"];\n let a2Derived = applyAccentDelta(fanBase, rotate(-accentSplit));\n let a3Derived = applyAccentDelta(fanBase, rotate(accentSplit));\n if (a2Pin && !a3Pin)\n a3Derived = mirrorOf(toOklchColor(a2Pin));\n else if (a3Pin && !a2Pin)\n a2Derived = mirrorOf(toOklchColor(a3Pin));\n a2 = fanned(\"2\", a2Derived);\n a3 = fanned(\"3\", a3Derived);\n a4 = fanned(\"4\", applyAccentDelta(fanBase, rotate(180)));\n a2Refs = a3Pin && !a2Pin ? [\"--accent\", \"--accent-3\"] : [\"--accent\"];\n a3Refs = a2Pin && !a3Pin ? [\"--accent\", \"--accent-2\"] : [\"--accent\"];\n a4Refs = [\"--accent\"];\n } else {\n a2 = fanned(\"2\", applyAccentDelta(fanBase, rotate(shiftStep)));\n a3 = fanned(\"3\", applyAccentDelta(a2, accentDelta(fanBase, a2)));\n a4 = fanned(\"4\", applyAccentDelta(a3, accentDelta(a2, a3)));\n a2Refs = [\"--accent\", \"--accent-shift-step\"];\n a3Refs = [\"--accent-2\", \"--accent\"];\n a4Refs = [\"--accent-3\", \"--accent-2\"];\n }\n lit(\"--accent-2\", emitAccent(a2), a2Refs);\n lit(\"--accent-3\", emitAccent(a3), a3Refs);\n lit(\"--accent-4\", emitAccent(a4), a4Refs);\n lit(\"--accent-shift-step\", String(shiftStep));\n const emitAccentFamily = (n, raw) => {\n const color = toOklchColor(emitAccent(raw));\n lit(`--accent-${n}-fg`, pickReadable(color, TEXT_POLES, floor), [`--accent-${n}`]);\n const tint = oklch2(scheme === \"dark\" ? Math.max(0.2, bg0.l + 0.08) : Math.min(0.92, bg0.l - 0.04), color.c * preset.accentTintChromaMul, color.h);\n lit(`--accent-${n}-bg`, formatCss2(tint), [`--accent-${n}`, ...refIfPinned(\"--bg-0\")]);\n lit(`--accent-${n}-text`, readableHuedOnTintAndPanel(tint, color.h, AA + 0.3, panelSurfaces, AA + 0.05, color.c), [`--accent-${n}-bg`, ...refIfPinned(\"--bg-0\")]);\n lit(`--accent-${n}-vivid`, vividOnPanel(color.h, [bg0, ...panelSurfaces], floor, color.c), [`--accent-${n}`, ...refIfPinned(\"--bg-0\")]);\n };\n emitAccentFamily(\"2\", a2);\n emitAccentFamily(\"3\", a3);\n emitAccentFamily(\"4\", a4);\n lit(\"--selection-cue\", extreme || knobs.cues === \"redundant\" ? \"marker\" : \"tint\");\n const statusChroma = Math.max(0.12, accent.c) * (0.6 + vibrancy * 0.7) * preset.statusChromaMul;\n for (const role of Object.keys(STATUS_TO_HUE)) {\n const namedHue = resolveStatusHue(role, pinned);\n const pinnedFill = parseChromaticPin(pinned[`--${role}`]);\n const roleHue = pinnedFill ? pinnedFill.h : namedHue;\n const fillL = scheme === \"dark\" ? 0.62 : 0.52;\n const fill = pinnedFill ?? pageFloor(fillWithTextHeadroom(fillL, statusChroma, roleHue, floor));\n const tintL = scheme === \"dark\" ? Math.min(0.3, bg0.l + 0.08) : Math.min(0.92, bg0.l - 0.04);\n const tint = ensureTextHeadroom(oklch2(tintL, statusChroma * 0.35, roleHue), scheme, AA + 0.3);\n const fillRefs = refIfPinned(\"--accent\", `--${role}`);\n lit(`--${role}`, formatCss2(fill), fillRefs);\n lit(`--${role}-bg`, formatCss2(tint), [`--${role}`, ...refIfPinned(\"--bg-0\")]);\n lit(`--${role}-fg`, pickReadable(fill, TEXT_POLES, floor), [`--${role}`]);\n lit(`--${role}-text`, readableHuedOnTintAndPanel(tint, roleHue, AA + 0.3, panelSurfaces, AA + 0.05, statusChroma), [`--${role}-bg`, ...refIfPinned(\"--bg-0\")]);\n lit(`--${role}-vivid`, vividOnPanel(roleHue, [bg0, ...panelSurfaces], floor, statusChroma), [`--${role}`, ...refIfPinned(\"--bg-0\")]);\n }\n const overlayL = scheme === \"dark\" ? 1 : 0;\n const extremeDist = scheme === \"dark\" ? bg0.l : 1 - bg0.l;\n const overlayBoost = 1 + Math.max(0, (0.15 - extremeDist) / 0.15) * 0.8;\n const overlay = (a) => formatCss2(oklch2(overlayL, 0, 0, Math.min(0.4, a * overlayBoost)));\n lit(\"--state-hover\", overlay(0.06));\n lit(\"--state-press\", overlay(0.12));\n lit(\"--state-selected\", overlay(0.16));\n lit(\"--state-disabled\", overlay(0.08));\n lit(\"--state-drag\", overlay(0.1));\n lit(\"--selection\", formatCss2(withAlpha(accentFill, 0.3)), [\"--accent\"]);\n lit(\"--highlight\", formatCss2(withAlpha(oklch2(scheme === \"dark\" ? 0.85 : 0.9, 0.16, paletteHueAngle(\"yellow\")), 0.35)));\n const linkColor = enforceChromaticOnPanels(accent);\n const linkCss = formatCss2(linkColor);\n let linkHoverColor = enforceChromaticOnPanels(withLightness(accent, accent.l + (scheme === \"dark\" ? 0.08 : -0.08)));\n if (formatCss2(linkHoverColor) === linkCss) {\n const pole = textLight ? 1 : 0;\n const toward = linkColor.l < pole ? 1 : -1;\n const distinctHover = (candidate) => {\n const enforced = enforceChromaticOnPanels(candidate);\n return formatCss2(enforced) === linkCss ? void 0 : enforced;\n };\n let hover;\n for (let step = 0.1; step <= 0.6 && !hover; step += 0.05) {\n hover = distinctHover(withLightness(linkColor, linkColor.l + toward * step));\n }\n for (let step = 0.1; step <= 0.6 && !hover; step += 0.05) {\n hover = distinctHover(withLightness(linkColor, linkColor.l - toward * step));\n }\n for (let cut = 0.7; cut >= 0.05 && !hover; cut -= 0.15) {\n hover = distinctHover(oklch2(linkColor.l, linkColor.c * cut, linkColor.h));\n }\n linkHoverColor = hover ?? linkHoverColor;\n }\n lit(\"--link\", formatCss2(linkColor), [\"--accent\", ...refIfPinned(\"--bg-0\")]);\n lit(\"--link-hover\", formatCss2(linkHoverColor), [\"--link\", ...refIfPinned(\"--bg-0\")]);\n for (const [hue3, spec2] of Object.entries(PALETTE_HUES)) {\n const pinnedBase = typeof spec2 === \"object\" ? parseChromaticPin(pinned[`--${hue3}`] ?? pinned[`--color-${hue3}-base`] ?? pinned[`--color-${hue3}`]) : null;\n const effectiveSpec = pinnedBase && typeof spec2 === \"object\" ? { h: pinnedBase.h, c: pinnedBase.c } : spec2;\n const ramp = {};\n paletteRamp(ramp, hue3, effectiveSpec, scheme, vibrancy, floor, preset, accent, [bg0, ...panelSurfaces], pinnedBase ?? void 0);\n lit(`--color-${hue3}`, ramp[`--color-${hue3}`]);\n for (const stop of PALETTE_STOPS) {\n lit(`--color-${hue3}-${stop}`, ramp[`--color-${hue3}-${stop}`], [\n `--color-${hue3}`\n ]);\n }\n lit(`--${hue3}`, ramp[`--${hue3}`], [`--color-${hue3}-base`]);\n lit(`--${hue3}-bg`, ramp[`--${hue3}-bg`], [`--color-${hue3}-subtle`]);\n lit(`--${hue3}-fg`, ramp[`--${hue3}-fg`], [`--color-${hue3}-base`]);\n lit(`--${hue3}-text`, ramp[`--${hue3}-text`], [`--color-${hue3}-subtle`]);\n lit(`--${hue3}-vivid`, ramp[`--${hue3}-vivid`], [\n `--color-${hue3}-base`,\n ...refIfPinned(\"--bg-0\")\n ]);\n }\n const codeBg = ensureTextHeadroom(withLightness(bg0, scheme === \"dark\" ? bg0.l - 0.02 : bg0.l + 0.012), scheme, floor);\n const codeBgCss = formatCss2(codeBg);\n lit(\"--code-bg\", codeBgCss, refIfPinned(\"--bg-0\"));\n const codeFg = enforceContrastFloor(fg0, codeBg, scheme, floor);\n const codeFgCss = formatCss2(codeFg);\n lit(\"--code-fg\", codeFgCss, [\"--fg-0\", ...refIfPinned(\"--bg-0\")]);\n lit(\"--code-line-highlight\", formatCss2(withAlpha(accentFill, 0.1)), [\"--accent\"]);\n lit(\"--code-selection\", formatCss2(withAlpha(accentFill, 0.3)), [\"--accent\"]);\n const codeTowardLight = contrast2(\"#ffffff\", codeBgCss) >= contrast2(\"#000000\", codeBgCss);\n const codePole = codeTowardLight ? 1 : 0;\n const codeFloor = AA;\n const readableHuedOnCode = (l, c2, h, fl) => {\n const seed = oklch2(l, c2, h);\n let best = seed;\n let bestContrast = emittedContrast(seed, codeBgCss);\n if (bestContrast >= fl)\n return seed;\n for (let i = 1; i <= 100; i++) {\n const cand = withLightness(seed, seed.l + (codePole - seed.l) * (i / 100));\n const ct = emittedContrast(cand, codeBgCss);\n if (ct >= fl)\n return cand;\n if (ct > bestContrast) {\n bestContrast = ct;\n best = cand;\n }\n }\n return best;\n };\n const codeChroma = Math.max(0.08, Math.max(0.1, accent.c) * (0.7 + vibrancy * 0.7) * preset.paletteChromaMul);\n const codeBaseHue = Number.isFinite(accent.h) ? accent.h : DERIVED_ACCENT_FALLBACK_HUE;\n const codeBaseL = codeTowardLight ? 0.76 : 0.46;\n const codePoleL = codeTowardLight ? 1 : 0;\n const aaEdgeL = lightnessForContrast(oklch2(codePoleL, 0, 0), codeBg, codeBgCss, codeFloor);\n const bandLo = aaEdgeL + (codePoleL - aaEdgeL) * 0.06;\n const bandHi = codePoleL - (codePoleL - aaEdgeL) * 0.32;\n CODE_VIVID_ROLES.forEach((role, rank) => {\n const hue3 = ((codeBaseHue + CODE_HUE_RANK[rank] * 45) % 360 + 360) % 360;\n const bandL = bandLo + (bandHi - bandLo) * (rank / 7);\n const fill = readableHuedOnCode(bandL, codeChroma, hue3, codeFloor);\n lit(`--code-${role}`, formatCss2(fill), [\"--accent\", \"--code-bg\"]);\n });\n const commentFloor = Math.max(3, codeFloor * 0.62);\n const commentL = codeTowardLight ? 0.6 : 0.56;\n lit(\"--code-comment\", formatCss2(readableHuedOnCode(commentL, Math.min(0.03, codeChroma * 0.3), codeBaseHue, commentFloor)), [\"--accent\", \"--code-bg\"]);\n lit(\"--code-operator\", formatCss2(readableHuedOnCode(codeBaseL, codeChroma * 0.5, codeBaseHue, codeFloor)), [\"--accent\", \"--code-bg\"]);\n lit(\"--code-punctuation\", formatCss2(enforceContrastFloor(withLightness(codeFg, codeFg.l + (codePole - codeFg.l) * 0.18), codeBg, scheme, codeFloor)), [\"--code-fg\", \"--code-bg\"]);\n lit(\"--code-variable\", codeFgCss, [\"--code-fg\"]);\n lit(\"--font-sans\", fonts.sans);\n lit(\"--font-mono\", fonts.mono);\n lit(\"--font-display\", fonts.display);\n const bodyIndex = TEXT_STEPS.indexOf(\"body\");\n TEXT_STEPS.forEach((step, index) => {\n const rem = BASE_TEXT_REM * typeScale ** (index - bodyIndex);\n lit(`--text-${step}`, `${rem.toFixed(4).replace(/\\.?0+$/, \"\")}rem`);\n });\n for (const step of LEADING_STEPS) {\n lit(`--leading-${step}`, String(LEADING_VALUES[step]));\n }\n for (const step of WEIGHT_STEPS) {\n lit(`--weight-${step}`, String(WEIGHT_VALUES[step]));\n }\n const radiusPx = {\n none: 0,\n sm: 2 * radiusScale,\n md: 4 * radiusScale,\n lg: 8 * radiusScale,\n full: 9999\n };\n for (const step of RADIUS_STEPS) {\n lit(`--radius-${step}`, `${radiusPx[step]}px`);\n }\n const borderPx = { thin: 1, normal: 1.5, thick: 2 };\n for (const step of BORDER_STEPS) {\n lit(`--border-${step}`, `${borderPx[step]}px`);\n }\n const durationMs = { fast: 120, base: 200, slow: 320 };\n for (const step of DURATION_STEPS) {\n lit(`--duration-${step}`, `${durationMs[step]}ms`);\n }\n lit(\"--ease-standard\", \"cubic-bezier(0.2, 0, 0, 1)\");\n lit(\"--ease-emphasized\", \"cubic-bezier(0.3, 0, 0, 1)\");\n const elevationStrings = {};\n for (const level of ELEVATION_STEPS) {\n const value = shadowString(scheme, level, vibrancy, preset);\n elevationStrings[level] = value;\n lit(`--elevation-${level}`, value);\n }\n lit(\"--shadow\", elevationStrings[3], [\"--elevation-3\"]);\n for (const step of SPACE_STEPS) {\n const rem = SPACE_BASE_REM * step * density;\n lit(`--space-${step}`, `${rem.toFixed(4).replace(/\\.?0+$/, \"\")}rem`);\n }\n const producedNames = new Set(nodes.map((n) => n.name));\n for (const [name, value] of Object.entries(pinned)) {\n if (producedNames.has(name)) {\n for (const node of nodes) {\n if (node.name === name) {\n node.value = value;\n node.resolve = void 0;\n node.refs = void 0;\n }\n }\n } else {\n nodes.push({ name, value });\n }\n }\n return nodes;\n }\n function resolveBaseInputs(preset, opts) {\n const completed = completeAnchors(preset, opts);\n return {\n knobs: opts.knobs ?? {},\n scheme: completed.scheme,\n pinned: opts.constraints ?? {}\n };\n }\n function buildPassContext(preset, opts, passIndex) {\n const base = resolveBaseInputs(preset, opts);\n return { ...base, passIndex };\n }\n function runPipeline(passes, makeCtx) {\n let register = {};\n const trace = [];\n passes.forEach((pass, index) => {\n register = pass.run(register, makeCtx(index));\n trace.push({ name: pass.name, register });\n });\n return { register, trace };\n }\n function settlePass(preset, opts) {\n return {\n name: \"settle\",\n run: () => resolveGraph(buildGraph(preset, opts))\n };\n }\n function registerToNodes(register) {\n return Object.entries(register).map(([name, value]) => ({ name, value }));\n }\n function alpha(value) {\n if (!value)\n return 1;\n const rgba = /rgba?\\([^)]*?,\\s*([0-9.]+)\\s*\\)/.exec(value);\n if (rgba && rgba[1] !== void 0)\n return Number.parseFloat(rgba[1]);\n if (value.startsWith(\"#\") && value.length === 9) {\n return Number.parseInt(value.slice(7, 9), 16) / 255;\n }\n if (value.startsWith(\"#\") && value.length === 5) {\n return Number.parseInt(value.slice(4, 5).repeat(2), 16) / 255;\n }\n return 1;\n }\n function parseRem(value) {\n if (!value)\n return Number.NaN;\n const m = /^(-?[0-9.]+)(rem|px)$/.exec(value.trim());\n return m ? Number.parseFloat(m[1]) : Number.NaN;\n }\n function parseMs(value) {\n if (!value)\n return Number.NaN;\n const m = /^(-?[0-9.]+)ms$/.exec(value.trim());\n return m ? Number.parseFloat(m[1]) : Number.NaN;\n }\n function shadowStrength(value) {\n if (!value || value === \"none\")\n return 0;\n let total = 0;\n const offsets = value.match(/([0-9.]+)px/g) ?? [];\n for (const off of offsets)\n total += Number.parseFloat(off);\n const alphas = value.match(/rgba?\\([^)]*,\\s*([0-9.]+)\\)/g) ?? [];\n for (const a of alphas) {\n const m = /,\\s*([0-9.]+)\\)/.exec(a);\n if (m)\n total += Number.parseFloat(m[1]) * 20;\n }\n return total;\n }\n var STATE_TOKENS = [\n \"--state-hover\",\n \"--state-press\",\n \"--state-selected\",\n \"--state-disabled\",\n \"--state-drag\"\n ];\n var CEILING_EPSILON = 0.05;\n function achievableFloor(declaredFloor, bgCss) {\n if (!bgCss)\n return declaredFloor;\n const ceiling = Math.max(contrast2(\"#000000\", bgCss), contrast2(\"#ffffff\", bgCss));\n return Math.min(declaredFloor, ceiling - CEILING_EPSILON);\n }\n function oklabDist(a, b) {\n const x = toOklchColor(a);\n const y = toOklchColor(b);\n const rad = Math.PI / 180;\n const ax = x.c * Math.cos(x.h * rad);\n const ay = x.c * Math.sin(x.h * rad);\n const bx = y.c * Math.cos(y.h * rad);\n const by = y.c * Math.sin(y.h * rad);\n return Math.hypot(x.l - y.l, ax - bx, ay - by);\n }\n function makeInvariants(preset) {\n const onFillFloor = preset.declaredTextOnFillFloor;\n return [\n (ctx) => {\n for (const name of PRODUCES) {\n const value = ctx.register[name];\n const category = ctx.categories[name];\n if (typeof value !== \"string\" || value.length === 0) {\n return {\n name: \"every token non-empty and format-valid for its category\",\n ok: false,\n detail: `${name} is ${value === void 0 ? \"missing\" : \"empty\"}`\n };\n }\n if (/nan/i.test(value)) {\n return {\n name: \"every token non-empty and format-valid for its category\",\n ok: false,\n detail: `${name} contains NaN: ${value}`\n };\n }\n switch (category) {\n case \"color\": {\n try {\n const o = toOklchColor(value);\n if (Number.isNaN(o.l) || Number.isNaN(o.c) || Number.isNaN(o.h) || Number.isNaN(alpha(value))) {\n return {\n name: \"every token non-empty and format-valid for its category\",\n ok: false,\n detail: `${name} parses to NaN: ${value}`\n };\n }\n } catch (error) {\n return {\n name: \"every token non-empty and format-valid for its category\",\n ok: false,\n detail: `${name} unparseable color: ${value} (${String(error)})`\n };\n }\n break;\n }\n case \"length\": {\n if (Number.isNaN(parseRem(value))) {\n return {\n name: \"every token non-empty and format-valid for its category\",\n ok: false,\n detail: `${name} not a css length: ${value}`\n };\n }\n break;\n }\n case \"duration\": {\n if (Number.isNaN(parseMs(value))) {\n return {\n name: \"every token non-empty and format-valid for its category\",\n ok: false,\n detail: `${name} not a duration: ${value}`\n };\n }\n break;\n }\n case \"number\": {\n if (Number.isNaN(Number.parseFloat(value))) {\n return {\n name: \"every token non-empty and format-valid for its category\",\n ok: false,\n detail: `${name} not a number: ${value}`\n };\n }\n break;\n }\n case \"easing\": {\n if (!value.startsWith(\"cubic-bezier(\")) {\n return {\n name: \"every token non-empty and format-valid for its category\",\n ok: false,\n detail: `${name} not an easing: ${value}`\n };\n }\n break;\n }\n case \"shadow\": {\n if (value !== \"none\" && !value.includes(\"rgba\")) {\n return {\n name: \"every token non-empty and format-valid for its category\",\n ok: false,\n detail: `${name} not a shadow: ${value}`\n };\n }\n break;\n }\n case \"font\":\n break;\n case \"keyword\": {\n const domain = KEYWORD_DOMAINS[name];\n if (domain && !domain.includes(value)) {\n return {\n name: \"every token non-empty and format-valid for its category\",\n ok: false,\n detail: `${name} not in {${domain.join(\" | \")}}: ${value}`\n };\n }\n break;\n }\n }\n }\n return { name: \"every token non-empty and format-valid for its category\", ok: true };\n },\n (ctx) => {\n const name = `fg-0 on bg-0 clears ${onFillFloor >= AAA - 0.01 ? \"AAA\" : \"AA\"}`;\n if (ctx.constraints[\"--fg-0\"]) {\n return { name, ok: true, detail: \"skipped (pinned text)\" };\n }\n const fg0 = ctx.register[\"--fg-0\"];\n const bg0 = ctx.register[\"--bg-0\"];\n const ratio = fg0 && bg0 ? contrast2(fg0, bg0) : 0;\n const required = achievableFloor(onFillFloor, ctx.constraints[\"--bg-0\"] ? bg0 : void 0);\n return {\n name,\n ok: ratio >= required - 0.01,\n detail: `contrast ${ratio.toFixed(2)} (floor ${required.toFixed(2)}${ctx.constraints[\"--bg-0\"] ? ` best-achievable, declared ${onFillFloor}` : \"\"})`\n };\n },\n (ctx) => {\n const name = `fg ramp clears ${preset.contrastFloor >= AAA - 0.01 ? \"AAA\" : \"AA\"}`;\n if (ctx.constraints[\"--fg-0\"]) {\n return { name, ok: true, detail: \"skipped (pinned text)\" };\n }\n const bg0 = ctx.register[\"--bg-0\"];\n if (!bg0)\n return { name, ok: false, detail: \"missing --bg-0\" };\n const required = achievableFloor(preset.contrastFloor, ctx.constraints[\"--bg-0\"] ? bg0 : void 0);\n for (let i = 1; i <= 3; i++) {\n const key = `--fg-${i}`;\n if (ctx.constraints[key])\n continue;\n const fg = ctx.register[key];\n const ratio = fg ? contrast2(fg, bg0) : 0;\n if (ratio < required - 0.01) {\n return {\n name,\n ok: false,\n detail: `${key} contrast ${ratio.toFixed(2)} (floor ${required.toFixed(2)}${ctx.constraints[\"--bg-0\"] ? ` best-achievable, declared ${preset.contrastFloor}` : \"\"})`\n };\n }\n }\n return { name, ok: true };\n },\n (ctx) => {\n const pairs = [\n [\"--accent-fg\", \"--accent\"],\n [\"--neutral-fg\", \"--neutral\"],\n [\"--success-fg\", \"--success\"],\n [\"--warn-fg\", \"--warn\"],\n [\"--danger-fg\", \"--danger\"],\n [\"--info-fg\", \"--info\"],\n [\"--accent-text\", \"--bg-0\"],\n [\"--neutral-text\", \"--bg-0\"]\n ];\n const surfaceFill = new Set(SURFACES);\n for (const [fgName, fillName] of pairs) {\n const fill = ctx.register[fillName];\n const pinned = Boolean(ctx.constraints[fillName]);\n if (pinned && !surfaceFill.has(fillName))\n continue;\n const fg = ctx.register[fgName];\n if (!fg || !fill)\n continue;\n const required = pinned ? achievableFloor(onFillFloor, fill) : onFillFloor;\n if (contrast2(fg, fill) < required - 0.01) {\n return {\n name: `on-fill text clears ${onFillFloor >= AAA - 0.01 ? \"AAA\" : \"AA\"}`,\n ok: false,\n detail: `${fgName} on ${fillName} = ${contrast2(fg, fill).toFixed(2)} (floor ${required.toFixed(2)}${pinned ? \" best-achievable\" : \"\"})`\n };\n }\n }\n return {\n name: `on-fill text clears ${onFillFloor >= AAA - 0.01 ? \"AAA\" : \"AA\"}`,\n ok: true\n };\n },\n (ctx) => {\n const pairs = [\n [\"--success-text\", \"--success-bg\"],\n [\"--warn-text\", \"--warn-bg\"],\n [\"--danger-text\", \"--danger-bg\"],\n [\"--info-text\", \"--info-bg\"]\n ];\n for (const [fgName, fillName] of pairs) {\n const fg = ctx.register[fgName];\n const fill = ctx.register[fillName];\n if (!fg || !fill)\n continue;\n if (contrast2(fg, fill) < AA - 0.01) {\n return {\n name: \"text-on-tint clears AA\",\n ok: false,\n detail: `${fgName} on ${fillName} = ${contrast2(fg, fill).toFixed(2)}`\n };\n }\n }\n return { name: \"text-on-tint clears AA\", ok: true };\n },\n (ctx) => {\n const name = \"achromatic tone inks stay neutral\";\n const achromatic = [\"gray\", \"white\", \"black\"];\n for (const hue3 of achromatic) {\n for (const token of [`--${hue3}-fg`, `--${hue3}-text`, `--color-${hue3}-contrast`]) {\n const value = ctx.register[token];\n if (!value)\n continue;\n const c2 = toOklchColor(value).c;\n if (c2 >= ACHROMATIC_CHROMA) {\n return { name, ok: false, detail: `${token} = ${value} (chroma ${c2.toFixed(3)} \\u2265 ${ACHROMATIC_CHROMA})` };\n }\n }\n }\n return { name, ok: true };\n },\n (ctx) => {\n const name = \"panel text clears AA on --bg-1 and --bg-2\";\n const neutralText = [\n \"--fg-1\",\n \"--fg-2\",\n \"--fg-3\",\n \"--placeholder\",\n \"--link\",\n \"--accent-text\",\n \"--neutral-text\",\n \"--neutral-vivid\"\n ];\n if (ctx.constraints[\"--bg-0\"])\n return { name, ok: true, detail: \"skipped (pinned bg-0)\" };\n const bg0 = ctx.register[\"--bg-0\"];\n if (!bg0)\n return { name, ok: true };\n const textLight = ctx.scheme === \"dark\";\n const themePole = textLight ? \"#ffffff\" : \"#000000\";\n const band = contrastBandFloor(ctx.knobs);\n const inkFloor = Math.max(ENFORCE, preset.contrastFloor, (band ?? 0) + 0.2);\n const statusRoles = Object.keys(STATUS_TO_HUE);\n for (const panel of PANEL_SURFACES) {\n const bg = ctx.register[panel];\n if (!bg)\n continue;\n const bgL = toOklchColor(bg).l;\n if (bgL < 0.5 !== textLight)\n continue;\n const poleCeiling = contrast2(themePole, bg);\n const required = Math.min(AA, poleCeiling - CEILING_EPSILON);\n const fg0Reach = (() => {\n const v = ctx.register[\"--fg-0\"];\n return v ? contrast2(v, bg) : Infinity;\n })();\n const inkReach = (source) => {\n const v = ctx.register[source];\n if (!v)\n return Infinity;\n const ink = toOklchColor(v);\n const targetL = textLight ? 1 : 0;\n let reach = contrast2(v, bg);\n for (let i = 1; i <= 100; i++) {\n const t = i / 100;\n const candidate = withLightness(ink, ink.l + (targetL - ink.l) * t);\n if (contrast2(formatCss2(candidate), bg0) < inkFloor - 0.01)\n break;\n reach = Math.max(reach, contrast2(formatCss2(candidate), bg));\n }\n return reach;\n };\n const accentInkReach = inkReach(\"--accent\");\n const neutralInkReach = inkReach(\"--neutral\");\n const check = (token, ceilingReach = Infinity) => {\n const fg = ctx.register[token];\n if (!fg)\n return null;\n const floorFor = Math.min(required, ceilingReach);\n const ratio = contrast2(fg, bg);\n if (ratio < floorFor - 0.05) {\n return {\n name,\n ok: false,\n detail: `${token} on ${panel} = ${ratio.toFixed(2)} (floor ${floorFor.toFixed(2)})`\n };\n }\n return null;\n };\n const fg0Bounded = /* @__PURE__ */ new Set([\"--fg-1\", \"--fg-2\", \"--fg-3\", \"--placeholder\"]);\n const accentBounded = /* @__PURE__ */ new Set([\"--link\", \"--accent-text\"]);\n const reachFor = (token) => {\n if (fg0Bounded.has(token))\n return fg0Reach;\n if (accentBounded.has(token))\n return accentInkReach;\n if (token === \"--neutral-text\" || token === \"--neutral-vivid\")\n return neutralInkReach;\n return Infinity;\n };\n for (const token of neutralText) {\n const fail = check(token, reachFor(token));\n if (fail)\n return fail;\n }\n for (const role of statusRoles) {\n const tintBg = ctx.register[`--${role}-bg`];\n if (tintBg) {\n const whiteJoint = contrast2(\"#ffffff\", tintBg) >= AA && contrast2(\"#ffffff\", bg) >= AA;\n const blackJoint = contrast2(\"#000000\", tintBg) >= AA && contrast2(\"#000000\", bg) >= AA;\n if (!whiteJoint && !blackJoint)\n continue;\n }\n const fail = check(`--${role}-text`);\n if (fail)\n return fail;\n const failVivid = check(`--${role}-vivid`);\n if (failVivid)\n return failVivid;\n }\n }\n return { name, ok: true };\n },\n (ctx) => {\n const name = \"solid fills separate from --bg-0\";\n const bg0 = ctx.register[\"--bg-0\"];\n if (!bg0)\n return { name, ok: true };\n const fills = [\"--accent\", \"--neutral\", ...Object.keys(STATUS_TO_HUE).map((r2) => `--${r2}`)];\n for (const token of fills) {\n if (ctx.constraints[token])\n continue;\n const fill = ctx.register[token];\n if (!fill)\n continue;\n const ratio = contrast2(fill, bg0);\n if (ratio < SURFACE_SEPARATION - 0.05) {\n return { name, ok: false, detail: `${token} = ${ratio.toFixed(2)} on --bg-0 (floor ${SURFACE_SEPARATION})` };\n }\n }\n return { name, ok: true };\n },\n (ctx) => {\n const name = \"borders separate from their surface\";\n const borders = [\n [\"--line\", \"--bg-0\", BORDER_SEPARATION],\n [\"--line-2\", \"--bg-0\", DIVIDER_SEPARATION],\n [\"--field-border\", \"--field-bg\", BORDER_SEPARATION]\n ];\n for (const [token, surface, separation] of borders) {\n if (ctx.constraints[token])\n continue;\n const border = ctx.register[token];\n const bg = ctx.register[surface];\n if (!border || !bg)\n continue;\n const ratio = contrast2(border, bg);\n if (ratio < separation - 0.05) {\n return { name, ok: false, detail: `${token} = ${ratio.toFixed(2)} on ${surface} (floor ${separation})` };\n }\n }\n return { name, ok: true };\n },\n (ctx) => {\n const ladder = [\"--bg-sunken\", ...SURFACES];\n const ls = ladder.map((name) => {\n const value = ctx.register[name];\n return value ? toOklchColor(value).l : 0;\n });\n const ascending = ctx.scheme === \"dark\";\n for (let i = 1; i < ls.length; i++) {\n const prev = ls[i - 1];\n const cur = ls[i];\n const ok = ascending ? cur >= prev - 1e-6 : cur <= prev + 1e-6;\n if (!ok) {\n return {\n name: \"surface lightness monotonic\",\n ok: false,\n detail: `${ladder[i - 1]}=${prev.toFixed(3)} ${ladder[i]}=${cur.toFixed(3)} (${ctx.scheme})`\n };\n }\n }\n return { name: \"surface lightness monotonic\", ok: true };\n },\n (ctx) => {\n for (const name of STATE_TOKENS) {\n const value = ctx.register[name];\n if (!value)\n continue;\n const a = alpha(value);\n if (a >= 1) {\n return {\n name: \"state overlays translucent\",\n ok: false,\n detail: `${name} alpha ${a}`\n };\n }\n }\n return { name: \"state overlays translucent\", ok: true };\n },\n (ctx) => {\n const linkName = `links clear ${onFillFloor >= AAA - 0.01 ? \"AAA\" : \"AA\"} on bg-0`;\n const bg0 = ctx.register[\"--bg-0\"];\n const required = achievableFloor(onFillFloor, ctx.constraints[\"--bg-0\"] ? bg0 : void 0);\n for (const name of [\"--link\", \"--link-hover\"]) {\n const link = ctx.register[name];\n if (!link || !bg0)\n continue;\n const ratio = contrast2(link, bg0);\n if (ratio < required - 0.01) {\n return {\n name: linkName,\n ok: false,\n detail: `${name} on --bg-0 = ${ratio.toFixed(2)} (floor ${required.toFixed(2)}${ctx.constraints[\"--bg-0\"] ? \" best-achievable\" : \"\"})`\n };\n }\n }\n return { name: linkName, ok: true };\n },\n (ctx) => {\n const name = \"link hover distinct from link\";\n const link = ctx.register[\"--link\"];\n const hover = ctx.register[\"--link-hover\"];\n if (!link || !hover)\n return { name, ok: true };\n if (ctx.constraints[\"--link\"] || ctx.constraints[\"--link-hover\"])\n return { name, ok: true };\n if (link === hover) {\n if (link === \"#000000\" || link === \"#ffffff\")\n return { name, ok: true };\n return { name, ok: false, detail: `--link and --link-hover both ${link}` };\n }\n return { name, ok: true };\n },\n (ctx) => {\n const name = \"unpinned accent ramp holds its fan at constant L/C\";\n const accentValue = ctx.register[\"--accent\"];\n if (!accentValue) {\n return { name, ok: true };\n }\n const accent = toOklchColor(accentValue);\n if (accent.c < HUE_STABLE_CHROMA) {\n return { name, ok: true };\n }\n const step = typeof ctx.knobs.accentShiftStep === \"number\" ? ctx.knobs.accentShiftStep : DEFAULT_SHIFT_STEP;\n const split = typeof ctx.knobs.accentSplit === \"number\" ? ctx.knobs.accentSplit : DEFAULT_ACCENT_SPLIT;\n const accent2Value = ctx.register[\"--accent-2\"];\n const accent3Value = ctx.register[\"--accent-3\"];\n const pinnedAccent2 = ctx.constraints[\"--accent-2\"] && accent2Value ? toOklchColor(accent2Value) : null;\n const pinnedAccent3 = ctx.constraints[\"--accent-3\"] && accent3Value ? toOklchColor(accent3Value) : null;\n const fanOffset = (n) => ACCENT_FAN === \"split-complement\" ? n === 2 ? pinnedAccent3 ? -hueDelta(accent.h, pinnedAccent3.h) : -split : n === 3 ? pinnedAccent2 ? -hueDelta(accent.h, pinnedAccent2.h) : split : 180 : step * (n - 1);\n for (let n = 2; n <= 4; n++) {\n if (ctx.constraints[`--accent-${n}`])\n continue;\n const value = ctx.register[`--accent-${n}`];\n if (!value)\n continue;\n const rotated = toOklchColor(value);\n const wantH = ((accent.h + fanOffset(n)) % 360 + 360) % 360;\n if (rotated.c >= HUE_STABLE_CHROMA) {\n let dh = Math.abs(rotated.h - wantH) % 360;\n if (dh > 180)\n dh = 360 - dh;\n if (dh > HUE_TOLERANCE) {\n return {\n name,\n ok: false,\n detail: `--accent-${n} h=${rotated.h.toFixed(1)} want ${wantH.toFixed(1)}`\n };\n }\n }\n if (Math.abs(rotated.l - accent.l) > LIGHTNESS_TOLERANCE) {\n return {\n name,\n ok: false,\n detail: `--accent-${n} l=${rotated.l.toFixed(3)} want ${accent.l.toFixed(3)}`\n };\n }\n const maxChroma = clampToGamut({ l: accent.l, c: accent.c, h: wantH, alpha: 1 }).c;\n const expectedChroma = Math.min(accent.c, maxChroma);\n if (Math.abs(rotated.c - expectedChroma) > 0.02) {\n return {\n name,\n ok: false,\n detail: `--accent-${n} chroma ${rotated.c.toFixed(3)} want max-at-hue ${expectedChroma.toFixed(3)}`\n };\n }\n }\n return { name, ok: true };\n },\n (ctx) => {\n for (const name of [\"--ring\", \"--ring-bg\", \"--scrim\", \"--selection\", \"--highlight\"]) {\n const value = ctx.register[name];\n if (!value)\n continue;\n if (alpha(value) >= 1) {\n return {\n name: \"ring/scrim/selection/highlight carry alpha < 1\",\n ok: false,\n detail: `${name} alpha ${alpha(value)}`\n };\n }\n }\n return { name: \"ring/scrim/selection/highlight carry alpha < 1\", ok: true };\n },\n (ctx) => {\n let prev = -Infinity;\n for (const step of TEXT_STEPS) {\n const rem = parseRem(ctx.register[`--text-${step}`]);\n if (Number.isNaN(rem)) {\n return {\n name: \"type scale strictly increasing\",\n ok: false,\n detail: `--text-${step} not a length`\n };\n }\n if (rem <= prev) {\n return {\n name: \"type scale strictly increasing\",\n ok: false,\n detail: `--text-${step}=${rem} not > ${prev}`\n };\n }\n prev = rem;\n }\n return { name: \"type scale strictly increasing\", ok: true };\n },\n (ctx) => {\n let prev = -Infinity;\n for (const step of WEIGHT_STEPS) {\n const w = Number.parseFloat(ctx.register[`--weight-${step}`] ?? \"\");\n if (Number.isNaN(w) || w <= prev) {\n return {\n name: \"weights strictly increasing\",\n ok: false,\n detail: `--weight-${step}=${w} not > ${prev}`\n };\n }\n prev = w;\n }\n return { name: \"weights strictly increasing\", ok: true };\n },\n (ctx) => {\n let prev = -Infinity;\n for (const step of LEADING_STEPS) {\n const v = Number.parseFloat(ctx.register[`--leading-${step}`] ?? \"\");\n if (Number.isNaN(v) || v <= prev) {\n return {\n name: \"leading strictly increasing\",\n ok: false,\n detail: `--leading-${step}=${v} not > ${prev}`\n };\n }\n prev = v;\n }\n return { name: \"leading strictly increasing\", ok: true };\n },\n (ctx) => {\n let prev = -Infinity;\n for (const step of RADIUS_STEPS) {\n const v = parseRem(ctx.register[`--radius-${step}`]);\n if (Number.isNaN(v) || v < prev - 1e-9) {\n return {\n name: \"radius ladder non-decreasing\",\n ok: false,\n detail: `--radius-${step}=${v} < ${prev}`\n };\n }\n prev = v;\n }\n return { name: \"radius ladder non-decreasing\", ok: true };\n },\n (ctx) => {\n let prev = -Infinity;\n for (const step of BORDER_STEPS) {\n const v = parseRem(ctx.register[`--border-${step}`]);\n if (Number.isNaN(v) || v <= prev) {\n return {\n name: \"borders strictly increasing\",\n ok: false,\n detail: `--border-${step}=${v} not > ${prev}`\n };\n }\n prev = v;\n }\n return { name: \"borders strictly increasing\", ok: true };\n },\n (ctx) => {\n let prev = -Infinity;\n for (const step of DURATION_STEPS) {\n const v = parseMs(ctx.register[`--duration-${step}`]);\n if (Number.isNaN(v) || v <= prev) {\n return {\n name: \"durations strictly increasing\",\n ok: false,\n detail: `--duration-${step}=${v} not > ${prev}`\n };\n }\n prev = v;\n }\n return { name: \"durations strictly increasing\", ok: true };\n },\n (ctx) => {\n let prev = -Infinity;\n for (const level of ELEVATION_STEPS) {\n const v = shadowStrength(ctx.register[`--elevation-${level}`]);\n if (v < prev - 1e-9) {\n return {\n name: \"elevation strength non-decreasing\",\n ok: false,\n detail: `--elevation-${level}=${v} < ${prev}`\n };\n }\n prev = v;\n }\n return { name: \"elevation strength non-decreasing\", ok: true };\n },\n (ctx) => {\n let prev = -Infinity;\n for (const step of SPACE_STEPS) {\n const v = parseRem(ctx.register[`--space-${step}`]);\n if (Number.isNaN(v) || v < prev - 1e-9) {\n return {\n name: \"space ramp non-decreasing\",\n ok: false,\n detail: `--space-${step}=${v} < ${prev}`\n };\n }\n prev = v;\n }\n return { name: \"space ramp non-decreasing\", ok: true };\n },\n (ctx) => {\n for (const [hue3, spec2] of Object.entries(PALETTE_HUES)) {\n const stops = PALETTE_STOPS.filter((s) => s !== \"contrast\").map((stop) => ctx.register[`--color-${hue3}-${stop}`]);\n const ls = stops.map((v) => v ? toOklchColor(v).l : Number.NaN);\n if (ls.some((l) => Number.isNaN(l))) {\n return {\n name: \"palette ramps monotonic in OKLCH lightness\",\n ok: false,\n detail: `--color-${hue3} ramp has a non-color stop`\n };\n }\n const ascending = ls[ls.length - 1] >= ls[0];\n for (let i = 1; i < ls.length; i++) {\n const prev = ls[i - 1];\n const cur = ls[i];\n const ok = ascending ? cur > prev + 1e-9 : cur < prev - 1e-9;\n if (!ok) {\n return {\n name: \"palette ramps monotonic in OKLCH lightness\",\n ok: false,\n detail: `--color-${hue3} ramp l[${i}]=${cur} not strictly ${ascending ? \">\" : \"<\"} ${prev}`\n };\n }\n }\n const base = ctx.register[`--color-${hue3}-base`];\n const contrastStop = ctx.register[`--color-${hue3}-contrast`];\n if (base && contrastStop && contrast2(base, contrastStop) < AA - 0.01) {\n return {\n name: \"palette ramps monotonic in OKLCH lightness\",\n ok: false,\n detail: `--color-${hue3}-contrast on -base = ${contrast2(base, contrastStop).toFixed(2)}`\n };\n }\n if (spec2 !== \"white\" && spec2 !== \"black\") {\n const subtle = ctx.register[`--color-${hue3}-subtle`];\n const strong = ctx.register[`--color-${hue3}-strong`];\n if (subtle && strong && contrast2(subtle, strong) < AA - 0.01) {\n return {\n name: \"palette ramps monotonic in OKLCH lightness\",\n ok: false,\n detail: `--color-${hue3}-strong on -subtle = ${contrast2(subtle, strong).toFixed(2)}`\n };\n }\n }\n if (typeof spec2 === \"object\" && base) {\n const o = toOklchColor(base);\n if (o.c >= HUE_STABLE_CHROMA) {\n let dh = Math.abs(o.h - spec2.h) % 360;\n if (dh > 180)\n dh = 360 - dh;\n if (dh > 20) {\n return {\n name: \"palette ramps monotonic in OKLCH lightness\",\n ok: false,\n detail: `--color-${hue3}-base h=${o.h.toFixed(1)} strayed from ${spec2.h}`\n };\n }\n }\n }\n }\n return { name: \"palette ramps monotonic in OKLCH lightness\", ok: true };\n },\n (ctx) => {\n const name = \"every tone family clears AA (fg on solid, text on bg)\";\n for (const tone of FULL_TONES) {\n const solid = ctx.register[`--${tone}`];\n const fg = ctx.register[`--${tone}-fg`];\n const bg = ctx.register[`--${tone}-bg`];\n const text = ctx.register[`--${tone}-text`];\n if (!solid || !fg || !bg || !text) {\n return { name, ok: false, detail: `--${tone} family is incomplete` };\n }\n if (contrast2(solid, fg) < AA - 0.01) {\n return { name, ok: false, detail: `--${tone}-fg on --${tone} = ${contrast2(solid, fg).toFixed(2)}` };\n }\n if (contrast2(bg, text) < AA - 0.01) {\n return { name, ok: false, detail: `--${tone}-text on --${tone}-bg = ${contrast2(bg, text).toFixed(2)}` };\n }\n }\n return { name, ok: true };\n },\n (ctx) => {\n const name = \"code palette readable on --code-bg\";\n const codeBg = ctx.register[\"--code-bg\"];\n if (!codeBg)\n return { name, ok: false, detail: \"--code-bg missing\" };\n const readFloor = achievableFloor(AA, codeBg);\n const commentFloor = achievableFloor(3, codeBg);\n for (const role of [...CODE_VIVID_ROLES, \"operator\"]) {\n const v = ctx.register[`--code-${role}`];\n const ratio = v ? contrast2(v, codeBg) : 0;\n if (ratio < readFloor - 0.05) {\n return { name, ok: false, detail: `--code-${role} on --code-bg = ${ratio.toFixed(2)} (floor ${readFloor.toFixed(2)})` };\n }\n }\n const commentRatio = contrast2(ctx.register[\"--code-comment\"] ?? \"#000\", codeBg);\n if (commentRatio < commentFloor - 0.05) {\n return { name, ok: false, detail: `--code-comment on --code-bg = ${commentRatio.toFixed(2)} (floor ${commentFloor.toFixed(2)})` };\n }\n return { name, ok: true };\n },\n (ctx) => {\n const name = \"code scopes mutually distinguishable\";\n const MIN_DE = 6e-3;\n const distinct = [...CODE_VIVID_ROLES, \"comment\"].map((r2) => `--code-${r2}`);\n for (let i = 0; i < distinct.length; i++) {\n for (let j = i + 1; j < distinct.length; j++) {\n const ni = distinct[i];\n const nj = distinct[j];\n const a = ctx.register[ni];\n const b = ctx.register[nj];\n if (!a || !b)\n continue;\n const d = oklabDist(a, b);\n if (d < MIN_DE) {\n return { name, ok: false, detail: `${ni} vs ${nj} \\u0394E=${d.toFixed(4)} (min ${MIN_DE})` };\n }\n }\n }\n return { name, ok: true };\n },\n (ctx) => {\n const name = \"status roles mutually distinguishable\";\n const MIN_DE = 0.02;\n const roles = Object.keys(STATUS_TO_HUE).map((r2) => `--${r2}`);\n for (let i = 0; i < roles.length; i++) {\n for (let j = i + 1; j < roles.length; j++) {\n const ni = roles[i];\n const nj = roles[j];\n const a = ctx.register[ni];\n const b = ctx.register[nj];\n if (!a || !b)\n continue;\n const d = oklabDist(a, b);\n if (d < MIN_DE) {\n return { name, ok: false, detail: `${ni} vs ${nj} \\u0394E=${d.toFixed(4)} (min ${MIN_DE})` };\n }\n }\n }\n return { name, ok: true };\n }\n ];\n }\n var PRODUCED_TOKENS = PRODUCES;\n var TOKEN_CATEGORIES = CATEGORIES;\n var SHARED_KNOBS = [\n \"scheme\",\n \"accentShiftStep\",\n \"accentSplit\",\n \"contrastBand\",\n \"vibrancy\",\n \"typeScale\",\n \"radiusScale\",\n \"density\",\n \"cues\",\n \"fonts\",\n \"anchors\"\n ];\n var DEFAULT_ANCHORS = {\n bg: \"#0f1115\",\n fg: \"#e8eaed\"\n };\n\n // packages/xtyle/dist/authoring.js\n function toLineage(nodes) {\n return nodes.map(({ name, value, refs }) => refs && refs.length ? { name, value, refs } : { name, value });\n }\n function registerExports(graph, traced, manifest, invariants) {\n xript.exports.register(\"graph\", (...args) => toLineage(graph(args[0] ?? {})));\n xript.exports.register(\"traced\", (...args) => traced(args[0] ?? {}));\n xript.exports.register(\"manifest\", () => ({ ...manifest, invariantCount: invariants.length }));\n xript.exports.register(\"invariants\", (...args) => invariants.map((invariant) => invariant(args[0])));\n }\n function tracePreset(preset, buildPasses, input) {\n return runPipeline(buildPasses(preset, input), (passIndex) => buildPassContext(preset, input, passIndex)).trace;\n }\n function toPreset(spec2) {\n const chroma = spec2.chroma ?? {};\n const elevation = spec2.elevation ?? {};\n const contrast3 = spec2.contrast ?? {};\n const preset = {\n id: spec2.id,\n knobs: spec2.knobs ?? SHARED_KNOBS,\n // Merge over the full default so a spec that names only some anchors (e.g. just `bg` and\n // `accent`) still yields a complete `bg`/`fg` default — derivation reads both, so a partial\n // `defaultAnchors` would crash when invoked with no anchor overrides.\n defaultAnchors: spec2.anchors ? { ...DEFAULT_ANCHORS, ...spec2.anchors } : DEFAULT_ANCHORS,\n contrastFloor: contrast3.floor ?? 4.7,\n declaredTextOnFillFloor: contrast3.textOnFill ?? 4.5,\n defaultVibrancy: spec2.vibrancy ?? 0.5,\n accentChromaMul: chroma.accent ?? 1,\n statusChromaMul: chroma.status ?? 1,\n paletteChromaMul: chroma.palette ?? 1,\n neutralChroma: chroma.neutral ?? 0.01,\n elevationStrengthMul: elevation.strength ?? 1,\n elevationAlphaBoost: elevation.alphaBoost ?? 0,\n accentTintChromaMul: chroma.accentTint ?? 0.3\n };\n if (spec2.extreme)\n preset.extreme = true;\n return preset;\n }\n function defineXtyleAlgorithm(spec2) {\n const preset = toPreset(spec2);\n const buildPasses = spec2.passes ?? ((p4, input) => [settlePass(p4, input)]);\n const singlePass = buildPasses(preset, {}).length === 1;\n const finalNodes = (input) => singlePass ? buildGraph(preset, input) : registerToNodes(runPipeline(buildPasses(preset, input), (passIndex) => buildPassContext(preset, input, passIndex)).register);\n registerExports(finalNodes, (input) => tracePreset(preset, buildPasses, input), {\n produces: PRODUCED_TOKENS,\n categories: TOKEN_CATEGORIES,\n knobs: preset.knobs,\n passNames: buildPasses(preset, {}).map((pass) => pass.name)\n }, makeInvariants(preset));\n }\n\n // algorithms/xtyle-quiet/src/preset.ts\n var spec = {\n id: \"xtyle-quiet\",\n vibrancy: 0.12,\n chroma: { accent: 0.5, status: 0.55, palette: 0.6, neutral: 5e-3, accentTint: 0.18 },\n elevation: { strength: 0.6, alphaBoost: -0.04 }\n };\n\n // algorithms/xtyle-quiet/src/mod.ts\n defineXtyleAlgorithm(spec);\n})();\n" } };
|
|
3
|
+
//# sourceMappingURL=algorithms-bundle.generated.js.map
|