@easemate/web-kit 0.2.0 → 0.3.1
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 +99 -5
- package/build/decorators.cjs +921 -0
- package/build/decorators.cjs.map +1 -0
- package/build/decorators.d.cts +123 -0
- package/build/decorators.d.ts +123 -0
- package/build/decorators.js +889 -0
- package/build/decorators.js.map +1 -0
- package/build/elements.cjs +27604 -0
- package/build/elements.cjs.map +1 -0
- package/build/elements.d.cts +373 -0
- package/build/elements.d.ts +373 -0
- package/build/elements.js +27528 -0
- package/build/elements.js.map +1 -0
- package/build/{elements/monitor/index.d.ts → index-31iOHBv0.d.cts} +26 -5
- package/build/{elements/monitor/index.d.cts → index-31iOHBv0.d.ts} +26 -5
- package/build/{elements/panel/index.d.cts → index-NzGpn7ai.d.cts} +6 -3
- package/build/{elements/panel/index.d.ts → index-NzGpn7ai.d.ts} +6 -3
- package/build/{elements/state/index.d.ts → index-qZoNKsHn.d.cts} +46 -5
- package/build/{elements/state/index.d.cts → index-qZoNKsHn.d.ts} +46 -5
- package/build/index.cjs +38651 -38
- package/build/index.cjs.map +1 -0
- package/build/index.d.cts +85 -6
- package/build/index.d.ts +85 -6
- package/build/index.js +38535 -12
- package/build/index.js.map +1 -0
- package/build/init-B7gNNyTd.d.ts +235 -0
- package/build/init-DwVGVxkx.d.cts +235 -0
- package/build/jsx.cjs +31 -0
- package/build/jsx.cjs.map +1 -0
- package/build/jsx.d.cts +317 -0
- package/build/jsx.d.ts +317 -0
- package/build/jsx.js +6 -0
- package/build/jsx.js.map +1 -0
- package/build/outside-click-rZ3Di_WX.d.cts +16 -0
- package/build/outside-click-rZ3Di_WX.d.ts +16 -0
- package/build/react.cjs +37827 -0
- package/build/react.cjs.map +1 -0
- package/build/react.d.cts +356 -0
- package/build/react.d.ts +356 -0
- package/build/react.js +37802 -0
- package/build/react.js.map +1 -0
- package/build/register.cjs +35832 -36
- package/build/register.cjs.map +1 -0
- package/build/register.d.cts +4 -33
- package/build/register.d.ts +4 -33
- package/build/register.js +35831 -35
- package/build/register.js.map +1 -0
- package/build/register.server.cjs +19 -0
- package/build/register.server.cjs.map +1 -0
- package/build/register.server.d.cts +2 -0
- package/build/register.server.d.ts +2 -0
- package/build/register.server.js +1 -0
- package/build/register.server.js.map +1 -0
- package/build/registry-9GX9KTG1.d.cts +264 -0
- package/build/registry-9GX9KTG1.d.ts +264 -0
- package/build/template-helpers-CguLXtLD.d.cts +10 -0
- package/build/template-helpers-CguLXtLD.d.ts +10 -0
- package/build/theme.cjs +746 -0
- package/build/theme.cjs.map +1 -0
- package/build/{theme/index.d.cts → theme.d.cts} +41 -21
- package/build/{theme/index.d.ts → theme.d.ts} +41 -21
- package/build/theme.js +692 -0
- package/build/theme.js.map +1 -0
- package/build/utils.cjs +205 -0
- package/build/utils.cjs.map +1 -0
- package/build/utils.d.cts +26 -0
- package/build/utils.d.ts +26 -0
- package/build/utils.js +167 -0
- package/build/utils.js.map +1 -0
- package/package.json +47 -33
- package/build/components/code/index.cjs +0 -152
- package/build/components/code/index.d.cts +0 -11
- package/build/components/code/index.d.ts +0 -11
- package/build/components/code/index.js +0 -148
- package/build/components/code/utils/highlight-api.cjs +0 -18
- package/build/components/code/utils/highlight-api.d.cts +0 -7
- package/build/components/code/utils/highlight-api.d.ts +0 -7
- package/build/components/code/utils/highlight-api.js +0 -14
- package/build/components/code/utils/syntax-grammars.cjs +0 -62
- package/build/components/code/utils/syntax-grammars.d.cts +0 -7
- package/build/components/code/utils/syntax-grammars.d.ts +0 -7
- package/build/components/code/utils/syntax-grammars.js +0 -59
- package/build/components/code/utils/syntax-highlighter-theme.cjs +0 -27
- package/build/components/code/utils/syntax-highlighter-theme.d.cts +0 -3
- package/build/components/code/utils/syntax-highlighter-theme.d.ts +0 -3
- package/build/components/code/utils/syntax-highlighter-theme.js +0 -23
- package/build/components/code/utils/syntax-highlighter-types.cjs +0 -2
- package/build/components/code/utils/syntax-highlighter-types.d.cts +0 -12
- package/build/components/code/utils/syntax-highlighter-types.d.ts +0 -12
- package/build/components/code/utils/syntax-highlighter-types.js +0 -1
- package/build/components/code/utils/syntax-tokenizer.cjs +0 -63
- package/build/components/code/utils/syntax-tokenizer.d.cts +0 -3
- package/build/components/code/utils/syntax-tokenizer.d.ts +0 -3
- package/build/components/code/utils/syntax-tokenizer.js +0 -58
- package/build/components/curve/bezier-conversion.cjs +0 -23
- package/build/components/curve/bezier-conversion.d.cts +0 -2
- package/build/components/curve/bezier-conversion.d.ts +0 -2
- package/build/components/curve/bezier-conversion.js +0 -19
- package/build/components/curve/canvas-controls.cjs +0 -300
- package/build/components/curve/canvas-controls.d.cts +0 -12
- package/build/components/curve/canvas-controls.d.ts +0 -12
- package/build/components/curve/canvas-controls.js +0 -296
- package/build/components/curve/canvas.cjs +0 -1208
- package/build/components/curve/canvas.d.cts +0 -24
- package/build/components/curve/canvas.d.ts +0 -24
- package/build/components/curve/canvas.js +0 -1204
- package/build/components/curve/constants.cjs +0 -203
- package/build/components/curve/constants.d.cts +0 -23
- package/build/components/curve/constants.d.ts +0 -23
- package/build/components/curve/constants.js +0 -200
- package/build/components/curve/controls.cjs +0 -942
- package/build/components/curve/controls.d.cts +0 -37
- package/build/components/curve/controls.d.ts +0 -37
- package/build/components/curve/controls.js +0 -938
- package/build/components/curve/index.cjs +0 -335
- package/build/components/curve/index.d.cts +0 -31
- package/build/components/curve/index.d.ts +0 -31
- package/build/components/curve/index.js +0 -330
- package/build/components/curve/output.cjs +0 -141
- package/build/components/curve/output.d.cts +0 -19
- package/build/components/curve/output.d.ts +0 -19
- package/build/components/curve/output.js +0 -137
- package/build/components/curve/styles.cjs +0 -493
- package/build/components/curve/styles.d.cts +0 -6
- package/build/components/curve/styles.d.ts +0 -6
- package/build/components/curve/styles.js +0 -490
- package/build/components/curve/svg-renderer.cjs +0 -185
- package/build/components/curve/svg-renderer.d.cts +0 -9
- package/build/components/curve/svg-renderer.d.ts +0 -9
- package/build/components/curve/svg-renderer.js +0 -175
- package/build/components/curve/toolbar.cjs +0 -368
- package/build/components/curve/toolbar.d.cts +0 -26
- package/build/components/curve/toolbar.d.ts +0 -26
- package/build/components/curve/toolbar.js +0 -364
- package/build/components/curve/types.cjs +0 -10
- package/build/components/curve/types.d.cts +0 -33
- package/build/components/curve/types.d.ts +0 -33
- package/build/components/curve/types.js +0 -7
- package/build/components/curve/utils.cjs +0 -541
- package/build/components/curve/utils.d.cts +0 -33
- package/build/components/curve/utils.d.ts +0 -33
- package/build/components/curve/utils.js +0 -521
- package/build/components/index.cjs +0 -18
- package/build/components/index.d.cts +0 -2
- package/build/components/index.d.ts +0 -2
- package/build/components/index.js +0 -2
- package/build/decorators/Component.cjs +0 -127
- package/build/decorators/Component.d.cts +0 -28
- package/build/decorators/Component.d.ts +0 -28
- package/build/decorators/Component.js +0 -123
- package/build/decorators/Listen.cjs +0 -154
- package/build/decorators/Listen.d.cts +0 -18
- package/build/decorators/Listen.d.ts +0 -18
- package/build/decorators/Listen.js +0 -151
- package/build/decorators/OutsideClick.cjs +0 -64
- package/build/decorators/OutsideClick.d.cts +0 -16
- package/build/decorators/OutsideClick.d.ts +0 -16
- package/build/decorators/OutsideClick.js +0 -59
- package/build/decorators/Prop.cjs +0 -273
- package/build/decorators/Prop.d.cts +0 -22
- package/build/decorators/Prop.d.ts +0 -22
- package/build/decorators/Prop.js +0 -270
- package/build/decorators/Query.cjs +0 -79
- package/build/decorators/Query.d.cts +0 -27
- package/build/decorators/Query.d.ts +0 -27
- package/build/decorators/Query.js +0 -76
- package/build/decorators/Watch.cjs +0 -52
- package/build/decorators/Watch.d.cts +0 -11
- package/build/decorators/Watch.d.ts +0 -11
- package/build/decorators/Watch.js +0 -49
- package/build/decorators/index.cjs +0 -15
- package/build/decorators/index.d.cts +0 -6
- package/build/decorators/index.d.ts +0 -6
- package/build/decorators/index.js +0 -6
- package/build/elements/button/index.cjs +0 -214
- package/build/elements/button/index.d.cts +0 -11
- package/build/elements/button/index.d.ts +0 -11
- package/build/elements/button/index.js +0 -210
- package/build/elements/checkbox/index.cjs +0 -316
- package/build/elements/checkbox/index.d.cts +0 -14
- package/build/elements/checkbox/index.d.ts +0 -14
- package/build/elements/checkbox/index.js +0 -312
- package/build/elements/color/index.cjs +0 -154
- package/build/elements/color/index.d.cts +0 -18
- package/build/elements/color/index.d.ts +0 -18
- package/build/elements/color/index.js +0 -150
- package/build/elements/color/picker.cjs +0 -544
- package/build/elements/color/picker.d.cts +0 -37
- package/build/elements/color/picker.d.ts +0 -37
- package/build/elements/color/picker.js +0 -540
- package/build/elements/color/utils.cjs +0 -235
- package/build/elements/color/utils.d.cts +0 -37
- package/build/elements/color/utils.d.ts +0 -37
- package/build/elements/color/utils.js +0 -218
- package/build/elements/dropdown/index.cjs +0 -875
- package/build/elements/dropdown/index.d.cts +0 -30
- package/build/elements/dropdown/index.d.ts +0 -30
- package/build/elements/dropdown/index.js +0 -871
- package/build/elements/field/index.cjs +0 -82
- package/build/elements/field/index.d.cts +0 -4
- package/build/elements/field/index.d.ts +0 -4
- package/build/elements/field/index.js +0 -78
- package/build/elements/icons/animation/chevron.cjs +0 -57
- package/build/elements/icons/animation/chevron.d.cts +0 -10
- package/build/elements/icons/animation/chevron.d.ts +0 -10
- package/build/elements/icons/animation/chevron.js +0 -53
- package/build/elements/icons/animation/clear.cjs +0 -74
- package/build/elements/icons/animation/clear.d.cts +0 -3
- package/build/elements/icons/animation/clear.d.ts +0 -3
- package/build/elements/icons/animation/clear.js +0 -70
- package/build/elements/icons/animation/grid.cjs +0 -77
- package/build/elements/icons/animation/grid.d.cts +0 -8
- package/build/elements/icons/animation/grid.d.ts +0 -8
- package/build/elements/icons/animation/grid.js +0 -73
- package/build/elements/icons/animation/loading.cjs +0 -68
- package/build/elements/icons/animation/loading.d.cts +0 -3
- package/build/elements/icons/animation/loading.d.ts +0 -3
- package/build/elements/icons/animation/loading.js +0 -64
- package/build/elements/icons/animation/snap.cjs +0 -133
- package/build/elements/icons/animation/snap.d.cts +0 -8
- package/build/elements/icons/animation/snap.d.ts +0 -8
- package/build/elements/icons/animation/snap.js +0 -129
- package/build/elements/icons/index.cjs +0 -40
- package/build/elements/icons/index.d.cts +0 -24
- package/build/elements/icons/index.d.ts +0 -24
- package/build/elements/icons/index.js +0 -24
- package/build/elements/icons/interface/anchor-add.cjs +0 -35
- package/build/elements/icons/interface/anchor-add.d.cts +0 -3
- package/build/elements/icons/interface/anchor-add.d.ts +0 -3
- package/build/elements/icons/interface/anchor-add.js +0 -31
- package/build/elements/icons/interface/anchor-remove.cjs +0 -34
- package/build/elements/icons/interface/anchor-remove.d.cts +0 -3
- package/build/elements/icons/interface/anchor-remove.d.ts +0 -3
- package/build/elements/icons/interface/anchor-remove.js +0 -30
- package/build/elements/icons/interface/arrow-up.cjs +0 -30
- package/build/elements/icons/interface/arrow-up.d.cts +0 -3
- package/build/elements/icons/interface/arrow-up.d.ts +0 -3
- package/build/elements/icons/interface/arrow-up.js +0 -26
- package/build/elements/icons/interface/arrows-vertical.cjs +0 -30
- package/build/elements/icons/interface/arrows-vertical.d.cts +0 -3
- package/build/elements/icons/interface/arrows-vertical.d.ts +0 -3
- package/build/elements/icons/interface/arrows-vertical.js +0 -26
- package/build/elements/icons/interface/bezier-angle.cjs +0 -33
- package/build/elements/icons/interface/bezier-angle.d.cts +0 -3
- package/build/elements/icons/interface/bezier-angle.d.ts +0 -3
- package/build/elements/icons/interface/bezier-angle.js +0 -29
- package/build/elements/icons/interface/bezier-distribute.cjs +0 -34
- package/build/elements/icons/interface/bezier-distribute.d.cts +0 -3
- package/build/elements/icons/interface/bezier-distribute.d.ts +0 -3
- package/build/elements/icons/interface/bezier-distribute.js +0 -30
- package/build/elements/icons/interface/bezier-length.cjs +0 -31
- package/build/elements/icons/interface/bezier-length.d.cts +0 -3
- package/build/elements/icons/interface/bezier-length.d.ts +0 -3
- package/build/elements/icons/interface/bezier-length.js +0 -27
- package/build/elements/icons/interface/bezier-mirror.cjs +0 -31
- package/build/elements/icons/interface/bezier-mirror.d.cts +0 -3
- package/build/elements/icons/interface/bezier-mirror.d.ts +0 -3
- package/build/elements/icons/interface/bezier-mirror.js +0 -27
- package/build/elements/icons/interface/bezier.cjs +0 -26
- package/build/elements/icons/interface/bezier.d.cts +0 -3
- package/build/elements/icons/interface/bezier.d.ts +0 -3
- package/build/elements/icons/interface/bezier.js +0 -22
- package/build/elements/icons/interface/check.cjs +0 -30
- package/build/elements/icons/interface/check.d.cts +0 -3
- package/build/elements/icons/interface/check.d.ts +0 -3
- package/build/elements/icons/interface/check.js +0 -26
- package/build/elements/icons/interface/circle-arrow-left.cjs +0 -30
- package/build/elements/icons/interface/circle-arrow-left.d.cts +0 -3
- package/build/elements/icons/interface/circle-arrow-left.d.ts +0 -3
- package/build/elements/icons/interface/circle-arrow-left.js +0 -26
- package/build/elements/icons/interface/circle-arrow-right.cjs +0 -30
- package/build/elements/icons/interface/circle-arrow-right.d.cts +0 -3
- package/build/elements/icons/interface/circle-arrow-right.d.ts +0 -3
- package/build/elements/icons/interface/circle-arrow-right.js +0 -26
- package/build/elements/icons/interface/code.cjs +0 -30
- package/build/elements/icons/interface/code.d.cts +0 -3
- package/build/elements/icons/interface/code.d.ts +0 -3
- package/build/elements/icons/interface/code.js +0 -26
- package/build/elements/icons/interface/dots.cjs +0 -32
- package/build/elements/icons/interface/dots.d.cts +0 -3
- package/build/elements/icons/interface/dots.d.ts +0 -3
- package/build/elements/icons/interface/dots.js +0 -28
- package/build/elements/icons/interface/mention.cjs +0 -30
- package/build/elements/icons/interface/mention.d.cts +0 -3
- package/build/elements/icons/interface/mention.d.ts +0 -3
- package/build/elements/icons/interface/mention.js +0 -26
- package/build/elements/icons/interface/minus.cjs +0 -30
- package/build/elements/icons/interface/minus.d.cts +0 -3
- package/build/elements/icons/interface/minus.d.ts +0 -3
- package/build/elements/icons/interface/minus.js +0 -26
- package/build/elements/icons/interface/picker.cjs +0 -34
- package/build/elements/icons/interface/picker.d.cts +0 -3
- package/build/elements/icons/interface/picker.d.ts +0 -3
- package/build/elements/icons/interface/picker.js +0 -30
- package/build/elements/icons/interface/plus.cjs +0 -30
- package/build/elements/icons/interface/plus.d.cts +0 -3
- package/build/elements/icons/interface/plus.d.ts +0 -3
- package/build/elements/icons/interface/plus.js +0 -26
- package/build/elements/icons/interface/settings.cjs +0 -30
- package/build/elements/icons/interface/settings.d.cts +0 -3
- package/build/elements/icons/interface/settings.d.ts +0 -3
- package/build/elements/icons/interface/settings.js +0 -26
- package/build/elements/index.cjs +0 -65
- package/build/elements/index.d.cts +0 -23
- package/build/elements/index.d.ts +0 -23
- package/build/elements/index.js +0 -23
- package/build/elements/input/index.cjs +0 -273
- package/build/elements/input/index.d.cts +0 -17
- package/build/elements/input/index.d.ts +0 -17
- package/build/elements/input/index.js +0 -269
- package/build/elements/logo/index.cjs +0 -732
- package/build/elements/logo/index.d.cts +0 -17
- package/build/elements/logo/index.d.ts +0 -17
- package/build/elements/logo/index.js +0 -728
- package/build/elements/monitor/fps.cjs +0 -432
- package/build/elements/monitor/fps.d.cts +0 -21
- package/build/elements/monitor/fps.d.ts +0 -21
- package/build/elements/monitor/fps.js +0 -428
- package/build/elements/monitor/index.cjs +0 -670
- package/build/elements/monitor/index.js +0 -666
- package/build/elements/number/index.cjs +0 -173
- package/build/elements/number/index.d.cts +0 -19
- package/build/elements/number/index.d.ts +0 -19
- package/build/elements/number/index.js +0 -169
- package/build/elements/origin/index.cjs +0 -169
- package/build/elements/origin/index.d.cts +0 -12
- package/build/elements/origin/index.d.ts +0 -12
- package/build/elements/origin/index.js +0 -165
- package/build/elements/panel/index.cjs +0 -496
- package/build/elements/panel/index.js +0 -492
- package/build/elements/popover/index.cjs +0 -209
- package/build/elements/popover/index.d.cts +0 -19
- package/build/elements/popover/index.d.ts +0 -19
- package/build/elements/popover/index.js +0 -205
- package/build/elements/radio/index.cjs +0 -301
- package/build/elements/radio/index.d.cts +0 -13
- package/build/elements/radio/index.d.ts +0 -13
- package/build/elements/radio/index.js +0 -283
- package/build/elements/radio/input.cjs +0 -329
- package/build/elements/radio/input.d.cts +0 -15
- package/build/elements/radio/input.d.ts +0 -15
- package/build/elements/radio/input.js +0 -325
- package/build/elements/radio/option.cjs +0 -15
- package/build/elements/radio/option.d.cts +0 -3
- package/build/elements/radio/option.d.ts +0 -3
- package/build/elements/radio/option.js +0 -11
- package/build/elements/shared.cjs +0 -66
- package/build/elements/shared.d.cts +0 -40
- package/build/elements/shared.d.ts +0 -40
- package/build/elements/shared.js +0 -59
- package/build/elements/slider/index.cjs +0 -232
- package/build/elements/slider/index.d.cts +0 -20
- package/build/elements/slider/index.d.ts +0 -20
- package/build/elements/slider/index.js +0 -228
- package/build/elements/state/index.cjs +0 -274
- package/build/elements/state/index.js +0 -270
- package/build/elements/toggle/index.cjs +0 -151
- package/build/elements/toggle/index.d.cts +0 -9
- package/build/elements/toggle/index.d.ts +0 -9
- package/build/elements/toggle/index.js +0 -147
- package/build/elements/tooltip/index.cjs +0 -187
- package/build/elements/tooltip/index.d.cts +0 -17
- package/build/elements/tooltip/index.d.ts +0 -17
- package/build/elements/tooltip/index.js +0 -183
- package/build/init.cjs +0 -325
- package/build/init.d.cts +0 -157
- package/build/init.d.ts +0 -157
- package/build/init.js +0 -289
- package/build/internal/component-loaders.cjs +0 -208
- package/build/internal/component-loaders.d.cts +0 -52
- package/build/internal/component-loaders.d.ts +0 -52
- package/build/internal/component-loaders.js +0 -169
- package/build/internal/fonts.cjs +0 -128
- package/build/internal/fonts.d.cts +0 -32
- package/build/internal/fonts.d.ts +0 -32
- package/build/internal/fonts.js +0 -123
- package/build/internal/lazy-load.cjs +0 -89
- package/build/internal/lazy-load.d.cts +0 -32
- package/build/internal/lazy-load.d.ts +0 -32
- package/build/internal/lazy-load.js +0 -86
- package/build/internal/style-inject.cjs +0 -236
- package/build/internal/style-inject.d.cts +0 -44
- package/build/internal/style-inject.d.ts +0 -44
- package/build/internal/style-inject.js +0 -226
- package/build/react/events.cjs +0 -25
- package/build/react/events.d.cts +0 -39
- package/build/react/events.d.ts +0 -39
- package/build/react/events.js +0 -22
- package/build/react/index.cjs +0 -19
- package/build/react/index.d.cts +0 -13
- package/build/react/index.d.ts +0 -13
- package/build/react/index.js +0 -12
- package/build/react/provider.cjs +0 -134
- package/build/react/provider.d.cts +0 -81
- package/build/react/provider.d.ts +0 -81
- package/build/react/provider.js +0 -98
- package/build/react/types.cjs +0 -8
- package/build/react/types.d.cts +0 -55
- package/build/react/types.d.ts +0 -55
- package/build/react/types.js +0 -7
- package/build/react/use-ease-state.cjs +0 -129
- package/build/react/use-ease-state.d.cts +0 -95
- package/build/react/use-ease-state.d.ts +0 -95
- package/build/react/use-ease-state.js +0 -126
- package/build/react/use-web-kit.cjs +0 -150
- package/build/react/use-web-kit.d.cts +0 -80
- package/build/react/use-web-kit.d.ts +0 -80
- package/build/react/use-web-kit.js +0 -114
- package/build/theme/index.cjs +0 -452
- package/build/theme/index.js +0 -423
- package/build/theme/presets.cjs +0 -54
- package/build/theme/presets.d.cts +0 -19
- package/build/theme/presets.d.ts +0 -19
- package/build/theme/presets.js +0 -51
- package/build/theme/registry.cjs +0 -204
- package/build/theme/registry.d.cts +0 -99
- package/build/theme/registry.d.ts +0 -99
- package/build/theme/registry.js +0 -194
- package/build/theme/tokens.cjs +0 -148
- package/build/theme/tokens.d.cts +0 -163
- package/build/theme/tokens.d.ts +0 -163
- package/build/theme/tokens.js +0 -145
- package/build/utils/dismiss-controller.cjs +0 -77
- package/build/utils/dismiss-controller.d.cts +0 -14
- package/build/utils/dismiss-controller.d.ts +0 -14
- package/build/utils/dismiss-controller.js +0 -73
- package/build/utils/index.cjs +0 -18
- package/build/utils/index.d.cts +0 -3
- package/build/utils/index.d.ts +0 -3
- package/build/utils/index.js +0 -3
- package/build/utils/outside-click.cjs +0 -82
- package/build/utils/outside-click.d.cts +0 -18
- package/build/utils/outside-click.d.ts +0 -18
- package/build/utils/outside-click.js +0 -74
- package/build/utils/template-helpers.cjs +0 -39
- package/build/utils/template-helpers.d.cts +0 -13
- package/build/utils/template-helpers.d.ts +0 -13
- package/build/utils/template-helpers.js +0 -28
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/web-kit/web-kit/packages/core/src/elements/button/index.ts","../src/decorators/Component.ts","../src/decorators/Prop.ts","/home/runner/work/web-kit/web-kit/packages/core/src/elements/checkbox/index.ts","/home/runner/work/web-kit/web-kit/packages/core/src/elements/shared.ts","../src/decorators/Listen.ts","../src/decorators/Query.ts","/home/runner/work/web-kit/web-kit/packages/core/src/elements/color/index.ts","/home/runner/work/web-kit/web-kit/packages/core/src/elements/popover/index.ts","/home/runner/work/web-kit/web-kit/packages/core/src/elements/icons/animation/chevron.ts","/home/runner/work/web-kit/web-kit/packages/core/src/elements/dropdown/index.ts","/home/runner/work/web-kit/web-kit/packages/core/src/utils/dismiss-controller.ts","../src/utils/outside-click.ts","../src/decorators/OutsideClick.ts","/home/runner/work/web-kit/web-kit/packages/core/src/elements/input/index.ts","/home/runner/work/web-kit/web-kit/packages/core/src/elements/color/picker.ts","/home/runner/work/web-kit/web-kit/packages/core/src/elements/color/utils.ts","../src/utils/template-helpers.ts","/home/runner/work/web-kit/web-kit/packages/core/src/elements/icons/interface/arrows-vertical.ts","/home/runner/work/web-kit/web-kit/packages/core/src/elements/icons/interface/picker.ts","/home/runner/work/web-kit/web-kit/packages/core/src/elements/field/index.ts","/home/runner/work/web-kit/web-kit/packages/core/src/elements/icons/animation/clear.ts","/home/runner/work/web-kit/web-kit/packages/core/src/elements/icons/animation/grid.ts","/home/runner/work/web-kit/web-kit/packages/core/src/elements/icons/animation/loading.ts","/home/runner/work/web-kit/web-kit/packages/core/src/elements/icons/animation/snap.ts","/home/runner/work/web-kit/web-kit/packages/core/src/elements/icons/interface/anchor-add.ts","/home/runner/work/web-kit/web-kit/packages/core/src/elements/icons/interface/anchor-remove.ts","/home/runner/work/web-kit/web-kit/packages/core/src/elements/icons/interface/arrow-up.ts","/home/runner/work/web-kit/web-kit/packages/core/src/elements/icons/interface/bezier.ts","/home/runner/work/web-kit/web-kit/packages/core/src/elements/icons/interface/bezier-angle.ts","/home/runner/work/web-kit/web-kit/packages/core/src/elements/icons/interface/bezier-distribute.ts","/home/runner/work/web-kit/web-kit/packages/core/src/elements/icons/interface/bezier-length.ts","/home/runner/work/web-kit/web-kit/packages/core/src/elements/icons/interface/bezier-mirror.ts","/home/runner/work/web-kit/web-kit/packages/core/src/elements/icons/interface/check.ts","/home/runner/work/web-kit/web-kit/packages/core/src/elements/icons/interface/circle-arrow-left.ts","/home/runner/work/web-kit/web-kit/packages/core/src/elements/icons/interface/circle-arrow-right.ts","/home/runner/work/web-kit/web-kit/packages/core/src/elements/icons/interface/code.ts","/home/runner/work/web-kit/web-kit/packages/core/src/elements/icons/interface/dots.ts","/home/runner/work/web-kit/web-kit/packages/core/src/elements/icons/interface/mention.ts","/home/runner/work/web-kit/web-kit/packages/core/src/elements/icons/interface/minus.ts","/home/runner/work/web-kit/web-kit/packages/core/src/elements/icons/interface/plus.ts","/home/runner/work/web-kit/web-kit/packages/core/src/elements/icons/interface/settings.ts","/home/runner/work/web-kit/web-kit/packages/core/src/elements/logo/index.ts","/home/runner/work/web-kit/web-kit/packages/core/src/elements/monitor/index.ts","../src/decorators/Watch.ts","/home/runner/work/web-kit/web-kit/packages/core/src/elements/monitor/fps.ts","/home/runner/work/web-kit/web-kit/packages/core/src/elements/number/index.ts","/home/runner/work/web-kit/web-kit/packages/core/src/elements/origin/index.ts","/home/runner/work/web-kit/web-kit/packages/core/src/elements/panel/index.ts","/home/runner/work/web-kit/web-kit/packages/core/src/elements/radio/index.ts","/home/runner/work/web-kit/web-kit/packages/core/src/elements/radio/option.ts","/home/runner/work/web-kit/web-kit/packages/core/src/elements/radio/input.ts","/home/runner/work/web-kit/web-kit/packages/core/src/elements/slider/index.ts","/home/runner/work/web-kit/web-kit/packages/core/src/elements/state/index.ts","/home/runner/work/web-kit/web-kit/packages/core/src/elements/toggle/index.ts","/home/runner/work/web-kit/web-kit/packages/core/src/elements/tooltip/index.ts","/home/runner/work/web-kit/web-kit/packages/core/src/components/code/index.ts","/home/runner/work/web-kit/web-kit/packages/core/src/components/code/utils/highlight-api.ts","/home/runner/work/web-kit/web-kit/packages/core/src/components/code/utils/syntax-highlighter-theme.ts","/home/runner/work/web-kit/web-kit/packages/core/src/components/code/utils/syntax-grammars.ts","/home/runner/work/web-kit/web-kit/packages/core/src/components/code/utils/syntax-tokenizer.ts","/home/runner/work/web-kit/web-kit/packages/core/src/components/curve/index.ts","/home/runner/work/web-kit/web-kit/packages/core/src/components/curve/bezier-conversion.ts","/home/runner/work/web-kit/web-kit/packages/core/src/components/curve/styles.ts","/home/runner/work/web-kit/web-kit/packages/core/src/components/curve/types.ts","/home/runner/work/web-kit/web-kit/packages/core/src/components/curve/utils.ts","/home/runner/work/web-kit/web-kit/packages/core/src/components/curve/canvas.ts","/home/runner/work/web-kit/web-kit/packages/core/src/components/curve/constants.ts","/home/runner/work/web-kit/web-kit/packages/core/src/components/curve/svg-renderer.ts","../src/elements/shared.ts","/home/runner/work/web-kit/web-kit/packages/core/src/components/curve/canvas-controls.ts","/home/runner/work/web-kit/web-kit/packages/core/src/components/curve/controls.ts","/home/runner/work/web-kit/web-kit/packages/core/src/components/curve/output.ts","/home/runner/work/web-kit/web-kit/packages/core/src/components/curve/toolbar.ts"],"sourcesContent":["import { html, type TemplateResult } from 'lit-html';\n\nimport { Component } from '~/decorators/Component';\nimport { Prop } from '~/decorators/Prop';\n\n@Component({\n tag: 'ease-button',\n autoSlot: true,\n shadowMode: 'open',\n styles: `\n :host {\n display: block;\n width: 100%;\n }\n\n :host([data-variant=\"headless\"]) {\n display: inline-flex;\n width: auto;\n }\n\n button {\n appearance: none;\n font-family: var(--ease-font-family, inherit);\n font-optical-sizing: auto;\n font-size: var(--ease-button-font-size, var(--ease-font-size-sm, 12px));\n font-weight: 550;\n color: var(--ease-button-color, var(--color-blue-100));\n min-width: 0;\n padding: var(--ease-button-padding, 7px 8px);\n display: block;\n border-radius: var(--ease-button-radius, 5px);\n background-color: var(--ease-button-background, var(--color-gray-850));\n border: none;\n outline: none;\n margin: 0;\n line-height: var(--ease-button-line-height, 14px);\n box-shadow: inset 0 1px .25px 0 var(--color-white-4), 0 1px 2.5px 0 var(--color-black-8);\n transition: color 0.2s, background-color 0.2s, scale 0.2s, box-shadow 0.2s;\n cursor: pointer;\n min-width: var(--ease-button-min-width, 88px);\n white-space: nowrap;\n overflow: hidden;\n position: relative;\n text-overflow: ellipsis;\n text-align: center;\n\n &[data-pill=\"true\"] {\n border-radius: 999px;\n }\n\n &[data-full-width=\"true\"] {\n width: 100%;\n }\n\n &[data-block=\"icon\"] {\n --ease-icon-size: 16px;\n width: 28px;\n height: 28px;\n min-width: 28px;\n padding: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--color-gray-700);\n\n &:hover,\n &:focus-visible {\n color: var(--ease-button-hover-color, var(--color-blue-100));\n }\n\n &[data-variant=\"headless\"] {\n --ease-icon-size: 16px;\n width: auto;\n height: auto;\n padding: 0;\n min-width: 0;\n margin: -1px;\n }\n }\n \n &[data-block=\"small\"] {\n padding: 5px 8px;\n font-size: 12px;\n line-height: 14px;\n border-radius: 5px;\n }\n \n &[data-block=\"large\"] {\n padding: 9px 12px;\n font-size: 13px;\n line-height: 14px;\n border-radius: 8px;\n }\n\n &:hover,\n &:focus-visible {\n background-color: var(--ease-button-hover-background-color, var(--color-gray-825));\n color: var(--ease-button-hover-color, var(--color-blue-100));\n }\n\n &[data-variant=\"headless\"],\n &[data-variant=\"headless-muted\"] {\n background-color: transparent;\n box-shadow: none;\n min-width: 0;\n width: auto;\n padding: 0;\n transition: scale 0.2s, color 0.2s;\n\n &:hover,\n &:focus-visible {\n scale: 1.05;\n }\n\n &:active {\n scale: 0.95;\n }\n }\n\n &[data-variant=\"headless-muted\"] {\n color: var(--ease-button-color, var(--color-gray-600));\n\n &:hover,\n &:focus-visible {\n color: var(--ease-button-hover-color, var(--color-blue-100));\n }\n }\n\n &[data-variant=\"link\"] {\n background-color: transparent;\n box-shadow: none;\n\n &:hover,\n &:focus-visible {\n background-color: var(--ease-button-hover-background-color, var(--color-gray-875));\n }\n }\n\n &[data-variant=\"primary\"] {\n color: var(--color-blue-100);\n font-weight: 450;\n border-radius: 36px;\n \n background: radial-gradient(217.29% 45.98% at 99.13% 4.17%, rgba(21, 24, 220, 0.40) 0%, rgba(21, 24, 220, 0.00) 100%), radial-gradient(104.75% 41.7% at 3.06% 100%, rgba(233, 208, 254, 0.30) 0%, rgba(21, 24, 220, 0.00) 100%), radial-gradient(30.53% 47.92% at 46.51% -14.58%, rgba(233, 208, 254, 0.60) 0%, rgba(21, 24, 220, 0.00) 100%), radial-gradient(22.57% 35.42% at 46.29% 112.5%, rgba(233, 208, 254, 0.20) 0%, rgba(21, 24, 220, 0.00) 100%), rgba(255, 255, 255, 0.12);\n background-repeat: no-repeat;\n\n box-shadow: \n 0px 1px 0px 0px rgba(255, 255, 255, 0.2), \n inset 0px 0px 50px 0px rgba(255, 255, 255, 0.02), \n inset 0px 0px 0px 1px rgba(255, 255, 255, 0.02), \n inset 0px 0px 4px 0px rgba(69, 40, 255, 0.4);\n\n\n &::before {\n content: '';\n position: absolute;\n inset: 0;\n background-color: var(--color-white-2);\n box-shadow: inset 0px 0.5px 0.75px 0px var(--color-white-30);\n mix-blend-mode: overlay;\n pointer-events: none;\n z-index: 1;\n border-radius: inherit;\n }\n\n &:hover,\n &:focus-visible {\n filter: brightness(1.1);\n }\n }\n }\n `\n})\nexport class Button extends HTMLElement {\n declare requestRender: () => void;\n\n @Prop<boolean>({ type: Boolean, reflect: true })\n accessor disabled: boolean = false;\n\n @Prop<boolean>({ type: Boolean, reflect: true })\n accessor pill: boolean = false;\n\n @Prop<boolean>({ type: Boolean, reflect: true })\n accessor fullWidth: boolean = false;\n\n @Prop<'submit' | 'reset' | 'button'>({ type: String, reflect: true, defaultValue: 'button' })\n accessor type!: 'submit' | 'reset' | 'button';\n\n @Prop<'icon' | 'small' | 'medium' | 'large'>({\n type: String,\n reflect: true,\n defaultValue: 'medium',\n onAttributeChange() {\n this.requestRender?.();\n }\n })\n accessor block: 'icon' | 'small' | 'medium' | 'large' = 'medium';\n\n @Prop<'default' | 'primary' | 'headless' | 'headless-muted' | 'link'>({\n type: String,\n reflect: true,\n defaultValue: 'default'\n })\n accessor variant!: 'default' | 'primary' | 'headless' | 'headless-muted' | 'link';\n\n render(): TemplateResult {\n return html`\n <button\n type=${this.type}\n ?disabled=${this.disabled}\n data-variant=${this.variant}\n data-full-width=${this.fullWidth}\n data-pill=${this.pill}\n data-block=\"${this.block}\"\n >\n <slot></slot>\n </button>\n `;\n }\n}\n","import { html, render, type TemplateResult } from 'lit-html';\n\ntype Constructor<T extends HTMLElement> = new (...args: unknown[]) => T;\n\ninterface LifecycleElement {\n connectedCallback?(): void;\n disconnectedCallback?(): void;\n attributeChangedCallback?(name: string, oldValue: string | null, newValue: string | null): void;\n}\n\ntype RenderableElement = HTMLElement & {\n render?(): TemplateResult | null | undefined;\n afterRender?(): void;\n wrapRender?(commit: () => void, context: RenderContext): void;\n onAttributeChange?(name: string, oldValue: string | null, newValue: string | null): void;\n requestRender?(): void;\n renderRoot?: ShadowRoot | HTMLElement;\n};\n\ntype TemplateValue<TElement extends RenderableElement> =\n | TemplateResult\n | null\n | undefined\n | ((this: TElement, host: TElement) => TemplateResult | null | undefined);\n\ninterface ComponentOptions<TElement extends RenderableElement = RenderableElement> {\n tag: string;\n template?: TemplateValue<TElement>;\n styles?: string;\n styleUrls?: string[];\n observedAttributes?: string[];\n shadowMode?: ShadowRootMode;\n autoSlot?: boolean;\n}\n\n// Exporting RenderContext\nexport interface RenderContext {\n fragment: DocumentFragment;\n root: ShadowRoot | HTMLElement;\n}\n\nconst styleCache = new Map<string, Promise<string>>();\n\nconst normalizeTemplate = <TElement extends RenderableElement>(\n template?: TemplateValue<TElement>\n): ((this: TElement, host: TElement) => TemplateResult | null | undefined) => {\n if (typeof template === 'function') {\n return template as (this: TElement, host: TElement) => TemplateResult | null | undefined;\n }\n\n if (template && typeof template === 'object' && '_$litTemplate$' in template) {\n return function (this: TElement): TemplateResult | null | undefined {\n return template as TemplateResult;\n };\n }\n\n return function (this: TElement): TemplateResult | null | undefined {\n return null;\n };\n};\n\nconst fetchStyles = async (urls: readonly string[]): Promise<string[]> =>\n Promise.all(\n urls.map((url) => {\n const cached = styleCache.get(url);\n if (cached) {\n return cached;\n }\n\n const request = fetch(url)\n .then((response) => (response.ok ? response.text() : ''))\n .catch(() => '');\n\n styleCache.set(url, request);\n return request;\n })\n );\n\nexport const Component =\n <TElement extends RenderableElement = RenderableElement>(options: ComponentOptions<TElement>) =>\n <TBase extends Constructor<TElement> & { observedAttributes?: string[] }>(\n Base: TBase,\n _context: ClassDecoratorContext\n ): TBase => {\n const {\n tag,\n template,\n styles = '',\n styleUrls = [],\n observedAttributes = [],\n shadowMode = 'open',\n autoSlot = true\n } = options;\n\n if (!tag) {\n throw new Error('@Component requires a \"tag\" option.');\n }\n\n const templateFn = normalizeTemplate<TElement>(template);\n\n class Decorated extends (Base as unknown as Constructor<RenderableElement>) {\n static get observedAttributes(): string[] {\n const parent =\n 'observedAttributes' in Base && Array.isArray(Base.observedAttributes)\n ? (Base.observedAttributes as string[])\n : [];\n const own = Array.isArray(observedAttributes) ? observedAttributes : [];\n return Array.from(new Set([...parent, ...own]));\n }\n\n #shadow: ShadowRoot;\n #styles = styles;\n #styleUrls = [...styleUrls];\n #renderScheduled = false;\n\n constructor(...args: unknown[]) {\n super(...args);\n this.#shadow = this.attachShadow({ mode: shadowMode });\n this.renderRoot = this.#shadow;\n }\n\n get shadow(): HTMLElement | ShadowRoot | undefined {\n return this.renderRoot;\n }\n\n connectedCallback(): void {\n (Base.prototype as LifecycleElement).connectedCallback?.call(this);\n\n void this.#loadStyles().finally(() => {\n this.requestRender();\n });\n }\n\n disconnectedCallback(): void {\n (Base.prototype as LifecycleElement).disconnectedCallback?.call(this);\n this.#renderScheduled = false;\n }\n\n attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void {\n (Base.prototype as LifecycleElement).attributeChangedCallback?.call(this, name, oldValue, newValue);\n\n if (oldValue !== newValue) {\n this.onAttributeChange?.(name, oldValue, newValue);\n }\n }\n\n requestRender(): void {\n if (this.#renderScheduled) {\n return;\n }\n\n this.#renderScheduled = true;\n\n requestAnimationFrame(() => {\n this.#renderScheduled = false;\n this.#render();\n });\n }\n\n async #loadStyles(): Promise<void> {\n if (!this.#styleUrls.length) {\n return;\n }\n\n const fetched = await fetchStyles(this.#styleUrls);\n const inlineStyles = this.#styles ? [this.#styles] : [];\n this.#styles = [...inlineStyles, ...fetched.filter(Boolean)].join('\\n');\n }\n\n #render(): void {\n const root = this.#shadow;\n\n let templateResult: TemplateResult | null | undefined;\n\n if (typeof this.render === 'function') {\n templateResult = this.render();\n } else {\n templateResult = templateFn.call(this as unknown as TElement, this as unknown as TElement);\n }\n\n const styleTemplate = this.#styles ? html`<style>${this.#styles}</style>` : null;\n const slotTemplate = autoSlot ? html`<slot></slot>` : null;\n\n const completeTemplate = html`\n ${styleTemplate}\n ${templateResult ?? null}\n ${slotTemplate}\n `;\n\n const commit = (): void => {\n render(completeTemplate, root);\n this.afterRender?.();\n };\n\n if (typeof this.wrapRender === 'function') {\n const fragment = document.createDocumentFragment();\n const tempDiv = document.createElement('div');\n\n render(completeTemplate, tempDiv);\n\n fragment.append(...tempDiv.childNodes);\n\n this.wrapRender(commit, { fragment, root });\n return;\n }\n\n commit();\n }\n }\n\n // SSR safety: only register in browser environments\n if (typeof customElements !== 'undefined' && !customElements.get(tag)) {\n customElements.define(tag, Decorated as unknown as CustomElementConstructor);\n }\n\n return Decorated as unknown as TBase;\n };\n","type RenderHost = HTMLElement & {\n requestRender?(): void;\n render?(): void;\n connectedCallback?(): void;\n disconnectedCallback?(...args: unknown[]): void;\n};\n\ntype PropTypeDescriptor =\n | BooleanConstructor\n | NumberConstructor\n | StringConstructor\n | ObjectConstructor\n | ArrayConstructor\n | 'boolean'\n | 'number'\n | 'string'\n | 'json';\n\ntype Formatter<TValue, THost extends RenderHost> = (this: THost, value: TValue) => string | null | undefined;\ntype Parser<TValue, THost extends RenderHost> = (this: THost, value: string | null) => TValue;\n\ninterface PropOptions<TValue, THost extends RenderHost> {\n attribute?: string;\n reflect?: boolean;\n type?: PropTypeDescriptor;\n parse?: Parser<TValue, THost>;\n format?: Formatter<TValue, THost>;\n defaultValue?: TValue | ((this: THost) => TValue);\n compare?: (previous: TValue, next: TValue) => boolean;\n onChange?: (this: THost, next: TValue, previous: TValue) => void;\n onAttributeChange?: (this: THost, next: TValue, previous: TValue) => void;\n}\n\ninterface AttributeObserverEntry {\n observer: MutationObserver;\n callbacks: Map<string, Set<(value: string | null) => void>>;\n}\n\nconst renderQueue = new WeakMap<RenderHost, boolean>();\nconst cleanupRegistry = new WeakMap<RenderHost, Set<() => void>>();\nconst observerRegistry = new WeakMap<RenderHost, AttributeObserverEntry>();\nconst internalMutations = new WeakMap<RenderHost, Set<string>>();\n\nconst scheduleRender = (instance: RenderHost): void => {\n if (typeof instance.requestRender === 'function') {\n instance.requestRender();\n return;\n }\n\n if (typeof instance.render !== 'function') {\n return;\n }\n\n if (renderQueue.get(instance)) {\n return;\n }\n\n renderQueue.set(instance, true);\n\n requestAnimationFrame(() => {\n renderQueue.delete(instance);\n instance.render?.();\n });\n};\n\nconst toKebabCase = (value: PropertyKey): string =>\n String(value)\n .replace(/([a-z0-9])([A-Z])/g, '$1-$2')\n .replace(/[_\\s]+/g, '-')\n .toLowerCase();\n\nconst registerCleanup = (instance: RenderHost, cleanup: () => void): void => {\n let callbacks = cleanupRegistry.get(instance);\n\n if (!callbacks) {\n callbacks = new Set();\n cleanupRegistry.set(instance, callbacks);\n\n const original = instance.disconnectedCallback;\n\n instance.disconnectedCallback = function (this: RenderHost, ...args: unknown[]) {\n const registered = cleanupRegistry.get(this);\n registered?.forEach((callback) => {\n try {\n callback();\n } catch (error) {\n console.error('[Prop] cleanup failed', error);\n }\n });\n cleanupRegistry.delete(this);\n\n if (typeof original === 'function') {\n return original.apply(this, args as []);\n }\n\n return undefined;\n } as typeof instance.disconnectedCallback;\n }\n\n callbacks.add(cleanup);\n};\n\nconst markInternalMutation = (host: RenderHost, attribute: string): void => {\n let attributes = internalMutations.get(host);\n\n if (!attributes) {\n attributes = new Set();\n internalMutations.set(host, attributes);\n }\n\n attributes.add(attribute);\n};\n\nconst isInternalMutation = (host: RenderHost, attribute: string): boolean => {\n const attributes = internalMutations.get(host);\n\n if (!attributes) {\n return false;\n }\n\n const hasAttribute = attributes.has(attribute);\n\n if (hasAttribute) {\n attributes.delete(attribute);\n if (attributes.size === 0) {\n internalMutations.delete(host);\n }\n }\n\n return hasAttribute;\n};\n\nconst observeAttribute = (host: RenderHost, attribute: string, handler: (value: string | null) => void): void => {\n let entry = observerRegistry.get(host);\n\n if (!entry) {\n const callbacks = new Map<string, Set<(value: string | null) => void>>();\n const observer = new MutationObserver((records) => {\n records.forEach((record) => {\n const attributeName = record.attributeName;\n\n if (!attributeName) {\n return;\n }\n\n if (isInternalMutation(host, attributeName)) {\n return;\n }\n\n const listeners = callbacks.get(attributeName);\n if (!listeners) {\n return;\n }\n\n const currentValue = (record.target as Element).getAttribute(attributeName);\n\n for (const listener of listeners) {\n listener(currentValue);\n }\n });\n });\n\n observer.observe(host, { attributes: true });\n\n entry = { observer, callbacks };\n observerRegistry.set(host, entry);\n\n registerCleanup(host, () => {\n observer.disconnect();\n observerRegistry.delete(host);\n });\n }\n\n let listeners = entry.callbacks.get(attribute);\n\n if (!listeners) {\n listeners = new Set();\n entry.callbacks.set(attribute, listeners);\n }\n\n listeners.add(handler);\n};\n\nconst updateAttribute = (host: RenderHost, attribute: string, value: string | null | undefined | boolean): void => {\n markInternalMutation(host, attribute);\n\n if (value === undefined || value === null || value === false) {\n host.removeAttribute(attribute);\n return;\n }\n\n if (value === true) {\n host.setAttribute(attribute, '');\n return;\n }\n\n host.setAttribute(attribute, String(value));\n};\n\nconst resolveType = (type: PropTypeDescriptor | undefined): 'boolean' | 'number' | 'json' | 'string' | null => {\n if (!type) {\n return null;\n }\n\n if (type === Boolean || type === 'boolean') {\n return 'boolean';\n }\n\n if (type === Number || type === 'number') {\n return 'number';\n }\n\n if (type === Object || type === Array || type === 'json') {\n return 'json';\n }\n\n return 'string';\n};\n\nconst typeParsers: Record<'boolean' | 'number' | 'json' | 'string', Parser<unknown, RenderHost>> = {\n boolean(value: string | null): boolean {\n return value !== null;\n },\n number(value: string | null): number | null {\n if (value === null || value === '') {\n return null;\n }\n\n const parsed = Number(value);\n return Number.isNaN(parsed) ? null : parsed;\n },\n json(value: string | null): unknown {\n if (!value) {\n return null;\n }\n\n try {\n return JSON.parse(value);\n } catch (error) {\n console.warn('[Prop] failed to parse JSON attribute', error);\n return null;\n }\n },\n string(value: string | null): string | null {\n return value;\n }\n};\n\nconst typeFormatters: Record<'boolean' | 'number' | 'json' | 'string', Formatter<unknown, RenderHost>> = {\n boolean(value: unknown): string | null {\n return value ? '' : null;\n },\n number(value: unknown): string | null {\n if (value === null || value === undefined || value === '') {\n return null;\n }\n return String(value);\n },\n json(value: unknown): string | null {\n if (value === null || value === undefined) {\n return null;\n }\n try {\n return JSON.stringify(value);\n } catch {\n return null;\n }\n },\n string(value: unknown): string | null {\n if (value === null || value === undefined) {\n return null;\n }\n return String(value);\n }\n};\n\nconst defaultCompare = <TValue>(previous: TValue, next: TValue): boolean => previous === next;\n\nexport function Prop<TValue, THost extends RenderHost = RenderHost>(options: PropOptions<TValue, THost> = {}) {\n const {\n attribute,\n reflect = true,\n type,\n parse,\n format,\n defaultValue,\n compare = defaultCompare,\n onChange,\n onAttributeChange\n } = options;\n\n const resolvedType = resolveType(type);\n\n const parseValue: Parser<TValue, THost> = parse\n ? parse\n : function (this: THost, value) {\n if (!resolvedType) {\n return value as unknown as TValue;\n }\n return typeParsers[resolvedType].call(this, value) as TValue;\n };\n\n const formatValue: Formatter<TValue, THost> = format\n ? format\n : function (this: THost, value) {\n if (!resolvedType) {\n return (value as unknown as string | null | undefined) ?? null;\n }\n return typeFormatters[resolvedType].call(this, value as unknown) as string | null;\n };\n\n return (\n accessor: ClassAccessorDecoratorTarget<THost, TValue>,\n context: ClassAccessorDecoratorContext<THost, TValue>\n ): ClassAccessorDecoratorResult<THost, TValue> => {\n if (context.kind !== 'accessor') {\n throw new Error('@Prop requires the \"accessor\" keyword on the property.');\n }\n\n const attributeName = attribute ?? toKebabCase(context.name);\n\n context.addInitializer(function (this: THost) {\n if (!reflect) {\n return;\n }\n\n observeAttribute(this, attributeName, (rawValue) => {\n if (isInternalMutation(this, attributeName)) {\n return;\n }\n\n const parsed = parseValue.call(this, rawValue);\n const previous = accessor.get.call(this);\n\n if (compare(previous, parsed)) {\n return;\n }\n\n accessor.set.call(this, parsed);\n\n onAttributeChange?.call(this, parsed, previous);\n scheduleRender(this);\n });\n });\n\n return {\n get(this: THost): TValue {\n return accessor.get.call(this);\n },\n set(this: THost, value: TValue): void {\n const previous = accessor.get.call(this);\n\n if (compare(previous, value)) {\n return;\n }\n\n accessor.set.call(this, value);\n\n if (reflect) {\n const formatted = formatValue.call(this, value);\n updateAttribute(this, attributeName, formatted);\n }\n\n onChange?.call(this, value, previous);\n scheduleRender(this);\n },\n init(this: THost, initialValue: TValue): TValue {\n let value = initialValue;\n\n if (this.hasAttribute(attributeName)) {\n value = parseValue.call(this, this.getAttribute(attributeName));\n } else if (value === undefined && defaultValue !== undefined) {\n value =\n typeof defaultValue === 'function' ? (defaultValue as (this: THost) => TValue).call(this) : defaultValue;\n }\n\n if (reflect) {\n const formatted = formatValue.call(this, value);\n updateAttribute(this, attributeName, formatted);\n }\n\n return value;\n }\n };\n };\n}\n","import { html } from 'lit-html';\n\nimport { dispatchControlEvent, setBooleanAttribute } from '../shared';\n\nimport { Component } from '~/decorators/Component';\nimport { Listen } from '~/decorators/Listen';\nimport { Prop } from '~/decorators/Prop';\nimport { Query } from '~/decorators/Query';\n\n@Component({\n tag: 'ease-checkbox',\n styles: `\n .checkbox {\n display: table;\n border-radius: var(--ease-checkbox-radius, 5px);\n position: relative;\n\n svg {\n display: block;\n position: absolute;\n left: 0;\n right: 0;\n bottom: 0;\n top: 0;\n pointer-events: none;\n fill: var(--ease-checkbox-check-color, var(--color-blue-100));\n transform: scale(1.01) translateZ(0);\n\n .tick {\n fill: none;\n stroke-width: 3px;\n stroke-linecap: round;\n stroke-linejoin: round;\n stroke: var(--ease-checkbox-check-color, var(--color-blue-100));\n transform-origin: 10.5px 16px;\n transform: scale(1) translateZ(0);\n }\n\n .dot {\n transform-origin: 10.5px 15.5px;\n transform: scale(1) translateZ(0);\n transform-box: fill-box;\n }\n\n .drop {\n transform-origin: 25px -1px;\n transform: scale(1) translateZ(0);\n opacity: 0;\n }\n }\n }\n\n [part=\"checkbox\"] {\n display: table;\n margin: 0;\n padding: 0;\n appearance: none;\n cursor: pointer;\n background: none;\n border: none;\n outline: none;\n }\n\n [part=\"control\"] {\n appearance: none;\n outline: none;\n border: none;\n background: none;\n display: block;\n cursor: pointer;\n margin: 0;\n padding: 0;\n border-radius: inherit;\n width: var(--ease-checkbox-size, 24px);\n height: var(--ease-checkbox-size, 24px);\n }\n\n [part=\"control\"] {\n box-shadow: inset 0 0 0 var(--ease-checkbox-border-width, 2px) var(--ease-checkbox-border-color, var(--color-gray-700));\n }\n\n .tick {\n stroke-dasharray: 16px 33px;\n stroke-dashoffset: 20.5px;\n }\n\n .dot {\n transform: translate(14px, -14px) scale(1) translateZ(0);\n opacity: 0;\n }\n\n [part=\"control\"]:checked {\n box-shadow: inset 0 0 0 var(--ease-checkbox-checked-fill-size, 12px) var(--ease-checkbox-checked-fill, var(--color-blue-800));\n }\n\n [part=\"control\"]:checked + svg .tick {\n stroke-dasharray: 16.5px 33px;\n stroke-dashoffset: 46.5px;\n }\n\n [part=\"control\"]:checked + svg .dot {\n transform: translate(0px, 0px) scale(1) translateZ(0);\n opacity: 1;\n }\n\n [part=\"checkbox\"] [part=\"control\"].anim-checked {\n animation: checkbox-border-fill 0.2s ease-out forwards, checkbox-morph 0.5s ease-out forwards;\n }\n\n [part=\"checkbox\"] [part=\"control\"].anim-checked + svg {\n .tick {\n animation: checkbox-tick 0.65s ease-out forwards;\n }\n\n .dot {\n animation: checkbox-dot-move 0.6s ease-out forwards;\n }\n }\n\n [part=\"checkbox\"] [part=\"control\"].anim-unchecked {\n animation: checkbox-border-default 0.4s ease-out forwards;\n }\n\n [part=\"checkbox\"] [part=\"control\"].anim-unchecked + svg {\n .tick {\n animation: checkbox-tick-default 0.2s ease-out forwards;\n }\n .dot {\n animation: checkbox-dot-hide 0.2s ease-out forwards;\n }\n }\n \n @keyframes checkbox-border-fill {\n 0% {\n box-shadow: inset 0 0 0 var(--ease-checkbox-border-width, 2px) var(--ease-checkbox-border-color, var(--color-gray-700));\n }\n 100% {\n box-shadow: inset 0 0 0 var(--ease-checkbox-checked-fill-size, 12px) var(--ease-checkbox-checked-fill, var(--color-blue-800));\n }\n }\n\n @keyframes checkbox-morph {\n 0%, 40% {\n border-radius: 5px 14px 5px 5px;\n }\n 100% {\n border-radius: 5px;\n }\n }\n\n @keyframes checkbox-tick {\n 0% {\n stroke-dasharray: 16px 33px;\n stroke-dashoffset: 20.5px;\n }\n 47% {\n stroke-dasharray: 14px 33px;\n stroke-dashoffset: 48px;\n }\n 100% {\n stroke-dasharray: 16.5px 33px;\n stroke-dashoffset: 46.5px;\n }\n }\n\n @keyframes checkbox-dot-move {\n 0%, 40% {\n transform: translate(14px, -14px) scale(1) translateZ(0);\n opacity: 0;\n }\n 100% {\n transform: translate(0px, 0px) scale(1) translateZ(0);\n opacity: 1;\n }\n }\n\n @keyframes checkbox-dot-hide {\n 0% {\n transform: translate(0px, 0px) scale(1) translateZ(0);\n opacity: 1;\n }\n 100% {\n transform: translate(14px, -14px) scale(1) translateZ(0);\n opacity: 0;\n }\n }\n\n @keyframes checkbox-border-default {\n 0%,\n 40% {\n box-shadow: inset 0 0 0 var(--ease-checkbox-checked-fill-size, 12px) var(--ease-checkbox-checked-fill, var(--color-blue-800));\n }\n 100% {\n box-shadow: inset 0 0 0 var(--ease-checkbox-border-width, 2px) var(--ease-checkbox-border-color, var(--color-gray-700));\n }\n }\n\n @keyframes checkbox-tick-default {\n 0% {\n stroke-dasharray: 16.5px 33px;\n stroke-dashoffset: 46.5px;\n }\n 100% {\n stroke-dasharray: 16px 33px;\n stroke-dashoffset: 20.5px;\n }\n }\n `,\n template(this: Checkbox) {\n return html`\n <button\n part=\"checkbox\"\n type=\"button\"\n role=\"checkbox\"\n aria-checked=${this.checked}\n ?disabled=${this.disabled}\n >\n <div class=\"checkbox\">\n <input\n part=\"control\"\n name=${this.name}\n value=${this.value}\n ?checked=${this.checked}\n ?disabled=${this.disabled}\n type=\"checkbox\"\n />\n <svg viewBox=\"0 0 24 24\" filter=\"url(#${this.filterId})\">\n <path class=\"tick\" d=\"M4.5 10L10.5 16L24.5 1\" />\n <circle class=\"dot\" cx=\"10.5\" cy=\"15.5\" r=\"1.5\" />\n <circle class=\"drop\" cx=\"25\" cy=\"-1\" r=\"2\" />\n </svg>\n </div>\n\n <svg style=\"display: none;\">\n <defs>\n <filter id=\"${this.filterId}\">\n <feGaussianBlur\n in=\"SourceGraphic\"\n stdDeviation=\"1.25\"\n result=\"blur\"\n />\n <feColorMatrix\n in=\"blur\"\n mode=\"matrix\"\n values=\"1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 20 -9\"\n result=\"gooey\"\n />\n <feBlend in=\"SourceGraphic\" in2=\"gooey\" />\n </filter>\n </defs>\n </svg>\n </button>\n `;\n }\n})\nexport class Checkbox extends HTMLElement {\n declare requestRender: () => void;\n\n @Prop<boolean>({ type: Boolean, reflect: true })\n accessor checked!: boolean;\n\n @Prop<string | null>({ reflect: true })\n accessor name!: string | null;\n\n @Prop<string | null>({ reflect: true })\n accessor value!: string | null;\n\n @Prop<boolean>({ type: Boolean, reflect: true })\n accessor disabled!: boolean;\n\n @Query<HTMLButtonElement>('button')\n accessor control!: HTMLButtonElement | null;\n\n private _prevChecked?: boolean;\n\n filterId: string = `goo-${crypto.randomUUID()}`;\n\n connectedCallback(): void {\n this._prevChecked = this.checked;\n }\n\n afterRender(): void {\n if (!this.control) {\n return;\n }\n\n const changed = typeof this._prevChecked !== 'undefined' && this.checked !== this._prevChecked;\n\n if (changed) {\n this._triggerAnimation(this.checked);\n this._prevChecked = this.checked;\n }\n\n const control = this.control;\n control.setAttribute('aria-checked', this.checked ? 'true' : 'false');\n control.disabled = Boolean(this.disabled);\n setBooleanAttribute(this, 'disabled', Boolean(this.disabled));\n }\n\n private _triggerAnimation(checked: boolean): void {\n const control = this.shadowRoot?.querySelector('[part=\"control\"]');\n const svg = this.shadowRoot?.querySelector('svg');\n if (!control || !svg) {\n return;\n }\n\n control.classList.remove('anim-checked', 'anim-unchecked');\n svg.classList.remove('anim-checked', 'anim-unchecked');\n\n const animClass = checked ? 'anim-checked' : 'anim-unchecked';\n const duration = checked ? 650 : 400;\n\n control.classList.add(animClass);\n svg.classList.add(animClass);\n\n setTimeout(() => {\n control.classList.remove(animClass);\n svg.classList.remove(animClass);\n }, duration);\n }\n\n @Listen<Checkbox, MouseEvent, HTMLButtonElement>('click', {\n selector: 'button'\n })\n handleClick(event: MouseEvent): void {\n if (this.disabled) {\n event.preventDefault();\n event.stopPropagation();\n\n return;\n }\n\n this.checked = !this.checked;\n\n dispatchControlEvent(this, 'checkbox', { value: this.checked, event });\n }\n}\n","/**\n * Standard control event detail interface for Leva/lil-gui style state aggregation.\n * All control components should dispatch events with this shape.\n */\nexport interface ControlEventDetail<TValue = unknown> {\n /** The control's name/identifier for state aggregation */\n name?: string;\n /** The current value of the control */\n value: TValue;\n /** The original DOM event that triggered this change */\n event: Event;\n}\n\n/** The standard event type for control value changes */\nexport const CONTROL_CHANGE_EVENT = 'control-change';\n\n/**\n * Dispatch a control change event with standard shape.\n * Events bubble and are composed (cross shadow DOM boundaries).\n *\n * @param host - The element dispatching the event\n * @param type - Event type (prefer CONTROL_CHANGE_EVENT for standard controls)\n * @param detail - Event detail with value and optional name\n *\n * @example\n * ```ts\n * dispatchControlEvent(this, CONTROL_CHANGE_EVENT, {\n * name: this.name,\n * value: this.value,\n * event: e\n * });\n * ```\n */\nexport const dispatchControlEvent = <THost extends HTMLElement, TValue>(\n host: THost,\n type: string,\n detail: ControlEventDetail<TValue>\n): void => {\n host.dispatchEvent(\n new CustomEvent<ControlEventDetail<TValue>>(type, {\n detail,\n bubbles: true,\n composed: true\n })\n );\n};\n\nexport const setBooleanAttribute = (element: Element | null | undefined, name: string, value: boolean): void => {\n if (!element) {\n return;\n }\n\n if (value) {\n element.setAttribute(name, '');\n } else {\n element.removeAttribute(name);\n }\n};\n\nexport const coerceNumber = (value: string): number | null => {\n if (value === '') {\n return null;\n }\n\n const parsed = Number(value);\n return Number.isNaN(parsed) ? null : parsed;\n};\n\ntype ControlElement = Element & {\n value?: unknown;\n checked?: unknown;\n};\n\nexport const readControlValue = (element: ControlElement): string | null => {\n if (typeof element.value === 'string' || typeof element.value === 'number') {\n return String(element.value);\n }\n\n if (typeof element.checked === 'boolean') {\n return element.checked ? 'true' : 'false';\n }\n\n if ('getAttribute' in element) {\n const attr = (element as Element).getAttribute('value');\n if (attr !== null) {\n return attr;\n }\n }\n\n return element.textContent?.trim() ?? null;\n};\n","type ListenHost = HTMLElement & {\n renderRoot?: ShadowRoot | DocumentFragment | HTMLElement;\n};\n\ntype LifecycleHookName = 'connectedCallback' | 'disconnectedCallback';\n\ntype LifecycleCallback<THost extends ListenHost> = (this: THost) => void;\n\ntype ListenTargetResolver<THost extends ListenHost> =\n | 'document'\n | 'window'\n | 'shadow'\n | 'root'\n | 'light'\n | EventTarget\n | ((host: THost) => EventTarget | null | undefined);\n\ntype Predicate<TEvent extends Event, TElement extends Element> = (event: TEvent, matched: TElement | null) => boolean;\n\ninterface ListenOptions<THost extends ListenHost, TElement extends Element, TEvent extends Event> {\n selector?: string;\n target?: ListenTargetResolver<THost>;\n prevent?: boolean;\n stop?: boolean;\n stopImmediate?: boolean;\n once?: boolean;\n passive?: boolean;\n capture?: boolean;\n when?: Predicate<TEvent, TElement>;\n}\n\ntype Cleanup = () => void;\n\nconst lifecycleHooks: Record<LifecycleHookName, WeakMap<ListenHost, Set<LifecycleCallback<ListenHost>>>> = {\n connectedCallback: new WeakMap(),\n disconnectedCallback: new WeakMap()\n};\n\nconst cleanupRegistry = new WeakMap<ListenHost, Set<Cleanup>>();\n\nconst addLifecycleHook = <THost extends ListenHost>(\n instance: THost,\n hookName: LifecycleHookName,\n handler: LifecycleCallback<THost>\n): void => {\n const store = lifecycleHooks[hookName] as WeakMap<THost, Set<LifecycleCallback<THost>>>;\n let callbacks = store.get(instance);\n\n if (!callbacks) {\n callbacks = new Set<LifecycleCallback<THost>>();\n store.set(instance, callbacks);\n\n const original = (instance as unknown as Record<LifecycleHookName, unknown>)[hookName];\n\n (instance as unknown as Record<LifecycleHookName, unknown>)[hookName] = function (...args: unknown[]) {\n callbacks?.forEach((callback) => {\n callback.apply(this as THost);\n });\n\n if (typeof original === 'function') {\n return (original as (...params: unknown[]) => unknown).apply(this, args);\n }\n\n return undefined;\n };\n }\n\n callbacks.add(handler);\n};\n\nconst registerCleanup = <THost extends ListenHost>(instance: THost, cleanup: Cleanup): void => {\n let callbacks = cleanupRegistry.get(instance);\n\n if (!callbacks) {\n callbacks = new Set();\n cleanupRegistry.set(instance, callbacks);\n\n addLifecycleHook(instance, 'disconnectedCallback', function (this: THost) {\n const registered = cleanupRegistry.get(this);\n registered?.forEach((fn) => {\n try {\n fn();\n } catch (error) {\n console.error('[Listen] cleanup failed', error);\n }\n });\n cleanupRegistry.delete(this);\n });\n }\n\n callbacks.add(cleanup);\n};\n\nconst resolveTarget = <THost extends ListenHost>(\n host: THost,\n target: ListenTargetResolver<THost> | undefined\n): EventTarget | null => {\n if (typeof target === 'function') {\n return target(host) ?? null;\n }\n\n if (target instanceof EventTarget) {\n return target;\n }\n\n switch (target) {\n case 'document':\n return document;\n case 'window':\n return window;\n case 'light':\n return host;\n default:\n return host.renderRoot ?? host.shadowRoot ?? host;\n }\n};\n\nconst normalizeOptions = <THost extends ListenHost, TElement extends Element, TEvent extends Event>(\n selectorOrOptions: string | ListenOptions<THost, TElement, TEvent> | undefined\n): ListenOptions<THost, TElement, TEvent> => {\n if (typeof selectorOrOptions === 'string') {\n return { selector: selectorOrOptions };\n }\n\n return selectorOrOptions ?? {};\n};\n\nconst buildOptions = <THost extends ListenHost, TElement extends Element, TEvent extends Event>(\n options: ListenOptions<THost, TElement, TEvent>\n) => {\n return {\n selector: options.selector ?? null,\n target: options.target ?? 'shadow',\n prevent: options.prevent ?? false,\n stop: options.stop ?? false,\n stopImmediate: options.stopImmediate ?? false,\n once: options.once ?? false,\n passive: options.passive,\n capture: options.capture ?? false,\n when: options.when ?? null\n };\n};\n\nexport function Listen<THost extends ListenHost, TEvent extends Event = Event, TElement extends Element = Element>(\n eventName: keyof HTMLElementEventMap | string,\n selectorOrOptions?: string | ListenOptions<THost, TElement, TEvent>\n) {\n if (!eventName) {\n throw new Error('@Listen requires an event name.');\n }\n\n const listenConfig = buildOptions(normalizeOptions(selectorOrOptions));\n\n return (\n originalMethod: (this: THost, event: TEvent, matched?: TElement | null) => unknown,\n context: ClassMethodDecoratorContext<THost, typeof originalMethod>\n ): void => {\n context.addInitializer(function (this: THost) {\n let attached = false;\n\n const attach = () => {\n if (attached) {\n return;\n }\n\n const target = resolveTarget(this, listenConfig.target);\n\n if (!target || typeof (target as EventTarget).addEventListener !== 'function') {\n console.warn(`@Listen unable to resolve target for ${String(eventName)}`);\n return;\n }\n\n const eventOptions: AddEventListenerOptions = {\n capture: listenConfig.capture,\n once: listenConfig.once,\n passive: listenConfig.passive !== undefined ? listenConfig.passive : !listenConfig.prevent\n };\n\n const handler = (event: Event): void => {\n const typedEvent = event as TEvent;\n\n if (listenConfig.prevent) {\n typedEvent.preventDefault();\n }\n\n if (listenConfig.stopImmediate) {\n typedEvent.stopImmediatePropagation();\n } else if (listenConfig.stop) {\n typedEvent.stopPropagation();\n }\n\n let matched: TElement | null = null;\n\n if (listenConfig.selector) {\n const path = typedEvent.composedPath();\n matched =\n path.find(\n (node): node is TElement => node instanceof Element && node.matches(listenConfig.selector as string)\n ) ?? null;\n\n if (!matched) {\n return;\n }\n }\n\n if (listenConfig.when && !listenConfig.when(typedEvent, matched)) {\n return;\n }\n\n if (listenConfig.selector) {\n void originalMethod.call(this, typedEvent, matched);\n } else {\n const targetNode = (\n typedEvent.target instanceof Element ? (typedEvent.target as TElement) : null\n ) as TElement | null;\n void originalMethod.call(this, typedEvent, targetNode);\n }\n };\n\n target.addEventListener(eventName as string, handler, eventOptions);\n attached = true;\n\n registerCleanup(this, () => {\n target.removeEventListener(eventName as string, handler, eventOptions);\n attached = false;\n });\n };\n\n // IMPORTANT:\n // Many components are created inside templates/shadow DOM. At construction time they are often not connected yet,\n // and patching instance lifecycle callbacks is not reliably invoked by the platform.\n // Attach the listener ASAP (microtask) so it works for nested components as well.\n queueMicrotask(attach);\n\n // Best-effort attach on connect too (idempotent).\n addLifecycleHook(this, 'connectedCallback', attach);\n });\n };\n}\n","type QueryRoot = 'shadow' | 'light' | 'document';\n\ntype QueryHost = HTMLElement & {\n renderRoot?: ShadowRoot | DocumentFragment | HTMLElement;\n};\n\ntype QueryFallback<TResult, THost extends QueryHost> = TResult | ((host: THost) => TResult);\n\ninterface BaseQueryOptions<TResult, THost extends QueryHost> {\n from?: QueryRoot;\n fallback?: QueryFallback<TResult, THost>;\n}\n\ninterface QueryAllOptions<TElement extends Element, THost extends QueryHost>\n extends BaseQueryOptions<TElement[], THost> {\n all: true;\n closest?: false;\n}\n\ninterface QueryClosestOptions<THost extends QueryHost> extends BaseQueryOptions<Element | null, THost> {\n closest: true;\n all?: false;\n}\n\ninterface QuerySingleOptions<TElement extends Element, THost extends QueryHost>\n extends BaseQueryOptions<TElement | null, THost> {\n all?: false;\n closest?: false;\n}\n\ntype QueryOptions<TElement extends Element, THost extends QueryHost> =\n | QueryAllOptions<TElement, THost>\n | QueryClosestOptions<THost>\n | QuerySingleOptions<TElement, THost>;\n\ntype QueryReturnType<\n TElement extends Element,\n THost extends QueryHost,\n TOptions extends QueryOptions<TElement, THost>\n> = TOptions extends QueryAllOptions<TElement, THost>\n ? TElement[]\n : TOptions extends QueryClosestOptions<THost>\n ? Element | null\n : TElement | null;\n\ntype QueryDecorator<\n TElement extends Element,\n THost extends QueryHost,\n TOptions extends QueryOptions<TElement, THost>\n> = (\n target: ClassAccessorDecoratorTarget<THost, QueryReturnType<TElement, THost, TOptions>> | undefined,\n context:\n | ClassFieldDecoratorContext<THost, QueryReturnType<TElement, THost, TOptions>>\n | ClassAccessorDecoratorContext<THost, QueryReturnType<TElement, THost, TOptions>>\n) => ClassAccessorDecoratorResult<THost, QueryReturnType<TElement, THost, TOptions>> | undefined;\n\nconst defaultOptions = {\n all: false,\n closest: false,\n from: 'shadow' as QueryRoot | undefined,\n fallback: null\n} as const satisfies QuerySingleOptions<Element, QueryHost>;\n\nconst resolveFallback = <TResult, THost extends QueryHost>(\n fallback: QueryFallback<TResult, THost> | undefined,\n host: THost\n): TResult | undefined => {\n if (typeof fallback === 'function') {\n return (fallback as (instance: THost) => TResult)(host);\n }\n\n return fallback;\n};\n\nconst resolveRoot = (host: QueryHost, option: QueryRoot | undefined): ParentNode | null => {\n switch (option) {\n case 'document':\n return document;\n case 'light':\n return host;\n default:\n return host.renderRoot ?? host.shadowRoot ?? host;\n }\n};\n\nconst resolveQuery = <\n TElement extends Element,\n THost extends QueryHost,\n TOptions extends QueryOptions<TElement, THost>\n>(\n host: THost,\n selector: string,\n options: TOptions\n) => {\n if (options.closest) {\n const result = host.closest(selector);\n return result ?? resolveFallback(options.fallback as QueryFallback<Element | null, THost>, host) ?? null;\n }\n\n const root = resolveRoot(host, options.from);\n\n if (!root) {\n return options.all\n ? (resolveFallback(options.fallback as QueryFallback<TElement[], THost>, host) ?? [])\n : (resolveFallback(options.fallback as QueryFallback<TElement | null, THost>, host) ?? null);\n }\n\n if (options.all) {\n const elements = Array.from(root.querySelectorAll<TElement>(selector));\n return elements.length > 0\n ? elements\n : (resolveFallback(options.fallback as QueryFallback<TElement[], THost>, host) ?? []);\n }\n\n const match = root.querySelector<TElement>(selector);\n return match ?? resolveFallback(options.fallback as QueryFallback<TElement | null, THost>, host) ?? null;\n};\n\nconst createQueryDecorator = <\n TElement extends Element,\n THost extends QueryHost,\n TOptions extends QueryOptions<TElement, THost>\n>(\n selector: string,\n options: TOptions\n): QueryDecorator<TElement, THost, TOptions> => {\n type Result = QueryReturnType<TElement, THost, TOptions>;\n\n return (\n _target: ClassAccessorDecoratorTarget<THost, Result> | undefined,\n context: ClassFieldDecoratorContext<THost, Result> | ClassAccessorDecoratorContext<THost, Result>\n ): ClassAccessorDecoratorResult<THost, Result> | undefined => {\n if (context.kind === 'accessor') {\n const descriptor: ClassAccessorDecoratorResult<THost, Result> = {\n get(this: THost) {\n return resolveQuery<TElement, THost, TOptions>(this, selector, options) as Result;\n },\n set(_value: Result) {\n // Readonly accessor\n }\n };\n return descriptor;\n }\n\n context.addInitializer(function (this: THost) {\n Object.defineProperty(this, context.name, {\n configurable: true,\n enumerable: true,\n get: () => resolveQuery<TElement, THost, TOptions>(this, selector, options) as Result\n });\n });\n\n return;\n };\n};\n\nexport function Query<\n TElement extends Element,\n THost extends QueryHost,\n TOptions extends QueryOptions<TElement, THost>\n>(selector: string, userOptions: TOptions): QueryDecorator<TElement, THost, TOptions>;\n\nexport function Query<TElement extends Element = Element, THost extends QueryHost = QueryHost>(\n selector: string\n): QueryDecorator<TElement, THost, QuerySingleOptions<TElement, THost>>;\n\nexport function Query<TElement extends Element = Element, THost extends QueryHost = QueryHost>(\n selector: string,\n userOptions?: QueryOptions<TElement, THost>\n) {\n if (!selector) {\n throw new Error('@Query requires a selector.');\n }\n\n if (userOptions) {\n const merged = { ...defaultOptions, ...userOptions } as QueryOptions<TElement, THost>;\n return createQueryDecorator<TElement, THost, typeof merged>(selector, merged);\n }\n\n const merged = defaultOptions as QuerySingleOptions<TElement, THost>;\n return createQueryDecorator<TElement, THost, typeof merged>(selector, merged);\n}\n","import type { Placement } from '~/elements/popover';\n\nimport { html, type TemplateResult } from 'lit-html';\n\nimport { dispatchControlEvent, setBooleanAttribute } from '../shared';\n\nimport { Component } from '~/decorators/Component';\nimport { Prop } from '~/decorators/Prop';\nimport { Query } from '~/decorators/Query';\nimport '../dropdown';\nimport '../input';\nimport './picker';\n\nimport { isValidHex } from './utils';\n\nimport { styleMap } from '~/utils/template-helpers';\n\n@Component({\n tag: 'ease-color-input',\n styles: `\n :host {\n display: block;\n position: relative;\n }\n\n ease-dropdown {\n --ease-dropdown-panel-min-width: auto;\n --ease-dropdown-panel-width: max-content;\n --ease-dropdown-panel-max-width: max-content;\n }\n\n :host(:not([custom-trigger])) ease-input {\n --ease-input-padding: 0 4px 0 4px;\n display: block;\n width: 76px;\n cursor: pointer;\n font-family: var(--ease-font-mono, 'Geist Mono', monospace);\n\n &::part(control) {\n margin-left: -12px;\n cursor: pointer;\n }\n }\n\n ease-dropdown::part(trigger):disabled {\n cursor: default;\n opacity: 0.75;\n }\n\n :host(:not([custom-trigger])) [slot=\"prefix\"] {\n display: block;\n width: 14px;\n height: 14px;\n margin-left: -4px;\n border-radius: 4px;\n box-shadow: inset 0 0 0 1px var(--color-white-10);\n }\n\n [part=\"value-text\"] {\n font-family: var(--ease-font-mono, 'Geist Mono', monospace);\n }\n\n ease-dropdown::part(content) {\n padding: var(--ease-color-input-dropdown-padding, 12px 12px 8px 12px);\n overflow: visible;\n }\n\n ::slotted([slot=\"trigger\"]) {\n cursor: pointer;\n }\n `\n})\nexport class ColorInput extends HTMLElement {\n declare requestRender: () => void;\n\n #hasCustomTrigger = false;\n\n @Query('ease-dropdown') accessor dropdown!: (HTMLElement & { open: boolean }) | null;\n\n @Prop<string, ColorInput>({\n reflect: true,\n defaultValue: '#FF0000',\n onChange(next) {\n if (next && isValidHex(next)) {\n const normalized = next.toUpperCase();\n if (this.value !== normalized) {\n this.value = normalized;\n }\n } else if (!next) {\n this.value = '#000000';\n }\n }\n })\n accessor value!: string;\n\n @Prop<boolean>({ type: Boolean, reflect: true })\n accessor disabled = false;\n\n @Prop<Placement>({ reflect: true, defaultValue: 'bottom-start' })\n accessor placement: Placement = 'bottom-start';\n\n connectedCallback(): void {\n this.#hasCustomTrigger = this.querySelector('[slot=\"trigger\"]') !== null;\n setBooleanAttribute(this, 'custom-trigger', this.#hasCustomTrigger);\n }\n\n afterRender(): void {\n setBooleanAttribute(this, 'disabled', Boolean(this.disabled));\n }\n\n #renderDefaultTrigger(): TemplateResult {\n const swatchStyle = {\n backgroundColor: this.value\n } as const;\n\n return html`\n <div slot=\"trigger\" part=\"trigger-content\">\n <ease-input part=\"input\" type=\"text\" .value=${this.value} @change=${this.#handleInputChange} headless>\n <div slot=\"prefix\" style=${styleMap(swatchStyle)}></div>\n </ease-input>\n </div>\n `;\n }\n\n render(): TemplateResult {\n return html`\n <ease-dropdown .disabled=${this.disabled} .placement=${this.placement}>\n ${this.#hasCustomTrigger ? html`<slot name=\"trigger\" slot=\"trigger\"></slot>` : this.#renderDefaultTrigger()}\n <ease-color-picker slot=\"content\"\n data-select-ignore\n .value=${this.value}\n @input=${this.#handlePickerInput}\n @change=${this.#handlePickerChange}\n @cancel=${this.#handlePickerCancel}\n @apply=${this.#handlePickerApply}\n ></ease-color-picker>\n </ease-dropdown>\n `;\n }\n\n #handleInputChange = (event: Event): void => {\n this.value = (event.target as HTMLInputElement).value;\n dispatchControlEvent(this, 'input', { value: this.value, event });\n };\n\n #handlePickerInput = (event: CustomEvent<{ value: string }>): void => {\n this.value = event.detail.value;\n dispatchControlEvent(this, 'input', { value: this.value, event });\n };\n\n #handlePickerChange = (event: CustomEvent<{ value: string }>): void => {\n this.value = event.detail.value;\n dispatchControlEvent(this, 'change', { value: this.value, event });\n };\n\n #handlePickerCancel = (event: CustomEvent<{ value: string }>): void => {\n this.value = event.detail.value;\n this.requestRender();\n if (this.dropdown) {\n this.dropdown.open = false;\n }\n };\n\n #handlePickerApply = (event: CustomEvent<{ value: string }>): void => {\n this.value = event.detail.value;\n dispatchControlEvent(this, 'change', { value: this.value, event });\n if (this.dropdown) {\n this.dropdown.open = false;\n }\n };\n}\n","import { html, type TemplateResult } from 'lit-html';\n\nimport { Component } from '~/decorators/Component';\nimport { Prop } from '~/decorators/Prop';\n\nexport type Placement =\n | 'top-start'\n | 'top-center'\n | 'top-end'\n | 'bottom-start'\n | 'bottom-center'\n | 'bottom-end'\n | 'left-start'\n | 'left-center'\n | 'left-end'\n | 'right-start'\n | 'right-center'\n | 'right-end';\n\nconst nextAnchorName = (): string => `--ease-popover-anchor-${crypto.randomUUID()}`;\n\n@Component({\n tag: 'ease-popover',\n autoSlot: false,\n shadowMode: 'open',\n styles: `\n :host {\n display: contents;\n --ease-popover-offset: 8px;\n --ease-popover-anchor-name: --ease-popover-anchor;\n --ease-popover-transform-origin: center center;\n --ease-popover-duration: 200ms;\n --ease-popover-content-min-width: auto;\n --ease-popover-content-max-width: none;\n --ease-popover-content-width: max-content;\n }\n\n ::slotted([slot=\"trigger\"]) {\n anchor-name: var(--ease-popover-anchor-name);\n }\n\n [part=\"content\"] {\n position-anchor: var(--ease-popover-anchor-name);\n position: fixed;\n margin: 0;\n transform-origin: var(--ease-popover-transform-origin);\n width: var(--ease-popover-content-width);\n min-width: var(--ease-popover-content-min-width);\n max-width: var(--ease-popover-content-max-width);\n box-sizing: border-box;\n overscroll-behavior: contain;\n z-index: 100;\n display: none;\n }\n\n :host([open]) [part=\"content\"] {\n display: block;\n }\n\n :host([placement=\"top-start\"]) [part=\"content\"] {\n position-area: top right;\n top: anchor(bottom);\n left: anchor(left);\n translate: 0 calc(var(--ease-popover-offset) * -1);\n }\n\n :host([placement=\"top-center\"]) [part=\"content\"] {\n position-area: top center;\n top: anchor(top);\n left: anchor(center);\n translate: 0 calc(var(--ease-popover-offset) * -1);\n }\n\n :host([placement=\"top-end\"]) [part=\"content\"] {\n position-area: top right;\n top: anchor(bottom);\n right: anchor(right);\n translate: 0 calc(var(--ease-popover-offset) * -1);\n }\n\n :host([placement=\"bottom-start\"]) [part=\"content\"] {\n position-area: bottom right;\n top: anchor(bottom);\n left: anchor(left);\n translate: 0 var(--ease-popover-offset);\n }\n\n :host([placement=\"bottom-center\"]) [part=\"content\"] {\n position-area: bottom center;\n top: anchor(bottom);\n left: anchor(left);\n translate: 0 var(--ease-popover-offset);\n }\n\n :host([placement=\"bottom-end\"]) [part=\"content\"] {\n position-area: bottom left;\n top: anchor(bottom);\n right: anchor(right);\n translate: 0 var(--ease-popover-offset);\n }\n\n :host([placement=\"left-start\"]) [part=\"content\"] {\n position-area: left bottom;\n top: anchor(top);\n left: anchor(left);\n translate: calc(var(--ease-popover-offset) * -1) 0;\n }\n\n :host([placement=\"left-center\"]) [part=\"content\"] {\n position-area: left center;\n top: anchor(top);\n left: anchor(left);\n translate: calc(var(--ease-popover-offset) * -1) 0;\n }\n\n :host([placement=\"left-end\"]) [part=\"content\"] {\n position-area: left top;\n top: anchor(top);\n left: anchor(left);\n translate: calc(var(--ease-popover-offset) * -1) 0;\n }\n\n :host([placement=\"right-start\"]) [part=\"content\"] {\n position-area: right end;\n top: anchor(top);\n left: anchor(right);\n translate: var(--ease-popover-offset) 0;\n }\n\n :host([placement=\"right-center\"]) [part=\"content\"] {\n position-area: right center;\n top: anchor(top);\n left: anchor(right);\n translate: var(--ease-popover-offset) 0;\n }\n\n :host([placement=\"right-end\"]) [part=\"content\"] {\n position-area: right start;\n top: anchor(top);\n left: anchor(right);\n translate: var(--ease-popover-offset) 0;\n }\n `\n})\nexport class Popover extends HTMLElement {\n #anchorName = nextAnchorName();\n #contentElement: HTMLElement | null = null;\n #initialized = false;\n\n declare requestRender: () => void;\n\n public get contentElement(): HTMLElement | null {\n return this.#contentElement;\n }\n\n @Prop<Placement>({\n reflect: true,\n defaultValue: 'bottom-start',\n onChange() {\n (this as Popover).handlePlacementChange();\n }\n })\n accessor placement!: Placement;\n\n @Prop<number>({\n type: Number,\n reflect: true,\n defaultValue: 8,\n onChange() {\n (this as Popover).handleOffsetChange();\n }\n })\n accessor offset = 8;\n\n @Prop<boolean>({ type: Boolean, reflect: true })\n accessor open = false;\n\n connectedCallback(): void {\n this.#syncAnchorName();\n this.#syncOffset();\n }\n\n disconnectedCallback(): void {\n this.#contentElement = null;\n this.#initialized = false;\n }\n\n render(): TemplateResult {\n return html`\n <slot slot=\"trigger\" name=\"trigger\"></slot>\n <div\n part=\"content\"\n data-popover-content\n role=\"region\"\n data-placement=${this.placement}\n >\n <slot></slot>\n </div>\n `;\n }\n\n handlePlacementChange(): void {\n if (!this.#initialized) {\n this.requestRender();\n return;\n }\n this.#syncPlacement();\n }\n\n handleOffsetChange(): void {\n if (!this.#initialized) {\n this.requestRender();\n return;\n }\n this.#syncOffset();\n }\n\n #syncPlacement(): void {\n this.dataset.placement = this.placement;\n\n if (this.#contentElement) {\n this.#contentElement.dataset.placement = this.placement;\n }\n }\n\n #syncOffset(): void {\n const offset = Number.isFinite(this.offset) ? this.offset : 0;\n this.style.setProperty('--ease-popover-offset', `${offset}px`);\n }\n\n #syncAnchorName(): void {\n this.style.setProperty('--ease-popover-anchor-name', this.#anchorName);\n }\n}\n\nexport default {\n Popover\n};\n","import { html, type TemplateResult } from 'lit-html';\n\nimport { Component } from '~/decorators/Component';\nimport { Prop } from '~/decorators/Prop';\n\ntype ChevronState = 'down' | 'up';\ntype ChevronPath = Record<ChevronState, string>;\n\n@Component({\n tag: 'ease-icon-chevron',\n styles: `\n :host {\n display: contents;\n }\n\n [part=\"chevron\"] {\n display: block;\n width: var(--ease-icon-size, 16px);\n height: var(--ease-icon-size, 16px);\n fill: none;\n stroke: currentColor;\n stroke-width: 1.5;\n stroke-linecap: round;\n stroke-linejoin: round;\n }\n `,\n observedAttributes: ['state']\n})\nexport class IconChevron extends HTMLElement {\n declare requestRender: () => void;\n\n accessor paths: ChevronPath = {\n down: 'M5 7L8 10L11 7',\n up: 'M5 9L8 6L11 9'\n };\n\n @Prop<ChevronState>({\n reflect: true,\n attribute: 'state',\n defaultValue: 'down',\n onAttributeChange(next: ChevronState, previous: ChevronState) {\n this.shadowRoot\n ?.querySelector<SVGPathElement>('path')\n ?.animate(\n [\n { d: `path('${(this as IconChevron).paths[previous]}')` },\n { d: `path('${(this as IconChevron).paths[next]}')` }\n ],\n {\n duration: 200,\n easing: 'cubic-bezier(0.25, 0, 0.5, 1)'\n }\n );\n }\n })\n accessor state!: ChevronState;\n\n render(): TemplateResult {\n return html`\n <svg part=\"chevron\" viewBox=\"0 0 16 16\" state=${this.state} xmlns=\"http://www.w3.org/2000/svg \">\n <path d=${this.paths[this.state]} />\n </svg>\n `;\n }\n}\n","import type { Placement } from '~/elements/popover';\nimport '../popover';\nimport '../icons/animation/chevron';\n\nimport { html, type TemplateResult } from 'lit-html';\n\nimport { dispatchControlEvent, setBooleanAttribute } from '../shared';\n\nimport { Component } from '~/decorators/Component';\nimport { OutsideClick, requestOutsideClickUpdate } from '~/decorators/OutsideClick';\nimport { Prop } from '~/decorators/Prop';\nimport { Query } from '~/decorators/Query';\n\ninterface OptionRecord {\n element: HTMLElement;\n value: string;\n label: string;\n id: string;\n handlers: {\n click: (event: Event) => void;\n keydown: (event: KeyboardEvent) => void;\n };\n}\n\nconst nextOptionId = (() => {\n let counter = 0;\n return () => {\n counter += 1;\n return `ease-dropdown-option-${counter}`;\n };\n})();\n\nconst nextPanelId = (() => {\n let counter = 0;\n return () => {\n counter += 1;\n return `ease-dropdown-content-${counter}`;\n };\n})();\n\n@Component({\n tag: 'ease-dropdown',\n styles: `\n :host {\n display: grid;\n width: 100%;\n }\n\n ease-popover {\n --ease-popover-content-min-width: var(--ease-dropdown-panel-min-width, anchor-size(width));\n --ease-popover-content-width: var(--ease-dropdown-panel-width, max-content);\n --ease-popover-content-max-width: var(--ease-dropdown-panel-max-width, none);\n }\n\n [part=\"trigger\"] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n gap: 8px;\n padding: var(--ease-dropdown-trigger-padding, 8px 8px 8px 12px);\n border-radius: var(--ease-dropdown-radius, var(--radii-md));\n background-color: var(--ease-dropdown-background, var(--color-gray-850));\n cursor: pointer;\n box-shadow: var(\n --ease-dropdown-shadow,\n inset 0 1px 0.25px 0 var(--color-white-4),\n 0 1px 2.5px 0 var(--color-black-8)\n );\n font-family: var(--ease-font-family, inherit);\n font-optical-sizing: auto;\n box-sizing: border-box;\n font-size: var(--ease-dropdown-font-size, var(--ease-font-size, 13px));\n font-weight: var(--ease-dropdown-font-weight, 500);\n color: var(--ease-dropdown-color, var(--color-foreground));\n min-width: 0;\n border: none;\n outline: none;\n margin: 0;\n line-height: var(--ease-dropdown-line-height, 14px);\n transition: color 0.2s, background-color 0.2s;\n text-align: left;\n\n &:hover,\n &:focus-within {\n background-color: var(--ease-dropdown-background-hover, var(--color-gray-825));\n }\n\n [part=\"trigger-icon\"] {\n display: block;\n margin: -1px 0 -1px -2px;\n }\n\n &[data-pill=\"true\"] {\n border-radius: 999px;\n }\n\n &[data-block=\"small\"] {\n padding: 4px 8px 4px 4px;\n }\n\n &[data-headless=\"true\"] {\n background: transparent;\n box-shadow: none;\n padding: 0;\n border-radius: 0;\n gap: 4px;\n\n &:hover,\n &:focus-within {\n background: transparent;\n }\n }\n }\n\n input[part=\"trigger-input\"] {\n background: transparent;\n border: none;\n outline: none;\n color: inherit;\n font: inherit;\n width: fit-content;\n min-width: 0;\n padding: 0;\n margin: 0;\n cursor: pointer;\n field-sizing: var(--ease-dropdown-field-sizing, fixed);\n }\n \n :host([open]) input[part=\"trigger-input\"] {\n cursor: text;\n }\n\n [part=\"trigger\"][data-placeholder=\"true\"],\n [part=\"trigger\"] [part=\"trigger-label\"][data-placeholder=\"true\"],\n input[part=\"trigger-input\"]::placeholder {\n color: var(--ease-dropdown-placeholder-color, var(--color-gray-600));\n }\n\n [part=\"trigger\"] [part=\"trigger-label\"] {\n flex-grow: 1;\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n }\n\n [part=\"content\"] {\n border-radius: var(--ease-dropdown-panel-radius, var(--ease-dropdown-radius, var(--radii-md)));\n background: var(--ease-dropdown-panel-background, var(--color-gray-875));\n border: none;\n outline: none;\n box-shadow: var(\n --ease-dropdown-panel-shadow,\n 0 5px 20px 0 var(--color-black-15),\n 0 1px 4px 0 var(--color-black-15),\n 0 0 0 1px var(--color-white-4) inset,\n 0 1px 0 0 var(--color-white-4) inset\n );\n background-clip: padding-box;\n border: 1px solid var(--ease-dropdown-panel-border-color, var(--color-gray-825));\n box-sizing: border-box;\n padding: var(--ease-dropdown-panel-padding, 4px);\n }\n \n [part=\"content\"] ::slotted(hr) {\n margin: 4px 0;\n height: 1px;\n background-color: var(--color-white-4);\n border: none;\n\n &:first-child,\n &:last-child {\n display: none;\n }\n }\n\n [part=\"content\"] ::slotted(h4) {\n margin: 4px 0 8px 0 !important;\n font-size: var(--ease-dropdown-group-label-font-size, 11px);\n line-height: 1;\n padding: var(--ease-dropdown-group-label-padding, 0 8px);\n font-family: var(--ease-font-family, inherit);\n font-weight: 450;\n color: var(--ease-dropdown-group-label-color, var(--color-gray-700));\n display: block;\n\n &:first-child,\n &:last-child {\n display: none;\n }\n }\n\n [part=\"section\"] {\n flex-grow: 1;\n min-width: max(100%, var(--ease-dropdown-min-width, 140px));\n display: grid;\n grid-gap: 3px;\n max-height: var(--ease-dropdown-max-height, auto);\n overflow-y: auto;\n overscroll-behavior: contain;\n container-type: inline-size;\n container-name: scroll-area;\n mask: linear-gradient(to bottom,\n #0000,\n #ffff var(--top-fade) calc(100% - var(--bottom-fade)),\n #0000\n );\n animation: scroll;\n animation-timeline: --scroll;\n scroll-timeline: --scroll y;\n scroll-snap-type: y mandatory;\n scrollbar-width: none;\n -ms-overflow-style: none;\n box-sizing: border-box;\n }\n\n [part=\"section\"]::-webkit-scrollbar {\n width: 0;\n height: 0;\n display: none;\n }\n\n @property --top-fade {\n syntax: '<length>';\n inherits: false;\n initial-value: 0;\n }\n\n @property --bottom-fade {\n syntax: '<length>';\n inherits: false;\n initial-value: 0;\n }\n\n @keyframes scroll {\n 0% {\n --bottom-fade: 16px;\n --top-fade: 0;\n }\n 10%,\n 100% {\n --top-fade: 16px;\n }\n 90% {\n --bottom-fade: 16px;\n }\n 100% {\n --bottom-fade: 0;\n }\n }\n\n ::slotted(button[slot=\"content\"]) {\n appearance: none;\n font-family: var(--ease-font-family, inherit);\n font-optical-sizing: auto;\n font-size: var(--ease-dropdown-option-font-size, var(--ease-font-size-sm, 12px));\n font-weight: var(--ease-dropdown-option-font-weight, 400);\n color: var(--ease-dropdown-option-color, var(--color-blue-100));\n min-width: 0;\n padding: var(--ease-dropdown-option-padding, 7px 8px);\n display: block;\n border-radius: var(--ease-dropdown-option-radius, 5px);\n background-color: var(--ease-dropdown-option-background, var(--color-gray-875));\n border: none;\n outline: none;\n margin: 0;\n line-height: var(--ease-dropdown-option-line-height, 14px);\n transition: color 0.2s, background-color 0.2s;\n cursor: pointer;\n width: 100%;\n text-align: left;\n }\n\n ::slotted(button[slot=\"content\"]:hover),\n ::slotted(button[slot=\"content\"]:focus-visible),\n ::slotted(button[slot=\"content\"][data-active=\"true\"]),\n ::slotted(button[slot=\"content\"][aria-selected=\"true\"]) {\n background-color: var(--ease-dropdown-option-background-active, var(--color-gray-825));\n color: var(--ease-dropdown-option-color-active, var(--color-white));\n }\n `\n})\nexport class Dropdown extends HTMLElement {\n declare requestRender: () => void;\n\n @Prop<boolean>({\n type: Boolean,\n reflect: true,\n onChange(next, previous) {\n (this as Dropdown).handleOpenChange(next, previous);\n }\n })\n accessor open = false;\n\n @Prop<boolean>({ type: Boolean, reflect: true })\n accessor disabled = false;\n\n @Prop<boolean>({ type: Boolean, reflect: true })\n accessor pill = false;\n\n @Prop<boolean>({ type: Boolean, reflect: true })\n accessor headless = false;\n\n @Prop<boolean>({ type: Boolean, reflect: true })\n accessor searchable = false;\n\n @Prop<'small' | 'medium' | 'large'>({\n type: String,\n reflect: true,\n defaultValue: 'medium',\n onAttributeChange() {\n this.requestRender?.();\n }\n })\n accessor block: 'small' | 'medium' | 'large' = 'medium';\n\n @Prop<string>({\n reflect: true,\n defaultValue: 'auto',\n onChange(next) {\n (this as Dropdown).style.setProperty('--ease-dropdown-max-height', next ?? 'auto');\n }\n })\n accessor maxHeight: string = 'auto';\n\n @Prop<string | null>({ reflect: true, defaultValue: null })\n accessor name: string | null = null;\n\n @Prop<string | null>({ reflect: true, defaultValue: null })\n accessor value: string | null = null;\n\n @Prop<string | null>({\n reflect: true,\n attribute: 'placeholder',\n defaultValue: 'Select an option'\n })\n accessor placeholder: string | null = 'Select an option';\n\n @Prop<Placement>({ reflect: true, defaultValue: 'bottom-start' })\n accessor placement: Placement = 'bottom-start';\n\n @Query<HTMLElement>('[part=\"trigger\"]')\n accessor trigger!: HTMLElement | null;\n\n @Query<HTMLInputElement>('input[part=\"trigger-input\"]')\n accessor searchInput!: HTMLInputElement | null;\n\n @Query<HTMLElement>('[part=\"content\"]')\n accessor panelContent!: HTMLElement | null;\n\n @Query<HTMLSlotElement>('slot[name=\"content\"]')\n accessor contentSlot!: HTMLSlotElement | null;\n\n #options: OptionRecord[] = [];\n #selectedLabel: string | null = null;\n #currentSlot: HTMLSlotElement | null = null;\n #pendingFocus: 'first' | 'last' | null = null;\n #optionsInitialized = false;\n #lastToggleOrigin: Event | null = null;\n #handleSlotChange = (): void => {\n this.#syncOptions();\n };\n\n connectedCallback(): void {\n this.#ensureSlotListener();\n }\n\n disconnectedCallback(): void {\n this.#removeSlotListener();\n this.#teardownOptions();\n this.#lastToggleOrigin = null;\n }\n\n afterRender(): void {\n const trigger = this.trigger;\n const ariaLabel = this.getAttribute('aria-label');\n\n if (trigger) {\n if (trigger instanceof HTMLButtonElement) {\n trigger.disabled = Boolean(this.disabled);\n }\n trigger.setAttribute('aria-expanded', this.open && !this.disabled ? 'true' : 'false');\n trigger.setAttribute('aria-haspopup', 'listbox');\n\n if (trigger instanceof HTMLButtonElement) {\n if (ariaLabel && ariaLabel.trim().length > 0) {\n trigger.setAttribute('aria-label', ariaLabel.trim());\n } else {\n trigger.removeAttribute('aria-label');\n }\n }\n }\n\n if (this.searchInput) {\n this.searchInput.disabled = Boolean(this.disabled);\n\n if (ariaLabel && ariaLabel.trim().length > 0) {\n this.searchInput.setAttribute('aria-label', ariaLabel.trim());\n } else {\n this.searchInput.removeAttribute('aria-label');\n }\n }\n\n const panel = this.panelContent;\n const isInteractive = this.open && !this.disabled;\n\n if (panel) {\n if (!panel.id) {\n panel.id = nextPanelId();\n }\n panel.tabIndex = -1;\n panel.setAttribute('role', 'listbox');\n panel.setAttribute('aria-hidden', isInteractive ? 'false' : 'true');\n\n if (trigger) {\n trigger.setAttribute('aria-controls', panel.id);\n }\n } else if (trigger) {\n trigger.removeAttribute('aria-controls');\n }\n\n setBooleanAttribute(this, 'disabled', Boolean(this.disabled));\n\n this.#ensureSlotListener();\n\n if (!this.#optionsInitialized) {\n queueMicrotask(() => {\n this.#syncOptions();\n });\n } else {\n this.#updateOptionSelectionState();\n }\n\n if (this.disabled && this.open) {\n this.#lastToggleOrigin = null;\n this.open = false;\n }\n }\n\n render(): TemplateResult {\n const placeholderActive = this.#isPlaceholderActive();\n\n return html`\n <ease-popover\n .placement=${this.placement}\n .open=${this.open && !this.disabled}\n >\n ${this.searchable ? this.#renderSearchTrigger(placeholderActive) : this.#renderButtonTrigger(placeholderActive)}\n <div\n part=\"content\"\n role=\"listbox\"\n tabindex=\"-1\"\n data-open=${this.open && !this.disabled ? 'true' : 'false'}\n ?hidden=${!this.open || this.disabled}\n @keydown=${this.#handlePanelKeydown}\n >\n <div part=\"section\">\n <slot name=\"content\"></slot>\n </div>\n </div>\n </ease-popover>\n `;\n }\n\n #renderButtonTrigger(placeholderActive: boolean) {\n return html`\n <button\n part=\"trigger\"\n slot=\"trigger\"\n type=\"button\"\n data-placeholder=${placeholderActive ? 'true' : 'false'}\n data-headless=${this.headless}\n @keydown=${this.#handleTriggerKeydown}\n @click=${this.#handleTriggerClick}\n data-pill=${this.pill}\n >\n <slot name=\"trigger\">\n <span part=\"trigger-label\" data-placeholder=${placeholderActive ? 'true' : 'false'}>\n ${this.#getTriggerLabel()}\n </span>\n\n <ease-icon-chevron part=\"trigger-icon\" state=${this.open ? 'up' : 'down'} />\n </slot>\n </button>\n `;\n }\n\n #renderSearchTrigger(placeholderActive: boolean) {\n return html`\n <div\n part=\"trigger\"\n slot=\"trigger\"\n data-placeholder=${placeholderActive ? 'true' : 'false'}\n data-headless=${this.headless}\n @click=${this.#handleSearchTriggerClick}\n data-pill=${this.pill}\n >\n <slot name=\"trigger\">\n <input \n part=\"trigger-input\"\n type=\"text\"\n .value=${this.open ? (this.searchInput?.value ?? '') : this.#getTriggerLabel()}\n placeholder=${this.placeholder ?? ''}\n ?readonly=${!this.open}\n @input=${this.#handleSearchInput}\n @keydown=${this.#handleTriggerKeydown}\n />\n <ease-icon-chevron part=\"trigger-icon\" state=${this.open ? 'up' : 'down'} />\n </slot>\n </div>\n `;\n }\n\n #handleSearchTriggerClick = (event: Event): void => {\n if (this.disabled) {\n return;\n }\n\n if (!this.open) {\n this.toggle(true, event);\n\n if (this.searchInput) {\n this.searchInput.value = '';\n this.#filterOptions('');\n this.searchInput.focus();\n }\n } else {\n if (event.target !== this.searchInput) {\n this.toggle(false, event);\n }\n }\n };\n\n #handleSearchInput = (event: Event): void => {\n const input = event.target as HTMLInputElement;\n this.#filterOptions(input.value);\n\n if (!this.open) {\n this.toggle(true, event);\n }\n };\n\n #filterOptions(query: string): void {\n const lowerQuery = query.toLowerCase();\n this.#options.forEach((option) => {\n const match = option.label.toLowerCase().includes(lowerQuery);\n if (match) {\n option.element.style.display = '';\n } else {\n option.element.style.display = 'none';\n }\n });\n }\n\n toggle(force?: boolean, originEvent?: Event): void {\n if (this.disabled) {\n return;\n }\n\n const current = this.open;\n const next = force ?? !current;\n\n if (current === next) {\n return;\n }\n\n this.#lastToggleOrigin = originEvent ?? null;\n this.open = next;\n\n if (!next) {\n this.#pendingFocus = null;\n // Reset filter when closing\n this.#filterOptions('');\n // Restore label in input if searchable\n if (this.searchable && this.searchInput) {\n this.searchInput.value = this.#getTriggerLabel();\n this.searchInput.blur(); // Blur to look like static text\n }\n }\n }\n\n handleOpenChange(next: boolean, previous: boolean): void {\n if (next === previous) {\n return;\n }\n\n if (!next) {\n this.#pendingFocus = null;\n }\n\n const origin = this.#lastToggleOrigin ?? new Event(next ? 'open' : 'close');\n this.#lastToggleOrigin = null;\n\n if (next) {\n if (this.searchable && this.searchInput) {\n this.searchInput.focus();\n } else {\n queueMicrotask(() => this.#focusActiveOption());\n }\n }\n\n dispatchControlEvent(this, 'toggle', { value: next, event: origin });\n requestOutsideClickUpdate(this);\n }\n\n @OutsideClick<Dropdown>({\n content: (host) => host.panelContent,\n triggers: (host) => [host.trigger, host.panelContent],\n disabled: (host) => host.disabled || !host.open\n })\n handleOutsideDismiss(event: Event): void {\n if (!this.open) {\n return;\n }\n\n this.toggle(false, event);\n }\n\n #handleTriggerKeydown = (event: KeyboardEvent): void => {\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n this.#pendingFocus = 'first';\n this.toggle(true, event);\n break;\n case 'ArrowUp':\n event.preventDefault();\n this.#pendingFocus = 'last';\n this.toggle(true, event);\n break;\n case 'Enter':\n if (!this.searchable) {\n event.preventDefault();\n this.toggle(true, event);\n }\n break;\n case ' ': // Space\n if (!this.searchable) {\n event.preventDefault();\n this.toggle(true, event);\n }\n break;\n case 'Escape':\n if (this.open) {\n event.preventDefault();\n this.toggle(false, event);\n }\n break;\n default:\n break;\n }\n };\n\n #ensureSlotListener(): void {\n const slot = this.contentSlot;\n\n if (slot === this.#currentSlot) {\n return;\n }\n\n if (this.#currentSlot) {\n this.#currentSlot.removeEventListener('slotchange', this.#handleSlotChange);\n }\n\n if (slot) {\n slot.addEventListener('slotchange', this.#handleSlotChange);\n }\n\n this.#currentSlot = slot ?? null;\n }\n\n #removeSlotListener(): void {\n if (!this.#currentSlot) {\n return;\n }\n\n this.#currentSlot.removeEventListener('slotchange', this.#handleSlotChange);\n this.#currentSlot = null;\n }\n\n #handleTriggerClick = (event: Event): void => {\n this.toggle(!this.open, event);\n };\n\n #syncOptions(): void {\n const assigned = this.contentSlot?.assignedElements({ flatten: true }) ?? [];\n const elements = assigned.filter((node): node is HTMLElement => node instanceof HTMLElement);\n\n this.#removeOptionListeners(this.#options);\n\n const options: OptionRecord[] = [];\n\n elements.forEach((element) => {\n if (element.hasAttribute('data-select-ignore') || element.getAttribute('role') === 'separator') {\n return;\n }\n\n const value = this.#resolveOptionValue(element);\n const label = this.#resolveOptionLabel(element, value);\n const id = element.id && element.id.trim().length > 0 ? element.id : nextOptionId();\n\n if (!element.id) {\n element.id = id;\n }\n\n element.setAttribute('role', 'option');\n element.setAttribute('aria-selected', 'false');\n element.dataset.active = 'false';\n element.tabIndex = -1;\n\n const handlers = {\n click: (event: Event) => {\n event.preventDefault();\n event.stopPropagation();\n this.#selectOption(value, label, event);\n },\n keydown: (event: KeyboardEvent) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n this.#selectOption(value, label, event);\n }\n }\n } as OptionRecord['handlers'];\n\n element.addEventListener('click', handlers.click, { passive: false });\n element.addEventListener('keydown', handlers.keydown);\n\n options.push({ element, value, label, id, handlers });\n });\n\n this.#options = options;\n this.#optionsInitialized = options.length > 0;\n\n if (this.value === null && options.length > 0) {\n const preselected = options.find(\n (option) =>\n option.element.hasAttribute('selected') ||\n option.element.dataset.selected === 'true' ||\n option.element.getAttribute('aria-selected') === 'true'\n );\n\n if (preselected) {\n this.value = preselected.value;\n }\n }\n\n this.#updateOptionSelectionState();\n }\n\n #teardownOptions(): void {\n this.#removeOptionListeners(this.#options);\n this.#options = [];\n this.#optionsInitialized = false;\n this.#selectedLabel = null;\n }\n\n #removeOptionListeners(options: OptionRecord[]): void {\n options.forEach((option) => {\n option.element.removeEventListener('click', option.handlers.click);\n option.element.removeEventListener('keydown', option.handlers.keydown);\n option.element.dataset.active = 'false';\n option.element.setAttribute('aria-selected', 'false');\n option.element.tabIndex = -1;\n });\n }\n\n #updateOptionSelectionState(): void {\n if (!this.#optionsInitialized) {\n this.toggleAttribute('data-has-value', false);\n return;\n }\n\n let selectedLabel: string | null = null;\n const previousLabel = this.#selectedLabel;\n\n const options = this.#options;\n\n options.forEach((option) => {\n const isSelected = this.value !== null && option.value === this.value;\n option.element.setAttribute('aria-selected', isSelected ? 'true' : 'false');\n option.element.dataset.active = isSelected ? 'true' : 'false';\n option.element.tabIndex = isSelected ? 0 : -1;\n\n if (isSelected) {\n selectedLabel = option.label;\n }\n });\n\n if (!selectedLabel) {\n const fallback = options[0];\n if (fallback) {\n fallback.element.tabIndex = 0;\n }\n }\n\n this.#selectedLabel = selectedLabel;\n const hasValue = Boolean(this.value && this.#selectedLabel);\n this.toggleAttribute('data-has-value', hasValue);\n\n if (previousLabel !== this.#selectedLabel && typeof this.requestRender === 'function') {\n this.requestRender();\n }\n }\n\n #isPlaceholderActive(): boolean {\n return !this.value || !this.#selectedLabel;\n }\n\n #getTriggerLabel(): string {\n if (this.#selectedLabel) {\n return this.#selectedLabel;\n }\n\n if (typeof this.placeholder === 'string' && this.placeholder.trim().length > 0) {\n return this.placeholder.trim();\n }\n\n return 'Select';\n }\n\n #focusActiveOption(): void {\n if (!this.open) {\n return;\n }\n\n const options = this.#options.filter((o) => o.element.style.display !== 'none');\n\n if (options.length === 0) {\n this.panelContent?.focus();\n return;\n }\n\n let target: OptionRecord | undefined = options[0];\n\n if (this.#pendingFocus === 'first') {\n target = options[0];\n } else if (this.#pendingFocus === 'last') {\n target = options[options.length - 1];\n } else if (this.#pendingFocus === null && this.value !== null) {\n const match = this.#findOptionByValue(this.value);\n if (match && match.element.style.display !== 'none') {\n target = match;\n }\n }\n\n if (target) {\n this.#focusOption(target);\n }\n this.#pendingFocus = null;\n }\n\n #focusOption(option: OptionRecord): void {\n this.#options.forEach((entry) => {\n entry.element.tabIndex = entry === option ? 0 : -1;\n });\n\n option.element.focus({ preventScroll: true });\n }\n\n #focusOptionByIndex(index: number): void {\n const options = this.#options.filter((o) => o.element.style.display !== 'none');\n\n if (options.length === 0) {\n this.panelContent?.focus();\n return;\n }\n\n const normalized = Math.max(0, Math.min(index, options.length - 1));\n const option = options[normalized];\n if (option) {\n this.#focusOption(option);\n }\n }\n\n #findOptionByValue(value: string | null): OptionRecord | undefined {\n if (value === null) {\n return undefined;\n }\n\n return this.#options.find((option) => option.value === value);\n }\n\n #moveFocus(step: number): void {\n const options = this.#options.filter((o) => o.element.style.display !== 'none');\n\n if (options.length === 0) {\n this.panelContent?.focus();\n return;\n }\n\n const activeElement = document.activeElement as HTMLElement | null;\n const currentIndex = options.findIndex((option) => option.element === activeElement);\n\n if (currentIndex === -1) {\n this.#focusOptionByIndex(step > 0 ? 0 : options.length - 1);\n return;\n }\n\n const nextIndex = (currentIndex + step + options.length) % options.length;\n this.#focusOptionByIndex(nextIndex);\n }\n\n #handlePanelKeydown = (event: KeyboardEvent): void => {\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n this.#moveFocus(1);\n break;\n case 'ArrowUp':\n event.preventDefault();\n this.#moveFocus(-1);\n break;\n case 'Home':\n event.preventDefault();\n this.#focusOptionByIndex(0);\n break;\n case 'End':\n event.preventDefault();\n this.#focusOptionByIndex(this.#options.length - 1);\n break;\n case 'Enter':\n case ' ': {\n event.preventDefault();\n this.#activateFocusedOption(event);\n break;\n }\n case 'Escape':\n event.preventDefault();\n this.toggle(false, event);\n this.trigger?.focus();\n break;\n default:\n break;\n }\n };\n\n #activateFocusedOption(event: Event): void {\n const active = this.#options.find((option) => option.element === document.activeElement);\n\n if (active) {\n this.#selectOption(active.value, active.label, event);\n }\n }\n\n #selectOption(value: string, label: string, originEvent: Event): void {\n if (this.disabled) {\n return;\n }\n\n originEvent.preventDefault();\n originEvent.stopPropagation();\n\n const previousValue = this.value;\n this.value = value;\n this.#selectedLabel = label;\n this.#updateOptionSelectionState();\n\n this.toggle(false, originEvent);\n\n if (previousValue !== value) {\n this.#dispatchValueChange(value, label, originEvent);\n }\n\n if (!this.searchable) {\n queueMicrotask(() => this.trigger?.focus());\n }\n }\n\n #resolveOptionValue(element: HTMLElement): string {\n const explicitValue = element.getAttribute('value') ?? element.getAttribute('data-value') ?? element.dataset.value;\n\n if (explicitValue && explicitValue.trim().length > 0) {\n return explicitValue.trim();\n }\n\n const text = element.textContent?.trim();\n\n if (text && text.length > 0) {\n return text;\n }\n\n const fallback = nextOptionId();\n element.dataset.value = fallback;\n return fallback;\n }\n\n #resolveOptionLabel(element: HTMLElement, fallback: string): string {\n const explicitLabel = element.getAttribute('data-label') ?? element.getAttribute('aria-label');\n\n if (explicitLabel && explicitLabel.trim().length > 0) {\n return explicitLabel.trim();\n }\n\n const text = element.textContent?.trim();\n\n if (text && text.length > 0) {\n return text;\n }\n\n return fallback;\n }\n\n #dispatchValueChange(value: string, label: string, event: Event): void {\n dispatchControlEvent(this, 'change', { value, event });\n\n this.dispatchEvent(\n new CustomEvent('value-change', {\n detail: { value, label, event },\n bubbles: true,\n composed: true\n })\n );\n }\n}\n","export interface DismissContext {\n owner: HTMLElement;\n content?: HTMLElement | null;\n triggers?: Array<HTMLElement | null | undefined>;\n}\n\nexport interface DismissControllerOptions {\n onDismiss: (event: Event) => void;\n}\n\nexport class DismissController {\n #onDismiss: (event: Event) => void;\n #context: {\n owner: HTMLElement;\n content: HTMLElement | null;\n triggers: HTMLElement[];\n } | null = null;\n #active = false;\n\n constructor(options: DismissControllerOptions) {\n this.#onDismiss = options.onDismiss;\n }\n\n connect(context: DismissContext): void {\n this.#context = {\n owner: context.owner,\n content: context.content ?? null,\n triggers: (context.triggers ?? []).filter((el): el is HTMLElement => el instanceof HTMLElement)\n };\n\n if (!this.#active) {\n document.addEventListener('pointerdown', this.#handlePointerDown, true);\n document.addEventListener('keydown', this.#handleKeyDown, true);\n this.#active = true;\n }\n }\n\n disconnect(): void {\n if (!this.#active) {\n return;\n }\n\n document.removeEventListener('pointerdown', this.#handlePointerDown, true);\n document.removeEventListener('keydown', this.#handleKeyDown, true);\n this.#active = false;\n this.#context = null;\n }\n\n #handlePointerDown = (event: PointerEvent): void => {\n if (!this.#context) {\n return;\n }\n\n const { owner, content, triggers } = this.#context;\n const path = event.composedPath();\n\n if (path.some((node) => node instanceof Element && node.hasAttribute('data-select-ignore'))) {\n return;\n }\n\n if (path.includes(owner)) {\n return;\n }\n\n if (content && path.includes(content)) {\n return;\n }\n\n if (triggers.some((trigger) => path.includes(trigger))) {\n return;\n }\n\n this.#onDismiss(event);\n };\n\n #handleKeyDown = (event: KeyboardEvent): void => {\n if (event.key !== 'Escape' || !this.#context) {\n return;\n }\n\n event.preventDefault();\n\n const active = document.activeElement as HTMLElement | null;\n\n if (!active) {\n this.#onDismiss(event);\n return;\n }\n\n const { owner, content, triggers } = this.#context;\n const path = event.composedPath();\n\n if (path.includes(owner) || owner.contains(active)) {\n this.#onDismiss(event);\n return;\n }\n\n if (content && (path.includes(content) || content.contains(active))) {\n this.#onDismiss(event);\n return;\n }\n\n if (triggers.some((trigger) => path.includes(trigger) || trigger.contains(active))) {\n this.#onDismiss(event);\n }\n };\n}\n","import type { DismissContext } from './dismiss-controller';\n\nimport { DismissController } from './dismiss-controller';\n\nexport interface OutsideClickResolution {\n owner?: HTMLElement | null | undefined;\n content?: HTMLElement | null | undefined;\n triggers?: Array<HTMLElement | null | undefined>;\n}\n\nexport interface OutsideClickHandle {\n update(): void;\n disconnect(): void;\n}\n\nexport interface OutsideClickHandleOptions<THost extends HTMLElement> {\n resolve: (host: THost) => OutsideClickResolution | null | undefined;\n disabled?: (host: THost) => boolean;\n}\n\nconst registry = new WeakMap<HTMLElement, Set<OutsideClickHandle>>();\n\nconst toDismissContext = <THost extends HTMLElement>(\n host: THost,\n options: OutsideClickHandleOptions<THost>\n): DismissContext | null => {\n if (options.disabled?.(host)) {\n return null;\n }\n\n const resolved = options.resolve(host);\n\n if (!resolved) {\n return null;\n }\n\n const owner = resolved.owner ?? host ?? null;\n\n if (!(owner instanceof HTMLElement)) {\n return null;\n }\n\n const content = resolved.content && resolved.content instanceof HTMLElement ? resolved.content : null;\n\n const triggers = resolved.triggers?.filter((element): element is HTMLElement => element instanceof HTMLElement) ?? [];\n\n return {\n owner,\n content,\n triggers\n };\n};\n\nexport const createOutsideClickHandle = <THost extends HTMLElement>(\n host: THost,\n onDismiss: (this: THost, event: Event) => void,\n options: OutsideClickHandleOptions<THost>\n): OutsideClickHandle => {\n const controller = new DismissController({\n onDismiss(event) {\n if (options.disabled?.(host)) {\n return;\n }\n\n onDismiss.call(host, event);\n }\n });\n\n return {\n update(): void {\n const context = toDismissContext(host, options);\n if (!context) {\n controller.disconnect();\n return;\n }\n\n controller.connect(context);\n },\n disconnect(): void {\n controller.disconnect();\n }\n };\n};\n\nexport const registerOutsideClickHandle = (host: HTMLElement, handle: OutsideClickHandle): void => {\n let handles = registry.get(host);\n\n if (!handles) {\n handles = new Set();\n registry.set(host, handles);\n }\n\n handles.add(handle);\n};\n\nexport const updateOutsideClickHandles = (host: HTMLElement): void => {\n const handles = registry.get(host);\n\n if (!handles) {\n return;\n }\n\n handles.forEach((handle) => {\n handle.update();\n });\n};\n\nexport const disconnectOutsideClickHandles = (host: HTMLElement): void => {\n const handles = registry.get(host);\n\n if (!handles) {\n return;\n }\n\n handles.forEach((handle) => {\n handle.disconnect();\n });\n};\n\nexport const requestOutsideClickUpdate = (host: HTMLElement): void => {\n updateOutsideClickHandles(host);\n};\n","import type { OutsideClickResolution } from '~/utils/outside-click';\n\nimport {\n createOutsideClickHandle,\n disconnectOutsideClickHandles,\n registerOutsideClickHandle,\n updateOutsideClickHandles\n} from '~/utils/outside-click';\n\ntype OutsideClickHost = HTMLElement & {\n connectedCallback?: (...args: unknown[]) => unknown;\n disconnectedCallback?: (...args: unknown[]) => unknown;\n afterRender?: (...args: unknown[]) => unknown;\n};\n\ntype HookName = 'connectedCallback' | 'disconnectedCallback' | 'afterRender';\n\ninterface OutsideClickOptions<THost extends OutsideClickHost> {\n resolve?: (host: THost) => OutsideClickResolution | null | undefined;\n owner?: (host: THost) => HTMLElement | null | undefined;\n content?: (host: THost) => HTMLElement | null | undefined;\n triggers?: (host: THost) => Array<HTMLElement | null | undefined>;\n disabled?: (host: THost) => boolean;\n}\n\nconst lifecycleApplied = new WeakSet<OutsideClickHost>();\n\nconst wrapMethod = (\n host: OutsideClickHost,\n name: HookName,\n hook: (this: OutsideClickHost) => void,\n callHookFirst = false\n): void => {\n const original = host[name];\n\n (host as Required<OutsideClickHost>)[name] = function (...args: unknown[]) {\n if (callHookFirst) {\n hook.call(this);\n }\n\n let result: unknown;\n\n if (typeof original === 'function') {\n result = (original as (...params: unknown[]) => unknown).apply(this, args);\n }\n\n if (!callHookFirst) {\n hook.call(this);\n }\n\n return result;\n };\n};\n\nconst ensureLifecycle = (host: OutsideClickHost): void => {\n if (lifecycleApplied.has(host)) {\n return;\n }\n\n lifecycleApplied.add(host);\n\n wrapMethod(host, 'connectedCallback', function (this: OutsideClickHost) {\n updateOutsideClickHandles(this);\n });\n\n wrapMethod(host, 'afterRender', function (this: OutsideClickHost) {\n updateOutsideClickHandles(this);\n });\n\n wrapMethod(\n host,\n 'disconnectedCallback',\n function (this: OutsideClickHost) {\n disconnectOutsideClickHandles(this);\n },\n true\n );\n};\n\nexport function OutsideClick<THost extends OutsideClickHost, TEvent extends Event = Event>(\n options: OutsideClickOptions<THost> = {}\n) {\n return (\n originalMethod: (this: THost, event: TEvent) => unknown,\n context: ClassMethodDecoratorContext<THost, typeof originalMethod>\n ): void => {\n context.addInitializer(function (this: THost) {\n ensureLifecycle(this);\n\n const resolve =\n options.resolve ??\n ((host: THost): OutsideClickResolution => {\n return {\n owner: options.owner?.(host),\n content: options.content?.(host),\n triggers: options.triggers?.(host)\n };\n });\n\n const handle = createOutsideClickHandle(\n this,\n (event) => {\n originalMethod.call(this, event as TEvent);\n },\n {\n resolve,\n disabled: options.disabled\n }\n );\n\n registerOutsideClickHandle(this, handle);\n\n if (this.isConnected) {\n updateOutsideClickHandles(this);\n }\n });\n };\n}\n\nexport { requestOutsideClickUpdate } from '~/utils/outside-click';\nexport type { OutsideClickOptions };\n","import { html } from 'lit-html';\n\nimport { dispatchControlEvent, setBooleanAttribute } from '../shared';\n\nimport { Component } from '~/decorators/Component';\nimport { Listen } from '~/decorators/Listen';\nimport { Prop } from '~/decorators/Prop';\nimport { Query } from '~/decorators/Query';\n\n@Component({\n tag: 'ease-input',\n shadowMode: 'open',\n autoSlot: true,\n styles: `\n :host {\n display: contents;\n cursor: text;\n }\n\n @keyframes custom-caret {\n 0%,\n 100% {\n caret-color: transparent;\n }\n 33.33%,\n 66.66% {\n caret-color: var(--color-blue-300);\n }\n }\n\n [part=\"container\"] {\n display: grid;\n align-items: center;\n text-align: inherit;\n width: 100%;\n min-width: 0;\n box-sizing: border-box;\n padding: var(--ease-input-padding, 8px);\n border-radius: var(--ease-input-radius, var(--radii-md));\n background-color: var(--ease-input-background, var(--color-gray-875));\n cursor: text;\n animation: custom-caret 1s infinite;\n caret-animation: manual;\n transition: background-color 0.2s;\n box-shadow: var(\n --ease-input-shadow,\n inset 0 1px 0.25px 0 var(--color-white-4),\n 0 1px 2.5px 0 var(--color-black-8)\n );\n\n &:not([data-has-prefix]):not([data-has-suffix]) {\n padding: var(--ease-input-padding, 8px 12px);\n }\n\n &:has(input:disabled) {\n cursor: not-allowed;\n opacity: 0.75;\n }\n\n &:not(:has(input:disabled)) {\n\n &:hover {\n background-color: var(--ease-input-background-hover, var(--color-gray-850));\n }\n\n &:has(input:focus-visible) {\n background-color: var(--ease-input-background-focus, var(--color-gray-825));\n }\n\n }\n\n &[data-has-prefix][data-has-suffix] {\n padding: var(--ease-input-padding, 0);\n grid-template-columns: 30px 1fr 30px;\n }\n\n &[data-has-prefix]:not([data-has-suffix]) {\n padding-right: var(--ease-input-padding, 12px);\n grid-template-columns: 30px 1fr;\n }\n\n &[data-has-suffix]:not([data-has-prefix]) {\n padding-left: var(--ease-input-padding, 12px);\n grid-template-columns: 1fr 30px;\n }\n\n &[data-headless=\"true\"] {\n background-color: transparent;\n box-shadow: none;\n border: none;\n padding: 0;\n margin: 0;\n outline: none;\n border-radius: 0;\n }\n }\n\n ::slotted(button) {\n --ease-icon-size: 12px;\n width: 30px;\n height: 30px;\n appearance: none;\n border: none;\n outline: none;\n background-color: transparent;\n padding: 0;\n margin: 0;\n line-height: 14px;\n transition: color 0.2s;\n cursor: pointer;\n display: grid;\n place-items: center;\n color: var(--color-gray-600);\n transition: color 0.2s;\n\n &:hover,\n &:focus-visible {\n color: var(--color-blue-100);\n }\n\n &.isActive {\n animation: blink .6s forwards;\n }\n\n @keyframes blink {\n 50% {\n background-color: var(--color-white-8);\n }\n }\n }\n\n ::slotted(button[slot=\"prefix\"]) {\n border-radius: var(--radii-md) 0 0 var(--radii-md);\n border-right: 1px solid var(--color-white-4);\n\n &:empty {\n display: none;\n }\n }\n\n ::slotted([slot=\"prefix\"]:not(button)) {\n margin: calc(var(--ease-input-padding, 8px) * -1);\n margin-right: 0;\n margin-left: 0;\n }\n\n ::slotted(button[slot=\"suffix\"]) {\n border-radius: 0 var(--radii-md) var(--radii-md) 0;\n border-left: 1px solid var(--color-white-4);\n\n &:empty {\n display: none;\n }\n }\n\n input {\n font-family: inherit;\n font-optical-sizing: auto;\n font-size: var(--ease-input-font-size, var(--ease-font-size, 13px));\n appearance: none;\n -moz-appearance: textfield;\n font-weight: var(--ease-input-font-weight, 500);\n color: var(--ease-input-color, var(--color-blue-100));\n min-width: 0;\n cursor: inherit;\n text-align: inherit;\n padding: 0;\n background-color: transparent;\n border: none;\n outline: none;\n margin: 0;\n line-height: var(--ease-input-line-height, 14px);\n transition: color 0.2s;\n\n &::placeholder {\n color: var(--ease-input-placeholder-color, var(--color-gray-600));\n opacity: 1;\n }\n\n &::-webkit-outer-spin-button,\n &::-webkit-inner-spin-button {\n -webkit-appearance: none;\n margin: 0;\n }\n }\n `,\n template(this: Input) {\n return html`\n <div part=\"container\" data-headless=${Boolean(this.headless)}>\n <slot name=\"prefix\" part=\"prefix\"></slot>\n <input part=\"control\" .disabled=${Boolean(this.disabled)} ?disabled=${Boolean(this.disabled)} ?aria-disabled=${Boolean(this.disabled)} />\n \n <slot name=\"suffix\" part=\"suffix\"></slot>\n </div>\n `;\n }\n})\nexport class Input extends HTMLElement {\n declare requestRender: () => void;\n\n @Prop<string | null>({ reflect: true })\n accessor value!: string | null;\n\n @Prop<string | null>({ reflect: true })\n accessor placeholder!: string | null;\n\n @Prop<string>({ reflect: true, defaultValue: 'text' })\n accessor type!: string;\n\n @Prop<string | null>({ reflect: true })\n accessor name!: string | null;\n\n @Prop<boolean>({ type: Boolean, reflect: true, defaultValue: false })\n accessor disabled = false;\n\n @Prop<boolean>({ type: Boolean, reflect: true, defaultValue: false })\n accessor headless = false;\n\n @Query<HTMLInputElement>('input')\n accessor control!: HTMLInputElement | null;\n\n private updatePrefixAttribute(): void {\n const container = this.shadowRoot?.querySelector('[part=\"container\"]');\n if (!container) {\n return;\n }\n\n const prefixSlot = this.shadowRoot?.querySelector('slot[name=\"prefix\"]') as HTMLSlotElement;\n const hasPrefix = Boolean(prefixSlot?.assignedNodes({ flatten: true }).length > 0);\n setBooleanAttribute(container, 'data-has-prefix', hasPrefix);\n }\n\n private updateSuffixAttribute(): void {\n const container = this.shadowRoot?.querySelector('[part=\"container\"]');\n if (!container) {\n return;\n }\n\n const suffixSlot = this.shadowRoot?.querySelector('slot[name=\"suffix\"]') as HTMLSlotElement;\n const hasSuffix = Boolean(suffixSlot?.assignedNodes({ flatten: true }).length > 0);\n setBooleanAttribute(container, 'data-has-suffix', hasSuffix);\n }\n\n afterRender(): void {\n if (!this.control) {\n return;\n }\n\n const control = this.control;\n const value = this.value ?? '';\n\n if (control.value !== value) {\n control.value = value;\n }\n\n control.type = this.type ?? 'text';\n control.placeholder = this.placeholder ?? '';\n control.name = this.name ?? '';\n control.disabled = Boolean(this.disabled);\n\n this.updatePrefixAttribute();\n this.updateSuffixAttribute();\n\n setBooleanAttribute(this, 'disabled', Boolean(this.disabled));\n }\n\n @Listen('slotchange', { selector: 'slot[name=\"prefix\"]' })\n onPrefixSlotChange(): void {\n this.updatePrefixAttribute();\n }\n\n @Listen('slotchange', { selector: 'slot[name=\"suffix\"]' })\n onSuffixSlotChange(): void {\n this.updateSuffixAttribute();\n }\n\n @Listen<Input, Event, HTMLInputElement>('input', { selector: 'input' })\n handleInput(event: Event, target?: HTMLInputElement | null): void {\n if (!target) {\n return;\n }\n\n this.value = target.value;\n dispatchControlEvent(this, 'input', { value: this.value ?? '', event });\n }\n\n @Listen<Input, Event, HTMLInputElement>('change', { selector: 'input' })\n handleChange(event: Event, target?: HTMLInputElement | null): void {\n if (!target) {\n return;\n }\n\n this.value = target.value;\n dispatchControlEvent(this, 'change', { value: this.value ?? '', event });\n }\n}\n","import { html } from 'lit-html';\n\nimport { dispatchControlEvent } from '../shared';\nimport {\n COLOR_FORMATS,\n type ColorFormat,\n getColorComponents,\n type HSV,\n hexToHsv,\n hsvToHex,\n hsvToRgb,\n isLightColor,\n isValidHex,\n updateHsvFromComponents\n} from './utils';\n\nimport { Component } from '~/decorators/Component';\nimport { Prop } from '~/decorators/Prop';\nimport { Query } from '~/decorators/Query';\nimport { styleMap } from '~/utils/template-helpers';\nimport '../icons/interface/arrows-vertical';\nimport '../icons/interface/picker';\n\n@Component({\n tag: 'ease-color-picker',\n autoSlot: false,\n styles: `\n :host {\n display: grid;\n grid-gap: 8px;\n user-select: none;\n -webkit-user-select: none;\n\n --ease-color-picker-width: 180px;\n }\n\n [part=\"saturation\"] {\n position: relative;\n width: 100%;\n height: 124px;\n cursor: pointer;\n background-image: linear-gradient(to top, black, transparent), linear-gradient(to right, white, transparent);\n border-radius: 7px;\n touch-action: none;\n }\n\n [part=\"saturation-handle\"] {\n position: absolute;\n width: 10px;\n height: 10px;\n box-shadow: inset 0 0 0 2px var(--color-blue-100);\n border-radius: 50%;\n pointer-events: none;\n }\n\n [part=\"hue\"] {\n position: relative;\n height: 8px;\n align-self: center;\n flex-grow: 1;\n cursor: pointer;\n border-radius: 9px;\n background-image: linear-gradient(to right, #f00, #ff0, #0f0, #0ff, #00f, #f0f, #f00);\n touch-action: none;\n }\n\n [part=\"hue-handle\"] {\n position: absolute;\n top: 0;\n width: 8px;\n height: 8px;\n box-shadow: inset 0 0 0 2px var(--color-blue-100);\n border-radius: 50%;\n pointer-events: none;\n }\n\n [part=\"preview\"] {\n position: relative;\n width: 20px;\n height: 20px;\n border-radius: 5px;\n box-shadow: inset 0 0 0 .75px var(--color-blue-80);\n display: grid;\n place-items: center;\n\n &[data-eyedropper] {\n cursor: pointer;\n\n &:hover,\n &:focus-visible {\n ease-icon-picker {\n scale: 1.1;\n }\n }\n\n ease-icon-picker {\n color: var(--icon-color, var(--color-blue-100));\n transition: scale 0.2s, color 0.15s;\n filter: drop-shadow(0 0 2px var(--color-black-15));\n }\n }\n }\n\n [part=\"toolbar\"] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 8px;\n position: relative;\n z-index: 1;\n }\n\n [part=\"toolbar\"] ease-button {\n padding: 4px;\n width: max-content;\n }\n\n [part=\"format-container\"] {\n display: grid;\n grid-template-columns: 30px 1fr;\n align-items: center;\n gap: 8px;\n }\n\n [part=\"format-inputs\"] {\n padding: 2px 4px;\n width: 100%;\n border-radius: var(--ease-color-picker-format-radius, var(--radii-md));\n background-color: var(--ease-color-picker-format-background, var(--color-gray-850));\n cursor: pointer;\n box-shadow: var(\n --ease-color-picker-format-shadow,\n inset 0 1px 0.25px 0 var(--color-white-4),\n 0 1px 2.5px 0 var(--color-black-8)\n );\n box-sizing: border-box;\n display: flex;\n justify-content: space-around;\n\n &:hover,\n &:focus-within {\n background-color: var(--ease-color-picker-format-background-hover, var(--color-gray-825));\n }\n }\n\n [part=\"format-input\"] {\n appearance: none;\n -moz-appearance: textfield;\n cursor: pointer;\n box-sizing: border-box;\n font-size: var(--ease-color-picker-format-font-size, 11px);\n font-weight: 500;\n color: var(--color-gray-600);\n min-width: 0;\n box-sizing: border-box;\n border: none;\n outline: none;\n padding: 4px;\n margin: 0;\n background-color: transparent;\n line-height: 12px;\n transition: color 0.2s;\n width: 100%;\n text-align: center;\n font-optical-sizing: auto;\n font-family: var(--ease-font-mono, 'Geist Mono', monospace);\n\n &:hover,\n &:focus-within {\n color: var(--color-blue-100);\n }\n\n &::placeholder {\n color: var(--color-gray-800);\n opacity: 1;\n }\n\n &::-webkit-outer-spin-button,\n &::-webkit-inner-spin-button {\n -webkit-appearance: none;\n margin: 0;\n }\n }\n\n [part=\"color-container\"] {\n display: grid;\n grid-template-columns: 1fr 20px;\n align-items: center;\n gap: 8px;\n }\n\n [part=\"format-trigger\"] {\n --ease-icon-size: var(--ease-color-picker-format-icon-size, 10px);\n\n display: flex;\n align-items: center;\n gap: 2px;\n font-family: var(--ease-font-mono, 'Geist Mono', monospace);\n font-optical-sizing: auto;\n font-size: var(--ease-color-picker-format-trigger-font-size, 10px);\n font-weight: 500;\n color: var(--color-gray-400);\n cursor: pointer;\n transition: color 0.15s;\n overflow: hidden;\n position: relative;\n height: 14px;\n\n &:hover {\n color: var(--color-gray-200);\n }\n\n ease-icon-arrows-vertical {\n color: var(--color-gray-600);\n flex-shrink: 0;\n }\n }\n\n [part=\"format-label\"] {\n display: inline-block;\n }\n\n [part=\"format-label\"][data-animating=\"out\"] {\n animation: formatOut 0.15s ease-in forwards;\n }\n\n [part=\"format-label\"][data-animating=\"in\"] {\n animation: formatIn 0.15s ease-out forwards;\n }\n\n @keyframes formatOut {\n 0% {\n transform: translateY(0) scale(1);\n opacity: 1;\n }\n 100% {\n transform: translateY(6px) scale(0.8);\n opacity: 0;\n }\n }\n\n @keyframes formatIn {\n 0% {\n transform: translateY(-6px) scale(0.8);\n opacity: 0;\n }\n 100% {\n transform: translateY(0) scale(1);\n opacity: 1;\n }\n }\n\n `,\n template(this: ColorPicker) {\n const { h, s, v } = this.hsv;\n const pureHue = hsvToRgb(h, 1, 1);\n const currentRgb = hsvToRgb(h, s, v);\n const saturationBg = `rgb(${pureHue.r}, ${pureHue.g}, ${pureHue.b})`;\n const huePercent = h / 360;\n const vInverted = 1 - v;\n // Position handles so they stay within container bounds (handle is 10px)\n const saturationHandleStyles = {\n left: `calc(${s * 100}% - ${s * 10}px)`,\n top: `calc(${vInverted * 100}% - ${vInverted * 10}px)`\n } as const;\n const hueHandleStyles = {\n left: `calc(${huePercent * 100}% - ${huePercent * 10}px)`\n } as const;\n const isLight = isLightColor(currentRgb.r, currentRgb.g, currentRgb.b);\n const hasEyeDropper = 'EyeDropper' in window;\n const previewStyles = {\n backgroundColor: this.value,\n '--icon-color': isLight ? 'var(--color-gray-900)' : 'var(--color-blue-100)'\n } as const;\n const components = getColorComponents(this.hsv, this.format);\n\n return html`\n <div \n part=\"saturation\" \n style=${styleMap({ backgroundColor: saturationBg })}\n @pointerdown=${this.handleSaturationPointerDown}\n @pointermove=${this.handleSaturationPointerMove}\n @pointerup=${this.handleSaturationPointerUp}\n @pointercancel=${this.handleSaturationPointerUp}\n >\n <div part=\"saturation-handle\" style=${styleMap(saturationHandleStyles)}></div>\n </div>\n <div part=\"color-container\">\n <div \n part=\"hue\"\n @pointerdown=${this.handleHuePointerDown}\n @pointermove=${this.handleHuePointerMove}\n @pointerup=${this.handleHuePointerUp}\n @pointercancel=${this.handleHuePointerUp}\n >\n <div part=\"hue-handle\" style=${styleMap(hueHandleStyles)}></div>\n </div>\n\n <div \n part=\"preview\" \n style=${styleMap(previewStyles)}\n ?data-eyedropper=${hasEyeDropper}\n @click=${hasEyeDropper ? this.handleEyeDropperClick : null}\n >\n ${hasEyeDropper ? html`<ease-icon-picker></ease-icon-picker>` : null}\n </div>\n </div>\n <div part=\"format-container\">\n <div part=\"format-trigger\" @click=${this.handleFormatCycle}>\n <span part=\"format-label\" data-animating=${this.formatAnimating}>${this.format.toUpperCase()}</span>\n <ease-icon-arrows-vertical />\n </div>\n <div part=\"format-inputs\">\n ${\n this.format === 'hex'\n ? html`\n <input \n part=\"format-input\" \n data-hex\n type=\"text\" \n .value=${components.values[0]}\n @input=${(e: Event) => this.handleComponentChange(0, (e.target as HTMLInputElement).value)}\n />\n `\n : components.labels.map(\n (_, i) => html`\n <input \n part=\"format-input\" \n type=\"number\" \n min=\"0\"\n max=${components.max[i]}\n .value=${String(components.values[i])}\n @input=${(e: Event) => this.handleComponentChange(i, Number((e.target as HTMLInputElement).value))}\n />\n `\n )\n }\n </div>\n </div>\n <div part=\"toolbar\">\n <ease-button variant=\"headless-muted\" @click=${this.handleCancelButtonClick}>Cancel</ease-button>\n <ease-button variant=\"headless\" @click=${this.handleApplyButtonClick}>Apply</ease-button>\n </div>\n `;\n }\n})\nexport class ColorPicker extends HTMLElement {\n declare requestRender: () => void;\n\n private hsv: HSV = { h: 0, s: 1, v: 1 };\n private originalValue: string = '#FF0000';\n private format: ColorFormat = 'hex';\n formatAnimating: 'out' | 'in' | 'none' = 'none';\n #isDraggingSaturation = false;\n #isDraggingHue = false;\n #activeSaturationPointer: number | null = null;\n #activeHuePointer: number | null = null;\n isInternalUpdate = false;\n\n @Query('[part=\"saturation\"]') accessor saturationArea!: HTMLElement | null;\n @Query('[part=\"hue\"]') accessor hueArea!: HTMLElement | null;\n @Query<HTMLInputElement>('[part=\"hex-input\"]') accessor hexInput!: HTMLInputElement | null;\n\n @Prop({\n reflect: true,\n defaultValue: '#FF0000',\n onChange(this: ColorPicker, value: string | null) {\n if (!this.isInternalUpdate) {\n this.updateFromHex(value ?? '#FF0000');\n }\n }\n })\n accessor value!: string;\n\n connectedCallback(): void {\n this.originalValue = this.value;\n this.updateFromHex(this.value);\n }\n\n private updateFromHex(hex: string): void {\n if (!isValidHex(hex)) {\n return;\n }\n\n const hsv = hexToHsv(hex);\n\n if (hsv) {\n this.hsv = hsv;\n }\n }\n\n #updateValue(event: Event | null): void {\n const newValue = hsvToHex(this.hsv.h, this.hsv.s, this.hsv.v);\n\n if (this.value !== newValue) {\n this.isInternalUpdate = true;\n this.value = newValue;\n this.isInternalUpdate = false;\n\n if (this.hexInput && document.activeElement !== this.hexInput) {\n this.hexInput.value = newValue;\n }\n\n if (event) {\n dispatchControlEvent(this, 'input', { value: this.value, event });\n }\n }\n }\n\n readonly handleSaturationPointerDown = (event: PointerEvent): void => {\n if (!this.saturationArea) {\n return;\n }\n\n if (event.button !== undefined && event.button !== 0) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n this.#isDraggingSaturation = true;\n this.#activeSaturationPointer = event.pointerId;\n this.saturationArea.setPointerCapture(event.pointerId);\n this.updateSaturationValue(event);\n };\n\n readonly handleSaturationPointerMove = (event: PointerEvent): void => {\n if (!this.#isDraggingSaturation || event.pointerId !== this.#activeSaturationPointer) {\n return;\n }\n\n event.preventDefault();\n this.updateSaturationValue(event);\n };\n\n readonly handleSaturationPointerUp = (event: PointerEvent): void => {\n if (!this.#isDraggingSaturation || event.pointerId !== this.#activeSaturationPointer) {\n return;\n }\n\n this.#isDraggingSaturation = false;\n this.#activeSaturationPointer = null;\n\n if (this.saturationArea?.hasPointerCapture(event.pointerId)) {\n this.saturationArea.releasePointerCapture(event.pointerId);\n }\n\n dispatchControlEvent(this, 'change', { value: this.value, event });\n };\n\n private updateSaturationValue(event: PointerEvent): void {\n if (!this.saturationArea) {\n return;\n }\n const rect = this.saturationArea.getBoundingClientRect();\n const x = Math.max(0, Math.min(rect.width, event.clientX - rect.left));\n const y = Math.max(0, Math.min(rect.height, event.clientY - rect.top));\n\n this.hsv.s = x / rect.width;\n this.hsv.v = 1 - y / rect.height;\n\n this.#updateValue(event);\n this.requestRender();\n }\n\n readonly handleHuePointerDown = (event: PointerEvent): void => {\n if (!this.hueArea) {\n return;\n }\n\n if (event.button !== undefined && event.button !== 0) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n this.#isDraggingHue = true;\n this.#activeHuePointer = event.pointerId;\n this.hueArea.setPointerCapture(event.pointerId);\n this.updateHue(event);\n };\n\n readonly handleHuePointerMove = (event: PointerEvent): void => {\n if (!this.#isDraggingHue || event.pointerId !== this.#activeHuePointer) {\n return;\n }\n\n event.preventDefault();\n this.updateHue(event);\n };\n\n readonly handleHuePointerUp = (event: PointerEvent): void => {\n if (!this.#isDraggingHue || event.pointerId !== this.#activeHuePointer) {\n return;\n }\n\n this.#isDraggingHue = false;\n this.#activeHuePointer = null;\n\n if (this.hueArea?.hasPointerCapture(event.pointerId)) {\n this.hueArea.releasePointerCapture(event.pointerId);\n }\n\n dispatchControlEvent(this, 'change', { value: this.value, event });\n };\n\n private updateHue(event: PointerEvent): void {\n if (!this.hueArea) {\n return;\n }\n const rect = this.hueArea.getBoundingClientRect();\n const x = Math.max(0, Math.min(rect.width, event.clientX - rect.left));\n\n this.hsv.h = (x / rect.width) * 360;\n\n this.#updateValue(event);\n this.requestRender();\n }\n\n readonly handleHexInputChange = (event: Event): void => {\n const input = event.target as HTMLInputElement;\n const newValue = input.value;\n\n if (isValidHex(newValue)) {\n this.updateFromHex(newValue);\n this.#updateValue(event);\n this.requestRender();\n dispatchControlEvent(this, 'change', { value: this.value, event });\n } else if (this.hexInput) {\n this.hexInput.value = this.value;\n }\n };\n\n readonly handleComponentChange = (index: number, value: number | string): void => {\n this.hsv = updateHsvFromComponents(this.hsv, this.format, index, value);\n this.#updateValue(null);\n this.requestRender();\n };\n\n readonly handleFormatChange = (format: ColorFormat): void => {\n this.format = format;\n this.requestRender();\n };\n\n readonly handleFormatCycle = (): void => {\n // Start exit animation\n this.formatAnimating = 'out';\n this.requestRender();\n\n // After exit animation, change format and start enter animation\n setTimeout(() => {\n const currentIndex = COLOR_FORMATS.indexOf(this.format);\n const nextIndex = (currentIndex + 1) % COLOR_FORMATS.length;\n this.format = COLOR_FORMATS[nextIndex] as ColorFormat;\n this.formatAnimating = 'in';\n this.requestRender();\n\n // Clear animation state after enter animation\n setTimeout(() => {\n this.formatAnimating = 'none';\n this.requestRender();\n }, 150);\n }, 150);\n };\n\n readonly handleCancelButtonClick = (event: Event): void => {\n this.updateFromHex(this.originalValue);\n this.isInternalUpdate = true;\n this.value = this.originalValue;\n this.isInternalUpdate = false;\n this.requestRender();\n dispatchControlEvent(this, 'cancel', { value: this.originalValue, event });\n };\n\n readonly handleApplyButtonClick = (event: Event): void => {\n this.originalValue = this.value;\n dispatchControlEvent(this, 'apply', { value: this.value, event });\n };\n\n readonly handleEyeDropperClick = async (event: Event): Promise<void> => {\n if (!('EyeDropper' in window)) {\n return;\n }\n\n try {\n const eyeDropper = new (\n window as typeof window & { EyeDropper: new () => { open: () => Promise<{ sRGBHex: string }> } }\n ).EyeDropper();\n const result = await eyeDropper.open();\n\n if (result.sRGBHex) {\n this.updateFromHex(result.sRGBHex);\n this.#updateValue(event);\n this.requestRender();\n dispatchControlEvent(this, 'change', { value: this.value, event });\n }\n } catch {\n // User cancelled or API error - silently ignore\n }\n };\n}\n\nexport default {\n ColorPicker\n};\n","export interface RGB {\n r: number;\n g: number;\n b: number;\n}\n\nexport interface HSV {\n h: number;\n s: number;\n v: number;\n}\n\nexport interface HSL {\n h: number;\n s: number;\n l: number;\n}\n\nexport type ColorFormat = 'hex' | 'rgb' | 'hsl' | 'hsb';\n\nconst clamp01 = (value: number) => Math.max(0, Math.min(1, value));\n\nexport function hsvToRgb(h: number, s: number, v: number): RGB {\n let hue = ((h % 360) + 360) % 360;\n hue /= 60;\n\n const saturation = clamp01(s);\n const value = clamp01(v);\n const c = value * saturation;\n const x = c * (1 - Math.abs((hue % 2) - 1));\n const m = value - c;\n\n let r = 0;\n let g = 0;\n let b = 0;\n\n if (hue < 1) {\n r = c;\n g = x;\n } else if (hue < 2) {\n r = x;\n g = c;\n } else if (hue < 3) {\n g = c;\n b = x;\n } else if (hue < 4) {\n g = x;\n b = c;\n } else if (hue < 5) {\n r = x;\n b = c;\n } else {\n r = c;\n b = x;\n }\n\n return {\n r: Math.round((r + m) * 255),\n g: Math.round((g + m) * 255),\n b: Math.round((b + m) * 255)\n };\n}\n\nexport function rgbToHsv(r: number, g: number, b: number): HSV {\n const rn = r / 255;\n const gn = g / 255;\n const bn = b / 255;\n\n const max = Math.max(rn, gn, bn);\n const min = Math.min(rn, gn, bn);\n const delta = max - min;\n\n let h = 0;\n const s = max === 0 ? 0 : delta / max;\n const v = max;\n\n if (delta !== 0) {\n switch (max) {\n case rn:\n h = (gn - bn) / delta + (gn < bn ? 6 : 0);\n break;\n case gn:\n h = (bn - rn) / delta + 2;\n break;\n case bn:\n h = (rn - gn) / delta + 4;\n break;\n default:\n break;\n }\n\n h *= 60;\n }\n\n return { h, s, v };\n}\n\nexport function rgbToHex(r: number, g: number, b: number): string {\n const toHex = (component: number) => component.toString(16).padStart(2, '0');\n return `#${toHex(r)}${toHex(g)}${toHex(b)}`.toUpperCase();\n}\n\nexport function hexToRgb(hex: string): RGB | null {\n let normalized = hex.trim();\n\n if (/^#([0-9a-f]{3})$/i.test(normalized)) {\n normalized = `#${normalized[1]}${normalized[1]}${normalized[2]}${normalized[2]}${normalized[3]}${normalized[3]}`;\n }\n\n const match = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(normalized);\n\n if (!match || !match[1] || !match[2] || !match[3]) {\n return null;\n }\n\n return {\n r: parseInt(match[1], 16),\n g: parseInt(match[2], 16),\n b: parseInt(match[3], 16)\n };\n}\n\nexport function hexToHsv(hex: string): HSV | null {\n const rgb = hexToRgb(hex);\n return rgb ? rgbToHsv(rgb.r, rgb.g, rgb.b) : null;\n}\n\nexport function hsvToHex(h: number, s: number, v: number): string {\n const rgb = hsvToRgb(h, s, v);\n return rgbToHex(rgb.r, rgb.g, rgb.b);\n}\n\nexport function isValidHex(hex: string): boolean {\n return /^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/.test(hex.trim());\n}\n\nexport function getLuminance(r: number, g: number, b: number): number {\n return (0.299 * r + 0.587 * g + 0.114 * b) / 255;\n}\n\nexport function isLightColor(r: number, g: number, b: number): boolean {\n return getLuminance(r, g, b) > 0.5;\n}\n\nexport function hsvToHsl(h: number, s: number, v: number): HSL {\n const l = v * (1 - s / 2);\n const sl = l === 0 || l === 1 ? 0 : (v - l) / Math.min(l, 1 - l);\n return { h, s: sl, l };\n}\n\nexport function hslToHsv(h: number, s: number, l: number): HSV {\n const v = l + s * Math.min(l, 1 - l);\n const sv = v === 0 ? 0 : 2 * (1 - l / v);\n return { h, s: sv, v };\n}\n\nexport function formatColor(hsv: HSV, format: ColorFormat, alpha = 1): string {\n const { h, s, v } = hsv;\n\n switch (format) {\n case 'hex':\n return hsvToHex(h, s, v);\n case 'rgb': {\n const rgb = hsvToRgb(h, s, v);\n return `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, ${alpha})`;\n }\n case 'hsl': {\n const hsl = hsvToHsl(h, s, v);\n return `hsla(${Math.round(hsl.h)}, ${Math.round(hsl.s * 100)}%, ${Math.round(hsl.l * 100)}%, ${alpha})`;\n }\n case 'hsb':\n return `hsb(${Math.round(h)}, ${Math.round(s * 100)}%, ${Math.round(v * 100)}%)`;\n default:\n return hsvToHex(h, s, v);\n }\n}\n\nexport interface ColorComponents {\n labels: string[];\n values: (string | number)[];\n max: number[];\n suffix: string[];\n}\n\nexport function getColorComponents(hsv: HSV, format: ColorFormat): ColorComponents {\n const { h, s, v } = hsv;\n\n switch (format) {\n case 'hex':\n return {\n labels: ['Hex'],\n values: [hsvToHex(h, s, v)],\n max: [0],\n suffix: ['']\n };\n case 'rgb': {\n const rgb = hsvToRgb(h, s, v);\n return {\n labels: ['R', 'G', 'B'],\n values: [rgb.r, rgb.g, rgb.b],\n max: [255, 255, 255],\n suffix: ['', '', '']\n };\n }\n case 'hsl': {\n const hsl = hsvToHsl(h, s, v);\n return {\n labels: ['H', 'S', 'L'],\n values: [Math.round(hsl.h), Math.round(hsl.s * 100), Math.round(hsl.l * 100)],\n max: [360, 100, 100],\n suffix: ['°', '%', '%']\n };\n }\n case 'hsb':\n return {\n labels: ['H', 'S', 'B'],\n values: [Math.round(h), Math.round(s * 100), Math.round(v * 100)],\n max: [360, 100, 100],\n suffix: ['°', '%', '%']\n };\n default:\n return {\n labels: ['Hex'],\n values: [hsvToHex(h, s, v)],\n max: [0],\n suffix: ['']\n };\n }\n}\n\nexport function updateHsvFromComponents(hsv: HSV, format: ColorFormat, index: number, value: number | string): HSV {\n const newHsv = { ...hsv };\n\n switch (format) {\n case 'hex': {\n if (typeof value === 'string' && isValidHex(value)) {\n const parsed = hexToHsv(value);\n if (parsed) {\n return parsed;\n }\n }\n break;\n }\n case 'rgb': {\n const rgb = hsvToRgb(hsv.h, hsv.s, hsv.v);\n const vals: [number, number, number] = [rgb.r, rgb.g, rgb.b];\n vals[index] = Math.max(0, Math.min(255, Number(value)));\n return rgbToHsv(vals[0], vals[1], vals[2]);\n }\n case 'hsl': {\n const hsl = hsvToHsl(hsv.h, hsv.s, hsv.v);\n const vals: [number, number, number] = [hsl.h, hsl.s * 100, hsl.l * 100];\n vals[index] = Number(value);\n vals[0] = Math.max(0, Math.min(360, vals[0]));\n vals[1] = Math.max(0, Math.min(100, vals[1]));\n vals[2] = Math.max(0, Math.min(100, vals[2]));\n return hslToHsv(vals[0], vals[1] / 100, vals[2] / 100);\n }\n case 'hsb': {\n const vals: [number, number, number] = [hsv.h, hsv.s * 100, hsv.v * 100];\n vals[index] = Number(value);\n vals[0] = Math.max(0, Math.min(360, vals[0]));\n vals[1] = Math.max(0, Math.min(100, vals[1]));\n vals[2] = Math.max(0, Math.min(100, vals[2]));\n return { h: vals[0], s: vals[1] / 100, v: vals[2] / 100 };\n }\n }\n\n return newHsv;\n}\n\nexport const COLOR_FORMATS: ColorFormat[] = ['hex', 'rgb', 'hsl', 'hsb'];\n","import type { TemplateResult } from 'lit-html';\n\nimport { nothing } from 'lit-html';\nimport { classMap } from 'lit-html/directives/class-map.js';\nimport { ifDefined } from 'lit-html/directives/if-defined.js';\nimport { repeat } from 'lit-html/directives/repeat.js';\nimport { styleMap } from 'lit-html/directives/style-map.js';\nimport { unsafeHTML } from 'lit-html/directives/unsafe-html.js';\nimport { when } from 'lit-html/directives/when.js';\n\nexport { classMap, styleMap, when, repeat, unsafeHTML, ifDefined };\n\nexport function renderIf<T>(\n condition: T | undefined | null,\n template: TemplateResult | (() => TemplateResult)\n): TemplateResult | typeof nothing {\n if (!condition) {\n return nothing;\n }\n\n return typeof template === 'function' ? template() : template;\n}\n\nexport function renderList<T>(\n items: readonly T[],\n template: (item: T, index: number) => TemplateResult,\n key: (item: T, index: number) => unknown = (item) => item\n): ReturnType<typeof repeat> {\n return repeat(items, key, template);\n}\n\nexport function styleObject(input: Record<string, string | number | null | undefined>): ReturnType<typeof styleMap> {\n const definedEntries = Object.entries(input).reduce<Record<string, string>>((acc, [property, value]) => {\n if (value === null || value === undefined || value === '') {\n return acc;\n }\n\n acc[property] = typeof value === 'number' ? `${value}` : value;\n return acc;\n }, {});\n\n return styleMap(definedEntries);\n}\n\nexport const optionalAttribute = ifDefined;\n","import { html } from 'lit-html';\n\nimport { Component } from '~/decorators/Component';\n\n@Component({\n tag: 'ease-icon-arrows-vertical',\n styles: `\n :host {\n display: block;\n width: var(--ease-icon-size, 24px);\n height: var(--ease-icon-size, 24px);\n fill: none;\n stroke: currentColor;\n stroke-width: 1.5;\n stroke-linecap: round;\n stroke-linejoin: round;\n }\n `,\n template() {\n return html`\n <svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M8 9.00006L11.1161 5.88394C11.6043 5.39578 12.3957 5.39578 12.8839 5.88394L16 9.00006M8 15.0001L11.1161 18.1162C11.6043 18.6043 12.3957 18.6043 12.8839 18.1162L16 15.0001\" />\n </svg>\n `;\n }\n})\nexport class IconArrowsVertical extends HTMLElement {\n declare requestRender: () => void;\n}\n","import { html } from 'lit-html';\n\nimport { Component } from '~/decorators/Component';\n\n@Component({\n tag: 'ease-icon-picker',\n styles: `\n :host {\n display: contents;\n }\n\n [part=\"picker\"] {\n display: block;\n width: 12px;\n height: 12px;\n fill: none;\n stroke: currentColor;\n stroke-width: 1.25;\n stroke-linecap: round;\n stroke-linejoin: round;\n }\n `,\n template() {\n return html`\n <svg part=\"picker\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M5 3.50003L8.5 7.00003M2.14645 7.85358L7.5 2.50003C8.05228 1.94774 8.94772 1.94774 9.5 2.50003C10.0523 3.05231 10.0523 3.94774 9.5 4.50003L4.14645 9.85358C4.05268 9.94735 3.9255 10 3.79289 10H2.5C2.22386 10 2 9.77617 2 9.50003V8.20714C2 8.07453 2.05268 7.94735 2.14645 7.85358Z\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n `;\n }\n})\nexport class IconPicker extends HTMLElement {\n declare requestRender: () => void;\n}\n","import { html } from 'lit-html';\n\nimport { Component } from '~/decorators/Component';\nimport { Prop } from '~/decorators/Prop';\n\n@Component({\n tag: 'ease-field',\n autoSlot: false,\n shadowMode: 'open',\n styles: `\n :host {\n display: block;\n width: 100%;\n }\n\n [part=\"field\"] {\n display: grid;\n grid-template-columns: var(--ease-field-label-width, 36%) auto;\n column-gap: var(--ease-field-column-gap, 12px);\n row-gap: var(--ease-field-row-gap, 6px);\n align-items: center;\n width: 100%;\n min-height: var(--ease-field-min-height, 30px);\n margin: 0;\n padding: 0;\n }\n\n :host([full-width]) [part=\"field\"] {\n grid-template-columns: 1fr;\n }\n\n label {\n grid-column: 1;\n font-size: var(--ease-field-label-font-size, var(--ease-font-size-sm, 12px));\n line-height: var(--ease-field-label-line-height, 1.25);\n font-weight: var(--ease-field-label-font-weight, 400);\n text-wrap: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n padding-left: var(--ease-field-label-padding-left, 4px);\n box-sizing: border-box;\n display: block;\n max-width: 100%;\n color: var(--ease-field-label-color, var(--color-gray-600));\n }\n\n [part=\"content\"] {\n grid-column: 2;\n width: 100%;\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n }\n\n :host([full-width]) [part=\"content\"] {\n grid-column: 1;\n align-items: stretch;\n }\n `,\n template(this: Field) {\n return html`\n <div part=\"field\">\n <label>\n ${this.label ?? ''}\n </label>\n\n <div part=\"content\" class=${this.fullWidth ? 'full-width' : ''}>\n <slot></slot>\n </div>\n </div>\n `;\n }\n})\nexport class Field extends HTMLElement {\n @Prop<string | null>({ reflect: true })\n accessor label!: string | null;\n\n @Prop<boolean>({ type: Boolean, reflect: true })\n accessor fullWidth = false;\n}\n","import { html } from 'lit-html';\n\nimport { Component } from '~/decorators/Component';\n\n@Component({\n tag: 'ease-icon-clear',\n styles: `\n :host {\n display: block;\n width: var(--ease-icon-size, 16px);\n height: var(--ease-icon-size, 16px);\n fill: none;\n stroke: currentColor;\n stroke-width: .75;\n stroke-linecap: round;\n stroke-linejoin: round;\n }\n\n [part=\"clear\"] {\n & > path {\n\n &:first-child {\n translate: var(--ease-icon-clear-path-translate, 0);\n transition: translate var(--ease-icon-clear-path-duration, 0.2s);\n transition-delay: var(--ease-icon-clear-path-delay, 0s);\n }\n\n &:not(:first-child) {\n stroke-dasharray: 100 0 100;\n stroke-dashoffset: var(--ease-icon-clear-lines-offset, 100);\n transition: stroke-dashoffset var(--ease-icon-clear-lines-duration, 0.2s);\n transition-delay: var(--ease-icon-clear-lines-delay, 0s);\n }\n }\n\n g {\n path {\n transform-box: fill-box;\n transform-origin: 50% 50%;\n transition: rotate var(--ease-icon-clear-star-duration, 0.2s), scale var(--ease-icon-clear-star-duration, 0.2s);\n\n &:first-child {\n rotate: var(--ease-icon-clear-star-1-rotate, 0deg);\n scale: var(--ease-icon-clear-star-1-scale, 1);\n transition-delay: var(--ease-icon-clear-star-1-delay, 0s);\n }\n\n &:last-child {\n rotate: var(--ease-icon-clear-star-2-rotate, 0deg);\n scale: var(--ease-icon-clear-star-2-scale, 1);\n transition-delay: var(--ease-icon-clear-star-2-delay, 0s);\n }\n }\n }\n }\n `,\n template() {\n return html`\n <svg part=\"clear\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M11.7613 10.334L13.7071 12.2798C14.1011 12.6739 14.1011 13.3127 13.7071 13.7067C13.3131 14.1007 12.6742 14.1007 12.2802 13.7067L10.3344 11.7609M11.7613 10.334L10.9541 8.08932M11.7613 10.334L10.3344 11.7609M10.3344 11.7609L8.08973 10.9537M6.69581 12.3476L12.348 6.69544C12.6942 6.34922 12.6942 5.7879 12.348 5.44168L11.892 4.98574C11.5458 4.63952 10.9845 4.63952 10.6383 4.98574L4.9861 10.6379C4.63989 10.9841 4.63989 11.5454 4.9861 11.8917L5.44204 12.3476C5.78826 12.6938 6.34959 12.6938 6.69581 12.3476Z\" />\n <g>\n <path d=\"M3.3313 2.6645H4.66519M3.99824 1.99756V3.33145\" />\n <path d=\"M4.66516 5.99946H5.99905M5.33211 5.33252V6.66641\" />\n </g>\n <path d=\"M7.33301 1.99756L8.6669 3.33145\" pathlength=\"100\" />\n <path d=\"M3.6648 8.33386L1.99744 6.6665\" pathlength=\"100\" />\n </svg>\n `;\n }\n})\nexport class IconClear extends HTMLElement {\n declare requestRender: () => void;\n}\n","import { html, type TemplateResult } from 'lit-html';\n\nimport { Component } from '~/decorators/Component';\nimport { Prop } from '~/decorators/Prop';\n\ntype GridState = 'show' | 'hide';\n\n@Component({\n tag: 'ease-icon-grid',\n styles: `\n :host {\n display: contents;\n }\n\n [part=\"grid\"] {\n --ease-icon-grid-offset: 100;\n --ease-icon-grid-rotate: 0deg;\n\n display: block;\n width: var(--ease-icon-size, 16px);\n height: var(--ease-icon-size, 16px);\n fill: none;\n stroke: currentColor;\n stroke-width: .75;\n stroke-linecap: round;\n stroke-linejoin: round;\n\n g {\n &:first-of-type {\n path {\n stroke-dasharray: 100 0 100;\n stroke-dashoffset: var(--ease-icon-grid-offset);\n transition: stroke-dashoffset 0.2s;\n }\n }\n\n &:last-child {\n transform-origin: 72.92% 72.92%;\n transition: rotate 0.35s linear(0, 0.472 7.5%, 0.832 15.5%, 0.97 19.7%, 1.081 24%, 1.166 28.5%, 1.226 33.2%, 1.255 36.9%, 1.271 40.8%, 1.275 44.9%, 1.266 49.4%, 1.222 57.8%, 1.092 75.1%, 1.042 83%, 1.01 91.4%, 1);\n rotate: var(--ease-icon-grid-rotate);\n }\n }\n\n [data-state=\"hide\"] {\n --ease-icon-grid-offset: 200;\n --ease-icon-grid-rotate: 45deg;\n }\n }\n `,\n observedAttributes: ['state']\n})\nexport class IconGrid extends HTMLElement {\n declare requestRender: () => void;\n\n @Prop<GridState>({\n reflect: true,\n attribute: 'state',\n defaultValue: 'show'\n })\n accessor state!: GridState;\n\n render(): TemplateResult {\n return html`\n <svg part=\"grid\" viewBox=\"0 0 12 12\" state=${this.state} xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M10.5018 5.49971V3.99909C10.5018 2.6178 9.38204 1.49805 8.00076 1.49805H3.99909C2.6178 1.49805 1.49805 2.6178 1.49805 3.99909V8.00076C1.49805 9.38204 2.6178 10.5018 3.99909 10.5018H5.49971\" />\n <g data-state=${this.state}>\n <path d=\"M7.50059 1.49805V5.49971\" pathlength=\"100\" />\n <path d=\"M4.49937 1.49805V10.5018\" pathlength=\"100\" />\n <path d=\"M1.49805 7.47081H5.49971\" pathlength=\"100\" />\n <path d=\"M1.49805 4.46934H10.5018\" pathlength=\"100\" />\n </g>\n <path d=\"M8.75118 11.0019C7.50813 11.0018 6.50043 9.99415 6.50024 8.7511C6.51896 7.51461 7.5176 6.51719 8.75412 6.5C9.99728 6.50081 11.0044 7.50925 11.0036 8.75241C11.0028 9.99556 9.99434 11.0027 8.75118 11.0019\" />\n <g data-state=${this.state}>\n <path d=\"M8.7512 7.86672V9.63523\" />\n <path d=\"M9.63545 8.75098H7.86694\" />\n </g>\n </svg>\n `;\n }\n}\n","import { html } from 'lit-html';\n\nimport { Component } from '~/decorators/Component';\n\n@Component({\n tag: 'ease-icon-loading',\n styles: `\n :host {\n display: block;\n width: var(--ease-icon-size, 12px);\n height: var(--ease-icon-size, 12px);\n fill: none;\n stroke: currentColor;\n stroke-width: 1.5;\n stroke-linecap: round;\n stroke-linejoin: round;\n }\n\n [part=\"loading\"] {\n transform-origin: center center;\n animation-name: loading, loading-dash, loading-dash-offset;\n animation-duration: .4s, .8s, .8s;\n animation-iteration-count: infinite;\n animation-timing-function: linear;\n stroke-dasharray: 35 65 35 65;\n stroke-dashoffset: 75;\n }\n\n @keyframes loading {\n 0% {\n transform: rotate(-90deg);\n }\n 100% {\n transform: rotate(270deg);\n }\n }\n\n @keyframes loading-dash {\n 33% {\n stroke-dasharray: 15 85 15 85;\n }\n 66% {\n stroke-dasharray: 45 55 45 55;\n }\n }\n\n @keyframes loading-dash-offset {\n 33% {\n stroke-dashoffset: 55;\n }\n 66% {\n stroke-dashoffset: 85;\n }\n }\n `,\n template() {\n return html`\n <svg viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"6\" cy=\"6\" r=\"4.5\" stroke-opacity=\"0.25\" />\n <circle cx=\"6\" cy=\"6\" r=\"4.5\" part=\"loading\" pathlength=\"100\" />\n </svg>\n `;\n }\n})\nexport class Loading extends HTMLElement {\n declare requestRender: () => void;\n}\n","import { html, type TemplateResult } from 'lit-html';\n\nimport { Component } from '~/decorators/Component';\nimport { Prop } from '~/decorators/Prop';\n\ntype SnapState = 'active' | 'default';\n\n@Component({\n tag: 'ease-icon-snap',\n styles: `\n :host {\n display: contents;\n }\n [part=\"snap\"] {\n --ease-icon-snap-cursor-rotate: 0deg;\n --ease-icon-snap-lines-rotate: 0deg;\n --ease-icon-snap-lines-translate: 0 0;\n --ease-icon-snap-lines-translate-1: 0 0;\n --ease-icon-snap-lines-translate-2: 0 0;\n --ease-icon-snap-lines-translate-3: 0 0;\n --ease-icon-snap-lines-translate-4: 0 0;\n --ease-icon-snap-lines-rotate-1: 0deg;\n --ease-icon-snap-lines-rotate-2: 0deg;\n --ease-icon-snap-lines-rotate-3: 0deg;\n --ease-icon-snap-lines-rotate-4: 0deg;\n display: block;\n width: var(--ease-icon-size, 16px);\n height: var(--ease-icon-size, 16px);\n fill: none;\n stroke: currentColor;\n stroke-width: .75;\n stroke-linecap: round;\n stroke-linejoin: round;\n g {\n transform-origin: 68.75% 68.75%;\n &:first-child {\n rotate: var(--ease-icon-snap-cursor-rotate);\n transition: rotate 0.2s;\n\n path {\n transition: d 0.2s;\n }\n }\n &:last-child {\n rotate: var(--ease-icon-snap-lines-rotate);\n translate: var(--ease-icon-snap-lines-translate);\n transition: rotate 0.2s, translate 0.2s;\n path {\n transition: translate 0.2s;\n transform-box: fill-box;\n transform-origin: 50% 50%;\n &:nth-child(1) {\n translate: var(--ease-icon-snap-lines-translate-1);\n rotate: var(--ease-icon-snap-lines-rotate-1);\n }\n &:nth-child(2) {\n translate: var(--ease-icon-snap-lines-translate-2);\n rotate: var(--ease-icon-snap-lines-rotate-2);\n }\n &:nth-child(3) {\n translate: var(--ease-icon-snap-lines-translate-3);\n rotate: var(--ease-icon-snap-lines-rotate-3);\n }\n &:nth-child(4) {\n translate: var(--ease-icon-snap-lines-translate-4);\n rotate: var(--ease-icon-snap-lines-rotate-4);\n }\n }\n }\n }\n }\n [part=\"cursor\"] {\n stroke: transparent;\n stroke-width: 0;\n fill: currentColor;\n }\n [state=\"active\"] {\n --ease-icon-snap-cursor-rotate: -90deg;\n --ease-icon-snap-lines-rotate: -90deg;\n --ease-icon-snap-lines-translate: -2.25px -2.25px;\n --ease-icon-snap-lines-translate: -2.25px -2.25px;\n --ease-icon-snap-lines-translate-1: 1.25px .5px;\n --ease-icon-snap-lines-translate-2: 1.25px -.15px;\n --ease-icon-snap-lines-translate-3: .15px -1.25px;\n --ease-icon-snap-lines-translate-4: -.5px -1.25px;\n --ease-icon-snap-lines-rotate-1: 5deg;\n --ease-icon-snap-lines-rotate-2: 20deg;\n --ease-icon-snap-lines-rotate-3: -20deg;\n --ease-icon-snap-lines-rotate-4: -5deg;\n }\n `,\n observedAttributes: ['state']\n})\nexport class Snap extends HTMLElement {\n declare requestRender: () => void;\n\n @Prop<SnapState>({\n reflect: true,\n attribute: 'state',\n defaultValue: 'default'\n })\n accessor state!: SnapState;\n\n render(): TemplateResult {\n const defaultPath =\n 'M8.48446 6.48383C8.59007 6.37822 8.71218 6.29901 8.84253 6.24620C8.97289 6.19340 9.11149 6.16699 9.25009 6.16699C9.38869 6.16699 9.52729 6.19340 9.65764 6.24620C9.78799 6.29901 9.91009 6.37822 10.01570 6.48383C10.12128 6.58940 10.20044 6.71143 10.25320 6.84168C10.30597 6.97193 10.33233 7.11041 10.33231 7.24889C10.33229 7.38738 10.30589 7.52587 10.25312 7.65615C10.20034 7.78642 10.12120 7.90848 10.01570 8.01410C9.88354 8.14659 9.75139 8.27907 9.61923 8.41156C9.54601 8.48478 9.44981 8.52139 9.35361 8.52139C9.25741 8.52139 9.16120 8.48478 9.08798 8.41156C9.01476 8.33834 8.97815 8.24214 8.97815 8.14594C8.97815 8.04974 9.01476 7.95353 9.08798 7.88031C9.22014 7.74815 9.35230 7.61599 9.48446 7.48383C9.54924 7.41905 9.58163 7.33401 9.58163 7.24896C9.58163 7.16392 9.54924 7.07888 9.48446 7.01410C9.41974 6.94964 9.33492 6.91741 9.25009 6.91741C9.16526 6.91741 9.08043 6.94963 9.01571 7.01410C8.88355 7.14659 8.75139 7.27907 8.61923 7.41156C8.54601 7.48478 8.44981 7.52139 8.35361 7.52139C8.25741 7.52139 8.16120 7.48478 8.08798 7.41156C8.01476 7.33834 7.97815 7.24214 7.97815 7.14594C7.97815 7.04974 8.01476 6.95354 8.08798 6.88031C8.22014 6.74815 8.35230 6.61599 8.48446 6.48383C8.48446 6.48383 8.48446 6.48383 8.48446 6.48383Z';\n\n const defaultPath2 =\n 'M6.88092 8.08737C6.91753 8.05076 6.95989 8.02330 7.00512 8.00500C7.05035 7.98669 7.09845 7.97754 7.14655 7.97754C7.24275 7.97754 7.33895 8.01415 7.41217 8.08737C7.44878 8.12398 7.47624 8.16634 7.49454 8.21156C7.51285 8.25679 7.52200 8.30489 7.52200 8.35299C7.52200 8.40110 7.51285 8.44920 7.49454 8.49443C7.47624 8.53965 7.44878 8.58201 7.41217 8.61862C7.34593 8.68470 7.27968 8.75078 7.21344 8.81686C7.14720 8.88294 7.08095 8.94902 7.01471 9.01510C6.95024 9.07982 6.91802 9.16465 6.91802 9.24948C6.91802 9.33431 6.95025 9.41914 7.01471 9.48385C7.07949 9.54863 7.16453 9.58102 7.24957 9.58102C7.33462 9.58102 7.41966 9.54863 7.48444 9.48385C7.55052 9.41777 7.61660 9.35169 7.68268 9.28561C7.74876 9.21953 7.81484 9.15345 7.88092 9.08737C7.91753 9.05076 7.95989 9.02330 8.00512 9.00500C8.05035 8.98669 8.09845 8.97754 8.14655 8.97754C8.24275 8.97754 8.33895 9.01415 8.41217 9.08737C8.44878 9.12398 8.47624 9.16634 8.49454 9.21156C8.51285 9.25679 8.52200 9.30489 8.52200 9.35299C8.52200 9.44920 8.48539 9.54540 8.41217 9.61862C8.34593 9.68470 8.27968 9.75078 8.21344 9.81686C8.14720 9.88294 8.08095 9.94902 8.01471 10.01510C7.96190 10.06785 7.90498 10.11401 7.84498 10.15358C7.78498 10.19315 7.72189 10.22613 7.65676 10.25252C7.59162 10.27890 7.52443 10.29870 7.45621 10.31190C7.38799 10.32510 7.31875 10.33170 7.24950 10.33171C7.18026 10.33172 7.11102 10.32514 7.04281 10.31195C6.97460 10.29877 6.90741 10.27898 6.84229 10.25260C6.77716 10.22622 6.71409 10.19324 6.65411 10.15365C6.59413 10.11407 6.53723 10.06789 6.48444 10.01510C6.43163 9.96230 6.38543 9.90537 6.34582 9.84534C6.30622 9.78532 6.27322 9.72221 6.24681 9.65703C6.22041 9.59186 6.20061 9.52462 6.18740 9.45635C6.17420 9.38808 6.16760 9.31878 6.16760 9.24948C6.16760 9.18018 6.17420 9.11088 6.18740 9.04261C6.20061 8.97434 6.22041 8.90710 6.24681 8.84192C6.27322 8.77675 6.30622 8.71363 6.34582 8.65361C6.38543 8.59359 6.43163 8.53666 6.48444 8.48385C6.55052 8.41777 6.61660 8.35169 6.68268 8.28561C6.74876 8.21953 6.81484 8.15345 6.88092 8.08737C6.88092 8.08737 6.88092 8.08737 6.88092 8.08737Z';\n\n const activePath =\n 'M9.25193 6.28166C9.4768 6.23094 9.80415 6.20744 10.0781 6.48185C10.3368 6.74117 10.3461 7.05052 10.3008 7.29338C10.2792 7.40896 10.2435 7.52323 10.2119 7.61955C10.1784 7.72179 10.1479 7.80498 10.124 7.89201C10.12433 7.89234 10.12467 7.89266 10.125 7.89299C9.92512 8.64299 9.72525 9.39300 9.52537 10.14300C9.47203 10.34300 9.2664 10.46180 9.06638 10.40860C8.86627 10.35520 8.74739 10.14970 8.80076 9.94963C9.00063 9.19963 9.20050 8.44963 9.40037 7.69963C9.40069 7.69898 9.40102 7.69832 9.40134 7.69767C9.43192 7.58586 9.47025 7.47290 9.49900 7.38517C9.53005 7.29041 9.55180 7.21804 9.56345 7.15568C9.58449 7.04289 9.56329 7.02762 9.54685 7.01115C9.54547 7.00815 9.54373 6.98452 9.41697 7.01310C9.34508 7.02932 9.27319 7.05278 9.16502 7.08537C9.07787 7.11162 8.97189 7.13866 8.85837 7.15764C8.85870 7.15796 8.85902 7.15829 8.85935 7.15861C8.10935 7.35848 7.35935 7.55835 6.60935 7.75822C6.40924 7.81159 6.20373 7.69271 6.15037 7.49260C6.09724 7.29260 6.21600 7.08695 6.41599 7.03361C7.16599 6.83374 7.91599 6.63387 8.66599 6.43400C8.68104 6.42999 8.69646 6.42733 8.71189 6.42521C8.78100 6.41576 8.85573 6.39545 8.94822 6.36760C9.03125 6.34259 9.14580 6.30560 9.25193 6.28166C9.25193 6.28166 9.25193 6.28166 9.25193 6.28166Z';\n\n const activePath2 =\n 'M6.30855 7.08196C6.48218 6.9692 6.71426 7.01871 6.8271 7.19231C6.93984 7.36595 6.89035 7.59803 6.71675 7.71087C6.55769 7.8143 6.51399 7.8829 6.50288 7.9052C6.50718 7.91375 6.51671 7.92905 6.53804 7.95208C6.59186 8.01016 6.676 8.06871 6.76265 8.11614C6.80333 8.1384 6.83994 8.15555 6.86519 8.16692C6.87727 8.17236 6.88667 8.1762 6.89253 8.17864C6.89522 8.17976 6.89739 8.18117 6.89839 8.18157C6.92411 8.19492 6.94982 8.20826 6.97554 8.22161C7.34059 8.4726 7.44425 8.52362 7.48433 8.54387C7.51885 8.56133 7.56761 8.58533 7.62788 8.63665C7.66711 8.67009 7.71609 8.719 7.77827 8.78118C7.84064 8.84354 7.88955 8.89167 7.9228 8.93059C7.97354 8.98999 7.99693 9.03787 8.0146 9.07219C8.02503 9.09247 8.04365 9.12833 8.09077 9.20501C8.1741 9.33099 8.25744 9.45696 8.34077 9.58294C8.35477 9.60931 8.36876 9.63567 8.38276 9.66204C8.38276 9.66171 8.38276 9.66139 8.38276 9.66106C8.38311 9.66194 8.3836 9.6642 8.38472 9.66692C8.38713 9.67278 8.39182 9.68272 8.39741 9.69524C8.40866 9.72041 8.42527 9.75637 8.44722 9.7968C8.49432 9.88353 8.55171 9.96872 8.60933 10.0224C8.63022 10.0418 8.64563 10.0499 8.65425 10.0546C8.67716 10.0429 8.74616 9.99929 8.84858 9.84173C8.96155 9.66836 9.19361 9.61954 9.36714 9.73235C9.54063 9.84525 9.59026 10.0773 9.47749 10.2509C9.29202 10.5362 9.06335 10.7493 8.77534 10.7988C8.47563 10.8502 8.24137 10.7041 8.09858 10.5712C7.95494 10.4374 7.85125 10.2716 7.78804 10.1552C7.75497 10.0943 7.72938 10.0401 7.71187 10.0009C7.70702 9.99006 7.70284 9.98022 7.69917 9.97161C7.45448 9.61671 7.38641 9.49034 7.34761 9.41497C7.34662 9.41306 7.34544 9.41155 7.34468 9.41009C7.33244 9.39698 7.30693 9.37136 7.24702 9.31145C7.18316 9.24759 7.15849 9.22387 7.14644 9.21282C7.07033 9.17434 6.9431 9.10751 6.58589 8.86321C6.57737 8.85954 6.56726 8.85532 6.55659 8.85052C6.51749 8.83289 6.46383 8.80746 6.40327 8.77434C6.28687 8.71066 6.12089 8.60606 5.98726 8.46184C5.85457 8.31851 5.70938 8.0836 5.76069 7.78411C5.81025 7.49606 6.02305 7.26752 6.30855 7.08196C6.30855 7.08196 6.30855 7.08196 6.30855 7.08196Z';\n\n const path1 = this.state === 'active' ? activePath : defaultPath;\n const path2 = this.state === 'active' ? activePath2 : defaultPath2;\n\n return html`\n <svg part=\"snap\" viewBox=\"0 0 12 12\" state=${this.state} xmlns=\"http://www.w3.org/2000/svg\">\n <g part=\"cursor\">\n <path d=${path1} />\n <path d=${path2} />\n </g>\n \n <path d=\"M2.5 3.5V8.5\" />\n <path d=\"M9.5 5V3.5\" />\n <path d=\"M3.5 9.5H5\" />\n <path d=\"M8.5 2.5H3.5\" />\n \n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M2.5 3.5V3.5C1.948 3.5 1.5 3.052 1.5 2.5V2.5C1.5 1.948 1.948 1.5 2.5 1.5V1.5C3.052 1.5 3.5 1.948 3.5 2.5V2.5C3.5 3.052 3.052 3.5 2.5 3.5Z\" />\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M9.5 3.5V3.5C8.948 3.5 8.5 3.052 8.5 2.5V2.5C8.5 1.948 8.948 1.5 9.5 1.5V1.5C10.052 1.5 10.5 1.948 10.5 2.5V2.5C10.5 3.052 10.052 3.5 9.5 3.5Z\" />\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M2.5 10.5V10.5C1.948 10.5 1.5 10.052 1.5 9.5V9.5C1.5 8.948 1.948 8.5 2.5 8.5V8.5C3.052 8.5 3.5 8.948 3.5 9.5V9.5C3.5 10.052 3.052 10.5 2.5 10.5Z\" />\n \n <g part=\"lines\">\n <path d=\"M7.5 6V6.5\" />\n <path d=\"M6.5 7.5H6\" />\n <path d=\"M9 10.5V10\" />\n <path d=\"M10 9H10.5\" />\n </g>\n </svg>\n `;\n }\n}\n","import { html } from 'lit-html';\n\nimport { Component } from '~/decorators/Component';\n\n@Component({\n tag: 'ease-icon-anchor-add',\n styles: `\n :host {\n display: block;\n width: var(--ease-icon-size, 12px);\n height: var(--ease-icon-size, 12px);\n fill: none;\n stroke: currentColor;\n stroke-width: 0.75;\n stroke-linecap: round;\n stroke-linejoin: round;\n }\n `,\n template() {\n return html`\n <svg viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M2.70508 10.5003L5.30008 7.90527\" />\n <path d=\"M6.59557 6.61121C6.95348 6.96913 6.95348 7.54942 6.59557 7.90734C6.23765 8.26525 5.65736 8.26525 5.29944 7.90734C4.94153 7.54942 4.94153 6.96913 5.29944 6.61121C5.65736 6.25329 6.23765 6.25329 6.59557 6.61121\" />\n <path d=\"M9.20703 6.50016L8.39453 8.93866C8.27903 9.28516 7.98353 9.54066 7.62453 9.60616L2.70703 10.5002L3.39036 6.74393M9.20006 6.50016L9.72739 5.98984C10.2895 5.4459 10.2968 4.54693 9.74375 3.99385L9.22391 3.47402C8.68351 2.93361 7.80957 2.92644 7.26038 3.45792L6.98022 3.72904\" />\n <path d=\"M3.49931 5.54525C2.36926 5.54516 1.45317 4.62914 1.453 3.49909C1.47001 2.37501 2.37788 1.46826 3.50198 1.45264C4.63212 1.45337 5.54769 2.37013 5.54695 3.50028C5.54621 4.63042 4.62945 5.54599 3.49931 5.54525\" />\n <path d=\"M3.4993 2.69516V4.30289\" />\n <path d=\"M4.30317 3.49902H2.69543\" />\n </svg>\n `;\n }\n})\nexport class IconAnchorAdd extends HTMLElement {\n declare requestRender: () => void;\n}\n","import { html } from 'lit-html';\n\nimport { Component } from '~/decorators/Component';\n\n@Component({\n tag: 'ease-icon-anchor-remove',\n styles: `\n :host {\n display: block;\n width: var(--ease-icon-size, 12px);\n height: var(--ease-icon-size, 12px);\n fill: none;\n stroke: currentColor;\n stroke-width: 0.75;\n stroke-linecap: round;\n stroke-linejoin: round;\n }\n `,\n template() {\n return html`\n <svg viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M2.70508 10.5003L5.30008 7.90527\" />\n <path d=\"M6.59557 6.61121C6.95348 6.96913 6.95348 7.54942 6.59557 7.90734C6.23765 8.26525 5.65736 8.26525 5.29944 7.90734C4.94153 7.54942 4.94153 6.96913 5.29944 6.61121C5.65736 6.25329 6.23765 6.25329 6.59557 6.61121\" />\n <path d=\"M9.20703 6.50016L8.39453 8.93866C8.27903 9.28516 7.98353 9.54066 7.62453 9.60616L2.70703 10.5002L3.39036 6.74393M9.20006 6.50016L9.72739 5.98984C10.2895 5.4459 10.2968 4.54693 9.74375 3.99385L9.22391 3.47402C8.68351 2.93361 7.80957 2.92644 7.26038 3.45792L6.98022 3.72904\" />\n <path d=\"M3.49931 5.54525C2.36926 5.54516 1.45317 4.62914 1.453 3.49909C1.47001 2.37501 2.37788 1.46826 3.50198 1.45264C4.63212 1.45337 5.54769 2.37013 5.54695 3.50028C5.54621 4.63042 4.62945 5.54599 3.49931 5.54525\" />\n <path d=\"M4.30317 3.49902H2.69543\" />\n </svg>\n `;\n }\n})\nexport class IconAnchorRemove extends HTMLElement {\n declare requestRender: () => void;\n}\n","import { html } from 'lit-html';\n\nimport { Component } from '~/decorators/Component';\n\n@Component({\n tag: 'ease-icon-arrow-up',\n styles: `\n :host {\n display: block;\n width: 16px;\n height: 16px;\n fill: none;\n stroke: currentColor;\n stroke-width: 1.5;\n stroke-linecap: round;\n stroke-linejoin: round;\n }\n `,\n template() {\n return html`\n <svg viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M6.99992 12.6666V3.33331M6.99992 3.33331L2.33325 7.99998M6.99992 3.33331L11.6666 7.99998\" />\n </svg>\n `;\n }\n})\nexport class ArrowUp extends HTMLElement {\n declare requestRender: () => void;\n}\n","import { html } from 'lit-html';\n\nimport { Component } from '~/decorators/Component';\n\n@Component({\n tag: 'ease-icon-bezier',\n styles: `\n :host {\n display: block;\n width: var(--ease-icon-size, 12px);\n height: var(--ease-icon-size, 12px);\n fill: currentColor;\n }\n `,\n template() {\n return html`\n <svg viewBox=\"0 0 12 12\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M9.44279 8.84005C9.56156 9.00972 9.79538 9.05098 9.96505 8.93221C10.1347 8.81344 10.176 8.57962 10.0572 8.40995L9.75 8.625L9.44279 8.84005ZM1.94279 8.40995C1.82402 8.57962 1.86528 8.81344 2.03495 8.93221C2.20462 9.05098 2.43844 9.00972 2.55721 8.84005L2.25 8.625L1.94279 8.40995ZM7.21875 4.21875H6.84375C6.84375 4.68474 6.46599 5.0625 6 5.0625V5.4375V5.8125C6.8802 5.8125 7.59375 5.09895 7.59375 4.21875H7.21875ZM6 5.4375V5.0625C5.53401 5.0625 5.15625 4.68474 5.15625 4.21875H4.78125H4.40625C4.40625 5.09895 5.1198 5.8125 6 5.8125V5.4375ZM4.78125 4.21875H5.15625C5.15625 3.75276 5.53401 3.375 6 3.375V3V2.625C5.1198 2.625 4.40625 3.33855 4.40625 4.21875H4.78125ZM6 3V3.375C6.46599 3.375 6.84375 3.75276 6.84375 4.21875H7.21875H7.59375C7.59375 3.33855 6.8802 2.625 6 2.625V3ZM7.125 4.875L6.81779 5.09005L9.44279 8.84005L9.75 8.625L10.0572 8.40995L7.43221 4.65995L7.125 4.875ZM4.875 4.875L4.56779 4.65995L1.94279 8.40995L2.25 8.625L2.55721 8.84005L5.18221 5.09005L4.875 4.875Z\" />\n </svg>\n `;\n }\n})\nexport class IconBezier extends HTMLElement {\n declare requestRender: () => void;\n}\n","import { html } from 'lit-html';\n\nimport { Component } from '~/decorators/Component';\n\n@Component({\n tag: 'ease-icon-bezier-angle',\n styles: `\n :host {\n display: block;\n width: var(--ease-icon-size, 12px);\n height: var(--ease-icon-size, 12px);\n fill: currentColor;\n }\n `,\n template() {\n return html`\n <svg viewBox=\"0 0 12 12\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M1.875 4.21875C1.875 4.63296 1.53921 4.96875 1.125 4.96875C0.710786 4.96875 0.375 4.63296 0.375 4.21875C0.375 3.80454 0.710786 3.46875 1.125 3.46875C1.53921 3.46875 1.875 3.80454 1.875 4.21875Z\" fill-opacity=\"0.9\"/>\n <path d=\"M1.64062 4.21875C1.64062 3.93398 1.40977 3.70312 1.125 3.70312C0.840228 3.70312 0.609375 3.93398 0.609375 4.21875C0.609375 4.50352 0.840228 4.73438 1.125 4.73438C1.40977 4.73438 1.64062 4.50352 1.64062 4.21875ZM2.10938 4.21875C2.10938 4.76241 1.66866 5.20312 1.125 5.20312C0.581345 5.20312 0.140625 4.76241 0.140625 4.21875C0.140625 3.67509 0.581345 3.23438 1.125 3.23438C1.66866 3.23438 2.10938 3.67509 2.10938 4.21875Z\" />\n <path d=\"M9.23535 6.49023L8.76465 6.94727L6.88965 5.00977L7.36035 4.55273L9.23535 6.49023Z\" />\n <path d=\"M10.25 7.34375C10.25 7.75796 9.91421 8.09375 9.5 8.09375C9.08579 8.09375 8.75 7.75796 8.75 7.34375C8.75 6.92954 9.08579 6.59375 9.5 6.59375C9.91421 6.59375 10.25 6.92954 10.25 7.34375Z\" fill-opacity=\"0.9\"/>\n <path d=\"M10.0156 7.34375C10.0156 7.05898 9.78477 6.82812 9.5 6.82812C9.21523 6.82812 8.98438 7.05898 8.98438 7.34375C8.98438 7.62852 9.21523 7.85938 9.5 7.85938C9.78477 7.85938 10.0156 7.62852 10.0156 7.34375ZM10.4844 7.34375C10.4844 7.88741 10.0437 8.32812 9.5 8.32812C8.95634 8.32812 8.51562 7.88741 8.51562 7.34375C8.51562 6.80009 8.95634 6.35938 9.5 6.35938C10.0437 6.35938 10.4844 6.80009 10.4844 7.34375Z\" />\n <path d=\"M6.84375 4.21875C6.84375 3.75276 6.46599 3.375 6 3.375C5.53401 3.375 5.15625 3.75276 5.15625 4.21875C5.15625 4.68474 5.53401 5.0625 6 5.0625C6.46599 5.0625 6.84375 4.68474 6.84375 4.21875ZM7.59375 4.21875C7.59375 5.09895 6.8802 5.8125 6 5.8125C5.1198 5.8125 4.40625 5.09895 4.40625 4.21875C4.40625 3.33855 5.1198 2.625 6 2.625C6.8802 2.625 7.59375 3.33855 7.59375 4.21875Z\" />\n <path d=\"M1.5 9C1.5 6.96377 2.30291 5.79798 3.14746 5.15137C3.56202 4.83404 3.9757 4.65002 4.28613 4.54492C4.44174 4.49225 4.57289 4.45885 4.66699 4.43848C4.71396 4.42831 4.75192 4.42158 4.7793 4.41699C4.79301 4.41469 4.80424 4.41234 4.8125 4.41113C4.81637 4.41057 4.81967 4.41051 4.82227 4.41016C4.82361 4.40997 4.82519 4.40931 4.82617 4.40918H4.82812L4.92188 5.15332C4.91878 5.15377 4.91158 5.15487 4.90332 5.15625C4.8868 5.15902 4.86011 5.16334 4.8252 5.1709C4.75525 5.18605 4.6519 5.21238 4.52637 5.25488C4.27438 5.34019 3.93785 5.49035 3.60254 5.74707C2.94718 6.24896 2.25 7.19277 2.25 9C2.25 9.20711 2.08211 9.375 1.875 9.375C1.66789 9.375 1.5 9.20711 1.5 9ZM7.5127 9C7.5127 7.09758 7.32324 6.08783 7.15039 5.56738C7.06453 5.30889 6.98595 5.1804 6.94434 5.125C6.92803 5.1033 6.91762 5.09324 6.91504 5.09082C6.91648 5.09202 6.92022 5.09529 6.92676 5.09961C6.93038 5.102 6.93521 5.10442 6.94043 5.10742C6.94302 5.10891 6.94624 5.11071 6.94922 5.1123C6.95072 5.1131 6.9525 5.11442 6.9541 5.11523L6.95703 5.11621L6.95801 5.11719L7.29199 4.44531L7.29297 4.44629C7.29386 4.44673 7.29499 4.4468 7.2959 4.44727C7.29775 4.44821 7.29983 4.44917 7.30176 4.4502C7.30557 4.45222 7.30938 4.45469 7.31348 4.45703C7.32177 4.46178 7.33053 4.46749 7.33984 4.47363C7.35849 4.48593 7.37956 4.50097 7.40137 4.51953C7.44494 4.55668 7.49313 4.60714 7.54395 4.6748C7.64536 4.80983 7.75747 5.0154 7.8623 5.33105C8.07087 5.95905 8.2627 7.0587 8.2627 9C8.2627 9.20711 8.0948 9.375 7.8877 9.375C7.68065 9.37492 7.5127 9.20706 7.5127 9Z\" />\n <path d=\"M2.04004 3.89014H4.71004V4.55014H2.04004V3.89014Z\" />\n </svg>\n `;\n }\n})\nexport class IconBezierAngle extends HTMLElement {\n declare requestRender: () => void;\n}\n","import { html } from 'lit-html';\n\nimport { Component } from '~/decorators/Component';\n\n@Component({\n tag: 'ease-icon-bezier-distribute',\n styles: `\n :host {\n display: block;\n width: var(--ease-icon-size, 12px);\n height: var(--ease-icon-size, 12px);\n fill: currentColor;\n }\n `,\n template() {\n return html`\n <svg viewBox=\"0 0 12 12\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M5.125 5.64502C5.33211 5.64502 5.5 5.81291 5.5 6.02002C5.5 6.22713 5.33211 6.39502 5.125 6.39502H2.5C2.29289 6.39502 2.125 6.22713 2.125 6.02002C2.125 5.81291 2.29289 5.64502 2.5 5.64502H5.125Z\" />\n <path d=\"M2.125 6.02002C2.125 5.81313 1.95689 5.64502 1.75 5.64502C1.54311 5.64502 1.375 5.81313 1.375 6.02002C1.375 6.22691 1.54311 6.39502 1.75 6.39502C1.95689 6.39502 2.125 6.22691 2.125 6.02002ZM2.875 6.02002C2.875 6.64113 2.37111 7.14502 1.75 7.14502C1.12889 7.14502 0.625 6.64113 0.625 6.02002C0.625 5.39891 1.12889 4.89502 1.75 4.89502C2.37111 4.89502 2.875 5.39891 2.875 6.02002Z\" />\n <path d=\"M6.5 5.67285C6.5 5.60396 6.44389 5.54785 6.375 5.54785H5.625C5.55611 5.54785 5.5 5.60396 5.5 5.67285V6.42285C5.5 6.49174 5.55611 6.54785 5.625 6.54785H6.375C6.44389 6.54785 6.5 6.49174 6.5 6.42285V5.67285ZM7.25 6.42285C7.25 6.90596 6.85811 7.29785 6.375 7.29785H5.625C5.14189 7.29785 4.75 6.90596 4.75 6.42285V5.67285C4.75 5.18974 5.14189 4.79785 5.625 4.79785H6.375C6.85811 4.79785 7.25 5.18974 7.25 5.67285V6.42285Z\" />\n <path d=\"M3.125 9.25C3.125 9.18111 3.06889 9.125 3 9.125H2.25C2.18111 9.125 2.125 9.18111 2.125 9.25V10C2.125 10.0689 2.18111 10.125 2.25 10.125H3C3.06889 10.125 3.125 10.0689 3.125 10V9.25ZM3.875 10C3.875 10.4831 3.48311 10.875 3 10.875H2.25C1.76689 10.875 1.375 10.4831 1.375 10V9.25C1.375 8.76689 1.76689 8.375 2.25 8.375H3C3.48311 8.375 3.875 8.76689 3.875 9.25V10Z\" />\n <path d=\"M9.797 2C9.797 1.93111 9.74089 1.875 9.672 1.875H8.922C8.85285 1.875 8.797 1.93086 8.797 2V2.75C8.797 2.81889 8.8531 2.875 8.922 2.875H9.672C9.74089 2.875 9.797 2.81889 9.797 2.75V2ZM10.547 2.75C10.547 3.23311 10.1551 3.625 9.672 3.625H8.922C8.43889 3.625 8.047 3.23311 8.047 2.75V2C8.047 1.51714 8.43815 1.125 8.922 1.125H9.672C10.1551 1.125 10.547 1.51689 10.547 2V2.75Z\" />\n <path d=\"M9.33883 2.87576C9.54514 2.89263 9.69927 3.07377 9.68258 3.28005C9.56091 4.76814 8.50457 5.99034 7.09078 6.34255C6.88985 6.39261 6.6858 6.27003 6.6357 6.06912C6.58565 5.86818 6.70822 5.66414 6.90914 5.61404C8.01222 5.33926 8.83909 4.38526 8.93453 3.21951C8.9514 3.01316 9.1325 2.859 9.33883 2.87576Z\" />\n <path d=\"M9.5 5.60498C9.70711 5.60498 9.875 5.77287 9.875 5.97998C9.875 6.18709 9.70711 6.35498 9.5 6.35498H6.875C6.66789 6.35498 6.5 6.18709 6.5 5.97998C6.5 5.77287 6.66789 5.60498 6.875 5.60498H9.5Z\" />\n <path d=\"M10.625 5.97998C10.625 5.77309 10.4569 5.60498 10.25 5.60498C10.0431 5.60498 9.875 5.77309 9.875 5.97998C9.875 6.18687 10.0431 6.35498 10.25 6.35498C10.4569 6.35498 10.625 6.18687 10.625 5.97998ZM11.375 5.97998C11.375 6.60109 10.8711 7.10498 10.25 7.10498C9.62889 7.10498 9.125 6.60109 9.125 5.97998C9.125 5.35887 9.62889 4.85498 10.25 4.85498C10.8711 4.85498 11.375 5.35887 11.375 5.97998Z\" />\n <path d=\"M4.83132 5.65719C5.03226 5.60714 5.23631 5.72969 5.28639 5.93062C5.33644 6.13153 5.21382 6.33557 5.01296 6.3857C3.90988 6.66049 3.08301 7.61448 2.98757 8.78023C2.9707 8.98655 2.78956 9.14068 2.58327 9.12398C2.37696 9.10711 2.22283 8.92597 2.23952 8.71969C2.36119 7.23157 3.41749 6.00938 4.83132 5.65719Z\" />\n </svg>\n `;\n }\n})\nexport class IconBezierDistribute extends HTMLElement {\n declare requestRender: () => void;\n}\n","import { html } from 'lit-html';\n\nimport { Component } from '~/decorators/Component';\n\n@Component({\n tag: 'ease-icon-bezier-length',\n styles: `\n :host {\n display: block;\n width: var(--ease-icon-size, 12px);\n height: var(--ease-icon-size, 12px);\n fill: currentColor;\n }\n `,\n template() {\n return html`\n <svg viewBox=\"0 0 12 12\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M6.84375 4.21875C6.84375 3.75276 6.46599 3.375 6 3.375C5.53401 3.375 5.15625 3.75276 5.15625 4.21875C5.15625 4.68474 5.53401 5.0625 6 5.0625C6.46599 5.0625 6.84375 4.68474 6.84375 4.21875ZM7.59375 4.21875C7.59375 5.09895 6.8802 5.8125 6 5.8125C5.1198 5.8125 4.40625 5.09895 4.40625 4.21875C4.40625 3.33855 5.1198 2.625 6 2.625C6.8802 2.625 7.59375 3.33855 7.59375 4.21875Z\" />\n <path d=\"M2.48438 4.21875C2.48438 4.76241 2.04366 5.20312 1.5 5.20312C0.956345 5.20312 0.515625 4.76241 0.515625 4.21875C0.515625 3.67509 0.956345 3.23438 1.5 3.23438C2.04366 3.23438 2.48438 3.67509 2.48438 4.21875Z\" />\n <path d=\"M10.4844 4.21875C10.4844 4.76241 10.0437 5.20312 9.5 5.20312C8.95634 5.20312 8.51562 4.76241 8.51562 4.21875C8.51562 3.67509 8.95634 3.23438 9.5 3.23438C10.0437 3.23438 10.4844 3.67509 10.4844 4.21875Z\" />\n <path d=\"M1.5 9C1.5 6.96377 2.30291 5.79798 3.14746 5.15137C3.56202 4.83404 3.9757 4.65002 4.28613 4.54492C4.44174 4.49225 4.57289 4.45885 4.66699 4.43848C4.71396 4.42831 4.75192 4.42158 4.7793 4.41699C4.79301 4.41469 4.80424 4.41234 4.8125 4.41113C4.81637 4.41057 4.81967 4.41051 4.82227 4.41016L4.82617 4.40918H4.82812L4.92188 5.15332C4.91878 5.15377 4.91158 5.15487 4.90332 5.15625C4.8868 5.15902 4.86011 5.16334 4.8252 5.1709C4.75525 5.18605 4.6519 5.21238 4.52637 5.25488C4.27438 5.34019 3.93785 5.49035 3.60254 5.74707C2.94718 6.24896 2.25 7.19277 2.25 9C2.25 9.20711 2.08211 9.375 1.875 9.375C1.66789 9.375 1.5 9.20711 1.5 9ZM9.75 9C9.75 7.19277 9.05282 6.24896 8.39746 5.74707C8.06215 5.49035 7.72562 5.34019 7.47363 5.25488C7.3481 5.21238 7.24475 5.18605 7.1748 5.1709C7.13989 5.16334 7.1132 5.15902 7.09668 5.15625C7.08842 5.15487 7.0822 5.15377 7.0791 5.15332L7.17188 4.40918H7.17383L7.17773 4.41016C7.18033 4.41051 7.18363 4.41057 7.1875 4.41113C7.19576 4.41234 7.20699 4.41469 7.2207 4.41699C7.24808 4.42158 7.28604 4.42831 7.33301 4.43848C7.42711 4.45885 7.55826 4.49225 7.71387 4.54492C8.0243 4.65002 8.43798 4.83404 8.85254 5.15137C9.69709 5.79798 10.5 6.96377 10.5 9C10.5 9.20711 10.3321 9.375 10.125 9.375C9.91789 9.375 9.75 9.20711 9.75 9Z\" />\n <path d=\"M1.96997 3.83984H4.59997V4.49984H1.96997V3.83984Z\" />\n <path d=\"M6.96997 3.83984H8.59997V4.49984H6.96997V3.83984Z\" />\n </svg>\n `;\n }\n})\nexport class IconBezierLength extends HTMLElement {\n declare requestRender: () => void;\n}\n","import { html } from 'lit-html';\n\nimport { Component } from '~/decorators/Component';\n\n@Component({\n tag: 'ease-icon-bezier-mirror',\n styles: `\n :host {\n display: block;\n width: var(--ease-icon-size, 12px);\n height: var(--ease-icon-size, 12px);\n fill: currentColor;\n }\n `,\n template() {\n return html`\n <svg viewBox=\"0 0 12 12\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M6.84375 4.21875C6.84375 3.75276 6.46599 3.375 6 3.375C5.53401 3.375 5.15625 3.75276 5.15625 4.21875C5.15625 4.68474 5.53401 5.0625 6 5.0625C6.46599 5.0625 6.84375 4.68474 6.84375 4.21875ZM7.59375 4.21875C7.59375 5.09895 6.8802 5.8125 6 5.8125C5.1198 5.8125 4.40625 5.09895 4.40625 4.21875C4.40625 3.33855 5.1198 2.625 6 2.625C6.8802 2.625 7.59375 3.33855 7.59375 4.21875Z\" />\n <path d=\"M2.48438 4.21875C2.48438 4.76241 2.04366 5.20312 1.5 5.20312C0.956345 5.20312 0.515625 4.76241 0.515625 4.21875C0.515625 3.67509 0.956345 3.23438 1.5 3.23438C2.04366 3.23438 2.48438 3.67509 2.48438 4.21875Z\" />\n <path d=\"M11.4844 4.21875C11.4844 4.76241 11.0437 5.20312 10.5 5.20312C9.95634 5.20312 9.51562 4.76241 9.51562 4.21875C9.51562 3.67509 9.95634 3.23438 10.5 3.23438C11.0437 3.23438 11.4844 3.67509 11.4844 4.21875Z\" />\n <path d=\"M1.5 9C1.5 6.96377 2.30291 5.79798 3.14746 5.15137C3.56202 4.83404 3.9757 4.65002 4.28613 4.54492C4.44174 4.49225 4.57289 4.45885 4.66699 4.43848C4.71396 4.42831 4.75192 4.42158 4.7793 4.41699C4.79301 4.41469 4.80424 4.41234 4.8125 4.41113C4.81637 4.41057 4.81967 4.41051 4.82227 4.41016C4.82361 4.40997 4.82519 4.40931 4.82617 4.40918H4.82812L4.92188 5.15332C4.91878 5.15377 4.91158 5.15487 4.90332 5.15625C4.8868 5.15902 4.86011 5.16334 4.8252 5.1709C4.75525 5.18605 4.6519 5.21238 4.52637 5.25488C4.27438 5.34019 3.93785 5.49035 3.60254 5.74707C2.94718 6.24896 2.25 7.19277 2.25 9C2.25 9.20711 2.08211 9.375 1.875 9.375C1.66789 9.375 1.5 9.20711 1.5 9ZM9.75 9C9.75 7.19277 9.05282 6.24896 8.39746 5.74707C8.06215 5.49035 7.72562 5.34019 7.47363 5.25488C7.3481 5.21238 7.24475 5.18605 7.1748 5.1709C7.13989 5.16334 7.1132 5.15902 7.09668 5.15625C7.08842 5.15487 7.0822 5.15377 7.0791 5.15332L7.17188 4.40918H7.17383C7.17481 4.40931 7.17639 4.40997 7.17773 4.41016C7.18033 4.41051 7.18363 4.41057 7.1875 4.41113C7.19576 4.41234 7.20699 4.41469 7.2207 4.41699C7.24808 4.42158 7.28604 4.42831 7.33301 4.43848C7.42711 4.45885 7.55826 4.49225 7.71387 4.54492C8.0243 4.65002 8.43798 4.83404 8.85254 5.15137C9.69709 5.79798 10.5 6.96377 10.5 9C10.5 9.20711 10.3321 9.375 10.125 9.375C9.91789 9.375 9.75 9.20711 9.75 9Z\" />\n <path d=\"M1.96997 3.83984H4.59997V4.49984H1.96997V3.83984Z\" />\n <path d=\"M6.96997 3.83984H9.59997V4.49984H6.96997V3.83984Z\" />\n </svg>\n `;\n }\n})\nexport class IconBezierMirror extends HTMLElement {\n declare requestRender: () => void;\n}\n","import { html } from 'lit-html';\n\nimport { Component } from '~/decorators/Component';\n\n@Component({\n tag: 'ease-icon-check',\n styles: `\n :host {\n display: block;\n width: 12px;\n height: 12px;\n fill: none;\n stroke: currentColor;\n stroke-width: 1.5;\n stroke-linecap: round;\n stroke-linejoin: round;\n }\n `,\n template() {\n return html`\n <svg viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M3 6.5L5.33333 9L10 4\" path-length=\"100\" />\n </svg>\n `;\n }\n})\nexport class IconCheck extends HTMLElement {\n declare requestRender: () => void;\n}\n","import { html } from 'lit-html';\n\nimport { Component } from '~/decorators/Component';\n\n@Component({\n tag: 'ease-icon-circle-arrow-left',\n styles: `\n :host {\n display: block;\n width: 16px;\n height: 16px;\n fill: none;\n stroke: currentColor;\n stroke-width: 1.5;\n stroke-linecap: round;\n stroke-linejoin: round;\n }\n `,\n template() {\n return html`\n <svg viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M14.6667 6.66667C14.6667 6.66667 13.33 4.84548 12.2441 3.75883C11.1582 2.67218 9.6576 2 8 2C4.68629 2 2 4.68629 2 8C2 11.3137 4.68629 14 8 14C10.7354 14 13.0433 12.1695 13.7655 9.66667M14.6667 6.66667V2.66667M14.6667 6.66667H10.6667\" />\n </svg>\n `;\n }\n})\nexport class IconCircleArrowLeft extends HTMLElement {\n declare requestRender: () => void;\n}\n","import { html } from 'lit-html';\n\nimport { Component } from '~/decorators/Component';\n\n@Component({\n tag: 'ease-icon-circle-arrow-right',\n styles: `\n :host {\n display: block;\n width: 16px;\n height: 16px;\n fill: none;\n stroke: currentColor;\n stroke-width: 1.5;\n stroke-linecap: round;\n stroke-linejoin: round;\n }\n `,\n template() {\n return html`\n <svg viewBox=\"0 0 16 16\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M1.33333 6.66667C1.33333 6.66667 2.66999 4.84548 3.75589 3.75883C4.84179 2.67218 6.3424 2 8 2C11.3137 2 14 4.68629 14 8C14 11.3137 11.3137 14 8 14C5.2646 14 2.95674 12.1695 2.23451 9.66667M1.33333 6.66667V2.66667M1.33333 6.66667H5.33333\" />\n </svg>\n `;\n }\n})\nexport class IconCircleArrowRight extends HTMLElement {\n declare requestRender: () => void;\n}\n","import { html } from 'lit-html';\n\nimport { Component } from '~/decorators/Component';\n\n@Component({\n tag: 'ease-icon-code',\n styles: `\n :host {\n display: block;\n width: 12px;\n height: 12px;\n fill: none;\n stroke: currentColor;\n stroke-width: 1.5;\n stroke-linecap: round;\n stroke-linejoin: round;\n }\n `,\n template() {\n return html`\n <svg viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M8 9L11 6L8 3M4 3L1 6L4 9\" />\n </svg>\n `;\n }\n})\nexport class IconCode extends HTMLElement {\n declare requestRender: () => void;\n}\n","import { html } from 'lit-html';\n\nimport { Component } from '~/decorators/Component';\n\n@Component({\n tag: 'ease-icon-dots',\n styles: `\n :host {\n display: block;\n width: 16px;\n height: 16px;\n fill: none;\n stroke: currentColor;\n stroke-width: 1.5;\n stroke-linecap: round;\n stroke-linejoin: round;\n }\n `,\n template() {\n return html`\n <svg viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M8.00008 8.66655C8.36827 8.66655 8.66675 8.36808 8.66675 7.99989C8.66675 7.6317 8.36827 7.33322 8.00008 7.33322C7.63189 7.33322 7.33341 7.6317 7.33341 7.99989C7.33341 8.36808 7.63189 8.66655 8.00008 8.66655Z\" />\n <path d=\"M12.6667 8.66655C13.0349 8.66655 13.3334 8.36808 13.3334 7.99989C13.3334 7.6317 13.0349 7.33322 12.6667 7.33322C12.2986 7.33322 12.0001 7.6317 12.0001 7.99989C12.0001 8.36808 12.2986 8.66655 12.6667 8.66655Z\" />\n <path d=\"M3.33341 8.66655C3.7016 8.66655 4.00008 8.36808 4.00008 7.99989C4.00008 7.6317 3.7016 7.33322 3.33341 7.33322C2.96522 7.33322 2.66675 7.6317 2.66675 7.99989C2.66675 8.36808 2.96522 8.66655 3.33341 8.66655Z\" />\n </svg>\n `;\n }\n})\nexport class IconDots extends HTMLElement {\n declare requestRender: () => void;\n}\n","import { html } from 'lit-html';\n\nimport { Component } from '~/decorators/Component';\n\n@Component({\n tag: 'ease-icon-mention',\n styles: `\n :host {\n display: block;\n width: 16px;\n height: 16px;\n fill: none;\n stroke: currentColor;\n stroke-width: 1.5;\n stroke-linecap: round;\n stroke-linejoin: round;\n }\n `,\n template() {\n return html`\n <svg viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M10.4 5.59963V8.59962C10.4 9.07701 10.5896 9.53485 10.9272 9.87242C11.2648 10.21 11.7226 10.3996 12.2 10.3996C12.6774 10.3996 13.1352 10.21 13.4728 9.87242C13.8104 9.53485 14 9.07701 14 8.59962V7.99962C13.9999 6.64544 13.5417 5.33111 12.7 4.27035C11.8582 3.20958 10.6823 2.46476 9.36359 2.15701C8.04484 1.84925 6.66076 1.99665 5.43641 2.57525C4.21206 3.15384 3.21944 4.1296 2.61996 5.34386C2.02048 6.55812 1.84939 7.93947 2.13451 9.26329C2.41963 10.5871 3.14419 11.7756 4.19038 12.6354C5.23657 13.4952 6.54286 13.9758 7.89684 13.9991C9.25083 14.0224 10.5729 13.587 11.648 12.7636M10.4 7.99962C10.4 9.32511 9.32549 10.3996 8 10.3996C6.67452 10.3996 5.6 9.32511 5.6 7.99962C5.6 6.67414 6.67452 5.59963 8 5.59963C9.32549 5.59963 10.4 6.67414 10.4 7.99962Z\" />\n </svg>\n `;\n }\n})\nexport class IconMention extends HTMLElement {\n declare requestRender: () => void;\n}\n","import { html } from 'lit-html';\n\nimport { Component } from '~/decorators/Component';\n\n@Component({\n tag: 'ease-icon-minus',\n styles: `\n :host {\n display: block;\n width: 16px;\n height: 16px;\n fill: none;\n stroke: currentColor;\n stroke-width: 1.5;\n stroke-linecap: round;\n stroke-linejoin: round;\n }\n `,\n template() {\n return html`\n <svg viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M5 7.99995H11\" />\n </svg>\n `;\n }\n})\nexport class IconMinus extends HTMLElement {\n declare requestRender: () => void;\n}\n","import { html } from 'lit-html';\n\nimport { Component } from '~/decorators/Component';\n\n@Component({\n tag: 'ease-icon-plus',\n styles: `\n :host {\n display: block;\n width: 16px;\n height: 16px;\n fill: none;\n stroke: currentColor;\n stroke-width: 1.5;\n stroke-linecap: round;\n stroke-linejoin: round;\n }\n `,\n template() {\n return html`\n <svg viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M8.00018 4.28591C8.00018 4.28591 8.00018 8.42263 8.00018 11.714M4.28613 7.99995H11.7142\" />\n </svg>\n `;\n }\n})\nexport class IconPlus extends HTMLElement {\n declare requestRender: () => void;\n}\n","import { html } from 'lit-html';\n\nimport { Component } from '~/decorators/Component';\n\n@Component({\n tag: 'ease-icon-settings',\n styles: `\n :host {\n display: block;\n width: 16px;\n height: 16px;\n fill: none;\n stroke: currentColor;\n stroke-width: 1.5;\n stroke-linecap: round;\n stroke-linejoin: round;\n }\n `,\n template() {\n return html`\n <svg viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M2 5.33319L10 5.33319M10 5.33319C10 6.43776 10.8954 7.33319 12 7.33319C13.1046 7.33319 14 6.43776 14 5.33319C14 4.22862 13.1046 3.33319 12 3.33319C10.8954 3.33319 10 4.22862 10 5.33319ZM6 10.6665L14 10.6665M6 10.6665C6 11.7711 5.10457 12.6665 4 12.6665C2.89543 12.6665 2 11.7711 2 10.6665C2 9.56195 2.89543 8.66652 4 8.66652C5.10457 8.66652 6 9.56195 6 10.6665Z\" />\n </svg>\n `;\n }\n})\nexport class Settings extends HTMLElement {\n declare requestRender: () => void;\n}\n","import { html } from 'lit-html';\n\nimport { Component } from '~/decorators/Component';\nimport { Prop } from '~/decorators/Prop';\n\ntype LogoLoaderState = 'idle' | 'intro' | 'loop' | 'exit';\n\nexport type LogoIntroVariant = 'wave' | 'particle';\n\ninterface DotData {\n id: string;\n cx: number;\n cy: number;\n}\n\nconst CENTER = { x: 74, y: 74 };\n\nconst DOTS_DATA: DotData[] = [\n { id: 'dot-1', cx: 7.22725, cy: 73.99975 },\n { id: 'dot-2', cx: 8.0, cy: 107.63685 },\n { id: 'dot-3', cx: 41.36365, cy: 7.72734 },\n { id: 'dot-4', cx: 40.36105, cy: 40.36375 },\n { id: 'dot-5', cx: 40.36105, cy: 107.63625 },\n { id: 'dot-6', cx: 41.36365, cy: 140.77285 },\n { id: 'dot-7', cx: 73.99995, cy: 7.22725 },\n { id: 'dot-8', cx: 73.99995, cy: 140.77325 },\n { id: 'dot-9', cx: 108.13785, cy: 7.72734 },\n { id: 'dot-10', cx: 107.88425, cy: 73.99975 },\n { id: 'dot-11', cx: 108.13785, cy: 140.77285 },\n { id: 'dot-12', cx: 141.27285, cy: 40.86385 },\n { id: 'dot-13', cx: 140.77225, cy: 73.99975 },\n { id: 'dot-14', cx: 141.27285, cy: 107.63685 },\n { id: 'dot-15', cx: 40.36165, cy: 73.99925 },\n { id: 'dot-16', cx: 74.00125, cy: 40.36345 },\n { id: 'dot-17', cx: 74.00125, cy: 73.99925 },\n { id: 'dot-18', cx: 74.00125, cy: 107.63585 },\n { id: 'dot-19', cx: 107.63485, cy: 40.36345 },\n { id: 'dot-20', cx: 107.63485, cy: 107.63585 },\n { id: 'dot-21', cx: 141.77, cy: 8.23 },\n { id: 'dot-22', cx: 141.77, cy: 140.77 },\n { id: 'dot-23', cx: 7.73019, cy: 140.77 },\n { id: 'dot-24', cx: 7.72018, cy: 8.22 },\n { id: 'dot-25', cx: 7.73518, cy: 40.865 }\n];\n\nconst INNER_DOT_IDS = ['dot-19', 'dot-20', 'dot-18', 'dot-15', 'dot-17', 'dot-16'];\n\nconst OUTER_DOT_IDS = DOTS_DATA.map((d) => d.id).filter((id) => !INNER_DOT_IDS.includes(id));\n\nconst forceReflow = (el: Element): void => {\n void window.getComputedStyle(el).opacity;\n};\n\nconst getAngle = (dot: DotData): number => Math.atan2(dot.cy - CENTER.y, dot.cx - CENTER.x);\n\nconst sortByAngle = (ids: string[]): DotData[] =>\n ids\n .map((id) => DOTS_DATA.find((d) => d.id === id))\n .filter((dot): dot is DotData => dot != null)\n .sort((a, b) => getAngle(a) - getAngle(b));\n\nconst LOOP_DURATION = 1500;\nconst ROTATION_DURATION = 600;\n\n@Component({\n tag: 'ease-logo-loader',\n styles: `\n :host {\n display: inline-block;\n --ease-out: cubic-bezier(0.22, 0.61, 0.36, 1);\n --ease-in-out: cubic-bezier(0.45, 0, 0.55, 1);\n --ease-overshoot: cubic-bezier(0.34, 1.56, 0.64, 1);\n \n --dot-dark: var(--color-gray-0, oklab(98.81% 0 0));\n --dot-medium: var(--color-gray-600, oklab(65.21% -0.0019 -0.0144));\n --dot-light: var(--color-gray-700, oklab(37.92% -0.0006 -0.0179));\n --dot-accent: var(--color-blue-600, oklab(76.85% 0.0462 -0.1115));\n }\n\n .logo-loader {\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--logo-loader-size, 36px);\n height: var(--logo-loader-size, 36px);\n }\n\n .logo-loader__svg {\n width: 100%;\n height: 100%;\n display: block;\n transform-origin: center;\n overflow: visible;\n }\n\n .logo-loader__svg rect {\n transform-box: fill-box;\n transform-origin: center;\n transition:\n transform 380ms var(--ease-out),\n fill 320ms ease,\n opacity 320ms ease;\n }\n\n /* State: intro - dots are animating in */\n .logo-loader[data-state='intro'] .logo-loader__svg rect {\n opacity: 0;\n transform: scale(0);\n }\n\n /* Outer dots loading animation */\n @keyframes loading-outer {\n 0%, 100% {\n transform: scale(var(--base-scale, 1));\n fill: var(--dot-light);\n opacity: 0.4;\n }\n 15% {\n transform: scale(calc(var(--base-scale, 1) * 1.35));\n fill: var(--dot-dark);\n opacity: 1;\n }\n 35% {\n transform: scale(var(--base-scale, 1));\n fill: var(--dot-medium);\n opacity: 0.8;\n }\n }\n\n /* Inner dots loading animation */\n @keyframes loading-inner {\n 0%, 100% {\n transform: scale(var(--base-scale, 0.6));\n opacity: 0.7;\n fill: var(--dot-medium);\n }\n 50% {\n transform: scale(calc(var(--base-scale, 0.6) * 1.9));\n opacity: 0.1;\n fill: var(--dot-light);\n }\n }\n\n .dot-loading {\n animation-name: loading-outer;\n animation-duration: 600ms;\n animation-timing-function: cubic-bezier(0.3, 0.6, 0.4, 1);\n animation-iteration-count: infinite;\n animation-fill-mode: both;\n animation-delay: var(--delay, 0ms);\n }\n\n .dot-loading-inner {\n animation-name: loading-inner;\n animation-duration: 1500ms;\n animation-timing-function: ease-in-out;\n animation-iteration-count: infinite;\n animation-fill-mode: both;\n animation-delay: var(--delay, 0ms);\n }\n\n /* Exit animation class */\n .restoring {\n transition:\n transform 450ms cubic-bezier(0.25, 0, 0.5, 1),\n fill 350ms ease,\n opacity 350ms ease;\n }\n\n /* Particle intro animation */\n @keyframes particle-bounce {\n 0% { transform: scale(1); }\n 40% { transform: scale(1.25); }\n 65% { transform: scale(0.95); }\n 85% { transform: scale(1.05); }\n 100% { transform: scale(1); }\n }\n\n .particle-bounce {\n animation: particle-bounce 400ms var(--ease-overshoot) both;\n }\n\n /* Shockwave ring animation */\n @keyframes shockwave-expansion {\n 0% {\n transform: scale(1);\n opacity: 1;\n stroke-width: 1.5px;\n }\n 100% {\n transform: scale(4);\n opacity: 0;\n stroke-width: 0.5px;\n }\n }\n\n .shockwave-ring {\n fill: none;\n stroke: var(--dot-dark);\n transform-box: fill-box;\n transform-origin: center;\n animation: shockwave-expansion 900ms cubic-bezier(0.165, 0.84, 0.44, 1) both;\n }\n\n /* Pulse wave for intro */\n @keyframes pulse-wave {\n 0% {\n transform: scale(1);\n filter: brightness(1);\n }\n 50% {\n transform: scale(1.2);\n filter: brightness(1.6);\n fill: var(--dot-light);\n }\n 100% {\n transform: scale(1);\n filter: brightness(1);\n }\n }\n\n .dot-pulse-wave {\n animation: pulse-wave var(--pulse-duration, 500ms) var(--pulse-delay, 0ms) cubic-bezier(0.455, 0.03, 0.515, 0.955);\n }\n\n @media (prefers-reduced-motion: reduce) {\n .logo-loader__svg {\n transition: none;\n transform: scale(1);\n }\n .logo-loader__svg rect {\n animation: none !important;\n transition: none;\n transform: scale(1);\n opacity: 1;\n }\n }\n `,\n template(host: LogoLoader) {\n const size = host.size ?? 36;\n const state = host.state;\n const ariaLabel = host.ariaLabel;\n const ariaLabelTrimmed = ariaLabel?.trim() ?? '';\n\n return html`\n <div\n class=\"logo-loader\"\n data-state=${state}\n style=${`--logo-loader-size:${size}px;`}\n >\n <svg\n viewBox=\"0 0 148 148\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"logo-loader__svg\"\n role=${ariaLabelTrimmed ? 'img' : null}\n aria-label=${ariaLabelTrimmed || null}\n aria-hidden=${ariaLabelTrimmed ? null : 'true'}\n focusable=${ariaLabelTrimmed ? null : 'false'}\n >\n <g class=\"shockwave-container\"></g>\n \n <rect id=\"dot-1\" x=\"0.5\" y=\"67.2725\" width=\"13.4545\" height=\"13.4545\" rx=\"6.72727\" fill=\"var(--dot-medium)\" />\n <rect id=\"dot-2\" x=\"3.5\" y=\"103.152\" width=\"8.9697\" height=\"8.9697\" rx=\"4.48485\" fill=\"var(--dot-medium)\" />\n <rect id=\"dot-3\" x=\"36.8788\" y=\"3.24249\" width=\"8.9697\" height=\"8.9697\" rx=\"4.48485\" fill=\"var(--dot-medium)\" />\n <rect id=\"dot-4\" x=\"33.6338\" y=\"33.6365\" width=\"13.4545\" height=\"13.4545\" rx=\"6.72727\" fill=\"var(--dot-medium)\" />\n <rect id=\"dot-5\" x=\"33.6338\" y=\"100.909\" width=\"13.4545\" height=\"13.4545\" rx=\"6.72727\" fill=\"var(--dot-medium)\" />\n <rect id=\"dot-6\" x=\"36.8788\" y=\"136.288\" width=\"8.9697\" height=\"8.9697\" rx=\"4.48485\" fill=\"var(--dot-medium)\" />\n <rect id=\"dot-7\" x=\"67.2727\" y=\"0.5\" width=\"13.4545\" height=\"13.4545\" rx=\"6.72727\" fill=\"var(--dot-light)\" />\n <rect id=\"dot-8\" x=\"67.2727\" y=\"134.046\" width=\"13.4545\" height=\"13.4545\" rx=\"6.72727\" fill=\"var(--dot-medium)\" />\n <rect id=\"dot-9\" x=\"103.653\" y=\"3.24249\" width=\"8.9697\" height=\"8.9697\" rx=\"4.48485\" fill=\"var(--dot-medium)\" />\n <rect id=\"dot-10\" x=\"101.407\" y=\"67.2725\" width=\"13.4545\" height=\"13.4545\" rx=\"6.72727\" fill=\"var(--dot-medium)\" />\n <rect id=\"dot-11\" x=\"103.653\" y=\"136.288\" width=\"8.9697\" height=\"8.9697\" rx=\"4.48485\" fill=\"var(--dot-light)\" />\n <rect id=\"dot-12\" x=\"136.788\" y=\"36.379\" width=\"8.9697\" height=\"8.9697\" rx=\"4.48485\" fill=\"var(--dot-light)\" />\n <rect id=\"dot-13\" x=\"134.045\" y=\"67.2725\" width=\"13.4545\" height=\"13.4545\" rx=\"6.72727\" fill=\"var(--dot-light)\" />\n <rect id=\"dot-14\" x=\"136.788\" y=\"103.152\" width=\"8.9697\" height=\"8.9697\" rx=\"4.48485\" fill=\"var(--dot-light)\" />\n \n <rect id=\"dot-15\" x=\"26.9071\" y=\"60.5447\" width=\"26.9091\" height=\"26.9091\" rx=\"13.4545\" fill=\"var(--dot-dark)\" />\n <rect id=\"dot-16\" x=\"60.5467\" y=\"26.9089\" width=\"26.9091\" height=\"26.9091\" rx=\"13.4545\" fill=\"var(--dot-dark)\" />\n <rect id=\"dot-17\" x=\"60.5467\" y=\"60.5447\" width=\"26.9091\" height=\"26.9091\" rx=\"13.4545\" fill=\"var(--dot-dark)\" />\n <rect id=\"dot-18\" x=\"60.5467\" y=\"94.1813\" width=\"26.9091\" height=\"26.9091\" rx=\"13.4545\" fill=\"var(--dot-dark)\" />\n <rect id=\"dot-19\" x=\"94.1803\" y=\"26.9089\" width=\"26.9091\" height=\"26.9091\" rx=\"13.4545\" fill=\"var(--dot-dark)\" />\n <rect id=\"dot-20\" x=\"94.1803\" y=\"94.1813\" width=\"26.9091\" height=\"26.9091\" rx=\"13.4545\" fill=\"var(--dot-dark)\" />\n \n <rect id=\"dot-21\" x=\"139.53\" y=\"5.98999\" width=\"4.48\" height=\"4.48\" rx=\"2.24\" fill=\"var(--dot-light)\" />\n <rect id=\"dot-22\" x=\"139.53\" y=\"138.53\" width=\"4.48\" height=\"4.48\" rx=\"2.24\" fill=\"var(--dot-light)\" />\n <rect id=\"dot-23\" x=\"5.49019\" y=\"138.53\" width=\"4.48\" height=\"4.48\" rx=\"2.24\" fill=\"var(--dot-light)\" />\n <rect id=\"dot-24\" x=\"5.48018\" y=\"5.97998\" width=\"4.48\" height=\"4.48\" rx=\"2.24\" fill=\"var(--dot-light)\" />\n <rect id=\"dot-25\" x=\"4.37018\" y=\"37.5\" width=\"6.73\" height=\"6.73\" rx=\"3.365\" fill=\"var(--dot-light)\" />\n </svg>\n </div>\n `;\n }\n})\nexport class LogoLoader extends HTMLElement {\n declare requestRender: () => void;\n\n @Prop<boolean, LogoLoader>({\n type: Boolean,\n attribute: 'loading',\n defaultValue: false,\n onChange(next) {\n (this as LogoLoader).handleLoadingChange(next);\n }\n })\n accessor loading = false;\n\n @Prop<LogoIntroVariant, LogoLoader>({\n type: 'string',\n attribute: 'intro',\n defaultValue: 'wave'\n })\n accessor intro: LogoIntroVariant = 'wave';\n\n @Prop<number | null, LogoLoader>({\n type: Number,\n attribute: 'size',\n defaultValue: 36\n })\n accessor size: number | null = 36;\n\n @Prop<string | null, LogoLoader>({\n type: 'string',\n attribute: 'aria-label',\n defaultValue: null\n })\n accessor ariaLabel: string | null = null;\n\n #state: LogoLoaderState = 'intro';\n #loopStartTime = 0;\n #animationTimers: number[] = [];\n #introCompleted = false;\n\n get state(): LogoLoaderState {\n return this.#state;\n }\n\n set state(value: LogoLoaderState) {\n if (this.#state === value) {\n return;\n }\n this.#state = value;\n if (typeof this.requestRender === 'function') {\n this.requestRender();\n }\n }\n\n connectedCallback(): void {\n // Wait for first render before starting intro animation\n // The Component decorator renders after connectedCallback via requestAnimationFrame\n requestAnimationFrame(() => {\n // Double RAF to ensure render is complete\n requestAnimationFrame(() => {\n if (this.loading) {\n this.#runIntro(() => {\n this.#introCompleted = true;\n this.#startLoopAnimation();\n });\n } else {\n this.#runIntro(() => {\n this.#introCompleted = true;\n this.state = 'idle';\n });\n }\n });\n });\n }\n\n disconnectedCallback(): void {\n this.#clearTimers();\n }\n\n #clearTimers(): void {\n for (const id of this.#animationTimers) {\n window.clearTimeout(id);\n }\n this.#animationTimers = [];\n }\n\n #setTimeout(fn: () => void, delay: number): number {\n const id = window.setTimeout(fn, delay);\n this.#animationTimers.push(id);\n return id;\n }\n\n #getDot(id: string): SVGRectElement | null {\n const svg = this.shadowRoot?.querySelector('.logo-loader__svg');\n return svg?.querySelector(`#${id}`) as SVGRectElement | null;\n }\n\n #getShockwaveContainer(): SVGGElement | null {\n return this.shadowRoot?.querySelector('.shockwave-container') as SVGGElement | null;\n }\n\n #resetDotsState(instant = false, keepOpacity = false): void {\n const container = this.#getShockwaveContainer();\n if (container) {\n container.innerHTML = '';\n }\n\n for (const dot of DOTS_DATA) {\n const el = this.#getDot(dot.id);\n if (!el) {\n continue;\n }\n\n if (instant) {\n el.style.transition = 'none';\n } else {\n el.style.transition = '';\n }\n\n // Remove all animation classes\n el.classList.remove('dot-loading', 'dot-loading-inner', 'restoring', 'dot-pulse-wave', 'particle-bounce');\n\n el.style.removeProperty('--base-scale');\n el.style.removeProperty('--delay');\n el.style.removeProperty('--pulse-delay');\n el.style.removeProperty('--pulse-duration');\n\n // Reset inline styles\n el.style.transform = 'scale(1)';\n\n if (!keepOpacity) {\n el.style.opacity = instant ? '1' : '';\n }\n el.style.removeProperty('fill');\n el.style.removeProperty('filter');\n\n if (instant) {\n forceReflow(el);\n el.style.removeProperty('transition');\n }\n }\n }\n\n /** Ensure all dots are visible */\n #ensureVisibility(): void {\n for (const dot of DOTS_DATA) {\n const el = this.#getDot(dot.id);\n if (el && (el.style.opacity === '0' || el.style.opacity === '')) {\n el.style.transition = 'opacity 200ms ease-out';\n el.style.opacity = '1';\n }\n }\n }\n\n /** Run wave intro animation */\n #runWaveIntro(onComplete?: () => void): void {\n this.state = 'intro';\n\n // Prepare dots hidden\n for (const dot of DOTS_DATA) {\n const el = this.#getDot(dot.id);\n if (!el) {\n continue;\n }\n el.style.transition = 'none';\n el.style.opacity = '0';\n el.style.transform = 'scale(0)';\n forceReflow(el);\n }\n\n const innerDotIds = new Set(INNER_DOT_IDS);\n const innerDots = DOTS_DATA.filter((d) => innerDotIds.has(d.id));\n const outerDots = DOTS_DATA.filter((d) => !innerDotIds.has(d.id));\n\n // WAVE 1: Inner dots appear at half scale\n const orderedInner = sortByAngle(innerDots.map((d) => d.id));\n orderedInner.forEach((dot, index) => {\n const el = this.#getDot(dot.id);\n if (!el) {\n return;\n }\n\n el.style.fill = 'var(--dot-medium)';\n forceReflow(el);\n el.style.removeProperty('transition');\n\n const delay = index * 75;\n this.#setTimeout(() => {\n el.style.transition = 'transform 500ms cubic-bezier(0.175, 0.885, 0.32, 1.275), opacity 400ms ease-out';\n el.style.opacity = '1';\n el.style.transform = 'scale(0.5)';\n }, delay);\n });\n\n // WAVE 2: Inner to full scale + outer appear\n this.#setTimeout(() => {\n // Inner dots to full scale\n orderedInner.forEach((dot, index) => {\n const el = this.#getDot(dot.id);\n if (!el) {\n return;\n }\n\n const delay = index * 65;\n this.#setTimeout(() => {\n el.style.transition = 'transform 600ms cubic-bezier(0.34, 1.56, 0.64, 1), fill 450ms ease-out';\n el.style.transform = 'scale(1)';\n el.style.removeProperty('fill');\n }, delay);\n });\n\n // Outer dots appear\n const orderedOuter = sortByAngle(outerDots.map((d) => d.id));\n orderedOuter.forEach((dot, index) => {\n const el = this.#getDot(dot.id);\n if (!el) {\n return;\n }\n\n el.style.removeProperty('transition');\n const delay = 150 + index * 40;\n this.#setTimeout(() => {\n el.style.transition = 'transform 650ms cubic-bezier(0.34, 1.56, 0.64, 1), opacity 550ms ease-out';\n el.style.opacity = '1';\n el.style.transform = 'scale(1)';\n }, delay);\n });\n }, 650);\n\n // Completion\n this.#setTimeout(() => {\n onComplete?.();\n }, 1400);\n }\n\n /** Run particle intro animation */\n #runParticleIntro(onComplete?: () => void): void {\n this.state = 'intro';\n\n // Prepare dots hidden\n for (const dot of DOTS_DATA) {\n const el = this.#getDot(dot.id);\n if (!el) {\n continue;\n }\n el.style.transition = 'none';\n el.style.opacity = '0';\n el.style.transform = 'scale(0)';\n forceReflow(el);\n }\n\n const innerDotIds = new Set(INNER_DOT_IDS);\n\n // Create particle animation data\n const particles = DOTS_DATA.map((dot, index) => {\n const finalAngle = getAngle(dot);\n const startDistance = 110 + Math.random() * 80;\n const angleVariation = (Math.random() - 0.5) * Math.PI * 0.35;\n const startAngle = finalAngle + angleVariation;\n const startX = Math.cos(startAngle) * startDistance;\n const startY = Math.sin(startAngle) * startDistance;\n\n const curvature = Math.random() * 0.4 + 0.3;\n const controlAngle = startAngle + (Math.random() - 0.5) * Math.PI * curvature;\n const controlDistance = startDistance * 0.6;\n const controlX = Math.cos(controlAngle) * controlDistance;\n const controlY = Math.sin(controlAngle) * controlDistance;\n\n const group = Math.floor(index / 5);\n const groupDelay = group * 110;\n const withinGroupDelay = (index % 5) * 40;\n const delay = groupDelay + withinGroupDelay + Math.random() * 40;\n const duration = 600 + Math.random() * 300;\n\n return {\n ...dot,\n startX,\n startY,\n controlX,\n controlY,\n delay,\n duration,\n impactTime: delay + duration,\n rotationSpeed: 720 + Math.random() * 360,\n isInner: innerDotIds.has(dot.id)\n };\n });\n\n particles.sort((a, b) => a.delay - b.delay);\n\n // First 3 inner dots for shockwaves\n const shockwaveParticles = particles\n .filter((p) => p.isInner)\n .sort((a, b) => a.impactTime - b.impactTime)\n .slice(0, 3);\n const shockwaveSet = new Set(shockwaveParticles.map((p) => p.id));\n\n // Animate each particle\n for (const particle of particles) {\n const el = this.#getDot(particle.id);\n if (!el) {\n continue;\n }\n\n el.style.transform = `translate(${particle.startX}px, ${particle.startY}px) scale(0.05)`;\n\n this.#setTimeout(() => {\n el.style.opacity = '1';\n\n const steps = 30;\n let step = 0;\n\n const animateStep = (): void => {\n step++;\n const progress = step / steps;\n const t = progress;\n const mt = 1 - t;\n\n const x = mt * mt * particle.startX + 2 * mt * t * particle.controlX + t * t * 0;\n const y = mt * mt * particle.startY + 2 * mt * t * particle.controlY + t * t * 0;\n\n const easeOut = 1 - (1 - progress) ** 4;\n const scale = 0.05 + easeOut * 0.95;\n const rotation = progress * particle.rotationSpeed;\n\n el.style.transition = 'transform 33ms linear';\n el.style.transform = `translate(${x}px, ${y}px) scale(${scale}) rotate(${rotation}deg)`;\n\n if (step < steps) {\n requestAnimationFrame(animateStep);\n } else {\n // Impact - clear all transforms\n const bounceDuration = 250;\n el.style.transition = `transform ${bounceDuration}ms cubic-bezier(0.34, 1.56, 0.64, 1)`;\n el.style.transform = 'scale(1)';\n\n if (shockwaveSet.has(particle.id)) {\n this.#triggerShockwave(particle);\n }\n\n this.#setTimeout(() => {\n el.classList.add('particle-bounce');\n this.#setTimeout(() => {\n el.classList.remove('particle-bounce');\n }, 400);\n }, bounceDuration);\n }\n };\n\n requestAnimationFrame(animateStep);\n }, particle.delay);\n }\n\n // Early completion\n const earlyRevealTime = Math.max(...particles.map((p) => p.delay)) * 0.6;\n this.#setTimeout(() => {\n onComplete?.();\n }, earlyRevealTime);\n\n // Final cleanup\n const maxTime = Math.max(...particles.map((p) => p.impactTime + 500));\n this.#setTimeout(() => {\n this.#resetDotsState(false, true);\n }, maxTime);\n }\n\n #triggerShockwave(dot: DotData): void {\n const container = this.#getShockwaveContainer();\n if (!container) {\n return;\n }\n\n const ring = document.createElementNS('http://www.w3.org/2000/svg', 'circle');\n ring.setAttribute('cx', String(dot.cx));\n ring.setAttribute('cy', String(dot.cy));\n ring.setAttribute('r', '13.45');\n ring.classList.add('shockwave-ring');\n\n container.appendChild(ring);\n\n this.#setTimeout(() => {\n ring.remove();\n }, 900);\n }\n\n #runIntro(onComplete?: () => void): void {\n if (this.intro === 'particle') {\n this.#runParticleIntro(onComplete);\n } else {\n this.#runWaveIntro(onComplete);\n }\n }\n\n #startLoopAnimation(): void {\n this.#loopStartTime = performance.now();\n this.#ensureVisibility();\n\n // Inner dots - scale down with transition, then add animation class\n const orderedInnerDots = sortByAngle(INNER_DOT_IDS);\n let seedDelay = 0;\n\n orderedInnerDots.forEach((dot) => {\n this.#setTimeout(() => {\n const el = this.#getDot(dot.id);\n if (!el) {\n return;\n }\n\n const targetScale = 0.6;\n\n el.style.transition = 'all 450ms cubic-bezier(0.4, 0, 0.2, 1)';\n el.style.transform = `scale(${targetScale})`;\n el.style.fill = 'var(--dot-medium)';\n el.style.opacity = '0.7';\n\n el.style.setProperty('--base-scale', `${targetScale}`);\n\n const angle = getAngle(dot);\n const normalizedAngle = (angle + Math.PI) / (2 * Math.PI);\n const animationDelayMs = normalizedAngle * LOOP_DURATION;\n el.style.setProperty('--delay', `${animationDelayMs}ms`);\n\n this.#setTimeout(() => {\n el.classList.add('dot-loading-inner');\n }, 100);\n }, seedDelay);\n\n seedDelay += 60;\n });\n\n const orderedOuterDots = sortByAngle(OUTER_DOT_IDS);\n this.#setTimeout(() => {\n orderedOuterDots.forEach((dot) => {\n const el = this.#getDot(dot.id);\n if (!el) {\n return;\n }\n\n el.style.transition = 'all 350ms ease-out';\n\n const baseScale = 1.2;\n el.style.setProperty('--base-scale', `${baseScale}`);\n\n const angle = getAngle(dot);\n const normalizedAngle = (angle + Math.PI) / (2 * Math.PI);\n const animationDelayMs = normalizedAngle * ROTATION_DURATION;\n el.style.setProperty('--delay', `${animationDelayMs}ms`);\n\n this.#setTimeout(() => {\n el.classList.add('dot-loading');\n }, 50);\n });\n\n this.state = 'loop';\n }, seedDelay + 100);\n }\n\n #endLoopAnimation(): void {\n const now = performance.now();\n const elapsed = Math.max(0, now - this.#loopStartTime);\n\n const timeInCycle = elapsed % LOOP_DURATION;\n const timeLeft = LOOP_DURATION - timeInCycle + 50;\n\n this.state = 'exit';\n\n this.#setTimeout(() => {\n const orderedAllDots = sortByAngle(DOTS_DATA.map((d) => d.id));\n\n orderedAllDots.forEach((dot, i) => {\n const el = this.#getDot(dot.id);\n if (!el) {\n return;\n }\n\n const delay = i * 18;\n\n this.#setTimeout(() => {\n el.classList.remove('dot-loading', 'dot-loading-inner');\n el.style.removeProperty('--delay');\n el.style.removeProperty('--base-scale');\n\n el.classList.add('restoring');\n el.style.transform = 'scale(1)';\n el.style.opacity = '1';\n el.style.removeProperty('fill');\n\n this.#setTimeout(() => {\n el.classList.remove('restoring');\n }, 500);\n }, delay);\n });\n\n this.#setTimeout(\n () => {\n this.state = 'idle';\n },\n orderedAllDots.length * 18 + 500\n );\n }, timeLeft);\n }\n\n handleLoadingChange(next: boolean): void {\n if (!this.#introCompleted) {\n return;\n }\n\n this.#clearTimers();\n\n if (next) {\n if (this.state === 'idle' || this.state === 'exit') {\n this.#resetDotsState(true, true);\n this.#startLoopAnimation();\n }\n } else {\n if (this.state === 'loop') {\n this.#endLoopAnimation();\n } else if (this.state !== 'intro' && this.state !== 'exit') {\n this.state = 'idle';\n }\n }\n }\n\n playIntro(variant?: LogoIntroVariant): void {\n this.#clearTimers();\n this.#resetDotsState(true);\n\n const originalIntro = this.intro;\n if (variant) {\n this.intro = variant;\n }\n\n this.#runIntro(() => {\n this.#introCompleted = true;\n if (this.loading) {\n this.#startLoopAnimation();\n } else {\n this.state = 'idle';\n }\n });\n\n if (variant) {\n this.intro = originalIntro;\n }\n }\n}\n","import type { MonitorFpsDetail } from './fps';\n\nimport { html, type TemplateResult } from 'lit-html';\n\nimport { Component } from '~/decorators/Component';\nimport { Listen } from '~/decorators/Listen';\nimport { Watch } from '~/decorators/Watch';\nimport { styleObject } from '~/utils/template-helpers';\nimport './fps';\n\ninterface LayoutShift extends PerformanceEntry {\n value: number;\n hadRecentInput: boolean;\n}\n\ninterface PerformanceEventTiming extends PerformanceEntry {\n duration: number;\n interactionId?: number;\n}\n\ninterface PerformanceLongTaskTiming extends PerformanceEntry {\n duration: number;\n}\n\ntype CoreWebVitals = {\n LCP: number | null;\n INP: number | null;\n CLS: number;\n FCP: number | null;\n TBT: number;\n};\n\ntype NavigationMetrics = {\n ttfb: number | null;\n domInteractive: number | null;\n loadTime: number | null;\n};\n\ntype ResourceSummary = {\n js: { count: number; size: number };\n css: { count: number; size: number };\n img: { count: number; size: number };\n other: { count: number; size: number };\n totalSize: number;\n};\n\ntype MemoryUsage = {\n jsHeapSizeLimit: number;\n totalJSHeapSize: number;\n usedJSHeapSize: number;\n} | null;\n\ninterface PerformanceMetrics {\n coreWebVitals: CoreWebVitals;\n navigation: NavigationMetrics;\n resources: ResourceSummary;\n memory: MemoryUsage;\n fps: number | null;\n longTasks: { count: number; totalDuration: number };\n}\n\n// Network Information\ninterface ConnectionInfo {\n effectiveType: string;\n rtt: number;\n}\n\ntype MetricKey = keyof CoreWebVitals | keyof NavigationMetrics | 'fps' | 'TBT';\ntype MetricRating = 'good' | 'needs-improvement' | 'poor' | 'unknown';\n\ndeclare global {\n interface Performance {\n memory?: {\n jsHeapSizeLimit: number;\n totalJSHeapSize: number;\n usedJSHeapSize: number;\n };\n }\n interface Navigator {\n connection?: {\n effectiveType: string;\n rtt: number;\n addEventListener: (type: string, listener: EventListener) => void;\n removeEventListener: (type: string, listener: EventListener) => void;\n };\n }\n}\n\nconst METRIC_THRESHOLDS = {\n LCP: { good: 2500, poor: 4000 },\n INP: { good: 200, poor: 500 },\n CLS: { good: 0.1, poor: 0.25 },\n FCP: { good: 1800, poor: 3000 },\n ttfb: { good: 800, poor: 1800 },\n loadTime: { good: 3000, poor: 6000 },\n domInteractive: { good: 1500, poor: 3500 },\n fps: { good: 55, poor: 30 },\n TBT: { good: 200, poor: 600 }\n};\n\nconst GLOBAL_BENCHMARKS: Partial<Record<MetricKey, number>> = {\n LCP: 2400,\n INP: 250,\n CLS: 0.05,\n FCP: 1600,\n TBT: 300\n};\n\nconst rateMetric = (metric: MetricKey, value: number | null): MetricRating => {\n if (value === null) {\n return 'unknown';\n }\n const thresholds = METRIC_THRESHOLDS[metric as keyof typeof METRIC_THRESHOLDS];\n if (!thresholds) {\n return 'unknown';\n }\n\n if (metric === 'fps') {\n if (value >= thresholds.good) {\n return 'good';\n }\n if (value >= thresholds.poor) {\n return 'needs-improvement';\n }\n return 'poor';\n }\n\n if (value <= thresholds.good) {\n return 'good';\n }\n if (value < thresholds.poor) {\n return 'needs-improvement';\n }\n return 'poor';\n};\n\nconst formatMetric = (metric: MetricKey, value: number | null): string => {\n if (value === null) {\n return 'N/A';\n }\n if (metric === 'CLS') {\n return value.toFixed(3);\n }\n if (metric === 'fps') {\n return `${Math.round(value)}`;\n }\n if (value < 1000) {\n return `${Math.round(value)}ms`;\n }\n return `${(value / 1000).toFixed(2)}s`;\n};\n\nconst formatBytes = (bytes: number | null | undefined, decimals = 1): string => {\n if (bytes == null || !Number.isFinite(bytes) || bytes <= 0) {\n return '0 B';\n }\n\n const k = 1024;\n const dm = decimals < 0 ? 0 : decimals;\n const sizes = ['B', 'KB', 'MB', 'GB', 'TB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return `${parseFloat((bytes / k ** i).toFixed(dm))} ${sizes[i]}`;\n};\n\nconst estimateCarbonFootprint = (totalBytes: number): string => {\n if (totalBytes <= 0) {\n return '0g CO2 eq.';\n }\n const emissions = (totalBytes / 1000000000) * 0.81;\n return `${emissions.toFixed(3)}g CO2 eq.`;\n};\n\n@Component({\n tag: 'ease-monitor',\n styles: `\n :host {\n position: relative;\n z-index: 100000;\n user-select: none;\n -webkit-user-select: none;\n \n }\n\n [part=\"container\"] {\n width: 320px;\n overflow: hidden; \n }\n\n [part=\"header\"] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n }\n\n [part=\"title\"] {\n display: flex;\n align-items: center;\n gap: 0.5em;\n }\n\n [part=\"content\"] {\n display: grid;\n gap: 1em;\n max-height: 80vh;\n overflow-y: auto;\n }\n\n .metrics-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(90px, 1fr));\n gap: 0.5em;\n }\n\n .metric-box {\n text-align: center;\n cursor: help;\n }\n\n .metric-value {\n font-variant-numeric: tabular-nums; \n }\n\n .rating-good {\n color: #22c55e;\n }\n .rating-needs-improvement {\n color: #eab308;\n }\n .rating-poor {\n color: #ef4444;\n }\n .rating-unknown {\n color: #6b7280;\n }\n\n .status-indicator.rating-good {\n background-color: #22c55e;\n }\n .status-indicator.rating-needs-improvement {\n background-color: #eab308;\n }\n .status-indicator.rating-poor {\n background-color: #ef4444;\n }\n .status-indicator.rating-unknown {\n background-color: #6b7280;\n }\n\n .memory-used.rating-good {\n background-color: #22c55e;\n }\n .memory-used.rating-needs-improvement {\n background-color: #eab308;\n }\n .memory-used.rating-poor {\n background-color: #ef4444;\n }\n\n .resource-list, .memory-usage, .network-info {\n display: grid;\n gap: 0.25em;\n }\n\n .resource-item, .network-item, .longtask-item {\n display: flex;\n justify-content: space-between;\n font-variant-numeric: tabular-nums;\n }\n\n .memory-bar {\n height: 10px;\n overflow: hidden;\n position: relative;\n }\n\n .memory-used {\n height: 100%;\n transition: width 0.5s ease-in-out;\n }\n\n .status-indicator {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n }\n \n .carbon-estimate {\n text-align: right;\n }\n\n .trend-indicator {\n display: inline-block;\n width: 1em;\n text-align: center;\n }\n `\n})\nexport class Monitor extends HTMLElement {\n declare requestRender: () => void;\n\n @Watch<PerformanceMetrics>({})\n accessor metrics: PerformanceMetrics = {\n navigation: { loadTime: null, domInteractive: null, ttfb: null },\n coreWebVitals: { LCP: null, INP: null, CLS: 0, FCP: null, TBT: 0 },\n resources: {\n js: { count: 0, size: 0 },\n css: { count: 0, size: 0 },\n img: { count: 0, size: 0 },\n other: { count: 0, size: 0 },\n totalSize: 0\n },\n memory: null,\n fps: null,\n longTasks: { count: 0, totalDuration: 0 }\n };\n\n @Watch<ConnectionInfo>({})\n accessor network: ConnectionInfo = {\n effectiveType: 'N/A',\n rtt: 0\n };\n\n private observers: PerformanceObserver[] = [];\n private memoryInterval: number | null = null;\n\n private clsEntries: LayoutShift[] = [];\n\n private inpEntries: PerformanceEventTiming[] = [];\n private maxINP = 0;\n\n private longTaskEntries: PerformanceLongTaskTiming[] = [];\n\n private trendHistory: Partial<Record<MetricKey, number[]>> = {};\n private maxTrendLength = 5;\n\n connectedCallback(): void {\n this.initObservers();\n this.collectInitialMetrics();\n this.startMemoryMonitoring();\n this.initNetworkMonitoring();\n\n if (document.readyState !== 'complete') {\n window.addEventListener('load', this.handlePageLoad);\n } else {\n this.handlePageLoad();\n }\n }\n\n disconnectedCallback(): void {\n this.observers.forEach((observer) => {\n observer.disconnect();\n });\n this.observers = [];\n this.stopMemoryMonitoring();\n this.stopNetworkMonitoring();\n window.removeEventListener('load', this.handlePageLoad);\n }\n\n @Listen<Monitor, CustomEvent<MonitorFpsDetail>>('monitor-fps')\n handleFpsUpdate(event: CustomEvent<MonitorFpsDetail>): void {\n const fps = event.detail?.fps ?? null;\n this.metrics.fps = fps;\n this.updateTrend('fps', fps);\n this.requestRender();\n }\n\n private handlePageLoad = (): void => {\n setTimeout(() => {\n this.collectNavigationTiming();\n this.requestRender();\n }, 500);\n };\n\n private initObservers(): void {\n if (!('PerformanceObserver' in window)) {\n console.warn('PerformanceObserver API not supported.');\n return;\n }\n\n try {\n const observer = new PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n this.processPerformanceEntry(entry);\n }\n });\n\n observer.observe({ type: 'largest-contentful-paint', buffered: true });\n observer.observe({ type: 'event', buffered: true });\n observer.observe({ type: 'layout-shift', buffered: true });\n observer.observe({ type: 'paint', buffered: true });\n observer.observe({ type: 'resource', buffered: true });\n observer.observe({ type: 'longtask', buffered: true });\n\n this.observers.push(observer);\n } catch (e) {\n console.error('Error initializing PerformanceObserver:', e);\n }\n }\n\n private collectInitialMetrics(): void {\n this.collectNavigationTiming();\n const resourceEntries = performance.getEntriesByType('resource') as PerformanceResourceTiming[];\n this.processResourceEntries(resourceEntries);\n }\n\n private collectNavigationTiming(): void {\n const navigationEntries = performance.getEntriesByType('navigation');\n if (navigationEntries.length > 0) {\n const navTiming = navigationEntries[0] as PerformanceNavigationTiming;\n\n let ttfb = null;\n if (navTiming.responseStart > 0 && navTiming.fetchStart > 0) {\n ttfb = navTiming.responseStart - navTiming.fetchStart;\n }\n\n let loadTime = null;\n if (navTiming.loadEventEnd > 0) {\n loadTime = navTiming.loadEventEnd - navTiming.startTime;\n }\n\n let domInteractive = null;\n if (navTiming.domInteractive > 0) {\n domInteractive = navTiming.domInteractive - navTiming.startTime;\n }\n\n this.metrics.navigation = { ttfb, loadTime, domInteractive };\n this.updateTrend('loadTime', loadTime);\n this.updateTrend('ttfb', ttfb);\n }\n }\n\n private processPerformanceEntry(entry: PerformanceEntry): void {\n switch (entry.entryType) {\n case 'largest-contentful-paint':\n this.metrics.coreWebVitals.LCP = entry.startTime;\n this.updateTrend('LCP', entry.startTime);\n break;\n case 'event': {\n const eventEntry = entry as PerformanceEventTiming;\n if (eventEntry.interactionId && eventEntry.duration > this.maxINP) {\n this.maxINP = eventEntry.duration;\n this.metrics.coreWebVitals.INP = this.maxINP;\n this.updateTrend('INP', this.maxINP);\n }\n this.inpEntries.push(eventEntry);\n break;\n }\n case 'layout-shift': {\n const lsEntry = entry as LayoutShift;\n if (!lsEntry.hadRecentInput) {\n this.clsEntries.push(lsEntry);\n this.calculateSessionWindowCLS();\n }\n break;\n }\n case 'paint':\n if (entry.name === 'first-contentful-paint') {\n this.metrics.coreWebVitals.FCP = entry.startTime;\n this.updateTrend('FCP', entry.startTime);\n }\n break;\n case 'resource':\n this.processResourceEntries([entry as PerformanceResourceTiming]);\n return;\n case 'longtask': {\n const ltEntry = entry as PerformanceLongTaskTiming;\n this.longTaskEntries.push(ltEntry);\n this.calculateLongTasksAndTBT();\n break;\n }\n }\n this.requestRender();\n }\n\n private calculateSessionWindowCLS(): void {\n let maxCls = 0;\n let currentSessionCls = 0;\n let sessionStartTime = Infinity;\n let lastTime = -Infinity;\n\n this.clsEntries.sort((a, b) => a.startTime - b.startTime);\n\n for (const entry of this.clsEntries) {\n const timeDiff = entry.startTime - lastTime;\n\n if (timeDiff > 1000 || entry.startTime - sessionStartTime > 5000) {\n if (currentSessionCls > 0) {\n maxCls = Math.max(maxCls, currentSessionCls);\n }\n currentSessionCls = 0;\n sessionStartTime = entry.startTime;\n }\n\n currentSessionCls += entry.value;\n lastTime = entry.startTime;\n }\n\n maxCls = Math.max(maxCls, currentSessionCls);\n this.metrics.coreWebVitals.CLS = maxCls;\n this.updateTrend('CLS', maxCls);\n }\n\n private processResourceEntries(entries: PerformanceResourceTiming[]): void {\n const summary = this.metrics.resources;\n\n entries.forEach((entry) => {\n const size = entry.transferSize || 0;\n const initiator = entry.initiatorType;\n const name = entry.name.toLowerCase();\n\n if (initiator === 'script' || name.endsWith('.js')) {\n summary.js.count++;\n summary.js.size += size;\n } else if (initiator === 'css' || name.endsWith('.css') || initiator === 'link') {\n summary.css.count++;\n summary.css.size += size;\n } else if (initiator === 'img' || initiator === 'image' || /\\.(jpg|jpeg|png|gif|svg|webp|avif)$/.test(name)) {\n summary.img.count++;\n summary.img.size += size;\n } else {\n summary.other.count++;\n summary.other.size += size;\n }\n summary.totalSize += size;\n });\n }\n\n private calculateLongTasksAndTBT(): void {\n let tbt = 0;\n let count = 0;\n const referenceTime = this.metrics.coreWebVitals.FCP ?? 0;\n\n this.longTaskEntries.forEach((task) => {\n if (task.startTime >= referenceTime) {\n count++;\n if (task.duration > 50) {\n tbt += task.duration - 50;\n }\n }\n });\n this.metrics.longTasks = { count, totalDuration: tbt };\n this.metrics.coreWebVitals.TBT = tbt;\n this.updateTrend('TBT', tbt);\n }\n\n private startMemoryMonitoring(): void {\n if (!performance.memory) {\n return;\n }\n\n const updateMemory = () => {\n if (performance.memory) {\n const mem = performance.memory;\n this.metrics.memory = {\n jsHeapSizeLimit: Number(mem.jsHeapSizeLimit) || 0,\n totalJSHeapSize: Number(mem.totalJSHeapSize) || 0,\n usedJSHeapSize: Number(mem.usedJSHeapSize) || 0\n };\n this.requestRender();\n }\n };\n\n updateMemory();\n this.memoryInterval = window.setInterval(updateMemory, 3000);\n }\n\n private stopMemoryMonitoring(): void {\n if (this.memoryInterval) {\n clearInterval(this.memoryInterval);\n this.memoryInterval = null;\n }\n }\n\n private initNetworkMonitoring(): void {\n if (navigator.connection) {\n this.updateNetworkInfo();\n navigator.connection.addEventListener('change', this.updateNetworkInfo);\n }\n }\n\n private stopNetworkMonitoring(): void {\n if (navigator.connection) {\n navigator.connection.removeEventListener('change', this.updateNetworkInfo);\n }\n }\n\n private updateNetworkInfo = (): void => {\n if (navigator.connection) {\n this.network = {\n effectiveType: navigator.connection.effectiveType ?? 'N/A',\n rtt: navigator.connection.rtt ?? 0\n };\n }\n };\n\n private updateTrend(key: MetricKey, value: number | null): void {\n if (value === null) {\n return;\n }\n const history = this.trendHistory[key] || [];\n history.push(value);\n if (history.length > this.maxTrendLength) {\n history.shift();\n }\n this.trendHistory[key] = history;\n }\n\n private getTrendDirection(key: MetricKey): string {\n const history = this.trendHistory[key];\n if (!history || history.length < 2) {\n return '';\n }\n\n const currentValue = history[history.length - 1];\n const previousAvg = history.slice(0, history.length - 1).reduce((a, b) => a + b, 0) / (history.length - 1);\n\n const threshold = Math.abs(previousAvg * 0.05);\n const delta = currentValue ?? 0 - previousAvg;\n\n if (Math.abs(delta) < threshold) {\n return '→';\n }\n\n if (key === 'fps') {\n return delta > 0 ? '↑' : '↓';\n } else {\n return delta < 0 ? '↓' : '↑';\n }\n }\n\n private getOverallStatus(): MetricRating {\n const ratings: MetricRating[] = [\n rateMetric('LCP', this.metrics.coreWebVitals.LCP),\n rateMetric('CLS', this.metrics.coreWebVitals.CLS),\n rateMetric('INP', this.metrics.coreWebVitals.INP),\n rateMetric('fps', this.metrics.fps)\n ];\n\n if (ratings.includes('poor')) {\n return 'poor';\n }\n if (ratings.includes('needs-improvement')) {\n return 'needs-improvement';\n }\n if (ratings.every((r) => r === 'unknown')) {\n return 'unknown';\n }\n\n if (ratings.some((r) => r === 'good')) {\n return 'good';\n }\n\n return 'unknown';\n }\n\n render(): TemplateResult {\n return html`\n <div part=\"container\">\n ${this.renderExpanded()}\n </div>\n `;\n }\n\n private renderExpanded(): TemplateResult {\n return html`\n <div part=\"header\">\n <div part=\"title\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"23 6 13.5 15.5 8.5 10.5 1 18\"></polyline><polyline points=\"17 6 23 6 23 12\"></polyline></svg>\n Performance Monitor\n </div>\n </div>\n <div part=\"content\">\n ${this.renderVitalsAndTiming()}\n ${this.renderRealtime()}\n ${this.renderNetworkInfo()}\n ${this.renderResources()}\n </div>\n `;\n }\n\n private renderMetricBox(label: string, key: MetricKey, value: number | null, description: string): TemplateResult {\n const rating = rateMetric(key, value);\n const formattedValue = formatMetric(key, value);\n const trend = this.getTrendDirection(key);\n const benchmark = GLOBAL_BENCHMARKS[key];\n const vsBenchmark = benchmark ? ` (vs avg ${formatMetric(key, benchmark)})` : '';\n return html`\n <div class=\"metric-box\" title=\"${description}${vsBenchmark}\">\n <div part=\"metric-label\" class=\"metric-label\">${label}</div>\n <div part=\"metric-value\" class=\"metric-value rating-${rating}\" data-rating=${rating}>\n ${formattedValue}\n <span class=\"trend-indicator\">${trend}</span>\n </div>\n </div>\n `;\n }\n\n private renderVitalsAndTiming(): TemplateResult {\n const { LCP, INP, CLS, FCP, TBT } = this.metrics.coreWebVitals;\n const { ttfb, loadTime } = this.metrics.navigation;\n return html`\n <section>\n <div part=\"section-title\" class=\"section-title\">Vitals & Timing</div>\n <div class=\"metrics-grid\">\n ${this.renderMetricBox('LCP', 'LCP', LCP, 'Largest Contentful Paint: Measures loading performance.')}\n ${this.renderMetricBox('INP', 'INP', INP, 'Interaction to Next Paint: Measures responsiveness.')}\n ${this.renderMetricBox('CLS', 'CLS', CLS, 'Cumulative Layout Shift: Measures visual stability.')}\n ${this.renderMetricBox('FCP', 'FCP', FCP, 'First Contentful Paint: When the browser renders the first bit of content.')}\n ${this.renderMetricBox('TBT', 'TBT', TBT, 'Total Blocking Time: Sum of blocking portions of long tasks.')}\n ${this.renderMetricBox('TTFB', 'ttfb', ttfb, 'Time to First Byte: Measures server responsiveness.')}\n ${this.renderMetricBox('Load', 'loadTime', loadTime, 'Total Page Load Time.')}\n </div>\n </section>\n `;\n }\n\n private renderRealtime(): TemplateResult {\n const { memory, longTasks } = this.metrics;\n\n return html`\n <section>\n <div part=\"section-title\" class=\"section-title\">Realtime Monitoring</div>\n <ease-monitor-fps></ease-monitor-fps>\n <div class=\"longtask-item\">\n <span>Long Tasks (Count / Blocked ms)</span>\n <span>${longTasks.count} / ${longTasks.totalDuration.toFixed(0)}ms</span>\n </div>\n ${this.renderMemory(memory)}\n </section>\n `;\n }\n\n private renderMemory(memory: MemoryUsage): TemplateResult {\n if (!memory) {\n return html`\n <div class=\"memory-usage\">\n (performance.memory API not supported)\n </div>\n `;\n }\n\n const usedPercent = memory.totalJSHeapSize > 0 ? (memory.usedJSHeapSize / memory.totalJSHeapSize) * 100 : 0;\n\n let rating: MetricRating = 'good';\n if (usedPercent > 85) {\n rating = 'poor';\n } else if (usedPercent > 60) {\n rating = 'needs-improvement';\n }\n\n return html`\n <div class=\"memory-usage\">\n <div class=\"resource-item\">\n <span>Used / Total Heap</span>\n <span>${formatBytes(memory.usedJSHeapSize)} / ${formatBytes(memory.totalJSHeapSize)}</span>\n </div>\n <div class=\"memory-bar\" title=\"${usedPercent.toFixed(1)}% Used\">\n <div class=\"memory-used rating-${rating}\" style=${styleObject({ width: `${Math.min(100, usedPercent)}%` })} data-rating=${rating}></div>\n </div>\n <div class=\"resource-item\">\n <span>Heap Limit</span>\n <span>${formatBytes(memory.jsHeapSizeLimit)}</span>\n </div>\n </div>\n `;\n }\n\n private renderNetworkInfo(): TemplateResult {\n const { effectiveType, rtt } = this.network;\n return html`\n <section>\n <div part=\"section-title\" class=\"section-title\">Network Connection</div>\n <div class=\"network-info\">\n <div class=\"network-item\">\n <span>Effective Type</span>\n <span>${effectiveType.toUpperCase()}</span>\n </div>\n <div class=\"network-item\">\n <span>Round Trip Time (RTT)</span>\n <span>${rtt > 0 ? `${rtt}ms` : 'N/A'}</span>\n </div>\n </div>\n </section>\n `;\n }\n\n private renderResources(): TemplateResult {\n const { js, css, img, other, totalSize } = this.metrics.resources;\n const totalCount = js.count + css.count + img.count + other.count;\n\n const renderItem = (label: string, data: { count: number; size: number }) => html`\n <div class=\"resource-item\">\n <span>${label} (${data.count})</span>\n <span>${formatBytes(data.size)}</span>\n </div>\n `;\n\n return html`\n <section>\n <div part=\"section-title\" class=\"section-title\">Resources (Total: ${formatBytes(totalSize)} / ${totalCount} reqs)</div>\n <div class=\"resource-list\">\n ${renderItem('JS', js)}\n ${renderItem('CSS/Links', css)}\n ${renderItem('Images', img)}\n ${renderItem('Other', other)}\n </div>\n <div part=\"carbon-estimate\" class=\"carbon-estimate\">\n Est. Carbon: ${estimateCarbonFootprint(totalSize)}\n </div>\n <div>\n Overall Status: ${this.getOverallStatus()}\n </div>\n </section>\n `;\n }\n}\n","type RenderHost = HTMLElement & {\n requestRender?(): void;\n render?(): void;\n};\n\nconst renderQueue = new WeakMap<RenderHost, boolean>();\n\nconst scheduleRender = (instance: RenderHost): void => {\n if (typeof instance.requestRender === 'function') {\n instance.requestRender();\n return;\n }\n\n if (typeof instance.render !== 'function') {\n return;\n }\n\n if (renderQueue.get(instance)) {\n return;\n }\n\n renderQueue.set(instance, true);\n\n requestAnimationFrame(() => {\n renderQueue.set(instance, false);\n\n instance.render?.();\n });\n};\n\nconst defaultCompare = <TValue>(previous: TValue, next: TValue): boolean => previous === next;\n\ninterface WatchOptions<TValue, THost extends RenderHost> {\n compare?: (previous: TValue, next: TValue) => boolean;\n onChange?: (this: THost, next: TValue, previous: TValue) => void;\n transform?: (this: THost, initial: TValue) => TValue;\n}\n\nexport function Watch<TValue, THost extends RenderHost = RenderHost>(options: WatchOptions<TValue, THost> = {}) {\n const { compare = defaultCompare, onChange, transform } = options;\n\n return (\n accessor: ClassAccessorDecoratorTarget<THost, TValue>,\n context: ClassAccessorDecoratorContext<THost, TValue>\n ): ClassAccessorDecoratorResult<THost, TValue> => {\n if (context.kind !== 'accessor') {\n throw new Error('@Watch requires the \"accessor\" keyword on the property.');\n }\n\n return {\n get(this: THost): TValue {\n return accessor.get.call(this);\n },\n set(this: THost, value: TValue): void {\n const previous = accessor.get.call(this);\n\n if (compare(previous, value)) {\n return;\n }\n\n accessor.set.call(this, value);\n\n if (onChange) {\n onChange.call(this, value, previous);\n }\n\n scheduleRender(this);\n },\n init(this: THost, initialValue: TValue): TValue {\n if (transform) {\n return transform.call(this, initialValue);\n }\n\n return initialValue;\n }\n };\n };\n}\n","import { html, type TemplateResult } from 'lit-html';\n\nimport { Component } from '~/decorators/Component';\nimport { Prop } from '~/decorators/Prop';\nimport { Query } from '~/decorators/Query';\n\nexport type MonitorFpsDetail = {\n fps: number | null;\n refreshRate: number | null;\n frameTimeAvg: number | null;\n frameTimeP95: number | null;\n frameTimeMax: number | null;\n droppedFrames: number;\n jankFrames: number;\n longFrames: number;\n};\n\nconst clamp = (value: number, min: number, max: number): number => Math.max(min, Math.min(max, value));\n\nconst mean = (values: readonly number[]): number | null => {\n if (values.length === 0) {\n return null;\n }\n let sum = 0;\n for (const value of values) {\n sum += value;\n }\n return sum / values.length;\n};\n\nconst quantile = (sorted: readonly number[], q: number): number | null => {\n if (sorted.length === 0) {\n return null;\n }\n const clamped = clamp(q, 0, 1);\n const index = Math.floor(clamped * (sorted.length - 1));\n return sorted[index] ?? null;\n};\n\nconst computePercentile = (values: readonly number[], q: number): number | null => {\n if (values.length === 0) {\n return null;\n }\n const sorted = [...values].sort((a, b) => a - b);\n return quantile(sorted, q);\n};\n\nconst computeMedian = (values: readonly number[]): number | null => computePercentile(values, 0.5);\n\nconst formatNumber = (value: number | null, decimals = 0): string => {\n if (value === null || !Number.isFinite(value)) {\n return '—';\n }\n return value.toFixed(decimals);\n};\n\nconst formatMs = (value: number | null, decimals = 1): string => {\n if (value === null || !Number.isFinite(value)) {\n return '—';\n }\n return `${value.toFixed(decimals)}ms`;\n};\n\nconst rateFps = (fps: number | null, targetFps: number | null): 'good' | 'needs-improvement' | 'poor' | 'unknown' => {\n if (fps === null || !Number.isFinite(fps)) {\n return 'unknown';\n }\n const target = targetFps && Number.isFinite(targetFps) ? targetFps : 60;\n const ratio = fps / target;\n if (ratio >= 0.92) {\n return 'good';\n }\n if (ratio >= 0.75) {\n return 'needs-improvement';\n }\n return 'poor';\n};\n\n@Component({\n tag: 'ease-monitor-fps',\n autoSlot: false,\n shadowMode: 'open',\n styles: `\n :host {\n display: block;\n width: 100%;\n color: var(--color-foreground);\n font-family: var(--ease-font-family, \"Instrument Sans\", sans-serif);\n font-variant-numeric: tabular-nums;\n }\n\n [part=\"container\"] {\n display: grid;\n gap: 8px;\n width: 100%;\n }\n\n [part=\"header\"] {\n display: flex;\n align-items: baseline;\n justify-content: space-between;\n gap: 8px;\n width: 100%;\n }\n\n [part=\"title\"] {\n display: inline-flex;\n align-items: baseline;\n gap: 6px;\n min-width: 0;\n }\n\n [part=\"fps\"] {\n font-size: var(--ease-monitor-fps-font-size, 14px);\n font-weight: 650;\n letter-spacing: -0.01em;\n line-height: 1;\n }\n\n [part=\"fps\"][data-rating=\"good\"] {\n color: #22c55e;\n }\n [part=\"fps\"][data-rating=\"needs-improvement\"] {\n color: #eab308;\n }\n [part=\"fps\"][data-rating=\"poor\"] {\n color: #ef4444;\n }\n [part=\"fps\"][data-rating=\"unknown\"] {\n color: var(--color-gray-600);\n }\n\n [part=\"unit\"] {\n font-size: var(--ease-monitor-unit-font-size, var(--ease-font-size-sm, 12px));\n color: var(--color-gray-600);\n font-weight: 500;\n }\n\n [part=\"subtitle\"] {\n font-size: var(--ease-monitor-subtitle-font-size, 11px);\n color: var(--color-gray-600);\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n min-width: 0;\n text-align: right;\n }\n\n canvas[part=\"graph\"] {\n width: 100%;\n height: 44px;\n display: block;\n background: var(--color-gray-900);\n box-shadow: inset 0 0 0 1px var(--color-white-4);\n }\n\n [part=\"stats\"] {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 8px;\n font-size: var(--ease-monitor-stats-font-size, var(--ease-font-size-sm, 12px));\n padding-left: var(--ease-monitor-stats-padding-left, 4px);\n color: var(--color-gray-600);\n }\n\n [part=\"stat\"] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n min-width: 0;\n }\n\n [part=\"stat\"] strong {\n font-weight: 550;\n color: var(--color-gray-700);\n }\n `\n})\nexport class MonitorFps extends HTMLElement {\n declare requestRender: () => void;\n\n @Prop<boolean>({ type: Boolean, reflect: true, defaultValue: false })\n accessor paused: boolean = false;\n\n @Query<HTMLCanvasElement>('canvas[part=\"graph\"]')\n accessor canvasEl!: HTMLCanvasElement | null;\n\n #rafId: number | null = null;\n #lastNow = 0;\n #lastSampleNow = 0;\n #framesSinceSample = 0;\n\n #frameDeltas: number[] = [];\n #fpsSamples: number[] = [];\n\n #maxFrameDeltas = 240;\n #maxFpsSamples = 90; // 90 * 250ms = ~22.5s\n #sampleIntervalMs = 250;\n #statsWindowFrames = 120;\n\n #data: MonitorFpsDetail = {\n fps: null,\n refreshRate: null,\n frameTimeAvg: null,\n frameTimeP95: null,\n frameTimeMax: null,\n droppedFrames: 0,\n jankFrames: 0,\n longFrames: 0\n };\n\n connectedCallback(): void {\n this.#attachVisibilityHandling();\n if (!this.paused && !document.hidden) {\n this.#start();\n }\n }\n\n disconnectedCallback(): void {\n this.#stop();\n document.removeEventListener('visibilitychange', this.#handleVisibilityChange);\n }\n\n afterRender(): void {\n this.#syncCanvasSize();\n this.#draw();\n }\n\n render(): TemplateResult {\n const fps = this.#data.fps;\n const hz = this.#data.refreshRate;\n const rating = rateFps(fps, hz);\n\n const subtitleParts = [\n this.#data.frameTimeAvg !== null ? `avg ${formatMs(this.#data.frameTimeAvg)}` : null,\n this.#data.frameTimeP95 !== null ? `p95 ${formatMs(this.#data.frameTimeP95)}` : null\n ].filter(Boolean);\n\n return html`\n <div part=\"container\">\n <div part=\"header\">\n <div part=\"title\">\n <span part=\"fps\" data-rating=${rating}>${formatNumber(fps, 0)}</span>\n <span part=\"unit\">FPS</span>\n </div>\n <div part=\"subtitle\">${subtitleParts.join(' · ')}</div>\n </div>\n\n <canvas part=\"graph\" aria-label=\"FPS graph\"></canvas>\n\n <div part=\"stats\">\n <div part=\"stat\"><span>Refresh</span><strong>${hz ? `~${formatNumber(hz, 0)}Hz` : '—'}</strong></div>\n <div part=\"stat\"><span>Dropped</span><strong>${this.#data.droppedFrames}</strong></div>\n <div part=\"stat\"><span>Jank</span><strong>${this.#data.jankFrames}</strong></div>\n <div part=\"stat\"><span>Long frames</span><strong>${this.#data.longFrames}</strong></div>\n <div part=\"stat\"><span>Worst</span><strong>${formatMs(this.#data.frameTimeMax)}</strong></div>\n <div part=\"stat\"><span>Avg</span><strong>${formatMs(this.#data.frameTimeAvg)}</strong></div>\n </div>\n </div>\n `;\n }\n\n #attachVisibilityHandling(): void {\n document.removeEventListener('visibilitychange', this.#handleVisibilityChange);\n document.addEventListener('visibilitychange', this.#handleVisibilityChange, { passive: true });\n }\n\n #handleVisibilityChange = (): void => {\n if (document.hidden) {\n this.#stop();\n return;\n }\n\n if (!this.paused) {\n this.#start();\n }\n };\n\n #start(): void {\n if (this.#rafId !== null) {\n return;\n }\n\n const now = performance.now();\n this.#lastNow = now;\n this.#lastSampleNow = now;\n this.#framesSinceSample = 0;\n\n this.#rafId = requestAnimationFrame(this.#tick);\n }\n\n #stop(): void {\n if (this.#rafId !== null) {\n cancelAnimationFrame(this.#rafId);\n this.#rafId = null;\n }\n }\n\n #tick = (now: number): void => {\n if (this.paused) {\n this.#stop();\n return;\n }\n\n const delta = now - this.#lastNow;\n this.#lastNow = now;\n\n // Ignore huge deltas (tab switch / breakpoints).\n if (delta > 0 && delta < 250) {\n this.#frameDeltas.push(delta);\n if (this.#frameDeltas.length > this.#maxFrameDeltas) {\n this.#frameDeltas.shift();\n }\n }\n\n this.#framesSinceSample += 1;\n\n if (now - this.#lastSampleNow >= this.#sampleIntervalMs) {\n const elapsed = now - this.#lastSampleNow;\n const fpsSample = elapsed > 0 ? (this.#framesSinceSample * 1000) / elapsed : 0;\n\n this.#fpsSamples.push(fpsSample);\n if (this.#fpsSamples.length > this.#maxFpsSamples) {\n this.#fpsSamples.shift();\n }\n\n this.#lastSampleNow = now;\n this.#framesSinceSample = 0;\n\n this.#updateStats();\n this.#emit();\n this.requestRender();\n }\n\n this.#rafId = requestAnimationFrame(this.#tick);\n };\n\n #updateStats(): void {\n const frameWindow = this.#frameDeltas.slice(-this.#statsWindowFrames);\n const fpsWindow = this.#fpsSamples.slice(-Math.min(4, this.#fpsSamples.length));\n\n const frameAvg = mean(frameWindow);\n const frameP95 = computePercentile(frameWindow, 0.95);\n const frameMax = frameWindow.length > 0 ? Math.max(...frameWindow) : null;\n const median = computeMedian(frameWindow);\n\n const refreshRate =\n median && median > 0 ? clamp((1000 / median) as number, 30, 240) : (this.#data.refreshRate ?? null);\n\n const ideal = refreshRate ? 1000 / refreshRate : 1000 / 60;\n\n let droppedFrames = 0;\n let jankFrames = 0;\n let longFrames = 0;\n\n for (const ft of frameWindow) {\n const missed = Math.max(0, Math.round(ft / ideal) - 1);\n droppedFrames += missed;\n\n if (ft > ideal * 1.5) {\n jankFrames += 1;\n }\n\n if (ft > Math.max(50, ideal * 3)) {\n longFrames += 1;\n }\n }\n\n const fps = fpsWindow.length > 0 ? mean(fpsWindow) : null;\n\n this.#data = {\n fps,\n refreshRate,\n frameTimeAvg: frameAvg,\n frameTimeP95: frameP95,\n frameTimeMax: frameMax,\n droppedFrames,\n jankFrames,\n longFrames\n };\n }\n\n #emit(): void {\n this.dispatchEvent(\n new CustomEvent<MonitorFpsDetail>('monitor-fps', {\n detail: this.#data,\n bubbles: true,\n composed: true\n })\n );\n }\n\n #syncCanvasSize(): void {\n const canvas = this.canvasEl;\n if (!canvas) {\n return;\n }\n\n const rect = canvas.getBoundingClientRect();\n const dpr = Math.max(1, window.devicePixelRatio || 1);\n const width = Math.max(1, Math.floor(rect.width * dpr));\n const height = Math.max(1, Math.floor(rect.height * dpr));\n\n if (canvas.width !== width || canvas.height !== height) {\n canvas.width = width;\n canvas.height = height;\n }\n }\n\n #draw(): void {\n const canvas = this.canvasEl;\n if (!canvas) {\n return;\n }\n\n const ctx = canvas.getContext('2d');\n if (!ctx) {\n return;\n }\n\n const dpr = Math.max(1, window.devicePixelRatio || 1);\n const width = canvas.width / dpr;\n const height = canvas.height / dpr;\n\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n ctx.clearRect(0, 0, width, height);\n\n const samples = this.#fpsSamples;\n if (samples.length < 2) {\n return;\n }\n\n const target = this.#data.refreshRate ?? 60;\n const scaleMax = Math.max(60, Math.round(target / 10) * 10);\n\n const rating = rateFps(this.#data.fps, this.#data.refreshRate);\n const stroke =\n rating === 'good'\n ? '#22c55e'\n : rating === 'needs-improvement'\n ? '#eab308'\n : rating === 'poor'\n ? '#ef4444'\n : '#6b7280';\n\n // guide lines\n ctx.save();\n ctx.globalAlpha = 0.35;\n ctx.strokeStyle = '#ffffff';\n ctx.lineWidth = 1;\n ctx.setLineDash([3, 3]);\n\n const drawGuide = (fps: number) => {\n const y = height - clamp(fps / scaleMax, 0, 1) * height;\n ctx.beginPath();\n ctx.moveTo(0, y);\n ctx.lineTo(width, y);\n ctx.stroke();\n };\n\n drawGuide(Math.min(60, scaleMax));\n drawGuide(Math.min(30, scaleMax));\n\n ctx.restore();\n\n const toY = (fps: number) => height - clamp(fps / scaleMax, 0, 1) * height;\n\n // area fill\n ctx.beginPath();\n for (let i = 0; i < samples.length; i += 1) {\n const value = samples[i] ?? 0;\n const x = (i / (samples.length - 1)) * width;\n const y = toY(value);\n if (i === 0) {\n ctx.moveTo(x, y);\n } else {\n ctx.lineTo(x, y);\n }\n }\n ctx.lineTo(width, height);\n ctx.lineTo(0, height);\n ctx.closePath();\n ctx.globalAlpha = 0.12;\n ctx.fillStyle = stroke;\n ctx.fill();\n\n // line\n ctx.beginPath();\n for (let i = 0; i < samples.length; i += 1) {\n const value = samples[i] ?? 0;\n const x = (i / (samples.length - 1)) * width;\n const y = toY(value);\n if (i === 0) {\n ctx.moveTo(x, y);\n } else {\n ctx.lineTo(x, y);\n }\n }\n ctx.globalAlpha = 1;\n ctx.strokeStyle = stroke;\n ctx.lineWidth = 1.75;\n ctx.setLineDash([]);\n ctx.lineJoin = 'round';\n ctx.lineCap = 'round';\n ctx.stroke();\n }\n}\n","import { html } from 'lit-html';\n\nimport { coerceNumber, dispatchControlEvent, setBooleanAttribute } from '../shared';\n\nimport { Component } from '~/decorators/Component';\nimport { Listen } from '~/decorators/Listen';\nimport { Prop } from '~/decorators/Prop';\nimport { Query } from '~/decorators/Query';\n\nimport '../input';\nimport '../icons/interface/minus';\nimport '../icons/interface/plus';\n@Component({\n tag: 'ease-number-input',\n styles: `\n :host {\n display: inline-flex;\n align-items: center;\n }\n\n [part=\"container\"] {\n min-width: 0;\n }\n\n ease-input {\n --ease-input-padding: 0;\n text-align: center;\n font-family: var(--ease-font-mono, 'Geist Mono', monospace);\n font-variant-numeric: tabular-nums;\n font-feature-settings: \"tnum\";\n }\n\n [part=\"button\"] {\n position: relative;\n overflow: hidden;\n \n & > div {\n animation: blink .75s forwards;\n position: absolute;\n pointer-events: none;\n inset: 0;\n background-color: var(--ease-number-blink-color, var(--color-white-8));\n }\n }\n\n @keyframes blink {\n 0%,\n 90%,\n 100% {\n opacity: 0;\n }\n 30% {\n opacity: 1;\n }\n }\n `,\n template(this: NumberInput) {\n return html`\n <div part=\"container\">\n <ease-input\n part=\"control\"\n type=\"number\"\n .value=${this.value}\n ?disabled=${this.disabled}\n ?min=${this.min}\n ?max=${this.max}\n ?step=${this.step}\n @input=${this.handleInput}\n @change=${this.handleChange}\n >\n <button\n slot=\"prefix\"\n @click=${this.handleDecrement.bind(this)}\n type=\"button\"\n part=\"button\"\n ?disabled=${this.disabled || this.min === null || Number(this.control?.value) <= this.min}\n ?aria-disabled=${this.disabled || this.min === null || Number(this.control?.value) <= this.min}\n >\n <ease-icon-minus />\n </button>\n <button\n slot=\"suffix\"\n @click=${this.handleIncrement.bind(this)}\n type=\"button\"\n part=\"button\"\n ?disabled=${this.disabled || this.max === null || Number(this.control?.value) >= this.max}\n ?aria-disabled=${this.disabled || this.max === null || Number(this.control?.value) >= this.max}\n >\n <ease-icon-plus />\n </button>\n </ease-input>\n </div>\n `;\n }\n})\nexport class NumberInput extends HTMLElement {\n declare requestRender: () => void;\n @Prop<number | null>({ type: Number, reflect: true })\n accessor value!: number | null;\n\n @Prop<number | null>({ type: Number, reflect: true })\n accessor min!: number | null;\n\n @Prop<number | null>({ type: Number, reflect: true })\n accessor max!: number | null;\n\n @Prop<number | null>({ type: Number, reflect: true })\n accessor step!: number | null;\n\n @Prop<string | null>({ reflect: true })\n accessor name!: string | null;\n\n @Prop<boolean>({ type: Boolean, reflect: true })\n accessor disabled!: boolean;\n\n @Query<HTMLInputElement>('input')\n accessor control!: HTMLInputElement | null;\n\n afterRender(): void {\n if (!this.control) {\n return;\n }\n\n const control = this.control;\n control.value = this.value === null || this.value === undefined ? '' : String(this.value);\n control.min = this.min === null || this.min === undefined ? '' : String(this.min);\n control.max = this.max === null || this.max === undefined ? '' : String(this.max);\n control.step = this.step === null || this.step === undefined ? '' : String(this.step);\n control.name = this.name ?? '';\n control.disabled = Boolean(this.disabled);\n\n setBooleanAttribute(this, 'disabled', Boolean(this.disabled));\n }\n\n @Listen<NumberInput, Event, HTMLInputElement>('input', { selector: 'input' })\n handleInput(event: Event, target?: HTMLInputElement | null): void {\n if (!target) {\n return;\n }\n\n this.value = coerceNumber(target.value);\n dispatchControlEvent(this, 'input', { value: this.value, event });\n }\n\n @Listen<NumberInput, Event, HTMLInputElement>('change', { selector: 'input' })\n handleChange(event: Event, target?: HTMLInputElement | null): void {\n if (!target) {\n return;\n }\n\n this.value = coerceNumber(target.value);\n dispatchControlEvent(this, 'change', { value: this.value, event });\n }\n\n addActiveLayer(button: HTMLButtonElement): void {\n const layer = document.createElement('div');\n layer.classList.add('active-layer');\n button.appendChild(layer);\n\n setTimeout(() => {\n layer.remove();\n }, 600);\n }\n\n handleDecrement(event: MouseEvent): void {\n if (this.disabled || this.min === null || Number(this.control?.value) <= this.min) {\n return;\n }\n\n const button = event.currentTarget as HTMLButtonElement;\n this.addActiveLayer(button);\n\n const current = typeof this.value === 'number' ? this.value : 0;\n this.value = current - (this.step ?? 1);\n\n if (this.value <= this.min) {\n this.disabled = true;\n }\n }\n\n handleIncrement(event: MouseEvent): void {\n if (this.disabled || this.max === null || Number(this.control?.value) >= this.max) {\n return;\n }\n\n const button = event.currentTarget as HTMLButtonElement;\n this.addActiveLayer(button);\n\n const current = typeof this.value === 'number' ? this.value : 0;\n this.value = current + (this.step ?? 1);\n\n if (this.value >= this.max) {\n this.disabled = true;\n }\n }\n}\n","import '../dropdown';\n\nimport type { Dropdown } from '../dropdown';\n\nimport { html } from 'lit-html';\n\nimport { dispatchControlEvent, setBooleanAttribute } from '../shared';\n\nimport { Component } from '~/decorators/Component';\nimport { Listen } from '~/decorators/Listen';\nimport { Prop } from '~/decorators/Prop';\nimport { Query } from '~/decorators/Query';\n\n@Component({\n tag: 'ease-origin',\n styles: `\n :host {\n display: contents;\n }\n\n [part=\"container\"] {\n flex: 1;\n width: 100%;\n display: grid;\n grid-template-columns: 30px auto;\n grid-gap: 8px;\n }\n\n [part=\"preview\"] {\n width: 30px;\n height: 30px;\n border-radius: var(--radii-md);\n background-color: var(--color-gray-875);\n cursor: pointer;\n box-shadow: inset 0 1px .25px 0 var(--color-white-4), 0 1px 2.5px 0 var(--color-black-8);\n border-radius: var(--radii-md);\n position: relative;\n\n &::before,\n &::after {\n content: '';\n display: block;\n width: 3px;\n height: 3px;\n background-color: var(--color-blue-100);\n border-radius: 50%;\n position: absolute;\n top: 50%;\n left: 50%;\n margin-top: -1.5px;\n margin-left: -1.5px;\n }\n\n &::before {\n background-color: var(--color-gray-700);\n box-shadow: -6.5px -6.5px 0 0 var(--color-gray-700), 0 -6.5px 0 0 var(--color-gray-700), 6.5px -6.5px 0 0 var(--color-gray-700), -6.5px 0 0 0 var(--color-gray-700), 6.5px 0 0 0 var(--color-gray-700), -6.5px 6.5px 0 0 var(--color-gray-700), 0 6.5px 0 0 var(--color-gray-700), 6.5px 6.5px 0 0 var(--color-gray-700);\n }\n\n &::after {\n translate: var(--ease-origin-translate-x, 0) var(--ease-origin-translate-y, 0);\n scale: 1.25;\n transition: translate 0.3s cubic-bezier(0.25, 0, 0.5, 1);\n }\n\n &:hover {\n background-color: var(--color-gray-850);\n }\n\n &:focus-within {\n background-color: var(--color-gray-825);\n }\n\n &[data-value=\"top-left\"] {\n --ease-origin-translate-x: -6.5px;\n --ease-origin-translate-y: -6.5px;\n }\n\n &[data-value=\"top-center\"] {\n --ease-origin-translate-x: 0;\n --ease-origin-translate-y: -6.5px; \n }\n \n &[data-value=\"top-right\"] {\n --ease-origin-translate-x: 6.5px;\n --ease-origin-translate-y: -6.5px;\n }\n\n &[data-value=\"center-left\"] {\n --ease-origin-translate-x: -6.5px;\n --ease-origin-translate-y: 0\n }\n\n &[data-value=\"center-center\"] {\n --ease-origin-translate-x: 0;\n --ease-origin-translate-y: 0;\n }\n\n &[data-value=\"center-right\"] {\n --ease-origin-translate-x: 6.5px;\n --ease-origin-translate-y: 0;\n }\n \n &[data-value=\"bottom-left\"] {\n --ease-origin-translate-x: -6.5px;\n --ease-origin-translate-y: 6.5px;\n }\n \n &[data-value=\"bottom-center\"] {\n --ease-origin-translate-x: 0;\n --ease-origin-translate-y: 6.5px;\n }\n \n &[data-value=\"bottom-right\"] {\n --ease-origin-translate-x: 6.5px;\n --ease-origin-translate-y: 6.5px;\n }\n }\n\n ease-dropdown[part=\"dropdown\"] {\n --ease-dropdown-max-height: 180px;\n\n width: 100%;\n }\n `,\n template(this: Origin) {\n return html`\n <div part=\"container\">\n <div part=\"preview\" data-value=${this.value ?? 'center-center'}></div>\n \n <ease-dropdown part=\"dropdown\" placeholder=\"Select\" id=\"origin-dropdown\" .value=${this.value ?? 'center-center'} fullWidth name=${this.name} @value-change=${this.handleValueChange}>\n <button slot=\"content\" value=\"top-left\">Top Left</button>\n <button slot=\"content\" value=\"top-center\">Top Center</button>\n <button slot=\"content\" value=\"top-right\">Top Right</button>\n <hr slot=\"content\" />\n <button slot=\"content\" value=\"center-left\">Center Left</button>\n <button slot=\"content\" value=\"center-center\">Center Center</button>\n <button slot=\"content\" value=\"center-right\">Center Right</button>\n <hr slot=\"content\" />\n <button slot=\"content\" value=\"bottom-left\">Bottom Left</button>\n <button slot=\"content\" value=\"bottom-center\">Bottom Center</button>\n <button slot=\"content\" value=\"bottom-right\">Bottom Right</button>\n </ease-dropdown>\n </div>\n `;\n }\n})\nexport class Origin extends HTMLElement {\n declare requestRender: () => void;\n\n @Prop<string>({ reflect: true, defaultValue: 'center-center' })\n accessor value: string = 'center-center';\n\n @Prop<boolean>({ type: Boolean, reflect: true })\n accessor disabled!: boolean;\n\n @Query<Dropdown>('ease-dropdown')\n accessor control!: Dropdown | null;\n\n @Prop<string>({ reflect: true, defaultValue: '' })\n accessor name: string = '';\n\n afterRender(): void {\n setBooleanAttribute(this, 'disabled', Boolean(this.disabled));\n }\n\n @Listen<Origin, Event, Dropdown>('change', { selector: 'ease-dropdown' })\n handleChange(event: Event, target?: Dropdown | null): void {\n if (!target) {\n return;\n }\n\n this.value = String(target.value ?? 'center-center');\n\n dispatchControlEvent(this, 'change', { value: this.value, event });\n }\n\n handleValueChange = (event: Event): void => {\n this.value = String(this.control?.value ?? 'center-center');\n\n dispatchControlEvent(this, 'change', { value: this.value, event });\n };\n}\n","import { html, nothing, type TemplateResult } from 'lit-html';\n\nimport { setBooleanAttribute } from '../shared';\n\nimport { Component } from '~/decorators/Component';\nimport { Listen } from '~/decorators/Listen';\nimport { Prop } from '~/decorators/Prop';\nimport { Query } from '~/decorators/Query';\n\n/**\n * Event detail for tab change events\n */\nexport interface TabChangeEventDetail {\n /** The index of the active tab */\n index: number;\n /** The tab id */\n id: string;\n /** The original event */\n event: Event;\n}\n\n/**\n * Panel component - visual container with optional tabs and header actions.\n *\n * Use this component when you want the panel UI without state management,\n * or wrap it around `<ease-state>` for full functionality.\n *\n * @tag ease-panel\n *\n * @slot headline - Panel title text (hidden when tabs are present)\n * @slot actions - Header action buttons, links, or dropdowns\n * @slot - Default slot for main content\n * @slot tab-{id} - Tab panel content (use `data-tab-label` for display name)\n * @slot footer - Footer content below all panels\n *\n * @csspart section - Outer container\n * @csspart header - Header row containing headline/tabs and actions\n * @csspart headline - Title element\n * @csspart tabs - Tab button container\n * @csspart tab - Individual tab button\n * @csspart actions - Actions container\n * @csspart content - Content wrapper (handles height animations)\n * @csspart body - Inner body container\n * @csspart tab-panel - Individual tab panel\n * @csspart footer - Footer container\n *\n * @fires tab-change - Fired when the active tab changes\n */\n@Component({\n tag: 'ease-panel',\n shadowMode: 'open',\n styles: `\n :host {\n --ease-panel-transition-duration: 120ms;\n --ease-panel-transition-easing: cubic-bezier(.25, 0, .5, 1);\n }\n\n [part=\"section\"] {\n display: block;\n width: 100%;\n max-width: var(--ease-panel-max-width, 332px);\n border-radius: var(--ease-panel-radius, 12px);\n border: 1px solid var(--ease-panel-border-color, var(--color-white-6));\n background-clip: padding-box;\n background: var(--ease-panel-background, var(--color-gray-1000));\n box-shadow: var(--ease-panel-shadow, 0 0 40px 0 var(--color-white-2) inset);\n box-sizing: border-box;\n padding: var(--ease-panel-padding, 12px);\n margin: auto;\n }\n\n [part=\"header\"] {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n margin-bottom: 12px;\n }\n\n [part=\"header\"]:not(:has([part=\"headline\"] slot[name=\"headline\"]::slotted(*))):not(:has([part=\"tabs\"]:not(:empty))):not(:has([part=\"actions\"] slot[name=\"actions\"]::slotted(*))) {\n display: none;\n margin-bottom: 0;\n }\n\n [part=\"headline\"] {\n font-size: var(--ease-panel-title-font-size, 14px);\n font-weight: var(--ease-panel-title-font-weight, 500);\n line-height: var(--ease-panel-title-line-height, 24px);\n font-family: var(--ease-font-family, \"Instrument Sans\", sans-serif);\n color: var(--ease-panel-title-color, var(--color-blue-100));\n margin: 0 0 0 4px;\n flex-grow: 1;\n text-ellipsis: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n }\n\n [part=\"headline\"]:has(+ [part=\"tabs\"]:not(:empty)) {\n display: none;\n }\n\n [part=\"tabs\"] {\n display: flex;\n align-items: center;\n gap: 2px;\n flex-grow: 1;\n margin: 0 0 0 4px;\n }\n\n [part=\"tabs\"]:empty {\n display: none;\n }\n\n [part=\"tab\"] {\n appearance: none;\n font-size: var(--ease-panel-tab-font-size, 13px);\n font-weight: var(--ease-panel-tab-font-weight, 500);\n line-height: var(--ease-panel-tab-line-height, 24px);\n font-family: var(--ease-font-family, \"Instrument Sans\", sans-serif);\n color: var(--ease-panel-tab-color, var(--color-gray-600));\n background: transparent;\n border: none;\n padding: 4px 8px;\n margin: 0;\n cursor: pointer;\n border-radius: var(--ease-panel-tab-radius, 6px);\n transition: color 0.2s, background-color 0.2s;\n }\n\n [part=\"tab\"]:hover {\n color: var(--ease-panel-tab-color-hover, var(--color-blue-100));\n }\n\n [part=\"tab\"][aria-selected=\"true\"] {\n color: var(--ease-panel-tab-color-active, var(--color-blue-100));\n background: var(--ease-panel-tab-background-active, var(--color-white-4));\n }\n\n [part=\"actions\"] {\n display: flex;\n align-items: center;\n gap: 4px;\n margin-left: auto;\n }\n\n slot[name=\"actions\"]::slotted(button),\n slot[name=\"actions\"]::slotted(a) {\n --ease-icon-size: var(--ease-panel-action-icon-size, 16px);\n\n appearance: none;\n flex: 0 0 24px;\n border: none;\n outline: none;\n background-color: transparent;\n padding: 4px;\n margin: 0;\n cursor: pointer;\n color: var(--color-gray-600);\n transition: color 0.2s;\n text-decoration: none;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n slot[name=\"actions\"]::slotted(button:hover),\n slot[name=\"actions\"]::slotted(button:focus-visible),\n slot[name=\"actions\"]::slotted(a:hover),\n slot[name=\"actions\"]::slotted(a:focus-visible) {\n color: var(--color-blue-100);\n }\n\n slot[name=\"actions\"]::slotted(ease-dropdown) {\n flex: 0 0 auto;\n width: auto;\n\n --ease-icon-size: var(--ease-panel-action-icon-size, 16px);\n --ease-dropdown-trigger-padding: 4px;\n --ease-dropdown-radius: 6px;\n --ease-dropdown-background: transparent;\n --ease-dropdown-background-hover: transparent;\n --ease-dropdown-shadow: none;\n --ease-dropdown-color: var(--color-gray-600);\n --ease-popover-placement: bottom-end;\n }\n\n slot[name=\"actions\"]::slotted(ease-dropdown:hover),\n slot[name=\"actions\"]::slotted(ease-dropdown:focus-within) {\n --ease-dropdown-color: var(--color-blue-100);\n }\n\n [part=\"content\"] {\n display: block;\n width: 100%;\n box-sizing: border-box;\n margin: auto;\n overflow: hidden;\n }\n\n [part=\"content\"][data-animating=\"true\"] {\n transition: height var(--ease-panel-transition-duration) var(--ease-panel-transition-easing);\n }\n\n [part=\"body\"] {\n width: 100%;\n position: relative;\n }\n\n [part=\"tab-panel\"] {\n width: 100%;\n pointer-events: none;\n display: none;\n }\n\n [part=\"tab-panel\"][data-state=\"active\"] {\n display: block;\n pointer-events: auto;\n }\n\n [part=\"tab-panel\"][data-state=\"hidden\"] {\n display: none;\n pointer-events: none;\n }\n\n [part=\"footer\"] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n padding: var(--ease-panel-footer-padding, 12px);\n box-sizing: border-box;\n border-top: 1px solid var(--color-white-4);\n\n &:not(:has([data-has-content=\"true\"])) {\n display: none;\n }\n }\n\n ::slotted(:not([slot])),\n ::slotted([slot^=\"tab-\"]) {\n display: grid;\n gap: 12px;\n box-sizing: border-box;\n width: 100%;\n }\n `\n})\nexport class Panel extends HTMLElement {\n declare requestRender: () => void;\n\n #tabs: { id: string; label: string }[] = [];\n #isAnimating = false;\n\n @Prop<number>({\n type: Number,\n reflect: true,\n attribute: 'active-tab',\n defaultValue: 0,\n onChange(next, previous) {\n const self = this as Panel;\n if (next !== previous && previous !== undefined) {\n self.handleActiveTabChange(previous, next);\n }\n }\n })\n accessor activeTab: number = 0;\n\n /** @internal */\n handleActiveTabChange(previous: number, next: number): void {\n this.performTabAnimation(previous, next);\n }\n\n @Query<HTMLElement>('[part=\"content\"]')\n accessor contentElement!: HTMLElement | null;\n\n @Query<HTMLElement>('[part=\"body\"]')\n accessor bodyElement!: HTMLElement | null;\n\n /**\n * Get the tab configuration\n */\n get tabs(): ReadonlyArray<{ id: string; label: string }> {\n return this.#tabs;\n }\n\n /**\n * Switch to a specific tab by index\n * @param index - The tab index (0-based)\n */\n setTab(index: number): void {\n if (index >= 0 && index < this.#tabs.length && index !== this.activeTab) {\n this.activeTab = index;\n }\n }\n\n connectedCallback(): void {\n this.#syncTabs();\n }\n\n afterRender(): void {\n this.#syncTabs();\n }\n\n render(): TemplateResult {\n const hasTabs = this.#tabs.length > 0;\n\n return html`\n <section part=\"section\">\n <div part=\"header\">\n <h3 part=\"headline\"><slot name=\"headline\"></slot></h3>\n ${this.#renderTabs()}\n <div part=\"actions\">\n <slot name=\"actions\"></slot>\n </div>\n </div>\n <div part=\"content\">\n <div part=\"body\">\n ${hasTabs ? this.#renderTabPanels() : html`<slot></slot>`}\n </div>\n </div>\n <div part=\"footer\">\n <slot name=\"footer\"></slot>\n </div>\n </section>\n `;\n }\n\n #renderTabs(): TemplateResult | typeof nothing {\n if (this.#tabs.length === 0) {\n return nothing;\n }\n\n return html`\n <div part=\"tabs\" role=\"tablist\">\n ${this.#tabs.map(\n (tab, index) => html`\n <button\n part=\"tab\"\n role=\"tab\"\n aria-selected=${index === this.activeTab ? 'true' : 'false'}\n aria-controls=${`panel-${tab.id}`}\n tabindex=${index === this.activeTab ? 0 : -1}\n @click=${(e: Event) => this.#handleTabClick(index, tab.id, e)}\n @keydown=${(e: KeyboardEvent) => this.#handleTabKeydown(e, index)}\n >\n ${tab.label}\n </button>\n `\n )}\n </div>\n `;\n }\n\n #renderTabPanels(): TemplateResult {\n return html`\n ${this.#tabs.map(\n (tab, index) => html`\n <div\n part=\"tab-panel\"\n role=\"tabpanel\"\n id=${`panel-${tab.id}`}\n aria-labelledby=${`tab-${tab.id}`}\n data-state=${index === this.activeTab ? 'active' : 'hidden'}\n data-index=${index}\n >\n <slot name=${`tab-${tab.id}`}></slot>\n </div>\n `\n )}\n `;\n }\n\n #handleTabClick(index: number, id: string, event: Event): void {\n if (index === this.activeTab) {\n return;\n }\n\n this.activeTab = index;\n\n this.dispatchEvent(\n new CustomEvent<TabChangeEventDetail>('tab-change', {\n detail: { index, id, event },\n bubbles: true,\n composed: true\n })\n );\n }\n\n #handleTabKeydown(event: KeyboardEvent, currentIndex: number): void {\n let newIndex = currentIndex;\n\n switch (event.key) {\n case 'ArrowLeft':\n event.preventDefault();\n newIndex = currentIndex > 0 ? currentIndex - 1 : this.#tabs.length - 1;\n break;\n case 'ArrowRight':\n event.preventDefault();\n newIndex = currentIndex < this.#tabs.length - 1 ? currentIndex + 1 : 0;\n break;\n case 'Home':\n event.preventDefault();\n newIndex = 0;\n break;\n case 'End':\n event.preventDefault();\n newIndex = this.#tabs.length - 1;\n break;\n default:\n return;\n }\n\n if (newIndex !== currentIndex) {\n this.activeTab = newIndex;\n\n // Focus the new tab button\n queueMicrotask(() => {\n const tabButtons = this.shadowRoot?.querySelectorAll('[part=\"tab\"]');\n const newTabButton = tabButtons?.[newIndex] as HTMLButtonElement | undefined;\n newTabButton?.focus();\n });\n }\n }\n\n async performTabAnimation(fromIndex: number, toIndex: number): Promise<void> {\n if (this.#isAnimating) {\n return;\n }\n\n this.#isAnimating = true;\n\n const duration = 120;\n const easing = 'cubic-bezier(.25, 0, .5, 1)';\n\n const content = this.contentElement;\n\n if (!content) {\n this.#isAnimating = false;\n this.requestRender();\n return;\n }\n\n // Get the panels by data-index attribute for reliability\n const fromPanel = this.shadowRoot?.querySelector(\n `[part=\"tab-panel\"][data-index=\"${fromIndex}\"]`\n ) as HTMLElement | null;\n const toPanel = this.shadowRoot?.querySelector(`[part=\"tab-panel\"][data-index=\"${toIndex}\"]`) as HTMLElement | null;\n\n if (!fromPanel || !toPanel) {\n this.#isAnimating = false;\n this.requestRender();\n return;\n }\n\n // Lock the current height\n const startHeight = content.getBoundingClientRect().height;\n content.style.height = `${startHeight}px`;\n\n // FIX: Ensure the new panel is hidden immediately.\n toPanel.style.display = 'none';\n toPanel.style.opacity = '0';\n\n // Fade out old content via WAAPI\n try {\n const fadeOut = fromPanel.animate([{ opacity: 1 }, { opacity: 0 }], { duration, easing, fill: 'forwards' });\n await fadeOut.finished;\n fadeOut.cancel();\n } catch {\n // ignore\n }\n\n fromPanel.setAttribute('data-state', 'hidden');\n\n // Prepare and measure new panel while completely invisible\n const previousToState = toPanel.getAttribute('data-state');\n\n toPanel.style.display = 'block';\n toPanel.style.visibility = 'hidden';\n toPanel.style.opacity = '0';\n\n // Force layout, then measure\n void toPanel.offsetHeight;\n const endHeight = toPanel.getBoundingClientRect().height;\n\n // Animate height\n if (startHeight !== endHeight) {\n content.setAttribute('data-animating', 'true');\n void content.offsetHeight;\n content.style.height = `${endHeight}px`;\n await this.#wait(duration);\n }\n\n // Show panel but keep opacity at 0, then fade in\n toPanel.style.visibility = 'visible';\n toPanel.style.opacity = '0';\n\n void toPanel.offsetHeight;\n\n try {\n const fadeIn = toPanel.animate([{ opacity: 0 }, { opacity: 1 }], { duration, easing, fill: 'forwards' });\n await fadeIn.finished;\n fadeIn.cancel();\n } catch {\n // ignore\n }\n\n // Finalize new tab state and cleanup\n toPanel.style.display = '';\n toPanel.style.visibility = '';\n toPanel.style.opacity = '';\n\n if (previousToState !== 'active') {\n toPanel.setAttribute('data-state', 'active');\n }\n\n content.style.height = '';\n content.removeAttribute('data-animating');\n this.#isAnimating = false;\n }\n\n #wait(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n #syncTabs(): void {\n const tabs: { id: string; label: string }[] = [];\n\n for (const child of Array.from(this.children)) {\n const slot = child.getAttribute('slot');\n if (slot?.startsWith('tab-')) {\n const id = slot.replace('tab-', '');\n const label = child.getAttribute('data-tab-label') || id;\n tabs.push({ id, label });\n }\n }\n\n this.#tabs = tabs.slice(0, 3);\n\n if (this.activeTab >= this.#tabs.length && this.#tabs.length > 0) {\n this.activeTab = 0;\n }\n }\n\n @Listen('slotchange', { selector: 'slot[name=\"footer\"]' })\n onFooterSlotChange(): void {\n this.updateFooterAttribute();\n }\n\n @Listen('slotchange', { selector: 'slot:not([name])' })\n onDefaultSlotChange(): void {\n this.#syncTabs();\n this.requestRender();\n }\n\n private updateFooterAttribute(): void {\n const footer = this.shadowRoot?.querySelector('[part=\"footer\"]');\n\n if (!footer) {\n return;\n }\n\n const footerSlot = this.shadowRoot?.querySelector('slot[name=\"footer\"]') as HTMLSlotElement;\n const hasFooter = Boolean(footerSlot?.assignedNodes({ flatten: true }).length > 0);\n setBooleanAttribute(footer, 'data-has-content', hasFooter);\n }\n}\n","import { html } from 'lit-html';\n\nimport { Component } from '~/decorators/Component';\nimport { Prop } from '~/decorators/Prop';\nimport { Query } from '~/decorators/Query';\nimport '../button';\n\nimport { dispatchControlEvent } from '../shared';\n\nexport * from './option';\n\ninterface RadioEntry {\n element: HTMLElement;\n value: string;\n label: string;\n id: string;\n handlers: {\n click: (event: Event) => void;\n keydown: (event: KeyboardEvent) => void;\n };\n}\nconst nextOptionId = (() => {\n let counter = 0;\n return () => {\n counter += 1;\n return `ease-radio-option-${counter}`;\n };\n})();\n\nconst nextPanelId = (() => {\n let counter = 0;\n return () => {\n counter += 1;\n return `ease-radio-content-${counter}`;\n };\n})();\n\n@Component({\n tag: 'ease-radio-group',\n shadowMode: 'open',\n styles: `\n :host {\n display: flex;\n }\n\n [part=\"option\"] {\n flex: 0 0 50%;\n display: block;\n }\n\n [part=\"group\"] {\n display: flex;\n position: relative;\n z-index: 0;\n box-sizing: border-box;\n width: 100%;\n min-width: 0;\n padding: var(--ease-radio-padding, 3px);\n border-radius: var(--ease-radio-radius, var(--radii-md));\n background-color: var(--ease-radio-background, var(--color-gray-875));\n box-shadow: var(\n --ease-radio-shadow,\n inset 0 1px 0.25px 0 var(--color-white-4),\n 0 1px 2.5px 0 var(--color-black-8)\n );\n\n ::slotted(button) {\n padding: var(--ease-radio-option-padding, 4px 0);\n line-height: var(--ease-radio-option-line-height, 16px);\n margin: 0;\n border: none;\n outline: none;\n background: none;\n cursor: pointer;\n font-family: var(--ease-font-family, inherit);\n font-optical-sizing: auto;\n font-size: var(--ease-radio-option-font-size, var(--ease-font-size-sm, 12px));\n font-weight: var(--ease-radio-option-font-weight, 500);\n color: var(--ease-radio-option-color, var(--color-gray-600));\n transition: color 0.2s;\n flex-grow: 1;\n }\n\n ::slotted(button:hover),\n ::slotted(button:focus-visible) {\n color: var(--color-blue-100);\n }\n\n ::slotted(button[data-active=\"true\"]) {\n color: var(--color-blue-100);\n }\n }\n `,\n template() {\n return html`\n <div part=\"group\">\n <slot name=\"content\"></slot>\n </div>\n `;\n }\n})\nexport class RadioGroup extends HTMLElement {\n declare requestRender: () => void;\n\n @Prop<string | null, RadioGroup>({\n reflect: true,\n defaultValue: null,\n onChange(this: RadioGroup, next, previous) {\n if (next === previous) {\n return;\n }\n this.updateOptionSelectionState();\n }\n })\n accessor value: string | null = null;\n\n @Query<HTMLElement>('[part=\"group\"]')\n accessor groupElement!: HTMLElement | null;\n\n @Query<HTMLSlotElement>('slot[name=\"content\"]')\n accessor contentSlot!: HTMLSlotElement | null;\n\n #options: RadioEntry[] = [];\n #currentSlot: HTMLSlotElement | null = null;\n #optionsInitialized = false;\n #handleSlotChange = (): void => {\n this.#syncOptions();\n };\n\n connectedCallback(): void {\n this.#ensureSlotListener();\n }\n\n disconnectedCallback(): void {\n this.#removeSlotListener();\n this.#teardownOptions();\n }\n\n afterRender(): void {\n const panel = this.groupElement;\n\n if (panel) {\n if (!panel.id) {\n panel.id = nextPanelId();\n }\n panel.tabIndex = -1;\n panel.setAttribute('role', 'radiogroup');\n }\n\n this.#ensureSlotListener();\n\n if (!this.#optionsInitialized) {\n queueMicrotask(() => {\n this.#syncOptions();\n });\n } else {\n this.updateOptionSelectionState();\n }\n }\n\n #ensureSlotListener(): void {\n const slot = this.contentSlot;\n\n if (slot === this.#currentSlot) {\n return;\n }\n\n if (this.#currentSlot) {\n this.#currentSlot.removeEventListener('slotchange', this.#handleSlotChange);\n }\n\n if (slot) {\n slot.addEventListener('slotchange', this.#handleSlotChange);\n }\n\n this.#currentSlot = slot ?? null;\n }\n\n #removeSlotListener(): void {\n if (!this.#currentSlot) {\n return;\n }\n\n this.#currentSlot.removeEventListener('slotchange', this.#handleSlotChange);\n this.#currentSlot = null;\n }\n\n #syncOptions(): void {\n const assigned = this.contentSlot?.assignedElements({ flatten: true }) ?? [];\n const elements = assigned.filter((node): node is HTMLElement => node instanceof HTMLElement);\n\n this.#removeOptionListeners(this.#options);\n\n const options: RadioEntry[] = [];\n\n elements.forEach((element) => {\n if (element.hasAttribute('data-select-ignore') || element.getAttribute('role') === 'separator') {\n return;\n }\n\n const value = this.#resolveOptionValue(element);\n const label = this.#resolveOptionLabel(element, value);\n const id = element.id && element.id.trim().length > 0 ? element.id : nextOptionId();\n\n if (!element.id) {\n element.id = id;\n }\n\n element.setAttribute('role', 'option');\n element.setAttribute('aria-selected', 'false');\n element.setAttribute('variant', this.value === value ? 'default' : 'link');\n element.dataset.active = 'false';\n element.tabIndex = -1;\n\n const handlers = {\n click: (event: Event) => {\n event.preventDefault();\n event.stopPropagation();\n this.#selectOption(value, label, event);\n },\n keydown: (event: KeyboardEvent) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n this.#selectOption(value, label, event);\n }\n }\n } as RadioEntry['handlers'];\n\n element.addEventListener('click', handlers.click, { passive: false });\n element.addEventListener('keydown', handlers.keydown);\n\n options.push({ element, value, label, id, handlers });\n });\n\n this.#options = options;\n this.#optionsInitialized = options.length > 0;\n\n if (this.value === null && options.length > 0) {\n const preselected = options.find(\n (option) =>\n option.element.hasAttribute('selected') ||\n option.element.dataset.selected === 'true' ||\n option.element.getAttribute('aria-selected') === 'true'\n );\n\n if (preselected) {\n this.value = preselected.value;\n }\n }\n\n this.updateOptionSelectionState();\n }\n\n #teardownOptions(): void {\n this.#removeOptionListeners(this.#options);\n this.#options = [];\n this.#optionsInitialized = false;\n }\n\n #removeOptionListeners(options: RadioEntry[]): void {\n options.forEach((option) => {\n option.element.removeEventListener('click', option.handlers.click);\n option.element.removeEventListener('keydown', option.handlers.keydown);\n option.element.dataset.active = 'false';\n option.element.setAttribute('aria-selected', 'false');\n option.element.tabIndex = -1;\n });\n }\n\n updateOptionSelectionState(): void {\n if (!this.#optionsInitialized) {\n return;\n }\n\n let selectedLabel: string | null = null;\n\n const options = this.#options;\n\n options.forEach((option) => {\n const isSelected = this.value !== null && option.value === this.value;\n option.element.setAttribute('aria-selected', isSelected ? 'true' : 'false');\n option.element.dataset.active = isSelected ? 'true' : 'false';\n option.element.tabIndex = isSelected ? 0 : -1;\n option.element.setAttribute('variant', isSelected ? 'default' : 'link');\n\n if (isSelected) {\n selectedLabel = option.label;\n }\n });\n\n if (!selectedLabel) {\n const fallback = options[0];\n if (fallback) {\n fallback.element.tabIndex = 0;\n }\n }\n const hasValue = Boolean(this.value && selectedLabel);\n this.toggleAttribute('data-has-value', hasValue);\n }\n\n #selectOption(value: string, label: string, originEvent: Event): void {\n originEvent.preventDefault();\n originEvent.stopPropagation();\n\n const previousValue = this.value;\n this.value = value;\n\n if (previousValue !== value) {\n this.#dispatchValueChange(value, label, originEvent);\n }\n }\n\n #resolveOptionValue(element: HTMLElement): string {\n const explicitValue = element.getAttribute('value') ?? element.getAttribute('data-value') ?? element.dataset.value;\n\n if (explicitValue && explicitValue.trim().length > 0) {\n return explicitValue.trim();\n }\n\n const text = element.textContent?.trim();\n\n if (text && text.length > 0) {\n return text;\n }\n\n const fallback = nextOptionId();\n element.dataset.value = fallback;\n return fallback;\n }\n\n #resolveOptionLabel(element: HTMLElement, fallback: string): string {\n const explicitLabel = element.getAttribute('data-label') ?? element.getAttribute('aria-label');\n\n if (explicitLabel && explicitLabel.trim().length > 0) {\n return explicitLabel.trim();\n }\n\n const text = element.textContent?.trim();\n\n if (text && text.length > 0) {\n return text;\n }\n\n return fallback;\n }\n\n #dispatchValueChange(value: string, label: string, event: Event): void {\n dispatchControlEvent(this, 'change', { value, event });\n\n this.dispatchEvent(\n new CustomEvent('value-change', {\n detail: { value, label, event },\n bubbles: true,\n composed: true\n })\n );\n }\n}\n","export class RadioOption extends HTMLElement {\n connectedCallback(): void {\n this.hidden = true;\n if (!this.hasAttribute('slot')) {\n this.setAttribute('slot', 'option');\n }\n }\n}\n\nif (!customElements.get('radio-option')) {\n customElements.define('radio-option', RadioOption);\n}\n","import { html } from 'lit-html';\n\nimport { dispatchControlEvent, setBooleanAttribute } from '../shared';\n\nimport { Component } from '~/decorators/Component';\nimport { Listen } from '~/decorators/Listen';\nimport { Prop } from '~/decorators/Prop';\nimport { Query } from '~/decorators/Query';\n\n@Component({\n tag: 'ease-radio-input',\n shadowMode: 'open',\n styles: `\n .radio {\n display: table;\n border-radius: var(--ease-radio-input-radius, 12px);\n position: relative;\n }\n\n [part=\"radio\"] {\n display: table;\n appearance: none;\n outline: none;\n border: none;\n background: none;\n margin: 0;\n padding: 0;\n border-radius: inherit;\n }\n\n [part=\"control\"] {\n appearance: none;\n outline: none;\n border: none;\n background: none;\n display: block;\n cursor: pointer;\n margin: 0;\n padding: 0;\n border-radius: inherit;\n width: var(--ease-radio-input-size, 24px);\n height: var(--ease-radio-input-size, 24px);\n }\n\n .radio svg {\n display: block;\n position: absolute;\n left: 0;\n right: 0;\n bottom: 0;\n top: 0;\n pointer-events: none;\n fill: var(--ease-radio-input-dot-color, var(--color-blue-100));\n transform: scale(1.01) translateZ(0);\n }\n\n [part=\"control\"] {\n box-shadow: inset 0 0 0 var(--ease-radio-input-border-width, 2px) var(--ease-radio-input-border-color, var(--color-gray-700));\n }\n\n .radio svg .top {\n transform-origin: 12px -12px;\n transform: translateY(0) scale(1.75, 1) translateZ(0);\n opacity: 0;\n }\n\n .radio svg .dot {\n transform: translateY(-17px) translateZ(0);\n opacity: 0;\n }\n\n .radio svg .drop {\n transform: translateY(-14px) translateZ(0);\n opacity: 0;\n }\n\n [part=\"control\"]:checked {\n box-shadow: inset 0 0 0 var(--ease-radio-input-checked-fill-size, 6.75px) var(--ease-radio-input-checked-fill, var(--color-blue-800));\n }\n\n [part=\"control\"]:checked + svg .top {\n transform: translateY(0px) scale(1.75, 1) translateZ(0);\n opacity: 1;\n }\n\n [part=\"control\"]:checked + svg .dot {\n transform: translateY(0px) translateZ(0);\n opacity: 1;\n }\n\n [part=\"control\"]:checked + svg .drop {\n transform: translateY(0px) translateZ(0);\n opacity: 1;\n }\n\n [part=\"control\"].anim-checked {\n animation: radio-border-expand 0.8s ease-out forwards;\n }\n\n [part=\"control\"].anim-checked + svg .top {\n animation: radio-top 0.8s ease-out 0.2s forwards;\n }\n\n [part=\"control\"].anim-checked + svg .dot {\n animation: radio-dot 0.6s ease-out 0.2s forwards;\n }\n\n [part=\"control\"].anim-checked + svg .drop {\n animation: radio-drop 0.6s ease-out 0.4s forwards;\n }\n\n [part=\"control\"].anim-unchecked {\n animation: radio-border-contract 0.8s ease-out forwards;\n }\n\n [part=\"control\"].anim-unchecked + svg .top {\n animation: radio-top-reverse 0.8s ease-out forwards;\n }\n\n [part=\"control\"].anim-unchecked + svg .dot {\n animation: radio-dot-reverse 0.6s ease-out forwards;\n }\n\n [part=\"control\"].anim-unchecked + svg .drop {\n animation: radio-drop-reverse 0.6s ease-out forwards;\n }\n\n @keyframes radio-border-expand {\n 0% {\n box-shadow: inset 0 0 0 var(--ease-radio-input-border-width, 2px) var(--ease-radio-input-border-color, var(--color-gray-700));\n }\n 25% {\n box-shadow: inset 0 0 0 var(--ease-radio-input-checked-fill-max, 12px) var(--ease-radio-input-checked-fill, var(--color-blue-800));\n }\n 100% {\n box-shadow: inset 0 0 0 var(--ease-radio-input-checked-fill-size, 6.75px) var(--ease-radio-input-checked-fill, var(--color-blue-800));\n }\n }\n\n @keyframes radio-top {\n 0% {\n transform: translateY(0) scale(1.75, 1) translateZ(0);\n }\n 25% {\n transform: translateY(6px) scale(1, 1.25) translateZ(0);\n }\n 100% {\n transform: translateY(0px) scale(1.75, 1) translateZ(0);\n }\n }\n\n @keyframes radio-dot {\n 0% {\n transform: translateY(-17px) translateZ(0);\n }\n 50% {\n transform: translateY(2px) translateZ(0);\n }\n 100% {\n transform: translateY(0px) translateZ(0);\n }\n }\n\n @keyframes radio-drop {\n 0% {\n transform: translateY(-14px) translateZ(0);\n }\n 100% {\n transform: translateY(0px) translateZ(0);\n }\n }\n\n @keyframes radio-border-contract {\n 0% {\n box-shadow: inset 0 0 0 var(--ease-radio-input-checked-fill-size, 6.75px) var(--ease-radio-input-checked-fill, var(--color-blue-800));\n }\n 75% {\n box-shadow: inset 0 0 0 var(--ease-radio-input-checked-fill-max, 12px) var(--ease-radio-input-checked-fill, var(--color-blue-800));\n }\n 100% {\n box-shadow: inset 0 0 0 var(--ease-radio-input-border-width, 2px) var(--ease-radio-input-border-color, var(--color-gray-700));\n }\n }\n\n @keyframes radio-top-reverse {\n 0% {\n transform: translateY(0px) scale(1.75, 1) translateZ(0);\n opacity: 1;\n }\n 75% {\n transform: translateY(6px) scale(1, 1.25) translateZ(0);\n opacity: 1;\n }\n 100% {\n transform: translateY(0) scale(1.75, 1) translateZ(0);\n opacity: 0;\n }\n }\n\n @keyframes radio-dot-reverse {\n 0% {\n transform: translateY(0px) translateZ(0);\n opacity: 1;\n }\n 50% {\n transform: translateY(2px) translateZ(0);\n opacity: 1;\n }\n 100% {\n transform: translateY(-17px) translateZ(0);\n opacity: 0;\n }\n }\n\n @keyframes radio-drop-reverse {\n 0% {\n transform: translateY(0px) translateZ(0);\n opacity: 1;\n }\n 100% {\n transform: translateY(-14px) translateZ(0);\n opacity: 0;\n }\n }\n `,\n template(this: RadioInput) {\n return html`\n <button part=\"radio\" type=\"button\" role=\"radio\" aria-checked=${this.checked} ?disabled=${this.disabled}>\n <div class=\"radio\">\n <input part=\"control\" name=${this.name} value=${this.value} ?checked=${this.checked} ?disabled=${this.disabled} type=\"radio\" />\n <svg viewBox=\"0 0 24 24\" filter=\"url(#${this.filterId})\">\n <circle class=\"top\" cx=\"12\" cy=\"-12\" r=\"8\" />\n <circle class=\"dot\" cx=\"12\" cy=\"12\" r=\"5\" />\n <circle class=\"drop\" cx=\"12\" cy=\"12\" r=\"2\" />\n </svg>\n </div>\n\n <svg style=\"display: none;\">\n <defs>\n <filter id=\"${this.filterId}\">\n <feGaussianBlur in=\"SourceGraphic\" stdDeviation=\"1.25\" result=\"blur\" />\n <feColorMatrix in=\"blur\" mode=\"matrix\" values=\"1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 20 -9\" result=\"gooey\" />\n <feBlend in=\"SourceGraphic\" in2=\"gooey\" />\n </filter>\n </defs>\n </svg>\n </button>\n `;\n }\n})\nexport class RadioInput extends HTMLElement {\n declare requestRender: () => void;\n\n @Prop<boolean, RadioInput>({\n type: Boolean,\n reflect: true,\n onChange(this: RadioInput, next: boolean) {\n if (next && this.name) {\n const form = this.closest('form');\n const root = form ?? (this.getRootNode() as Document | ShadowRoot);\n const others = Array.from(root.querySelectorAll(`ease-radio-input[name=\"${this.name}\"]`)) as RadioInput[];\n\n others.forEach((other) => {\n if (other !== this && other.checked) {\n other.checked = false;\n }\n });\n }\n }\n })\n accessor checked!: boolean;\n\n @Prop<string | null>({ reflect: true })\n accessor name!: string | null;\n\n @Prop<string | null>({ reflect: true })\n accessor value!: string | null;\n\n @Prop<boolean>({ type: Boolean, reflect: true })\n accessor disabled!: boolean;\n\n @Query<HTMLButtonElement>('button')\n accessor control!: HTMLButtonElement | null;\n\n private _prevChecked?: boolean;\n private _firstRender = true;\n\n filterId: string = `goo-${crypto.randomUUID()}`;\n\n connectedCallback(): void {\n this._prevChecked = this.checked;\n }\n\n afterRender(): void {\n if (!this.control) {\n return;\n }\n\n if (this._firstRender) {\n this._firstRender = false;\n this._prevChecked = this.checked;\n }\n\n const changed = typeof this._prevChecked !== 'undefined' && this.checked !== this._prevChecked;\n if (changed) {\n this._triggerAnimation(this.checked);\n this._prevChecked = this.checked;\n }\n\n const control = this.control;\n control.setAttribute('aria-checked', this.checked ? 'true' : 'false');\n control.disabled = Boolean(this.disabled);\n setBooleanAttribute(this, 'disabled', Boolean(this.disabled));\n }\n\n private _triggerAnimation(checked: boolean): void {\n const input = this.shadowRoot?.querySelector('[part=\"control\"]') as HTMLInputElement;\n const svg = this.shadowRoot?.querySelector('svg[viewBox=\"0 0 24 24\"]');\n if (!input || !svg) {\n return;\n }\n\n input.classList.remove('anim-checked', 'anim-unchecked');\n svg.classList.remove('anim-checked', 'anim-unchecked');\n\n const animClass = checked ? 'anim-checked' : 'anim-unchecked';\n input.classList.add(animClass);\n svg.classList.add(animClass);\n\n const duration = 800; // Longest animation duration in ms\n\n setTimeout(() => {\n input.classList.remove(animClass);\n svg.classList.remove(animClass);\n }, duration);\n }\n\n @Listen<RadioInput, MouseEvent, HTMLButtonElement>('click', { selector: 'button' })\n handleClick(event: MouseEvent): void {\n if (this.disabled || this.checked) {\n event.preventDefault();\n event.stopPropagation();\n\n return;\n }\n\n this.checked = true;\n\n dispatchControlEvent(this, 'radio', { value: this.checked, event });\n }\n}\n","import '../input';\n\nimport { html } from 'lit-html';\n\nimport { type ControlEventDetail, coerceNumber, dispatchControlEvent, setBooleanAttribute } from '../shared';\n\nimport { Component } from '~/decorators/Component';\nimport { Listen } from '~/decorators/Listen';\nimport { Prop } from '~/decorators/Prop';\nimport { Query } from '~/decorators/Query';\n\n@Component({\n tag: 'ease-slider',\n styles: `\n :host {\n display: contents;\n --track-color: var(--ease-slider-track-color, var(--color-gray-825));\n --active-track-color: var(--ease-slider-active-track-color, var(--color-blue-1100));\n --thumb-color: var(--ease-slider-thumb-color, var(--color-blue-900));\n --thumb-size: var(--ease-slider-thumb-size, 18px);\n --track-height: var(--ease-slider-track-height, 4px);\n }\n\n [part=\"container\"] {\n flex: 1;\n display: grid;\n grid-template-columns: auto var(--ease-slider-value-width, 36px);\n grid-gap: var(--ease-slider-gap, 12px);\n }\n\n ease-input[part=\"value\"] {\n --ease-input-padding: 8px 0;\n min-width: 0;\n text-align: center;\n width: var(--ease-slider-value-width, 36px);\n font-variant-numeric: tabular-nums;\n font-feature-settings: \"tnum\";\n font-family: var(--ease-font-mono, 'Geist Mono', monospace);\n }\n\n input[part=\"control\"][type=\"range\"] {\n height: var(--ease-slider-height, 30px);\n margin: 0;\n padding: 0;\n appearance: none;\n background-color: transparent;\n width: 100%;\n cursor: pointer;\n }\n\n input[part=\"control\"][type=\"range\"]::-webkit-slider-runnable-track {\n width: 100%;\n height: var(--track-height);\n background: linear-gradient(to right, var(--active-track-color) var(--progress, 0%), var(--track-color) var(--progress, 0%));\n border-radius: calc(var(--track-height) / 2);\n border: none;\n }\n\n input[part=\"control\"][type=\"range\"]::-moz-range-track {\n width: 100%;\n height: var(--track-height);\n background: var(--track-color);\n border-radius: calc(var(--track-height) / 2);\n border: none;\n }\n\n input[part=\"control\"][type=\"range\"]::-moz-range-progress {\n background-color: var(--active-track-color);\n height: var(--track-height);\n border-radius: calc(var(--track-height) / 2);\n }\n\n input[part=\"control\"][type=\"range\"]::-webkit-slider-thumb {\n appearance: none;\n height: var(--thumb-size);\n width: var(--thumb-size);\n border-radius: 50%;\n margin-top: calc((var(--track-height) - var(--thumb-size)) / 2);\n box-shadow: inset 0 0 0 .75px var(--color-white-15), inset 0 0 5px var(--color-white-20);\n transition: transform 0.2s;\n position: relative;\n background: radial-gradient(circle at center, var(--color-blue-100-50) 4.5px, var(--color-white-0) 4.5px), var(--thumb-color) no-repeat center center;\n }\n \n input[part=\"control\"][type=\"range\"]:hover::-webkit-slider-thumb {\n transform: scale(1.075);\n }\n \n input[part=\"control\"][type=\"range\"]:active::-webkit-slider-thumb {\n transform: scale(.975);\n }\n\n input[part=\"control\"][type=\"range\"]::-moz-range-thumb {\n height: var(--thumb-size);\n width: var(--thumb-size);\n border-radius: 50%;\n background: radial-gradient(circle at center, var(--color-blue-100-50) 4.5px, var(--color-white-0) 4.5px), var(--thumb-color) no-repeat center center;\n border: none;\n box-shadow: inset 0 0 0 .75px var(--color-white-15), inset 0 0 5px var(--color-white-20);\n transition: transform 0.2s;\n position: relative;\n }\n\n input[part=\"control\"][type=\"range\"]:hover::-moz-range-thumb {\n transform: scale(1.075);\n }\n\n input[part=\"control\"][type=\"range\"]:active::-moz-range-thumb {\n transform: scale(.975);\n }\n `,\n template(this: Slider) {\n return html`\n <div part=\"container\">\n <input\n part=\"control\"\n type=\"range\"\n .min=${this.min ?? 0}\n .max=${this.max ?? 100}\n .step=${this.step ?? 1}\n .value=${String(this.value ?? 0)}\n ?disabled=${this.disabled}\n ?aria-disabled=${this.disabled}\n />\n \n <ease-input\n part=\"value\"\n type=\"number\"\n placeholder=\"-\"\n .disabled=${Boolean(this.disabled)}\n .value=${this.value === null || this.value === undefined ? '' : String(this.value)}\n />\n </div>\n `;\n }\n})\nexport class Slider extends HTMLElement {\n declare requestRender: () => void;\n\n @Prop<number | null>({ type: Number, reflect: true })\n accessor value!: number | null;\n\n @Prop<number | null>({ type: Number, reflect: true })\n accessor min!: number | null;\n\n @Prop<number | null>({ type: Number, reflect: true })\n accessor max!: number | null;\n\n @Prop<number | null>({ type: Number, reflect: true })\n accessor step!: number | null;\n\n @Prop<boolean>({ type: Boolean, reflect: true })\n accessor disabled!: boolean;\n\n @Query<HTMLInputElement>('input')\n accessor control!: HTMLInputElement | null;\n\n @Query<HTMLElement>('ease-input')\n accessor valueControl!: (HTMLElement & { value?: string | null }) | null;\n\n afterRender(): void {\n if (!this.control) {\n return;\n }\n\n const control = this.control;\n const value = this.value ?? 0;\n\n control.value = String(value);\n control.min = this.min === null || this.min === undefined ? '' : String(this.min);\n control.max = this.max === null || this.max === undefined ? '' : String(this.max);\n control.step = this.step === null || this.step === undefined ? '' : String(this.step);\n control.type = 'range';\n control.setAttribute('part', 'control');\n control.disabled = Boolean(this.disabled);\n\n setBooleanAttribute(this, 'disabled', Boolean(this.disabled));\n this.updateProgress();\n }\n\n @Listen<Slider, Event, HTMLInputElement>('input', { selector: 'input[type=\"range\"]' })\n handleRangeInput(event: Event, target?: HTMLInputElement | null): void {\n if (!target) {\n return;\n }\n\n const numericValue = coerceNumber(target.value);\n this.value = numericValue;\n this.updateProgress();\n\n if (this.valueControl) {\n this.valueControl.value = numericValue === null ? '' : String(numericValue);\n }\n\n dispatchControlEvent(this, 'input', { value: this.value, event });\n }\n\n @Listen<Slider, Event, HTMLInputElement>('change', { selector: 'input[type=\"range\"]' })\n handleRangeChange(event: Event, target?: HTMLInputElement | null): void {\n if (target) {\n const numericValue = coerceNumber(target.value);\n this.value = numericValue;\n this.updateProgress();\n\n if (this.valueControl) {\n this.valueControl.value = numericValue === null ? '' : String(numericValue);\n }\n }\n\n dispatchControlEvent(this, 'change', { value: this.value, event });\n }\n\n @Listen<Slider, CustomEvent<ControlEventDetail<string>>, HTMLElement>('input', {\n selector: 'ease-input',\n when: (event) => event instanceof CustomEvent && typeof (event as CustomEvent).detail?.value === 'string'\n })\n handleValueInput(event: CustomEvent<ControlEventDetail<string>>): void {\n const rawValue = event.detail?.value ?? '';\n const numericValue = coerceNumber(rawValue);\n this.value = numericValue;\n this.updateProgress();\n\n if (this.control) {\n this.control.value = String(numericValue ?? 0);\n }\n\n dispatchControlEvent(this, 'input', { value: this.value, event: event.detail?.event ?? event });\n }\n\n @Listen<Slider, CustomEvent<ControlEventDetail<string>>, HTMLElement>('change', {\n selector: 'ease-input',\n when: (event) => event instanceof CustomEvent && typeof (event as CustomEvent).detail?.value === 'string'\n })\n handleValueChange(event: CustomEvent<ControlEventDetail<string>>): void {\n const rawValue = event.detail?.value ?? '';\n const numericValue = coerceNumber(rawValue);\n this.value = numericValue;\n this.updateProgress();\n\n if (this.control) {\n this.control.value = String(numericValue ?? 0);\n }\n\n dispatchControlEvent(this, 'change', { value: this.value, event: event.detail?.event ?? event });\n }\n\n updateProgress(): void {\n if (!this.control) {\n return;\n }\n\n // Ensure numeric coercion for proper calculation\n const value = Number(this.value) || 0;\n const min = Number(this.min) || 0;\n const max = Number(this.max) || 100;\n const percent = max === min ? 0 : ((value - min) / (max - min)) * 100;\n this.control.style.setProperty('--progress', `${Math.max(0, Math.min(100, percent))}%`);\n }\n}\n","import { html, type TemplateResult } from 'lit-html';\n\nimport { CONTROL_CHANGE_EVENT, type ControlEventDetail, dispatchControlEvent } from '../shared';\n\nimport { Component } from '~/decorators/Component';\nimport { Listen } from '~/decorators/Listen';\nimport { Prop } from '~/decorators/Prop';\nimport { Query } from '~/decorators/Query';\n\ntype ControlElement = Element & {\n value?: unknown;\n checked?: unknown;\n name?: string;\n};\n\ntype StateChangeCallback<T = unknown> = (value: T, name: string) => void;\ntype StateSubscription = { unsubscribe: () => void };\n\n/**\n * Event detail for state change events\n */\nexport interface StateChangeEventDetail {\n /** The name of the control that changed */\n name: string;\n /** The new value */\n value: unknown;\n /** The complete state object */\n state: Record<string, unknown>;\n /** The original event */\n event: Event;\n}\n\nconst readControlValue = (element: ControlElement): unknown => {\n if (typeof element.value === 'string' || typeof element.value === 'number') {\n return element.value;\n }\n\n if (typeof element.checked === 'boolean') {\n return element.checked;\n }\n\n if ('getAttribute' in element) {\n const attr = (element as Element).getAttribute('value');\n if (attr !== null) {\n return attr;\n }\n }\n\n return element.textContent?.trim() ?? null;\n};\n\nconst getControlName = (element: ControlElement): string | null => {\n if (typeof element.name === 'string' && element.name) {\n return element.name;\n }\n return element.getAttribute?.('name') ?? null;\n};\n\n/**\n * State aggregator component - collects and manages state from child controls.\n *\n * This component provides state management without any visual styling.\n * Use it standalone or wrap it with `<ease-panel>` for a styled container.\n *\n * @tag ease-state\n *\n * @slot - Default slot for controls\n *\n * @fires state-change - Fired when any control value changes\n *\n * @example\n * ```html\n * <!-- Standalone usage (no panel) -->\n * <ease-state>\n * <ease-field label=\"Duration\">\n * <ease-slider name=\"duration\" value=\"1\" min=\"0\" max=\"5\"></ease-slider>\n * </ease-field>\n * <ease-field label=\"Loop\">\n * <ease-toggle name=\"loop\"></ease-toggle>\n * </ease-field>\n * </ease-state>\n *\n * <!-- With panel wrapper -->\n * <ease-panel>\n * <span slot=\"headline\">Animation Controls</span>\n * <ease-state>\n * <ease-field label=\"Duration\">\n * <ease-slider name=\"duration\" value=\"1\" min=\"0\" max=\"5\"></ease-slider>\n * </ease-field>\n * </ease-state>\n * </ease-panel>\n * ```\n */\n@Component({\n tag: 'ease-state',\n shadowMode: 'open',\n styles: `\n :host {\n display: contents;\n }\n\n [part=\"container\"] {\n display: grid;\n gap: var(--ease-state-gap, 12px);\n box-sizing: border-box;\n width: 100%;\n }\n `\n})\nexport class State extends HTMLElement {\n declare requestRender: () => void;\n\n #controls: Map<string, ControlElement> = new Map();\n #state: Record<string, unknown> = {};\n #initialState: Record<string, unknown> = {};\n #subscribers: Map<string | '*', Set<StateChangeCallback>> = new Map();\n\n @Prop<string | null>({ reflect: true })\n accessor value!: string | null;\n\n @Query<HTMLSlotElement>('slot')\n accessor defaultSlot!: HTMLSlotElement | null;\n\n /**\n * Get the current state object with all control values\n */\n get state(): Readonly<Record<string, unknown>> {\n return { ...this.#state };\n }\n\n /**\n * Get a specific control value by name\n * @param name - The control name\n * @returns The control value or undefined\n */\n get(name: string): unknown {\n return this.#state[name];\n }\n\n /**\n * Set a control value programmatically\n * @param name - The control name\n * @param value - The new value\n */\n set(name: string, value: unknown): void {\n const control = this.#controls.get(name);\n if (control) {\n // Update the control element\n if ('value' in control) {\n (control as { value: unknown }).value = value;\n } else if (typeof value === 'boolean' && 'checked' in control) {\n (control as { checked: boolean }).checked = value;\n }\n }\n\n this.#updateState(name, value, new Event('programmatic'));\n }\n\n /**\n * Subscribe to state changes\n * @param nameOrCallback - Control name to watch, '*' for all, or callback for all changes\n * @param callback - Callback when using name filter\n * @returns Subscription with unsubscribe method\n */\n subscribe(callback: StateChangeCallback): StateSubscription;\n subscribe(name: string, callback: StateChangeCallback): StateSubscription;\n subscribe(nameOrCallback: string | StateChangeCallback, callback?: StateChangeCallback): StateSubscription {\n let name: string;\n let cb: StateChangeCallback;\n\n if (typeof nameOrCallback === 'function') {\n name = '*';\n cb = nameOrCallback;\n } else {\n name = nameOrCallback;\n if (!callback) {\n throw new Error('[ease-state] subscribe(name, callback) requires a callback');\n }\n cb = callback;\n }\n\n if (!this.#subscribers.has(name)) {\n this.#subscribers.set(name, new Set());\n }\n this.#subscribers.get(name)?.add(cb);\n\n return {\n unsubscribe: () => {\n this.#subscribers.get(name)?.delete(cb);\n }\n };\n }\n\n /**\n * Reset all controls to their initial values\n */\n reset(): void {\n for (const [name, value] of Object.entries(this.#initialState)) {\n this.set(name, value);\n }\n }\n\n connectedCallback(): void {\n this.#attach();\n this.defaultSlot?.addEventListener('slotchange', this.#handleSlotChange);\n }\n\n disconnectedCallback(): void {\n this.#detach();\n this.defaultSlot?.removeEventListener('slotchange', this.#handleSlotChange);\n }\n\n render(): TemplateResult {\n return html`\n <div part=\"container\">\n <slot></slot>\n </div>\n `;\n }\n\n @Listen<State, CustomEvent<ControlEventDetail>>('input', { target: (host) => host })\n handleInternalInput(event: CustomEvent<ControlEventDetail>): void {\n this.#handleControlEvent(event);\n }\n\n @Listen<State, CustomEvent<ControlEventDetail>>('change', { target: (host) => host })\n handleInternalChange(event: CustomEvent<ControlEventDetail>): void {\n this.#handleControlEvent(event);\n }\n\n @Listen<State, CustomEvent<ControlEventDetail>>(CONTROL_CHANGE_EVENT, { target: (host) => host })\n handleControlChange(event: CustomEvent<ControlEventDetail>): void {\n this.#handleControlEvent(event);\n }\n\n #handleControlEvent(event: Event | CustomEvent<ControlEventDetail>): void {\n if ('detail' in event && event.detail?.name) {\n this.#updateState(event.detail.name, event.detail.value, event);\n return;\n }\n\n if (!(event.target instanceof Element)) {\n return;\n }\n\n const control = event.target as ControlElement;\n const name = getControlName(control);\n\n if (!name || !this.#controls.has(name)) {\n return;\n }\n\n const value = readControlValue(control);\n this.#updateState(name, value, event);\n }\n\n #handleSlotChange = (): void => {\n this.#detach();\n this.#attach();\n };\n\n #attach(): void {\n const slot = this.defaultSlot;\n if (!slot) {\n return;\n }\n\n const findControls = (el: Element): ControlElement[] => {\n const controls: ControlElement[] = [];\n const name = getControlName(el as ControlElement);\n\n if (name) {\n controls.push(el as ControlElement);\n }\n\n if (el.shadowRoot) {\n for (const child of el.shadowRoot.querySelectorAll('[name]')) {\n const childName = getControlName(child as ControlElement);\n if (childName) {\n controls.push(child as ControlElement);\n }\n }\n }\n\n for (const child of el.querySelectorAll('[name]')) {\n const childName = getControlName(child as ControlElement);\n if (childName) {\n controls.push(child as ControlElement);\n }\n }\n\n return controls;\n };\n\n this.#controls.clear();\n this.#state = {};\n\n const elements = slot.assignedElements({ flatten: true });\n\n for (const element of elements) {\n const controls = findControls(element);\n for (const control of controls) {\n const name = getControlName(control);\n if (name) {\n this.#controls.set(name, control);\n const value = readControlValue(control);\n this.#state[name] = value;\n this.#initialState[name] = value;\n }\n }\n }\n\n const first = this.#controls.values().next().value;\n if (first) {\n const name = getControlName(first);\n this.value = name && this.#state[name] != null ? String(this.#state[name]) : null;\n }\n }\n\n #detach(): void {\n this.#controls.clear();\n }\n\n #updateState(name: string, value: unknown, event: Event): void {\n const prevValue = this.#state[name];\n if (prevValue === value) {\n return;\n }\n\n this.#state[name] = value;\n\n this.value = String(value);\n\n for (const cb of this.#subscribers.get(name) ?? []) {\n cb(value, name);\n }\n for (const cb of this.#subscribers.get('*') ?? []) {\n cb(value, name);\n }\n\n dispatchControlEvent(this, 'state-change', {\n name,\n value,\n state: this.state,\n event\n } as StateChangeEventDetail & { event: Event });\n }\n}\n","import { html } from 'lit-html';\n\nimport { dispatchControlEvent, setBooleanAttribute } from '../shared';\n\nimport { Component } from '~/decorators/Component';\nimport { Listen } from '~/decorators/Listen';\nimport { Prop } from '~/decorators/Prop';\nimport { Query } from '~/decorators/Query';\n\n@Component({\n tag: 'ease-toggle',\n styles: `\n :host {\n display: contents;\n }\n\n [part=\"control\"] {\n display: block;\n border-radius: var(--ease-toggle-radius, 10px);\n padding: var(--ease-toggle-padding, 4px);\n margin: 0;\n border: none;\n outline: none;\n appearance: none;\n cursor: pointer;\n background-color: var(--ease-toggle-on-background, var(--color-blue-900));\n transition: box-shadow 0.2s, background-color 0.2s;\n }\n\n [part=\"control\"] svg {\n width: var(--ease-toggle-width, 26px);\n height: var(--ease-toggle-height, 12px);\n display: block;\n fill: none;\n overflow: visible;\n\n path {\n transition: scale 0.2s, translate 0.2s, opacity 0.2s;\n stroke: var(--color-white);\n fill: var(--color-white-80);\n stroke-width: 1.5;\n }\n\n [part=\"default\"] {\n transform-origin: 6px 6px;\n }\n\n [part=\"active\"] {\n transform-origin: 23px 6px;\n }\n\n }\n\n :host([disabled]) [part=\"control\"] {\n cursor: default;\n opacity: 0.75;\n }\n\n :host([checked]) [part=\"control\"] {\n box-shadow: inset 0 0 0 1px var(--color-white-15), inset 0 1px 0 0 var(--color-white-20), inset 0 4px 6px 0 var(--ease-toggle-shadow, var(--color-white-12));\n\n &:hover {\n --ease-toggle-shadow: var(--color-white-30);\n }\n\n svg {\n [part=\"default\"] {\n scale: .25;\n translate: 10px 0;\n opacity: 0;\n }\n\n [part=\"active\"] {\n scale: 1;\n translate: 0 0;\n }\n }\n }\n\n :host(:not([checked])) [part=\"control\"] {\n background-color: var(--ease-toggle-off-background, var(--color-gray-800));\n box-shadow: inset 0 0 0 1px var(--color-white-10), inset 0 1px 0 0 var(--color-white-10), inset 0 4px 6px 0 var(--ease-toggle-shadow, var(--color-white-6));\n\n &:hover {\n --ease-toggle-shadow: var(--color-white-12);\n }\n\n svg {\n [part=\"default\"] {\n scale: 1;\n translate: 0 0;\n }\n\n [part=\"active\"] {\n scale: .25;\n translate: -10px 0;\n opacity: 0;\n }\n }\n }\n `,\n template(this: Toggle) {\n return html`\n <button part=\"control\" type=\"button\" aria-pressed=\"false\">\n <svg viewBox=\"0 0 26 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" filter=\"url(#${this.filterId})\">\n <path part=\"default\" d=\"M0 6C0 2.68629 2.68629 0 6 0V0C9.31371 0 12 2.68629 12 6V6C12 9.31371 9.31371 12 6 12V12C2.68629 12 0 9.31371 0 6V6Z\" />\n <path part=\"active\" d=\"M14 6C14 2.68629 16.6863 0 20 0V0C23.3137 0 26 2.68629 26 6V6C26 9.31371 23.3137 12 20 12V12C16.6863 12 14 9.31371 14 6V6Z\" />\n </svg>\n\n <svg style=\"display: none;\">\n <defs>\n <filter id=\"${this.filterId}\">\n <feGaussianBlur in=\"SourceGraphic\" stdDeviation=\"8\" result=\"blur\" />\n <feColorMatrix in=\"blur\" mode=\"matrix\" values=\"1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 20 -9\" result=\"gooey\" />\n <feBlend in=\"SourceGraphic\" in2=\"gooey\" />\n </filter>\n </defs>\n </svg>\n </button>\n `;\n }\n})\nexport class Toggle extends HTMLElement {\n declare requestRender: () => void;\n @Prop<boolean>({ type: Boolean, reflect: true })\n accessor checked!: boolean;\n\n @Prop<boolean>({ type: Boolean, reflect: true })\n accessor disabled!: boolean;\n\n @Query<HTMLButtonElement>('button')\n accessor control!: HTMLButtonElement | null;\n\n filterId: string = `filter-${crypto.randomUUID()}`;\n\n afterRender(): void {\n if (!this.control) {\n return;\n }\n\n const control = this.control;\n control.setAttribute('aria-pressed', this.checked ? 'true' : 'false');\n control.disabled = Boolean(this.disabled);\n setBooleanAttribute(this, 'disabled', Boolean(this.disabled));\n }\n\n @Listen<Toggle, MouseEvent, HTMLButtonElement>('click', { selector: 'button' })\n handleClick(event: MouseEvent): void {\n if (this.disabled) {\n event.preventDefault();\n event.stopPropagation();\n\n return;\n }\n\n this.checked = !this.checked;\n\n dispatchControlEvent(this, 'toggle', { value: this.checked, event });\n }\n}\n","import type { Placement } from '~/elements/popover';\nimport '../popover';\n\nimport { html, type TemplateResult } from 'lit-html';\n\nimport { Component } from '~/decorators/Component';\nimport { OutsideClick, requestOutsideClickUpdate } from '~/decorators/OutsideClick';\nimport { Prop } from '~/decorators/Prop';\nimport { Query } from '~/decorators/Query';\n\n@Component({\n tag: 'ease-tooltip',\n shadowMode: 'open',\n styles: `\n :host {\n display: inline-block;\n position: relative;\n }\n\n ease-popover::part(content) {\n inset: auto;\n }\n\n [data-tooltip-content] {\n background-color: var(--ease-tooltip-background, var(--color-gray-400));\n color: var(--ease-tooltip-color, var(--color-gray-900));\n padding: var(--ease-tooltip-padding, 4px 8px);\n border-radius: var(--ease-tooltip-radius, 4px);\n font-family: var(--ease-font-family, inherit);\n font-size: var(--ease-tooltip-font-size, 10px);\n font-weight: var(--ease-tooltip-font-weight, 500);\n max-width: var(--ease-tooltip-max-width, 220px);\n box-shadow: var(--ease-tooltip-shadow, 0 2px 8px rgba(0, 0, 0, 0.2));\n display: none;\n }\n\n :host([open]) [data-tooltip-content] {\n display: block;\n }\n `\n})\nexport class Tooltip extends HTMLElement {\n #hoverTimer: number | null = null;\n\n #trigger: HTMLElement | null = null;\n #content: HTMLElement | null = null;\n\n declare requestRender: () => void;\n\n @Prop<boolean>({\n type: Boolean,\n reflect: true,\n onChange(next, previous) {\n (this as Tooltip)._handleOpenChange(next, previous);\n }\n })\n accessor open = false;\n\n @Prop<number>({ type: Number, reflect: true, defaultValue: 300 })\n accessor delay = 300;\n\n @Prop<Placement>({ reflect: true, defaultValue: 'top-center' })\n accessor placement: Placement = 'top-center';\n\n @Query<HTMLElement>('[slot=\"trigger\"]')\n accessor triggerElement!: HTMLElement | null;\n\n @Query<HTMLElement>('[data-tooltip-content]')\n accessor contentElement!: HTMLElement | null;\n\n disconnectedCallback(): void {\n this.#clearTimer();\n if (this.#trigger) {\n this.#trigger.removeEventListener('mouseenter', this.#handleEnter);\n this.#trigger.removeEventListener('mouseleave', this.#handleLeave);\n this.#trigger.removeEventListener('focusin', this.#handleFocusIn);\n this.#trigger.removeEventListener('focusout', this.#handleFocusOut);\n this.#trigger = null;\n }\n\n if (this.#content) {\n this.#content.removeEventListener('mouseenter', this.#handleEnter);\n this.#content.removeEventListener('mouseleave', this.#handleLeave);\n this.#content = null;\n }\n }\n\n afterRender(): void {\n this.#updateListeners();\n const content = this.contentElement;\n const isVisible = this.open;\n\n if (content) {\n content.setAttribute('role', 'tooltip');\n content.setAttribute('aria-hidden', isVisible ? 'false' : 'true');\n content.dataset.open = isVisible ? 'true' : 'false';\n content.hidden = !isVisible;\n }\n }\n\n render(): TemplateResult {\n return html`\n <ease-popover .placement=${this.placement} ?open=${this.open}>\n <slot name=\"trigger\" slot=\"trigger\"></slot>\n <div\n data-tooltip-content\n role=\"tooltip\"\n data-open=${this.open ? 'true' : 'false'}\n ?hidden=${!this.open}\n >\n <slot></slot>\n </div>\n </ease-popover>\n `;\n }\n\n _handleOpenChange(next: boolean, previous: boolean): void {\n if (next === previous) {\n return;\n }\n\n if (!next) {\n this.#clearTimer();\n }\n\n requestOutsideClickUpdate(this);\n }\n\n @OutsideClick<Tooltip>({\n content: (host) => host.contentElement,\n triggers: (host) => [host.triggerElement],\n disabled: (host) => !host.open\n })\n handleOutsideDismiss(): void {\n if (!this.open) {\n return;\n }\n\n this.#clearTimer();\n this.open = false;\n }\n\n #clearTimer(): void {\n if (this.#hoverTimer !== null) {\n window.clearTimeout(this.#hoverTimer);\n this.#hoverTimer = null;\n }\n }\n\n #startTimer(callback: () => void): void {\n this.#clearTimer();\n const wait = this.delay ?? 0;\n\n if (wait > 0) {\n this.#hoverTimer = window.setTimeout(callback, wait);\n } else {\n callback();\n }\n }\n\n #handleEnter = (): void => {\n this.#startTimer(() => {\n this.open = true;\n });\n };\n\n #handleLeave = (): void => {\n this.#clearTimer();\n this.open = false;\n };\n\n #handleFocusIn = (): void => {\n this.#clearTimer();\n this.open = true;\n };\n\n #handleFocusOut = (): void => {\n this.#clearTimer();\n this.open = false;\n };\n\n #updateListeners(): void {\n const trigger = this.triggerElement;\n const content = this.contentElement ?? null;\n\n if (trigger !== this.#trigger) {\n if (this.#trigger) {\n this.#trigger.removeEventListener('mouseenter', this.#handleEnter);\n this.#trigger.removeEventListener('mouseleave', this.#handleLeave);\n this.#trigger.removeEventListener('focusin', this.#handleFocusIn);\n this.#trigger.removeEventListener('focusout', this.#handleFocusOut);\n }\n if (trigger) {\n trigger.addEventListener('mouseenter', this.#handleEnter);\n trigger.addEventListener('mouseleave', this.#handleLeave);\n trigger.addEventListener('focusin', this.#handleFocusIn);\n trigger.addEventListener('focusout', this.#handleFocusOut);\n }\n this.#trigger = trigger;\n }\n\n if (content !== this.#content) {\n if (this.#content) {\n this.#content.removeEventListener('mouseenter', this.#handleEnter);\n this.#content.removeEventListener('mouseleave', this.#handleLeave);\n }\n if (content) {\n content.addEventListener('mouseenter', this.#handleEnter);\n content.addEventListener('mouseleave', this.#handleLeave);\n }\n this.#content = content ?? null;\n }\n }\n}\n","import type { TokenType } from './utils/syntax-highlighter-types';\n\nimport { html } from 'lit-html';\n\nimport { getHighlightAPI, SUPPORTS_HIGHLIGHT_API } from './utils/highlight-api';\nimport { generateHighlightStyles } from './utils/syntax-highlighter-theme';\nimport { normalizeIndent, tokenize } from './utils/syntax-tokenizer';\n\nimport { Component } from '~/decorators/Component';\nimport { Prop } from '~/decorators/Prop';\nimport { Query } from '~/decorators/Query';\n\n@Component({\n tag: 'ease-code',\n shadowMode: 'open',\n autoSlot: false,\n styles: `\n :host {\n display: block;\n position: relative;\n color: var(--ease-code-color, var(--color-blue-100));\n }\n\n pre {\n margin: 0;\n font-family: var(--ease-font-mono, 'Geist Mono', monospace);\n font-size: var(--ease-code-font-size, var(--ease-font-size-sm, 12px));\n line-height: var(--ease-code-line-height, 1.4);\n }\n\n code {\n white-space: pre-wrap;\n }\n `,\n template() {\n return html`<pre><code><slot></slot></code></pre>`;\n }\n})\nexport class Code extends HTMLElement {\n declare requestRender: () => void;\n\n #instanceId: string = `hl-${crypto.randomUUID()}`;\n #registeredHighlights: Set<string> = new Set();\n #observer: MutationObserver | null = null;\n\n @Prop<string | null>({ reflect: true })\n accessor language: string | null = null;\n\n @Query<HTMLElement>('code')\n accessor codeElement: HTMLElement | null = null;\n\n connectedCallback(): void {\n this.#observer = new MutationObserver(() => this.#processContent());\n\n this.#observer.observe(this, {\n childList: true,\n subtree: true,\n characterData: true\n });\n\n this.#processContent();\n }\n\n disconnectedCallback(): void {\n this.#observer?.disconnect();\n this.#cleanupHighlights();\n }\n\n attributeChangedCallback(name: string): void {\n if (name === 'language') {\n this.#processContent();\n }\n }\n\n get currentLanguage(): string {\n return this.language?.toLowerCase() ?? 'plaintext';\n }\n\n afterRender(): void {\n this.#processContent();\n }\n\n #renderStyles = (): void => {\n const style = document.createElement('style');\n\n style.setAttribute('data-highlight-styles', this.#instanceId);\n\n const highlightStyles = generateHighlightStyles(this.#instanceId);\n style.textContent = highlightStyles;\n\n if (this.shadowRoot) {\n this.shadowRoot.appendChild(style);\n }\n };\n\n #cleanupStyles() {\n const styles = this.shadowRoot?.querySelectorAll<HTMLStyleElement>(\n `style[data-highlight-styles=\"${this.#instanceId}\"]`\n );\n\n if (styles) {\n for (const style of styles) {\n style.remove();\n }\n }\n }\n\n #getHighlightName(type: TokenType): string {\n return `syntax-${type}-${this.#instanceId}`;\n }\n\n #processContent() {\n let rawCode = this.textContent || '';\n rawCode = normalizeIndent(rawCode);\n\n if (!this.codeElement) {\n return;\n }\n\n this.codeElement.textContent = rawCode;\n\n this.#cleanupHighlights();\n\n if (!rawCode.trim() || !SUPPORTS_HIGHLIGHT_API) {\n return;\n }\n\n const textNode = this.codeElement.firstChild as Text;\n\n if (!textNode) {\n return;\n }\n\n this.#highlightCode(rawCode, this.currentLanguage, textNode);\n }\n\n #highlightCode(code: string, language: string, textNode: Text) {\n const api = getHighlightAPI();\n\n if (!api) {\n return;\n }\n\n const tokens = tokenize(code, language);\n const highlightMap = new Map<TokenType, Range[]>();\n\n for (const token of tokens) {\n if (token.start >= token.end) {\n continue;\n }\n\n try {\n this.#renderStyles();\n\n const range = document.createRange();\n range.setStart(textNode, token.start);\n range.setEnd(textNode, token.end);\n\n if (!highlightMap.has(token.type)) {\n highlightMap.set(token.type, []);\n }\n\n highlightMap.get(token.type)?.push(range);\n } catch {\n // Ignore range creation errors\n }\n }\n\n for (const [type, ranges] of highlightMap.entries()) {\n if (ranges.length) {\n const highlightName = this.#getHighlightName(type);\n const highlight = new api.Highlight(...ranges);\n api.highlights.set(highlightName, highlight);\n this.#registeredHighlights.add(highlightName);\n }\n }\n }\n\n #cleanupHighlights() {\n const api = getHighlightAPI();\n\n if (!api) {\n return;\n }\n\n for (const name of this.#registeredHighlights) {\n api.highlights.delete(name);\n }\n\n this.#cleanupStyles();\n\n this.#registeredHighlights.clear();\n }\n}\n","interface HighlightAPI {\n Highlight: new (...ranges: Range[]) => unknown;\n highlights: Map<string, unknown>;\n}\n\ninterface WindowWithHighlightAPI extends Window {\n CSS: {\n highlights: Map<string, unknown>;\n };\n Highlight: new (...ranges: Range[]) => unknown;\n}\n\nexport const SUPPORTS_HIGHLIGHT_API =\n typeof window !== 'undefined' &&\n typeof (window as unknown as WindowWithHighlightAPI).CSS !== 'undefined' &&\n !!(window as unknown as WindowWithHighlightAPI).CSS?.highlights &&\n typeof (window as unknown as WindowWithHighlightAPI).Highlight === 'function';\n\nexport const getHighlightAPI = (): HighlightAPI | null => {\n if (!SUPPORTS_HIGHLIGHT_API) {\n return null;\n }\n\n const w = window as unknown as WindowWithHighlightAPI;\n return {\n Highlight: w.Highlight,\n highlights: w.CSS.highlights\n };\n};\n","import type { TokenType } from './syntax-highlighter-types';\n\nexport const DEFAULT_THEME: Record<TokenType, string> = {\n keyword: 'var(--ease-syntax-keyword, #e47ab4)',\n string: 'var(--ease-syntax-string, #6ad09d)',\n comment: 'var(--ease-syntax-comment, var(--color-gray-700))',\n number: 'var(--ease-syntax-number, #f2c24b)',\n operator: 'var(--ease-syntax-operator, var(--color-gray-500))',\n tag: 'var(--ease-syntax-tag, #c36571)',\n attribute: 'var(--ease-syntax-attribute, #ff6600)',\n property: 'var(--ease-syntax-property, #61bf90)',\n type: 'var(--ease-syntax-type, #FFAB77)',\n variable: 'var(--ease-syntax-variable, #ea7987)',\n selector: 'var(--ease-syntax-selector, #4F9CED)',\n function: 'var(--ease-syntax-function, #71a4f4)'\n};\n\nexport const generateHighlightStyles = (\n instanceId: string,\n theme: Record<TokenType, string> = DEFAULT_THEME\n): string => {\n let styles = '';\n\n for (const [type, color] of Object.entries(theme)) {\n const highlightName = `syntax-${type}-${instanceId}`;\n const italic = type === 'comment' ? 'font-style: italic;' : '';\n styles += `::highlight(${highlightName}) { color: ${color}; ${italic} }`;\n }\n\n return styles;\n};\n","import type { Grammar } from './syntax-highlighter-types';\n\nexport const JS_BASE: Grammar = [\n ['comment', /(\\/\\/.*$)|(\\/\\*[\\s\\S]*?\\*\\/)/m],\n ['string', /('[^'\\\\]*(?:\\\\.[^'\\\\]*)*')|(\"[^\"\\\\]*(?:\\\\.[^\"\\\\]*)*\")|(`[^`\\\\]*(?:\\\\.[^`\\\\]*)*`)/],\n ['number', /\\b\\d+(\\.\\d+)?\\b|0x[a-fA-F0-9]+\\b/],\n [\n 'keyword',\n /\\b(if|else|while|for|do|return|const|let|var|function|class|new|try|catch|finally|throw|import|export|default|async|await|extends|super|break|continue|switch|case|in|of|instanceof|typeof|delete|this|true|false|null|from|as)\\b/\n ],\n ['function', /\\b\\w+(?=\\()/],\n ['operator', /[+\\-*/%=<>!&|?.:]{1,3}/]\n];\n\nexport const TS_ADDITIONS: Grammar = [\n [\n 'keyword',\n /\\b(type|interface|enum|public|private|protected|readonly|namespace|module|declare|abstract|implements|static|any|unknown|never|string|number|boolean|void|symbol|bigint)\\b/\n ],\n ['type', /\\b([A-Z]\\w*)\\b/]\n];\n\nexport const HTML_BASE: Grammar = [\n ['comment', /<!--[\\s\\S]*?-->/m],\n ['attribute', /(\\s[a-zA-Z0-9_-]+)(?=\\s*=)/],\n ['string', /('[^']*')|(\"[^\"]*\")/],\n ['tag', /(<\\/?)([a-zA-Z0-9-]+)/],\n ['keyword', /<!DOCTYPE[^>]*>/i]\n];\n\nexport const CSS_BASE: Grammar = [\n ['comment', /\\/\\*[\\s\\S]*?\\*\\//m],\n ['string', /('[^']*')|(\"[^\"]*\")/],\n ['number', /(#[0-9a-fA-F]{3,8})|\\b-?\\d+(\\.\\d+)?(px|em|rem|%|deg|s|ms|vh|vw|vmin|vmax)?\\b/],\n ['keyword', /(!important|@media|@import|@keyframes|@font-face|inherit|initial|unset|auto|none)\\b/],\n ['variable', /(--[a-zA-Z0-9_-]+)/],\n ['property', /([a-zA-Z-]+)\\s*(?=:)/],\n ['selector', /(\\.|#)([a-zA-Z0-9_-]+)|\\[[^\\]]+\\]/],\n ['tag', /\\b([a-zA-Z]+)(?=\\s*\\{)/]\n];\n\nexport const JSON_BASE: Grammar = [\n ['property', /\"([^\"\\\\]*(?:\\\\.[^\"\\\\]*)*)\"(?=\\s*:)/],\n ['string', /\"([^\"\\\\]*(?:\\\\.[^\"\\\\]*)*)\"/],\n ['number', /\\b-?\\d+(\\.\\d+)?([eE][+-]?\\d+)?\\b/],\n ['keyword', /\\b(true|false|null)\\b/]\n];\n\nconst baseGrammars: Record<string, Grammar> = {\n javascript: JS_BASE,\n js: JS_BASE,\n typescript: [...JS_BASE, ...TS_ADDITIONS],\n ts: [...JS_BASE, ...TS_ADDITIONS],\n html: HTML_BASE,\n css: CSS_BASE,\n json: JSON_BASE\n};\n\nconst TSX_GRAMMAR: Grammar = [\n ...HTML_BASE,\n ...(baseGrammars.typescript?.filter(([type]) => type !== 'operator') || [])\n];\n\nexport const GRAMMARS: Record<string, Grammar> = {\n ...baseGrammars,\n tsx: TSX_GRAMMAR,\n jsx: TSX_GRAMMAR\n};\n","import type { Token, TokenType } from './syntax-highlighter-types';\n\nimport { GRAMMARS } from './syntax-grammars';\n\nexport const tokenize = (code: string, language: string): Token[] => {\n const grammar = GRAMMARS[language.toLowerCase()];\n\n if (!grammar) {\n return [];\n }\n\n const regexParts: string[] = [];\n const groupMap = new Map<string, TokenType>();\n let groupIndex = 0;\n\n grammar.forEach(([type, pattern]) => {\n const groupName = `G${groupIndex++}`;\n groupMap.set(groupName, type);\n regexParts.push(`(?<${groupName}>${pattern.source})`);\n });\n\n const masterRegex = new RegExp(regexParts.join('|'), 'gm');\n const tokens: Token[] = [];\n\n let match: RegExpExecArray | null;\n\n while (true) {\n match = masterRegex.exec(code);\n if (match === null) {\n break;\n }\n if (match.index === masterRegex.lastIndex) {\n masterRegex.lastIndex++;\n }\n\n if (match.groups) {\n for (const groupName in match.groups) {\n if (match.groups[groupName] !== undefined) {\n const type = groupMap.get(groupName);\n if (type) {\n const start = match.index;\n const end = start + match[0].length;\n\n if ((language === 'html' || language === 'tsx' || language === 'jsx') && type === 'tag') {\n const tagNameMatch = match[0].match(/[a-zA-Z0-9-]+/);\n if (tagNameMatch && tagNameMatch.index !== undefined) {\n const tagNameStart = start + tagNameMatch.index;\n const tagNameEnd = tagNameStart + tagNameMatch[0].length;\n tokens.push({ type, start: tagNameStart, end: tagNameEnd });\n break;\n }\n }\n\n tokens.push({ type, start, end });\n break;\n }\n }\n }\n }\n }\n\n return tokens;\n};\n\nexport const normalizeIndent = (code: string): string => {\n const lines = code.split('\\n').filter((line) => line.trim());\n\n if (!lines.length) {\n return '';\n }\n\n const minIndent = Math.min(...lines.map((line) => line.match(/^\\s*/)?.[0].length || 0));\n\n return lines.map((line) => line.substring(minIndent)).join('\\n');\n};\n","import type { ControlEventDetail } from '~/elements/shared';\n\nimport { html } from 'lit-html';\n\nimport { cubicBezierToLinearPoints } from './bezier-conversion';\nimport { containerStyles } from './styles';\nimport { type CubicBezierPoints, EasingType, type LinearPoints, MIN_LINEAR_POINTS } from './types';\nimport { MIN_LINEAR_DELTA, normalizeLinearPoints } from './utils';\n\nimport { Component } from '~/decorators/Component';\nimport { Listen } from '~/decorators/Listen';\nimport { Prop } from '~/decorators/Prop';\n\n@Component({\n tag: 'ease-curve',\n styles: containerStyles,\n template(this: Curve) {\n return html`\n <div class=\"curve-container\">\n <div class=\"curve-header\">\n <ease-curve-controls\n .easingType=${this.easingType}\n .points=${this.points}\n .showGrid=${this.showGrid}\n .snapToGrid=${this.snapToGrid}\n .gridSize=${this.gridSize}\n .focusedLinearIndex=${this.focusedLinearIndex}\n ></ease-curve-controls>\n </div>\n\n <div class=\"curve-canvas-wrapper\">\n <div class=\"curve-canvas\">\n <ease-curve-canvas\n .easingType=${this.easingType}\n .points=${this.points}\n .showGrid=${this.showGrid}\n .snapToGrid=${this.snapToGrid}\n .gridSize=${this.gridSize}\n .focusedLinearIndex=${this.focusedLinearIndex}\n .simplify=${this.simplify}\n .round=${this.round}\n ></ease-curve-canvas>\n </div>\n <ease-curve-canvas-controls\n .easingType=${this.easingType}\n .points=${this.points}\n .focusedLinearIndex=${this.focusedLinearIndex}\n ></ease-curve-canvas-controls>\n </div>\n\n <div class=\"curve-toolbar\">\n <ease-curve-toolbar\n .easingType=${this.easingType}\n .points=${this.points}\n .showGrid=${this.showGrid}\n .snapToGrid=${this.snapToGrid}\n .gridSize=${this.gridSize}\n .simplify=${this.simplify}\n .round=${this.round}\n ></ease-curve-toolbar>\n </div>\n\n <!-- <div class=\"curve-footer\">\n <ease-curve-output\n .easingType=${this.easingType}\n .points=${this.points}\n .name=${this.name}\n .simplify=${this.simplify}\n .round=${this.round}\n ></ease-curve-output>\n </div> -->\n </div>\n `;\n }\n})\nexport class Curve extends HTMLElement {\n declare requestRender: () => void;\n\n @Prop<string>({ reflect: true, defaultValue: 'ease-custom' })\n accessor name!: string;\n\n @Prop<EasingType, Curve>({\n reflect: true,\n defaultValue: EasingType.CUBIC_BEZIER,\n onChange(this: Curve, next: EasingType, previous: EasingType) {\n if (next !== previous) {\n this.points = this.getDefaultPointsForType(next);\n this.focusedLinearIndex = null;\n }\n }\n })\n accessor easingType!: EasingType;\n\n @Prop<CubicBezierPoints | LinearPoints>({\n type: Object,\n reflect: false,\n defaultValue: () => {\n return { p1: { x: 0.25, y: 0.1 }, p2: { x: 0.25, y: 1 } };\n }\n })\n accessor points!: CubicBezierPoints | LinearPoints;\n\n @Prop<boolean>({ type: Boolean, reflect: true, defaultValue: true })\n accessor showGrid!: boolean;\n\n @Prop<boolean>({ type: Boolean, reflect: true, defaultValue: false })\n accessor snapToGrid!: boolean;\n\n @Prop<number>({ type: Number, reflect: true, defaultValue: 8 })\n accessor gridSize!: number;\n\n @Prop<number>({ type: Number, reflect: true, defaultValue: 0 })\n accessor simplify!: number;\n\n @Prop<number>({ type: Number, reflect: true, defaultValue: 5 })\n accessor round!: number;\n\n @Prop<number | null>({ type: Number, reflect: false, defaultValue: null })\n accessor focusedLinearIndex: number | null = null;\n\n private getDefaultPointsForType(type: EasingType): CubicBezierPoints | LinearPoints {\n return type === EasingType.CUBIC_BEZIER\n ? { p1: { x: 0.25, y: 0.1 }, p2: { x: 0.25, y: 1 } }\n : [\n { x: 0, y: 0 },\n { x: 1, y: 1 }\n ];\n }\n\n @Listen<Curve, CustomEvent<ControlEventDetail<EasingType>>>('easing-type-change', { target: 'light' })\n handleEasingTypeChange(event: CustomEvent<ControlEventDetail<EasingType>>): void {\n const { value } = event.detail;\n\n if (this.easingType === value) {\n return;\n }\n\n const previousType = this.easingType;\n const previousPoints = this.points;\n this.easingType = value;\n this.focusedLinearIndex = null;\n\n if (previousType === EasingType.CUBIC_BEZIER && value === EasingType.LINEAR) {\n if (previousPoints && !Array.isArray(previousPoints)) {\n const bezierPoints = previousPoints as CubicBezierPoints;\n const linearPoints = cubicBezierToLinearPoints(bezierPoints);\n this.points = linearPoints;\n this.emitPointsChange(linearPoints, event.detail.event);\n return;\n } else {\n this.points = this.getDefaultPointsForType(value);\n this.emitPointsChange(this.points, event.detail.event);\n return;\n }\n } else if (previousType === EasingType.LINEAR && value === EasingType.CUBIC_BEZIER) {\n this.points = this.getDefaultPointsForType(value);\n this.emitPointsChange(this.points, event.detail.event);\n return;\n } else {\n this.points = this.getDefaultPointsForType(value);\n this.emitPointsChange(this.points, event.detail.event);\n return;\n }\n }\n\n @Listen<Curve, CustomEvent<ControlEventDetail<boolean>>>('grid-toggle', { target: 'light' })\n handleGridToggle(event: CustomEvent<ControlEventDetail<boolean>>): void {\n const { value } = event.detail;\n\n if (this.showGrid === value) {\n return;\n }\n\n this.showGrid = value;\n }\n\n @Listen<Curve, CustomEvent<ControlEventDetail<boolean>>>('snap-toggle', { target: 'light' })\n handleSnapToggle(event: CustomEvent<ControlEventDetail<boolean>>): void {\n const { value } = event.detail;\n\n if (this.snapToGrid === value) {\n return;\n }\n\n this.snapToGrid = value;\n }\n\n @Listen<Curve, CustomEvent<ControlEventDetail<number>>>('grid-size-change', { target: 'light' })\n handleGridSizeChange(event: CustomEvent<ControlEventDetail<number>>): void {\n let { value } = event.detail;\n value = Math.max(1, Math.min(24, value));\n if (this.gridSize === value) {\n return;\n }\n this.gridSize = value;\n this.requestRender();\n }\n\n @Listen<Curve, CustomEvent<ControlEventDetail<number>>>('simplify-change', { target: 'light' })\n handleSimplifyChange(event: CustomEvent<ControlEventDetail<number>>): void {\n const { value } = event.detail;\n if (this.simplify === value) {\n return;\n }\n this.simplify = value;\n this.requestRender();\n }\n\n @Listen<Curve, CustomEvent<ControlEventDetail<number>>>('round-change', { target: 'light' })\n handleRoundChange(event: CustomEvent<ControlEventDetail<number>>): void {\n const { value } = event.detail;\n if (this.round === value) {\n return;\n }\n this.round = value;\n this.requestRender();\n }\n\n @Listen<Curve, CustomEvent<ControlEventDetail<CubicBezierPoints | LinearPoints>>>('points-change', {\n target: 'light'\n })\n handlePointsChange(event: CustomEvent<ControlEventDetail<CubicBezierPoints | LinearPoints>>): void {\n const { value } = event.detail;\n this.points = value;\n\n if (Array.isArray(value)) {\n if (this.focusedLinearIndex !== null) {\n if (this.focusedLinearIndex >= value.length) {\n this.focusedLinearIndex = value.length - 1;\n }\n }\n } else {\n this.focusedLinearIndex = null;\n }\n }\n\n @Listen<Curve, KeyboardEvent>('keydown', { target: 'window', passive: false })\n handleKeyboardShortcuts(event: KeyboardEvent): void {\n if (event.defaultPrevented) {\n return;\n }\n\n const activeElement = event.target;\n\n if (\n activeElement instanceof HTMLInputElement ||\n activeElement instanceof HTMLTextAreaElement ||\n (activeElement instanceof HTMLElement && activeElement.isContentEditable)\n ) {\n return;\n }\n\n if (this.easingType !== EasingType.LINEAR || !Array.isArray(this.points)) {\n return;\n }\n\n const index = this.focusedLinearIndex;\n\n if (index === null) {\n return;\n }\n\n const lastIndex = this.points.length - 1;\n const clonedPoints: LinearPoints = this.points.map((point) => {\n return { ...point };\n });\n const point = clonedPoints[index];\n\n if (!point) {\n return;\n }\n\n const step = event.shiftKey ? 0.05 : 0.01;\n let handled = false;\n\n switch (event.key) {\n case 'ArrowLeft': {\n if (index <= 0 || index >= lastIndex) {\n break;\n }\n const previous = clonedPoints[index - 1];\n const next = clonedPoints[index + 1];\n\n if (!previous || !next) {\n break;\n }\n\n const minX = previous.x + MIN_LINEAR_DELTA;\n const maxX = next.x - MIN_LINEAR_DELTA;\n point.x = Math.min(Math.max(point.x - step, minX), maxX);\n handled = true;\n break;\n }\n case 'ArrowRight': {\n if (index <= 0 || index >= lastIndex) {\n break;\n }\n const previous = clonedPoints[index - 1];\n const next = clonedPoints[index + 1];\n\n if (!previous || !next) {\n break;\n }\n\n const minX = previous.x + MIN_LINEAR_DELTA;\n const maxX = next.x - MIN_LINEAR_DELTA;\n point.x = Math.min(Math.max(point.x + step, minX), maxX);\n handled = true;\n break;\n }\n case 'ArrowUp': {\n point.y = Math.min(Math.max(point.y + step, 0), 1);\n handled = true;\n break;\n }\n case 'ArrowDown': {\n point.y = Math.min(Math.max(point.y - step, 0), 1);\n handled = true;\n break;\n }\n case 'Delete':\n case 'Backspace': {\n if (clonedPoints.length <= MIN_LINEAR_POINTS || index <= 0 || index >= lastIndex) {\n break;\n }\n\n clonedPoints.splice(index, 1);\n\n const normalized = normalizeLinearPoints(clonedPoints);\n this.points = normalized;\n this.emitPointsChange(normalized, event);\n\n const nextFocus = index - 1;\n\n this.focusedLinearIndex = nextFocus;\n handled = true;\n break;\n }\n default:\n break;\n }\n\n if (handled && event.key !== 'Delete' && event.key !== 'Backspace') {\n const normalized = normalizeLinearPoints(clonedPoints);\n this.points = normalized;\n this.emitPointsChange(normalized, event);\n this.focusedLinearIndex = index;\n }\n\n if (handled) {\n event.preventDefault();\n }\n }\n\n @Listen<Curve, CustomEvent<ControlEventDetail<number | null>>>('linear-point-focus', { target: 'light' })\n handleLinearPointFocus(event: CustomEvent<ControlEventDetail<number | null>>): void {\n const { value } = event.detail;\n if (this.focusedLinearIndex === value) {\n return;\n }\n this.focusedLinearIndex = value ?? null;\n }\n\n private emitPointsChange(value: CubicBezierPoints | LinearPoints, sourceEvent?: Event): void {\n const detail: ControlEventDetail<CubicBezierPoints | LinearPoints> = {\n value,\n event: sourceEvent ?? new Event('points-change')\n };\n\n this.dispatchEvent(\n new CustomEvent('points-change', {\n detail,\n bubbles: true,\n composed: true\n })\n );\n }\n}\n\nimport './canvas';\nimport './canvas-controls';\nimport './controls';\nimport './output';\nimport './toolbar';\n\nexport {\n type CubicBezierPoints,\n type EasingData,\n EasingType,\n type LinearPoints,\n type Point\n} from './types';\n","import type { CubicBezierPoints, LinearPoints } from './types';\n\nexport const cubicBezierToLinearPoints = (points: CubicBezierPoints): LinearPoints => {\n const start = {\n x: 0,\n y: 0,\n cpOutX: points.p1.x,\n cpOutY: points.p1.y,\n isLinked: true,\n mirrorLength: true\n };\n\n const end = {\n x: 1,\n y: 1,\n cpInX: points.p2.x - 1,\n cpInY: points.p2.y - 1,\n isLinked: true,\n mirrorLength: true\n };\n\n return [start, end];\n};\n","export const canvasStyles = `\n :host {\n display: block;\n width: 100%;\n max-width: 500px;\n position: relative;\n }\n\n svg {\n width: 300px;\n height: auto;\n cursor: pointer;\n touch-action: none;\n user-select: none;\n overflow: visible;\n border-radius: 8px;\n }\n\n .grid-line {\n stroke: var(--color-white-4);\n stroke-width: .75;\n }\n\n .curve-path {\n stroke: var(--color-blue-100);\n stroke-width: 2.5;\n fill: none;\n stroke-linecap: round;\n stroke-linejoin: round;\n transition: stroke-width 150ms ease;\n }\n\n .curve-path--preview {\n stroke: var(--color-blue-800);\n stroke-width: 2.5;\n stroke-dasharray: 5, 5;\n opacity: 0;\n pointer-events: none;\n animation: previewPathFade 180ms ease forwards;\n }\n\n .control-point {\n fill: var(--color-blue-700);\n stroke: var(--color-blue-900);\n stroke-width: 1.5;\n cursor: grab;\n }\n\n .control-point:active {\n cursor: grabbing;\n }\n\n .control-point.selected {\n }\n\n .anchor-point-start {\n fill: var(--color-blue-100);\n pointer-events: none;\n r: 5px;\n transition: r .2s;\n }\n\n .anchor-point {\n fill: var(--color-blue-900);\n stroke: var(--color-blue-900);\n stroke-width: 1;\n pointer-events: none;\n r: 5px;\n transition: r .2s;\n }\n\n .anchor-point:hover {\n r: 5.5px;\n }\n\n .control-line {\n stroke: var(--color-blue-800);\n stroke-width: 3;\n pointer-events: none;\n display: none;\n }\n\n .linear-point {\n fill: var(--color-blue-100);\n cursor: grab;\n r: 3px;\n transition: r .2s;\n }\n\n .hit-area-point:hover + .linear-point,\n .linear-point:hover,\n .linear-point:active,\n .linear-point.selected {\n r: 5px;\n }\n\n .linear-point.selected {\n fill: var(--color-blue-300);\n stroke-width: 1.5;\n }\n\n .linear-handle-line {\n stroke: var(--color-blue-800);\n stroke-width: 3;\n pointer-events: none;\n transition: opacity 150ms ease;\n display: none;\n }\n\n .linear-handle {\n fill: var(--color-blue-700);\n stroke: var(--color-blue-900);\n stroke-width: 1;\n cursor: grab;\n }\n\n .linear-handle.selected {\n }\n\n .linear-handle:active {\n cursor: grabbing;\n }\n\n .hit-area-point,\n .hit-area-handle {\n fill: transparent;\n stroke: transparent;\n pointer-events: all;\n cursor: inherit;\n r: 10px;\n }\n\n @keyframes pulse {\n 0% {\n opacity: 1;\n }\n 50% {\n opacity: 0.6;\n }\n 100% {\n opacity: 1;\n }\n }\n\n .curve-path.animating {\n animation: pulse 1s ease-in-out infinite;\n }\n\n @keyframes previewPathFade {\n from {\n opacity: 0;\n }\n to {\n opacity: 0.6;\n }\n }\n\n @keyframes previewElementFade {\n from {\n opacity: 0;\n }\n to {\n opacity: 0.85;\n }\n }\n\n .linear-preview-group {\n pointer-events: none;\n }\n\n .linear-point--preview,\n .linear-handle--preview,\n .linear-handle-line--preview {\n animation: previewElementFade 180ms ease forwards;\n }\n\n .linear-point--preview {\n fill: var(--color-blue-100);\n }\n\n .linear-handle--preview {\n fill: var(--color-blue-700);\n stroke: var(--color-blue-900);\n stroke-width: 1.5;\n }\n\n .linear-handle-line--preview {\n stroke: var(--color-blue-800);\n stroke-width: 2.5;\n stroke-dasharray: 4 4;\n display: none;\n }\n`;\n\nexport const controlsStyles = `\n :host {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 0.75rem;\n }\n\n [part=\"radio-group\"] {\n width: 100%;\n box-sizing: border-box;\n }\n\n [part=\"easing-type-dropdown\"] {\n --ease-dropdown-max-height: 212px;\n }\n`;\n\nexport const outputStyles = `\n :host {\n display: block;\n }\n\n .output-container {\n display: flex;\n flex-direction: column;\n gap: 1rem;\n }\n\n .output-group {\n position: relative;\n display: block;\n }\n\n .output-label {\n font-size: 0.875rem;\n font-weight: 600;\n color: var(--color-gray-1000);\n margin: 0;\n }\n\n .output-code {\n font-family: var(--ease-font-mono, 'Geist Mono', monospace);\n font-size: 0.8125rem;\n line-height: 1.6;\n padding: 1rem;\n background: var(--color-gray-1000);\n color: var(--color-gray-700);\n border-radius: 0.375rem;\n border: 1px solid #334155;\n white-space: pre-wrap;\n word-break: break-word;\n overflow-x: auto;\n max-width: 100%;\n tab-size: 2;\n }\n\n .copy-button {\n align-self: flex-start;\n padding: 0.425rem 0.875rem;\n border: 1px solid var(--color-white-6);\n border-radius: 0.375rem;\n background: white;\n color: var(--color-gray-1000);\n font-size: 0.875rem;\n font-weight: 500;\n cursor: pointer;\n transition: all 150ms ease;\n user-select: none;\n }\n\n .copy-button:hover {\n background: var(--color-gray-1000);\n border-color: #9ca3af;\n transform: translateY(-1px);\n }\n\n .copy-button:active {\n transform: translateY(0);\n }\n\n .copy-button:focus-visible {\n outline: 2px solid var(--color-blue-700);\n outline-offset: 2px;\n }\n\n .copy-button.copied {\n background: var(--color-blue-100);\n border-color: var(--color-blue-100);\n color: white;\n }\n\n .preview-container {\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n }\n\n .preview-box {\n width: 100%;\n max-width: 300px;\n height: 80px;\n background: linear-gradient(135deg, var(--color-blue-700) 0%, var(--color-blue-100) 100%);\n border-radius: 0.5rem;\n position: relative;\n overflow: hidden;\n cursor: pointer;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n transition: box-shadow 150ms ease;\n }\n\n .preview-box:hover {\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n }\n\n .preview-animation {\n width: 24px;\n height: 24px;\n background: white;\n border-radius: 50%;\n position: absolute;\n top: 50%;\n left: 12px;\n transform: translateY(-50%);\n box-shadow: 0 2px 6px rgba(0, 0, 0, 0.2);\n transition-property: transform;\n transition-duration: 2s;\n }\n\n .preview-animation.animate {\n transform: translateY(-50%) translateX(calc(100% - 48px));\n }\n`;\n\nexport const containerStyles = `\n :host {\n display: block;\n }\n\n .curve-container {\n display: flex;\n flex-direction: column;\n position: relative;\n }\n\n .curve-header {\n }\n\n .curve-canvas-wrapper {\n position: relative;\n margin-top: 16px;\n }\n\n .curve-canvas {\n background-color: var(--color-white-2);\n box-shadow: 0 0 32px 0 var(--color-white-2) inset;\n border-radius: 7px;\n }\n\n .curve-toolbar {\n margin-top: 8px;\n }\n`;\n\nexport const canvasControlsStyles = `\n :host {\n position: absolute;\n top: 8px;\n left: 8px;\n z-index: 10;\n display: flex;\n flex-direction: column;\n gap: 4px;\n pointer-events: none;\n }\n\n :host([hidden]) {\n display: none;\n }\n\n .overlay-controls {\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n pointer-events: auto;\n }\n\n .overlay-button {\n --ease-icon-size: 16px;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 4px;\n color: var(--color-gray-600);\n border-radius: var(--radii-md);\n background-color: var(--color-gray-875);\n box-shadow: inset 0 1px .25px 0 var(--color-white-4), 0 1px 2.5px 0 var(--color-black-8);\n cursor: pointer;\n transition: color 0.2s;\n appearance: none;\n border: none;\n outline: none;\n margin: 0;\n }\n\n .overlay-button:hover {\n color: var(--color-gray-300);\n }\n\n .overlay-button:disabled {\n color: var(--color-gray-700);\n cursor: not-allowed;\n }\n\n .overlay-button.inactive {\n color: var(--color-blue-100);\n }\n`;\n\nexport const toolbarStyles = `\n :host {\n display: block;\n width: 100%;\n }\n\n .toolbar-container {\n width: 100%;\n display: grid;\n gap: 8px;\n }\n\n .toolbar-group {\n width: 100%;\n display: flex;\n gap: 8px;\n box-sizing: border-box;\n align-items: center;\n padding: 6px;\n border-radius: var(--radii-md);\n background-color: var(--color-gray-875);\n box-shadow: inset 0 1px .25px 0 var(--color-white-4), 0 1px 2.5px 0 var(--color-black-8);\n }\n\n .toolbar-button {\n --ease-icon-size: 16px;\n\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 4px;\n color: var(--color-gray-600);\n background-color: transparent;\n border: none;\n outline: none;\n margin: 0;\n appearance: none;\n cursor: pointer;\n transition: color 0.2s;\n }\n\n .toolbar-button:hover {\n color: var(--color-blue-100);\n }\n\n .toolbar-button:disabled {\n color: var(--color-gray-700);\n cursor: not-allowed;\n }\n\n .grid-size-controls {\n display: grid;\n grid-template-columns: 24px auto 24px;\n align-items: center;\n justify-content: center;\n margin-left: auto;\n }\n\n .grid-size-controls ease-button {\n --ease-icon-size: 14px;\n width: 24px;\n height: 24px;\n box-sizing: border-box;\n display: flex;\n padding: 0;\n align-items: center;\n justify-content: center;\n }\n\n .grid-size-value {\n display: flex;\n width: 20px;\n justify-content: center;\n align-items: center;\n font-feature-settings: 'tnum' on;\n font-variant-numeric: tabular-nums;\n font-size: 11px;\n font-weight: 500;\n line-height: 14px;\n text-align: center;\n }\n`;\n","export enum EasingType {\n CUBIC_BEZIER = 'cubic-bezier',\n LINEAR = 'linear'\n}\n\nexport interface Point {\n x: number;\n y: number;\n}\n\nexport interface CSSCode {\n code: string;\n timingFunction: string;\n}\n\nexport interface LinearPoint extends Point {\n cpInX?: number;\n cpInY?: number;\n cpOutX?: number;\n cpOutY?: number;\n isLinked?: boolean;\n mirrorLength?: boolean;\n id?: string;\n}\n\nexport interface CubicBezierPoints {\n p1: Point;\n p2: Point;\n}\n\nexport type LinearPoints = LinearPoint[];\n\nexport interface EasingData {\n type: EasingType;\n points: CubicBezierPoints | LinearPoints;\n name: string;\n}\n\nexport const MIN_LINEAR_POINTS = 2;\nexport const MAX_LINEAR_POINTS = 30;\n","import type { CSSCode, CubicBezierPoints, LinearPoint, LinearPoints, Point } from './types';\n\nexport const clampPoint = (\n point: Point,\n bounds?: { minX?: number; maxX?: number; minY?: number; maxY?: number }\n): Point => {\n const minX = bounds?.minX ?? 0;\n const maxX = bounds?.maxX ?? 1;\n const minY = bounds?.minY ?? 0;\n const maxY = bounds?.maxY ?? 1;\n\n return {\n x: Math.max(minX, Math.min(maxX, point.x)),\n y: Math.max(minY, Math.min(maxY, point.y))\n };\n};\n\nexport const MIN_LINEAR_DELTA = 0.0001;\n\nlet linearPointIdCounter = 0;\n\nconst nextLinearPointId = (): string => {\n linearPointIdCounter += 1;\n return `linear-point-${linearPointIdCounter}`;\n};\n\nexport const ensureLinearPointId = (point: LinearPoint): string => {\n if (!point.id) {\n point.id = nextLinearPointId();\n }\n return point.id;\n};\n\nexport const cloneLinearPoint = (point: LinearPoint): LinearPoint => {\n const sourceId = ensureLinearPointId(point);\n return {\n ...point,\n id: sourceId\n };\n};\n\nexport const cubicBezierPath = (points: CubicBezierPoints): string => {\n const { p1, p2 } = points;\n const startX = 0;\n const startY = 300;\n const endX = 400;\n const endY = 0;\n\n const cp1x = p1.x * 400;\n const cp1y = (1 - p1.y) * 300;\n const cp2x = p2.x * 400;\n const cp2y = (1 - p2.y) * 300;\n\n return `M ${startX} ${startY} C ${cp1x} ${cp1y}, ${cp2x} ${cp2y}, ${endX} ${endY}`;\n};\n\nexport const linearDisplayPath = (points: LinearPoints): string => {\n if (points.length < 2) {\n return '';\n }\n\n const toSvg = (p: Point): Point => {\n return {\n x: p.x * 400,\n y: (1 - p.y) * 300\n };\n };\n\n const startPoint = points[0];\n if (!startPoint) {\n return '';\n }\n\n const start = toSvg(startPoint);\n let d = `M ${start.x} ${start.y}`;\n\n for (let index = 0; index < points.length - 1; index += 1) {\n const p1 = points[index];\n const p2 = points[index + 1];\n\n if (!p1 || !p2) {\n continue;\n }\n\n const cp1 = {\n x: p1.x + (p1.cpOutX ?? 0),\n y: p1.y + (p1.cpOutY ?? 0)\n };\n\n const cp2 = {\n x: p2.x + (p2.cpInX ?? 0),\n y: p2.y + (p2.cpInY ?? 0)\n };\n\n if (cp1.x === p1.x && cp1.y === p1.y && cp2.x === p2.x && cp2.y === p2.y) {\n const end = toSvg(p2);\n d += ` L ${end.x} ${end.y}`;\n } else {\n const svgCp1 = toSvg(cp1);\n const svgCp2 = toSvg(cp2);\n const end = toSvg(p2);\n d += ` C ${svgCp1.x} ${svgCp1.y}, ${svgCp2.x} ${svgCp2.y}, ${end.x} ${end.y}`;\n }\n }\n\n return d;\n};\n\nconst perpendicularDistance = (point: Point, lineStart: Point, lineEnd: Point): number => {\n const dx = lineEnd.x - lineStart.x;\n const dy = lineEnd.y - lineStart.y;\n\n if (dx === 0 && dy === 0) {\n return Math.sqrt((point.x - lineStart.x) ** 2 + (point.y - lineStart.y) ** 2);\n }\n\n const numerator = Math.abs(dy * point.x - dx * point.y + lineEnd.x * lineStart.y - lineEnd.y * lineStart.x);\n const denominator = Math.sqrt(dx * dx + dy * dy);\n\n return numerator / denominator;\n};\n\nconst simplifyPoints = (points: Point[], epsilon: number): Point[] => {\n if (points.length < 3) {\n return points;\n }\n\n let dmax = 0;\n let index = 0;\n const end = points.length - 1;\n const startPoint = points[0];\n const endPoint = points[end];\n\n if (!startPoint || !endPoint) {\n return points;\n }\n\n for (let i = 1; i < end; i++) {\n const point = points[i];\n if (!point) {\n continue;\n }\n\n const d = perpendicularDistance(point, startPoint, endPoint);\n if (d > dmax) {\n index = i;\n dmax = d;\n }\n }\n\n if (dmax > epsilon) {\n const recResults1 = simplifyPoints(points.slice(0, index + 1), epsilon);\n const recResults2 = simplifyPoints(points.slice(index, end + 1), epsilon);\n\n return [...recResults1.slice(0, -1), ...recResults2];\n }\n\n return [startPoint, endPoint];\n};\n\nexport const generateCubicBezierCSS = (\n points: CubicBezierPoints,\n name: string,\n variant: 'animation' | 'transition' = 'animation'\n): CSSCode => {\n const { p1, p2 } = points;\n const timingFunction = `cubic-bezier(${p1.x.toFixed(3)}, ${p1.y.toFixed(3)}, ${p2.x.toFixed(3)}, ${p2.y.toFixed(3)})`;\n const code = `\n .${name} {\n ${variant}-timing-function: ${timingFunction};\n }\n `;\n\n return {\n code,\n timingFunction\n };\n};\n\nexport const getLinearApproximation = (\n points: LinearPoints,\n options: { simplify?: number; round?: number } = {}\n): Point[] => {\n const { simplify = 0, round = 5 } = options;\n\n const samples: Point[] = [];\n const numSamplesPerSegment = 20;\n\n const sortedPoints = [...points].sort((a, b) => a.x - b.x);\n\n for (let index = 0; index < sortedPoints.length - 1; index += 1) {\n const p1 = sortedPoints[index];\n const p2 = sortedPoints[index + 1];\n\n if (!p1 || !p2) {\n continue;\n }\n\n if (index === 0) {\n samples.push({ x: p1.x, y: p1.y });\n }\n\n const cp1 = {\n x: p1.x + (p1.cpOutX ?? 0),\n y: p1.y + (p1.cpOutY ?? 0)\n };\n\n const cp2 = {\n x: p2.x + (p2.cpInX ?? 0),\n y: p2.y + (p2.cpInY ?? 0)\n };\n\n for (let step = 1; step <= numSamplesPerSegment; step += 1) {\n const t = step / numSamplesPerSegment;\n const x = cubicBezier(t, p1.x, cp1.x, cp2.x, p2.x);\n const y = cubicBezier(t, p1.y, cp1.y, cp2.y, p2.y);\n samples.push({ x, y });\n }\n }\n\n const normalizedSamples: Point[] = [];\n let lastX = -Infinity;\n\n for (const sample of samples) {\n const clampedX = Math.max(0, Math.min(1, sample.x));\n const clampedY = Math.max(-2, Math.min(3, sample.y));\n\n if (clampedX > lastX + MIN_LINEAR_DELTA) {\n normalizedSamples.push({ x: clampedX, y: clampedY });\n lastX = clampedX;\n }\n }\n\n if (normalizedSamples.length < 2) {\n return [\n { x: 0, y: 0 },\n { x: 1, y: 1 }\n ];\n }\n\n const firstPoint = sortedPoints[0];\n if (firstPoint && Math.abs(firstPoint.x) < MIN_LINEAR_DELTA && normalizedSamples.length > 0) {\n const firstSample = normalizedSamples[0];\n if (firstSample) {\n firstSample.x = 0;\n }\n }\n\n const lastPoint = sortedPoints[sortedPoints.length - 1];\n if (lastPoint && Math.abs(lastPoint.x - 1) < MIN_LINEAR_DELTA && normalizedSamples.length > 0) {\n const lastSample = normalizedSamples[normalizedSamples.length - 1];\n if (lastSample) {\n lastSample.x = 1;\n }\n }\n\n let finalSamples = normalizedSamples;\n if (simplify > 0) {\n finalSamples = simplifyPoints(normalizedSamples, simplify);\n }\n\n return finalSamples.map((sample) => {\n return {\n x: sample.x,\n y: Number(sample.y.toFixed(round))\n };\n });\n};\n\nexport const generateLinearCSS = (\n points: LinearPoints | undefined,\n name: string,\n variant: 'animation' | 'transition' = 'animation',\n options: { simplify?: number; round?: number } = {}\n): CSSCode => {\n if (!Array.isArray(points) || points.length < 2) {\n return { code: '', timingFunction: '' };\n }\n\n const finalSamples = getLinearApproximation(points, options);\n\n const parts = finalSamples.map((sample) => {\n const y = sample.y;\n const x = Number((sample.x * 100).toFixed(2));\n return `${y} ${x}%`;\n });\n const timingFunction = `linear(${parts.join(', ')})`;\n const code = `\n .${name} {\n ${variant}-timing-function: ${timingFunction};\n }\n `;\n\n return { code, timingFunction };\n};\n\nexport const cubicBezierToLinear = (points: CubicBezierPoints, steps: number = 20): LinearPoints => {\n const linearPoints: LinearPoints = [];\n\n for (let i = 0; i <= steps; i++) {\n const t = i / steps;\n const x = cubicBezier(t, 0, points.p1.x, points.p2.x, 1);\n const y = cubicBezier(t, 0, points.p1.y, points.p2.y, 1);\n linearPoints.push({ x, y });\n }\n\n return linearPoints;\n};\n\nconst cubicBezier = (t: number, p0: number, p1: number, p2: number, p3: number): number => {\n const u = 1 - t;\n const tt = t * t;\n const uu = u * u;\n const uuu = uu * u;\n const ttt = tt * t;\n\n return uuu * p0 + 3 * uu * t * p1 + 3 * u * tt * p2 + ttt * p3;\n};\n\nexport const validateCubicBezierPoints = (points: CubicBezierPoints): boolean => {\n const { p1, p2 } = points;\n return p1.x >= 0 && p1.x <= 1 && p2.x >= 0 && p2.x <= 1;\n};\n\nexport const validateLinearPoints = (points: LinearPoints): boolean => {\n if (points.length < 2) {\n return false;\n }\n\n const sortedPoints = [...points].sort((a, b) => a.x - b.x);\n\n for (let index = 0; index < sortedPoints.length; index += 1) {\n const point = sortedPoints[index];\n\n if (!point) {\n return false;\n }\n if (point.x < 0 || point.x > 1) {\n return false;\n }\n\n if (index >= sortedPoints.length - 1) {\n continue;\n }\n\n const next = sortedPoints[index + 1];\n\n if (!next) {\n return false;\n }\n\n if (next.x <= point.x + MIN_LINEAR_DELTA) {\n return false;\n }\n }\n\n const first = sortedPoints[0];\n const last = sortedPoints[sortedPoints.length - 1];\n if (first && Math.abs(first.x) > MIN_LINEAR_DELTA) {\n return false;\n }\n if (last && Math.abs(last.x - 1) > MIN_LINEAR_DELTA) {\n return false;\n }\n\n return true;\n};\n\nexport const normalizeLinearPoints = (points: LinearPoints): LinearPoints => {\n if (points.length === 0) {\n return [];\n }\n\n const normalized: LinearPoints = [...points].sort((a, b) => a.x - b.x).map((point) => cloneLinearPoint(point));\n\n const first = normalized[0];\n if (first) {\n first.x = 0;\n }\n\n const last = normalized[normalized.length - 1];\n if (last) {\n last.x = 1;\n }\n\n for (let index = 0; index < normalized.length; index += 1) {\n const point = normalized[index];\n if (!point) {\n continue;\n }\n\n const minY = -2;\n const maxY = 3;\n point.y = Math.max(minY, Math.min(maxY, point.y));\n\n if ((point.cpInX ?? 0) > 0) {\n point.cpInX = 0;\n }\n if ((point.cpOutX ?? 0) < 0) {\n point.cpOutX = 0;\n }\n\n const handleThreshold = 0;\n if (Math.abs(point.cpInX ?? 0) < handleThreshold && Math.abs(point.cpInY ?? 0) < handleThreshold) {\n delete point.cpInX;\n delete point.cpInY;\n }\n if (Math.abs(point.cpOutX ?? 0) < handleThreshold && Math.abs(point.cpOutY ?? 0) < handleThreshold) {\n delete point.cpOutX;\n delete point.cpOutY;\n }\n\n if (point.cpInX === undefined && point.cpOutX === undefined) {\n delete point.isLinked;\n delete point.mirrorLength;\n } else if (point.isLinked !== true) {\n point.mirrorLength = false;\n }\n }\n\n return normalized;\n};\n\nconst clamp01 = (value: number): number => {\n if (Number.isNaN(value)) {\n return 0;\n }\n return Math.min(1, Math.max(0, value));\n};\n\nexport const parseCubicBezierValue = (input: string): CubicBezierPoints | null => {\n const match = input.trim().match(/^cubic-bezier\\s*\\((.+)\\)$/i);\n\n if (!match) {\n return null;\n }\n\n const body = match[1];\n if (!body) {\n return null;\n }\n\n const parts = body\n .split(',')\n .map((part) => Number.parseFloat(part.trim()))\n .filter((value) => Number.isFinite(value));\n\n if (parts.length !== 4) {\n return null;\n }\n\n const [x1, y1, x2, y2] = parts as [number, number, number, number];\n\n if ([x1, y1, x2, y2].some((value) => Number.isNaN(value))) {\n return null;\n }\n\n return {\n p1: { x: clamp01(x1), y: y1 },\n p2: { x: clamp01(x2), y: y2 }\n };\n};\n\ntype LinearStop = {\n y: number;\n x: number | null;\n};\n\nconst ensureStopPositions = (stops: LinearStop[]): void => {\n if (stops.length === 0) {\n return;\n }\n\n const first = stops[0];\n if (first && first.x == null) {\n first.x = 0;\n }\n\n const lastIndex = stops.length - 1;\n const last = stops[lastIndex];\n if (last && last.x == null) {\n last.x = 1;\n }\n\n const assignBetween = (startIndex: number, endIndex: number): void => {\n const startStop = stops[startIndex];\n const endStop = stops[endIndex];\n\n if (!startStop || !endStop || startStop.x == null || endStop.x == null) {\n return;\n }\n\n const span = endStop.x - startStop.x;\n const segments = endIndex - startIndex;\n\n if (segments <= 1) {\n return;\n }\n\n for (let offset = 1; offset < segments; offset += 1) {\n const index = startIndex + offset;\n const ratio = offset / segments;\n const target = stops[index];\n if (target) {\n target.x = startStop.x + span * ratio;\n }\n }\n };\n\n let lastDefined = 0;\n\n for (let index = 1; index < stops.length; index += 1) {\n if (stops[index]?.x != null) {\n assignBetween(lastDefined, index);\n lastDefined = index;\n }\n }\n\n if (lastDefined < stops.length - 1) {\n assignBetween(lastDefined, stops.length - 1);\n }\n};\n\nexport const parseLinearTimingFunction = (input: string): LinearPoints | null => {\n const match = input.trim().match(/^linear\\s*\\((.+)\\)$/is);\n\n if (!match) {\n return null;\n }\n\n const body = match[1];\n if (!body) {\n return null;\n }\n\n const segments = body\n .split(',')\n .map((segment) => segment.trim())\n .filter((segment) => segment.length > 0);\n\n if (segments.length < 2) {\n return null;\n }\n\n const stops: LinearStop[] = [];\n\n for (const segment of segments) {\n const parts = segment.split(/\\s+/).filter((part) => part.length > 0);\n if (parts.length === 0) {\n continue;\n }\n\n const valueToken = parts[0];\n if (!valueToken) {\n continue;\n }\n const value = Number.parseFloat(valueToken);\n if (Number.isNaN(value)) {\n return null;\n }\n\n let position: number | null = null;\n\n for (let index = 1; index < parts.length; index += 1) {\n const token = parts[index];\n if (!token) {\n continue;\n }\n const percentMatch = token.match(/^(-?\\d+(?:\\.\\d+)?)%$/);\n if (percentMatch) {\n const [, percentValue] = percentMatch;\n if (percentValue === undefined) {\n break;\n }\n const parsed = Number.parseFloat(percentValue);\n if (!Number.isNaN(parsed)) {\n position = clamp01(parsed / 100);\n }\n break;\n }\n }\n\n stops.push({ y: value, x: position });\n }\n\n if (stops.length < 2) {\n return null;\n }\n\n ensureStopPositions(stops);\n\n const rawPoints: LinearPoints = stops.map((stop) => {\n const x = stop.x ?? 0;\n return { x: clamp01(x), y: stop.y };\n });\n\n return normalizeLinearPoints(rawPoints);\n};\n\nexport const vectorLength = (dx: number, dy: number): number => Math.sqrt(dx * dx + dy * dy);\n\nexport const normalizeVector = (dx: number, dy: number): { dx: number; dy: number } => {\n const length = vectorLength(dx, dy);\n\n if (length === 0) {\n return { dx: 0, dy: 0 };\n }\n\n return { dx: dx / length, dy: dy / length };\n};\n\nexport const smoothLinearPoints = (points: LinearPoints, tension = 0.25): LinearPoints => {\n if (points.length < 2) {\n return points;\n }\n\n return points.map((point, index) => {\n const prev = points[index - 1];\n const next = points[index + 1];\n\n const smoothedPoint: LinearPoint = { ...point, isLinked: true, mirrorLength: true };\n\n if (index === 0 && next) {\n const dx = next.x - point.x;\n const dy = next.y - point.y;\n const length = Math.sqrt(dx * dx + dy * dy);\n const handleLength = length * tension;\n\n if (length > 0) {\n smoothedPoint.cpOutX = (dx / length) * handleLength;\n smoothedPoint.cpOutY = (dy / length) * handleLength;\n }\n return smoothedPoint;\n }\n\n if (index === points.length - 1 && prev) {\n const dx = point.x - prev.x;\n const dy = point.y - prev.y;\n const length = Math.sqrt(dx * dx + dy * dy);\n const handleLength = length * tension;\n\n if (length > 0) {\n smoothedPoint.cpInX = -(dx / length) * handleLength;\n smoothedPoint.cpInY = -(dy / length) * handleLength;\n }\n return smoothedPoint;\n }\n\n if (prev && next) {\n const tangentX = next.x - prev.x;\n const tangentY = next.y - prev.y;\n const tangentLength = Math.sqrt(tangentX * tangentX + tangentY * tangentY);\n\n if (tangentLength > 0) {\n const normalizedTx = tangentX / tangentLength;\n const normalizedTy = tangentY / tangentLength;\n\n const distToPrev = Math.sqrt((point.x - prev.x) ** 2 + (point.y - prev.y) ** 2);\n const distToNext = Math.sqrt((next.x - point.x) ** 2 + (next.y - point.y) ** 2);\n\n const inHandleLength = distToPrev * tension;\n const outHandleLength = distToNext * tension;\n\n smoothedPoint.cpInX = -normalizedTx * inHandleLength;\n smoothedPoint.cpInY = -normalizedTy * inHandleLength;\n smoothedPoint.cpOutX = normalizedTx * outHandleLength;\n smoothedPoint.cpOutY = normalizedTy * outHandleLength;\n }\n }\n\n return smoothedPoint;\n });\n};\n","import { html, type SVGTemplateResult, svg } from 'lit-html';\n\nimport {\n BEZIER_CONTROL_MAX_Y,\n BEZIER_CONTROL_MIN_Y,\n DEFAULT_HANDLE_LENGTH,\n DRAG_ACTIVATION_DISTANCE_PX_SQUARED,\n HIT_AREA_RADIUS,\n LINEAR_HIT_THRESHOLD,\n LINEAR_PATH_SAMPLES,\n SVG_HEIGHT,\n SVG_WIDTH\n} from './constants';\nimport { canvasStyles } from './styles';\nimport { generateGridLines } from './svg-renderer';\nimport {\n type CubicBezierPoints,\n EasingType,\n type LinearPoint,\n type LinearPoints,\n MAX_LINEAR_POINTS,\n type Point\n} from './types';\nimport {\n clampPoint,\n cloneLinearPoint,\n cubicBezierPath,\n ensureLinearPointId,\n getLinearApproximation,\n linearDisplayPath,\n MIN_LINEAR_DELTA,\n normalizeLinearPoints,\n normalizeVector,\n vectorLength\n} from './utils';\n\nimport { Component } from '~/decorators/Component';\nimport { Prop } from '~/decorators/Prop';\nimport { Query } from '~/decorators/Query';\nimport { type ControlEventDetail, dispatchControlEvent } from '~/elements/shared';\n\ntype CurveHost = HTMLElement & {\n points: CubicBezierPoints | LinearPoints;\n handlePointsChange?: (event: CustomEvent<ControlEventDetail<CubicBezierPoints | LinearPoints>>) => void;\n};\n\ntype LinearInsertPreview = {\n path: string;\n normalizedPoints: LinearPoints;\n insertedIndex: number;\n insertedPoint: LinearPoint;\n};\n\n@Component({\n tag: 'ease-curve-canvas',\n styles: canvasStyles,\n template(this: CurveCanvas) {\n const hoverPreviewPath = this.getHoverCurvePath();\n const controlElements = this.getControlElements();\n const hoverInsertElements = this.getHoverInsertElements();\n const curvePath = this.getCurvePath();\n\n return html`\n <svg\n viewBox=\"0 0 ${SVG_WIDTH} ${SVG_HEIGHT}\"\n width=\"${SVG_WIDTH}\"\n height=\"${SVG_HEIGHT}\"\n @pointerdown=${this.handlePointerDown}\n @pointermove=${this.handlePointerMove}\n @pointerup=${this.handlePointerUp}\n @pointerleave=${this.handlePointerLeave}\n @pointercancel=${this.handlePointerLeave}\n >\n ${this.showGrid ? svg`<g style=\"view-transition-name: grid-lines\">${this.getGridLines()}</g>` : null}\n ${hoverPreviewPath ? html`<path class=\"curve-path curve-path--preview\" d=${hoverPreviewPath}></path>` : null}\n <path class=\"curve-path\" d=${curvePath} />\n ${controlElements}\n ${hoverInsertElements}\n </svg>\n `;\n }\n})\nexport class CurveCanvas extends HTMLElement {\n declare requestRender: () => void;\n\n @Prop<EasingType>({ reflect: true })\n accessor easingType!: EasingType;\n\n @Prop<CubicBezierPoints | LinearPoints>({ type: Object, reflect: false })\n accessor points!: CubicBezierPoints | LinearPoints;\n\n @Prop<boolean>({ type: Boolean, reflect: true, defaultValue: true })\n accessor showGrid!: boolean;\n\n @Prop<boolean>({ type: Boolean, reflect: true, defaultValue: false })\n accessor snapToGrid!: boolean;\n\n @Prop<number>({ type: Number, reflect: true, defaultValue: 8 })\n accessor gridSize: number = 8;\n\n @Prop<number | null>({ type: Number, reflect: false, defaultValue: null })\n accessor focusedLinearIndex: number | null = null;\n\n @Prop<number>({ type: Number, reflect: true, defaultValue: 0 })\n accessor simplify: number = 0;\n\n @Prop<number>({ type: Number, reflect: true, defaultValue: 5 })\n accessor round: number = 5;\n\n @Query<SVGSVGElement>('svg')\n accessor svgElement!: SVGSVGElement | null;\n\n #isDragging = false;\n #dragIndex: number | null = null;\n #dragMode: 'point' | 'handleIn' | 'handleOut' | null = null;\n #hoverPoint: Point | null = null;\n #hoverInsertPreview: LinearInsertPreview | null = null;\n #dragStartPoints: Map<string, LinearPoint> | null = null;\n #dragPointId: string | null = null;\n #pendingDrag: { mode: 'point' | 'handleIn' | 'handleOut'; index: number; startX: number; startY: number } | null =\n null;\n\n #getEventTarget = (): CurveHost => {\n const root = this.getRootNode();\n if (root instanceof ShadowRoot && root.host instanceof HTMLElement) {\n return root.host as CurveHost;\n }\n return this as CurveHost;\n };\n\n #renderCubicBezier = (): SVGTemplateResult[] => {\n const points = this.#getCubicBezierPoints();\n\n if (!points) {\n console.warn('Invalid cubic-bezier points for rendering:', this.points);\n return [];\n }\n\n try {\n const anchorStart = this.#toSvgCoords({ x: 0, y: 0 });\n const anchorEnd = this.#toSvgCoords({ x: 1, y: 1 });\n const controlOne = this.#toSvgCoords(points.p1);\n const controlTwo = this.#toSvgCoords(points.p2);\n\n const elements: SVGTemplateResult[] = [];\n\n const handlePathOne = this.#createHandlePath(anchorStart, controlOne);\n const handlePathTwo = this.#createHandlePath(anchorEnd, controlTwo);\n\n elements.push(svg`<circle\n class=\"hit-area-point\"\n cx=\"${controlOne.x}\"\n cy=\"${controlOne.y}\"\n r=\"${HIT_AREA_RADIUS}\"\n data-index=\"0\"\n data-role=\"point\"\n />`);\n elements.push(svg`<circle\n class=\"hit-area-point\"\n cx=\"${controlTwo.x}\"\n cy=\"${controlTwo.y}\"\n r=\"${HIT_AREA_RADIUS}\"\n data-index=\"1\"\n data-role=\"point\"\n />`);\n\n if (handlePathOne) {\n elements.push(svg`<path\n class=\"control-point ${this.#dragIndex === 0 && this.#dragMode === 'point' ? 'selected' : ''}\"\n d=\"${handlePathOne}\"\n data-index=\"0\"\n data-role=\"point\"\n />`);\n }\n\n if (handlePathTwo) {\n elements.push(svg`<path\n class=\"control-point ${this.#dragIndex === 1 && this.#dragMode === 'point' ? 'selected' : ''}\"\n d=\"${handlePathTwo}\"\n data-index=\"1\"\n data-role=\"point\"\n />`);\n }\n\n elements.push(svg`<circle class=\"anchor-point-start\" cx=\"${anchorStart.x}\" cy=\"${anchorStart.y}\" />`);\n elements.push(svg`<circle class=\"anchor-point-start\" cx=\"${anchorEnd.x}\" cy=\"${anchorEnd.y}\" />`);\n\n return elements;\n } catch (error) {\n console.error('Error rendering cubic-bezier elements:', error);\n return [];\n }\n };\n\n #toSvgCoords = (p: Point) => {\n return {\n x: p.x * SVG_WIDTH,\n y: (1 - p.y) * SVG_HEIGHT\n };\n };\n\n #renderLinear = (): SVGTemplateResult[] => {\n const points = this.#getLinearPoints();\n\n if (!points) {\n return [];\n }\n\n try {\n const elements: SVGTemplateResult[] = [];\n const focusedIndex = this.focusedLinearIndex;\n\n points.forEach((point, index) => {\n if (!point) {\n return;\n }\n\n const isPointFocused = focusedIndex === index;\n const isDraggingPoint = this.#isDragging && this.#dragIndex === index;\n\n if (!isPointFocused && !isDraggingPoint) {\n return;\n }\n\n const anchorSvg = this.#toSvgCoords(point);\n\n if (index > 0 && (point.cpInX !== undefined || point.cpInY !== undefined)) {\n this.#renderLinearHandle(elements, point, anchorSvg, index, 'In');\n }\n\n if (index < points.length - 1 && (point.cpOutX !== undefined || point.cpOutY !== undefined)) {\n this.#renderLinearHandle(elements, point, anchorSvg, index, 'Out');\n }\n });\n\n points.forEach((point, index) => {\n if (!point) {\n return;\n }\n\n const isPointFocused = focusedIndex === index;\n const isPointActive = (this.#dragMode === 'point' && this.#dragIndex === index) || isPointFocused;\n\n const anchorSvg = this.#toSvgCoords(point);\n\n elements.push(svg`<circle\n class=\"hit-area-point\"\n cx=\"${anchorSvg.x}\"\n cy=\"${anchorSvg.y}\"\n r=\"${HIT_AREA_RADIUS}\"\n data-index=\"${index}\"\n data-role=\"point\"\n />`);\n elements.push(svg`<circle\n class=\"linear-point ${isPointActive ? 'selected' : ''}\"\n cx=\"${anchorSvg.x}\"\n cy=\"${anchorSvg.y}\"\n data-index=\"${index}\"\n data-role=\"point\"\n title=\"Point P${index + 1}: ${Math.round(point.x * 100)}%, ${Math.round(point.y * 100)}%\"\n />`);\n });\n\n return elements;\n } catch (error) {\n console.error('Error rendering linear points:', error);\n return [];\n }\n };\n\n #renderLinearHandle(\n elements: SVGTemplateResult[],\n point: LinearPoint,\n anchorSvg: Point,\n index: number,\n direction: 'In' | 'Out'\n ): void {\n const dx = direction === 'In' ? (point.cpInX ?? 0) : (point.cpOutX ?? 0);\n const dy = direction === 'In' ? (point.cpInY ?? 0) : (point.cpOutY ?? 0);\n\n const handlePos = { x: point.x + dx, y: point.y + dy };\n const handleSvg = this.#toSvgCoords(handlePos);\n const role = direction === 'In' ? 'handleIn' : 'handleOut';\n const dragMode = direction === 'In' ? 'handleIn' : 'handleOut';\n\n const isHandleActive = this.#dragMode === dragMode && this.#dragIndex === index;\n\n const handlePath = this.#createHandlePath(anchorSvg, handleSvg);\n\n if (!handlePath) {\n return;\n }\n\n elements.push(svg`<circle\n class=\"hit-area-handle\"\n cx=\"${handleSvg.x}\"\n cy=\"${handleSvg.y}\"\n r=\"${HIT_AREA_RADIUS}\"\n data-index=\"${index}\"\n data-role=\"${role}\"\n />`);\n\n elements.push(svg`<path\n class=\"linear-handle ${isHandleActive ? 'selected' : ''}\"\n d=\"${handlePath}\"\n data-index=\"${index}\"\n data-role=\"${role}\"\n title=\"Handle ${direction}: ${Math.round(handlePos.x * 100)}%, ${Math.round(handlePos.y * 100)}%\"\n />`);\n }\n\n #getCurvePath = (): string => {\n try {\n if (this.easingType === EasingType.CUBIC_BEZIER) {\n const points = this.#getCubicBezierPoints();\n\n if (!points) {\n console.warn('Invalid cubic-bezier points:', this.points);\n return '';\n }\n\n return cubicBezierPath(points);\n }\n\n const points = this.#getLinearPoints();\n\n if (!points || points.length < 2) {\n return '';\n }\n\n if (this.simplify > 0) {\n const approxPoints = getLinearApproximation(points, {\n simplify: this.simplify,\n round: this.round\n });\n return linearDisplayPath(approxPoints as LinearPoints);\n }\n\n return linearDisplayPath(points);\n } catch (error) {\n console.error('Error generating curve path:', error);\n return '';\n }\n };\n\n #getHoverCurvePath = (): string => {\n if (this.#isDragging) {\n return '';\n }\n\n try {\n if (this.easingType === EasingType.CUBIC_BEZIER) {\n const hoverPoint = this.#hoverPoint;\n if (!hoverPoint) {\n return '';\n }\n\n const points = this.#getCubicBezierPoints();\n if (!points) {\n return '';\n }\n\n return cubicBezierPath({\n p1: hoverPoint,\n p2: points.p2\n });\n }\n\n if (this.easingType === EasingType.LINEAR) {\n return this.#hoverInsertPreview?.path ?? '';\n }\n\n return '';\n } catch (error) {\n console.error('Error generating hover curve path:', error);\n return '';\n }\n };\n\n getHoverInsertElements(): SVGTemplateResult | null {\n if (this.easingType !== EasingType.LINEAR) {\n return null;\n }\n\n const preview = this.#hoverInsertPreview;\n if (!preview || !preview.insertedPoint) {\n return null;\n }\n\n const point = preview.insertedPoint;\n const anchor = this.#toSvgCoords(point);\n const elements: SVGTemplateResult[] = [];\n\n if (point.cpInX !== undefined || point.cpInY !== undefined) {\n const handlePoint = this.#toSvgCoords({\n x: point.x + (point.cpInX ?? 0),\n y: point.y + (point.cpInY ?? 0)\n });\n const handlePath = this.#createHandlePath(anchor, handlePoint);\n if (handlePath) {\n elements.push(\n svg`<path\n class=\"linear-handle linear-handle--preview\"\n d=\"${handlePath}\"\n />`\n );\n }\n }\n\n if (point.cpOutX !== undefined || point.cpOutY !== undefined) {\n const handlePoint = this.#toSvgCoords({\n x: point.x + (point.cpOutX ?? 0),\n y: point.y + (point.cpOutY ?? 0)\n });\n const handlePath = this.#createHandlePath(anchor, handlePoint);\n if (handlePath) {\n elements.push(\n svg`<path\n class=\"linear-handle linear-handle--preview\"\n d=\"${handlePath}\"\n />`\n );\n }\n }\n\n elements.push(svg`<circle class=\"linear-point linear-point--preview\" cx=\"${anchor.x}\" cy=\"${anchor.y}\" />`);\n\n return svg`<g class=\"linear-preview-group\" pointer-events=\"none\">${elements}</g>`;\n }\n\n #createHandlePath(anchorSvg: Point, handleSvg: Point): string | null {\n const vecX = handleSvg.x - anchorSvg.x;\n const vecY = handleSvg.y - anchorSvg.y;\n const length = Math.sqrt(vecX * vecX + vecY * vecY);\n\n const circleRadius = 4.5;\n const barHalfHeight = 0.66;\n\n if (length < circleRadius + 2) {\n return null;\n }\n\n const dirX = vecX / length;\n const dirY = vecY / length;\n const perpX = -dirY;\n const perpY = dirX;\n\n const cx = handleSvg.x;\n const cy = handleSvg.y;\n\n const transitionZone = Math.min(8, (length - circleRadius) * 0.5);\n\n const barEndDist = length - circleRadius - transitionZone;\n\n const barTopStartX = anchorSvg.x + perpX * barHalfHeight;\n const barTopStartY = anchorSvg.y + perpY * barHalfHeight;\n const barBottomStartX = anchorSvg.x - perpX * barHalfHeight;\n const barBottomStartY = anchorSvg.y - perpY * barHalfHeight;\n\n const barTopEndX = anchorSvg.x + dirX * barEndDist + perpX * barHalfHeight;\n const barTopEndY = anchorSvg.y + dirY * barEndDist + perpY * barHalfHeight;\n const barBottomEndX = anchorSvg.x + dirX * barEndDist - perpX * barHalfHeight;\n const barBottomEndY = anchorSvg.y + dirY * barEndDist - perpY * barHalfHeight;\n\n const circleTopX = cx + perpX * circleRadius;\n const circleTopY = cy + perpY * circleRadius;\n const circleBottomX = cx - perpX * circleRadius;\n const circleBottomY = cy - perpY * circleRadius;\n\n const ctrl1Dist = transitionZone * 0.35;\n const ctrl2Dist = transitionZone * 0.65;\n\n const ctrl1TopX = barTopEndX + dirX * ctrl1Dist;\n const ctrl1TopY = barTopEndY + dirY * ctrl1Dist;\n const ctrl2TopX = circleTopX - dirX * ctrl2Dist;\n const ctrl2TopY = circleTopY - dirY * ctrl2Dist;\n\n const ctrl1BottomX = barBottomEndX + dirX * ctrl1Dist;\n const ctrl1BottomY = barBottomEndY + dirY * ctrl1Dist;\n const ctrl2BottomX = circleBottomX - dirX * ctrl2Dist;\n const ctrl2BottomY = circleBottomY - dirY * ctrl2Dist;\n\n return `\n M ${circleBottomX} ${circleBottomY}\n C ${ctrl2BottomX} ${ctrl2BottomY} ${ctrl1BottomX} ${ctrl1BottomY} ${barBottomEndX} ${barBottomEndY}\n L ${barBottomStartX} ${barBottomStartY}\n A ${barHalfHeight} ${barHalfHeight} 0 0 0 ${barTopStartX} ${barTopStartY}\n L ${barTopEndX} ${barTopEndY}\n C ${ctrl1TopX} ${ctrl1TopY} ${ctrl2TopX} ${ctrl2TopY} ${circleTopX} ${circleTopY}\n A ${circleRadius} ${circleRadius} 0 1 0 ${circleBottomX} ${circleBottomY}\n Z\n `;\n }\n\n #getCubicBezierPoints = (): CubicBezierPoints | null => {\n if (Array.isArray(this.points)) {\n return null;\n }\n\n return this.points ?? null;\n };\n\n #getLinearPoints = (): LinearPoints | null => {\n if (!Array.isArray(this.points)) {\n return null;\n }\n\n this.#ensureLinearPointIds(this.points);\n return this.points;\n };\n\n #ensureLinearPointIds = (points: LinearPoints | null): void => {\n if (!points) {\n return;\n }\n\n for (const point of points) {\n if (!point) {\n continue;\n }\n ensureLinearPointId(point);\n }\n };\n\n #createLinearStartPointMap = (points: LinearPoints | null): Map<string, LinearPoint> | null => {\n if (!points) {\n return null;\n }\n\n const map = new Map<string, LinearPoint>();\n\n for (const point of points) {\n if (!point) {\n continue;\n }\n const id = ensureLinearPointId(point);\n map.set(id, cloneLinearPoint(point));\n }\n\n return map;\n };\n\n #getDistanceToLinearPath(point: Point, points: LinearPoints): number {\n if (points.length < 2) {\n return Number.POSITIVE_INFINITY;\n }\n\n let minDistanceSquared = Number.POSITIVE_INFINITY;\n\n for (let index = 0; index < points.length - 1; index += 1) {\n const start = points[index];\n const end = points[index + 1];\n\n if (!start || !end) {\n continue;\n }\n\n const cp1 = {\n x: start.x + (start.cpOutX ?? 0),\n y: start.y + (start.cpOutY ?? 0)\n };\n\n const cp2 = {\n x: end.x + (end.cpInX ?? 0),\n y: end.y + (end.cpInY ?? 0)\n };\n\n for (let sample = 0; sample <= LINEAR_PATH_SAMPLES; sample += 1) {\n const t = sample / LINEAR_PATH_SAMPLES;\n const samplePoint = evaluateCubicPointNormalized(t, start, cp1, cp2, end);\n const dx = point.x - samplePoint.x;\n const dy = point.y - samplePoint.y;\n const distanceSquared = dx * dx + dy * dy;\n if (distanceSquared < minDistanceSquared) {\n minDistanceSquared = distanceSquared;\n }\n }\n }\n\n return Math.sqrt(minDistanceSquared);\n }\n\n #isPointNearLinearPath(point: Point, points: LinearPoints): boolean {\n const distance = this.#getDistanceToLinearPath(point, points);\n return distance <= LINEAR_HIT_THRESHOLD;\n }\n\n #isNearExistingPointOrHandle(position: Point, points: LinearPoints): boolean {\n const mouseSvg = this.#toSvgCoords(position);\n const thresholdSquared = HIT_AREA_RADIUS * HIT_AREA_RADIUS;\n\n for (const point of points) {\n if (!point) {\n continue;\n }\n\n const pointSvg = this.#toSvgCoords(point);\n const dx = pointSvg.x - mouseSvg.x;\n const dy = pointSvg.y - mouseSvg.y;\n\n if (dx * dx + dy * dy < thresholdSquared) {\n return true;\n }\n\n if (point.cpInX !== undefined || point.cpInY !== undefined) {\n const handleIn = {\n x: point.x + (point.cpInX ?? 0),\n y: point.y + (point.cpInY ?? 0)\n };\n const handleInSvg = this.#toSvgCoords(handleIn);\n const hdx = handleInSvg.x - mouseSvg.x;\n const hdy = handleInSvg.y - mouseSvg.y;\n\n if (hdx * hdx + hdy * hdy < thresholdSquared) {\n return true;\n }\n }\n\n if (point.cpOutX !== undefined || point.cpOutY !== undefined) {\n const handleOut = {\n x: point.x + (point.cpOutX ?? 0),\n y: point.y + (point.cpOutY ?? 0)\n };\n const handleOutSvg = this.#toSvgCoords(handleOut);\n const hdx = handleOutSvg.x - mouseSvg.x;\n const hdy = handleOutSvg.y - mouseSvg.y;\n\n if (hdx * hdx + hdy * hdy < thresholdSquared) {\n return true;\n }\n }\n }\n\n return false;\n }\n\n #getMousePosition = (event: PointerEvent, options?: { skipSnap?: boolean }): Point => {\n const svgElement = this.svgElement;\n\n if (!svgElement) {\n return { x: 0, y: 0 };\n }\n\n const rect = svgElement.getBoundingClientRect();\n const svgX = event.clientX - rect.left;\n const svgY = event.clientY - rect.top;\n\n let x = svgX / rect.width;\n let y = 1 - svgY / rect.height;\n\n const skipSnap = options?.skipSnap ?? false;\n\n const shouldSnap =\n !skipSnap &&\n this.snapToGrid &&\n !(this.#isDragging && (this.#dragMode === 'handleIn' || this.#dragMode === 'handleOut'));\n\n if (shouldSnap) {\n const ratioX = SVG_WIDTH / this.gridSize;\n const ratioY = SVG_HEIGHT / this.gridSize;\n x = Math.round(x * ratioX) / ratioX;\n y = Math.round(y * ratioY) / ratioY;\n }\n\n const bezierBounds =\n this.easingType === EasingType.CUBIC_BEZIER\n ? { minY: BEZIER_CONTROL_MIN_Y, maxY: BEZIER_CONTROL_MAX_Y }\n : undefined;\n\n return clampPoint({ x, y }, bezierBounds);\n };\n\n #constrainLinearPoint = (index: number, position: Point, points: LinearPoints): LinearPoint => {\n let x = position.x;\n\n if (index === 0) {\n x = 0;\n } else if (index === points.length - 1) {\n x = 1;\n } else {\n x = Math.min(Math.max(x, MIN_LINEAR_DELTA), 1 - MIN_LINEAR_DELTA);\n }\n\n const clamped = clampPoint({ x, y: position.y }, { minY: -2, maxY: 3 });\n const sourcePoint = points[index];\n\n return {\n ...sourcePoint,\n x: clamped.x,\n y: clamped.y\n };\n };\n\n #emitPoints = (value: CubicBezierPoints | LinearPoints, event: Event): void => {\n const target = this.#getEventTarget();\n const detail: ControlEventDetail<CubicBezierPoints | LinearPoints> = { value, event };\n\n dispatchControlEvent(target, 'points-change', detail);\n };\n\n #notifyLinearFocus = (index: number | null, event: Event): void => {\n if (this.easingType !== EasingType.LINEAR) {\n return;\n }\n const target = this.#getEventTarget();\n const detail: ControlEventDetail<number | null> = { value: index, event };\n dispatchControlEvent(target, 'linear-point-focus', detail);\n };\n\n #toggleLinearHandleLinking = (index: number, event: Event): void => {\n const points = this.#getLinearPoints();\n if (!points || index < 0 || index >= points.length) {\n return;\n }\n\n const point = points[index];\n if (!point) {\n return;\n }\n\n const updatedPoints = [...points];\n const updatedPoint = { ...point };\n updatedPoints[index] = updatedPoint;\n\n const newLinkingState = !updatedPoint.isLinked;\n updatedPoint.isLinked = newLinkingState;\n updatedPoint.mirrorLength = Boolean(newLinkingState);\n\n if (newLinkingState) {\n this.#ensureLinkedHandles(updatedPoint, index, points);\n }\n\n const normalizedPoints = normalizeLinearPoints(updatedPoints);\n this.points = normalizedPoints;\n this.#emitPoints(normalizedPoints, event);\n this.#notifyLinearFocus(index, event);\n this.requestRender();\n };\n\n #ensureLinkedHandles(point: LinearPoint, index: number, points: LinearPoints): void {\n const prev = points[index - 1];\n const next = points[index + 1];\n\n let refDx = point.cpOutX ?? -(point.cpInX ?? 0);\n let refDy = point.cpOutY ?? -(point.cpInY ?? 0);\n\n if (refDx === 0 && refDy === 0) {\n let dirX = 0;\n let dirY = 0;\n\n if (prev && next) {\n dirX = next.x - prev.x;\n dirY = next.y - prev.y;\n } else if (next) {\n dirX = next.x - point.x;\n dirY = next.y - point.y;\n } else if (prev) {\n dirX = point.x - prev.x;\n dirY = point.y - prev.y;\n } else {\n dirX = 1;\n dirY = 0;\n }\n\n const direction = normalizeVector(dirX, dirY);\n const length = DEFAULT_HANDLE_LENGTH;\n\n point.cpInX = -direction.dx * length;\n point.cpInY = -direction.dy * length;\n point.cpOutX = direction.dx * length;\n point.cpOutY = direction.dy * length;\n refDx = point.cpOutX;\n refDy = point.cpOutY;\n }\n\n if (refDx === 0 && refDy === 0) {\n return;\n }\n\n const normalized = normalizeVector(refDx, refDy);\n const referenceLength = vectorLength(refDx, refDy) || DEFAULT_HANDLE_LENGTH;\n\n const inLength = vectorLength(point.cpInX ?? 0, point.cpInY ?? 0) || referenceLength;\n point.cpInX = -normalized.dx * inLength;\n point.cpInY = -normalized.dy * inLength;\n\n const outLength = vectorLength(point.cpOutX ?? 0, point.cpOutY ?? 0) || referenceLength;\n point.cpOutX = normalized.dx * outLength;\n point.cpOutY = normalized.dy * outLength;\n\n if (point.mirrorLength !== false) {\n this.#alignLinkedHandleLengths(point);\n }\n }\n\n #alignLinkedHandleLengths(point: LinearPoint): void {\n if (!point.isLinked) {\n point.mirrorLength = false;\n return;\n }\n\n const outLength = vectorLength(point.cpOutX ?? 0, point.cpOutY ?? 0);\n const inLength = vectorLength(point.cpInX ?? 0, point.cpInY ?? 0);\n const targetLength = Math.max(outLength, inLength);\n\n if (targetLength <= 0) {\n return;\n }\n\n if (outLength > 0) {\n const outDirection = normalizeVector(point.cpOutX ?? 0, point.cpOutY ?? 0);\n point.cpOutX = outDirection.dx * targetLength;\n point.cpOutY = outDirection.dy * targetLength;\n } else if (inLength > 0) {\n const inDirection = normalizeVector(point.cpInX ?? 0, point.cpInY ?? 0);\n point.cpOutX = -inDirection.dx * targetLength;\n point.cpOutY = -inDirection.dy * targetLength;\n }\n\n if (inLength > 0) {\n const inDirection = normalizeVector(point.cpInX ?? 0, point.cpInY ?? 0);\n point.cpInX = inDirection.dx * targetLength;\n point.cpInY = inDirection.dy * targetLength;\n } else if (outLength > 0) {\n const outDirection = normalizeVector(point.cpOutX ?? 0, point.cpOutY ?? 0);\n point.cpInX = -outDirection.dx * targetLength;\n point.cpInY = -outDirection.dy * targetLength;\n }\n }\n\n getGridLines(): SVGTemplateResult[] {\n return generateGridLines(this.gridSize);\n }\n\n getControlElements(): SVGTemplateResult[] {\n return this.easingType === EasingType.CUBIC_BEZIER ? this.#renderCubicBezier() : this.#renderLinear();\n }\n\n getCurvePath(): string {\n return this.#getCurvePath();\n }\n\n getHoverCurvePath(): string {\n return this.#getHoverCurvePath();\n }\n\n readonly handlePointerDown = (event: PointerEvent): void => {\n event.preventDefault();\n let linearPoints = this.easingType === EasingType.LINEAR ? this.#getLinearPoints() : null;\n this.#dragStartPoints = this.#createLinearStartPointMap(linearPoints);\n this.#pendingDrag = null;\n this.#dragPointId = null;\n\n const target = event.target;\n\n if (!(target instanceof SVGElement)) {\n return;\n }\n\n const role = target.getAttribute('data-role');\n const indexAttribute = target.getAttribute('data-index');\n\n if (indexAttribute !== null) {\n const index = Number.parseInt(indexAttribute, 10);\n if (Number.isNaN(index)) {\n return;\n }\n\n if (this.easingType === EasingType.LINEAR) {\n if (role === 'handleIn' || role === 'handleOut') {\n const point = linearPoints?.[index];\n if (point) {\n this.#dragPointId = ensureLinearPointId(point);\n }\n this.svgElement?.setPointerCapture(event.pointerId);\n this.#isDragging = true;\n this.#dragMode = role;\n this.#dragIndex = index;\n this.#pendingDrag = null;\n this.#hoverPoint = null;\n this.#notifyLinearFocus(index, event);\n this.handlePointerMove(event);\n this.requestRender();\n return;\n }\n\n if (role === 'point') {\n if (event.detail === 2) {\n this.#toggleLinearHandleLinking(index, event);\n return;\n }\n\n const point = linearPoints?.[index];\n if (point) {\n this.#dragPointId = ensureLinearPointId(point);\n }\n this.#notifyLinearFocus(index, event);\n this.svgElement?.setPointerCapture(event.pointerId);\n this.#isDragging = false;\n this.#dragMode = 'point';\n this.#dragIndex = index;\n this.#pendingDrag = {\n mode: 'point',\n index,\n startX: event.clientX,\n startY: event.clientY\n };\n this.#hoverPoint = null;\n this.requestRender();\n return;\n }\n }\n\n if (this.easingType === EasingType.CUBIC_BEZIER && role === 'point') {\n this.svgElement?.setPointerCapture(event.pointerId);\n this.#isDragging = true;\n this.#dragMode = 'point';\n this.#dragIndex = index;\n this.#hoverPoint = null;\n this.requestRender();\n return;\n }\n }\n\n if (indexAttribute === null) {\n if (this.easingType === EasingType.LINEAR) {\n const insertResult = this.#insertLinearPoint(this.#getMousePosition(event), event);\n\n if (insertResult) {\n linearPoints = this.#getLinearPoints();\n this.#dragStartPoints = this.#createLinearStartPointMap(linearPoints);\n this.#dragPointId = insertResult.pointId;\n this.svgElement?.setPointerCapture(event.pointerId);\n this.#isDragging = true;\n this.#dragMode = 'point';\n this.#dragIndex = insertResult.index;\n this.#pendingDrag = null;\n this.#hoverPoint = null;\n this.#notifyLinearFocus(insertResult.index, event);\n this.requestRender();\n return;\n } else {\n this.#notifyLinearFocus(null, event);\n }\n }\n\n if (this.easingType === EasingType.CUBIC_BEZIER) {\n this.#hoverPoint = this.#getMousePosition(event);\n this.svgElement?.setPointerCapture(event.pointerId);\n this.#isDragging = true;\n this.#dragMode = 'point';\n this.#dragIndex = 0;\n this.#pendingDrag = null;\n this.handlePointerMove(event);\n this.requestRender();\n return;\n }\n }\n };\n\n readonly handlePointerMove = (event: PointerEvent): void => {\n if (!this.svgElement) {\n return;\n }\n\n const skipSnapForPending = !this.#isDragging && this.#pendingDrag !== null && this.#pendingDrag.mode === 'point';\n let position = this.#getMousePosition(event, { skipSnap: skipSnapForPending });\n\n if (this.#pendingDrag && !this.#isDragging) {\n const deltaX = event.clientX - this.#pendingDrag.startX;\n const deltaY = event.clientY - this.#pendingDrag.startY;\n const distanceSquared = deltaX * deltaX + deltaY * deltaY;\n\n if (distanceSquared >= DRAG_ACTIVATION_DISTANCE_PX_SQUARED) {\n this.#isDragging = true;\n this.#pendingDrag = null;\n\n if (skipSnapForPending) {\n position = this.#getMousePosition(event);\n }\n } else {\n return;\n }\n }\n\n if (this.#isDragging && this.#dragIndex !== null) {\n event.preventDefault();\n this.#hoverInsertPreview = null;\n\n if (this.easingType === EasingType.LINEAR) {\n const points = this.#getLinearPoints();\n if (!points || this.#dragIndex >= points.length) {\n return;\n }\n\n if (this.#dragMode === 'point') {\n this.#handleLinearPointDrag(points, this.#dragIndex, position, event);\n return;\n }\n\n if (this.#dragMode === 'handleIn' || this.#dragMode === 'handleOut') {\n this.#handleLinearHandleDrag(points, this.#dragIndex, position, event);\n return;\n }\n }\n\n if (this.easingType === EasingType.CUBIC_BEZIER) {\n const points = this.#getCubicBezierPoints();\n if (!points) {\n return;\n }\n\n const updatedPoints: CubicBezierPoints = { ...points };\n let adjustedPosition = position;\n\n if (event.shiftKey) {\n const reference = this.#dragIndex === 0 ? points.p1 : points.p2;\n\n if (reference) {\n const deltaX = Math.abs(position.x - reference.x);\n const deltaY = Math.abs(position.y - reference.y);\n\n adjustedPosition = deltaX > deltaY ? { x: position.x, y: reference.y } : { x: reference.x, y: position.y };\n }\n }\n\n const clampedPosition = clampPoint(adjustedPosition, {\n minY: BEZIER_CONTROL_MIN_Y,\n maxY: BEZIER_CONTROL_MAX_Y\n });\n\n if (this.#dragIndex === 0) {\n updatedPoints.p1 = clampedPosition;\n } else if (this.#dragIndex === 1) {\n updatedPoints.p2 = clampedPosition;\n } else {\n return;\n }\n\n this.points = updatedPoints;\n this.#emitPoints(updatedPoints, event);\n this.requestRender();\n return;\n }\n\n return;\n }\n\n if (this.easingType === EasingType.LINEAR) {\n const points = this.#getLinearPoints();\n // Use rawPosition for the hit test to avoid flickering when snapToGrid is on\n if (points && this.#isNearExistingPointOrHandle(position, points)) {\n this.#hoverInsertPreview = null;\n this.#hoverPoint = null;\n this.requestRender();\n return;\n }\n\n const preview = this.#buildLinearInsertPreview(position);\n this.#hoverInsertPreview = preview;\n if (!preview) {\n this.#hoverPoint = null;\n this.requestRender();\n return;\n }\n } else {\n this.#hoverInsertPreview = null;\n }\n\n this.#hoverPoint = position;\n this.requestRender();\n };\n\n #handleLinearPointDrag(points: LinearPoints, index: number, position: Point, event: PointerEvent): void {\n let workingPosition = position;\n const currentPoint = points[index];\n const activePointId = currentPoint ? (this.#dragPointId ?? ensureLinearPointId(currentPoint)) : null;\n\n if (event.shiftKey && this.#dragStartPoints && activePointId) {\n const startPoint = this.#dragStartPoints.get(activePointId);\n if (startPoint) {\n const deltaX = Math.abs(position.x - startPoint.x);\n const deltaY = Math.abs(position.y - startPoint.y);\n workingPosition = deltaX > deltaY ? { x: position.x, y: startPoint.y } : { x: startPoint.x, y: position.y };\n }\n }\n\n const constrainedPoint = this.#constrainLinearPoint(index, workingPosition, points);\n const updatedPoints: LinearPoints = points.map((point, i) => {\n if (i === index) {\n return constrainedPoint;\n }\n return { ...point };\n });\n\n const normalizedPoints = normalizeLinearPoints(updatedPoints);\n this.points = normalizedPoints;\n this.#emitPoints(normalizedPoints, event);\n\n if (activePointId) {\n const newIndex = normalizedPoints.findIndex((point) => point?.id === activePointId);\n if (newIndex !== -1) {\n this.#dragIndex = newIndex;\n this.#dragPointId = activePointId;\n this.#notifyLinearFocus(newIndex, event);\n } else {\n this.#notifyLinearFocus(index, event);\n }\n } else {\n this.#notifyLinearFocus(index, event);\n }\n\n this.requestRender();\n }\n\n #handleLinearHandleDrag(points: LinearPoints, index: number, position: Point, event: PointerEvent): void {\n const point = points[index];\n if (!point) {\n return;\n }\n\n const activePointId = this.#dragPointId ?? ensureLinearPointId(point);\n const direction = this.#dragMode === 'handleIn' ? 'In' : 'Out';\n\n let dx = position.x - point.x;\n const dy = position.y - point.y;\n\n if (direction === 'In') {\n dx = Math.min(0, dx);\n } else {\n dx = Math.max(0, dx);\n }\n\n let isLinked = point.isLinked ?? false;\n if (event.shiftKey) {\n isLinked = false;\n }\n\n const updatedPoints = [...points];\n const updatedPoint = { ...point };\n updatedPoints[index] = updatedPoint;\n\n updatedPoint.isLinked = isLinked;\n\n if (direction === 'In') {\n updatedPoint.cpInX = dx;\n updatedPoint.cpInY = dy;\n } else {\n updatedPoint.cpOutX = dx;\n updatedPoint.cpOutY = dy;\n }\n\n const mirrorAngle = isLinked;\n const mirrorLength = mirrorAngle && updatedPoint.mirrorLength !== false;\n\n if (mirrorAngle || mirrorLength) {\n const draggedLength = vectorLength(dx, dy);\n\n if (draggedLength <= MIN_LINEAR_DELTA) {\n if (direction === 'In') {\n delete updatedPoint.cpInX;\n delete updatedPoint.cpInY;\n if (mirrorAngle) {\n delete updatedPoint.cpOutX;\n delete updatedPoint.cpOutY;\n }\n } else {\n delete updatedPoint.cpOutX;\n delete updatedPoint.cpOutY;\n if (mirrorAngle) {\n delete updatedPoint.cpInX;\n delete updatedPoint.cpInY;\n }\n }\n } else {\n const normalized = normalizeVector(dx, dy);\n\n if (mirrorAngle) {\n if (direction === 'In') {\n const existingLength = mirrorLength\n ? draggedLength\n : vectorLength(updatedPoint.cpOutX ?? 0, updatedPoint.cpOutY ?? 0) || draggedLength;\n updatedPoint.cpOutX = -normalized.dx * existingLength;\n updatedPoint.cpOutY = -normalized.dy * existingLength;\n } else {\n const existingLength = mirrorLength\n ? draggedLength\n : vectorLength(updatedPoint.cpInX ?? 0, updatedPoint.cpInY ?? 0) || draggedLength;\n updatedPoint.cpInX = -normalized.dx * existingLength;\n updatedPoint.cpInY = -normalized.dy * existingLength;\n }\n } else if (mirrorLength) {\n if (direction === 'In') {\n const inDirection = normalizeVector(updatedPoint.cpInX ?? 0, updatedPoint.cpInY ?? 0);\n const outDirection = normalizeVector(updatedPoint.cpOutX ?? 0, updatedPoint.cpOutY ?? 0);\n const outLength = vectorLength(updatedPoint.cpOutX ?? 0, updatedPoint.cpOutY ?? 0);\n if (outLength > 0) {\n updatedPoint.cpOutX = outDirection.dx * draggedLength;\n updatedPoint.cpOutY = outDirection.dy * draggedLength;\n }\n updatedPoint.cpInX = inDirection.dx * draggedLength;\n updatedPoint.cpInY = inDirection.dy * draggedLength;\n } else {\n const inDirection = normalizeVector(updatedPoint.cpInX ?? 0, updatedPoint.cpInY ?? 0);\n const outDirection = normalizeVector(updatedPoint.cpOutX ?? 0, updatedPoint.cpOutY ?? 0);\n const inLength = vectorLength(updatedPoint.cpInX ?? 0, updatedPoint.cpInY ?? 0);\n if (inLength > 0) {\n updatedPoint.cpInX = inDirection.dx * draggedLength;\n updatedPoint.cpInY = inDirection.dy * draggedLength;\n }\n updatedPoint.cpOutX = outDirection.dx * draggedLength;\n updatedPoint.cpOutY = outDirection.dy * draggedLength;\n }\n }\n\n if (mirrorLength) {\n this.#alignLinkedHandleLengths(updatedPoint);\n }\n }\n }\n\n const normalizedPoints = normalizeLinearPoints(updatedPoints);\n this.points = normalizedPoints;\n this.#emitPoints(normalizedPoints, event);\n\n if (activePointId) {\n const newIndex = normalizedPoints.findIndex((candidate) => candidate?.id === activePointId);\n if (newIndex !== -1) {\n this.#dragIndex = newIndex;\n this.#dragPointId = activePointId;\n this.#notifyLinearFocus(newIndex, event);\n } else {\n this.#notifyLinearFocus(index, event);\n }\n } else {\n this.#notifyLinearFocus(index, event);\n }\n\n this.requestRender();\n }\n\n readonly handlePointerUp = (event: PointerEvent): void => {\n const previousIndex = this.#dragIndex;\n\n if (this.svgElement?.hasPointerCapture(event.pointerId)) {\n this.svgElement.releasePointerCapture(event.pointerId);\n }\n\n this.#isDragging = false;\n this.#dragIndex = null;\n this.#dragMode = null;\n this.#dragStartPoints = null;\n this.#dragPointId = null;\n this.#pendingDrag = null;\n this.#hoverInsertPreview = null;\n\n if (previousIndex !== null && this.easingType === EasingType.LINEAR) {\n this.#notifyLinearFocus(previousIndex, event);\n }\n this.requestRender();\n };\n\n readonly handlePointerLeave = (event: PointerEvent): void => {\n if (this.#isDragging) {\n this.handlePointerUp(event);\n }\n\n this.#pendingDrag = null;\n this.#hoverPoint = null;\n this.#dragPointId = null;\n this.#hoverInsertPreview = null;\n this.requestRender();\n };\n\n #insertLinearPoint(position: Point, event: PointerEvent): { index: number; pointId: string | null } | null {\n const preview = this.#hoverInsertPreview ?? this.#buildLinearInsertPreview(position);\n if (!preview) {\n return null;\n }\n\n const { normalizedPoints, insertedIndex, insertedPoint } = preview;\n const insertedPointId = insertedPoint ? ensureLinearPointId(insertedPoint) : null;\n\n this.points = normalizedPoints;\n this.#emitPoints(normalizedPoints, event);\n this.requestRender();\n this.#hoverInsertPreview = null;\n\n return {\n index: insertedIndex,\n pointId: insertedPointId\n };\n }\n\n #buildLinearInsertPreview(position: Point): LinearInsertPreview | null {\n if (this.easingType !== EasingType.LINEAR) {\n return null;\n }\n\n const points = this.#getLinearPoints();\n if (!points || points.length >= MAX_LINEAR_POINTS) {\n return null;\n }\n\n // Allow Y values outside [0, 1] for bounce/elastic effects\n const clamped = clampPoint(position, { minY: -2, maxY: 3 });\n if (!this.#isPointNearLinearPath(clamped, points)) {\n return null;\n }\n\n const insertIndex = points.findIndex((point) => clamped.x < point.x);\n if (insertIndex <= 0) {\n return null;\n }\n\n const prev = points[insertIndex - 1];\n const next = points[insertIndex];\n\n if (!prev || !next) {\n return null;\n }\n\n if (clamped.x - prev.x < MIN_LINEAR_DELTA || next.x - clamped.x < MIN_LINEAR_DELTA) {\n return null;\n }\n\n let updatedPoints: LinearPoints;\n let insertedPointId: string | null = null;\n\n const splitResult = splitCurveSegment(prev, next, clamped);\n\n if (splitResult) {\n const { prev: newPrev, newPoint, next: newNext } = splitResult;\n insertedPointId = ensureLinearPointId(newPoint);\n updatedPoints = [\n ...points.slice(0, insertIndex - 1),\n newPrev,\n newPoint,\n newNext,\n ...points.slice(insertIndex + 1)\n ];\n } else {\n const newPoint: LinearPoint = {\n x: clamped.x,\n y: clamped.y,\n cpInX: -0.1,\n cpInY: 0,\n cpOutX: 0.1,\n cpOutY: 0,\n isLinked: true,\n mirrorLength: true\n };\n insertedPointId = ensureLinearPointId(newPoint);\n updatedPoints = [...points.slice(0, insertIndex), newPoint, ...points.slice(insertIndex)];\n }\n\n const normalizedPoints = normalizeLinearPoints(updatedPoints);\n const normalizedIndex =\n insertedPointId !== null ? normalizedPoints.findIndex((point) => point?.id === insertedPointId) : -1;\n\n const insertedIndex = normalizedIndex !== -1 ? normalizedIndex : insertIndex;\n const insertedPoint = normalizedPoints[insertedIndex];\n\n if (!insertedPoint) {\n return null;\n }\n\n return {\n path: linearDisplayPath(normalizedPoints),\n normalizedPoints,\n insertedIndex,\n insertedPoint\n };\n }\n}\n\nconst lerp = (a: number, b: number, t: number): number => a + (b - a) * t;\n\nconst lerpPoint = (p1: Point, p2: Point, t: number): Point => {\n return {\n x: lerp(p1.x, p2.x, t),\n y: lerp(p1.y, p2.y, t)\n };\n};\n\n// Helper to find t for a given x on a cubic bezier curve\nconst findTForX = (x: number, p0: Point, cp1: Point, cp2: Point, p3: Point): number => {\n let minT = 0;\n let maxT = 1;\n let t = 0.5;\n const tolerance = 0.0001;\n const maxIterations = 20;\n\n // Use binary search since x is monotonic\n for (let i = 0; i < maxIterations; i++) {\n const px = (1 - t) ** 3 * p0.x + 3 * (1 - t) ** 2 * t * cp1.x + 3 * (1 - t) * t ** 2 * cp2.x + t ** 3 * p3.x;\n\n if (Math.abs(px - x) < tolerance) {\n return t;\n }\n\n if (px < x) {\n minT = t;\n } else {\n maxT = t;\n }\n t = (minT + maxT) / 2;\n }\n\n return t;\n};\n\nconst splitCurveSegment = (\n prev: LinearPoint,\n next: LinearPoint,\n position: Point\n): { prev: LinearPoint; newPoint: LinearPoint; next: LinearPoint } | null => {\n const cp1 = {\n x: prev.x + (prev.cpOutX ?? 0),\n y: prev.y + (prev.cpOutY ?? 0)\n };\n const cp2 = {\n x: next.x + (next.cpInX ?? 0),\n y: next.y + (next.cpInY ?? 0)\n };\n\n const wasCurved = prev.cpOutX || prev.cpOutY || next.cpInX || next.cpInY;\n\n if (!wasCurved) {\n return null;\n }\n\n // Find the correct t parameter that corresponds to the mouse X position\n const t = findTForX(position.x, prev, cp1, cp2, next);\n\n const P01 = lerpPoint(prev, cp1, t);\n const P12 = lerpPoint(cp1, cp2, t);\n const P23 = lerpPoint(cp2, next, t);\n\n const P012 = lerpPoint(P01, P12, t);\n const P123 = lerpPoint(P12, P23, t);\n\n const P_new = lerpPoint(P012, P123, t);\n\n const newPoint: LinearPoint = {\n x: P_new.x,\n y: P_new.y,\n cpInX: P012.x - P_new.x,\n cpInY: P012.y - P_new.y,\n cpOutX: P123.x - P_new.x,\n cpOutY: P123.y - P_new.y,\n isLinked: true,\n mirrorLength: prev.mirrorLength === false && next.mirrorLength\n };\n ensureLinearPointId(newPoint);\n\n const newPrev: LinearPoint = {\n ...prev,\n cpOutX: P01.x - prev.x,\n cpOutY: P01.y - prev.y\n };\n\n const newNext: LinearPoint = {\n ...next,\n cpInX: P23.x - next.x,\n cpInY: P23.y - next.y\n };\n\n return {\n prev: newPrev,\n newPoint,\n next: newNext\n };\n};\n\nconst evaluateCubicPointNormalized = (t: number, p0: Point, cp1: Point, cp2: Point, p3: Point): Point => {\n const P01 = lerpPoint(p0, cp1, t);\n const P12 = lerpPoint(cp1, cp2, t);\n const P23 = lerpPoint(cp2, p3, t);\n\n const P012 = lerpPoint(P01, P12, t);\n const P123 = lerpPoint(P12, P23, t);\n\n return lerpPoint(P012, P123, t);\n};\n","export const HANDLE_RADIUS = 5;\nexport const POINT_RADIUS = 6;\nexport const HIT_AREA_RADIUS = 12;\n\nexport const LINEAR_HIT_THRESHOLD = 0.1;\nexport const LINEAR_PATH_SAMPLES = 40;\nexport const DRAG_ACTIVATION_DISTANCE_PX = 4;\nexport const DRAG_ACTIVATION_DISTANCE_PX_SQUARED = DRAG_ACTIVATION_DISTANCE_PX * DRAG_ACTIVATION_DISTANCE_PX;\n\nexport const DEFAULT_HANDLE_LENGTH = 0.15;\nexport const SVG_WIDTH = 400;\nexport const SVG_HEIGHT = 300;\n\nexport const GRID_SNAP_THRESHOLD = 0.05;\n\nexport const BEZIER_CONTROL_MIN_Y = -0.5;\nexport const BEZIER_CONTROL_MAX_Y = 1.5;\n\ntype EasingPresetOption = {\n value: string;\n label: string;\n};\n\ntype EasingPreset = {\n label: string;\n options: EasingPresetOption[];\n};\n\nexport const EASING_PRESETS: EasingPreset[] = [\n {\n label: 'Standard',\n options: [\n {\n value: 'cubic-bezier(0.25, 0.1, 0.25, 1)',\n label: 'ease'\n },\n {\n value: 'cubic-bezier(0.42, 0, 1, 1)',\n label: 'ease-in'\n },\n {\n value: 'cubic-bezier(0, 0, 0.58, 1)',\n label: 'ease-out'\n },\n {\n value: 'cubic-bezier(0.42, 0, 0.58, 1)',\n label: 'ease-in-out'\n }\n ]\n },\n {\n label: 'Cubic',\n options: [\n {\n value: 'cubic-bezier(0.55, 0.055, 0.675, 0.19)',\n label: 'easeInCubic'\n },\n {\n value: 'cubic-bezier(0.215, 0.61, 0.355, 1)',\n label: 'easeOutCubic'\n },\n {\n value: 'cubic-bezier(0.645, 0.045, 0.355, 1)',\n label: 'easeInOutCubic'\n }\n ]\n },\n {\n label: 'Back (overshoot)',\n options: [\n {\n value: 'cubic-bezier(0.6, -0.28, 0.735, 0.045)',\n label: 'easeInBack'\n },\n {\n value: 'cubic-bezier(0.175, 0.885, 0.32, 1.275)',\n label: 'easeOutBack'\n },\n {\n value: 'cubic-bezier(0.68, -0.4, 0.32, 1.4)',\n label: 'easeInOutBack'\n }\n ]\n },\n {\n label: 'Spring',\n options: [\n {\n value: 'linear(0, 0.6 18%, 1.1 36%, 0.94 48%, 1.02 60%, 0.98 72%, 1.01 84%, 1)',\n label: 'springGentle'\n },\n {\n value: 'linear(0, 0.8 12%, 1.2 28%, 0.88 44%, 1.08 58%, 0.96 72%, 1.02 86%, 1)',\n label: 'springBouncy'\n },\n {\n value: 'linear(0, 1.4 20%, 0.85 40%, 1.1 60%, 0.95 80%, 1)',\n label: 'springSnappy'\n },\n {\n value:\n 'linear(0, 0.03 1.1%, 0.125 2.4%, 0.906 9.8%, 1.046 12.3%, 1.11 15%, 1.116 16.3%, 1.11 17.8%, 1.014 25.8%, 0.987 31.2%, 1.001 47.2%, 1)',\n label: 'springSnap'\n },\n {\n value:\n 'linear(0, 0.012 0.9%, 0.05 2%, 0.411 9.2%, 0.517 11.8%, 0.611 14.6%, 0.694 17.7%, 0.765 21.1%, 0.824 24.8%, 0.872 28.9%, 0.91 33.4%, 0.939 38.4%, 0.977 50.9%, 0.994 68.4%, 1)',\n label: 'springGlide'\n },\n {\n value:\n 'linear(0, 0.008 1.1%, 0.034 2.3%, 0.134 4.9%, 0.264 7.3%, 0.683 14.3%, 0.797 16.5%, 0.89 18.6%, 0.967 20.7%, 1.027 22.8%, 1.073 25%, 1.104 27.3%, 1.123 30.6%, 1.119 34.3%, 1.018 49.5%, 0.988 58.6%, 0.985 65.2%, 1 84.5%, 1)',\n label: 'springLazy'\n }\n ]\n },\n {\n label: 'Bounce',\n options: [\n {\n value: 'linear(0, 0.22 15%, 0.5 30%, 0.78 45%, 1 60%, 0.88 70%, 1 80%, 0.95 88%, 1)',\n label: 'bounceOut'\n },\n {\n value: 'linear(0, 0.05 12%, 0 24%, 0.12 36%, 0.5 50%, 0.88 64%, 1 76%, 0.95 88%, 1)',\n label: 'bounceInOut'\n },\n {\n value:\n 'linear(0, 0.008 1.1%, 0.034 2.3%, 0.134 4.9%, 0.264 7.3%, 0.683 14.3%, 0.797 16.5%, 0.89 18.6%, 0.967 20.7%, 1.027 22.8%, 1.073 25%, 1.104 27.3%, 1.123 30.6%, 1.119 34.3%, 1.018 49.5%, 0.988 58.6%, 0.985 65.2%, 1 84.5%, 1)',\n label: 'bounceGentle'\n },\n {\n value:\n 'linear(0, 0.453 7.8%, 0.803 16.1%, 1.048 24.9%, 1.132 29.5%, 1.194 34.4%, 1.227 38.4%, 1.245 42.5%, 1.25 46.9%, 1.242 51.7%, 1.2 60.5%, 1.038 84.9%, 1.009 92.5%, 1)',\n label: 'bounceSmooth'\n }\n ]\n },\n {\n label: 'Elastic',\n options: [\n {\n value: 'linear(0, 1.3 24%, 0.85 42%, 1.1 58%, 0.95 74%, 1.02 88%, 1)',\n label: 'elasticOut'\n },\n {\n value: 'linear(0, -0.1 18%, 0.15 36%, 0.5 50%, 0.85 64%, 1.1 82%, 1)',\n label: 'elasticInOut'\n },\n {\n value:\n 'linear(0, 0.43 3.9%, 0.72 7.4%, 0.95 14.2%, 0.77 20.8%, -0.1 35.9%, -0.3 46.3%, -0.05 63.6%, 0.03 77.2%, 0)',\n label: 'elasticBounce'\n },\n {\n value:\n 'linear(0, 0.59 6.1%, 0.77 11.4%, 0.6 16.9%, -0.24 29%, -0.41 35.7%, 0.03 51.2%, 0.14 59.9%, -0.02 82.8%, 0)',\n label: 'elasticBounceHard'\n }\n ]\n },\n {\n label: 'Overshoot',\n options: [\n {\n value: 'linear(0, 1 44.7%, 0.898 51.8%, 0.874 55.1%, 0.866 58.4%, 0.888 64.3%, 1 77.4%, 0.98 84.5%, 1)',\n label: 'overshootSettle'\n },\n {\n value:\n 'linear(0, 0.402 7.4%, 0.711 15.3%, 0.929 23.7%, 1.008 28.2%, 1.067 33%, 1.099 36.9%, 1.12 41%, 1.13 45.4%, 1.13 50.1%, 1.111 58.5%, 1.019 83.2%, 1.004 91.3%, 1)',\n label: 'overshootSmooth'\n },\n {\n value:\n 'linear(0, 0.544 5.5%, 0.947 11.5%, 1.14 18.1%, 1.23 25.5%, 1.25 31.1%, 1.23 37.6%, 1.08 61.8%, 1.03 73.7%, 1)',\n label: 'overshootStrong'\n },\n {\n value:\n 'linear(0, -0.004 8.7%, -0.019 16.8%, -0.111 41.5%, -0.13 49.9%, -0.13 54.6%, -0.12 59%, -0.099 63.1%, -0.067 67%, -0.008 71.8%, 0.071 76.3%, 0.289 84.7%, 0.598 92.6%, 1)',\n label: 'overshootSoftIn'\n },\n {\n value:\n 'linear(0, 0.402 7.4%, 0.711 15.3%, 0.929 23.7%, 1.008 28.2%, 1.067 33%, 1.099 36.9%, 1.12 41%, 1.13 45.4%, 1.13 50.1%, 1.111 58.5%, 1.019 83.2%, 1.004 91.3%, 1)',\n label: 'overshootSoftOut'\n },\n {\n value:\n 'linear(0, -0.004 4.9%, -0.02 9.4%, -0.124 26.4%, -0.126 30.5%, -0.104 34.1%, -0.027 38.8%, 0.108 43.1%, 0.299 47%, 0.817 55.2%, 0.97 59.1%, 1.071 63.4%, 1.118 67.7%, 1.127 72.6%, 1.108 77.2%, 1.019 90.7%, 1.004 95.2%, 1)',\n label: 'overshootSoftInOut'\n }\n ]\n },\n {\n label: 'Anticipate',\n options: [\n {\n value:\n 'linear(0, -0.009 7.5%, -0.038 15.1%, -0.2 39.5%, -0.242 48.3%, -0.25 53.1%, -0.245 57.5%, -0.227 61.6%, -0.194 65.6%, -0.132 70.5%, -0.048 75.1%, 0.197 83.9%, 0.547 92.2%, 1)',\n label: 'anticipate'\n },\n {\n value:\n 'linear(0, -0.008 4.1%, -0.035 8.3%, -0.179 21.1%, -0.216 25.3%, -0.228 29.5%, -0.208 33.3%, -0.121 38.2%, 0.036 42.7%, 0.261 46.8%, 0.881 55.6%, 1.058 59.7%, 1.172 64.1%, 1.222 68.6%, 1.228 71.1%, 1.221 73.7%, 1.183 78.5%, 1.034 91.8%, 1.008 95.9%, 1)',\n label: 'anticipateOvershoot'\n }\n ]\n },\n {\n label: 'Expo',\n options: [\n {\n value: 'cubic-bezier(0.95, 0.05, 0.795, 0.035)',\n label: 'easeInExpo'\n },\n {\n value: 'cubic-bezier(0.19, 1, 0.22, 1)',\n label: 'easeOutExpo'\n },\n {\n value: 'cubic-bezier(1, 0, 0, 1)',\n label: 'easeInOutExpo'\n }\n ]\n }\n];\n","import type { LinearPoint, Point } from './types';\n\nimport { type SVGTemplateResult, svg } from 'lit-html';\n\nimport { HANDLE_RADIUS, HIT_AREA_RADIUS, POINT_RADIUS, SVG_HEIGHT, SVG_WIDTH } from './constants';\n\nexport const generateGridLines = (gridStep: number): SVGTemplateResult[] => {\n const lines: SVGTemplateResult[] = [];\n\n const xSteps = Math.ceil(SVG_WIDTH / gridStep);\n const ySteps = Math.ceil(SVG_HEIGHT / gridStep);\n\n for (let i = 0; i <= xSteps; i++) {\n const x = i * gridStep;\n if (x > SVG_WIDTH) {\n break;\n }\n\n lines.push(svg`\n <line\n class=\"grid-line\"\n x1=${x}\n y1=\"0\"\n x2=${x}\n y2=${SVG_HEIGHT}\n />\n `);\n }\n\n for (let i = 0; i <= ySteps; i++) {\n const y = i * gridStep;\n if (y > SVG_HEIGHT) {\n break;\n }\n\n lines.push(svg`\n <line\n class=\"grid-line\"\n x1=\"0\"\n y1=${y}\n x2=${SVG_WIDTH}\n y2=${y}\n />\n `);\n }\n\n return lines;\n};\n\nexport const renderBezierControlPoint = (\n point: Point,\n anchor: Point,\n isSelected: boolean,\n onPointerDown: (event: PointerEvent) => void\n): SVGTemplateResult => {\n const x = point.x * SVG_WIDTH;\n const y = (1 - point.y) * SVG_HEIGHT;\n const anchorX = anchor.x * SVG_WIDTH;\n const anchorY = (1 - anchor.y) * SVG_HEIGHT;\n\n return svg`\n <g>\n <line\n class=\"control-line\"\n x1=${anchorX}\n y1=${anchorY}\n x2=${x}\n y2=${y}\n />\n <circle\n class=\"control-point ${isSelected ? 'selected' : ''}\"\n cx=${x}\n cy=${y}\n r=${POINT_RADIUS}\n @pointerdown=${onPointerDown}\n />\n <circle\n class=\"hit-area-point\"\n cx=${x}\n cy=${y}\n r=${HIT_AREA_RADIUS}\n @pointerdown=${onPointerDown}\n />\n </g>\n `;\n};\n\nexport const renderLinearPoint = (\n point: LinearPoint,\n index: number,\n isSelected: boolean,\n isFocused: boolean,\n onPointerDown: (event: PointerEvent) => void,\n onHandlePointerDown?: (event: PointerEvent, handleType: 'in' | 'out') => void\n): SVGTemplateResult => {\n const x = point.x * SVG_WIDTH;\n const y = (1 - point.y) * SVG_HEIGHT;\n\n const handles: SVGTemplateResult[] = [];\n\n if (point.cpInX !== undefined && point.cpInY !== undefined) {\n const handleX = x + point.cpInX * SVG_WIDTH;\n const handleY = y - point.cpInY * SVG_HEIGHT;\n\n handles.push(svg`\n <g>\n <line\n class=\"linear-handle-line\"\n x1=${x}\n y1=${y}\n x2=${handleX}\n y2=${handleY}\n />\n <circle\n class=\"linear-handle ${isSelected ? 'selected' : ''}\"\n cx=${handleX}\n cy=${handleY}\n r=${HANDLE_RADIUS}\n @pointerdown=${(e: PointerEvent) => onHandlePointerDown?.(e, 'in')}\n />\n <circle\n class=\"hit-area-handle\"\n cx=${handleX}\n cy=${handleY}\n r=${HIT_AREA_RADIUS}\n @pointerdown=${(e: PointerEvent) => onHandlePointerDown?.(e, 'in')}\n />\n </g>\n `);\n }\n\n if (point.cpOutX !== undefined && point.cpOutY !== undefined) {\n const handleX = x + point.cpOutX * SVG_WIDTH;\n const handleY = y - point.cpOutY * SVG_HEIGHT;\n\n handles.push(svg`\n <g>\n <line\n class=\"linear-handle-line\"\n x1=${x}\n y1=${y}\n x2=${handleX}\n y2=${handleY}\n />\n <circle\n class=\"linear-handle ${isSelected ? 'selected' : ''}\"\n cx=${handleX}\n cy=${handleY}\n r=${HANDLE_RADIUS}\n @pointerdown=${(e: PointerEvent) => onHandlePointerDown?.(e, 'out')}\n />\n <circle\n class=\"hit-area-handle\"\n cx=${handleX}\n cy=${handleY}\n r=${HIT_AREA_RADIUS}\n @pointerdown=${(e: PointerEvent) => onHandlePointerDown?.(e, 'out')}\n />\n </g>\n `);\n }\n\n return svg`\n <g>\n ${handles}\n <circle\n class=\"linear-point ${isSelected ? 'selected' : ''} ${isFocused ? 'focused' : ''}\"\n cx=${x}\n cy=${y}\n r=${POINT_RADIUS}\n tabindex=${isFocused ? '0' : '-1'}\n role=\"slider\"\n aria-label=\"Linear point ${index + 1}\"\n aria-valuenow=${point.x}\n aria-valuemin=\"0\"\n aria-valuemax=\"1\"\n @pointerdown=${onPointerDown}\n />\n <circle\n class=\"hit-area-point\"\n cx=${x}\n cy=${y}\n r=${HIT_AREA_RADIUS}\n @pointerdown=${onPointerDown}\n />\n </g>\n `;\n};\n\nexport const toSvgCoords = (point: Point): Point => {\n return {\n x: point.x * SVG_WIDTH,\n y: (1 - point.y) * SVG_HEIGHT\n };\n};\n\nexport const fromSvgCoords = (x: number, y: number): Point => {\n return {\n x: x / SVG_WIDTH,\n y: 1 - y / SVG_HEIGHT\n };\n};\n\nexport const getSvgBounds = (svg: SVGSVGElement): DOMRect => svg.getBoundingClientRect();\n\nexport const clientToSvgCoords = (clientX: number, clientY: number, svgBounds: DOMRect): Point => {\n const x = ((clientX - svgBounds.left) / svgBounds.width) * SVG_WIDTH;\n const y = ((clientY - svgBounds.top) / svgBounds.height) * SVG_HEIGHT;\n\n return { x, y };\n};\n","/**\n * Standard control event detail interface for Leva/lil-gui style state aggregation.\n * All control components should dispatch events with this shape.\n */\nexport interface ControlEventDetail<TValue = unknown> {\n /** The control's name/identifier for state aggregation */\n name?: string;\n /** The current value of the control */\n value: TValue;\n /** The original DOM event that triggered this change */\n event: Event;\n}\n\n/** The standard event type for control value changes */\nexport const CONTROL_CHANGE_EVENT = 'control-change';\n\n/**\n * Dispatch a control change event with standard shape.\n * Events bubble and are composed (cross shadow DOM boundaries).\n *\n * @param host - The element dispatching the event\n * @param type - Event type (prefer CONTROL_CHANGE_EVENT for standard controls)\n * @param detail - Event detail with value and optional name\n *\n * @example\n * ```ts\n * dispatchControlEvent(this, CONTROL_CHANGE_EVENT, {\n * name: this.name,\n * value: this.value,\n * event: e\n * });\n * ```\n */\nexport const dispatchControlEvent = <THost extends HTMLElement, TValue>(\n host: THost,\n type: string,\n detail: ControlEventDetail<TValue>\n): void => {\n host.dispatchEvent(\n new CustomEvent<ControlEventDetail<TValue>>(type, {\n detail,\n bubbles: true,\n composed: true\n })\n );\n};\n\nexport const setBooleanAttribute = (element: Element | null | undefined, name: string, value: boolean): void => {\n if (!element) {\n return;\n }\n\n if (value) {\n element.setAttribute(name, '');\n } else {\n element.removeAttribute(name);\n }\n};\n\nexport const coerceNumber = (value: string): number | null => {\n if (value === '') {\n return null;\n }\n\n const parsed = Number(value);\n return Number.isNaN(parsed) ? null : parsed;\n};\n\ntype ControlElement = Element & {\n value?: unknown;\n checked?: unknown;\n};\n\nexport const readControlValue = (element: ControlElement): string | null => {\n if (typeof element.value === 'string' || typeof element.value === 'number') {\n return String(element.value);\n }\n\n if (typeof element.checked === 'boolean') {\n return element.checked ? 'true' : 'false';\n }\n\n if ('getAttribute' in element) {\n const attr = (element as Element).getAttribute('value');\n if (attr !== null) {\n return attr;\n }\n }\n\n return element.textContent?.trim() ?? null;\n};\n","import { html } from 'lit-html';\n\nimport { DEFAULT_HANDLE_LENGTH } from './constants';\nimport { canvasControlsStyles } from './styles';\nimport { type CubicBezierPoints, EasingType, type LinearPoint, type LinearPoints } from './types';\nimport { normalizeLinearPoints, normalizeVector, vectorLength } from './utils';\n\nimport { Component } from '~/decorators/Component';\nimport { Prop } from '~/decorators/Prop';\nimport { type ControlEventDetail, dispatchControlEvent } from '~/elements/shared';\n\ntype CurveHost = HTMLElement & {\n easingType: EasingType;\n points: CubicBezierPoints | LinearPoints;\n focusedLinearIndex: number | null;\n handlePointsChange?: (event: CustomEvent<ControlEventDetail<CubicBezierPoints | LinearPoints>>) => void;\n handleLinearPointFocus?: (event: CustomEvent<ControlEventDetail<number | null>>) => void;\n};\n\nconst HOST_HANDLER_MAP = {\n 'points-change': 'handlePointsChange',\n 'linear-point-focus': 'handleLinearPointFocus'\n} as const;\n\ntype HostEventType = keyof typeof HOST_HANDLER_MAP;\n\n@Component({\n tag: 'ease-curve-canvas-controls',\n styles: canvasControlsStyles,\n template(this: CanvasControls) {\n if (this.easingType !== EasingType.LINEAR || !Array.isArray(this.points)) {\n return null;\n }\n\n const focusedIndex = this.focusedLinearIndex;\n if (focusedIndex === null) {\n return null;\n }\n\n const points = this.points as LinearPoints;\n const selectedPoint = points[focusedIndex];\n if (!selectedPoint) {\n return null;\n }\n\n const isInnerPoint = focusedIndex > 0 && focusedIndex < points.length - 1;\n if (!isInnerPoint) {\n return null;\n }\n\n const hasInHandle = selectedPoint.cpInX !== undefined || selectedPoint.cpInY !== undefined;\n const hasOutHandle = selectedPoint.cpOutX !== undefined || selectedPoint.cpOutY !== undefined;\n const hasAnyHandle = hasInHandle || hasOutHandle;\n\n return html`\n <div class=\"overlay-controls\">\n <button\n type=\"button\"\n class=\"overlay-button ${selectedPoint.isLinked ? 'active' : 'inactive'}\"\n @click=${this.handleToggleMirrorAngle}\n >\n <ease-icon-bezier-angle></ease-icon-bezier-angle>\n </button>\n <button\n type=\"button\"\n class=\"overlay-button ${selectedPoint.mirrorLength !== false && selectedPoint.isLinked ? 'active' : 'inactive'}\"\n @click=${this.handleToggleMirrorLength}\n ?disabled=${!selectedPoint.isLinked}\n >\n <ease-icon-bezier-length></ease-icon-bezier-length>\n </button>\n ${\n hasAnyHandle\n ? html`\n <button\n type=\"button\"\n class=\"overlay-button\"\n @click=${this.handleRemoveSmoothing}\n >\n <ease-icon-bezier></ease-icon-bezier>\n </button>\n `\n : html`\n <button\n type=\"button\"\n class=\"overlay-button\"\n @click=${this.handleAddSmoothing}\n >\n <ease-icon-bezier-mirror></ease-icon-bezier-mirror>\n </button>\n `\n }\n </div>\n `;\n }\n})\nexport class CanvasControls extends HTMLElement {\n declare requestRender: () => void;\n\n @Prop<EasingType>({ reflect: true })\n accessor easingType!: EasingType;\n\n @Prop<CubicBezierPoints | LinearPoints>({ type: Object, reflect: false })\n accessor points!: CubicBezierPoints | LinearPoints;\n\n @Prop<number | null>({ type: Number, reflect: false, defaultValue: null })\n accessor focusedLinearIndex: number | null = null;\n\n #getEventTarget = (): CurveHost => {\n const root = this.getRootNode();\n if (root instanceof ShadowRoot && root.host instanceof HTMLElement) {\n return root.host as CurveHost;\n }\n return this as unknown as CurveHost;\n };\n\n #getLinearPoints = (): LinearPoints | null => {\n if (!Array.isArray(this.points)) {\n return null;\n }\n return this.points;\n };\n\n #notifyHost = <TValue>(type: HostEventType, value: TValue, event: Event): void => {\n const target = this.#getEventTarget();\n const detail: ControlEventDetail<TValue> = { value, event };\n dispatchControlEvent(target, type, detail);\n };\n\n #emitPoints = (points: LinearPoints, event: Event): void => {\n this.points = points;\n this.#notifyHost('points-change', points, event);\n };\n\n readonly handleToggleMirrorAngle = (event: Event): void => {\n event.preventDefault();\n const points = this.#getLinearPoints();\n if (!points) {\n return;\n }\n\n const index = this.focusedLinearIndex;\n if (index === null) {\n return;\n }\n\n const point = points[index];\n if (!point) {\n return;\n }\n\n const updatedPoints = [...points];\n const updatedPoint = { ...point };\n updatedPoints[index] = updatedPoint;\n\n const nextState = !updatedPoint.isLinked;\n if (nextState) {\n this.#ensureSmoothHandles(updatedPoint, index, points);\n updatedPoint.mirrorLength = true;\n this.#alignMirrorLength(updatedPoint);\n } else {\n updatedPoint.mirrorLength = false;\n }\n updatedPoint.isLinked = nextState;\n\n const normalizedPoints = normalizeLinearPoints(updatedPoints);\n this.#emitPoints(normalizedPoints, event);\n this.focusedLinearIndex = index;\n this.#notifyHost('linear-point-focus', index, event);\n };\n\n readonly handleToggleMirrorLength = (event: Event): void => {\n event.preventDefault();\n const points = this.#getLinearPoints();\n if (!points) {\n return;\n }\n\n const index = this.focusedLinearIndex;\n if (index === null) {\n return;\n }\n\n const point = points[index];\n if (!point || !point.isLinked) {\n return;\n }\n\n const updatedPoints = [...points];\n const updatedPoint = { ...point };\n updatedPoints[index] = updatedPoint;\n\n const nextState = updatedPoint.mirrorLength === false;\n updatedPoint.mirrorLength = nextState;\n if (nextState) {\n this.#ensureSmoothHandles(updatedPoint, index, points);\n this.#alignMirrorLength(updatedPoint);\n }\n\n const normalizedPoints = normalizeLinearPoints(updatedPoints);\n this.#emitPoints(normalizedPoints, event);\n this.focusedLinearIndex = index;\n this.#notifyHost('linear-point-focus', index, event);\n };\n\n readonly handleRemoveSmoothing = (event: Event): void => {\n event.preventDefault();\n const points = this.#getLinearPoints();\n if (!points) {\n return;\n }\n\n const index = this.focusedLinearIndex;\n if (index === null) {\n return;\n }\n\n const existingPoint = points[index];\n if (!existingPoint) {\n return;\n }\n\n const updatedPoints = [...points];\n const updatedPoint: LinearPoint = { ...existingPoint };\n updatedPoints[index] = updatedPoint;\n\n delete updatedPoint.cpInX;\n delete updatedPoint.cpInY;\n delete updatedPoint.cpOutX;\n delete updatedPoint.cpOutY;\n delete updatedPoint.isLinked;\n delete updatedPoint.mirrorLength;\n\n const normalizedPoints = normalizeLinearPoints(updatedPoints);\n this.#emitPoints(normalizedPoints, event);\n this.focusedLinearIndex = index;\n this.#notifyHost('linear-point-focus', index, event);\n };\n\n readonly handleAddSmoothing = (event: Event): void => {\n event.preventDefault();\n const points = this.#getLinearPoints();\n if (!points) {\n return;\n }\n\n const index = this.focusedLinearIndex;\n if (index === null) {\n return;\n }\n\n const point = points[index];\n if (!point) {\n return;\n }\n\n const updatedPoints = [...points];\n const updatedPoint = { ...point };\n updatedPoints[index] = updatedPoint;\n\n this.#ensureSmoothHandles(updatedPoint, index, points);\n updatedPoint.isLinked = true;\n updatedPoint.mirrorLength = true;\n this.#alignMirrorLength(updatedPoint);\n\n const normalizedPoints = normalizeLinearPoints(updatedPoints);\n this.#emitPoints(normalizedPoints, event);\n this.focusedLinearIndex = index;\n this.#notifyHost('linear-point-focus', index, event);\n };\n\n #ensureSmoothHandles(point: LinearPoint, index: number, points: LinearPoints): void {\n const prev = points[index - 1];\n const next = points[index + 1];\n\n let refDx = point.cpOutX ?? -(point.cpInX ?? 0);\n let refDy = point.cpOutY ?? -(point.cpInY ?? 0);\n\n if (refDx === 0 && refDy === 0) {\n let dirX = 0;\n let dirY = 0;\n\n if (prev && next) {\n dirX = next.x - prev.x;\n dirY = next.y - prev.y;\n } else if (next) {\n dirX = next.x - point.x;\n dirY = next.y - point.y;\n } else if (prev) {\n dirX = point.x - prev.x;\n dirY = point.y - prev.y;\n } else {\n dirX = 1;\n dirY = 0;\n }\n\n const direction = normalizeVector(dirX, dirY);\n const length = DEFAULT_HANDLE_LENGTH;\n\n point.cpInX = -direction.dx * length;\n point.cpInY = -direction.dy * length;\n point.cpOutX = direction.dx * length;\n point.cpOutY = direction.dy * length;\n refDx = point.cpOutX;\n refDy = point.cpOutY;\n }\n\n if (refDx === 0 && refDy === 0) {\n return;\n }\n\n const normalized = normalizeVector(refDx, refDy);\n const referenceLength = vectorLength(refDx, refDy);\n\n const inLength = vectorLength(point.cpInX ?? 0, point.cpInY ?? 0) || referenceLength;\n point.cpInX = -normalized.dx * inLength;\n point.cpInY = -normalized.dy * inLength;\n\n const outLength = vectorLength(point.cpOutX ?? 0, point.cpOutY ?? 0) || referenceLength;\n point.cpOutX = normalized.dx * outLength;\n point.cpOutY = normalized.dy * outLength;\n }\n\n #alignMirrorLength(point: LinearPoint): void {\n if (!point.isLinked) {\n point.mirrorLength = false;\n return;\n }\n\n const outLength = vectorLength(point.cpOutX ?? 0, point.cpOutY ?? 0);\n const inLength = vectorLength(point.cpInX ?? 0, point.cpInY ?? 0);\n const targetLength = Math.max(outLength, inLength);\n\n if (targetLength <= 0) {\n return;\n }\n\n if (outLength > 0) {\n const outDirection = normalizeVector(point.cpOutX ?? 0, point.cpOutY ?? 0);\n point.cpOutX = outDirection.dx * targetLength;\n point.cpOutY = outDirection.dy * targetLength;\n } else if (inLength > 0) {\n const inDirection = normalizeVector(point.cpInX ?? 0, point.cpInY ?? 0);\n point.cpOutX = -inDirection.dx * targetLength;\n point.cpOutY = -inDirection.dy * targetLength;\n }\n\n if (inLength > 0) {\n const inDirection = normalizeVector(point.cpInX ?? 0, point.cpInY ?? 0);\n point.cpInX = inDirection.dx * targetLength;\n point.cpInY = inDirection.dy * targetLength;\n } else if (outLength > 0) {\n const outDirection = normalizeVector(point.cpOutX ?? 0, point.cpOutY ?? 0);\n point.cpInX = -outDirection.dx * targetLength;\n point.cpInY = -outDirection.dy * targetLength;\n }\n }\n}\n","import { html, type TemplateResult } from 'lit-html';\n\nimport { DEFAULT_HANDLE_LENGTH, EASING_PRESETS } from './constants';\nimport { controlsStyles } from './styles';\nimport {\n type CubicBezierPoints,\n EasingType,\n type LinearPoint,\n type LinearPoints,\n MAX_LINEAR_POINTS,\n MIN_LINEAR_POINTS\n} from './types';\nimport {\n clampPoint,\n MIN_LINEAR_DELTA,\n normalizeLinearPoints,\n normalizeVector,\n parseCubicBezierValue,\n parseLinearTimingFunction,\n smoothLinearPoints,\n vectorLength\n} from './utils';\n\nimport { Component } from '~/decorators/Component';\nimport { Prop } from '~/decorators/Prop';\nimport { type ControlEventDetail, dispatchControlEvent } from '~/elements/shared';\n\nimport '~/elements/icons/interface/minus';\nimport '~/elements/icons/interface/plus';\nimport '~/elements/button';\n\ntype CurveHost = HTMLElement & {\n easingType: EasingType;\n points: CubicBezierPoints | LinearPoints;\n showGrid: boolean;\n snapToGrid: boolean;\n gridSize: number;\n focusedLinearIndex: number | null;\n handleEasingTypeChange?: (event: CustomEvent<ControlEventDetail<EasingType>>) => void;\n handleGridToggle?: (event: CustomEvent<ControlEventDetail<boolean>>) => void;\n handleGridSizeChange?: (event: KeyboardEvent) => void;\n handleSnapToggle?: (event: CustomEvent<ControlEventDetail<boolean>>) => void;\n handlePointsChange?: (event: CustomEvent<ControlEventDetail<CubicBezierPoints | LinearPoints>>) => void;\n handleLinearPointFocus?: (event: CustomEvent<ControlEventDetail<number | null>>) => void;\n};\n\nconst HOST_HANDLER_MAP = {\n 'easing-type-change': 'handleEasingTypeChange',\n 'grid-toggle': 'handleGridToggle',\n 'snap-toggle': 'handleSnapToggle',\n 'grid-size-change': 'handleGridSizeChange',\n 'points-change': 'handlePointsChange',\n 'linear-point-focus': 'handleLinearPointFocus'\n} as const;\n\ntype HostEventType = keyof typeof HOST_HANDLER_MAP;\n\n@Component({\n tag: 'ease-curve-controls',\n styles: controlsStyles,\n template(this: CurveControls) {\n return html`\n <ease-field label=\"Easing\">\n <ease-dropdown\n part=\"easing-type-dropdown\"\n placeholder=\"Select\"\n id=\"demo-easing-type\"\n name=\"demo-easing-type\"\n searchable\n .value=${this._activePresetValue}\n @change=${this.handlePresetSelection}\n >\n ${EASING_PRESETS.map(\n ({ label, options }, index) => html`\n ${index > 0 ? html`<hr slot=\"content\" />` : null}\n\n <h4 slot=\"content\">${label}</h4>\n ${options.map(\n ({ value, label }) => html`\n <button slot=\"content\" type=\"button\" value=${value}>${label}</button>`\n )}\n `\n )}\n </ease-dropdown>\n </ease-field>\n\n <ease-field label=\"Type\">\n <ease-radio-group .value=${this.easingType} @change=${this.handleTypeChange} part=\"radio-group\">\n <button slot=\"content\" value=${EasingType.CUBIC_BEZIER}>Cubic</button>\n <button slot=\"content\" value=${EasingType.LINEAR}>Linear</button>\n </ease-radio-group>\n </ease-field>\n `;\n }\n})\nexport class CurveControls extends HTMLElement {\n declare requestRender: () => void;\n\n @Prop<EasingType>({ reflect: true })\n accessor easingType!: EasingType;\n\n @Prop<CubicBezierPoints | LinearPoints, CurveControls>({\n type: Object,\n reflect: false,\n onChange(this: CurveControls) {\n this.handlePointsPropChange();\n }\n })\n accessor points!: CubicBezierPoints | LinearPoints;\n\n @Prop<boolean>({ type: Boolean, reflect: true, defaultValue: true })\n accessor showGrid!: boolean;\n\n @Prop<boolean>({ type: Boolean, reflect: true, defaultValue: false })\n accessor snapToGrid!: boolean;\n\n @Prop<number>({ type: Number, reflect: true, defaultValue: 8 })\n accessor gridSize: number = 8;\n\n @Prop<number | null, CurveControls>({\n type: Number,\n reflect: false,\n defaultValue: null,\n onChange(this: CurveControls, value: number | null) {\n this.handleFocusedLinearIndexPropChange(value);\n }\n })\n accessor focusedLinearIndex: number | null = null;\n\n private _activePresetValue: string | null = null;\n private isApplyingPreset = false;\n\n #setActivePreset(value: string | null): void {\n if (this._activePresetValue === value) {\n return;\n }\n this._activePresetValue = value;\n this.requestRender();\n }\n\n #clearActivePreset(): void {\n if (this._activePresetValue === null) {\n return;\n }\n this._activePresetValue = null;\n this.requestRender();\n }\n\n handleFocusedLinearIndexPropChange(_value: number | null): void {\n this.requestRender();\n }\n\n handlePointsPropChange(): void {\n if (this.isApplyingPreset) {\n return;\n }\n this.#clearActivePreset();\n }\n\n get maxPointsReached(): boolean {\n const points = this.#getLinearPoints();\n return points !== null && points.length >= MAX_LINEAR_POINTS;\n }\n\n get minPointsReached(): boolean {\n const points = this.#getLinearPoints();\n return points !== null && points.length <= MIN_LINEAR_POINTS;\n }\n\n #getEventTarget = (): CurveHost => {\n const root = this.getRootNode();\n if (root instanceof ShadowRoot && root.host instanceof HTMLElement) {\n return root.host as CurveHost;\n }\n return this as CurveHost;\n };\n\n #getLinearPoints = (): LinearPoints | null => {\n if (!Array.isArray(this.points)) {\n return null;\n }\n\n return this.points;\n };\n\n renderLinearDetailsControls(): TemplateResult | null {\n const points = this.#getLinearPoints();\n\n if (!points) {\n return null;\n }\n\n if (points.length < MIN_LINEAR_POINTS) {\n return html`\n <div class=\"control-group details-group\">\n <span class=\"details-empty\">Curve requires at least 2 points.</span>\n </div>\n `;\n }\n\n const focusedIndex = this.focusedLinearIndex;\n\n if (focusedIndex === null) {\n return html`\n <div class=\"control-group details-group\">\n <div class=\"details-panel\">\n <span class=\"details-empty\">Select a point on the canvas to edit its details.</span>\n </div>\n </div>\n `;\n }\n\n const selectedPoint = points[focusedIndex];\n if (!selectedPoint) {\n return null;\n }\n\n const previousIndex = focusedIndex > 0 ? focusedIndex - 1 : null;\n const nextIndex = focusedIndex < points.length - 1 ? focusedIndex + 1 : null;\n\n const isInnerPoint = focusedIndex > 0 && focusedIndex < points.length - 1;\n\n const pointMeta = `${(selectedPoint.x * 100).toFixed(0)}%, ${(selectedPoint.y * 100).toFixed(0)}%`;\n const pointType = selectedPoint.isLinked ? 'Smooth' : 'Corner';\n const hasInHandle = selectedPoint.cpInX !== undefined || selectedPoint.cpInY !== undefined;\n const hasOutHandle = selectedPoint.cpOutX !== undefined || selectedPoint.cpOutY !== undefined;\n const hasAnyHandle = hasInHandle || hasOutHandle;\n\n return html`\n <div class=\"control-group details-group\">\n <div class=\"details-panel\" role=\"group\" aria-label=\"Linear point details\">\n <div class=\"point-navigation\">\n <button\n type=\"button\"\n class=\"control-button\"\n @click=${(event: Event) => this.#focusIndex(event, previousIndex)}\n ?disabled=${previousIndex === null}\n >\n Previous\n </button>\n <div class=\"point-state\" aria-live=\"polite\">\n <span>P${focusedIndex + 1}</span>\n <span>${pointMeta}</span>\n <span>(${pointType})</span>\n </div>\n <button\n type=\"button\"\n class=\"control-button\"\n @click=${(event: Event) => this.#focusIndex(event, nextIndex)}\n ?disabled=${nextIndex === null}\n >\n Next\n </button>\n </div>\n\n <div class=\"coordinate-editor\" role=\"group\" aria-label=\"Point coordinates\">\n <label class=\"coordinate-field\">\n <span>X</span>\n <input\n type=\"number\"\n min=\"0\"\n max=\"1\"\n step=\"0.01\"\n .value=${selectedPoint.x.toFixed(2)}\n data-axis=\"x\"\n ?disabled=${!isInnerPoint}\n @change=${this.#handleCoordinateInput}\n />\n </label>\n <label class=\"coordinate-field\">\n <span>Y</span>\n <input\n type=\"number\"\n min=\"0\"\n max=\"1\"\n step=\"0.01\"\n .value=${selectedPoint.y.toFixed(2)}\n data-axis=\"y\"\n @change=${this.#handleCoordinateInput}\n />\n </label>\n <button\n type=\"button\"\n class=\"coordinate-remove\"\n ?disabled=${!isInnerPoint || points.length <= MIN_LINEAR_POINTS}\n @click=${this.#handleRemoveSelectedPoint}\n >\n Remove\n </button>\n </div>\n\n ${\n isInnerPoint\n ? html`\n <div class=\"point-type-controls\" role=\"group\" aria-label=\"Point type controls\">\n <button\n type=\"button\"\n class=\"control-button ${!selectedPoint.isLinked ? 'active' : ''}\"\n data-type=\"corner\"\n @click=${this.#handlePointTypeChange}\n >\n Corner (Independent)\n </button>\n <button\n type=\"button\"\n class=\"control-button ${selectedPoint.isLinked ? 'active' : ''}\"\n data-type=\"smooth\"\n @click=${this.#handlePointTypeChange}\n >\n Smooth (Linked)\n </button>\n <button\n type=\"button\"\n class=\"control-button ${selectedPoint.isLinked ? 'active' : ''}\"\n data-type=\"mirror-angle\"\n @click=${this.#handlePointTypeChange}\n >\n Mirror Angle: ${selectedPoint.isLinked ? 'On' : 'Off'}\n </button>\n <button\n type=\"button\"\n class=\"control-button ${selectedPoint.mirrorLength !== false ? 'active' : ''}\"\n data-type=\"mirror-length\"\n @click=${this.#handlePointTypeChange}\n ?disabled=${!selectedPoint.isLinked}\n >\n Mirror Length: ${selectedPoint.mirrorLength === false ? 'Off' : 'On'}\n </button>\n </div>\n\n <div class=\"handle-actions\" role=\"group\" aria-label=\"Handle removal controls\">\n <button\n type=\"button\"\n class=\"control-button\"\n data-handle=\"both\"\n @click=${this.#handleRemoveHandles}\n ?disabled=${!hasAnyHandle}\n >\n Remove Both Handles\n </button>\n <button\n type=\"button\"\n class=\"control-button\"\n data-handle=\"in\"\n @click=${this.#handleRemoveHandles}\n ?disabled=${!hasInHandle}\n >\n Remove Incoming Handle\n </button>\n <button\n type=\"button\"\n class=\"control-button\"\n data-handle=\"out\"\n @click=${this.#handleRemoveHandles}\n ?disabled=${!hasOutHandle}\n >\n Remove Outgoing Handle\n </button>\n </div>\n `\n : this.#renderEndpointHandleControls(selectedPoint, focusedIndex)\n }\n </div>\n </div>\n `;\n }\n\n #handleCoordinateInput = (event: Event): void => {\n const target = event.target;\n if (!(target instanceof HTMLInputElement)) {\n return;\n }\n\n const axis = target.dataset.axis;\n if (axis !== 'x' && axis !== 'y') {\n return;\n }\n\n const points = this.#getLinearPoints();\n if (!points) {\n return;\n }\n\n const index = this.focusedLinearIndex;\n if (index === null) {\n return;\n }\n\n const selectedPoint = points[index];\n if (!selectedPoint) {\n return;\n }\n\n const parsed = Number.parseFloat(target.value);\n\n if (Number.isNaN(parsed)) {\n target.value = selectedPoint[axis].toFixed(2);\n return;\n }\n\n const updatedPoints: LinearPoints = points.map((point, pointIndex) => {\n if (pointIndex !== index) {\n return { ...point };\n }\n\n const updated: LinearPoint = { ...point };\n\n if (axis === 'x') {\n if (index === 0 || index === points.length - 1) {\n return updated;\n }\n\n const previous = points[index - 1];\n const next = points[index + 1];\n const minX = previous ? previous.x + MIN_LINEAR_DELTA : 0;\n const maxX = next ? next.x - MIN_LINEAR_DELTA : 1;\n updated.x = Math.min(Math.max(parsed, minX), maxX);\n } else {\n updated.y = Math.min(Math.max(parsed, 0), 1);\n }\n\n return updated;\n });\n\n const normalizedPoints = normalizeLinearPoints(updatedPoints);\n this.#emitPoints(normalizedPoints, event);\n this.focusedLinearIndex = index;\n this.#notifyHost('linear-point-focus', index, event);\n\n const refreshedPoint = normalizedPoints[index];\n\n if (refreshedPoint) {\n target.value = refreshedPoint[axis].toFixed(2);\n }\n };\n\n #handleRemoveSelectedPoint = (event: Event): void => {\n const index = this.focusedLinearIndex;\n\n if (index === null) {\n return;\n }\n\n this.#removeLinearPointAt(index, event);\n };\n\n #handlePointTypeChange = (event: Event): void => {\n event.preventDefault();\n const target = event.currentTarget;\n if (!(target instanceof HTMLButtonElement)) {\n return;\n }\n\n const type = target.dataset.type;\n const points = this.#getLinearPoints();\n if (!points) {\n return;\n }\n\n const index = this.focusedLinearIndex;\n if (index === null) {\n return;\n }\n\n const point = points[index];\n if (!point) {\n return;\n }\n\n const updatedPoints = [...points];\n const updatedPoint = { ...point };\n updatedPoints[index] = updatedPoint;\n\n switch (type) {\n case 'corner': {\n updatedPoint.isLinked = false;\n updatedPoint.mirrorLength = false;\n break;\n }\n case 'smooth': {\n this.#ensureSmoothHandles(updatedPoint, index, points);\n updatedPoint.isLinked = true;\n updatedPoint.mirrorLength = true;\n this.#alignMirrorLength(updatedPoint);\n break;\n }\n case 'mirror-angle': {\n const nextState = !updatedPoint.isLinked;\n if (nextState) {\n this.#ensureSmoothHandles(updatedPoint, index, points);\n updatedPoint.mirrorLength = true;\n this.#alignMirrorLength(updatedPoint);\n } else {\n updatedPoint.mirrorLength = false;\n }\n updatedPoint.isLinked = nextState;\n break;\n }\n case 'mirror-length': {\n if (!updatedPoint.isLinked) {\n break;\n }\n const nextState = updatedPoint.mirrorLength === false;\n updatedPoint.mirrorLength = nextState;\n if (nextState) {\n this.#ensureSmoothHandles(updatedPoint, index, points);\n this.#alignMirrorLength(updatedPoint);\n }\n break;\n }\n default:\n return;\n }\n\n const normalizedPoints = normalizeLinearPoints(updatedPoints);\n this.#emitPoints(normalizedPoints, event);\n this.focusedLinearIndex = index;\n this.#notifyHost('linear-point-focus', index, event);\n };\n\n #ensureSmoothHandles(point: LinearPoint, index: number, points: LinearPoints): void {\n const prev = points[index - 1];\n const next = points[index + 1];\n\n let refDx = point.cpOutX ?? -(point.cpInX ?? 0);\n let refDy = point.cpOutY ?? -(point.cpInY ?? 0);\n\n if (refDx === 0 && refDy === 0) {\n let dirX = 0;\n let dirY = 0;\n\n if (prev && next) {\n dirX = next.x - prev.x;\n dirY = next.y - prev.y;\n } else if (next) {\n dirX = next.x - point.x;\n dirY = next.y - point.y;\n } else if (prev) {\n dirX = point.x - prev.x;\n dirY = point.y - prev.y;\n } else {\n dirX = 1;\n dirY = 0;\n }\n\n const direction = normalizeVector(dirX, dirY);\n const length = DEFAULT_HANDLE_LENGTH;\n\n point.cpInX = -direction.dx * length;\n point.cpInY = -direction.dy * length;\n point.cpOutX = direction.dx * length;\n point.cpOutY = direction.dy * length;\n refDx = point.cpOutX;\n refDy = point.cpOutY;\n }\n\n if (refDx === 0 && refDy === 0) {\n return;\n }\n\n const normalized = normalizeVector(refDx, refDy);\n const referenceLength = vectorLength(refDx, refDy);\n\n const inLength = vectorLength(point.cpInX ?? 0, point.cpInY ?? 0) || referenceLength;\n point.cpInX = -normalized.dx * inLength;\n point.cpInY = -normalized.dy * inLength;\n\n const outLength = vectorLength(point.cpOutX ?? 0, point.cpOutY ?? 0) || referenceLength;\n point.cpOutX = normalized.dx * outLength;\n point.cpOutY = normalized.dy * outLength;\n }\n\n #alignMirrorLength(point: LinearPoint): void {\n if (!point.isLinked) {\n point.mirrorLength = false;\n return;\n }\n\n const outLength = vectorLength(point.cpOutX ?? 0, point.cpOutY ?? 0);\n const inLength = vectorLength(point.cpInX ?? 0, point.cpInY ?? 0);\n const targetLength = Math.max(outLength, inLength);\n\n if (targetLength <= 0) {\n return;\n }\n\n if (outLength > 0) {\n const outDirection = normalizeVector(point.cpOutX ?? 0, point.cpOutY ?? 0);\n point.cpOutX = outDirection.dx * targetLength;\n point.cpOutY = outDirection.dy * targetLength;\n } else if (inLength > 0) {\n const inDirection = normalizeVector(point.cpInX ?? 0, point.cpInY ?? 0);\n point.cpOutX = -inDirection.dx * targetLength;\n point.cpOutY = -inDirection.dy * targetLength;\n }\n\n if (inLength > 0) {\n const inDirection = normalizeVector(point.cpInX ?? 0, point.cpInY ?? 0);\n point.cpInX = inDirection.dx * targetLength;\n point.cpInY = inDirection.dy * targetLength;\n } else if (outLength > 0) {\n const outDirection = normalizeVector(point.cpOutX ?? 0, point.cpOutY ?? 0);\n point.cpInX = -outDirection.dx * targetLength;\n point.cpInY = -outDirection.dy * targetLength;\n }\n }\n\n #handleRemoveHandles = (event: Event): void => {\n event.preventDefault();\n const target = event.currentTarget;\n if (!(target instanceof HTMLButtonElement)) {\n return;\n }\n\n const mode = (target.dataset.handle as 'in' | 'out' | 'both' | undefined) ?? 'both';\n\n const points = this.#getLinearPoints();\n if (!points) {\n return;\n }\n\n const index = this.focusedLinearIndex;\n if (index === null) {\n return;\n }\n\n const updatedPoints = [...points];\n const existingPoint = updatedPoints[index];\n if (!existingPoint) {\n return;\n }\n\n const updatedPoint: LinearPoint = { ...existingPoint };\n updatedPoints[index] = updatedPoint;\n\n const removeIncoming = mode === 'both' || mode === 'in';\n const removeOutgoing = mode === 'both' || mode === 'out';\n\n if (removeIncoming) {\n delete updatedPoint.cpInX;\n delete updatedPoint.cpInY;\n }\n\n if (removeOutgoing) {\n delete updatedPoint.cpOutX;\n delete updatedPoint.cpOutY;\n }\n\n if (removeIncoming && removeOutgoing) {\n delete updatedPoint.isLinked;\n delete updatedPoint.mirrorLength;\n } else if (removeIncoming || removeOutgoing) {\n updatedPoint.isLinked = false;\n updatedPoint.mirrorLength = false;\n }\n\n const normalizedPoints = normalizeLinearPoints(updatedPoints);\n this.#emitPoints(normalizedPoints, event);\n this.focusedLinearIndex = index;\n this.#notifyHost('linear-point-focus', index, event);\n };\n\n #renderEndpointHandleControls(point: LinearPoint, index: number): TemplateResult {\n const isStart = index === 0;\n const handleKey: 'in' | 'out' = isStart ? 'out' : 'in';\n const handleLabel = isStart ? 'Outgoing' : 'Incoming';\n const hasHandle =\n handleKey === 'out'\n ? point.cpOutX !== undefined || point.cpOutY !== undefined\n : point.cpInX !== undefined || point.cpInY !== undefined;\n\n return html`\n <div class=\"handle-actions\" role=\"group\" aria-label=\"${handleLabel} handle controls\">\n <button\n type=\"button\"\n class=\"control-button\"\n data-handle=${handleKey}\n @click=${this.#handleEndpointHandleAdd}\n ?disabled=${hasHandle}\n >\n Add ${handleLabel} Handle\n </button>\n <button\n type=\"button\"\n class=\"control-button\"\n data-handle=${handleKey}\n @click=${this.#handleRemoveHandles}\n ?disabled=${!hasHandle}\n >\n Remove ${handleLabel} Handle\n </button>\n </div>\n `;\n }\n\n #handleEndpointHandleAdd = (event: Event): void => {\n event.preventDefault();\n const target = event.currentTarget;\n if (!(target instanceof HTMLButtonElement)) {\n return;\n }\n\n const handle = target.dataset.handle;\n if (handle !== 'in' && handle !== 'out') {\n return;\n }\n\n const points = this.#getLinearPoints();\n if (!points) {\n return;\n }\n\n const index = this.focusedLinearIndex;\n if (index === null) {\n return;\n }\n\n const neighborIndex = handle === 'out' ? index + 1 : index - 1;\n const neighbor = points[neighborIndex];\n if (!neighbor) {\n return;\n }\n\n const updatedPoints = [...points];\n const existingPoint = updatedPoints[index];\n if (!existingPoint) {\n return;\n }\n\n const updatedPoint: LinearPoint = { ...existingPoint };\n updatedPoints[index] = updatedPoint;\n\n this.#createEndpointHandle(updatedPoint, neighbor, handle);\n\n const normalizedPoints = normalizeLinearPoints(updatedPoints);\n this.#emitPoints(normalizedPoints, event);\n this.focusedLinearIndex = index;\n this.#notifyHost('linear-point-focus', index, event);\n };\n\n #createEndpointHandle(point: LinearPoint, neighbor: LinearPoint, handle: 'in' | 'out'): void {\n const dx = neighbor.x - point.x;\n const dy = neighbor.y - point.y;\n\n const direction = normalizeVector(dx, dy);\n const fallbackDirection = handle === 'out' ? { dx: 1, dy: 0 } : { dx: -1, dy: 0 };\n const finalDirection = direction.dx === 0 && direction.dy === 0 ? fallbackDirection : direction;\n\n const gap = Math.abs(dx);\n const baseLength = gap > 0 ? gap * 0.5 : MIN_LINEAR_DELTA * 0.5;\n const length = Math.min(DEFAULT_HANDLE_LENGTH, Math.max(MIN_LINEAR_DELTA * 0.5, baseLength));\n\n if (handle === 'out') {\n point.cpOutX = finalDirection.dx * length;\n point.cpOutY = finalDirection.dy * length;\n } else {\n point.cpInX = finalDirection.dx * length;\n point.cpInY = finalDirection.dy * length;\n }\n\n point.isLinked = false;\n point.mirrorLength = false;\n }\n\n #removeLinearPointAt(index: number, event: Event): void {\n const points = this.#getLinearPoints();\n\n if (!points || points.length <= MIN_LINEAR_POINTS) {\n return;\n }\n\n if (index <= 0 || index >= points.length - 1) {\n return;\n }\n\n const updatedPoints: LinearPoints = points\n .filter((_, pointIndex) => pointIndex !== index)\n .map((point) => {\n return { ...point };\n });\n\n const normalizedPoints = normalizeLinearPoints(updatedPoints);\n this.#emitPoints(normalizedPoints, event);\n\n const nextIndex = index - 1;\n\n this.focusedLinearIndex = nextIndex;\n this.#notifyHost('linear-point-focus', nextIndex, event);\n }\n\n readonly resetCurve = (event: Event): void => {\n event.preventDefault();\n this.#clearActivePreset();\n\n if (this.easingType === EasingType.CUBIC_BEZIER) {\n const defaults: CubicBezierPoints = {\n p1: { x: 0.25, y: 0.1 },\n p2: { x: 0.25, y: 1 }\n };\n this.points = defaults;\n this.#notifyHost('points-change', defaults, event);\n return;\n }\n\n const defaults: LinearPoints = [\n { x: 0, y: 0 },\n { x: 1, y: 1 }\n ];\n this.points = defaults;\n this.#notifyHost('points-change', defaults, event);\n this.focusedLinearIndex = null;\n this.#notifyHost('linear-point-focus', null, event);\n };\n\n readonly distributeLinearPoints = (event: Event): void => {\n event.preventDefault();\n\n const points = this.#getLinearPoints();\n\n if (!points || points.length <= MIN_LINEAR_POINTS) {\n return;\n }\n\n const lastIndex = points.length - 1;\n const step = lastIndex > 0 ? 1 / lastIndex : 0;\n\n const distributed: LinearPoints = points.map((point, index) => {\n const updated: LinearPoint = { ...point };\n\n if (index === 0) {\n updated.x = 0;\n } else if (index === lastIndex) {\n updated.x = 1;\n } else {\n updated.x = Number.parseFloat((step * index).toFixed(4));\n }\n\n delete updated.cpInX;\n delete updated.cpInY;\n delete updated.cpOutX;\n delete updated.cpOutY;\n delete updated.isLinked;\n\n return updated;\n });\n\n const normalizedPoints = normalizeLinearPoints(distributed);\n this.#emitPoints(normalizedPoints, event);\n\n if (this.focusedLinearIndex !== null) {\n this.#notifyHost('linear-point-focus', this.focusedLinearIndex, event);\n }\n };\n\n #focusIndex = (event: Event, index: number | null): void => {\n event.preventDefault();\n if (index !== null) {\n this.focusedLinearIndex = index;\n this.#notifyHost('linear-point-focus', index, event);\n }\n };\n\n #setEasingType = (type: EasingType, event: Event): void => {\n if (this.easingType === type) {\n return;\n }\n\n if (!this.isApplyingPreset) {\n this.#clearActivePreset();\n }\n\n this.easingType = type;\n this.#notifyHost('easing-type-change', type, event);\n };\n\n #emitPoints = (points: LinearPoints, event: Event): void => {\n if (!this.isApplyingPreset) {\n this.#clearActivePreset();\n }\n this.points = points;\n this.#notifyHost('points-change', points, event);\n };\n\n #applyPreset = (\n points: CubicBezierPoints | LinearPoints,\n type: EasingType,\n presetValue: string,\n event: Event\n ): void => {\n this.isApplyingPreset = true;\n if (this.easingType !== type) {\n this.#setEasingType(type, event);\n }\n\n this.points = points;\n this.focusedLinearIndex = null;\n this.#setActivePreset(presetValue);\n this.#notifyHost('points-change', points, event);\n\n if (type === EasingType.LINEAR) {\n this.#notifyHost('linear-point-focus', null, event);\n }\n\n this.isApplyingPreset = false;\n };\n\n readonly handleTypeChange = (event: CustomEvent<ControlEventDetail<string>>): void => {\n const detail = event.detail;\n\n if (!detail) {\n return;\n }\n\n const { value, event: originEvent } = detail;\n\n if (value === EasingType.CUBIC_BEZIER || value === EasingType.LINEAR) {\n this.#clearActivePreset();\n this.#setEasingType(value, originEvent ?? event);\n }\n };\n\n readonly handlePresetSelection = (event: CustomEvent<ControlEventDetail<string>>): void => {\n const detail = event.detail;\n\n if (!detail) {\n return;\n }\n\n const rawValue = detail.value;\n const originEvent = detail.event ?? event;\n\n if (typeof rawValue !== 'string') {\n return;\n }\n\n const cssValue = rawValue.trim();\n\n if (cssValue.length === 0) {\n this.#clearActivePreset();\n return;\n }\n\n if (cssValue.startsWith(EasingType.CUBIC_BEZIER)) {\n const parsed = parseCubicBezierValue(cssValue);\n if (!parsed) {\n this.#clearActivePreset();\n return;\n }\n this.#applyPreset(parsed, EasingType.CUBIC_BEZIER, cssValue, originEvent);\n return;\n }\n\n if (cssValue.startsWith(EasingType.LINEAR)) {\n const parsedLinear = parseLinearTimingFunction(cssValue);\n if (!parsedLinear) {\n this.#clearActivePreset();\n return;\n }\n // Apply smoothing to linear presets for better visual curves\n const smoothedLinear = smoothLinearPoints(parsedLinear, 0.3);\n this.#applyPreset(smoothedLinear, EasingType.LINEAR, cssValue, originEvent);\n return;\n }\n\n this.#clearActivePreset();\n };\n\n readonly handleSelectCubic = (event: Event): void => {\n event.preventDefault();\n this.#setEasingType(EasingType.CUBIC_BEZIER, event);\n };\n\n readonly handleSelectLinear = (event: Event): void => {\n event.preventDefault();\n this.#setEasingType(EasingType.LINEAR, event);\n };\n\n readonly addLinearPoint = (event: Event): void => {\n event.preventDefault();\n\n if (this.easingType !== EasingType.LINEAR) {\n return;\n }\n\n const points = this.#getLinearPoints();\n if (!points || this.maxPointsReached) {\n return;\n }\n\n let insertIndex = 0;\n let largestGap = -Infinity;\n\n for (let index = 0; index < points.length - 1; index += 1) {\n const start = points[index];\n const end = points[index + 1];\n\n if (!start || !end) {\n continue;\n }\n\n const gap = end.x - start.x;\n\n if (gap > largestGap) {\n largestGap = gap;\n insertIndex = index;\n }\n }\n\n const startPoint = points[insertIndex];\n const endPoint = points[insertIndex + 1];\n\n if (!startPoint || !endPoint) {\n return;\n }\n\n const newPointPosition = clampPoint({\n x: (startPoint.x + endPoint.x) / 2,\n y: (startPoint.y + endPoint.y) / 2\n });\n const newPoint: LinearPoint = {\n x: newPointPosition.x,\n y: newPointPosition.y,\n cpInX: -0.1,\n cpInY: 0,\n cpOutX: 0.1,\n cpOutY: 0,\n isLinked: true,\n mirrorLength: true\n };\n\n const updatedPoints: LinearPoints = [\n ...points.slice(0, insertIndex + 1),\n newPoint,\n ...points.slice(insertIndex + 1)\n ];\n\n const insertedIndex = insertIndex + 1;\n const normalizedPoints = normalizeLinearPoints(updatedPoints);\n this.#emitPoints(normalizedPoints, event);\n this.focusedLinearIndex = insertedIndex;\n this.#notifyHost('linear-point-focus', insertedIndex, event);\n };\n\n readonly removeLinearPoint = (event: Event): void => {\n event.preventDefault();\n\n if (this.easingType !== EasingType.LINEAR) {\n return;\n }\n\n const points = this.#getLinearPoints();\n if (!points || this.minPointsReached) {\n return;\n }\n\n let removeIndex = 1;\n let smallestSpan = Number.POSITIVE_INFINITY;\n\n for (let index = 1; index < points.length - 1; index += 1) {\n const previous = points[index - 1];\n const next = points[index + 1];\n\n if (!previous || !next) {\n continue;\n }\n\n const span = next.x - previous.x;\n\n if (span < smallestSpan) {\n smallestSpan = span;\n removeIndex = index;\n }\n }\n\n if (removeIndex > 0 && removeIndex < points.length - 1) {\n this.#removeLinearPointAt(removeIndex, event);\n }\n };\n\n readonly toggleGrid = (event: Event): void => {\n event.preventDefault();\n\n const nextValue = !this.showGrid;\n this.showGrid = nextValue;\n this.#notifyHost('grid-toggle', nextValue, event);\n };\n\n readonly toggleSnapToGrid = (event: Event): void => {\n event.preventDefault();\n\n const nextValue = !this.snapToGrid;\n this.snapToGrid = nextValue;\n this.#notifyHost('snap-toggle', nextValue, event);\n };\n\n readonly incrementGridSize = (event: Event): void => {\n event.preventDefault();\n\n this.#commitGridSize(this.gridSize + 1, event);\n };\n\n readonly decrementGridSize = (event: Event): void => {\n event.preventDefault();\n\n this.#commitGridSize(this.gridSize - 1, event);\n };\n\n readonly handleGridSliderInput = (event: Event): void => {\n event.preventDefault();\n const target = event.target;\n if (!(target instanceof HTMLInputElement)) {\n return;\n }\n this.#commitGridSize(Number(target.value), event);\n };\n\n readonly handleGridSizeChange = (event: Event): void => {\n event.preventDefault();\n const target = event.target;\n if (!(target instanceof HTMLInputElement)) {\n return;\n }\n const parsed = Number(target.value);\n if (Number.isNaN(parsed)) {\n target.value = String(this.gridSize);\n return;\n }\n this.#commitGridSize(parsed, event);\n target.value = String(this.gridSize);\n };\n\n #clampGridSize = (value: number): number => Math.max(1, Math.min(24, Math.round(value)));\n\n #commitGridSize = (value: number, event: Event): void => {\n const nextValue = this.#clampGridSize(value);\n if (this.gridSize === nextValue) {\n this.requestRender();\n return;\n }\n this.gridSize = nextValue;\n this.#notifyHost('grid-size-change', this.gridSize, event);\n this.requestRender();\n };\n\n #notifyHost = <TValue>(type: HostEventType, value: TValue, event: Event): void => {\n const target = this.#getEventTarget();\n const detail: ControlEventDetail<TValue> = { value, event };\n\n dispatchControlEvent(target, type, detail);\n };\n}\n","import { html } from 'lit-html';\n\nimport { outputStyles } from './styles';\nimport { type CSSCode, type CubicBezierPoints, EasingType, type LinearPoints } from './types';\nimport { generateCubicBezierCSS, generateLinearCSS } from './utils';\n\nimport { Component } from '~/decorators/Component';\nimport { Prop } from '~/decorators/Prop';\nimport '~/components/code';\n\n@Component({\n tag: 'ease-curve-output',\n styles: outputStyles,\n template(this: CurveOutput) {\n return html`\n <div class=\"output-container\">\n <div class=\"output-group\">\n <h4 class=\"output-label\">CSS Easing Function</h4>\n <ease-code language=\"css\">${this.generatedCSS.code}</ease-code>\n <button class=\"copy-button\" @click=${this.handleCopyClick}>\n ${this.copyStatus}\n </button>\n </div>\n </div>\n `;\n }\n})\nexport class CurveOutput extends HTMLElement {\n declare requestRender: () => void;\n\n @Prop<EasingType>({ type: String, reflect: true })\n accessor easingType!: EasingType;\n\n @Prop<CubicBezierPoints | LinearPoints>({ type: Object, reflect: false })\n accessor points!: CubicBezierPoints | LinearPoints;\n\n @Prop<string>({ reflect: true, defaultValue: 'ease-custom' })\n accessor name!: string;\n\n @Prop<'animation' | 'transition'>({ reflect: true, defaultValue: 'animation' })\n accessor variant!: 'animation' | 'transition';\n\n @Prop<number>({ type: Number, reflect: true, defaultValue: 0 })\n accessor simplify!: number;\n\n @Prop<number>({ type: Number, reflect: true, defaultValue: 5 })\n accessor round!: number;\n\n #copyTimeout: number | null = null;\n #animationTimeout: number | null = null;\n #isAnimating = false;\n\n get timingFunction(): string {\n const { timingFunction } = this.generatedCSS;\n return timingFunction;\n }\n\n get generatedCSS(): CSSCode {\n if (this.easingType === EasingType.CUBIC_BEZIER) {\n if (!this.points || Array.isArray(this.points)) {\n const timingFunction = 'cubic-bezier(0.25, 0.1, 0.25, 1)';\n const code = `\n .${this.name} {\n ${this.variant}-timing-function: ${timingFunction};\n }\n `;\n\n return { code, timingFunction };\n }\n\n return generateCubicBezierCSS(this.points as CubicBezierPoints, this.name, this.variant);\n }\n\n if (this.easingType === EasingType.LINEAR) {\n if (Array.isArray(this.points)) {\n return generateLinearCSS(this.points, this.name, this.variant, {\n simplify: this.simplify,\n round: this.round\n });\n }\n\n const timingFunction = 'linear(0, 1)';\n const code = `\n .${this.name} {\n ${this.variant}-timing-function: ${timingFunction};\n }\n `;\n\n return { code, timingFunction };\n }\n\n const timingFunction = 'ease';\n const code = `\n .${this.name} {\n ${this.variant}-timing-function: ${timingFunction};\n }\n `;\n\n return { code, timingFunction };\n }\n\n get copyStatus(): string {\n return this.#copyTimeout ? 'Copied!' : 'Copy CSS';\n }\n\n get isAnimating(): boolean {\n return this.#isAnimating;\n }\n\n #copyToClipboard = async (event: Event): Promise<void> => {\n event.preventDefault();\n\n try {\n await navigator.clipboard.writeText(this.timingFunction);\n\n if (this.#copyTimeout) {\n clearTimeout(this.#copyTimeout);\n }\n\n this.#copyTimeout = window.setTimeout(() => {\n this.#copyTimeout = null;\n this.requestRender();\n }, 2000);\n\n this.requestRender();\n } catch (error) {\n console.error('Failed to copy to clipboard:', error);\n }\n };\n\n #playPreview = (event: Event): void => {\n event.preventDefault();\n\n if (this.#isAnimating) {\n this.#isAnimating = false;\n this.requestRender();\n void this.offsetHeight;\n }\n\n if (this.#animationTimeout) {\n clearTimeout(this.#animationTimeout);\n }\n\n this.#isAnimating = true;\n this.requestRender();\n\n this.#animationTimeout = window.setTimeout(() => {\n this.#isAnimating = false;\n\n this.requestRender();\n }, 2000);\n };\n\n readonly handleCopyClick = (event: Event): void => {\n void this.#copyToClipboard(event);\n };\n\n handlePreviewClick(event: Event): void {\n this.#playPreview(event);\n }\n\n disconnectedCallback(): void {\n if (this.#copyTimeout) {\n clearTimeout(this.#copyTimeout);\n\n this.#copyTimeout = null;\n }\n\n if (this.#animationTimeout) {\n clearTimeout(this.#animationTimeout);\n\n this.#animationTimeout = null;\n }\n }\n}\n","import { html } from 'lit-html';\n\nimport { toolbarStyles } from './styles';\nimport {\n type CubicBezierPoints,\n EasingType,\n type LinearPoint,\n type LinearPoints,\n MAX_LINEAR_POINTS,\n MIN_LINEAR_POINTS\n} from './types';\nimport { clampPoint, normalizeLinearPoints } from './utils';\n\nimport { Component } from '~/decorators/Component';\nimport { Prop } from '~/decorators/Prop';\nimport { type ControlEventDetail, dispatchControlEvent } from '~/elements/shared';\n\nimport '~/elements/icons/interface/minus';\nimport '~/elements/icons/interface/plus';\nimport '~/elements/button';\nimport '~/elements/tooltip';\n\ntype CurveHost = HTMLElement & {\n easingType: EasingType;\n points: CubicBezierPoints | LinearPoints;\n showGrid: boolean;\n snapToGrid: boolean;\n gridSize: number;\n focusedLinearIndex: number | null;\n handleGridToggle?: (event: CustomEvent<ControlEventDetail<boolean>>) => void;\n handleSnapToggle?: (event: CustomEvent<ControlEventDetail<boolean>>) => void;\n handleGridSizeChange?: (event: KeyboardEvent) => void;\n handlePointsChange?: (event: CustomEvent<ControlEventDetail<CubicBezierPoints | LinearPoints>>) => void;\n handleLinearPointFocus?: (event: CustomEvent<ControlEventDetail<number | null>>) => void;\n handleSimplifyChange?: (event: CustomEvent<ControlEventDetail<number>>) => void;\n handleRoundChange?: (event: CustomEvent<ControlEventDetail<number>>) => void;\n};\n\nconst HOST_HANDLER_MAP = {\n 'grid-toggle': 'handleGridToggle',\n 'snap-toggle': 'handleSnapToggle',\n 'grid-size-change': 'handleGridSizeChange',\n 'points-change': 'handlePointsChange',\n 'linear-point-focus': 'handleLinearPointFocus',\n 'simplify-change': 'handleSimplifyChange',\n 'round-change': 'handleRoundChange'\n} as const;\n\ntype HostEventType = keyof typeof HOST_HANDLER_MAP;\n\n@Component({\n tag: 'ease-curve-toolbar',\n styles: toolbarStyles,\n template(this: CurveToolbar) {\n const isGridAtMinimum = this.gridSize <= 1;\n const isGridAtMaximum = this.gridSize >= 24;\n const isLinear = this.easingType === EasingType.LINEAR;\n const points = isLinear && Array.isArray(this.points) ? (this.points as LinearPoints) : null;\n\n return html`\n <div class=\"toolbar-container\">\n <div class=\"toolbar-group\">\n\n <ease-tooltip placement=\"top-center\">\n <button\n type=\"button\"\n class=\"toolbar-button ${this.showGrid ? 'active' : ''}\"\n @click=${this.toggleGrid}\n slot=\"trigger\"\n >\n <ease-icon-grid state=${this.showGrid ? 'hide' : 'show'}></ease-icon-grid>\n </button>\n Toggle Grid\n </ease-tooltip>\n\n <ease-tooltip placement=\"top-center\">\n <button\n type=\"button\"\n class=\"toolbar-button ${this.snapToGrid ? 'active' : ''}\"\n @click=${this.toggleSnapToGrid}\n slot=\"trigger\"\n >\n <ease-icon-snap state=${this.snapToGrid ? 'active' : 'default'}></ease-icon-snap>\n </button>\n Snap to Grid\n </ease-tooltip>\n\n <ease-tooltip placement=\"top-center\">\n <button\n type=\"button\"\n class=\"toolbar-button\"\n @click=${this.resetCurve}\n slot=\"trigger\"\n >\n <ease-icon-clear></ease-icon-clear>\n </button>\n Reset Curve\n </ease-tooltip>\n\n <ease-tooltip placement=\"top-center\">\n <button\n type=\"button\"\n class=\"toolbar-button\"\n @click=${this.addLinearPoint}\n ?disabled=${(points && points.length >= MAX_LINEAR_POINTS) || !isLinear}\n slot=\"trigger\"\n >\n <ease-icon-anchor-add></ease-icon-anchor-add>\n </button>\n Add Point\n </ease-tooltip>\n\n <ease-tooltip placement=\"top-center\">\n <button\n type=\"button\"\n class=\"toolbar-button\"\n @click=${this.removeLinearPoint}\n ?disabled=${(points && points.length <= MIN_LINEAR_POINTS) || !isLinear}\n slot=\"trigger\"\n >\n <ease-icon-anchor-remove></ease-icon-anchor-remove>\n </button>\n Remove Point\n </ease-tooltip>\n\n <ease-tooltip placement=\"top-center\">\n <button\n type=\"button\"\n class=\"toolbar-button\"\n @click=${this.distributeLinearPoints}\n ?disabled=${!isLinear}\n slot=\"trigger\"\n >\n <ease-icon-bezier-distribute></ease-icon-bezier-distribute>\n </button>\n Distribute Points\n </ease-tooltip>\n\n <div class=\"grid-size-controls\">\n <ease-button\n class=\"grid-size-button minus\"\n type=\"button\"\n block=\"icon\"\n pill=\"true\"\n variant=\"headless\"\n @click=${this.decrementGridSize}\n ?disabled=${isGridAtMinimum}\n >\n <ease-icon-minus></ease-icon-minus>\n </ease-button>\n <div class=\"grid-size-value\">\n ${this.gridSize}x\n </div>\n <ease-button\n class=\"grid-size-button plus\"\n type=\"button\"\n block=\"icon\"\n pill=\"true\"\n variant=\"headless\"\n @click=${this.incrementGridSize}\n ?disabled=${isGridAtMaximum}\n >\n <ease-icon-plus></ease-icon-plus>\n </ease-button>\n </div>\n </div>\n\n <ease-field label=\"Simplify\">\n <ease-slider .value=${this.simplify} .min=${0} .max=${0.05} .step=${0.001} @input=${this.handleSimplifyInput}></ease-slider>\n </ease-field>\n\n <ease-field label=\"Round\">\n <ease-slider .value=${this.round} .min=${0} .max=${5} .step=${1} @input=${this.handleRoundInput}></ease-slider>\n </ease-field>\n\n </div>\n `;\n }\n})\nexport class CurveToolbar extends HTMLElement {\n declare requestRender: () => void;\n\n @Prop<EasingType>({ reflect: true })\n accessor easingType!: EasingType;\n\n @Prop<CubicBezierPoints | LinearPoints>({ type: Object, reflect: false })\n accessor points!: CubicBezierPoints | LinearPoints;\n\n @Prop<boolean>({ type: Boolean, reflect: true, defaultValue: true })\n accessor showGrid!: boolean;\n\n @Prop<boolean>({ type: Boolean, reflect: true, defaultValue: false })\n accessor snapToGrid!: boolean;\n\n @Prop<number>({ type: Number, reflect: true, defaultValue: 8 })\n accessor gridSize: number = 8;\n\n @Prop<number>({ type: Number, reflect: true, defaultValue: 0 })\n accessor simplify: number = 0;\n\n @Prop<number>({ type: Number, reflect: true, defaultValue: 5 })\n accessor round: number = 5;\n\n #getEventTarget = (): CurveHost => {\n const root = this.getRootNode();\n if (root instanceof ShadowRoot && root.host instanceof HTMLElement) {\n return root.host as CurveHost;\n }\n return this as unknown as CurveHost;\n };\n\n #getLinearPoints = (): LinearPoints | null => {\n if (!Array.isArray(this.points)) {\n return null;\n }\n return this.points;\n };\n\n #notifyHost = <TValue>(type: HostEventType, value: TValue, event: Event): void => {\n const target = this.#getEventTarget();\n const detail: ControlEventDetail<TValue> = { value, event };\n dispatchControlEvent(target, type, detail);\n };\n\n #emitPoints = (points: LinearPoints, event: Event): void => {\n this.points = points;\n this.#notifyHost('points-change', points, event);\n };\n\n readonly toggleGrid = (event: Event): void => {\n event.preventDefault();\n const nextValue = !this.showGrid;\n this.showGrid = nextValue;\n this.#notifyHost('grid-toggle', nextValue, event);\n };\n\n readonly toggleSnapToGrid = (event: Event): void => {\n event.preventDefault();\n const nextValue = !this.snapToGrid;\n this.snapToGrid = nextValue;\n this.#notifyHost('snap-toggle', nextValue, event);\n };\n\n readonly resetCurve = (event: Event): void => {\n event.preventDefault();\n\n if (this.easingType === EasingType.CUBIC_BEZIER) {\n const defaults: CubicBezierPoints = {\n p1: { x: 0.25, y: 0.1 },\n p2: { x: 0.25, y: 1 }\n };\n this.points = defaults;\n this.#notifyHost('points-change', defaults, event);\n return;\n }\n\n const defaults: LinearPoints = [\n { x: 0, y: 0 },\n { x: 1, y: 1 }\n ];\n this.points = defaults;\n this.#notifyHost('points-change', defaults, event);\n this.#notifyHost('linear-point-focus', null, event);\n };\n\n readonly distributeLinearPoints = (event: Event): void => {\n event.preventDefault();\n\n const points = this.#getLinearPoints();\n if (!points || points.length <= MIN_LINEAR_POINTS) {\n return;\n }\n\n const lastIndex = points.length - 1;\n const step = lastIndex > 0 ? 1 / lastIndex : 0;\n\n const distributed: LinearPoints = points.map((point, index) => {\n const updated: LinearPoint = { ...point };\n\n if (index === 0) {\n updated.x = 0;\n } else if (index === lastIndex) {\n updated.x = 1;\n } else {\n updated.x = Number.parseFloat((step * index).toFixed(4));\n }\n\n delete updated.cpInX;\n delete updated.cpInY;\n delete updated.cpOutX;\n delete updated.cpOutY;\n delete updated.isLinked;\n\n return updated;\n });\n\n const normalizedPoints = normalizeLinearPoints(distributed);\n this.#emitPoints(normalizedPoints, event);\n };\n\n readonly addLinearPoint = (event: Event): void => {\n event.preventDefault();\n\n if (this.easingType !== EasingType.LINEAR) {\n return;\n }\n\n const points = this.#getLinearPoints();\n if (!points || points.length >= MAX_LINEAR_POINTS) {\n return;\n }\n\n let insertIndex = 0;\n let largestGap = -Infinity;\n\n for (let index = 0; index < points.length - 1; index += 1) {\n const start = points[index];\n const end = points[index + 1];\n\n if (!start || !end) {\n continue;\n }\n\n const gap = end.x - start.x;\n\n if (gap > largestGap) {\n largestGap = gap;\n insertIndex = index;\n }\n }\n\n const startPoint = points[insertIndex];\n const endPoint = points[insertIndex + 1];\n\n if (!startPoint || !endPoint) {\n return;\n }\n\n const newPointPosition = clampPoint(\n {\n x: (startPoint.x + endPoint.x) / 2,\n y: (startPoint.y + endPoint.y) / 2\n },\n { minY: -2, maxY: 3 }\n );\n const newPoint: LinearPoint = {\n x: newPointPosition.x,\n y: newPointPosition.y,\n cpInX: -0.1,\n cpInY: 0,\n cpOutX: 0.1,\n cpOutY: 0,\n isLinked: true,\n mirrorLength: true\n };\n\n const updatedPoints: LinearPoints = [\n ...points.slice(0, insertIndex + 1),\n newPoint,\n ...points.slice(insertIndex + 1)\n ];\n\n const insertedIndex = insertIndex + 1;\n const normalizedPoints = normalizeLinearPoints(updatedPoints);\n this.#emitPoints(normalizedPoints, event);\n this.#notifyHost('linear-point-focus', insertedIndex, event);\n };\n\n readonly removeLinearPoint = (event: Event): void => {\n event.preventDefault();\n\n if (this.easingType !== EasingType.LINEAR) {\n return;\n }\n\n const points = this.#getLinearPoints();\n if (!points || points.length <= MIN_LINEAR_POINTS) {\n return;\n }\n\n let removeIndex = 1;\n let smallestSpan = Number.POSITIVE_INFINITY;\n\n for (let index = 1; index < points.length - 1; index += 1) {\n const previous = points[index - 1];\n const next = points[index + 1];\n\n if (!previous || !next) {\n continue;\n }\n\n const span = next.x - previous.x;\n\n if (span < smallestSpan) {\n smallestSpan = span;\n removeIndex = index;\n }\n }\n\n if (removeIndex > 0 && removeIndex < points.length - 1) {\n const updatedPoints: LinearPoints = points\n .filter((_, pointIndex) => pointIndex !== removeIndex)\n .map((point) => {\n return { ...point };\n });\n\n const normalizedPoints = normalizeLinearPoints(updatedPoints);\n this.#emitPoints(normalizedPoints, event);\n\n const nextIndex = removeIndex - 1;\n this.#notifyHost('linear-point-focus', nextIndex, event);\n }\n };\n\n readonly incrementGridSize = (event: Event): void => {\n event.preventDefault();\n this.#commitGridSize(this.gridSize + 1, event);\n };\n\n readonly decrementGridSize = (event: Event): void => {\n event.preventDefault();\n this.#commitGridSize(this.gridSize - 1, event);\n };\n\n readonly handleSimplifyInput = (event: Event): void => {\n const customEvent = event as CustomEvent<ControlEventDetail<number>>;\n const value = customEvent.detail?.value ?? 0;\n this.simplify = Number(value);\n this.#notifyHost('simplify-change', this.simplify, event);\n };\n\n readonly handleRoundInput = (event: Event): void => {\n const customEvent = event as CustomEvent<ControlEventDetail<number>>;\n const value = customEvent.detail?.value ?? 0;\n this.round = Number(value);\n this.#notifyHost('round-change', this.round, event);\n };\n\n #clampGridSize = (value: number): number => Math.max(1, Math.min(24, Math.round(value)));\n\n #commitGridSize = (value: number, event: Event): void => {\n const nextValue = this.#clampGridSize(value);\n if (this.gridSize === nextValue) {\n this.requestRender();\n return;\n }\n this.gridSize = nextValue;\n this.#notifyHost('grid-size-change', this.gridSize, event);\n this.requestRender();\n };\n}\n"],"mappings":"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OAAO;QACPF,OAAO;MACT;MACA;QACEE,OAAO;QACPF,OAAO;MACT;MACA;QACEE,OAAO;QACPF,OAAO;MACT;;EAEJ;EACA;IACEA,OAAO;IACPC,SAAS;MACP;QACEC,OAAO;QACPF,OAAO;MACT;MACA;QACEE,OAAO;QACPF,OAAO;MACT;MACA;QACEE,OAAO;QACPF,OAAO;MACT;;EAEJ;EACA;IACEA,OAAO;IACPC,SAAS;MACP;QACEC,OAAO;QACPF,OAAO;MACT;MACA;QACEE,OAAO;QACPF,OAAO;MACT;MACA;QACEE,OAAO;QACPF,OAAO;MACT;MACA;QACEE,OACE;QACFF,OAAO;MACT;MACA;QACEE,OACE;QACFF,OAAO;MACT;MACA;QACEE,OACE;QACFF,OAAO;MACT;;EAEJ;EACA;IACEA,OAAO;IACPC,SAAS;MACP;QACEC,OAAO;QACPF,OAAO;MACT;MACA;QACEE,OAAO;QACPF,OAAO;MACT;MACA;QACEE,OACE;QACFF,OAAO;MACT;MACA;QACEE,OACE;QACFF,OAAO;MACT;;EAEJ;EACA;IACEA,OAAO;IACPC,SAAS;MACP;QACEC,OAAO;QACPF,OAAO;MACT;MACA;QACEE,OAAO;QACPF,OAAO;MACT;MACA;QACEE,OACE;QACFF,OAAO;MACT;MACA;QACEE,OACE;QACFF,OAAO;MACT;;EAEJ;EACA;IACEA,OAAO;IACPC,SAAS;MACP;QACEC,OAAO;QACPF,OAAO;MACT;MACA;QACEE,OACE;QACFF,OAAO;MACT;MACA;QACEE,OACE;QACFF,OAAO;MACT;MACA;QACEE,OACE;QACFF,OAAO;MACT;MACA;QACEE,OACE;QACFF,OAAO;MACT;MACA;QACEE,OACE;QACFF,OAAO;MACT;;EAEJ;EACA;IACEA,OAAO;IACPC,SAAS;MACP;QACEC,OACE;QACFF,OAAO;MACT;MACA;QACEE,OACE;QACFF,OAAO;MACT;;EAEJ;EACA;IACEA,OAAO;IACPC,SAAS;MACP;QACEC,OAAO;QACPF,OAAO;MACT;MACA;QACEE,OAAO;QACPF,OAAO;MACT;MACA;QACEE,OAAO;QACPF,OAAO;MACT;;EAEJ;;;;ACjOF,SAAiCG,WAAW;AAIrC,IAAMC,oBAAoB,CAACC,aAAAA;AAChC,QAAMC,QAA6B,CAAA;AAEnC,QAAMC,SAASC,KAAKC,KAAKC,YAAYL,QAAAA;AACrC,QAAMM,SAASH,KAAKC,KAAKG,aAAaP,QAAAA;AAEtC,WAASQ,IAAI,GAAGA,KAAKN,QAAQM,KAAK;AAChC,UAAMC,IAAID,IAAIR;AACd,QAAIS,IAAIJ,WAAW;AACjB;IACF;AAEAJ,UAAMS,KAAKC;;;aAGFF,CAAAA;;aAEAA,CAAAA;aACAF,UAAAA;;KAER;EACH;AAEA,WAASC,IAAI,GAAGA,KAAKF,QAAQE,KAAK;AAChC,UAAMI,IAAIJ,IAAIR;AACd,QAAIY,IAAIL,YAAY;AAClB;IACF;AAEAN,UAAMS,KAAKC;;;;aAIFC,CAAAA;aACAP,SAAAA;aACAO,CAAAA;;KAER;EACH;AAEA,SAAOX;AACT;;;ACdO,IAAMY,wBAAuB,CAClCC,MACAC,MACAC,WAAAA;AAEAF,OAAKG,cACH,IAAIC,YAAwCH,MAAM;IAChDC;IACAG,SAAS;IACTC,UAAU;EACZ,CAAA,CAAA;AAEJ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IHqCiCC;IAAAA;IAAAA;IAAAA;IAAAA;IAAAA;IAAAA;IAAAA;IAAAA;IAAAA;IAItBC;IAGAC;IAGAC;IAGAC;IAGAC;IAGAC;IAGAC;IAGAC;IAGAC;IAAAA;;SAzDVC,UAAU;EACTC,KAAK;EACLC,QAAQC;EACRC,WAAAA;AACE,UAAMC,mBAAmB,KAAKC,kBAAiB;AAC/C,UAAMC,kBAAkB,KAAKC,mBAAkB;AAC/C,UAAMC,sBAAsB,KAAKC,uBAAsB;AACvD,UAAMC,YAAY,KAAKC,aAAY;AAEnC,WAAOC;;uBAEYC,SAAAA,IAAaC,UAAAA;iBACnBD,SAAAA;kBACCC,UAAAA;uBACK,KAAKC,iBAAiB;uBACtB,KAAKC,iBAAiB;qBACxB,KAAKC,eAAe;wBACjB,KAAKC,kBAAkB;yBACtB,KAAKA,kBAAkB;;UAEtC,KAAK1B,WAAW2B,mDAAkD,KAAKC,aAAY,CAAA,SAAW,IAAA;UAC9FhB,mBAAmBQ,wDAAsDR,gBAAAA,aAA6B,IAAA;qCAC3EM,SAAAA;UAC3BJ,eAAAA;UACAE,mBAAAA;;;EAGR;AACF,CAAA,GAAAa,UAIGC,KAAiB;EAAEC,SAAS;AAAK,CAAA,GAAAC,UAGjCF,KAAuC;EAAEG,MAAMC;EAAQH,SAAS;AAAM,CAAA,GAAAI,UAGtEL,KAAc;EAAEG,MAAMG;EAASL,SAAS;EAAMM,cAAc;AAAK,CAAA,GAAAC,UAGjER,KAAc;EAAEG,MAAMG;EAASL,SAAS;EAAMM,cAAc;AAAM,CAAA,GAAAE,UAGlET,KAAa;EAAEG,MAAMO;EAAQT,SAAS;EAAMM,cAAc;AAAE,CAAA,GAAAI,UAG5DX,KAAoB;EAAEG,MAAMO;EAAQT,SAAS;EAAOM,cAAc;AAAK,CAAA,GAAAK,UAGvEZ,KAAa;EAAEG,MAAMO;EAAQT,SAAS;EAAMM,cAAc;AAAE,CAAA,GAAAM,SAG5Db,KAAa;EAAEG,MAAMO;EAAQT,SAAS;EAAMM,cAAc;AAAE,CAAA,GAAAO,SAG5DC,MAAqB,KAAA;AA3BjB,IAAMC,cAAN,eAA0BjD,iBAAAA,aAAAA;;WAItBC,kBAGAC,cAGAC,gBAGAC,kBAGAC,gBAGAC,0BAGAC,gBAGAC,aAGAC,kBAAAA,YAAAA,GAAAA,GAAAA,CAAAA,cAAAA,YAAAA,EAAAA,IAAAA,qBAAAA,MAAAA;;;;QAxBAR;;;;;QAGAC;;;;;QAGAC;;;;;QAGAC;;;;;QAGAC;;;;;QAGAC;;;;;QAGAC;;;;;QAGAC;;;;;QAGAC;;;;OA5BsBT,cAAAA;;EAItBC;MAAAA,aAAAA;gBAAAA;;MAAAA,WAAAA,IAAAA;SAAAA,2BAAU;;EAGVC;MAAAA,SAAAA;gBAAAA;;MAAAA,OAAAA,IAAAA;SAAAA,uBAAM;;EAGNC;MAAAA,WAAAA;gBAAAA;;MAAAA,SAAAA,IAAAA;SAAAA,yBAAQ;;EAGRC;MAAAA,aAAAA;gBAAAA;;MAAAA,WAAAA,IAAAA;SAAAA,2BAAU;;EAGVC;MAAAA,WAAAA;gBAAAA;;MAAAA,SAAAA,IAAAA;SAAAA,yBAAQ;;EAGRC;MAAAA,qBAAAA;gBAAAA;;MAAAA,mBAAAA,IAAAA;SAAAA,mCAAkB;;EAGlBC;MAAAA,WAAAA;gBAAAA;;MAAAA,SAAAA,IAAAA;SAAAA,yBAAQ;;EAGRC;MAAAA,QAAAA;gBAAAA;;MAAAA,MAAAA,IAAAA;SAAAA,sBAAK;;EAGLC;MAAAA,aAAAA;gBAAAA;;MAAAA,WAAAA,IAAAA;SAAAA,2BAAU;;EAEnB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;EAQA;EAgEA;EAOA;EAqEA,oBACEyC,UACAC,OACAC,WACAC,OACAC,WAAuB;AAEvB,UAAMC,KAAKD,cAAc,OAAQH,MAAMK,SAAS,IAAML,MAAMM,UAAU;AACtE,UAAMC,KAAKJ,cAAc,OAAQH,MAAMQ,SAAS,IAAMR,MAAMS,UAAU;AAEtE,UAAMC,YAAY;MAAEC,GAAGX,MAAMW,IAAIP;MAAIQ,GAAGZ,MAAMY,IAAIL;IAAG;AACrD,UAAMM,YAAY,KAAK,aAAaH,SAAAA;AACpC,UAAMI,OAAOX,cAAc,OAAO,aAAa;AAC/C,UAAMY,WAAWZ,cAAc,OAAO,aAAa;AAEnD,UAAMa,iBAAiB,KAAK,cAAcD,YAAY,KAAK,eAAeb;AAE1E,UAAMe,aAAa,KAAK,kBAAkBhB,WAAWY,SAAAA;AAErD,QAAI,CAACI,YAAY;AACf;IACF;AAEAlB,aAASmB,KAAKvC;;cAEJkC,UAAUF,CAAC;cACXE,UAAUD,CAAC;aACZO,eAAAA;sBACSjB,KAAAA;qBACDY,IAAAA;OACd;AAEHf,aAASmB,KAAKvC;+BACaqC,iBAAiB,aAAa,EAAA;aAChDC,UAAAA;sBACSf,KAAAA;qBACDY,IAAAA;wBACGX,SAAAA,KAAciB,KAAK/D,MAAMqD,UAAUC,IAAI,GAAA,CAAA,MAAUS,KAAK/D,MAAMqD,UAAUE,IAAI,GAAA,CAAA;OAC3F;EACL;EAEA;EAkCA;EAkCA3C,yBAAmD;AACjD,QAAI,KAAKnB,eAAeuE,WAAWC,QAAQ;AACzC,aAAO;IACT;AAEA,UAAMC,UAAU,KAAK;AACrB,QAAI,CAACA,WAAW,CAACA,QAAQC,eAAe;AACtC,aAAO;IACT;AAEA,UAAMxB,QAAQuB,QAAQC;AACtB,UAAMC,SAAS,KAAK,aAAazB,KAAAA;AACjC,UAAMD,WAAgC,CAAA;AAEtC,QAAIC,MAAMK,UAAUqB,UAAa1B,MAAMQ,UAAUkB,QAAW;AAC1D,YAAMC,cAAc,KAAK,aAAa;QACpChB,GAAGX,MAAMW,KAAKX,MAAMK,SAAS;QAC7BO,GAAGZ,MAAMY,KAAKZ,MAAMQ,SAAS;MAC/B,CAAA;AACA,YAAMS,aAAa,KAAK,kBAAkBQ,QAAQE,WAAAA;AAClD,UAAIV,YAAY;AACdlB,iBAASmB,KACPvC;;iBAEOsC,UAAAA;aACJ;MAEP;IACF;AAEA,QAAIjB,MAAMM,WAAWoB,UAAa1B,MAAMS,WAAWiB,QAAW;AAC5D,YAAMC,cAAc,KAAK,aAAa;QACpChB,GAAGX,MAAMW,KAAKX,MAAMM,UAAU;QAC9BM,GAAGZ,MAAMY,KAAKZ,MAAMS,UAAU;MAChC,CAAA;AACA,YAAMQ,aAAa,KAAK,kBAAkBQ,QAAQE,WAAAA;AAClD,UAAIV,YAAY;AACdlB,iBAASmB,KACPvC;;iBAEOsC,UAAAA;aACJ;MAEP;IACF;AAEAlB,aAASmB,KAAKvC,8DAA6D8C,OAAOd,CAAC,SAASc,OAAOb,CAAC,MAAM;AAE1G,WAAOjC,6DAA4DoB,QAAAA;EACrE;EAEA,kBAAkBE,WAAkBY,WAAgB;AAClD,UAAMe,OAAOf,UAAUF,IAAIV,UAAUU;AACrC,UAAMkB,OAAOhB,UAAUD,IAAIX,UAAUW;AACrC,UAAMkB,SAASV,KAAKW,KAAKH,OAAOA,OAAOC,OAAOA,IAAAA;AAE9C,UAAMG,eAAe;AACrB,UAAMC,gBAAgB;AAEtB,QAAIH,SAASE,eAAe,GAAG;AAC7B,aAAO;IACT;AAEA,UAAME,OAAON,OAAOE;AACpB,UAAMK,OAAON,OAAOC;AACpB,UAAMM,QAAQ,CAACD;AACf,UAAME,QAAQH;AAEd,UAAMI,KAAKzB,UAAUF;AACrB,UAAM4B,KAAK1B,UAAUD;AAErB,UAAM4B,iBAAiBpB,KAAKqB,IAAI,IAAIX,SAASE,gBAAgB,GAAA;AAE7D,UAAMU,aAAaZ,SAASE,eAAeQ;AAE3C,UAAMG,eAAe1C,UAAUU,IAAIyB,QAAQH;AAC3C,UAAMW,eAAe3C,UAAUW,IAAIyB,QAAQJ;AAC3C,UAAMY,kBAAkB5C,UAAUU,IAAIyB,QAAQH;AAC9C,UAAMa,kBAAkB7C,UAAUW,IAAIyB,QAAQJ;AAE9C,UAAMc,aAAa9C,UAAUU,IAAIuB,OAAOQ,aAAaN,QAAQH;AAC7D,UAAMe,aAAa/C,UAAUW,IAAIuB,OAAOO,aAAaL,QAAQJ;AAC7D,UAAMgB,gBAAgBhD,UAAUU,IAAIuB,OAAOQ,aAAaN,QAAQH;AAChE,UAAMiB,gBAAgBjD,UAAUW,IAAIuB,OAAOO,aAAaL,QAAQJ;AAEhE,UAAMkB,aAAab,KAAKF,QAAQJ;AAChC,UAAMoB,aAAab,KAAKF,QAAQL;AAChC,UAAMqB,gBAAgBf,KAAKF,QAAQJ;AACnC,UAAMsB,gBAAgBf,KAAKF,QAAQL;AAEnC,UAAMuB,YAAYf,iBAAiB;AACnC,UAAMgB,YAAYhB,iBAAiB;AAEnC,UAAMiB,YAAYV,aAAab,OAAOqB;AACtC,UAAMG,YAAYV,aAAab,OAAOoB;AACtC,UAAMI,YAAYR,aAAajB,OAAOsB;AACtC,UAAMI,YAAYR,aAAajB,OAAOqB;AAEtC,UAAMK,eAAeZ,gBAAgBf,OAAOqB;AAC5C,UAAMO,eAAeZ,gBAAgBf,OAAOoB;AAC5C,UAAMQ,eAAeV,gBAAgBnB,OAAOsB;AAC5C,UAAMQ,eAAeV,gBAAgBnB,OAAOqB;AAE5C,WAAO;UACDH,aAAAA,IAAiBC,aAAAA;UACjBS,YAAAA,IAAgBC,YAAAA,IAAgBH,YAAAA,IAAgBC,YAAAA,IAAgBb,aAAAA,IAAiBC,aAAAA;UACjFL,eAAAA,IAAmBC,eAAAA;UACnBb,aAAAA,IAAiBA,aAAAA,UAAuBU,YAAAA,IAAgBC,YAAAA;UACxDG,UAAAA,IAAcC,UAAAA;UACdS,SAAAA,IAAaC,SAAAA,IAAaC,SAAAA,IAAaC,SAAAA,IAAaT,UAAAA,IAAcC,UAAAA;UAClEpB,YAAAA,IAAgBA,YAAAA,UAAsBqB,aAAAA,IAAiBC,aAAAA;;;EAG/D;EAEA;EAQA;EASA;EAaA;EAkBA,yBAAyBtD,OAAcjD,QAAoB;AACzD,QAAIA,OAAO+E,SAAS,GAAG;AACrB,aAAOtC,OAAOyE;IAChB;AAEA,QAAIC,qBAAqB1E,OAAOyE;AAEhC,aAAS/D,QAAQ,GAAGA,QAAQnD,OAAO+E,SAAS,GAAG5B,SAAS,GAAG;AACzD,YAAMiE,QAAQpH,OAAOmD,KAAAA;AACrB,YAAMkE,MAAMrH,OAAOmD,QAAQ,CAAA;AAE3B,UAAI,CAACiE,SAAS,CAACC,KAAK;AAClB;MACF;AAEA,YAAMC,MAAM;QACV1D,GAAGwD,MAAMxD,KAAKwD,MAAM7D,UAAU;QAC9BM,GAAGuD,MAAMvD,KAAKuD,MAAM1D,UAAU;MAChC;AAEA,YAAM6D,MAAM;QACV3D,GAAGyD,IAAIzD,KAAKyD,IAAI/D,SAAS;QACzBO,GAAGwD,IAAIxD,KAAKwD,IAAI5D,SAAS;MAC3B;AAEA,eAAS+D,SAAS,GAAGA,UAAUC,qBAAqBD,UAAU,GAAG;AAC/D,cAAME,IAAIF,SAASC;AACnB,cAAME,cAAcC,6BAA6BF,GAAGN,OAAOE,KAAKC,KAAKF,GAAAA;AACrE,cAAMhE,KAAKJ,MAAMW,IAAI+D,YAAY/D;AACjC,cAAMJ,KAAKP,MAAMY,IAAI8D,YAAY9D;AACjC,cAAMgE,kBAAkBxE,KAAKA,KAAKG,KAAKA;AACvC,YAAIqE,kBAAkBV,oBAAoB;AACxCA,+BAAqBU;QACvB;MACF;IACF;AAEA,WAAOxD,KAAKW,KAAKmC,kBAAAA;EACnB;EAEA,uBAAuBlE,OAAcjD,QAAoB;AACvD,UAAM8H,WAAW,KAAK,yBAAyB7E,OAAOjD,MAAAA;AACtD,WAAO8H,YAAYC;EACrB;EAEA,6BAA6BC,UAAiBhI,QAAoB;AAChE,UAAMiI,WAAW,KAAK,aAAaD,QAAAA;AACnC,UAAME,mBAAmB9D,kBAAkBA;AAE3C,eAAWnB,SAASjD,QAAQ;AAC1B,UAAI,CAACiD,OAAO;AACV;MACF;AAEA,YAAMkF,WAAW,KAAK,aAAalF,KAAAA;AACnC,YAAMI,KAAK8E,SAASvE,IAAIqE,SAASrE;AACjC,YAAMJ,KAAK2E,SAAStE,IAAIoE,SAASpE;AAEjC,UAAIR,KAAKA,KAAKG,KAAKA,KAAK0E,kBAAkB;AACxC,eAAO;MACT;AAEA,UAAIjF,MAAMK,UAAUqB,UAAa1B,MAAMQ,UAAUkB,QAAW;AAC1D,cAAMyD,WAAW;UACfxE,GAAGX,MAAMW,KAAKX,MAAMK,SAAS;UAC7BO,GAAGZ,MAAMY,KAAKZ,MAAMQ,SAAS;QAC/B;AACA,cAAM4E,cAAc,KAAK,aAAaD,QAAAA;AACtC,cAAME,MAAMD,YAAYzE,IAAIqE,SAASrE;AACrC,cAAM2E,MAAMF,YAAYxE,IAAIoE,SAASpE;AAErC,YAAIyE,MAAMA,MAAMC,MAAMA,MAAML,kBAAkB;AAC5C,iBAAO;QACT;MACF;AAEA,UAAIjF,MAAMM,WAAWoB,UAAa1B,MAAMS,WAAWiB,QAAW;AAC5D,cAAM6D,YAAY;UAChB5E,GAAGX,MAAMW,KAAKX,MAAMM,UAAU;UAC9BM,GAAGZ,MAAMY,KAAKZ,MAAMS,UAAU;QAChC;AACA,cAAM+E,eAAe,KAAK,aAAaD,SAAAA;AACvC,cAAMF,MAAMG,aAAa7E,IAAIqE,SAASrE;AACtC,cAAM2E,MAAME,aAAa5E,IAAIoE,SAASpE;AAEtC,YAAIyE,MAAMA,MAAMC,MAAMA,MAAML,kBAAkB;AAC5C,iBAAO;QACT;MACF;IACF;AAEA,WAAO;EACT;EAEA;EAoCA;EAqBA;EAOA;EASA;EA8BA,qBAAqBjF,OAAoBE,OAAenD,QAAoB;AAC1E,UAAM0I,OAAO1I,OAAOmD,QAAQ,CAAA;AAC5B,UAAMwF,OAAO3I,OAAOmD,QAAQ,CAAA;AAE5B,QAAIyF,QAAQ3F,MAAMM,UAAU,EAAEN,MAAMK,SAAS;AAC7C,QAAIuF,QAAQ5F,MAAMS,UAAU,EAAET,MAAMQ,SAAS;AAE7C,QAAImF,UAAU,KAAKC,UAAU,GAAG;AAC9B,UAAI1D,OAAO;AACX,UAAIC,OAAO;AAEX,UAAIsD,QAAQC,MAAM;AAChBxD,eAAOwD,KAAK/E,IAAI8E,KAAK9E;AACrBwB,eAAOuD,KAAK9E,IAAI6E,KAAK7E;MACvB,WAAW8E,MAAM;AACfxD,eAAOwD,KAAK/E,IAAIX,MAAMW;AACtBwB,eAAOuD,KAAK9E,IAAIZ,MAAMY;MACxB,WAAW6E,MAAM;AACfvD,eAAOlC,MAAMW,IAAI8E,KAAK9E;AACtBwB,eAAOnC,MAAMY,IAAI6E,KAAK7E;MACxB,OAAO;AACLsB,eAAO;AACPC,eAAO;MACT;AAEA,YAAMhC,YAAY0F,gBAAgB3D,MAAMC,IAAAA;AACxC,YAAML,SAASgE;AAEf9F,YAAMK,QAAQ,CAACF,UAAUC,KAAK0B;AAC9B9B,YAAMQ,QAAQ,CAACL,UAAUI,KAAKuB;AAC9B9B,YAAMM,SAASH,UAAUC,KAAK0B;AAC9B9B,YAAMS,SAASN,UAAUI,KAAKuB;AAC9B6D,cAAQ3F,MAAMM;AACdsF,cAAQ5F,MAAMS;IAChB;AAEA,QAAIkF,UAAU,KAAKC,UAAU,GAAG;AAC9B;IACF;AAEA,UAAMG,aAAaF,gBAAgBF,OAAOC,KAAAA;AAC1C,UAAMI,kBAAkBC,aAAaN,OAAOC,KAAAA,KAAUE;AAEtD,UAAMI,WAAWD,aAAajG,MAAMK,SAAS,GAAGL,MAAMQ,SAAS,CAAA,KAAMwF;AACrEhG,UAAMK,QAAQ,CAAC0F,WAAW3F,KAAK8F;AAC/BlG,UAAMQ,QAAQ,CAACuF,WAAWxF,KAAK2F;AAE/B,UAAMC,YAAYF,aAAajG,MAAMM,UAAU,GAAGN,MAAMS,UAAU,CAAA,KAAMuF;AACxEhG,UAAMM,SAASyF,WAAW3F,KAAK+F;AAC/BnG,UAAMS,SAASsF,WAAWxF,KAAK4F;AAE/B,QAAInG,MAAMoG,iBAAiB,OAAO;AAChC,WAAK,0BAA0BpG,KAAAA;IACjC;EACF;EAEA,0BAA0BA,OAAkB;AAC1C,QAAI,CAACA,MAAMqG,UAAU;AACnBrG,YAAMoG,eAAe;AACrB;IACF;AAEA,UAAMD,YAAYF,aAAajG,MAAMM,UAAU,GAAGN,MAAMS,UAAU,CAAA;AAClE,UAAMyF,WAAWD,aAAajG,MAAMK,SAAS,GAAGL,MAAMQ,SAAS,CAAA;AAC/D,UAAM8F,eAAelF,KAAKmF,IAAIJ,WAAWD,QAAAA;AAEzC,QAAII,gBAAgB,GAAG;AACrB;IACF;AAEA,QAAIH,YAAY,GAAG;AACjB,YAAMK,eAAeX,gBAAgB7F,MAAMM,UAAU,GAAGN,MAAMS,UAAU,CAAA;AACxET,YAAMM,SAASkG,aAAapG,KAAKkG;AACjCtG,YAAMS,SAAS+F,aAAajG,KAAK+F;IACnC,WAAWJ,WAAW,GAAG;AACvB,YAAMO,cAAcZ,gBAAgB7F,MAAMK,SAAS,GAAGL,MAAMQ,SAAS,CAAA;AACrER,YAAMM,SAAS,CAACmG,YAAYrG,KAAKkG;AACjCtG,YAAMS,SAAS,CAACgG,YAAYlG,KAAK+F;IACnC;AAEA,QAAIJ,WAAW,GAAG;AAChB,YAAMO,cAAcZ,gBAAgB7F,MAAMK,SAAS,GAAGL,MAAMQ,SAAS,CAAA;AACrER,YAAMK,QAAQoG,YAAYrG,KAAKkG;AAC/BtG,YAAMQ,QAAQiG,YAAYlG,KAAK+F;IACjC,WAAWH,YAAY,GAAG;AACxB,YAAMK,eAAeX,gBAAgB7F,MAAMM,UAAU,GAAGN,MAAMS,UAAU,CAAA;AACxET,YAAMK,QAAQ,CAACmG,aAAapG,KAAKkG;AACjCtG,YAAMQ,QAAQ,CAACgG,aAAajG,KAAK+F;IACnC;EACF;EAEA1H,eAAoC;AAClC,WAAO8H,kBAAkB,KAAKxJ,QAAQ;EACxC;EAEAa,qBAA0C;AACxC,WAAO,KAAKjB,eAAeuE,WAAWsF,eAAe,KAAK,mBAAkB,IAAK,KAAK,cAAa;EACrG;EAEAxI,eAAuB;AACrB,WAAO,KAAK,cAAa;EAC3B;EAEAN,oBAA4B;AAC1B,WAAO,KAAK,mBAAkB;EAChC;EAqOA,uBAAuBd,QAAsBmD,OAAe6E,UAAiB6B,OAAmB;AAC9F,QAAIC,kBAAkB9B;AACtB,UAAM+B,eAAe/J,OAAOmD,KAAAA;AAC5B,UAAM6G,gBAAgBD,eAAgB,KAAK,gBAAgBE,oBAAoBF,YAAAA,IAAiB;AAEhG,QAAIF,MAAMK,YAAY,KAAK,oBAAoBF,eAAe;AAC5D,YAAMG,aAAa,KAAK,iBAAiBC,IAAIJ,aAAAA;AAC7C,UAAIG,YAAY;AACd,cAAME,SAAShG,KAAKiG,IAAItC,SAASpE,IAAIuG,WAAWvG,CAAC;AACjD,cAAM2G,SAASlG,KAAKiG,IAAItC,SAASnE,IAAIsG,WAAWtG,CAAC;AACjDiG,0BAAkBO,SAASE,SAAS;UAAE3G,GAAGoE,SAASpE;UAAGC,GAAGsG,WAAWtG;QAAE,IAAI;UAAED,GAAGuG,WAAWvG;UAAGC,GAAGmE,SAASnE;QAAE;MAC5G;IACF;AAEA,UAAM2G,mBAAmB,KAAK,sBAAsBrH,OAAO2G,iBAAiB9J,MAAAA;AAC5E,UAAMyK,gBAA8BzK,OAAO0K,IAAI,CAACzH,OAAO0H,MAAAA;AACrD,UAAIA,MAAMxH,OAAO;AACf,eAAOqH;MACT;AACA,aAAO;QAAE,GAAGvH;MAAM;IACpB,CAAA;AAEA,UAAM2H,mBAAmBC,sBAAsBJ,aAAAA;AAC/C,SAAKzK,SAAS4K;AACd,SAAK,YAAYA,kBAAkBf,KAAAA;AAEnC,QAAIG,eAAe;AACjB,YAAMc,WAAWF,iBAAiBG,UAAU,CAAC9H,UAAUA,OAAO+H,OAAOhB,aAAAA;AACrE,UAAIc,aAAa,IAAI;AACnB,aAAK,aAAaA;AAClB,aAAK,eAAed;AACpB,aAAK,mBAAmBc,UAAUjB,KAAAA;MACpC,OAAO;AACL,aAAK,mBAAmB1G,OAAO0G,KAAAA;MACjC;IACF,OAAO;AACL,WAAK,mBAAmB1G,OAAO0G,KAAAA;IACjC;AAEA,SAAKoB,cAAa;EACpB;EAEA,wBAAwBjL,QAAsBmD,OAAe6E,UAAiB6B,OAAmB;AAC/F,UAAM5G,QAAQjD,OAAOmD,KAAAA;AACrB,QAAI,CAACF,OAAO;AACV;IACF;AAEA,UAAM+G,gBAAgB,KAAK,gBAAgBC,oBAAoBhH,KAAAA;AAC/D,UAAMG,YAAY,KAAK,cAAc,aAAa,OAAO;AAEzD,QAAIC,KAAK2E,SAASpE,IAAIX,MAAMW;AAC5B,UAAMJ,KAAKwE,SAASnE,IAAIZ,MAAMY;AAE9B,QAAIT,cAAc,MAAM;AACtBC,WAAKgB,KAAKqB,IAAI,GAAGrC,EAAAA;IACnB,OAAO;AACLA,WAAKgB,KAAKmF,IAAI,GAAGnG,EAAAA;IACnB;AAEA,QAAIiG,WAAWrG,MAAMqG,YAAY;AACjC,QAAIO,MAAMK,UAAU;AAClBZ,iBAAW;IACb;AAEA,UAAMmB,gBAAgB;SAAIzK;;AAC1B,UAAMkL,eAAe;MAAE,GAAGjI;IAAM;AAChCwH,kBAActH,KAAAA,IAAS+H;AAEvBA,iBAAa5B,WAAWA;AAExB,QAAIlG,cAAc,MAAM;AACtB8H,mBAAa5H,QAAQD;AACrB6H,mBAAazH,QAAQD;IACvB,OAAO;AACL0H,mBAAa3H,SAASF;AACtB6H,mBAAaxH,SAASF;IACxB;AAEA,UAAM2H,cAAc7B;AACpB,UAAMD,eAAe8B,eAAeD,aAAa7B,iBAAiB;AAElE,QAAI8B,eAAe9B,cAAc;AAC/B,YAAM+B,gBAAgBlC,aAAa7F,IAAIG,EAAAA;AAEvC,UAAI4H,iBAAiBC,kBAAkB;AACrC,YAAIjI,cAAc,MAAM;AACtB,iBAAO8H,aAAa5H;AACpB,iBAAO4H,aAAazH;AACpB,cAAI0H,aAAa;AACf,mBAAOD,aAAa3H;AACpB,mBAAO2H,aAAaxH;UACtB;QACF,OAAO;AACL,iBAAOwH,aAAa3H;AACpB,iBAAO2H,aAAaxH;AACpB,cAAIyH,aAAa;AACf,mBAAOD,aAAa5H;AACpB,mBAAO4H,aAAazH;UACtB;QACF;MACF,OAAO;AACL,cAAMuF,aAAaF,gBAAgBzF,IAAIG,EAAAA;AAEvC,YAAI2H,aAAa;AACf,cAAI/H,cAAc,MAAM;AACtB,kBAAMkI,iBAAiBjC,eACnB+B,gBACAlC,aAAagC,aAAa3H,UAAU,GAAG2H,aAAaxH,UAAU,CAAA,KAAM0H;AACxEF,yBAAa3H,SAAS,CAACyF,WAAW3F,KAAKiI;AACvCJ,yBAAaxH,SAAS,CAACsF,WAAWxF,KAAK8H;UACzC,OAAO;AACL,kBAAMA,iBAAiBjC,eACnB+B,gBACAlC,aAAagC,aAAa5H,SAAS,GAAG4H,aAAazH,SAAS,CAAA,KAAM2H;AACtEF,yBAAa5H,QAAQ,CAAC0F,WAAW3F,KAAKiI;AACtCJ,yBAAazH,QAAQ,CAACuF,WAAWxF,KAAK8H;UACxC;QACF,WAAWjC,cAAc;AACvB,cAAIjG,cAAc,MAAM;AACtB,kBAAMsG,cAAcZ,gBAAgBoC,aAAa5H,SAAS,GAAG4H,aAAazH,SAAS,CAAA;AACnF,kBAAMgG,eAAeX,gBAAgBoC,aAAa3H,UAAU,GAAG2H,aAAaxH,UAAU,CAAA;AACtF,kBAAM0F,YAAYF,aAAagC,aAAa3H,UAAU,GAAG2H,aAAaxH,UAAU,CAAA;AAChF,gBAAI0F,YAAY,GAAG;AACjB8B,2BAAa3H,SAASkG,aAAapG,KAAK+H;AACxCF,2BAAaxH,SAAS+F,aAAajG,KAAK4H;YAC1C;AACAF,yBAAa5H,QAAQoG,YAAYrG,KAAK+H;AACtCF,yBAAazH,QAAQiG,YAAYlG,KAAK4H;UACxC,OAAO;AACL,kBAAM1B,cAAcZ,gBAAgBoC,aAAa5H,SAAS,GAAG4H,aAAazH,SAAS,CAAA;AACnF,kBAAMgG,eAAeX,gBAAgBoC,aAAa3H,UAAU,GAAG2H,aAAaxH,UAAU,CAAA;AACtF,kBAAMyF,WAAWD,aAAagC,aAAa5H,SAAS,GAAG4H,aAAazH,SAAS,CAAA;AAC7E,gBAAI0F,WAAW,GAAG;AAChB+B,2BAAa5H,QAAQoG,YAAYrG,KAAK+H;AACtCF,2BAAazH,QAAQiG,YAAYlG,KAAK4H;YACxC;AACAF,yBAAa3H,SAASkG,aAAapG,KAAK+H;AACxCF,yBAAaxH,SAAS+F,aAAajG,KAAK4H;UAC1C;QACF;AAEA,YAAI/B,cAAc;AAChB,eAAK,0BAA0B6B,YAAAA;QACjC;MACF;IACF;AAEA,UAAMN,mBAAmBC,sBAAsBJ,aAAAA;AAC/C,SAAKzK,SAAS4K;AACd,SAAK,YAAYA,kBAAkBf,KAAAA;AAEnC,QAAIG,eAAe;AACjB,YAAMc,WAAWF,iBAAiBG,UAAU,CAACQ,cAAcA,WAAWP,OAAOhB,aAAAA;AAC7E,UAAIc,aAAa,IAAI;AACnB,aAAK,aAAaA;AAClB,aAAK,eAAed;AACpB,aAAK,mBAAmBc,UAAUjB,KAAAA;MACpC,OAAO;AACL,aAAK,mBAAmB1G,OAAO0G,KAAAA;MACjC;IACF,OAAO;AACL,WAAK,mBAAmB1G,OAAO0G,KAAAA;IACjC;AAEA,SAAKoB,cAAa;EACpB;EAmCA,mBAAmBjD,UAAiB6B,OAAmB;AACrD,UAAMrF,UAAU,KAAK,uBAAuB,KAAK,0BAA0BwD,QAAAA;AAC3E,QAAI,CAACxD,SAAS;AACZ,aAAO;IACT;AAEA,UAAM,EAAEoG,kBAAkBY,eAAe/G,cAAa,IAAKD;AAC3D,UAAMiH,kBAAkBhH,gBAAgBwF,oBAAoBxF,aAAAA,IAAiB;AAE7E,SAAKzE,SAAS4K;AACd,SAAK,YAAYA,kBAAkBf,KAAAA;AACnC,SAAKoB,cAAa;AAClB,SAAK,sBAAsB;AAE3B,WAAO;MACL9H,OAAOqI;MACPE,SAASD;IACX;EACF;EAEA,0BAA0BzD,UAAe;AACvC,QAAI,KAAKjI,eAAeuE,WAAWC,QAAQ;AACzC,aAAO;IACT;AAEA,UAAMvE,SAAS,KAAK,iBAAgB;AACpC,QAAI,CAACA,UAAUA,OAAO+E,UAAU4G,mBAAmB;AACjD,aAAO;IACT;AAGA,UAAMC,UAAUC,WAAW7D,UAAU;MAAE8D,MAAM;MAAIC,MAAM;IAAE,CAAA;AACzD,QAAI,CAAC,KAAK,uBAAuBH,SAAS5L,MAAAA,GAAS;AACjD,aAAO;IACT;AAEA,UAAMgM,cAAchM,OAAO+K,UAAU,CAAC9H,UAAU2I,QAAQhI,IAAIX,MAAMW,CAAC;AACnE,QAAIoI,eAAe,GAAG;AACpB,aAAO;IACT;AAEA,UAAMtD,OAAO1I,OAAOgM,cAAc,CAAA;AAClC,UAAMrD,OAAO3I,OAAOgM,WAAAA;AAEpB,QAAI,CAACtD,QAAQ,CAACC,MAAM;AAClB,aAAO;IACT;AAEA,QAAIiD,QAAQhI,IAAI8E,KAAK9E,IAAIyH,oBAAoB1C,KAAK/E,IAAIgI,QAAQhI,IAAIyH,kBAAkB;AAClF,aAAO;IACT;AAEA,QAAIZ;AACJ,QAAIgB,kBAAiC;AAErC,UAAMQ,cAAcC,kBAAkBxD,MAAMC,MAAMiD,OAAAA;AAElD,QAAIK,aAAa;AACf,YAAM,EAAEvD,MAAMyD,SAASC,UAAUzD,MAAM0D,QAAO,IAAKJ;AACnDR,wBAAkBxB,oBAAoBmC,QAAAA;AACtC3B,sBAAgB;WACXzK,OAAOsM,MAAM,GAAGN,cAAc,CAAA;QACjCG;QACAC;QACAC;WACGrM,OAAOsM,MAAMN,cAAc,CAAA;;IAElC,OAAO;AACL,YAAMI,WAAwB;QAC5BxI,GAAGgI,QAAQhI;QACXC,GAAG+H,QAAQ/H;QACXP,OAAO;QACPG,OAAO;QACPF,QAAQ;QACRG,QAAQ;QACR4F,UAAU;QACVD,cAAc;MAChB;AACAoC,wBAAkBxB,oBAAoBmC,QAAAA;AACtC3B,sBAAgB;WAAIzK,OAAOsM,MAAM,GAAGN,WAAAA;QAAcI;WAAapM,OAAOsM,MAAMN,WAAAA;;IAC9E;AAEA,UAAMpB,mBAAmBC,sBAAsBJ,aAAAA;AAC/C,UAAM8B,kBACJd,oBAAoB,OAAOb,iBAAiBG,UAAU,CAAC9H,UAAUA,OAAO+H,OAAOS,eAAAA,IAAmB;AAEpG,UAAMD,gBAAgBe,oBAAoB,KAAKA,kBAAkBP;AACjE,UAAMvH,gBAAgBmG,iBAAiBY,aAAAA;AAEvC,QAAI,CAAC/G,eAAe;AAClB,aAAO;IACT;AAEA,WAAO;MACL+H,MAAMC,kBAAkB7B,gBAAAA;MACxBA;MACAY;MACA/G;IACF;EACF;;;;;AA3wCK,UAAA,GAAA,IAAA,GAAA,KAII1E,4BAAU2M,aAAA,IAAA,GAAV3M,iBAAAA,IAAAA,IAAAA,KAGAC,uBAAAA,aAAAA,IAAAA,GAAAA,KAGAC,yBAAAA,eAAAA,IAAAA,GAAAA,KAGAC,2BAAAA,iBAAAA,IAAAA,GAAAA,KAGAC,yBAAAA,eAAAA,MAAmB,CAAA,GAAA,KAGnBC,mCAAAA,yBAAAA,MAAoC,IAAA,GAAA,KAGpCC,yBAAAA,eAAAA,MAAmB,CAAA,GAAA,KAGnBC,sBAAAA,YAAAA,MAAgB,CAAA,GAAA,KAGhBC,2BAAAA,iBAAAA,IAAAA,GAAAA,KAET,cAAc,OAAA,KACd,aAA4B,MAAA,KAC5B,YAAuD,MAAA,KACvD,cAA4B,MAAA,KAC5B,sBAAkD,MAAA,KAClD,mBAAoD,MAAA,KACpD,eAA8B,MAAA,KAC9B,eACE,MAAA,KAEF,kBAAkB,MAAA;AAChB,YAAMoM,OAAO,KAAKC,YAAW;AAC7B,UAAID,gBAAgBE,cAAcF,KAAKG,gBAAgBhN,aAAa;AAClE,eAAO6M,KAAKG;MACd;AACA,aAAO;IACT,GAAA,KAEA,qBAAqB,MAAA;AACnB,YAAM9M,SAAS,KAAK,sBAAqB;AAEzC,UAAI,CAACA,QAAQ;AACX+M,gBAAQC,KAAK,8CAA8C,KAAKhN,MAAM;AACtE,eAAO,CAAA;MACT;AAEA,UAAI;AACF,cAAMiN,cAAc,KAAK,aAAa;UAAErJ,GAAG;UAAGC,GAAG;QAAE,CAAA;AACnD,cAAMqJ,YAAY,KAAK,aAAa;UAAEtJ,GAAG;UAAGC,GAAG;QAAE,CAAA;AACjD,cAAMsJ,aAAa,KAAK,aAAanN,OAAOoN,EAAE;AAC9C,cAAMC,aAAa,KAAK,aAAarN,OAAOsN,EAAE;AAE9C,cAAMtK,WAAgC,CAAA;AAEtC,cAAMuK,gBAAgB,KAAK,kBAAkBN,aAAaE,UAAAA;AAC1D,cAAMK,gBAAgB,KAAK,kBAAkBN,WAAWG,UAAAA;AAExDrK,iBAASmB,KAAKvC;;cAENuL,WAAWvJ,CAAC;cACZuJ,WAAWtJ,CAAC;aACbO,eAAAA;;;SAGJ;AACHpB,iBAASmB,KAAKvC;;cAENyL,WAAWzJ,CAAC;cACZyJ,WAAWxJ,CAAC;aACbO,eAAAA;;;SAGJ;AAEH,YAAImJ,eAAe;AACjBvK,mBAASmB,KAAKvC;iCACW,KAAK,eAAe,KAAK,KAAK,cAAc,UAAU,aAAa,EAAA;eACrF2L,aAAAA;;;WAGJ;QACL;AAEA,YAAIC,eAAe;AACjBxK,mBAASmB,KAAKvC;iCACW,KAAK,eAAe,KAAK,KAAK,cAAc,UAAU,aAAa,EAAA;eACrF4L,aAAAA;;;WAGJ;QACL;AAEAxK,iBAASmB,KAAKvC,8CAA6CqL,YAAYrJ,CAAC,SAASqJ,YAAYpJ,CAAC,MAAM;AACpGb,iBAASmB,KAAKvC,8CAA6CsL,UAAUtJ,CAAC,SAASsJ,UAAUrJ,CAAC,MAAM;AAEhG,eAAOb;MACT,SAASyK,OAAO;AACdV,gBAAQU,MAAM,0CAA0CA,KAAAA;AACxD,eAAO,CAAA;MACT;IACF,GAAA,KAEA,eAAe,CAACC,MAAAA;AACd,aAAO;QACL9J,GAAG8J,EAAE9J,IAAItC;QACTuC,IAAI,IAAI6J,EAAE7J,KAAKtC;MACjB;IACF,GAAA,KAEA,gBAAgB,MAAA;AACd,YAAMvB,SAAS,KAAK,iBAAgB;AAEpC,UAAI,CAACA,QAAQ;AACX,eAAO,CAAA;MACT;AAEA,UAAI;AACF,cAAMgD,WAAgC,CAAA;AACtC,cAAM2K,eAAe,KAAKvN;AAE1BJ,eAAO4N,QAAQ,CAAC3K,OAAOE,UAAAA;AACrB,cAAI,CAACF,OAAO;AACV;UACF;AAEA,gBAAM4K,iBAAiBF,iBAAiBxK;AACxC,gBAAM2K,kBAAkB,KAAK,eAAe,KAAK,eAAe3K;AAEhE,cAAI,CAAC0K,kBAAkB,CAACC,iBAAiB;AACvC;UACF;AAEA,gBAAM5K,YAAY,KAAK,aAAaD,KAAAA;AAEpC,cAAIE,QAAQ,MAAMF,MAAMK,UAAUqB,UAAa1B,MAAMQ,UAAUkB,SAAY;AACzE,iBAAK,oBAAoB3B,UAAUC,OAAOC,WAAWC,OAAO,IAAA;UAC9D;AAEA,cAAIA,QAAQnD,OAAO+E,SAAS,MAAM9B,MAAMM,WAAWoB,UAAa1B,MAAMS,WAAWiB,SAAY;AAC3F,iBAAK,oBAAoB3B,UAAUC,OAAOC,WAAWC,OAAO,KAAA;UAC9D;QACF,CAAA;AAEAnD,eAAO4N,QAAQ,CAAC3K,OAAOE,UAAAA;AACrB,cAAI,CAACF,OAAO;AACV;UACF;AAEA,gBAAM4K,iBAAiBF,iBAAiBxK;AACxC,gBAAM4K,gBAAiB,KAAK,cAAc,WAAW,KAAK,eAAe5K,SAAU0K;AAEnF,gBAAM3K,YAAY,KAAK,aAAaD,KAAAA;AAEpCD,mBAASmB,KAAKvC;;gBAENsB,UAAUU,CAAC;gBACXV,UAAUW,CAAC;eACZO,eAAAA;wBACSjB,KAAAA;;WAEb;AACHH,mBAASmB,KAAKvC;gCACUmM,gBAAgB,aAAa,EAAA;gBAC7C7K,UAAUU,CAAC;gBACXV,UAAUW,CAAC;wBACHV,KAAAA;;0BAEEA,QAAQ,CAAA,KAAMkB,KAAK/D,MAAM2C,MAAMW,IAAI,GAAA,CAAA,MAAUS,KAAK/D,MAAM2C,MAAMY,IAAI,GAAA,CAAA;WACjF;QACL,CAAA;AAEA,eAAOb;MACT,SAASyK,OAAO;AACdV,gBAAQU,MAAM,kCAAkCA,KAAAA;AAChD,eAAO,CAAA;MACT;IACF,GAAA,KA2CA,gBAAgB,MAAA;AACd,UAAI;AACF,YAAI,KAAK1N,eAAeuE,WAAWsF,cAAc;AAC/C,gBAAM5J,UAAS,KAAK,sBAAqB;AAEzC,cAAI,CAACA,SAAQ;AACX+M,oBAAQC,KAAK,gCAAgC,KAAKhN,MAAM;AACxD,mBAAO;UACT;AAEA,iBAAOgO,gBAAgBhO,OAAAA;QACzB;AAEA,cAAMA,SAAS,KAAK,iBAAgB;AAEpC,YAAI,CAACA,UAAUA,OAAO+E,SAAS,GAAG;AAChC,iBAAO;QACT;AAEA,YAAI,KAAK1E,WAAW,GAAG;AACrB,gBAAM4N,eAAeC,uBAAuBlO,QAAQ;YAClDK,UAAU,KAAKA;YACfC,OAAO,KAAKA;UACd,CAAA;AACA,iBAAOmM,kBAAkBwB,YAAAA;QAC3B;AAEA,eAAOxB,kBAAkBzM,MAAAA;MAC3B,SAASyN,OAAO;AACdV,gBAAQU,MAAM,gCAAgCA,KAAAA;AAC9C,eAAO;MACT;IACF,GAAA,KAEA,qBAAqB,MAAA;AACnB,UAAI,KAAK,aAAa;AACpB,eAAO;MACT;AAEA,UAAI;AACF,YAAI,KAAK1N,eAAeuE,WAAWsF,cAAc;AAC/C,gBAAMuE,aAAa,KAAK;AACxB,cAAI,CAACA,YAAY;AACf,mBAAO;UACT;AAEA,gBAAMnO,SAAS,KAAK,sBAAqB;AACzC,cAAI,CAACA,QAAQ;AACX,mBAAO;UACT;AAEA,iBAAOgO,gBAAgB;YACrBZ,IAAIe;YACJb,IAAItN,OAAOsN;UACb,CAAA;QACF;AAEA,YAAI,KAAKvN,eAAeuE,WAAWC,QAAQ;AACzC,iBAAO,KAAK,qBAAqBiI,QAAQ;QAC3C;AAEA,eAAO;MACT,SAASiB,OAAO;AACdV,gBAAQU,MAAM,sCAAsCA,KAAAA;AACpD,eAAO;MACT;IACF,GAAA,KAqHA,wBAAwB,MAAA;AACtB,UAAIW,MAAMC,QAAQ,KAAKrO,MAAM,GAAG;AAC9B,eAAO;MACT;AAEA,aAAO,KAAKA,UAAU;IACxB,GAAA,KAEA,mBAAmB,MAAA;AACjB,UAAI,CAACoO,MAAMC,QAAQ,KAAKrO,MAAM,GAAG;AAC/B,eAAO;MACT;AAEA,WAAK,sBAAsB,KAAKA,MAAM;AACtC,aAAO,KAAKA;IACd,GAAA,KAEA,wBAAwB,CAACA,WAAAA;AACvB,UAAI,CAACA,QAAQ;AACX;MACF;AAEA,iBAAWiD,SAASjD,QAAQ;AAC1B,YAAI,CAACiD,OAAO;AACV;QACF;AACAgH,4BAAoBhH,KAAAA;MACtB;IACF,GAAA,KAEA,6BAA6B,CAACjD,WAAAA;AAC5B,UAAI,CAACA,QAAQ;AACX,eAAO;MACT;AAEA,YAAM0K,MAAM,oBAAI4D,IAAAA;AAEhB,iBAAWrL,SAASjD,QAAQ;AAC1B,YAAI,CAACiD,OAAO;AACV;QACF;AACA,cAAM+H,KAAKf,oBAAoBhH,KAAAA;AAC/ByH,YAAI6D,IAAIvD,IAAIwD,iBAAiBvL,KAAAA,CAAAA;MAC/B;AAEA,aAAOyH;IACT,GAAA,KAgGA,oBAAoB,CAACb,OAAqB4E,YAAAA;AACxC,YAAMlO,aAAa,KAAKA;AAExB,UAAI,CAACA,YAAY;AACf,eAAO;UAAEqD,GAAG;UAAGC,GAAG;QAAE;MACtB;AAEA,YAAM6K,OAAOnO,WAAWoO,sBAAqB;AAC7C,YAAMC,OAAO/E,MAAMgF,UAAUH,KAAKI;AAClC,YAAMC,OAAOlF,MAAMmF,UAAUN,KAAKO;AAElC,UAAIrL,IAAIgL,OAAOF,KAAKQ;AACpB,UAAIrL,IAAI,IAAIkL,OAAOL,KAAKS;AAExB,YAAMC,WAAWX,SAASW,YAAY;AAEtC,YAAMC,aACJ,CAACD,YACD,KAAKlP,cACL,EAAE,KAAK,gBAAgB,KAAK,cAAc,cAAc,KAAK,cAAc;AAE7E,UAAImP,YAAY;AACd,cAAMC,SAAShO,YAAY,KAAKnB;AAChC,cAAMoP,SAAShO,aAAa,KAAKpB;AACjCyD,YAAIS,KAAK/D,MAAMsD,IAAI0L,MAAAA,IAAUA;AAC7BzL,YAAIQ,KAAK/D,MAAMuD,IAAI0L,MAAAA,IAAUA;MAC/B;AAEA,YAAMC,eACJ,KAAKzP,eAAeuE,WAAWsF,eAC3B;QAAEkC,MAAM2D;QAAsB1D,MAAM2D;MAAqB,IACzD/K;AAEN,aAAOkH,WAAW;QAAEjI;QAAGC;MAAE,GAAG2L,YAAAA;IAC9B,GAAA,KAEA,wBAAwB,CAACrM,OAAe6E,UAAiBhI,WAAAA;AACvD,UAAI4D,IAAIoE,SAASpE;AAEjB,UAAIT,UAAU,GAAG;AACfS,YAAI;MACN,WAAWT,UAAUnD,OAAO+E,SAAS,GAAG;AACtCnB,YAAI;MACN,OAAO;AACLA,YAAIS,KAAKqB,IAAIrB,KAAKmF,IAAI5F,GAAGyH,gBAAAA,GAAmB,IAAIA,gBAAAA;MAClD;AAEA,YAAMO,UAAUC,WAAW;QAAEjI;QAAGC,GAAGmE,SAASnE;MAAE,GAAG;QAAEiI,MAAM;QAAIC,MAAM;MAAE,CAAA;AACrE,YAAM4D,cAAc3P,OAAOmD,KAAAA;AAE3B,aAAO;QACL,GAAGwM;QACH/L,GAAGgI,QAAQhI;QACXC,GAAG+H,QAAQ/H;MACb;IACF,GAAA,KAEA,cAAc,CAAC+L,OAAyC/F,UAAAA;AACtD,YAAMgG,SAAS,KAAK,gBAAe;AACnC,YAAMC,SAA+D;QAAEF;QAAO/F;MAAM;AAEpFkG,MAAAA,sBAAqBF,QAAQ,iBAAiBC,MAAAA;IAChD,GAAA,KAEA,qBAAqB,CAAC3M,OAAsB0G,UAAAA;AAC1C,UAAI,KAAK9J,eAAeuE,WAAWC,QAAQ;AACzC;MACF;AACA,YAAMsL,SAAS,KAAK,gBAAe;AACnC,YAAMC,SAA4C;QAAEF,OAAOzM;QAAO0G;MAAM;AACxEkG,MAAAA,sBAAqBF,QAAQ,sBAAsBC,MAAAA;IACrD,GAAA,KAEA,6BAA6B,CAAC3M,OAAe0G,UAAAA;AAC3C,YAAM7J,SAAS,KAAK,iBAAgB;AACpC,UAAI,CAACA,UAAUmD,QAAQ,KAAKA,SAASnD,OAAO+E,QAAQ;AAClD;MACF;AAEA,YAAM9B,QAAQjD,OAAOmD,KAAAA;AACrB,UAAI,CAACF,OAAO;AACV;MACF;AAEA,YAAMwH,gBAAgB;WAAIzK;;AAC1B,YAAMkL,eAAe;QAAE,GAAGjI;MAAM;AAChCwH,oBAActH,KAAAA,IAAS+H;AAEvB,YAAM8E,kBAAkB,CAAC9E,aAAa5B;AACtC4B,mBAAa5B,WAAW0G;AACxB9E,mBAAa7B,eAAehH,QAAQ2N,eAAAA;AAEpC,UAAIA,iBAAiB;AACnB,aAAK,qBAAqB9E,cAAc/H,OAAOnD,MAAAA;MACjD;AAEA,YAAM4K,mBAAmBC,sBAAsBJ,aAAAA;AAC/C,WAAKzK,SAAS4K;AACd,WAAK,YAAYA,kBAAkBf,KAAAA;AACnC,WAAK,mBAAmB1G,OAAO0G,KAAAA;AAC/B,WAAKoB,cAAa;IACpB,GAAA,KA6GSzJ,oBAAoB,CAACqI,UAAAA;AAC5BA,YAAMoG,eAAc;AACpB,UAAIC,eAAe,KAAKnQ,eAAeuE,WAAWC,SAAS,KAAK,iBAAgB,IAAK;AACrF,WAAK,mBAAmB,KAAK,2BAA2B2L,YAAAA;AACxD,WAAK,eAAe;AACpB,WAAK,eAAe;AAEpB,YAAML,SAAShG,MAAMgG;AAErB,UAAI,EAAEA,kBAAkBM,aAAa;AACnC;MACF;AAEA,YAAMpM,OAAO8L,OAAOO,aAAa,WAAA;AACjC,YAAMC,iBAAiBR,OAAOO,aAAa,YAAA;AAE3C,UAAIC,mBAAmB,MAAM;AAC3B,cAAMlN,QAAQV,OAAO6N,SAASD,gBAAgB,EAAA;AAC9C,YAAI5N,OAAO8N,MAAMpN,KAAAA,GAAQ;AACvB;QACF;AAEA,YAAI,KAAKpD,eAAeuE,WAAWC,QAAQ;AACzC,cAAIR,SAAS,cAAcA,SAAS,aAAa;AAC/C,kBAAMd,QAAQiN,eAAe/M,KAAAA;AAC7B,gBAAIF,OAAO;AACT,mBAAK,eAAegH,oBAAoBhH,KAAAA;YAC1C;AACA,iBAAK1C,YAAYiQ,kBAAkB3G,MAAM4G,SAAS;AAClD,iBAAK,cAAc;AACnB,iBAAK,YAAY1M;AACjB,iBAAK,aAAaZ;AAClB,iBAAK,eAAe;AACpB,iBAAK,cAAc;AACnB,iBAAK,mBAAmBA,OAAO0G,KAAAA;AAC/B,iBAAKpI,kBAAkBoI,KAAAA;AACvB,iBAAKoB,cAAa;AAClB;UACF;AAEA,cAAIlH,SAAS,SAAS;AACpB,gBAAI8F,MAAMiG,WAAW,GAAG;AACtB,mBAAK,2BAA2B3M,OAAO0G,KAAAA;AACvC;YACF;AAEA,kBAAM5G,QAAQiN,eAAe/M,KAAAA;AAC7B,gBAAIF,OAAO;AACT,mBAAK,eAAegH,oBAAoBhH,KAAAA;YAC1C;AACA,iBAAK,mBAAmBE,OAAO0G,KAAAA;AAC/B,iBAAKtJ,YAAYiQ,kBAAkB3G,MAAM4G,SAAS;AAClD,iBAAK,cAAc;AACnB,iBAAK,YAAY;AACjB,iBAAK,aAAatN;AAClB,iBAAK,eAAe;cAClBuN,MAAM;cACNvN;cACAwN,QAAQ9G,MAAMgF;cACd+B,QAAQ/G,MAAMmF;YAChB;AACA,iBAAK,cAAc;AACnB,iBAAK/D,cAAa;AAClB;UACF;QACF;AAEA,YAAI,KAAKlL,eAAeuE,WAAWsF,gBAAgB7F,SAAS,SAAS;AACnE,eAAKxD,YAAYiQ,kBAAkB3G,MAAM4G,SAAS;AAClD,eAAK,cAAc;AACnB,eAAK,YAAY;AACjB,eAAK,aAAatN;AAClB,eAAK,cAAc;AACnB,eAAK8H,cAAa;AAClB;QACF;MACF;AAEA,UAAIoF,mBAAmB,MAAM;AAC3B,YAAI,KAAKtQ,eAAeuE,WAAWC,QAAQ;AACzC,gBAAMsM,eAAe,KAAK,mBAAmB,KAAK,kBAAkBhH,KAAAA,GAAQA,KAAAA;AAE5E,cAAIgH,cAAc;AAChBX,2BAAe,KAAK,iBAAgB;AACpC,iBAAK,mBAAmB,KAAK,2BAA2BA,YAAAA;AACxD,iBAAK,eAAeW,aAAanF;AACjC,iBAAKnL,YAAYiQ,kBAAkB3G,MAAM4G,SAAS;AAClD,iBAAK,cAAc;AACnB,iBAAK,YAAY;AACjB,iBAAK,aAAaI,aAAa1N;AAC/B,iBAAK,eAAe;AACpB,iBAAK,cAAc;AACnB,iBAAK,mBAAmB0N,aAAa1N,OAAO0G,KAAAA;AAC5C,iBAAKoB,cAAa;AAClB;UACF,OAAO;AACL,iBAAK,mBAAmB,MAAMpB,KAAAA;UAChC;QACF;AAEA,YAAI,KAAK9J,eAAeuE,WAAWsF,cAAc;AAC/C,eAAK,cAAc,KAAK,kBAAkBC,KAAAA;AAC1C,eAAKtJ,YAAYiQ,kBAAkB3G,MAAM4G,SAAS;AAClD,eAAK,cAAc;AACnB,eAAK,YAAY;AACjB,eAAK,aAAa;AAClB,eAAK,eAAe;AACpB,eAAKhP,kBAAkBoI,KAAAA;AACvB,eAAKoB,cAAa;AAClB;QACF;MACF;IACF,GAAA,KAESxJ,oBAAoB,CAACoI,UAAAA;AAC5B,UAAI,CAAC,KAAKtJ,YAAY;AACpB;MACF;AAEA,YAAMuQ,qBAAqB,CAAC,KAAK,eAAe,KAAK,iBAAiB,QAAQ,KAAK,aAAaJ,SAAS;AACzG,UAAI1I,WAAW,KAAK,kBAAkB6B,OAAO;QAAEuF,UAAU0B;MAAmB,CAAA;AAE5E,UAAI,KAAK,gBAAgB,CAAC,KAAK,aAAa;AAC1C,cAAMzG,SAASR,MAAMgF,UAAU,KAAK,aAAa8B;AACjD,cAAMpG,SAASV,MAAMmF,UAAU,KAAK,aAAa4B;AACjD,cAAM/I,kBAAkBwC,SAASA,SAASE,SAASA;AAEnD,YAAI1C,mBAAmBkJ,qCAAqC;AAC1D,eAAK,cAAc;AACnB,eAAK,eAAe;AAEpB,cAAID,oBAAoB;AACtB9I,uBAAW,KAAK,kBAAkB6B,KAAAA;UACpC;QACF,OAAO;AACL;QACF;MACF;AAEA,UAAI,KAAK,eAAe,KAAK,eAAe,MAAM;AAChDA,cAAMoG,eAAc;AACpB,aAAK,sBAAsB;AAE3B,YAAI,KAAKlQ,eAAeuE,WAAWC,QAAQ;AACzC,gBAAMvE,SAAS,KAAK,iBAAgB;AACpC,cAAI,CAACA,UAAU,KAAK,cAAcA,OAAO+E,QAAQ;AAC/C;UACF;AAEA,cAAI,KAAK,cAAc,SAAS;AAC9B,iBAAK,uBAAuB/E,QAAQ,KAAK,YAAYgI,UAAU6B,KAAAA;AAC/D;UACF;AAEA,cAAI,KAAK,cAAc,cAAc,KAAK,cAAc,aAAa;AACnE,iBAAK,wBAAwB7J,QAAQ,KAAK,YAAYgI,UAAU6B,KAAAA;AAChE;UACF;QACF;AAEA,YAAI,KAAK9J,eAAeuE,WAAWsF,cAAc;AAC/C,gBAAM5J,SAAS,KAAK,sBAAqB;AACzC,cAAI,CAACA,QAAQ;AACX;UACF;AAEA,gBAAMyK,gBAAmC;YAAE,GAAGzK;UAAO;AACrD,cAAIgR,mBAAmBhJ;AAEvB,cAAI6B,MAAMK,UAAU;AAClB,kBAAM+G,YAAY,KAAK,eAAe,IAAIjR,OAAOoN,KAAKpN,OAAOsN;AAE7D,gBAAI2D,WAAW;AACb,oBAAM5G,SAAShG,KAAKiG,IAAItC,SAASpE,IAAIqN,UAAUrN,CAAC;AAChD,oBAAM2G,SAASlG,KAAKiG,IAAItC,SAASnE,IAAIoN,UAAUpN,CAAC;AAEhDmN,iCAAmB3G,SAASE,SAAS;gBAAE3G,GAAGoE,SAASpE;gBAAGC,GAAGoN,UAAUpN;cAAE,IAAI;gBAAED,GAAGqN,UAAUrN;gBAAGC,GAAGmE,SAASnE;cAAE;YAC3G;UACF;AAEA,gBAAMqN,kBAAkBrF,WAAWmF,kBAAkB;YACnDlF,MAAM2D;YACN1D,MAAM2D;UACR,CAAA;AAEA,cAAI,KAAK,eAAe,GAAG;AACzBjF,0BAAc2C,KAAK8D;UACrB,WAAW,KAAK,eAAe,GAAG;AAChCzG,0BAAc6C,KAAK4D;UACrB,OAAO;AACL;UACF;AAEA,eAAKlR,SAASyK;AACd,eAAK,YAAYA,eAAeZ,KAAAA;AAChC,eAAKoB,cAAa;AAClB;QACF;AAEA;MACF;AAEA,UAAI,KAAKlL,eAAeuE,WAAWC,QAAQ;AACzC,cAAMvE,SAAS,KAAK,iBAAgB;AAEpC,YAAIA,UAAU,KAAK,6BAA6BgI,UAAUhI,MAAAA,GAAS;AACjE,eAAK,sBAAsB;AAC3B,eAAK,cAAc;AACnB,eAAKiL,cAAa;AAClB;QACF;AAEA,cAAMzG,UAAU,KAAK,0BAA0BwD,QAAAA;AAC/C,aAAK,sBAAsBxD;AAC3B,YAAI,CAACA,SAAS;AACZ,eAAK,cAAc;AACnB,eAAKyG,cAAa;AAClB;QACF;MACF,OAAO;AACL,aAAK,sBAAsB;MAC7B;AAEA,WAAK,cAAcjD;AACnB,WAAKiD,cAAa;IACpB,GAAA,KA0KSvJ,kBAAkB,CAACmI,UAAAA;AAC1B,YAAMsH,gBAAgB,KAAK;AAE3B,UAAI,KAAK5Q,YAAY6Q,kBAAkBvH,MAAM4G,SAAS,GAAG;AACvD,aAAKlQ,WAAW8Q,sBAAsBxH,MAAM4G,SAAS;MACvD;AAEA,WAAK,cAAc;AACnB,WAAK,aAAa;AAClB,WAAK,YAAY;AACjB,WAAK,mBAAmB;AACxB,WAAK,eAAe;AACpB,WAAK,eAAe;AACpB,WAAK,sBAAsB;AAE3B,UAAIU,kBAAkB,QAAQ,KAAKpR,eAAeuE,WAAWC,QAAQ;AACnE,aAAK,mBAAmB4M,eAAetH,KAAAA;MACzC;AACA,WAAKoB,cAAa;IACpB,GAAA,KAEStJ,qBAAqB,CAACkI,UAAAA;AAC7B,UAAI,KAAK,aAAa;AACpB,aAAKnI,gBAAgBmI,KAAAA;MACvB;AAEA,WAAK,eAAe;AACpB,WAAK,cAAc;AACnB,WAAK,eAAe;AACpB,WAAK,sBAAsB;AAC3B,WAAKoB,cAAa;IACpB;;AAsGF;AAEA,IAAMqG,OAAO,CAACC,GAAWC,GAAW9J,MAAsB6J,KAAKC,IAAID,KAAK7J;AAExE,IAAM+J,YAAY,CAACrE,IAAWE,IAAW5F,MAAAA;AACvC,SAAO;IACL9D,GAAG0N,KAAKlE,GAAGxJ,GAAG0J,GAAG1J,GAAG8D,CAAAA;IACpB7D,GAAGyN,KAAKlE,GAAGvJ,GAAGyJ,GAAGzJ,GAAG6D,CAAAA;EACtB;AACF;AAGA,IAAMgK,YAAY,CAAC9N,GAAW+N,IAAWrK,KAAYC,KAAYqK,OAAAA;AAC/D,MAAIC,OAAO;AACX,MAAIC,OAAO;AACX,MAAIpK,IAAI;AACR,QAAMqK,YAAY;AAClB,QAAMC,gBAAgB;AAGtB,WAASrH,IAAI,GAAGA,IAAIqH,eAAerH,KAAK;AACtC,UAAMsH,MAAM,IAAIvK,MAAM,IAAIiK,GAAG/N,IAAI,KAAK,IAAI8D,MAAM,IAAIA,IAAIJ,IAAI1D,IAAI,KAAK,IAAI8D,KAAKA,KAAK,IAAIH,IAAI3D,IAAI8D,KAAK,IAAIkK,GAAGhO;AAE3G,QAAIS,KAAKiG,IAAI2H,KAAKrO,CAAAA,IAAKmO,WAAW;AAChC,aAAOrK;IACT;AAEA,QAAIuK,KAAKrO,GAAG;AACViO,aAAOnK;IACT,OAAO;AACLoK,aAAOpK;IACT;AACAA,SAAKmK,OAAOC,QAAQ;EACtB;AAEA,SAAOpK;AACT;AAEA,IAAMwE,oBAAoB,CACxBxD,MACAC,MACAX,aAAAA;AAEA,QAAMV,MAAM;IACV1D,GAAG8E,KAAK9E,KAAK8E,KAAKnF,UAAU;IAC5BM,GAAG6E,KAAK7E,KAAK6E,KAAKhF,UAAU;EAC9B;AACA,QAAM6D,MAAM;IACV3D,GAAG+E,KAAK/E,KAAK+E,KAAKrF,SAAS;IAC3BO,GAAG8E,KAAK9E,KAAK8E,KAAKlF,SAAS;EAC7B;AAEA,QAAMyO,YAAYxJ,KAAKnF,UAAUmF,KAAKhF,UAAUiF,KAAKrF,SAASqF,KAAKlF;AAEnE,MAAI,CAACyO,WAAW;AACd,WAAO;EACT;AAGA,QAAMxK,IAAIgK,UAAU1J,SAASpE,GAAG8E,MAAMpB,KAAKC,KAAKoB,IAAAA;AAEhD,QAAMwJ,MAAMV,UAAU/I,MAAMpB,KAAKI,CAAAA;AACjC,QAAM0K,MAAMX,UAAUnK,KAAKC,KAAKG,CAAAA;AAChC,QAAM2K,MAAMZ,UAAUlK,KAAKoB,MAAMjB,CAAAA;AAEjC,QAAM4K,OAAOb,UAAUU,KAAKC,KAAK1K,CAAAA;AACjC,QAAM6K,OAAOd,UAAUW,KAAKC,KAAK3K,CAAAA;AAEjC,QAAM8K,QAAQf,UAAUa,MAAMC,MAAM7K,CAAAA;AAEpC,QAAM0E,WAAwB;IAC5BxI,GAAG4O,MAAM5O;IACTC,GAAG2O,MAAM3O;IACTP,OAAOgP,KAAK1O,IAAI4O,MAAM5O;IACtBH,OAAO6O,KAAKzO,IAAI2O,MAAM3O;IACtBN,QAAQgP,KAAK3O,IAAI4O,MAAM5O;IACvBF,QAAQ6O,KAAK1O,IAAI2O,MAAM3O;IACvByF,UAAU;IACVD,cAAcX,KAAKW,iBAAiB,SAASV,KAAKU;EACpD;AACAY,sBAAoBmC,QAAAA;AAEpB,QAAMD,UAAuB;IAC3B,GAAGzD;IACHnF,QAAQ4O,IAAIvO,IAAI8E,KAAK9E;IACrBF,QAAQyO,IAAItO,IAAI6E,KAAK7E;EACvB;AAEA,QAAMwI,UAAuB;IAC3B,GAAG1D;IACHrF,OAAO+O,IAAIzO,IAAI+E,KAAK/E;IACpBH,OAAO4O,IAAIxO,IAAI8E,KAAK9E;EACtB;AAEA,SAAO;IACL6E,MAAMyD;IACNC;IACAzD,MAAM0D;EACR;AACF;AAEA,IAAMzE,+BAA+B,CAACF,GAAWiK,IAAWrK,KAAYC,KAAYqK,OAAAA;AAClF,QAAMO,MAAMV,UAAUE,IAAIrK,KAAKI,CAAAA;AAC/B,QAAM0K,MAAMX,UAAUnK,KAAKC,KAAKG,CAAAA;AAChC,QAAM2K,MAAMZ,UAAUlK,KAAKqK,IAAIlK,CAAAA;AAE/B,QAAM4K,OAAOb,UAAUU,KAAKC,KAAK1K,CAAAA;AACjC,QAAM6K,OAAOd,UAAUW,KAAKC,KAAK3K,CAAAA;AAEjC,SAAO+J,UAAUa,MAAMC,MAAM7K,CAAAA;AAC/B;;;AI58CA,SAAS+K,QAAAA,cAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAgGeC;IAAAA;IAAAA;IAAAA;IAIzBC;IAGAC;IAGAC;IAAAA;;SAhFVC,UAAU;EACTC,KAAK;EACLC,QAAQC;EACRC,WAAAA;AACE,QAAI,KAAKC,eAAeC,WAAWC,UAAU,CAACC,MAAMC,QAAQ,KAAKC,MAAM,GAAG;AACxE,aAAO;IACT;AAEA,UAAMC,eAAe,KAAKC;AAC1B,QAAID,iBAAiB,MAAM;AACzB,aAAO;IACT;AAEA,UAAMD,SAAS,KAAKA;AACpB,UAAMG,gBAAgBH,OAAOC,YAAAA;AAC7B,QAAI,CAACE,eAAe;AAClB,aAAO;IACT;AAEA,UAAMC,eAAeH,eAAe,KAAKA,eAAeD,OAAOK,SAAS;AACxE,QAAI,CAACD,cAAc;AACjB,aAAO;IACT;AAEA,UAAME,cAAcH,cAAcI,UAAUC,UAAaL,cAAcM,UAAUD;AACjF,UAAME,eAAeP,cAAcQ,WAAWH,UAAaL,cAAcS,WAAWJ;AACpF,UAAMK,eAAeP,eAAeI;AAEpC,WAAOI;;;;kCAIuBX,cAAcY,WAAW,WAAW,UAAA;mBACnD,KAAKC,uBAAuB;;;;;;kCAMbb,cAAcc,iBAAiB,SAASd,cAAcY,WAAW,WAAW,UAAA;mBAC3F,KAAKG,wBAAwB;sBAC1B,CAACf,cAAcY,QAAQ;;;;UAKnCF,eACIC;;;;uBAIS,KAAKK,qBAAqB;;;;cAKnCL;;;;uBAIS,KAAKM,kBAAkB;;;;WAInC;;;EAIT;AACF,CAAA,GAAAC,UAIGC,KAAiB;EAAEC,SAAS;AAAK,CAAA,GAAAC,UAGjCF,KAAuC;EAAEG,MAAMC;EAAQH,SAAS;AAAM,CAAA,GAAAI,UAGtEL,KAAoB;EAAEG,MAAMG;EAAQL,SAAS;EAAOM,cAAc;AAAK,CAAA;AATnE,IAAMC,iBAAN,eAA6BC,iBAAAA,aAAAA;;WAIzBpC,mBAGAK,eAGAE,2BAAAA,YAAAA,GAAAA,GAAAA,CAAAA,iBAAAA,YAAAA,EAAAA,IAAAA,qBAAAA,MAAAA;;;;QANAP;;;;;QAGAK;;;;;QAGAE;;;;OAVyB6B,cAAAA;;EAIzBpC;MAAAA,aAAAA;gBAAAA;;MAAAA,WAAAA,IAAAA;SAAAA,2BAAU;;EAGVK;MAAAA,SAAAA;gBAAAA;;MAAAA,OAAAA,IAAAA;SAAAA,uBAAM;;EAGNE;MAAAA,qBAAAA;gBAAAA;;MAAAA,mBAAAA,IAAAA;SAAAA,mCAAkB;;EAE3B;EAQA;EAOA;EAMA;EA8IA,qBAAqB8B,OAAoBC,OAAejC,QAAoB;AAC1E,UAAMkC,OAAOlC,OAAOiC,QAAQ,CAAA;AAC5B,UAAME,OAAOnC,OAAOiC,QAAQ,CAAA;AAE5B,QAAIG,QAAQJ,MAAMrB,UAAU,EAAEqB,MAAMzB,SAAS;AAC7C,QAAI8B,QAAQL,MAAMpB,UAAU,EAAEoB,MAAMvB,SAAS;AAE7C,QAAI2B,UAAU,KAAKC,UAAU,GAAG;AAC9B,UAAIC,OAAO;AACX,UAAIC,OAAO;AAEX,UAAIL,QAAQC,MAAM;AAChBG,eAAOH,KAAKK,IAAIN,KAAKM;AACrBD,eAAOJ,KAAKM,IAAIP,KAAKO;MACvB,WAAWN,MAAM;AACfG,eAAOH,KAAKK,IAAIR,MAAMQ;AACtBD,eAAOJ,KAAKM,IAAIT,MAAMS;MACxB,WAAWP,MAAM;AACfI,eAAON,MAAMQ,IAAIN,KAAKM;AACtBD,eAAOP,MAAMS,IAAIP,KAAKO;MACxB,OAAO;AACLH,eAAO;AACPC,eAAO;MACT;AAEA,YAAMG,YAAYC,gBAAgBL,MAAMC,IAAAA;AACxC,YAAMlC,SAASuC;AAEfZ,YAAMzB,QAAQ,CAACmC,UAAUG,KAAKxC;AAC9B2B,YAAMvB,QAAQ,CAACiC,UAAUI,KAAKzC;AAC9B2B,YAAMrB,SAAS+B,UAAUG,KAAKxC;AAC9B2B,YAAMpB,SAAS8B,UAAUI,KAAKzC;AAC9B+B,cAAQJ,MAAMrB;AACd0B,cAAQL,MAAMpB;IAChB;AAEA,QAAIwB,UAAU,KAAKC,UAAU,GAAG;AAC9B;IACF;AAEA,UAAMU,aAAaJ,gBAAgBP,OAAOC,KAAAA;AAC1C,UAAMW,kBAAkBC,aAAab,OAAOC,KAAAA;AAE5C,UAAMa,WAAWD,aAAajB,MAAMzB,SAAS,GAAGyB,MAAMvB,SAAS,CAAA,KAAMuC;AACrEhB,UAAMzB,QAAQ,CAACwC,WAAWF,KAAKK;AAC/BlB,UAAMvB,QAAQ,CAACsC,WAAWD,KAAKI;AAE/B,UAAMC,YAAYF,aAAajB,MAAMrB,UAAU,GAAGqB,MAAMpB,UAAU,CAAA,KAAMoC;AACxEhB,UAAMrB,SAASoC,WAAWF,KAAKM;AAC/BnB,UAAMpB,SAASmC,WAAWD,KAAKK;EACjC;EAEA,mBAAmBnB,OAAkB;AACnC,QAAI,CAACA,MAAMjB,UAAU;AACnBiB,YAAMf,eAAe;AACrB;IACF;AAEA,UAAMkC,YAAYF,aAAajB,MAAMrB,UAAU,GAAGqB,MAAMpB,UAAU,CAAA;AAClE,UAAMsC,WAAWD,aAAajB,MAAMzB,SAAS,GAAGyB,MAAMvB,SAAS,CAAA;AAC/D,UAAM2C,eAAeC,KAAKC,IAAIH,WAAWD,QAAAA;AAEzC,QAAIE,gBAAgB,GAAG;AACrB;IACF;AAEA,QAAID,YAAY,GAAG;AACjB,YAAMI,eAAeZ,gBAAgBX,MAAMrB,UAAU,GAAGqB,MAAMpB,UAAU,CAAA;AACxEoB,YAAMrB,SAAS4C,aAAaV,KAAKO;AACjCpB,YAAMpB,SAAS2C,aAAaT,KAAKM;IACnC,WAAWF,WAAW,GAAG;AACvB,YAAMM,cAAcb,gBAAgBX,MAAMzB,SAAS,GAAGyB,MAAMvB,SAAS,CAAA;AACrEuB,YAAMrB,SAAS,CAAC6C,YAAYX,KAAKO;AACjCpB,YAAMpB,SAAS,CAAC4C,YAAYV,KAAKM;IACnC;AAEA,QAAIF,WAAW,GAAG;AAChB,YAAMM,cAAcb,gBAAgBX,MAAMzB,SAAS,GAAGyB,MAAMvB,SAAS,CAAA;AACrEuB,YAAMzB,QAAQiD,YAAYX,KAAKO;AAC/BpB,YAAMvB,QAAQ+C,YAAYV,KAAKM;IACjC,WAAWD,YAAY,GAAG;AACxB,YAAMI,eAAeZ,gBAAgBX,MAAMrB,UAAU,GAAGqB,MAAMpB,UAAU,CAAA;AACxEoB,YAAMzB,QAAQ,CAACgD,aAAaV,KAAKO;AACjCpB,YAAMvB,QAAQ,CAAC8C,aAAaT,KAAKM;IACnC;EACF;;;;;AApQK,UAAA,GAAA,IAAA,GAAA,KAIIzD,4BAAU8D,aAAA,IAAA,GAAV9D,kBAAAA,IAAAA,IAAAA,KAGAK,uBAAAA,cAAAA,IAAAA,GAAAA,KAGAE,mCAAAA,0BAAAA,MAAoC,IAAA,GAAA,KAE7C,kBAAkB,MAAA;AAChB,YAAMwD,OAAO,KAAKC,YAAW;AAC7B,UAAID,gBAAgBE,cAAcF,KAAKG,gBAAgB9B,aAAa;AAClE,eAAO2B,KAAKG;MACd;AACA,aAAO;IACT,GAAA,KAEA,mBAAmB,MAAA;AACjB,UAAI,CAAC/D,MAAMC,QAAQ,KAAKC,MAAM,GAAG;AAC/B,eAAO;MACT;AACA,aAAO,KAAKA;IACd,GAAA,KAEA,cAAc,CAASyB,MAAqBqC,OAAeC,UAAAA;AACzD,YAAMC,SAAS,KAAK,gBAAe;AACnC,YAAMC,SAAqC;QAAEH;QAAOC;MAAM;AAC1DG,MAAAA,sBAAqBF,QAAQvC,MAAMwC,MAAAA;IACrC,GAAA,KAEA,cAAc,CAACjE,QAAsB+D,UAAAA;AACnC,WAAK/D,SAASA;AACd,WAAK,YAAY,iBAAiBA,QAAQ+D,KAAAA;IAC5C,GAAA,KAES/C,0BAA0B,CAAC+C,UAAAA;AAClCA,YAAMI,eAAc;AACpB,YAAMnE,SAAS,KAAK,iBAAgB;AACpC,UAAI,CAACA,QAAQ;AACX;MACF;AAEA,YAAMiC,QAAQ,KAAK/B;AACnB,UAAI+B,UAAU,MAAM;AAClB;MACF;AAEA,YAAMD,QAAQhC,OAAOiC,KAAAA;AACrB,UAAI,CAACD,OAAO;AACV;MACF;AAEA,YAAMoC,gBAAgB;WAAIpE;;AAC1B,YAAMqE,eAAe;QAAE,GAAGrC;MAAM;AAChCoC,oBAAcnC,KAAAA,IAASoC;AAEvB,YAAMC,YAAY,CAACD,aAAatD;AAChC,UAAIuD,WAAW;AACb,aAAK,qBAAqBD,cAAcpC,OAAOjC,MAAAA;AAC/CqE,qBAAapD,eAAe;AAC5B,aAAK,mBAAmBoD,YAAAA;MAC1B,OAAO;AACLA,qBAAapD,eAAe;MAC9B;AACAoD,mBAAatD,WAAWuD;AAExB,YAAMC,mBAAmBC,sBAAsBJ,aAAAA;AAC/C,WAAK,YAAYG,kBAAkBR,KAAAA;AACnC,WAAK7D,qBAAqB+B;AAC1B,WAAK,YAAY,sBAAsBA,OAAO8B,KAAAA;IAChD,GAAA,KAES7C,2BAA2B,CAAC6C,UAAAA;AACnCA,YAAMI,eAAc;AACpB,YAAMnE,SAAS,KAAK,iBAAgB;AACpC,UAAI,CAACA,QAAQ;AACX;MACF;AAEA,YAAMiC,QAAQ,KAAK/B;AACnB,UAAI+B,UAAU,MAAM;AAClB;MACF;AAEA,YAAMD,QAAQhC,OAAOiC,KAAAA;AACrB,UAAI,CAACD,SAAS,CAACA,MAAMjB,UAAU;AAC7B;MACF;AAEA,YAAMqD,gBAAgB;WAAIpE;;AAC1B,YAAMqE,eAAe;QAAE,GAAGrC;MAAM;AAChCoC,oBAAcnC,KAAAA,IAASoC;AAEvB,YAAMC,YAAYD,aAAapD,iBAAiB;AAChDoD,mBAAapD,eAAeqD;AAC5B,UAAIA,WAAW;AACb,aAAK,qBAAqBD,cAAcpC,OAAOjC,MAAAA;AAC/C,aAAK,mBAAmBqE,YAAAA;MAC1B;AAEA,YAAME,mBAAmBC,sBAAsBJ,aAAAA;AAC/C,WAAK,YAAYG,kBAAkBR,KAAAA;AACnC,WAAK7D,qBAAqB+B;AAC1B,WAAK,YAAY,sBAAsBA,OAAO8B,KAAAA;IAChD,GAAA,KAES5C,wBAAwB,CAAC4C,UAAAA;AAChCA,YAAMI,eAAc;AACpB,YAAMnE,SAAS,KAAK,iBAAgB;AACpC,UAAI,CAACA,QAAQ;AACX;MACF;AAEA,YAAMiC,QAAQ,KAAK/B;AACnB,UAAI+B,UAAU,MAAM;AAClB;MACF;AAEA,YAAMwC,gBAAgBzE,OAAOiC,KAAAA;AAC7B,UAAI,CAACwC,eAAe;AAClB;MACF;AAEA,YAAML,gBAAgB;WAAIpE;;AAC1B,YAAMqE,eAA4B;QAAE,GAAGI;MAAc;AACrDL,oBAAcnC,KAAAA,IAASoC;AAEvB,aAAOA,aAAa9D;AACpB,aAAO8D,aAAa5D;AACpB,aAAO4D,aAAa1D;AACpB,aAAO0D,aAAazD;AACpB,aAAOyD,aAAatD;AACpB,aAAOsD,aAAapD;AAEpB,YAAMsD,mBAAmBC,sBAAsBJ,aAAAA;AAC/C,WAAK,YAAYG,kBAAkBR,KAAAA;AACnC,WAAK7D,qBAAqB+B;AAC1B,WAAK,YAAY,sBAAsBA,OAAO8B,KAAAA;IAChD,GAAA,KAES3C,qBAAqB,CAAC2C,UAAAA;AAC7BA,YAAMI,eAAc;AACpB,YAAMnE,SAAS,KAAK,iBAAgB;AACpC,UAAI,CAACA,QAAQ;AACX;MACF;AAEA,YAAMiC,QAAQ,KAAK/B;AACnB,UAAI+B,UAAU,MAAM;AAClB;MACF;AAEA,YAAMD,QAAQhC,OAAOiC,KAAAA;AACrB,UAAI,CAACD,OAAO;AACV;MACF;AAEA,YAAMoC,gBAAgB;WAAIpE;;AAC1B,YAAMqE,eAAe;QAAE,GAAGrC;MAAM;AAChCoC,oBAAcnC,KAAAA,IAASoC;AAEvB,WAAK,qBAAqBA,cAAcpC,OAAOjC,MAAAA;AAC/CqE,mBAAatD,WAAW;AACxBsD,mBAAapD,eAAe;AAC5B,WAAK,mBAAmBoD,YAAAA;AAExB,YAAME,mBAAmBC,sBAAsBJ,aAAAA;AAC/C,WAAK,YAAYG,kBAAkBR,KAAAA;AACnC,WAAK7D,qBAAqB+B;AAC1B,WAAK,YAAY,sBAAsBA,OAAO8B,KAAAA;IAChD;;AAwFF;;;ACrWA,SAASW,QAAAA,cAAiC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IA+FPC;IAAAA;IAAAA;IAAAA;IAAAA;IAAAA;IAAAA;IAIxBC;IASAC;IAGAC;IAGAC;IAGAC;IAUAC;IAAAA;;SAtEVC,UAAU;EACTC,KAAK;EACLC,QAAQC;EACRC,WAAAA;AACE,WAAOC;;;;;;;;mBAQQ,KAAKC,kBAAkB;oBACtB,KAAKC,qBAAqB;;YAElCC,eAAeC,IACf,CAAC,EAAEC,OAAOC,QAAO,GAAIC,UAAUP;cAC7BO,QAAQ,IAAIP,gCAA8B,IAAA;;iCAEvBK,KAAAA;cACnBC,QAAQF,IACR,CAAC,EAAEI,OAAOH,OAAAA,OAAK,MAAOL;2DACuBQ,KAAAA,IAASH,MAAAA,WAAgB,CAAA;WAEzE,CAAA;;;;;mCAMwB,KAAKI,UAAU,YAAY,KAAKC,gBAAgB;yCAC1CC,WAAWC,YAAY;yCACvBD,WAAWE,MAAM;;;;EAIxD;AACF,CAAA,GAAAC,UAIGC,KAAiB;EAAEC,SAAS;AAAK,CAAA,GAAAC,UAGjCF,KAAsD;EACrDG,MAAMC;EACNH,SAAS;EACTI,WAAAA;AACE,SAAKC,uBAAsB;EAC7B;AACF,CAAA,GAAAC,UAGCP,KAAc;EAAEG,MAAMK;EAASP,SAAS;EAAMQ,cAAc;AAAK,CAAA,GAAAC,UAGjEV,KAAc;EAAEG,MAAMK;EAASP,SAAS;EAAMQ,cAAc;AAAM,CAAA,GAAAE,UAGlEX,KAAa;EAAEG,MAAMS;EAAQX,SAAS;EAAMQ,cAAc;AAAE,CAAA,GAAAI,UAG5Db,KAAmC;EAClCG,MAAMS;EACNX,SAAS;EACTQ,cAAc;EACdJ,SAA8BZ,OAAoB;AAChD,SAAKqB,mCAAmCrB,KAAAA;EAC1C;AACF,CAAA;AA/BK,IAAMsB,gBAAN,eAA4BC,iBAAAA,aAAAA;;WAIxBtB,mBASAuB,eAGAC,iBAGAC,mBAGAC,iBAUAC,2BAAAA,YAAAA,GAAAA,GAAAA,CAAAA,gBAAAA,YAAAA,EAAAA,IAAAA,qBAAAA,MAAAA;;;;QA5BA3B;;;;;QASAuB;;;;;QAGAC;;;;;QAGAC;;;;;QAGAC;;;;;QAUAC;;;;OAhCwBL,cAAAA;;EAIxBtB;MAAAA,aAAAA;gBAAAA;;MAAAA,WAAAA,IAAAA;SAAAA,2BAAU;;EASVuB;MAAAA,SAAAA;gBAAAA;;MAAAA,OAAAA,IAAAA;SAAAA,uBAAM;;EAGNC;MAAAA,WAAAA;gBAAAA;;MAAAA,SAAAA,IAAAA;SAAAA,yBAAQ;;EAGRC;MAAAA,aAAAA;gBAAAA;;MAAAA,WAAAA,IAAAA;SAAAA,2BAAU;;EAGVC;MAAAA,WAAAA;gBAAAA;;MAAAA,SAAAA,IAAAA;SAAAA,yBAAQ;;EAURC;MAAAA,qBAAAA;gBAAAA;;MAAAA,mBAAAA,IAAAA;SAAAA,mCAAkB;;EAK3B,iBAAiB5B,OAAoB;AACnC,QAAI,KAAKP,uBAAuBO,OAAO;AACrC;IACF;AACA,SAAKP,qBAAqBO;AAC1B,SAAK6B,cAAa;EACpB;EAEA,qBAAkB;AAChB,QAAI,KAAKpC,uBAAuB,MAAM;AACpC;IACF;AACA,SAAKA,qBAAqB;AAC1B,SAAKoC,cAAa;EACpB;EAEAR,mCAAmCS,QAA6B;AAC9D,SAAKD,cAAa;EACpB;EAEAhB,yBAA+B;AAC7B,QAAI,KAAKkB,kBAAkB;AACzB;IACF;AACA,SAAK,mBAAkB;EACzB;EAEA,IAAIC,mBAA4B;AAC9B,UAAMR,SAAS,KAAK,iBAAgB;AACpC,WAAOA,WAAW,QAAQA,OAAOS,UAAUC;EAC7C;EAEA,IAAIC,mBAA4B;AAC9B,UAAMX,SAAS,KAAK,iBAAgB;AACpC,WAAOA,WAAW,QAAQA,OAAOS,UAAUG;EAC7C;EAEA;EAQA;EAQAC,8BAAqD;AACnD,UAAMb,SAAS,KAAK,iBAAgB;AAEpC,QAAI,CAACA,QAAQ;AACX,aAAO;IACT;AAEA,QAAIA,OAAOS,SAASG,mBAAmB;AACrC,aAAO5C;;;;;IAKT;AAEA,UAAM8C,eAAe,KAAKV;AAE1B,QAAIU,iBAAiB,MAAM;AACzB,aAAO9C;;;;;;;IAOT;AAEA,UAAM+C,gBAAgBf,OAAOc,YAAAA;AAC7B,QAAI,CAACC,eAAe;AAClB,aAAO;IACT;AAEA,UAAMC,gBAAgBF,eAAe,IAAIA,eAAe,IAAI;AAC5D,UAAMG,YAAYH,eAAed,OAAOS,SAAS,IAAIK,eAAe,IAAI;AAExE,UAAMI,eAAeJ,eAAe,KAAKA,eAAed,OAAOS,SAAS;AAExE,UAAMU,YAAY,IAAIJ,cAAcK,IAAI,KAAKC,QAAQ,CAAA,CAAA,OAASN,cAAcO,IAAI,KAAKD,QAAQ,CAAA,CAAA;AAC7F,UAAME,YAAYR,cAAcS,WAAW,WAAW;AACtD,UAAMC,cAAcV,cAAcW,UAAUC,UAAaZ,cAAca,UAAUD;AACjF,UAAME,eAAed,cAAce,WAAWH,UAAaZ,cAAcgB,WAAWJ;AACpF,UAAMK,eAAeP,eAAeI;AAEpC,WAAO7D;;;;;;;uBAOY,CAACiE,UAAiB,KAAK,YAAYA,OAAOjB,aAAAA,CAAAA;0BACvCA,kBAAkB,IAAA;;;;;uBAKrBF,eAAe,CAAA;sBAChBK,SAAAA;uBACCI,SAAAA;;;;;uBAKA,CAACU,UAAiB,KAAK,YAAYA,OAAOhB,SAAAA,CAAAA;0BACvCA,cAAc,IAAA;;;;;;;;;;;;;;yBAcfF,cAAcK,EAAEC,QAAQ,CAAA,CAAA;;4BAErB,CAACH,YAAAA;0BACH,KAAK,sBAAsB;;;;;;;;;;yBAU5BH,cAAcO,EAAED,QAAQ,CAAA,CAAA;;0BAEvB,KAAK,sBAAsB;;;;;;0BAM3B,CAACH,gBAAgBlB,OAAOS,UAAUG,iBAAAA;uBACrC,KAAK,0BAA0B;;;;;;YAO1CM,eACIlD;;;;8CAI8B,CAAC+C,cAAcS,WAAW,WAAW,EAAA;;+BAEpD,KAAK,sBAAsB;;;;;;8CAMZT,cAAcS,WAAW,WAAW,EAAA;;+BAEnD,KAAK,sBAAsB;;;;;;8CAMZT,cAAcS,WAAW,WAAW,EAAA;;+BAEnD,KAAK,sBAAsB;;sCAEpBT,cAAcS,WAAW,OAAO,KAAA;;;;8CAIxBT,cAAcmB,iBAAiB,QAAQ,WAAW,EAAA;;+BAEjE,KAAK,sBAAsB;kCACxB,CAACnB,cAAcS,QAAQ;;uCAElBT,cAAcmB,iBAAiB,QAAQ,QAAQ,IAAA;;;;;;;;;+BASvD,KAAK,oBAAoB;kCACtB,CAACF,YAAAA;;;;;;;;+BAQJ,KAAK,oBAAoB;kCACtB,CAACP,WAAAA;;;;;;;;+BAQJ,KAAK,oBAAoB;kCACtB,CAACI,YAAAA;;;;;oBAMnB,KAAK,8BAA8Bd,eAAeD,YAAAA,CAAAA;;;;EAKhE;EAEA;EAqEA;EAUA;EA0EA,qBAAqBqB,OAAoB5D,OAAeyB,QAAoB;AAC1E,UAAMoC,OAAOpC,OAAOzB,QAAQ,CAAA;AAC5B,UAAM8D,OAAOrC,OAAOzB,QAAQ,CAAA;AAE5B,QAAI+D,QAAQH,MAAML,UAAU,EAAEK,MAAMT,SAAS;AAC7C,QAAIa,QAAQJ,MAAMJ,UAAU,EAAEI,MAAMP,SAAS;AAE7C,QAAIU,UAAU,KAAKC,UAAU,GAAG;AAC9B,UAAIC,OAAO;AACX,UAAIC,OAAO;AAEX,UAAIL,QAAQC,MAAM;AAChBG,eAAOH,KAAKjB,IAAIgB,KAAKhB;AACrBqB,eAAOJ,KAAKf,IAAIc,KAAKd;MACvB,WAAWe,MAAM;AACfG,eAAOH,KAAKjB,IAAIe,MAAMf;AACtBqB,eAAOJ,KAAKf,IAAIa,MAAMb;MACxB,WAAWc,MAAM;AACfI,eAAOL,MAAMf,IAAIgB,KAAKhB;AACtBqB,eAAON,MAAMb,IAAIc,KAAKd;MACxB,OAAO;AACLkB,eAAO;AACPC,eAAO;MACT;AAEA,YAAMC,YAAYC,gBAAgBH,MAAMC,IAAAA;AACxC,YAAMhC,SAASmC;AAEfT,YAAMT,QAAQ,CAACgB,UAAUG,KAAKpC;AAC9B0B,YAAMP,QAAQ,CAACc,UAAUI,KAAKrC;AAC9B0B,YAAML,SAASY,UAAUG,KAAKpC;AAC9B0B,YAAMJ,SAASW,UAAUI,KAAKrC;AAC9B6B,cAAQH,MAAML;AACdS,cAAQJ,MAAMJ;IAChB;AAEA,QAAIO,UAAU,KAAKC,UAAU,GAAG;AAC9B;IACF;AAEA,UAAMQ,aAAaJ,gBAAgBL,OAAOC,KAAAA;AAC1C,UAAMS,kBAAkBC,aAAaX,OAAOC,KAAAA;AAE5C,UAAMW,WAAWD,aAAad,MAAMT,SAAS,GAAGS,MAAMP,SAAS,CAAA,KAAMoB;AACrEb,UAAMT,QAAQ,CAACqB,WAAWF,KAAKK;AAC/Bf,UAAMP,QAAQ,CAACmB,WAAWD,KAAKI;AAE/B,UAAMC,YAAYF,aAAad,MAAML,UAAU,GAAGK,MAAMJ,UAAU,CAAA,KAAMiB;AACxEb,UAAML,SAASiB,WAAWF,KAAKM;AAC/BhB,UAAMJ,SAASgB,WAAWD,KAAKK;EACjC;EAEA,mBAAmBhB,OAAkB;AACnC,QAAI,CAACA,MAAMX,UAAU;AACnBW,YAAMD,eAAe;AACrB;IACF;AAEA,UAAMiB,YAAYF,aAAad,MAAML,UAAU,GAAGK,MAAMJ,UAAU,CAAA;AAClE,UAAMmB,WAAWD,aAAad,MAAMT,SAAS,GAAGS,MAAMP,SAAS,CAAA;AAC/D,UAAMwB,eAAeC,KAAKC,IAAIH,WAAWD,QAAAA;AAEzC,QAAIE,gBAAgB,GAAG;AACrB;IACF;AAEA,QAAID,YAAY,GAAG;AACjB,YAAMI,eAAeZ,gBAAgBR,MAAML,UAAU,GAAGK,MAAMJ,UAAU,CAAA;AACxEI,YAAML,SAASyB,aAAaV,KAAKO;AACjCjB,YAAMJ,SAASwB,aAAaT,KAAKM;IACnC,WAAWF,WAAW,GAAG;AACvB,YAAMM,cAAcb,gBAAgBR,MAAMT,SAAS,GAAGS,MAAMP,SAAS,CAAA;AACrEO,YAAML,SAAS,CAAC0B,YAAYX,KAAKO;AACjCjB,YAAMJ,SAAS,CAACyB,YAAYV,KAAKM;IACnC;AAEA,QAAIF,WAAW,GAAG;AAChB,YAAMM,cAAcb,gBAAgBR,MAAMT,SAAS,GAAGS,MAAMP,SAAS,CAAA;AACrEO,YAAMT,QAAQ8B,YAAYX,KAAKO;AAC/BjB,YAAMP,QAAQ4B,YAAYV,KAAKM;IACjC,WAAWD,YAAY,GAAG;AACxB,YAAMI,eAAeZ,gBAAgBR,MAAML,UAAU,GAAGK,MAAMJ,UAAU,CAAA;AACxEI,YAAMT,QAAQ,CAAC6B,aAAaV,KAAKO;AACjCjB,YAAMP,QAAQ,CAAC2B,aAAaT,KAAKM;IACnC;EACF;EAEA;EAuDA,8BAA8BjB,OAAoB5D,OAAa;AAC7D,UAAMkF,UAAUlF,UAAU;AAC1B,UAAMmF,YAA0BD,UAAU,QAAQ;AAClD,UAAME,cAAcF,UAAU,aAAa;AAC3C,UAAMG,YACJF,cAAc,QACVvB,MAAML,WAAWH,UAAaQ,MAAMJ,WAAWJ,SAC/CQ,MAAMT,UAAUC,UAAaQ,MAAMP,UAAUD;AAEnD,WAAO3D;6DACkD2F,WAAAA;;;;wBAIrCD,SAAAA;mBACL,KAAK,wBAAwB;sBAC1BE,SAAAA;;gBAEND,WAAAA;;;;;wBAKQD,SAAAA;mBACL,KAAK,oBAAoB;sBACtB,CAACE,SAAAA;;mBAEJD,WAAAA;;;;EAIjB;EAEA;EA6CA,sBAAsBxB,OAAoB0B,UAAuBC,QAAoB;AACnF,UAAMjB,KAAKgB,SAASzC,IAAIe,MAAMf;AAC9B,UAAM0B,KAAKe,SAASvC,IAAIa,MAAMb;AAE9B,UAAMoB,YAAYC,gBAAgBE,IAAIC,EAAAA;AACtC,UAAMiB,oBAAoBD,WAAW,QAAQ;MAAEjB,IAAI;MAAGC,IAAI;IAAE,IAAI;MAAED,IAAI;MAAIC,IAAI;IAAE;AAChF,UAAMkB,iBAAiBtB,UAAUG,OAAO,KAAKH,UAAUI,OAAO,IAAIiB,oBAAoBrB;AAEtF,UAAMuB,MAAMZ,KAAKa,IAAIrB,EAAAA;AACrB,UAAMsB,aAAaF,MAAM,IAAIA,MAAM,MAAMG,mBAAmB;AAC5D,UAAM3D,SAAS4C,KAAKgB,IAAIzB,uBAAuBS,KAAKC,IAAIc,mBAAmB,KAAKD,UAAAA,CAAAA;AAEhF,QAAIL,WAAW,OAAO;AACpB3B,YAAML,SAASkC,eAAenB,KAAKpC;AACnC0B,YAAMJ,SAASiC,eAAelB,KAAKrC;IACrC,OAAO;AACL0B,YAAMT,QAAQsC,eAAenB,KAAKpC;AAClC0B,YAAMP,QAAQoC,eAAelB,KAAKrC;IACpC;AAEA0B,UAAMX,WAAW;AACjBW,UAAMD,eAAe;EACvB;EAEA,qBAAqB3D,OAAe0D,OAAY;AAC9C,UAAMjC,SAAS,KAAK,iBAAgB;AAEpC,QAAI,CAACA,UAAUA,OAAOS,UAAUG,mBAAmB;AACjD;IACF;AAEA,QAAIrC,SAAS,KAAKA,SAASyB,OAAOS,SAAS,GAAG;AAC5C;IACF;AAEA,UAAM6D,gBAA8BtE,OACjCuE,OAAO,CAACC,GAAGC,eAAeA,eAAelG,KAAAA,EACzCH,IAAI,CAAC+D,UAAAA;AACJ,aAAO;QAAE,GAAGA;MAAM;IACpB,CAAA;AAEF,UAAMuC,mBAAmBC,sBAAsBL,aAAAA;AAC/C,SAAK,YAAYI,kBAAkBzC,KAAAA;AAEnC,UAAMhB,YAAY1C,QAAQ;AAE1B,SAAK6B,qBAAqBa;AAC1B,SAAK,YAAY,sBAAsBA,WAAWgB,KAAAA;EACpD;EAkEA;EAQA;EAaA;EAQA;EAwPA;EAEA;EAWA;;;;;AAzhCK,UAAA,GAAA,IAAA,GAAA,KAIIxD,4BAAUmG,aAAA,IAAA,GAAVnG,kBAAAA,IAAAA,IAAAA,KASAuB,uBAAAA,cAAAA,IAAAA,GAAAA,KAGAC,yBAAAA,gBAAAA,IAAAA,GAAAA,KAGAC,2BAAAA,kBAAAA,IAAAA,GAAAA,KAGAC,yBAAAA,gBAAAA,MAAmB,CAAA,GAAA,KAUnBC,mCAAAA,0BAAAA,MAAoC,IAAA,GAAA,KAErCnC,qBAAoC,MAAA,KACpCsC,mBAAmB,OAAA,KAuC3B,kBAAkB,MAAA;AAChB,YAAMsE,OAAO,KAAKC,YAAW;AAC7B,UAAID,gBAAgBE,cAAcF,KAAKG,gBAAgBjF,aAAa;AAClE,eAAO8E,KAAKG;MACd;AACA,aAAO;IACT,GAAA,KAEA,mBAAmB,MAAA;AACjB,UAAI,CAACC,MAAMC,QAAQ,KAAKlF,MAAM,GAAG;AAC/B,eAAO;MACT;AAEA,aAAO,KAAKA;IACd,GAAA,KAwLA,yBAAyB,CAACiC,UAAAA;AACxB,YAAMkD,SAASlD,MAAMkD;AACrB,UAAI,EAAEA,kBAAkBC,mBAAmB;AACzC;MACF;AAEA,YAAMC,OAAOF,OAAOG,QAAQD;AAC5B,UAAIA,SAAS,OAAOA,SAAS,KAAK;AAChC;MACF;AAEA,YAAMrF,SAAS,KAAK,iBAAgB;AACpC,UAAI,CAACA,QAAQ;AACX;MACF;AAEA,YAAMzB,QAAQ,KAAK6B;AACnB,UAAI7B,UAAU,MAAM;AAClB;MACF;AAEA,YAAMwC,gBAAgBf,OAAOzB,KAAAA;AAC7B,UAAI,CAACwC,eAAe;AAClB;MACF;AAEA,YAAMwE,SAAS5F,OAAO6F,WAAWL,OAAO3G,KAAK;AAE7C,UAAImB,OAAO8F,MAAMF,MAAAA,GAAS;AACxBJ,eAAO3G,QAAQuC,cAAcsE,IAAAA,EAAMhE,QAAQ,CAAA;AAC3C;MACF;AAEA,YAAMiD,gBAA8BtE,OAAO5B,IAAI,CAAC+D,OAAOsC,eAAAA;AACrD,YAAIA,eAAelG,OAAO;AACxB,iBAAO;YAAE,GAAG4D;UAAM;QACpB;AAEA,cAAMuD,UAAuB;UAAE,GAAGvD;QAAM;AAExC,YAAIkD,SAAS,KAAK;AAChB,cAAI9G,UAAU,KAAKA,UAAUyB,OAAOS,SAAS,GAAG;AAC9C,mBAAOiF;UACT;AAEA,gBAAMC,WAAW3F,OAAOzB,QAAQ,CAAA;AAChC,gBAAM8D,OAAOrC,OAAOzB,QAAQ,CAAA;AAC5B,gBAAMqH,OAAOD,WAAWA,SAASvE,IAAIgD,mBAAmB;AACxD,gBAAMyB,OAAOxD,OAAOA,KAAKjB,IAAIgD,mBAAmB;AAChDsB,kBAAQtE,IAAIiC,KAAKgB,IAAIhB,KAAKC,IAAIiC,QAAQK,IAAAA,GAAOC,IAAAA;QAC/C,OAAO;AACLH,kBAAQpE,IAAI+B,KAAKgB,IAAIhB,KAAKC,IAAIiC,QAAQ,CAAA,GAAI,CAAA;QAC5C;AAEA,eAAOG;MACT,CAAA;AAEA,YAAMhB,mBAAmBC,sBAAsBL,aAAAA;AAC/C,WAAK,YAAYI,kBAAkBzC,KAAAA;AACnC,WAAK7B,qBAAqB7B;AAC1B,WAAK,YAAY,sBAAsBA,OAAO0D,KAAAA;AAE9C,YAAM6D,iBAAiBpB,iBAAiBnG,KAAAA;AAExC,UAAIuH,gBAAgB;AAClBX,eAAO3G,QAAQsH,eAAeT,IAAAA,EAAMhE,QAAQ,CAAA;MAC9C;IACF,GAAA,KAEA,6BAA6B,CAACY,UAAAA;AAC5B,YAAM1D,QAAQ,KAAK6B;AAEnB,UAAI7B,UAAU,MAAM;AAClB;MACF;AAEA,WAAK,qBAAqBA,OAAO0D,KAAAA;IACnC,GAAA,KAEA,yBAAyB,CAACA,UAAAA;AACxBA,YAAM8D,eAAc;AACpB,YAAMZ,SAASlD,MAAM+D;AACrB,UAAI,EAAEb,kBAAkBc,oBAAoB;AAC1C;MACF;AAEA,YAAM/G,OAAOiG,OAAOG,QAAQpG;AAC5B,YAAMc,SAAS,KAAK,iBAAgB;AACpC,UAAI,CAACA,QAAQ;AACX;MACF;AAEA,YAAMzB,QAAQ,KAAK6B;AACnB,UAAI7B,UAAU,MAAM;AAClB;MACF;AAEA,YAAM4D,QAAQnC,OAAOzB,KAAAA;AACrB,UAAI,CAAC4D,OAAO;AACV;MACF;AAEA,YAAMmC,gBAAgB;WAAItE;;AAC1B,YAAMkG,eAAe;QAAE,GAAG/D;MAAM;AAChCmC,oBAAc/F,KAAAA,IAAS2H;AAEvB,cAAQhH,MAAAA;QACN,KAAK,UAAU;AACbgH,uBAAa1E,WAAW;AACxB0E,uBAAahE,eAAe;AAC5B;QACF;QACA,KAAK,UAAU;AACb,eAAK,qBAAqBgE,cAAc3H,OAAOyB,MAAAA;AAC/CkG,uBAAa1E,WAAW;AACxB0E,uBAAahE,eAAe;AAC5B,eAAK,mBAAmBgE,YAAAA;AACxB;QACF;QACA,KAAK,gBAAgB;AACnB,gBAAMC,YAAY,CAACD,aAAa1E;AAChC,cAAI2E,WAAW;AACb,iBAAK,qBAAqBD,cAAc3H,OAAOyB,MAAAA;AAC/CkG,yBAAahE,eAAe;AAC5B,iBAAK,mBAAmBgE,YAAAA;UAC1B,OAAO;AACLA,yBAAahE,eAAe;UAC9B;AACAgE,uBAAa1E,WAAW2E;AACxB;QACF;QACA,KAAK,iBAAiB;AACpB,cAAI,CAACD,aAAa1E,UAAU;AAC1B;UACF;AACA,gBAAM2E,YAAYD,aAAahE,iBAAiB;AAChDgE,uBAAahE,eAAeiE;AAC5B,cAAIA,WAAW;AACb,iBAAK,qBAAqBD,cAAc3H,OAAOyB,MAAAA;AAC/C,iBAAK,mBAAmBkG,YAAAA;UAC1B;AACA;QACF;QACA;AACE;MACJ;AAEA,YAAMxB,mBAAmBC,sBAAsBL,aAAAA;AAC/C,WAAK,YAAYI,kBAAkBzC,KAAAA;AACnC,WAAK7B,qBAAqB7B;AAC1B,WAAK,YAAY,sBAAsBA,OAAO0D,KAAAA;IAChD,GAAA,KAyFA,uBAAuB,CAACA,UAAAA;AACtBA,YAAM8D,eAAc;AACpB,YAAMZ,SAASlD,MAAM+D;AACrB,UAAI,EAAEb,kBAAkBc,oBAAoB;AAC1C;MACF;AAEA,YAAMG,OAAQjB,OAAOG,QAAQxB,UAAgD;AAE7E,YAAM9D,SAAS,KAAK,iBAAgB;AACpC,UAAI,CAACA,QAAQ;AACX;MACF;AAEA,YAAMzB,QAAQ,KAAK6B;AACnB,UAAI7B,UAAU,MAAM;AAClB;MACF;AAEA,YAAM+F,gBAAgB;WAAItE;;AAC1B,YAAMqG,gBAAgB/B,cAAc/F,KAAAA;AACpC,UAAI,CAAC8H,eAAe;AAClB;MACF;AAEA,YAAMH,eAA4B;QAAE,GAAGG;MAAc;AACrD/B,oBAAc/F,KAAAA,IAAS2H;AAEvB,YAAMI,iBAAiBF,SAAS,UAAUA,SAAS;AACnD,YAAMG,iBAAiBH,SAAS,UAAUA,SAAS;AAEnD,UAAIE,gBAAgB;AAClB,eAAOJ,aAAaxE;AACpB,eAAOwE,aAAatE;MACtB;AAEA,UAAI2E,gBAAgB;AAClB,eAAOL,aAAapE;AACpB,eAAOoE,aAAanE;MACtB;AAEA,UAAIuE,kBAAkBC,gBAAgB;AACpC,eAAOL,aAAa1E;AACpB,eAAO0E,aAAahE;MACtB,WAAWoE,kBAAkBC,gBAAgB;AAC3CL,qBAAa1E,WAAW;AACxB0E,qBAAahE,eAAe;MAC9B;AAEA,YAAMwC,mBAAmBC,sBAAsBL,aAAAA;AAC/C,WAAK,YAAYI,kBAAkBzC,KAAAA;AACnC,WAAK7B,qBAAqB7B;AAC1B,WAAK,YAAY,sBAAsBA,OAAO0D,KAAAA;IAChD,GAAA,KAmCA,2BAA2B,CAACA,UAAAA;AAC1BA,YAAM8D,eAAc;AACpB,YAAMZ,SAASlD,MAAM+D;AACrB,UAAI,EAAEb,kBAAkBc,oBAAoB;AAC1C;MACF;AAEA,YAAMnC,SAASqB,OAAOG,QAAQxB;AAC9B,UAAIA,WAAW,QAAQA,WAAW,OAAO;AACvC;MACF;AAEA,YAAM9D,SAAS,KAAK,iBAAgB;AACpC,UAAI,CAACA,QAAQ;AACX;MACF;AAEA,YAAMzB,QAAQ,KAAK6B;AACnB,UAAI7B,UAAU,MAAM;AAClB;MACF;AAEA,YAAMiI,gBAAgB1C,WAAW,QAAQvF,QAAQ,IAAIA,QAAQ;AAC7D,YAAMsF,WAAW7D,OAAOwG,aAAAA;AACxB,UAAI,CAAC3C,UAAU;AACb;MACF;AAEA,YAAMS,gBAAgB;WAAItE;;AAC1B,YAAMqG,gBAAgB/B,cAAc/F,KAAAA;AACpC,UAAI,CAAC8H,eAAe;AAClB;MACF;AAEA,YAAMH,eAA4B;QAAE,GAAGG;MAAc;AACrD/B,oBAAc/F,KAAAA,IAAS2H;AAEvB,WAAK,sBAAsBA,cAAcrC,UAAUC,MAAAA;AAEnD,YAAMY,mBAAmBC,sBAAsBL,aAAAA;AAC/C,WAAK,YAAYI,kBAAkBzC,KAAAA;AACnC,WAAK7B,qBAAqB7B;AAC1B,WAAK,YAAY,sBAAsBA,OAAO0D,KAAAA;IAChD,GAAA,KAoDSwE,aAAa,CAACxE,UAAAA;AACrBA,YAAM8D,eAAc;AACpB,WAAK,mBAAkB;AAEvB,UAAI,KAAKtH,eAAeE,WAAWC,cAAc;AAC/C,cAAM8H,YAA8B;UAClCC,IAAI;YAAEvF,GAAG;YAAME,GAAG;UAAI;UACtBsF,IAAI;YAAExF,GAAG;YAAME,GAAG;UAAE;QACtB;AACA,aAAKtB,SAAS0G;AACd,aAAK,YAAY,iBAAiBA,WAAUzE,KAAAA;AAC5C;MACF;AAEA,YAAMyE,WAAyB;QAC7B;UAAEtF,GAAG;UAAGE,GAAG;QAAE;QACb;UAAEF,GAAG;UAAGE,GAAG;QAAE;;AAEf,WAAKtB,SAAS0G;AACd,WAAK,YAAY,iBAAiBA,UAAUzE,KAAAA;AAC5C,WAAK7B,qBAAqB;AAC1B,WAAK,YAAY,sBAAsB,MAAM6B,KAAAA;IAC/C,GAAA,KAES4E,yBAAyB,CAAC5E,UAAAA;AACjCA,YAAM8D,eAAc;AAEpB,YAAM/F,SAAS,KAAK,iBAAgB;AAEpC,UAAI,CAACA,UAAUA,OAAOS,UAAUG,mBAAmB;AACjD;MACF;AAEA,YAAMkG,YAAY9G,OAAOS,SAAS;AAClC,YAAMsG,OAAOD,YAAY,IAAI,IAAIA,YAAY;AAE7C,YAAME,cAA4BhH,OAAO5B,IAAI,CAAC+D,OAAO5D,UAAAA;AACnD,cAAMmH,UAAuB;UAAE,GAAGvD;QAAM;AAExC,YAAI5D,UAAU,GAAG;AACfmH,kBAAQtE,IAAI;QACd,WAAW7C,UAAUuI,WAAW;AAC9BpB,kBAAQtE,IAAI;QACd,OAAO;AACLsE,kBAAQtE,IAAIzB,OAAO6F,YAAYuB,OAAOxI,OAAO8C,QAAQ,CAAA,CAAA;QACvD;AAEA,eAAOqE,QAAQhE;AACf,eAAOgE,QAAQ9D;AACf,eAAO8D,QAAQ5D;AACf,eAAO4D,QAAQ3D;AACf,eAAO2D,QAAQlE;AAEf,eAAOkE;MACT,CAAA;AAEA,YAAMhB,mBAAmBC,sBAAsBqC,WAAAA;AAC/C,WAAK,YAAYtC,kBAAkBzC,KAAAA;AAEnC,UAAI,KAAK7B,uBAAuB,MAAM;AACpC,aAAK,YAAY,sBAAsB,KAAKA,oBAAoB6B,KAAAA;MAClE;IACF,GAAA,KAEA,cAAc,CAACA,OAAc1D,UAAAA;AAC3B0D,YAAM8D,eAAc;AACpB,UAAIxH,UAAU,MAAM;AAClB,aAAK6B,qBAAqB7B;AAC1B,aAAK,YAAY,sBAAsBA,OAAO0D,KAAAA;MAChD;IACF,GAAA,KAEA,iBAAiB,CAAC/C,MAAkB+C,UAAAA;AAClC,UAAI,KAAKxD,eAAeS,MAAM;AAC5B;MACF;AAEA,UAAI,CAAC,KAAKqB,kBAAkB;AAC1B,aAAK,mBAAkB;MACzB;AAEA,WAAK9B,aAAaS;AAClB,WAAK,YAAY,sBAAsBA,MAAM+C,KAAAA;IAC/C,GAAA,KAEA,cAAc,CAACjC,QAAsBiC,UAAAA;AACnC,UAAI,CAAC,KAAK1B,kBAAkB;AAC1B,aAAK,mBAAkB;MACzB;AACA,WAAKP,SAASA;AACd,WAAK,YAAY,iBAAiBA,QAAQiC,KAAAA;IAC5C,GAAA,KAEA,eAAe,CACbjC,QACAd,MACA+H,aACAhF,UAAAA;AAEA,WAAK1B,mBAAmB;AACxB,UAAI,KAAK9B,eAAeS,MAAM;AAC5B,aAAK,eAAeA,MAAM+C,KAAAA;MAC5B;AAEA,WAAKjC,SAASA;AACd,WAAKI,qBAAqB;AAC1B,WAAK,iBAAiB6G,WAAAA;AACtB,WAAK,YAAY,iBAAiBjH,QAAQiC,KAAAA;AAE1C,UAAI/C,SAASP,WAAWE,QAAQ;AAC9B,aAAK,YAAY,sBAAsB,MAAMoD,KAAAA;MAC/C;AAEA,WAAK1B,mBAAmB;IAC1B,GAAA,KAES7B,mBAAmB,CAACuD,UAAAA;AAC3B,YAAMiF,SAASjF,MAAMiF;AAErB,UAAI,CAACA,QAAQ;AACX;MACF;AAEA,YAAM,EAAE1I,OAAOyD,OAAOkF,YAAW,IAAKD;AAEtC,UAAI1I,UAAUG,WAAWC,gBAAgBJ,UAAUG,WAAWE,QAAQ;AACpE,aAAK,mBAAkB;AACvB,aAAK,eAAeL,OAAO2I,eAAelF,KAAAA;MAC5C;IACF,GAAA,KAES/D,wBAAwB,CAAC+D,UAAAA;AAChC,YAAMiF,SAASjF,MAAMiF;AAErB,UAAI,CAACA,QAAQ;AACX;MACF;AAEA,YAAME,WAAWF,OAAO1I;AACxB,YAAM2I,cAAcD,OAAOjF,SAASA;AAEpC,UAAI,OAAOmF,aAAa,UAAU;AAChC;MACF;AAEA,YAAMC,WAAWD,SAASE,KAAI;AAE9B,UAAID,SAAS5G,WAAW,GAAG;AACzB,aAAK,mBAAkB;AACvB;MACF;AAEA,UAAI4G,SAASE,WAAW5I,WAAWC,YAAY,GAAG;AAChD,cAAM2G,SAASiC,sBAAsBH,QAAAA;AACrC,YAAI,CAAC9B,QAAQ;AACX,eAAK,mBAAkB;AACvB;QACF;AACA,aAAK,aAAaA,QAAQ5G,WAAWC,cAAcyI,UAAUF,WAAAA;AAC7D;MACF;AAEA,UAAIE,SAASE,WAAW5I,WAAWE,MAAM,GAAG;AAC1C,cAAM4I,eAAeC,0BAA0BL,QAAAA;AAC/C,YAAI,CAACI,cAAc;AACjB,eAAK,mBAAkB;AACvB;QACF;AAEA,cAAME,iBAAiBC,mBAAmBH,cAAc,GAAA;AACxD,aAAK,aAAaE,gBAAgBhJ,WAAWE,QAAQwI,UAAUF,WAAAA;AAC/D;MACF;AAEA,WAAK,mBAAkB;IACzB,GAAA,KAESU,oBAAoB,CAAC5F,UAAAA;AAC5BA,YAAM8D,eAAc;AACpB,WAAK,eAAepH,WAAWC,cAAcqD,KAAAA;IAC/C,GAAA,KAES6F,qBAAqB,CAAC7F,UAAAA;AAC7BA,YAAM8D,eAAc;AACpB,WAAK,eAAepH,WAAWE,QAAQoD,KAAAA;IACzC,GAAA,KAES8F,iBAAiB,CAAC9F,UAAAA;AACzBA,YAAM8D,eAAc;AAEpB,UAAI,KAAKtH,eAAeE,WAAWE,QAAQ;AACzC;MACF;AAEA,YAAMmB,SAAS,KAAK,iBAAgB;AACpC,UAAI,CAACA,UAAU,KAAKQ,kBAAkB;AACpC;MACF;AAEA,UAAIwH,cAAc;AAClB,UAAIC,aAAa;AAEjB,eAAS1J,QAAQ,GAAGA,QAAQyB,OAAOS,SAAS,GAAGlC,SAAS,GAAG;AACzD,cAAM2J,QAAQlI,OAAOzB,KAAAA;AACrB,cAAM4J,MAAMnI,OAAOzB,QAAQ,CAAA;AAE3B,YAAI,CAAC2J,SAAS,CAACC,KAAK;AAClB;QACF;AAEA,cAAMlE,MAAMkE,IAAI/G,IAAI8G,MAAM9G;AAE1B,YAAI6C,MAAMgE,YAAY;AACpBA,uBAAahE;AACb+D,wBAAczJ;QAChB;MACF;AAEA,YAAM6J,aAAapI,OAAOgI,WAAAA;AAC1B,YAAMK,WAAWrI,OAAOgI,cAAc,CAAA;AAEtC,UAAI,CAACI,cAAc,CAACC,UAAU;AAC5B;MACF;AAEA,YAAMC,mBAAmBC,WAAW;QAClCnH,IAAIgH,WAAWhH,IAAIiH,SAASjH,KAAK;QACjCE,IAAI8G,WAAW9G,IAAI+G,SAAS/G,KAAK;MACnC,CAAA;AACA,YAAMkH,WAAwB;QAC5BpH,GAAGkH,iBAAiBlH;QACpBE,GAAGgH,iBAAiBhH;QACpBI,OAAO;QACPE,OAAO;QACPE,QAAQ;QACRC,QAAQ;QACRP,UAAU;QACVU,cAAc;MAChB;AAEA,YAAMoC,gBAA8B;WAC/BtE,OAAOyI,MAAM,GAAGT,cAAc,CAAA;QACjCQ;WACGxI,OAAOyI,MAAMT,cAAc,CAAA;;AAGhC,YAAMU,gBAAgBV,cAAc;AACpC,YAAMtD,mBAAmBC,sBAAsBL,aAAAA;AAC/C,WAAK,YAAYI,kBAAkBzC,KAAAA;AACnC,WAAK7B,qBAAqBsI;AAC1B,WAAK,YAAY,sBAAsBA,eAAezG,KAAAA;IACxD,GAAA,KAES0G,oBAAoB,CAAC1G,UAAAA;AAC5BA,YAAM8D,eAAc;AAEpB,UAAI,KAAKtH,eAAeE,WAAWE,QAAQ;AACzC;MACF;AAEA,YAAMmB,SAAS,KAAK,iBAAgB;AACpC,UAAI,CAACA,UAAU,KAAKW,kBAAkB;AACpC;MACF;AAEA,UAAIiI,cAAc;AAClB,UAAIC,eAAelJ,OAAOmJ;AAE1B,eAASvK,QAAQ,GAAGA,QAAQyB,OAAOS,SAAS,GAAGlC,SAAS,GAAG;AACzD,cAAMoH,WAAW3F,OAAOzB,QAAQ,CAAA;AAChC,cAAM8D,OAAOrC,OAAOzB,QAAQ,CAAA;AAE5B,YAAI,CAACoH,YAAY,CAACtD,MAAM;AACtB;QACF;AAEA,cAAM0G,OAAO1G,KAAKjB,IAAIuE,SAASvE;AAE/B,YAAI2H,OAAOF,cAAc;AACvBA,yBAAeE;AACfH,wBAAcrK;QAChB;MACF;AAEA,UAAIqK,cAAc,KAAKA,cAAc5I,OAAOS,SAAS,GAAG;AACtD,aAAK,qBAAqBmI,aAAa3G,KAAAA;MACzC;IACF,GAAA,KAES+G,aAAa,CAAC/G,UAAAA;AACrBA,YAAM8D,eAAc;AAEpB,YAAMkD,YAAY,CAAC,KAAKhJ;AACxB,WAAKA,WAAWgJ;AAChB,WAAK,YAAY,eAAeA,WAAWhH,KAAAA;IAC7C,GAAA,KAESiH,mBAAmB,CAACjH,UAAAA;AAC3BA,YAAM8D,eAAc;AAEpB,YAAMkD,YAAY,CAAC,KAAK/I;AACxB,WAAKA,aAAa+I;AAClB,WAAK,YAAY,eAAeA,WAAWhH,KAAAA;IAC7C,GAAA,KAESkH,oBAAoB,CAAClH,UAAAA;AAC5BA,YAAM8D,eAAc;AAEpB,WAAK,gBAAgB,KAAK5F,WAAW,GAAG8B,KAAAA;IAC1C,GAAA,KAESmH,oBAAoB,CAACnH,UAAAA;AAC5BA,YAAM8D,eAAc;AAEpB,WAAK,gBAAgB,KAAK5F,WAAW,GAAG8B,KAAAA;IAC1C,GAAA,KAESoH,wBAAwB,CAACpH,UAAAA;AAChCA,YAAM8D,eAAc;AACpB,YAAMZ,SAASlD,MAAMkD;AACrB,UAAI,EAAEA,kBAAkBC,mBAAmB;AACzC;MACF;AACA,WAAK,gBAAgBzF,OAAOwF,OAAO3G,KAAK,GAAGyD,KAAAA;IAC7C,GAAA,KAESqH,uBAAuB,CAACrH,UAAAA;AAC/BA,YAAM8D,eAAc;AACpB,YAAMZ,SAASlD,MAAMkD;AACrB,UAAI,EAAEA,kBAAkBC,mBAAmB;AACzC;MACF;AACA,YAAMG,SAAS5F,OAAOwF,OAAO3G,KAAK;AAClC,UAAImB,OAAO8F,MAAMF,MAAAA,GAAS;AACxBJ,eAAO3G,QAAQ+K,OAAO,KAAKpJ,QAAQ;AACnC;MACF;AACA,WAAK,gBAAgBoF,QAAQtD,KAAAA;AAC7BkD,aAAO3G,QAAQ+K,OAAO,KAAKpJ,QAAQ;IACrC,GAAA,KAEA,iBAAiB,CAAC3B,UAA0B6E,KAAKC,IAAI,GAAGD,KAAKgB,IAAI,IAAIhB,KAAKmG,MAAMhL,KAAAA,CAAAA,CAAAA,GAAAA,KAEhF,kBAAkB,CAACA,OAAeyD,UAAAA;AAChC,YAAMgH,YAAY,KAAK,eAAezK,KAAAA;AACtC,UAAI,KAAK2B,aAAa8I,WAAW;AAC/B,aAAK5I,cAAa;AAClB;MACF;AACA,WAAKF,WAAW8I;AAChB,WAAK,YAAY,oBAAoB,KAAK9I,UAAU8B,KAAAA;AACpD,WAAK5B,cAAa;IACpB,GAAA,KAEA,cAAc,CAASnB,MAAqBV,OAAeyD,UAAAA;AACzD,YAAMkD,SAAS,KAAK,gBAAe;AACnC,YAAM+B,SAAqC;QAAE1I;QAAOyD;MAAM;AAE1DwH,MAAAA,sBAAqBtE,QAAQjG,MAAMgI,MAAAA;IACrC;;AACF;;;AC9nCA,SAASwC,QAAAA,cAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IA2BYC;IAAAA;IAAAA;IAAAA;IAAAA;IAAAA;IAAAA;IAItBC;IAGAC;IAGAC;IAGAC;IAGAC;IAGAC;IAAAA;;SApCVC,UAAU;EACTC,KAAK;EACLC,QAAQC;EACRC,WAAAA;AACE,WAAOC;;;;sCAI2B,KAAKC,aAAaC,IAAI;+CACb,KAAKC,eAAe;cACrD,KAAKC,UAAU;;;;;EAK3B;AACF,CAAA,GAAAC,UAIGC,KAAiB;EAAEC,MAAMC;EAAQC,SAAS;AAAK,CAAA,GAAAC,UAG/CJ,KAAuC;EAAEC,MAAMI;EAAQF,SAAS;AAAM,CAAA,GAAAG,UAGtEN,KAAa;EAAEG,SAAS;EAAMI,cAAc;AAAc,CAAA,GAAAC,UAG1DR,KAAiC;EAAEG,SAAS;EAAMI,cAAc;AAAY,CAAA,GAAAE,UAG5ET,KAAa;EAAEC,MAAMS;EAAQP,SAAS;EAAMI,cAAc;AAAE,CAAA,GAAAI,UAG5DX,KAAa;EAAEC,MAAMS;EAAQP,SAAS;EAAMI,cAAc;AAAE,CAAA;AAlBxD,IAAMK,cAAN,eAA0B9B,iBAAAA,aAAAA;;WAItBC,mBAGAC,eAGAC,aAGAC,gBAGAC,iBAGAC,cAAAA,YAAAA,GAAAA,GAAAA,CAAAA,cAAAA,YAAAA,EAAAA,IAAAA,qBAAAA,MAAAA;;;;QAfAL;;;;;QAGAC;;;;;QAGAC;;;;;QAGAC;;;;;QAGAC;;;;;QAGAC;;;;OAnBsBN,cAAAA;;EAItBC;MAAAA,aAAAA;gBAAAA;;MAAAA,WAAAA,IAAAA;SAAAA,2BAAU;;EAGVC;MAAAA,SAAAA;gBAAAA;;MAAAA,OAAAA,IAAAA;SAAAA,uBAAM;;EAGNC;MAAAA,OAAAA;gBAAAA;;MAAAA,KAAAA,IAAAA;SAAAA,qBAAI;;EAGJC;MAAAA,UAAAA;gBAAAA;;MAAAA,QAAAA,IAAAA;SAAAA,wBAAO;;EAGPC;MAAAA,WAAAA;gBAAAA;;MAAAA,SAAAA,IAAAA;SAAAA,yBAAQ;;EAGRC;MAAAA,QAAAA;gBAAAA;;MAAAA,MAAAA,IAAAA;SAAAA,sBAAK;;EAEd;EACA;EACA;EAEA,IAAIyB,iBAAyB;AAC3B,UAAM,EAAEA,eAAc,IAAK,KAAKlB;AAChC,WAAOkB;EACT;EAEA,IAAIlB,eAAwB;AAC1B,QAAI,KAAKZ,eAAe+B,WAAWC,cAAc;AAC/C,UAAI,CAAC,KAAK/B,UAAUgC,MAAMC,QAAQ,KAAKjC,MAAM,GAAG;AAC9C,cAAM6B,kBAAiB;AACvB,cAAMjB,QAAO;aACR,KAAKX,IAAI;cACR,KAAKC,OAAO,qBAAqB2B,eAAAA;;;AAIvC,eAAO;UAAEjB,MAAAA;UAAMiB,gBAAAA;QAAe;MAChC;AAEA,aAAOK,uBAAuB,KAAKlC,QAA6B,KAAKC,MAAM,KAAKC,OAAO;IACzF;AAEA,QAAI,KAAKH,eAAe+B,WAAWK,QAAQ;AACzC,UAAIH,MAAMC,QAAQ,KAAKjC,MAAM,GAAG;AAC9B,eAAOoC,kBAAkB,KAAKpC,QAAQ,KAAKC,MAAM,KAAKC,SAAS;UAC7DC,UAAU,KAAKA;UACfC,OAAO,KAAKA;QACd,CAAA;MACF;AAEA,YAAMyB,kBAAiB;AACvB,YAAMjB,QAAO;WACR,KAAKX,IAAI;YACR,KAAKC,OAAO,qBAAqB2B,eAAAA;;;AAIvC,aAAO;QAAEjB,MAAAA;QAAMiB,gBAAAA;MAAe;IAChC;AAEA,UAAMA,iBAAiB;AACvB,UAAMjB,OAAO;SACR,KAAKX,IAAI;UACR,KAAKC,OAAO,qBAAqB2B,cAAAA;;;AAIvC,WAAO;MAAEjB;MAAMiB;IAAe;EAChC;EAEA,IAAIf,aAAqB;AACvB,WAAO,KAAK,eAAe,YAAY;EACzC;EAEA,IAAIuB,cAAuB;AACzB,WAAO,KAAK;EACd;EAEA;EAqBA;EA2BAC,mBAAmBC,OAAoB;AACrC,SAAK,aAAaA,KAAAA;EACpB;EAEAC,uBAA6B;AAC3B,QAAI,KAAK,cAAc;AACrBC,mBAAa,KAAK,YAAY;AAE9B,WAAK,eAAe;IACtB;AAEA,QAAI,KAAK,mBAAmB;AAC1BA,mBAAa,KAAK,iBAAiB;AAEnC,WAAK,oBAAoB;IAC3B;EACF;;;;;AAlJK,UAAA,GAAA,IAAA,GAAA,KAII1C,4BAAU2C,aAAA,IAAA,GAAV3C,kBAAAA,IAAAA,IAAAA,KAGAC,uBAAAA,cAAAA,IAAAA,GAAAA,KAGAC,qBAAAA,YAAAA,IAAAA,GAAAA,KAGAC,wBAAAA,eAAAA,IAAAA,GAAAA,KAGAC,yBAAAA,gBAAAA,IAAAA,GAAAA,KAGAC,sBAAAA,aAAAA,IAAAA,GAAAA,KAET,eAA8B,MAAA,KAC9B,oBAAmC,MAAA,KACnC,eAAe,OAAA,KA2Df,mBAAmB,OAAOmC,UAAAA;AACxBA,YAAMI,eAAc;AAEpB,UAAI;AACF,cAAMC,UAAUC,UAAUC,UAAU,KAAKjB,cAAc;AAEvD,YAAI,KAAK,cAAc;AACrBY,uBAAa,KAAK,YAAY;QAChC;AAEA,aAAK,eAAeM,OAAOC,WAAW,MAAA;AACpC,eAAK,eAAe;AACpB,eAAKC,cAAa;QACpB,GAAG,GAAA;AAEH,aAAKA,cAAa;MACpB,SAASC,OAAO;AACdC,gBAAQD,MAAM,gCAAgCA,KAAAA;MAChD;IACF,GAAA,KAEA,eAAe,CAACX,UAAAA;AACdA,YAAMI,eAAc;AAEpB,UAAI,KAAK,cAAc;AACrB,aAAK,eAAe;AACpB,aAAKM,cAAa;AAClB,aAAK,KAAKG;MACZ;AAEA,UAAI,KAAK,mBAAmB;AAC1BX,qBAAa,KAAK,iBAAiB;MACrC;AAEA,WAAK,eAAe;AACpB,WAAKQ,cAAa;AAElB,WAAK,oBAAoBF,OAAOC,WAAW,MAAA;AACzC,aAAK,eAAe;AAEpB,aAAKC,cAAa;MACpB,GAAG,GAAA;IACL,GAAA,KAESpC,kBAAkB,CAAC0B,UAAAA;AAC1B,WAAK,KAAK,iBAAiBA,KAAAA;IAC7B;;AAmBF;;;AC9KA,SAASc,QAAAA,cAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAmLaC;IAAAA;IAAAA;IAAAA;IAAAA;IAAAA;IAAAA;IAAAA;IAIvBC;IAGAC;IAGAC;IAGAC;IAGAC;IAGAC;IAGAC;IAAAA;;SAvJVC,UAAU;EACTC,KAAK;EACLC,QAAQC;EACRC,WAAAA;AACE,UAAMC,kBAAkB,KAAKC,YAAY;AACzC,UAAMC,kBAAkB,KAAKD,YAAY;AACzC,UAAME,WAAW,KAAKC,eAAeC,WAAWC;AAChD,UAAMC,SAASJ,YAAYK,MAAMC,QAAQ,KAAKF,MAAM,IAAK,KAAKA,SAA0B;AAExF,WAAOG;;;;;;;sCAO2B,KAAKC,WAAW,WAAW,EAAA;uBAC1C,KAAKC,UAAU;;;sCAGA,KAAKD,WAAW,SAAS,MAAA;;;;;;;;sCAQzB,KAAKE,aAAa,WAAW,EAAA;uBAC5C,KAAKC,gBAAgB;;;sCAGN,KAAKD,aAAa,WAAW,SAAA;;;;;;;;;uBAS5C,KAAKE,UAAU;;;;;;;;;;;;uBAYf,KAAKC,cAAc;0BACfT,UAAUA,OAAOU,UAAUC,qBAAsB,CAACf,QAAAA;;;;;;;;;;;;uBAYtD,KAAKgB,iBAAiB;0BAClBZ,UAAUA,OAAOU,UAAUG,qBAAsB,CAACjB,QAAAA;;;;;;;;;;;;uBAYtD,KAAKkB,sBAAsB;0BACxB,CAAClB,QAAAA;;;;;;;;;;;;;;;uBAeJ,KAAKmB,iBAAiB;0BACnBtB,eAAAA;;;;;gBAKV,KAAKC,QAAQ;;;;;;;;uBAQN,KAAKsB,iBAAiB;0BACnBrB,eAAAA;;;;;;;;gCAQM,KAAKsB,QAAQ,SAAS,CAAA,SAAU,IAAA,UAAc,IAAA,WAAgB,KAAKC,mBAAmB;;;;gCAItF,KAAKC,KAAK,SAAS,CAAA,SAAU,CAAA,UAAW,CAAA,WAAY,KAAKC,gBAAgB;;;;;EAKvG;AACF,CAAA,GAAAC,UAIGC,KAAiB;EAAEC,SAAS;AAAK,CAAA,GAAAC,UAGjCF,KAAuC;EAAEG,MAAMC;EAAQH,SAAS;AAAM,CAAA,GAAAI,UAGtEL,KAAc;EAAEG,MAAMG;EAASL,SAAS;EAAMM,cAAc;AAAK,CAAA,GAAAC,UAGjER,KAAc;EAAEG,MAAMG;EAASL,SAAS;EAAMM,cAAc;AAAM,CAAA,GAAAE,UAGlET,KAAa;EAAEG,MAAMO;EAAQT,SAAS;EAAMM,cAAc;AAAE,CAAA,GAAAI,UAG5DX,KAAa;EAAEG,MAAMO;EAAQT,SAAS;EAAMM,cAAc;AAAE,CAAA,GAAAK,UAG5DZ,KAAa;EAAEG,MAAMO;EAAQT,SAAS;EAAMM,cAAc;AAAE,CAAA;AArBxD,IAAMM,eAAN,eAA2BC,iBAAAA,aAAAA;;WAIvBvC,mBAGAG,eAGAI,iBAGAE,mBAGAZ,iBAGAuB,iBAGAE,cAAAA,YAAAA,GAAAA,GAAAA,CAAAA,eAAAA,YAAAA,EAAAA,IAAAA,qBAAAA,MAAAA;;;;QAlBAtB;;;;;QAGAG;;;;;QAGAI;;;;;QAGAE;;;;;QAGAZ;;;;;QAGAuB;;;;;QAGAE;;;;OAtBuBiB,cAAAA;;EAIvBvC;MAAAA,aAAAA;gBAAAA;;MAAAA,WAAAA,IAAAA;SAAAA,2BAAU;;EAGVG;MAAAA,SAAAA;gBAAAA;;MAAAA,OAAAA,IAAAA;SAAAA,uBAAM;;EAGNI;MAAAA,WAAAA;gBAAAA;;MAAAA,SAAAA,IAAAA;SAAAA,yBAAQ;;EAGRE;MAAAA,aAAAA;gBAAAA;;MAAAA,WAAAA,IAAAA;SAAAA,2BAAU;;EAGVZ;MAAAA,WAAAA;gBAAAA;;MAAAA,SAAAA,IAAAA;SAAAA,yBAAQ;;EAGRuB;MAAAA,WAAAA;gBAAAA;;MAAAA,SAAAA,IAAAA;SAAAA,yBAAQ;;EAGRE;MAAAA,QAAAA;gBAAAA;;MAAAA,MAAAA,IAAAA;SAAAA,sBAAK;;EAEd;EAQA;EAOA;EAMA;EAsNA;EAEA;;;;;AArQK,UAAA,GAAA,IAAA,GAAA,KAIItB,4BAAUwC,aAAA,IAAA,GAAVxC,kBAAAA,IAAAA,IAAAA,KAGAG,uBAAAA,cAAAA,IAAAA,GAAAA,KAGAI,yBAAAA,gBAAAA,IAAAA,GAAAA,KAGAE,2BAAAA,kBAAAA,IAAAA,GAAAA,KAGAZ,yBAAAA,gBAAAA,MAAmB,CAAA,GAAA,KAGnBuB,yBAAAA,gBAAAA,MAAmB,CAAA,GAAA,KAGnBE,sBAAAA,aAAAA,MAAgB,CAAA,GAAA,KAEzB,kBAAkB,MAAA;AAChB,YAAMmB,OAAO,KAAKC,YAAW;AAC7B,UAAID,gBAAgBE,cAAcF,KAAKG,gBAAgBL,aAAa;AAClE,eAAOE,KAAKG;MACd;AACA,aAAO;IACT,GAAA,KAEA,mBAAmB,MAAA;AACjB,UAAI,CAACxC,MAAMC,QAAQ,KAAKF,MAAM,GAAG;AAC/B,eAAO;MACT;AACA,aAAO,KAAKA;IACd,GAAA,KAEA,cAAc,CAASyB,MAAqBiB,OAAeC,UAAAA;AACzD,YAAMC,SAAS,KAAK,gBAAe;AACnC,YAAMC,SAAqC;QAAEH;QAAOC;MAAM;AAC1DG,MAAAA,sBAAqBF,QAAQnB,MAAMoB,MAAAA;IACrC,GAAA,KAEA,cAAc,CAAC7C,QAAsB2C,UAAAA;AACnC,WAAK3C,SAASA;AACd,WAAK,YAAY,iBAAiBA,QAAQ2C,KAAAA;IAC5C,GAAA,KAEStC,aAAa,CAACsC,UAAAA;AACrBA,YAAMI,eAAc;AACpB,YAAMC,YAAY,CAAC,KAAK5C;AACxB,WAAKA,WAAW4C;AAChB,WAAK,YAAY,eAAeA,WAAWL,KAAAA;IAC7C,GAAA,KAESpC,mBAAmB,CAACoC,UAAAA;AAC3BA,YAAMI,eAAc;AACpB,YAAMC,YAAY,CAAC,KAAK1C;AACxB,WAAKA,aAAa0C;AAClB,WAAK,YAAY,eAAeA,WAAWL,KAAAA;IAC7C,GAAA,KAESnC,aAAa,CAACmC,UAAAA;AACrBA,YAAMI,eAAc;AAEpB,UAAI,KAAKlD,eAAeC,WAAWmD,cAAc;AAC/C,cAAMC,YAA8B;UAClCC,IAAI;YAAEC,GAAG;YAAMC,GAAG;UAAI;UACtBC,IAAI;YAAEF,GAAG;YAAMC,GAAG;UAAE;QACtB;AACA,aAAKrD,SAASkD;AACd,aAAK,YAAY,iBAAiBA,WAAUP,KAAAA;AAC5C;MACF;AAEA,YAAMO,WAAyB;QAC7B;UAAEE,GAAG;UAAGC,GAAG;QAAE;QACb;UAAED,GAAG;UAAGC,GAAG;QAAE;;AAEf,WAAKrD,SAASkD;AACd,WAAK,YAAY,iBAAiBA,UAAUP,KAAAA;AAC5C,WAAK,YAAY,sBAAsB,MAAMA,KAAAA;IAC/C,GAAA,KAES7B,yBAAyB,CAAC6B,UAAAA;AACjCA,YAAMI,eAAc;AAEpB,YAAM/C,SAAS,KAAK,iBAAgB;AACpC,UAAI,CAACA,UAAUA,OAAOU,UAAUG,mBAAmB;AACjD;MACF;AAEA,YAAM0C,YAAYvD,OAAOU,SAAS;AAClC,YAAM8C,OAAOD,YAAY,IAAI,IAAIA,YAAY;AAE7C,YAAME,cAA4BzD,OAAO0D,IAAI,CAACC,OAAOC,UAAAA;AACnD,cAAMC,UAAuB;UAAE,GAAGF;QAAM;AAExC,YAAIC,UAAU,GAAG;AACfC,kBAAQT,IAAI;QACd,WAAWQ,UAAUL,WAAW;AAC9BM,kBAAQT,IAAI;QACd,OAAO;AACLS,kBAAQT,IAAIpB,OAAO8B,YAAYN,OAAOI,OAAOG,QAAQ,CAAA,CAAA;QACvD;AAEA,eAAOF,QAAQG;AACf,eAAOH,QAAQI;AACf,eAAOJ,QAAQK;AACf,eAAOL,QAAQM;AACf,eAAON,QAAQO;AAEf,eAAOP;MACT,CAAA;AAEA,YAAMQ,mBAAmBC,sBAAsBb,WAAAA;AAC/C,WAAK,YAAYY,kBAAkB1B,KAAAA;IACrC,GAAA,KAESlC,iBAAiB,CAACkC,UAAAA;AACzBA,YAAMI,eAAc;AAEpB,UAAI,KAAKlD,eAAeC,WAAWC,QAAQ;AACzC;MACF;AAEA,YAAMC,SAAS,KAAK,iBAAgB;AACpC,UAAI,CAACA,UAAUA,OAAOU,UAAUC,mBAAmB;AACjD;MACF;AAEA,UAAI4D,cAAc;AAClB,UAAIC,aAAa;AAEjB,eAASZ,QAAQ,GAAGA,QAAQ5D,OAAOU,SAAS,GAAGkD,SAAS,GAAG;AACzD,cAAMa,QAAQzE,OAAO4D,KAAAA;AACrB,cAAMc,MAAM1E,OAAO4D,QAAQ,CAAA;AAE3B,YAAI,CAACa,SAAS,CAACC,KAAK;AAClB;QACF;AAEA,cAAMC,MAAMD,IAAItB,IAAIqB,MAAMrB;AAE1B,YAAIuB,MAAMH,YAAY;AACpBA,uBAAaG;AACbJ,wBAAcX;QAChB;MACF;AAEA,YAAMgB,aAAa5E,OAAOuE,WAAAA;AAC1B,YAAMM,WAAW7E,OAAOuE,cAAc,CAAA;AAEtC,UAAI,CAACK,cAAc,CAACC,UAAU;AAC5B;MACF;AAEA,YAAMC,mBAAmBC,WACvB;QACE3B,IAAIwB,WAAWxB,IAAIyB,SAASzB,KAAK;QACjCC,IAAIuB,WAAWvB,IAAIwB,SAASxB,KAAK;MACnC,GACA;QAAE2B,MAAM;QAAIC,MAAM;MAAE,CAAA;AAEtB,YAAMC,WAAwB;QAC5B9B,GAAG0B,iBAAiB1B;QACpBC,GAAGyB,iBAAiBzB;QACpBW,OAAO;QACPC,OAAO;QACPC,QAAQ;QACRC,QAAQ;QACRC,UAAU;QACVe,cAAc;MAChB;AAEA,YAAMC,gBAA8B;WAC/BpF,OAAOqF,MAAM,GAAGd,cAAc,CAAA;QACjCW;WACGlF,OAAOqF,MAAMd,cAAc,CAAA;;AAGhC,YAAMe,gBAAgBf,cAAc;AACpC,YAAMF,mBAAmBC,sBAAsBc,aAAAA;AAC/C,WAAK,YAAYf,kBAAkB1B,KAAAA;AACnC,WAAK,YAAY,sBAAsB2C,eAAe3C,KAAAA;IACxD,GAAA,KAES/B,oBAAoB,CAAC+B,UAAAA;AAC5BA,YAAMI,eAAc;AAEpB,UAAI,KAAKlD,eAAeC,WAAWC,QAAQ;AACzC;MACF;AAEA,YAAMC,SAAS,KAAK,iBAAgB;AACpC,UAAI,CAACA,UAAUA,OAAOU,UAAUG,mBAAmB;AACjD;MACF;AAEA,UAAI0E,cAAc;AAClB,UAAIC,eAAexD,OAAOyD;AAE1B,eAAS7B,QAAQ,GAAGA,QAAQ5D,OAAOU,SAAS,GAAGkD,SAAS,GAAG;AACzD,cAAM8B,WAAW1F,OAAO4D,QAAQ,CAAA;AAChC,cAAM+B,OAAO3F,OAAO4D,QAAQ,CAAA;AAE5B,YAAI,CAAC8B,YAAY,CAACC,MAAM;AACtB;QACF;AAEA,cAAMC,OAAOD,KAAKvC,IAAIsC,SAAStC;AAE/B,YAAIwC,OAAOJ,cAAc;AACvBA,yBAAeI;AACfL,wBAAc3B;QAChB;MACF;AAEA,UAAI2B,cAAc,KAAKA,cAAcvF,OAAOU,SAAS,GAAG;AACtD,cAAM0E,gBAA8BpF,OACjC6F,OAAO,CAACC,GAAGC,eAAeA,eAAeR,WAAAA,EACzC7B,IAAI,CAACC,UAAAA;AACJ,iBAAO;YAAE,GAAGA;UAAM;QACpB,CAAA;AAEF,cAAMU,mBAAmBC,sBAAsBc,aAAAA;AAC/C,aAAK,YAAYf,kBAAkB1B,KAAAA;AAEnC,cAAMqD,YAAYT,cAAc;AAChC,aAAK,YAAY,sBAAsBS,WAAWrD,KAAAA;MACpD;IACF,GAAA,KAES3B,oBAAoB,CAAC2B,UAAAA;AAC5BA,YAAMI,eAAc;AACpB,WAAK,gBAAgB,KAAKrD,WAAW,GAAGiD,KAAAA;IAC1C,GAAA,KAES5B,oBAAoB,CAAC4B,UAAAA;AAC5BA,YAAMI,eAAc;AACpB,WAAK,gBAAgB,KAAKrD,WAAW,GAAGiD,KAAAA;IAC1C,GAAA,KAESzB,sBAAsB,CAACyB,UAAAA;AAC9B,YAAMsD,cAActD;AACpB,YAAMD,QAAQuD,YAAYpD,QAAQH,SAAS;AAC3C,WAAKzB,WAAWe,OAAOU,KAAAA;AACvB,WAAK,YAAY,mBAAmB,KAAKzB,UAAU0B,KAAAA;IACrD,GAAA,KAESvB,mBAAmB,CAACuB,UAAAA;AAC3B,YAAMsD,cAActD;AACpB,YAAMD,QAAQuD,YAAYpD,QAAQH,SAAS;AAC3C,WAAKvB,QAAQa,OAAOU,KAAAA;AACpB,WAAK,YAAY,gBAAgB,KAAKvB,OAAOwB,KAAAA;IAC/C,GAAA,KAEA,iBAAiB,CAACD,UAA0BwD,KAAKC,IAAI,GAAGD,KAAKE,IAAI,IAAIF,KAAK/E,MAAMuB,KAAAA,CAAAA,CAAAA,GAAAA,KAEhF,kBAAkB,CAACA,OAAeC,UAAAA;AAChC,YAAMK,YAAY,KAAK,eAAeN,KAAAA;AACtC,UAAI,KAAKhD,aAAasD,WAAW;AAC/B,aAAKqD,cAAa;AAClB;MACF;AACA,WAAK3G,WAAWsD;AAChB,WAAK,YAAY,oBAAoB,KAAKtD,UAAUiD,KAAAA;AACpD,WAAK0D,cAAa;IACpB;;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IZvX2BC;IAAAA;IAAAA;IAAAA;IAAAA;IAAAA;IAAAA;IAAAA;IAAAA;IAAAA;IAAAA;IAAAA;IAAAA;IAAAA;IAAAA;IAAAA;IAAAA;IAAAA;IAAAA;IAIhBC;IAYAC;IASAC;IAGAC;IAGAC;IAGAC;IAGAC;IAGAC;IAGAC;IAAAA;;SAzGVC,UAAU;EACTC,KAAK;EACLC,QAAQC;EACRC,WAAAA;AACE,WAAOC;;;;0BAIe,KAAKb,UAAU;sBACnB,KAAKC,MAAM;wBACT,KAAKC,QAAQ;0BACX,KAAKC,UAAU;wBACjB,KAAKC,QAAQ;kCACH,KAAKG,kBAAkB;;;;;;;4BAO7B,KAAKP,UAAU;wBACnB,KAAKC,MAAM;0BACT,KAAKC,QAAQ;4BACX,KAAKC,UAAU;0BACjB,KAAKC,QAAQ;oCACH,KAAKG,kBAAkB;0BACjC,KAAKF,QAAQ;uBAChB,KAAKC,KAAK;;;;0BAIP,KAAKN,UAAU;sBACnB,KAAKC,MAAM;kCACC,KAAKM,kBAAkB;;;;;;0BAM/B,KAAKP,UAAU;sBACnB,KAAKC,MAAM;wBACT,KAAKC,QAAQ;0BACX,KAAKC,UAAU;wBACjB,KAAKC,QAAQ;wBACb,KAAKC,QAAQ;qBAChB,KAAKC,KAAK;;;;;;0BAML,KAAKN,UAAU;sBACnB,KAAKC,MAAM;oBACb,KAAKF,IAAI;wBACL,KAAKM,QAAQ;qBAChB,KAAKC,KAAK;;;;;EAK7B;AACF,CAAA,GAAAQ,UAIGC,KAAa;EAAEC,SAAS;EAAMC,cAAc;AAAc,CAAA,GAAAC,UAG1DH,KAAwB;EACvBC,SAAS;EACTC,cAAcE,WAAWC;EACzBC,SAAsBC,MAAkBC,UAAoB;AAC1D,QAAID,SAASC,UAAU;AACrB,WAAKtB,SAAS,KAAKuB,wBAAwBF,IAAAA;AAC3C,WAAKf,qBAAqB;IAC5B;EACF;AACF,CAAA,GAAAkB,UAGCV,KAAuC;EACtCW,MAAMC;EACNX,SAAS;EACTC,cAAc,MAAA;AACZ,WAAO;MAAEW,IAAI;QAAEC,GAAG;QAAMC,GAAG;MAAI;MAAGC,IAAI;QAAEF,GAAG;QAAMC,GAAG;MAAE;IAAE;EAC1D;AACF,CAAA,GAAAE,UAGCjB,KAAc;EAAEW,MAAMO;EAASjB,SAAS;EAAMC,cAAc;AAAK,CAAA,GAAAiB,UAGjEnB,KAAc;EAAEW,MAAMO;EAASjB,SAAS;EAAMC,cAAc;AAAM,CAAA,GAAAkB,UAGlEpB,KAAa;EAAEW,MAAMU;EAAQpB,SAAS;EAAMC,cAAc;AAAE,CAAA,GAAAoB,UAG5DtB,KAAa;EAAEW,MAAMU;EAAQpB,SAAS;EAAMC,cAAc;AAAE,CAAA,GAAAqB,UAG5DvB,KAAa;EAAEW,MAAMU;EAAQpB,SAAS;EAAMC,cAAc;AAAE,CAAA,GAAAsB,UAG5DxB,KAAoB;EAAEW,MAAMU;EAAQpB,SAAS;EAAOC,cAAc;AAAK,CAAA,GAAAuB,UAYvEC,OAA2D,sBAAsB;EAAEC,QAAQ;AAAQ,CAAA,GAAAC,WAoCnGF,OAAwD,eAAe;EAAEC,QAAQ;AAAQ,CAAA,GAAAE,WAWzFH,OAAwD,eAAe;EAAEC,QAAQ;AAAQ,CAAA,GAAAG,UAWzFJ,OAAuD,oBAAoB;EAAEC,QAAQ;AAAQ,CAAA,GAAAI,UAW7FL,OAAuD,mBAAmB;EAAEC,QAAQ;AAAQ,CAAA,GAAAK,UAU5FN,OAAuD,gBAAgB;EAAEC,QAAQ;AAAQ,CAAA,GAAAM,UAUzFP,OAAiF,iBAAiB;EACjGC,QAAQ;AACV,CAAA,GAAAO,UAgBCR,OAA6B,WAAW;EAAEC,QAAQ;EAAUQ,SAAS;AAAM,CAAA,GAAAC,UAsH3EV,OAA8D,sBAAsB;EAAEC,QAAQ;AAAQ,CAAA;AAvRlG,IAAMU,QAAN,eAAoBtD,iBAAAA,aAAAA;;WAIhBC,aAYAC,mBASAC,eAGAC,iBAGAC,mBAGAC,iBAGAC,iBAGAC,cAGAC,2BAAAA,YAAAA,GAAAA,GAAAA,CAAAA,QAAAA,YAAAA,EAAAA,IAAAA,qBAAAA,MAAAA;;;;QAvCAR;;;;;QAYAC;;;;;QASAC;;;;;QAGAC;;;;;QAGAC;;;;;QAGAC;;;;;QAGAC;;;;;QAGAC;;;;;QAGAC;;;;;QAYT8C;;;;;QAoCAC;;;;;QAWAC;;;;;QAWAC;;;;;QAWAC;;;;;QAUAC;;;;;QAYAC;;;;;QAgBAC;;;;;QAsHAC;;;;OAxRyB/D,cAAAA;;EAIhBC;MAAAA,OAAAA;gBAAAA;;MAAAA,KAAAA,IAAAA;SAAAA,qBAAI;;EAYJC;MAAAA,aAAAA;gBAAAA;;MAAAA,WAAAA,IAAAA;SAAAA,2BAAU;;EASVC;MAAAA,SAAAA;gBAAAA;;MAAAA,OAAAA,IAAAA;SAAAA,uBAAM;;EAGNC;MAAAA,WAAAA;gBAAAA;;MAAAA,SAAAA,IAAAA;SAAAA,yBAAQ;;EAGRC;MAAAA,aAAAA;gBAAAA;;MAAAA,WAAAA,IAAAA;SAAAA,2BAAU;;EAGVC;MAAAA,WAAAA;gBAAAA;;MAAAA,SAAAA,IAAAA;SAAAA,yBAAQ;;EAGRC;MAAAA,WAAAA;gBAAAA;;MAAAA,SAAAA,IAAAA;SAAAA,yBAAQ;;EAGRC;MAAAA,QAAAA;gBAAAA;;MAAAA,MAAAA,IAAAA;SAAAA,sBAAK;;EAGLC;MAAAA,qBAAAA;gBAAAA;;MAAAA,mBAAAA,IAAAA;SAAAA,mCAAkB;;EAEnBiB,wBAAwBE,MAAoD;AAClF,WAAOA,SAASP,WAAWC,eACvB;MAAEQ,IAAI;QAAEC,GAAG;QAAMC,GAAG;MAAI;MAAGC,IAAI;QAAEF,GAAG;QAAMC,GAAG;MAAE;IAAE,IACjD;MACE;QAAED,GAAG;QAAGC,GAAG;MAAE;MACb;QAAED,GAAG;QAAGC,GAAG;MAAE;;EAErB;EAGAuB,uBAAuBS,OAA0D;AAC/E,UAAM,EAAEC,MAAK,IAAKD,MAAME;AAExB,QAAI,KAAKhE,eAAe+D,OAAO;AAC7B;IACF;AAEA,UAAME,eAAe,KAAKjE;AAC1B,UAAMkE,iBAAiB,KAAKjE;AAC5B,SAAKD,aAAa+D;AAClB,SAAKxD,qBAAqB;AAE1B,QAAI0D,iBAAiB9C,WAAWC,gBAAgB2C,UAAU5C,WAAWgD,QAAQ;AAC3E,UAAID,kBAAkB,CAACE,MAAMC,QAAQH,cAAAA,GAAiB;AACpD,cAAMI,eAAeJ;AACrB,cAAMK,eAAeC,0BAA0BF,YAAAA;AAC/C,aAAKrE,SAASsE;AACd,aAAKE,iBAAiBF,cAAcT,MAAME,OAAOF,KAAK;AACtD;MACF,OAAO;AACL,aAAK7D,SAAS,KAAKuB,wBAAwBuC,KAAAA;AAC3C,aAAKU,iBAAiB,KAAKxE,QAAQ6D,MAAME,OAAOF,KAAK;AACrD;MACF;IACF,WAAWG,iBAAiB9C,WAAWgD,UAAUJ,UAAU5C,WAAWC,cAAc;AAClF,WAAKnB,SAAS,KAAKuB,wBAAwBuC,KAAAA;AAC3C,WAAKU,iBAAiB,KAAKxE,QAAQ6D,MAAME,OAAOF,KAAK;AACrD;IACF,OAAO;AACL,WAAK7D,SAAS,KAAKuB,wBAAwBuC,KAAAA;AAC3C,WAAKU,iBAAiB,KAAKxE,QAAQ6D,MAAME,OAAOF,KAAK;AACrD;IACF;EACF;EAGAR,iBAAiBQ,OAAuD;AACtE,UAAM,EAAEC,MAAK,IAAKD,MAAME;AAExB,QAAI,KAAK9D,aAAa6D,OAAO;AAC3B;IACF;AAEA,SAAK7D,WAAW6D;EAClB;EAGAR,iBAAiBO,OAAuD;AACtE,UAAM,EAAEC,MAAK,IAAKD,MAAME;AAExB,QAAI,KAAK7D,eAAe4D,OAAO;AAC7B;IACF;AAEA,SAAK5D,aAAa4D;EACpB;EAGAP,qBAAqBM,OAAsD;AACzE,QAAI,EAAEC,MAAK,IAAKD,MAAME;AACtBD,YAAQW,KAAKC,IAAI,GAAGD,KAAKE,IAAI,IAAIb,KAAAA,CAAAA;AACjC,QAAI,KAAK3D,aAAa2D,OAAO;AAC3B;IACF;AACA,SAAK3D,WAAW2D;AAChB,SAAKc,cAAa;EACpB;EAGApB,qBAAqBK,OAAsD;AACzE,UAAM,EAAEC,MAAK,IAAKD,MAAME;AACxB,QAAI,KAAK3D,aAAa0D,OAAO;AAC3B;IACF;AACA,SAAK1D,WAAW0D;AAChB,SAAKc,cAAa;EACpB;EAGAnB,kBAAkBI,OAAsD;AACtE,UAAM,EAAEC,MAAK,IAAKD,MAAME;AACxB,QAAI,KAAK1D,UAAUyD,OAAO;AACxB;IACF;AACA,SAAKzD,QAAQyD;AACb,SAAKc,cAAa;EACpB;EAKAlB,mBAAmBG,OAAgF;AACjG,UAAM,EAAEC,MAAK,IAAKD,MAAME;AACxB,SAAK/D,SAAS8D;AAEd,QAAIK,MAAMC,QAAQN,KAAAA,GAAQ;AACxB,UAAI,KAAKxD,uBAAuB,MAAM;AACpC,YAAI,KAAKA,sBAAsBwD,MAAMe,QAAQ;AAC3C,eAAKvE,qBAAqBwD,MAAMe,SAAS;QAC3C;MACF;IACF,OAAO;AACL,WAAKvE,qBAAqB;IAC5B;EACF;EAGAqD,wBAAwBE,OAA4B;AAClD,QAAIA,MAAMiB,kBAAkB;AAC1B;IACF;AAEA,UAAMC,gBAAgBlB,MAAMpB;AAE5B,QACEsC,yBAAyBC,oBACzBD,yBAAyBE,uBACxBF,yBAAyBlF,eAAekF,cAAcG,mBACvD;AACA;IACF;AAEA,QAAI,KAAKnF,eAAemB,WAAWgD,UAAU,CAACC,MAAMC,QAAQ,KAAKpE,MAAM,GAAG;AACxE;IACF;AAEA,UAAMmF,QAAQ,KAAK7E;AAEnB,QAAI6E,UAAU,MAAM;AAClB;IACF;AAEA,UAAMC,YAAY,KAAKpF,OAAO6E,SAAS;AACvC,UAAMQ,eAA6B,KAAKrF,OAAOsF,IAAI,CAACC,WAAAA;AAClD,aAAO;QAAE,GAAGA;MAAM;IACpB,CAAA;AACA,UAAMA,QAAQF,aAAaF,KAAAA;AAE3B,QAAI,CAACI,OAAO;AACV;IACF;AAEA,UAAMC,OAAO3B,MAAM4B,WAAW,OAAO;AACrC,QAAIC,UAAU;AAEd,YAAQ7B,MAAM8B,KAAG;MACf,KAAK,aAAa;AAChB,YAAIR,SAAS,KAAKA,SAASC,WAAW;AACpC;QACF;AACA,cAAM9D,WAAW+D,aAAaF,QAAQ,CAAA;AACtC,cAAM9D,OAAOgE,aAAaF,QAAQ,CAAA;AAElC,YAAI,CAAC7D,YAAY,CAACD,MAAM;AACtB;QACF;AAEA,cAAMuE,OAAOtE,SAASM,IAAIiE;AAC1B,cAAMC,OAAOzE,KAAKO,IAAIiE;AACtBN,cAAM3D,IAAI6C,KAAKE,IAAIF,KAAKC,IAAIa,MAAM3D,IAAI4D,MAAMI,IAAAA,GAAOE,IAAAA;AACnDJ,kBAAU;AACV;MACF;MACA,KAAK,cAAc;AACjB,YAAIP,SAAS,KAAKA,SAASC,WAAW;AACpC;QACF;AACA,cAAM9D,WAAW+D,aAAaF,QAAQ,CAAA;AACtC,cAAM9D,OAAOgE,aAAaF,QAAQ,CAAA;AAElC,YAAI,CAAC7D,YAAY,CAACD,MAAM;AACtB;QACF;AAEA,cAAMuE,OAAOtE,SAASM,IAAIiE;AAC1B,cAAMC,OAAOzE,KAAKO,IAAIiE;AACtBN,cAAM3D,IAAI6C,KAAKE,IAAIF,KAAKC,IAAIa,MAAM3D,IAAI4D,MAAMI,IAAAA,GAAOE,IAAAA;AACnDJ,kBAAU;AACV;MACF;MACA,KAAK,WAAW;AACdH,cAAM1D,IAAI4C,KAAKE,IAAIF,KAAKC,IAAIa,MAAM1D,IAAI2D,MAAM,CAAA,GAAI,CAAA;AAChDE,kBAAU;AACV;MACF;MACA,KAAK,aAAa;AAChBH,cAAM1D,IAAI4C,KAAKE,IAAIF,KAAKC,IAAIa,MAAM1D,IAAI2D,MAAM,CAAA,GAAI,CAAA;AAChDE,kBAAU;AACV;MACF;MACA,KAAK;MACL,KAAK,aAAa;AAChB,YAAIL,aAAaR,UAAUkB,qBAAqBZ,SAAS,KAAKA,SAASC,WAAW;AAChF;QACF;AAEAC,qBAAaW,OAAOb,OAAO,CAAA;AAE3B,cAAMc,aAAaC,sBAAsBb,YAAAA;AACzC,aAAKrF,SAASiG;AACd,aAAKzB,iBAAiByB,YAAYpC,KAAAA;AAElC,cAAMsC,YAAYhB,QAAQ;AAE1B,aAAK7E,qBAAqB6F;AAC1BT,kBAAU;AACV;MACF;MACA;AACE;IACJ;AAEA,QAAIA,WAAW7B,MAAM8B,QAAQ,YAAY9B,MAAM8B,QAAQ,aAAa;AAClE,YAAMM,aAAaC,sBAAsBb,YAAAA;AACzC,WAAKrF,SAASiG;AACd,WAAKzB,iBAAiByB,YAAYpC,KAAAA;AAClC,WAAKvD,qBAAqB6E;IAC5B;AAEA,QAAIO,SAAS;AACX7B,YAAMuC,eAAc;IACtB;EACF;EAGAxC,uBAAuBC,OAA6D;AAClF,UAAM,EAAEC,MAAK,IAAKD,MAAME;AACxB,QAAI,KAAKzD,uBAAuBwD,OAAO;AACrC;IACF;AACA,SAAKxD,qBAAqBwD,SAAS;EACrC;EAEQU,iBAAiBV,OAAyCuC,aAA2B;AAC3F,UAAMtC,SAA+D;MACnED;MACAD,OAAOwC,eAAe,IAAIC,MAAM,eAAA;IAClC;AAEA,SAAKC,cACH,IAAIC,YAAY,iBAAiB;MAC/BzC;MACA0C,SAAS;MACTC,UAAU;IACZ,CAAA,CAAA;EAEJ;;;;;AA7SK,UAAA,GAAA,IAAA,GAAA,KAII5G,sBAAI6G,aAAA,IAAA,GAAJ7G,YAAAA,IAAAA,IAAAA,KAYAC,2BAAAA,kBAAAA,IAAAA,GAAAA,KASAC,uBAAAA,cAAAA,IAAAA,GAAAA,KAGAC,yBAAAA,gBAAAA,IAAAA,GAAAA,KAGAC,2BAAAA,kBAAAA,IAAAA,GAAAA,KAGAC,yBAAAA,gBAAAA,IAAAA,GAAAA,KAGAC,yBAAAA,gBAAAA,IAAAA,GAAAA,KAGAC,sBAAAA,aAAAA,IAAAA,GAAAA,KAGAC,mCAAAA,0BAAAA,MAAoC,IAAA;;AAmQ/C;","names":["html","html","render","styleCache","Map","normalizeTemplate","template","fetchStyles","urls","Promise","all","map","url","cached","get","request","fetch","then","response","ok","text","catch","set","Component","options","Base","_context","tag","styles","styleUrls","observedAttributes","shadowMode","autoSlot","Error","templateFn","Decorated","parent","Array","isArray","own","from","Set","args","attachShadow","mode","renderRoot","shadow","connectedCallback","prototype","call","finally","requestRender","disconnectedCallback","attributeChangedCallback","name","oldValue","newValue","onAttributeChange","requestAnimationFrame","length","fetched","inlineStyles","filter","Boolean","join","root","templateResult","styleTemplate","slotTemplate","completeTemplate","commit","afterRender","wrapRender","fragment","document","createDocumentFragment","tempDiv","createElement","append","childNodes","customElements","define","renderQueue","WeakMap","cleanupRegistry","observerRegistry","internalMutations","scheduleRender","instance","requestRender","render","get","set","requestAnimationFrame","delete","toKebabCase","value","String","replace","toLowerCase","registerCleanup","cleanup","callbacks","Set","original","disconnectedCallback","args","registered","forEach","callback","error","console","apply","undefined","add","markInternalMutation","host","attribute","attributes","isInternalMutation","hasAttribute","has","size","observeAttribute","handler","entry","Map","observer","MutationObserver","records","record","attributeName","listeners","currentValue","target","getAttribute","listener","observe","disconnect","updateAttribute","removeAttribute","setAttribute","resolveType","type","Boolean","Number","Object","Array","typeParsers","boolean","number","parsed","isNaN","json","JSON","parse","warn","string","typeFormatters","stringify","defaultCompare","previous","next","Prop","options","reflect","format","defaultValue","compare","onChange","onAttributeChange","resolvedType","parseValue","call","formatValue","accessor","context","kind","Error","name","addInitializer","rawValue","formatted","init","initialValue","HTMLElement","disabled","pill","fullWidth","type","block","variant","Component","tag","autoSlot","shadowMode","styles","Prop","Boolean","reflect","String","defaultValue","onAttributeChange","requestRender","Button","render","html","html","CONTROL_CHANGE_EVENT","dispatchControlEvent","host","type","detail","dispatchEvent","CustomEvent","bubbles","composed","setBooleanAttribute","element","name","value","setAttribute","removeAttribute","coerceNumber","parsed","Number","isNaN","lifecycleHooks","connectedCallback","WeakMap","disconnectedCallback","cleanupRegistry","addLifecycleHook","instance","hookName","handler","store","callbacks","get","Set","set","original","args","forEach","callback","apply","undefined","add","registerCleanup","cleanup","registered","fn","error","console","delete","resolveTarget","host","target","EventTarget","document","window","renderRoot","shadowRoot","normalizeOptions","selectorOrOptions","selector","buildOptions","options","prevent","stop","stopImmediate","once","passive","capture","when","Listen","eventName","Error","listenConfig","originalMethod","context","addInitializer","attached","attach","addEventListener","warn","String","eventOptions","event","typedEvent","preventDefault","stopImmediatePropagation","stopPropagation","matched","path","composedPath","find","node","Element","matches","call","targetNode","removeEventListener","queueMicrotask","defaultOptions","all","closest","from","fallback","resolveFallback","host","resolveRoot","option","document","renderRoot","shadowRoot","resolveQuery","selector","options","result","root","elements","Array","querySelectorAll","length","match","querySelector","createQueryDecorator","_target","context","kind","descriptor","get","set","_value","addInitializer","Object","defineProperty","name","configurable","enumerable","Query","userOptions","Error","merged","HTMLElement","checked","name","value","disabled","control","Component","tag","styles","template","html","filterId","_dec1","Prop","type","Boolean","reflect","_dec2","_dec3","_dec4","_dec5","Query","_dec6","Listen","selector","Checkbox","handleClick","connectedCallback","_prevChecked","afterRender","changed","_triggerAnimation","setAttribute","setBooleanAttribute","shadowRoot","querySelector","svg","classList","remove","animClass","duration","add","setTimeout","event","preventDefault","stopPropagation","dispatchControlEvent","_initProto","crypto","randomUUID","html","html","HTMLElement","placement","offset","open","nextAnchorName","crypto","randomUUID","Component","tag","autoSlot","shadowMode","styles","_dec1","Prop","reflect","defaultValue","onChange","handlePlacementChange","_dec2","type","Number","handleOffsetChange","_dec3","Boolean","Popover","contentElement","connectedCallback","disconnectedCallback","render","html","requestRender","dataset","isFinite","style","setProperty","_initProto","html","HTMLElement","state","Component","tag","styles","observedAttributes","_dec1","Prop","reflect","attribute","defaultValue","onAttributeChange","next","previous","shadowRoot","querySelector","animate","d","paths","duration","easing","IconChevron","render","html","_initProto","down","up","html","DismissController","options","event","owner","content","triggers","path","composedPath","some","node","Element","hasAttribute","includes","trigger","key","preventDefault","active","document","activeElement","contains","onDismiss","connect","context","filter","el","HTMLElement","addEventListener","disconnect","removeEventListener","registry","WeakMap","toDismissContext","host","options","disabled","resolved","resolve","owner","HTMLElement","content","triggers","filter","element","createOutsideClickHandle","onDismiss","controller","DismissController","event","call","update","context","disconnect","connect","registerOutsideClickHandle","handle","handles","get","Set","set","add","updateOutsideClickHandles","forEach","disconnectOutsideClickHandles","requestOutsideClickUpdate","lifecycleApplied","WeakSet","wrapMethod","host","name","hook","callHookFirst","original","args","call","result","apply","ensureLifecycle","has","add","updateOutsideClickHandles","disconnectOutsideClickHandles","OutsideClick","options","originalMethod","context","addInitializer","resolve","owner","content","triggers","handle","createOutsideClickHandle","event","disabled","registerOutsideClickHandle","isConnected","HTMLElement","open","disabled","pill","headless","searchable","block","maxHeight","name","value","placeholder","placement","trigger","searchInput","panelContent","contentSlot","nextOptionId","counter","nextPanelId","Component","tag","styles","_dec1","Prop","type","Boolean","reflect","onChange","next","previous","handleOpenChange","_dec2","_dec3","_dec4","_dec5","_dec6","String","defaultValue","onAttributeChange","requestRender","_dec7","style","setProperty","_dec8","_dec9","_dec10","attribute","_dec12","Query","_dec13","_dec14","_dec15","OutsideClick","content","host","triggers","Dropdown","handleOutsideDismiss","connectedCallback","disconnectedCallback","afterRender","ariaLabel","getAttribute","HTMLButtonElement","setAttribute","trim","length","removeAttribute","panel","isInteractive","id","tabIndex","setBooleanAttribute","queueMicrotask","render","placeholderActive","html","query","lowerQuery","toLowerCase","forEach","option","match","label","includes","element","display","toggle","force","originEvent","current","blur","origin","Event","focus","dispatchControlEvent","event","requestOutsideClickUpdate","slot","removeEventListener","addEventListener","assigned","assignedElements","flatten","elements","filter","node","options","hasAttribute","dataset","active","handlers","click","preventDefault","stopPropagation","keydown","key","passive","push","preselected","find","selected","toggleAttribute","selectedLabel","previousLabel","isSelected","fallback","hasValue","o","target","entry","preventScroll","index","normalized","Math","max","min","undefined","step","activeElement","document","currentIndex","findIndex","nextIndex","previousValue","explicitValue","text","textContent","explicitLabel","dispatchEvent","CustomEvent","detail","bubbles","composed","_initProto","input","html","HTMLElement","value","placeholder","type","name","disabled","headless","control","Component","tag","shadowMode","autoSlot","styles","template","html","Boolean","_dec1","Prop","reflect","_dec2","_dec3","defaultValue","_dec4","_dec5","_dec6","_dec7","Query","_dec8","Listen","selector","_dec9","_dec10","_dec11","Input","onPrefixSlotChange","onSuffixSlotChange","handleInput","handleChange","updatePrefixAttribute","container","shadowRoot","querySelector","prefixSlot","hasPrefix","assignedNodes","flatten","length","setBooleanAttribute","updateSuffixAttribute","suffixSlot","hasSuffix","afterRender","event","target","dispatchControlEvent","_initProto","html","clamp01","value","Math","max","min","hsvToRgb","h","s","v","hue","saturation","c","x","abs","m","r","g","b","round","rgbToHsv","rn","gn","bn","delta","rgbToHex","toHex","component","toString","padStart","toUpperCase","hexToRgb","hex","normalized","trim","test","match","exec","parseInt","hexToHsv","rgb","hsvToHex","isValidHex","getLuminance","isLightColor","hsvToHsl","l","sl","hslToHsv","sv","getColorComponents","hsv","format","h","s","v","labels","values","hsvToHex","max","suffix","rgb","hsvToRgb","r","g","b","hsl","hsvToHsl","Math","round","l","updateHsvFromComponents","index","value","newHsv","isValidHex","parsed","hexToHsv","vals","min","Number","rgbToHsv","hslToHsv","COLOR_FORMATS","nothing","classMap","ifDefined","repeat","styleMap","unsafeHTML","when","styleObject","input","definedEntries","Object","entries","reduce","acc","property","value","undefined","styleMap","html","HTMLElement","Component","tag","styles","template","html","IconArrowsVertical","html","HTMLElement","Component","tag","styles","template","html","IconPicker","HTMLElement","saturationArea","hueArea","hexInput","value","Component","tag","autoSlot","styles","template","h","s","v","hsv","pureHue","hsvToRgb","currentRgb","saturationBg","r","g","b","huePercent","vInverted","saturationHandleStyles","left","top","hueHandleStyles","isLight","isLightColor","hasEyeDropper","window","previewStyles","backgroundColor","components","getColorComponents","format","html","styleMap","handleSaturationPointerDown","handleSaturationPointerMove","handleSaturationPointerUp","handleHuePointerDown","handleHuePointerMove","handleHuePointerUp","handleEyeDropperClick","handleFormatCycle","formatAnimating","toUpperCase","values","e","handleComponentChange","target","labels","map","_","i","max","String","Number","handleCancelButtonClick","handleApplyButtonClick","_dec1","Query","_dec2","_dec3","_dec4","Prop","reflect","defaultValue","onChange","isInternalUpdate","updateFromHex","ColorPicker","connectedCallback","originalValue","hex","isValidHex","hexToHsv","event","newValue","hsvToHex","document","activeElement","dispatchControlEvent","updateSaturationValue","rect","getBoundingClientRect","x","Math","min","width","clientX","y","height","clientY","requestRender","updateHue","button","undefined","preventDefault","stopPropagation","pointerId","setPointerCapture","hasPointerCapture","releasePointerCapture","handleHexInputChange","input","index","updateHsvFromComponents","handleFormatChange","setTimeout","currentIndex","COLOR_FORMATS","indexOf","nextIndex","length","eyeDropper","EyeDropper","result","open","sRGBHex","HTMLElement","dropdown","value","disabled","placement","Component","tag","styles","_dec1","Query","_dec2","Prop","reflect","defaultValue","onChange","next","isValidHex","normalized","toUpperCase","_dec3","type","Boolean","_dec4","ColorInput","connectedCallback","querySelector","setBooleanAttribute","afterRender","swatchStyle","backgroundColor","html","styleMap","render","_initProto","event","target","dispatchControlEvent","detail","requestRender","open","html","HTMLElement","label","fullWidth","Component","tag","autoSlot","shadowMode","styles","template","html","_dec1","Prop","reflect","_dec2","type","Boolean","Field","_initProto","html","HTMLElement","Component","tag","styles","template","html","IconClear","html","HTMLElement","state","Component","tag","styles","observedAttributes","_dec1","Prop","reflect","attribute","defaultValue","IconGrid","render","html","_initProto","html","HTMLElement","Component","tag","styles","template","html","Loading","html","HTMLElement","state","Component","tag","styles","observedAttributes","_dec1","Prop","reflect","attribute","defaultValue","Snap","render","defaultPath","defaultPath2","activePath","activePath2","path1","path2","html","_initProto","html","HTMLElement","Component","tag","styles","template","html","IconAnchorAdd","html","HTMLElement","Component","tag","styles","template","html","IconAnchorRemove","html","HTMLElement","Component","tag","styles","template","html","ArrowUp","html","HTMLElement","Component","tag","styles","template","html","IconBezier","html","HTMLElement","Component","tag","styles","template","html","IconBezierAngle","html","HTMLElement","Component","tag","styles","template","html","IconBezierDistribute","html","HTMLElement","Component","tag","styles","template","html","IconBezierLength","html","HTMLElement","Component","tag","styles","template","html","IconBezierMirror","html","HTMLElement","Component","tag","styles","template","html","IconCheck","html","HTMLElement","Component","tag","styles","template","html","IconCircleArrowLeft","html","HTMLElement","Component","tag","styles","template","html","IconCircleArrowRight","html","HTMLElement","Component","tag","styles","template","html","IconCode","html","HTMLElement","Component","tag","styles","template","html","IconDots","html","HTMLElement","Component","tag","styles","template","html","IconMention","html","HTMLElement","Component","tag","styles","template","html","IconMinus","html","HTMLElement","Component","tag","styles","template","html","IconPlus","html","HTMLElement","Component","tag","styles","template","html","Settings","html","HTMLElement","loading","intro","size","ariaLabel","CENTER","x","y","DOTS_DATA","id","cx","cy","INNER_DOT_IDS","OUTER_DOT_IDS","map","d","filter","includes","forceReflow","el","window","getComputedStyle","opacity","getAngle","dot","Math","atan2","sortByAngle","ids","find","sort","a","b","LOOP_DURATION","ROTATION_DURATION","Component","tag","styles","template","host","state","ariaLabelTrimmed","trim","html","_dec1","Prop","type","Boolean","attribute","defaultValue","onChange","next","handleLoadingChange","_dec2","_dec3","Number","_dec4","LogoLoader","value","requestRender","connectedCallback","requestAnimationFrame","disconnectedCallback","clearTimeout","fn","delay","setTimeout","push","svg","shadowRoot","querySelector","instant","keepOpacity","container","innerHTML","style","transition","classList","remove","removeProperty","transform","onComplete","innerDotIds","Set","innerDots","has","outerDots","orderedInner","forEach","index","fill","orderedOuter","particles","finalAngle","startDistance","random","angleVariation","PI","startAngle","startX","cos","startY","sin","curvature","controlAngle","controlDistance","controlX","controlY","group","floor","groupDelay","withinGroupDelay","duration","impactTime","rotationSpeed","isInner","shockwaveParticles","p","slice","shockwaveSet","particle","steps","step","animateStep","progress","t","mt","easeOut","scale","rotation","bounceDuration","add","earlyRevealTime","max","maxTime","ring","document","createElementNS","setAttribute","String","appendChild","performance","now","orderedInnerDots","seedDelay","targetScale","setProperty","angle","normalizedAngle","animationDelayMs","orderedOuterDots","baseScale","elapsed","timeInCycle","timeLeft","orderedAllDots","i","length","playIntro","variant","originalIntro","_initProto","html","renderQueue","WeakMap","scheduleRender","instance","requestRender","render","get","set","requestAnimationFrame","defaultCompare","previous","next","Watch","options","compare","onChange","transform","accessor","context","kind","Error","call","value","init","initialValue","html","HTMLElement","paused","canvasEl","clamp","value","min","max","Math","mean","values","length","sum","quantile","sorted","q","clamped","index","floor","computePercentile","sort","a","b","computeMedian","formatNumber","decimals","Number","isFinite","toFixed","formatMs","rateFps","fps","targetFps","target","ratio","Component","tag","autoSlot","shadowMode","styles","_dec1","Prop","type","Boolean","reflect","defaultValue","_dec2","Query","MonitorFps","connectedCallback","document","hidden","disconnectedCallback","removeEventListener","afterRender","render","hz","refreshRate","rating","subtitleParts","frameTimeAvg","frameTimeP95","filter","html","join","droppedFrames","jankFrames","longFrames","frameTimeMax","addEventListener","passive","now","performance","requestAnimationFrame","cancelAnimationFrame","frameWindow","slice","fpsWindow","frameAvg","frameP95","frameMax","median","ideal","ft","missed","round","dispatchEvent","CustomEvent","detail","bubbles","composed","canvas","rect","getBoundingClientRect","dpr","window","devicePixelRatio","width","height","ctx","getContext","setTransform","clearRect","samples","scaleMax","stroke","save","globalAlpha","strokeStyle","lineWidth","setLineDash","drawGuide","y","beginPath","moveTo","lineTo","restore","toY","i","x","closePath","fillStyle","fill","lineJoin","lineCap","_initProto","delta","push","shift","elapsed","fpsSample","requestRender","HTMLElement","metrics","network","METRIC_THRESHOLDS","LCP","good","poor","INP","CLS","FCP","ttfb","loadTime","domInteractive","fps","TBT","GLOBAL_BENCHMARKS","rateMetric","metric","value","thresholds","formatMetric","toFixed","Math","round","formatBytes","bytes","decimals","Number","isFinite","k","dm","sizes","i","floor","log","parseFloat","estimateCarbonFootprint","totalBytes","emissions","Component","tag","styles","_dec1","Watch","_dec2","_dec3","Listen","Monitor","handleFpsUpdate","connectedCallback","initObservers","collectInitialMetrics","startMemoryMonitoring","initNetworkMonitoring","document","readyState","window","addEventListener","handlePageLoad","disconnectedCallback","observers","forEach","observer","disconnect","stopMemoryMonitoring","stopNetworkMonitoring","removeEventListener","event","detail","updateTrend","requestRender","console","warn","PerformanceObserver","list","entry","getEntries","processPerformanceEntry","observe","type","buffered","push","e","error","collectNavigationTiming","resourceEntries","performance","getEntriesByType","processResourceEntries","navigationEntries","length","navTiming","responseStart","fetchStart","loadEventEnd","startTime","navigation","entryType","coreWebVitals","eventEntry","interactionId","duration","maxINP","inpEntries","lsEntry","hadRecentInput","clsEntries","calculateSessionWindowCLS","name","ltEntry","longTaskEntries","calculateLongTasksAndTBT","maxCls","currentSessionCls","sessionStartTime","Infinity","lastTime","sort","a","b","timeDiff","max","entries","summary","resources","size","transferSize","initiator","initiatorType","toLowerCase","endsWith","js","count","css","test","img","other","totalSize","tbt","referenceTime","task","longTasks","totalDuration","memory","updateMemory","mem","jsHeapSizeLimit","totalJSHeapSize","usedJSHeapSize","memoryInterval","setInterval","clearInterval","navigator","connection","updateNetworkInfo","key","history","trendHistory","maxTrendLength","shift","getTrendDirection","currentValue","previousAvg","slice","reduce","threshold","abs","delta","getOverallStatus","ratings","includes","every","r","some","render","html","renderExpanded","renderVitalsAndTiming","renderRealtime","renderNetworkInfo","renderResources","renderMetricBox","label","description","rating","formattedValue","trend","benchmark","vsBenchmark","renderMemory","usedPercent","styleObject","width","min","effectiveType","rtt","toUpperCase","totalCount","renderItem","data","_initProto","setTimeout","html","HTMLElement","value","min","max","step","name","disabled","control","Component","tag","styles","template","html","handleInput","handleChange","handleDecrement","bind","Number","handleIncrement","_dec1","Prop","type","reflect","_dec2","_dec3","_dec4","_dec5","_dec6","Boolean","_dec7","Query","_dec8","Listen","selector","_dec9","NumberInput","afterRender","undefined","String","setBooleanAttribute","event","target","coerceNumber","dispatchControlEvent","addActiveLayer","button","layer","document","createElement","classList","add","appendChild","setTimeout","remove","currentTarget","current","_initProto","html","HTMLElement","value","disabled","control","name","Component","tag","styles","template","html","handleValueChange","_dec1","Prop","reflect","defaultValue","_dec2","type","Boolean","_dec3","Query","_dec4","_dec5","Listen","selector","Origin","handleChange","afterRender","setBooleanAttribute","event","target","String","dispatchControlEvent","_initProto","html","nothing","HTMLElement","activeTab","contentElement","bodyElement","Component","tag","shadowMode","styles","_dec1","Prop","type","Number","reflect","attribute","defaultValue","onChange","next","previous","self","undefined","handleActiveTabChange","_dec2","Query","_dec3","_dec4","Listen","selector","_dec5","Panel","onFooterSlotChange","onDefaultSlotChange","performTabAnimation","tabs","setTab","index","length","connectedCallback","afterRender","render","hasTabs","html","nothing","map","tab","id","e","label","event","dispatchEvent","CustomEvent","detail","bubbles","composed","currentIndex","newIndex","key","preventDefault","queueMicrotask","tabButtons","shadowRoot","querySelectorAll","newTabButton","focus","fromIndex","toIndex","duration","easing","content","requestRender","fromPanel","querySelector","toPanel","startHeight","getBoundingClientRect","height","style","display","opacity","fadeOut","animate","fill","finished","cancel","setAttribute","previousToState","getAttribute","visibility","offsetHeight","endHeight","fadeIn","removeAttribute","ms","Promise","resolve","setTimeout","child","Array","from","children","slot","startsWith","replace","push","slice","updateFooterAttribute","footer","footerSlot","hasFooter","Boolean","assignedNodes","flatten","setBooleanAttribute","_initProto","html","RadioOption","HTMLElement","connectedCallback","hidden","hasAttribute","setAttribute","customElements","get","define","HTMLElement","value","groupElement","contentSlot","nextOptionId","counter","nextPanelId","Component","tag","shadowMode","styles","template","html","_dec1","Prop","reflect","defaultValue","onChange","next","previous","updateOptionSelectionState","_dec2","Query","_dec3","RadioGroup","connectedCallback","disconnectedCallback","afterRender","panel","id","tabIndex","setAttribute","queueMicrotask","slot","removeEventListener","addEventListener","assigned","assignedElements","flatten","elements","filter","node","options","forEach","element","hasAttribute","getAttribute","label","trim","length","dataset","active","handlers","click","event","preventDefault","stopPropagation","keydown","key","passive","push","preselected","find","option","selected","selectedLabel","isSelected","fallback","hasValue","Boolean","toggleAttribute","originEvent","previousValue","explicitValue","text","textContent","explicitLabel","dispatchControlEvent","dispatchEvent","CustomEvent","detail","bubbles","composed","_initProto","html","HTMLElement","checked","name","value","disabled","control","Component","tag","shadowMode","styles","template","html","filterId","_dec1","Prop","type","Boolean","reflect","onChange","next","form","closest","root","getRootNode","others","Array","from","querySelectorAll","forEach","other","_dec2","_dec3","_dec4","_dec5","Query","_dec6","Listen","selector","RadioInput","handleClick","connectedCallback","_prevChecked","afterRender","_firstRender","changed","_triggerAnimation","setAttribute","setBooleanAttribute","input","shadowRoot","querySelector","svg","classList","remove","animClass","add","duration","setTimeout","event","preventDefault","stopPropagation","dispatchControlEvent","_initProto","crypto","randomUUID","html","HTMLElement","value","min","max","step","disabled","control","valueControl","Component","tag","styles","template","html","String","Boolean","undefined","_dec1","Prop","type","Number","reflect","_dec2","_dec3","_dec4","_dec5","_dec6","Query","_dec7","_dec8","Listen","selector","_dec9","_dec10","when","event","CustomEvent","detail","_dec11","Slider","handleRangeInput","handleRangeChange","handleValueInput","handleValueChange","afterRender","setAttribute","setBooleanAttribute","updateProgress","target","numericValue","coerceNumber","dispatchControlEvent","rawValue","percent","style","setProperty","Math","_initProto","html","HTMLElement","value","defaultSlot","readControlValue","element","checked","attr","getAttribute","textContent","trim","getControlName","name","Component","tag","shadowMode","styles","_dec1","Prop","reflect","_dec2","Query","_dec3","Listen","target","host","_dec4","_dec5","CONTROL_CHANGE_EVENT","State","handleInternalInput","handleInternalChange","handleControlChange","state","get","set","control","Event","subscribe","nameOrCallback","callback","cb","Error","has","Set","add","unsubscribe","delete","reset","Object","entries","connectedCallback","addEventListener","disconnectedCallback","removeEventListener","render","html","event","detail","Element","slot","findControls","el","controls","push","shadowRoot","child","querySelectorAll","childName","clear","elements","assignedElements","flatten","first","values","next","String","prevValue","dispatchControlEvent","_initProto","Map","html","HTMLElement","checked","disabled","control","Component","tag","styles","template","html","filterId","_dec1","Prop","type","Boolean","reflect","_dec2","_dec3","Query","_dec4","Listen","selector","Toggle","handleClick","afterRender","setAttribute","setBooleanAttribute","event","preventDefault","stopPropagation","dispatchControlEvent","value","_initProto","crypto","randomUUID","html","HTMLElement","open","delay","placement","triggerElement","contentElement","Component","tag","shadowMode","styles","_dec1","Prop","type","Boolean","reflect","onChange","next","previous","_handleOpenChange","_dec2","Number","defaultValue","_dec3","_dec4","Query","_dec5","_dec6","OutsideClick","content","host","triggers","disabled","Tooltip","handleOutsideDismiss","disconnectedCallback","removeEventListener","afterRender","isVisible","setAttribute","dataset","hidden","render","html","requestOutsideClickUpdate","window","clearTimeout","callback","wait","setTimeout","trigger","addEventListener","_initProto","html","SUPPORTS_HIGHLIGHT_API","window","CSS","highlights","Highlight","getHighlightAPI","w","DEFAULT_THEME","keyword","string","comment","number","operator","tag","attribute","property","type","variable","selector","function","generateHighlightStyles","instanceId","theme","styles","color","Object","entries","highlightName","italic","JS_BASE","TS_ADDITIONS","HTML_BASE","CSS_BASE","JSON_BASE","baseGrammars","javascript","js","typescript","ts","html","css","json","TSX_GRAMMAR","filter","type","GRAMMARS","tsx","jsx","tokenize","code","language","grammar","GRAMMARS","toLowerCase","regexParts","groupMap","Map","groupIndex","forEach","type","pattern","groupName","set","push","source","masterRegex","RegExp","join","tokens","match","exec","index","lastIndex","groups","undefined","get","start","end","length","tagNameMatch","tagNameStart","tagNameEnd","normalizeIndent","lines","split","filter","line","trim","minIndent","Math","min","map","substring","HTMLElement","language","codeElement","Component","tag","shadowMode","autoSlot","styles","template","html","_dec1","Prop","reflect","_dec2","Query","Code","connectedCallback","MutationObserver","observe","childList","subtree","characterData","disconnectedCallback","disconnect","attributeChangedCallback","name","currentLanguage","toLowerCase","afterRender","shadowRoot","querySelectorAll","style","remove","type","rawCode","textContent","normalizeIndent","trim","SUPPORTS_HIGHLIGHT_API","textNode","firstChild","code","api","getHighlightAPI","tokens","tokenize","highlightMap","Map","token","start","end","range","document","createRange","setStart","setEnd","has","set","get","push","ranges","entries","length","highlightName","highlight","Highlight","highlights","add","delete","clear","_initProto","crypto","randomUUID","Set","createElement","setAttribute","highlightStyles","generateHighlightStyles","appendChild","html","cubicBezierToLinearPoints","points","start","x","y","cpOutX","p1","cpOutY","isLinked","mirrorLength","end","cpInX","p2","cpInY","canvasStyles","controlsStyles","outputStyles","containerStyles","canvasControlsStyles","toolbarStyles","EasingType","MIN_LINEAR_POINTS","MAX_LINEAR_POINTS","clampPoint","point","bounds","minX","maxX","minY","maxY","x","Math","max","min","y","MIN_LINEAR_DELTA","linearPointIdCounter","nextLinearPointId","ensureLinearPointId","id","cloneLinearPoint","sourceId","cubicBezierPath","points","p1","p2","startX","startY","endX","endY","cp1x","cp1y","cp2x","cp2y","linearDisplayPath","length","toSvg","p","startPoint","start","d","index","cp1","cpOutX","cpOutY","cp2","cpInX","cpInY","end","svgCp1","svgCp2","perpendicularDistance","lineStart","lineEnd","dx","dy","sqrt","numerator","abs","denominator","simplifyPoints","epsilon","dmax","endPoint","i","recResults1","slice","recResults2","generateCubicBezierCSS","name","variant","timingFunction","toFixed","code","getLinearApproximation","options","simplify","round","samples","numSamplesPerSegment","sortedPoints","sort","a","b","push","step","t","cubicBezier","normalizedSamples","lastX","sample","clampedX","clampedY","firstPoint","firstSample","lastPoint","lastSample","finalSamples","map","Number","generateLinearCSS","Array","isArray","parts","join","cubicBezier","t","p0","p1","p2","p3","u","tt","uu","uuu","ttt","normalizeLinearPoints","points","length","normalized","sort","a","b","x","map","point","cloneLinearPoint","first","last","index","minY","maxY","y","Math","max","min","cpInX","cpOutX","handleThreshold","abs","cpInY","cpOutY","undefined","isLinked","mirrorLength","clamp01","value","Number","isNaN","parseCubicBezierValue","input","match","trim","body","parts","split","part","parseFloat","filter","isFinite","x1","y1","x2","y2","some","p1","p2","ensureStopPositions","stops","lastIndex","assignBetween","startIndex","endIndex","startStop","endStop","span","segments","offset","ratio","target","lastDefined","parseLinearTimingFunction","segment","valueToken","position","token","percentMatch","percentValue","parsed","push","rawPoints","stop","vectorLength","dx","dy","sqrt","normalizeVector","smoothLinearPoints","tension","prev","next","smoothedPoint","handleLength","tangentX","tangentY","tangentLength","normalizedTx","normalizedTy","distToPrev","distToNext","inHandleLength","outHandleLength","html","svg","HIT_AREA_RADIUS","LINEAR_HIT_THRESHOLD","LINEAR_PATH_SAMPLES","DRAG_ACTIVATION_DISTANCE_PX","DRAG_ACTIVATION_DISTANCE_PX_SQUARED","DEFAULT_HANDLE_LENGTH","SVG_WIDTH","SVG_HEIGHT","BEZIER_CONTROL_MIN_Y","BEZIER_CONTROL_MAX_Y","EASING_PRESETS","label","options","value","svg","generateGridLines","gridStep","lines","xSteps","Math","ceil","SVG_WIDTH","ySteps","SVG_HEIGHT","i","x","push","svg","y","dispatchControlEvent","host","type","detail","dispatchEvent","CustomEvent","bubbles","composed","HTMLElement","easingType","points","showGrid","snapToGrid","gridSize","focusedLinearIndex","simplify","round","svgElement","Component","tag","styles","canvasStyles","template","hoverPreviewPath","getHoverCurvePath","controlElements","getControlElements","hoverInsertElements","getHoverInsertElements","curvePath","getCurvePath","html","SVG_WIDTH","SVG_HEIGHT","handlePointerDown","handlePointerMove","handlePointerUp","handlePointerLeave","svg","getGridLines","_dec1","Prop","reflect","_dec2","type","Object","_dec3","Boolean","defaultValue","_dec4","_dec5","Number","_dec6","_dec7","_dec8","_dec9","Query","CurveCanvas","elements","point","anchorSvg","index","direction","dx","cpInX","cpOutX","dy","cpInY","cpOutY","handlePos","x","y","handleSvg","role","dragMode","isHandleActive","handlePath","push","HIT_AREA_RADIUS","Math","EasingType","LINEAR","preview","insertedPoint","anchor","undefined","handlePoint","vecX","vecY","length","sqrt","circleRadius","barHalfHeight","dirX","dirY","perpX","perpY","cx","cy","transitionZone","min","barEndDist","barTopStartX","barTopStartY","barBottomStartX","barBottomStartY","barTopEndX","barTopEndY","barBottomEndX","barBottomEndY","circleTopX","circleTopY","circleBottomX","circleBottomY","ctrl1Dist","ctrl2Dist","ctrl1TopX","ctrl1TopY","ctrl2TopX","ctrl2TopY","ctrl1BottomX","ctrl1BottomY","ctrl2BottomX","ctrl2BottomY","POSITIVE_INFINITY","minDistanceSquared","start","end","cp1","cp2","sample","LINEAR_PATH_SAMPLES","t","samplePoint","evaluateCubicPointNormalized","distanceSquared","distance","LINEAR_HIT_THRESHOLD","position","mouseSvg","thresholdSquared","pointSvg","handleIn","handleInSvg","hdx","hdy","handleOut","handleOutSvg","prev","next","refDx","refDy","normalizeVector","DEFAULT_HANDLE_LENGTH","normalized","referenceLength","vectorLength","inLength","outLength","mirrorLength","isLinked","targetLength","max","outDirection","inDirection","generateGridLines","CUBIC_BEZIER","event","workingPosition","currentPoint","activePointId","ensureLinearPointId","shiftKey","startPoint","get","deltaX","abs","deltaY","constrainedPoint","updatedPoints","map","i","normalizedPoints","normalizeLinearPoints","newIndex","findIndex","id","requestRender","updatedPoint","mirrorAngle","draggedLength","MIN_LINEAR_DELTA","existingLength","candidate","insertedIndex","insertedPointId","pointId","MAX_LINEAR_POINTS","clamped","clampPoint","minY","maxY","insertIndex","splitResult","splitCurveSegment","newPrev","newPoint","newNext","slice","normalizedIndex","path","linearDisplayPath","_initProto","root","getRootNode","ShadowRoot","host","console","warn","anchorStart","anchorEnd","controlOne","p1","controlTwo","p2","handlePathOne","handlePathTwo","error","p","focusedIndex","forEach","isPointFocused","isDraggingPoint","isPointActive","cubicBezierPath","approxPoints","getLinearApproximation","hoverPoint","Array","isArray","Map","set","cloneLinearPoint","options","rect","getBoundingClientRect","svgX","clientX","left","svgY","clientY","top","width","height","skipSnap","shouldSnap","ratioX","ratioY","bezierBounds","BEZIER_CONTROL_MIN_Y","BEZIER_CONTROL_MAX_Y","sourcePoint","value","target","detail","dispatchControlEvent","newLinkingState","preventDefault","linearPoints","SVGElement","getAttribute","indexAttribute","parseInt","isNaN","setPointerCapture","pointerId","mode","startX","startY","insertResult","skipSnapForPending","DRAG_ACTIVATION_DISTANCE_PX_SQUARED","adjustedPosition","reference","clampedPosition","previousIndex","hasPointerCapture","releasePointerCapture","lerp","a","b","lerpPoint","findTForX","p0","p3","minT","maxT","tolerance","maxIterations","px","wasCurved","P01","P12","P23","P012","P123","P_new","html","HTMLElement","easingType","points","focusedLinearIndex","Component","tag","styles","canvasControlsStyles","template","easingType","EasingType","LINEAR","Array","isArray","points","focusedIndex","focusedLinearIndex","selectedPoint","isInnerPoint","length","hasInHandle","cpInX","undefined","cpInY","hasOutHandle","cpOutX","cpOutY","hasAnyHandle","html","isLinked","handleToggleMirrorAngle","mirrorLength","handleToggleMirrorLength","handleRemoveSmoothing","handleAddSmoothing","_dec1","Prop","reflect","_dec2","type","Object","_dec3","Number","defaultValue","CanvasControls","HTMLElement","point","index","prev","next","refDx","refDy","dirX","dirY","x","y","direction","normalizeVector","DEFAULT_HANDLE_LENGTH","dx","dy","normalized","referenceLength","vectorLength","inLength","outLength","targetLength","Math","max","outDirection","inDirection","_initProto","root","getRootNode","ShadowRoot","host","value","event","target","detail","dispatchControlEvent","preventDefault","updatedPoints","updatedPoint","nextState","normalizedPoints","normalizeLinearPoints","existingPoint","html","HTMLElement","easingType","points","showGrid","snapToGrid","gridSize","focusedLinearIndex","Component","tag","styles","controlsStyles","template","html","_activePresetValue","handlePresetSelection","EASING_PRESETS","map","label","options","index","value","easingType","handleTypeChange","EasingType","CUBIC_BEZIER","LINEAR","_dec1","Prop","reflect","_dec2","type","Object","onChange","handlePointsPropChange","_dec3","Boolean","defaultValue","_dec4","_dec5","Number","_dec6","handleFocusedLinearIndexPropChange","CurveControls","HTMLElement","points","showGrid","snapToGrid","gridSize","focusedLinearIndex","requestRender","_value","isApplyingPreset","maxPointsReached","length","MAX_LINEAR_POINTS","minPointsReached","MIN_LINEAR_POINTS","renderLinearDetailsControls","focusedIndex","selectedPoint","previousIndex","nextIndex","isInnerPoint","pointMeta","x","toFixed","y","pointType","isLinked","hasInHandle","cpInX","undefined","cpInY","hasOutHandle","cpOutX","cpOutY","hasAnyHandle","event","mirrorLength","point","prev","next","refDx","refDy","dirX","dirY","direction","normalizeVector","DEFAULT_HANDLE_LENGTH","dx","dy","normalized","referenceLength","vectorLength","inLength","outLength","targetLength","Math","max","outDirection","inDirection","isStart","handleKey","handleLabel","hasHandle","neighbor","handle","fallbackDirection","finalDirection","gap","abs","baseLength","MIN_LINEAR_DELTA","min","updatedPoints","filter","_","pointIndex","normalizedPoints","normalizeLinearPoints","_initProto","root","getRootNode","ShadowRoot","host","Array","isArray","target","HTMLInputElement","axis","dataset","parsed","parseFloat","isNaN","updated","previous","minX","maxX","refreshedPoint","preventDefault","currentTarget","HTMLButtonElement","updatedPoint","nextState","mode","existingPoint","removeIncoming","removeOutgoing","neighborIndex","resetCurve","defaults","p1","p2","distributeLinearPoints","lastIndex","step","distributed","presetValue","detail","originEvent","rawValue","cssValue","trim","startsWith","parseCubicBezierValue","parsedLinear","parseLinearTimingFunction","smoothedLinear","smoothLinearPoints","handleSelectCubic","handleSelectLinear","addLinearPoint","insertIndex","largestGap","start","end","startPoint","endPoint","newPointPosition","clampPoint","newPoint","slice","insertedIndex","removeLinearPoint","removeIndex","smallestSpan","POSITIVE_INFINITY","span","toggleGrid","nextValue","toggleSnapToGrid","incrementGridSize","decrementGridSize","handleGridSliderInput","handleGridSizeChange","String","round","dispatchControlEvent","html","HTMLElement","easingType","points","name","variant","simplify","round","Component","tag","styles","outputStyles","template","html","generatedCSS","code","handleCopyClick","copyStatus","_dec1","Prop","type","String","reflect","_dec2","Object","_dec3","defaultValue","_dec4","_dec5","Number","_dec6","CurveOutput","timingFunction","EasingType","CUBIC_BEZIER","Array","isArray","generateCubicBezierCSS","LINEAR","generateLinearCSS","isAnimating","handlePreviewClick","event","disconnectedCallback","clearTimeout","_initProto","preventDefault","navigator","clipboard","writeText","window","setTimeout","requestRender","error","console","offsetHeight","html","HTMLElement","easingType","points","showGrid","snapToGrid","gridSize","simplify","round","Component","tag","styles","toolbarStyles","template","isGridAtMinimum","gridSize","isGridAtMaximum","isLinear","easingType","EasingType","LINEAR","points","Array","isArray","html","showGrid","toggleGrid","snapToGrid","toggleSnapToGrid","resetCurve","addLinearPoint","length","MAX_LINEAR_POINTS","removeLinearPoint","MIN_LINEAR_POINTS","distributeLinearPoints","decrementGridSize","incrementGridSize","simplify","handleSimplifyInput","round","handleRoundInput","_dec1","Prop","reflect","_dec2","type","Object","_dec3","Boolean","defaultValue","_dec4","_dec5","Number","_dec6","_dec7","CurveToolbar","HTMLElement","_initProto","root","getRootNode","ShadowRoot","host","value","event","target","detail","dispatchControlEvent","preventDefault","nextValue","CUBIC_BEZIER","defaults","p1","x","y","p2","lastIndex","step","distributed","map","point","index","updated","parseFloat","toFixed","cpInX","cpInY","cpOutX","cpOutY","isLinked","normalizedPoints","normalizeLinearPoints","insertIndex","largestGap","start","end","gap","startPoint","endPoint","newPointPosition","clampPoint","minY","maxY","newPoint","mirrorLength","updatedPoints","slice","insertedIndex","removeIndex","smallestSpan","POSITIVE_INFINITY","previous","next","span","filter","_","pointIndex","nextIndex","customEvent","Math","max","min","requestRender","HTMLElement","name","easingType","points","showGrid","snapToGrid","gridSize","simplify","round","focusedLinearIndex","Component","tag","styles","containerStyles","template","html","_dec1","Prop","reflect","defaultValue","_dec2","EasingType","CUBIC_BEZIER","onChange","next","previous","getDefaultPointsForType","_dec3","type","Object","p1","x","y","p2","_dec4","Boolean","_dec5","_dec6","Number","_dec7","_dec8","_dec9","_dec10","Listen","target","_dec11","_dec12","_dec13","_dec14","_dec15","_dec16","_dec17","passive","_dec18","Curve","handleEasingTypeChange","handleGridToggle","handleSnapToggle","handleGridSizeChange","handleSimplifyChange","handleRoundChange","handlePointsChange","handleKeyboardShortcuts","handleLinearPointFocus","event","value","detail","previousType","previousPoints","LINEAR","Array","isArray","bezierPoints","linearPoints","cubicBezierToLinearPoints","emitPointsChange","Math","max","min","requestRender","length","defaultPrevented","activeElement","HTMLInputElement","HTMLTextAreaElement","isContentEditable","index","lastIndex","clonedPoints","map","point","step","shiftKey","handled","key","minX","MIN_LINEAR_DELTA","maxX","MIN_LINEAR_POINTS","splice","normalized","normalizeLinearPoints","nextFocus","preventDefault","sourceEvent","Event","dispatchEvent","CustomEvent","bubbles","composed","_initProto"]}
|