@fab1o978/react-ui 0.1.7 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/Badge/index.d.cts +3 -3
- package/dist/components/Badge/index.d.ts +3 -3
- package/dist/components/Button/index.d.cts +3 -3
- package/dist/components/Button/index.d.ts +3 -3
- package/dist/components/ColorPicker/index.cjs +3 -1
- package/dist/components/ColorPicker/index.cjs.map +1 -1
- package/dist/components/ColorPicker/index.d.cts +2 -2
- package/dist/components/ColorPicker/index.d.ts +2 -2
- package/dist/components/ColorPicker/index.js +3 -1
- package/dist/components/ColorPicker/index.js.map +1 -1
- package/dist/components/ColorWheel/index.cjs +671 -0
- package/dist/components/ColorWheel/index.cjs.map +1 -0
- package/dist/components/ColorWheel/index.css +494 -0
- package/dist/components/ColorWheel/index.css.map +1 -0
- package/dist/components/ColorWheel/index.d.cts +49 -0
- package/dist/components/ColorWheel/index.d.ts +49 -0
- package/dist/components/ColorWheel/index.js +669 -0
- package/dist/components/ColorWheel/index.js.map +1 -0
- package/dist/components/Input/index.d.cts +5 -5
- package/dist/components/Input/index.d.ts +5 -5
- package/dist/components/RainCanvas/index.d.cts +4 -4
- package/dist/components/RainCanvas/index.d.ts +4 -4
- package/dist/components/RichTextEditor/index.d.cts +6 -6
- package/dist/components/RichTextEditor/index.d.ts +6 -6
- package/dist/components/SliderControl/index.cjs +3 -1
- package/dist/components/SliderControl/index.cjs.map +1 -1
- package/dist/components/SliderControl/index.d.cts +5 -4
- package/dist/components/SliderControl/index.d.ts +5 -4
- package/dist/components/SliderControl/index.js +3 -1
- package/dist/components/SliderControl/index.js.map +1 -1
- package/dist/components/SlidingCounter/index.d.cts +2 -2
- package/dist/components/SlidingCounter/index.d.ts +2 -2
- package/dist/components/Timeline/index.d.cts +3 -3
- package/dist/components/Timeline/index.d.ts +3 -3
- package/dist/index.cjs +591 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.css +494 -0
- package/dist/index.css.map +1 -1
- package/dist/index.d.cts +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +592 -3
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/ColorWheel/ColorWheel.module.scss","../../../src/components/ColorWheel/usePointerDrag.ts","../../../src/components/ColorWheel/useUnwrappedAngle.ts","../../../src/utils/color.ts","../../../src/components/ColorWheel/colorMath.ts","../../../src/components/ColorWheel/ColorWheel.tsx"],"names":["root","recents","chipWrap","chip","chipRemove","picker","glow","modeToggle","modePill","modeButton","active","stage","stageShadow","ring","hueHandlePivot","hueHandle","alphaArcShadowWrap","alphaArcShadow","alphaArc","alphaArcFill","alphaArcCap","alphaArcCapStart","alphaArcCapEnd","alphaArcHandle","currentDisc","discFill","currentHex","currentHexInput","copied","discBadge","discBadgeTop","pulse","discBadgeBottom","useRef","useEffect","dragging"],"mappings":"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","file":"index.js","sourcesContent":[".root {\n --bg: #ECEAE3;\n --surface: #FFFFFF;\n --surface-2: #E3E0D8;\n --border: #D2CDC0;\n --text: #1A1913;\n --text-dim: #726F64;\n --text-faint: #A8A398;\n --shadow-soft: 0 1px 2px rgba(30, 25, 15, 0.08);\n --check-a: #d8d4c8;\n --check-b: #f4f2ec;\n color-scheme: light;\n}\n@media (prefers-color-scheme: dark) {\n .root:not([data-theme=light]):not([data-theme=dark]) {\n --bg: #131217;\n --surface: #1C1B22;\n --surface-2: #26252E;\n --border: #34333D;\n --text: #ECEAF0;\n --text-dim: #8E8C99;\n --text-faint: #605E6B;\n --shadow-soft: 0 1px 2px rgba(0, 0, 0, 0.35);\n --check-a: #37353f;\n --check-b: #201f26;\n color-scheme: dark;\n }\n}\n:global([data-theme='light']) .root:not([data-theme=light]):not([data-theme=dark]) {\n --bg: #ECEAE3;\n --surface: #FFFFFF;\n --surface-2: #E3E0D8;\n --border: #D2CDC0;\n --text: #1A1913;\n --text-dim: #726F64;\n --text-faint: #A8A398;\n --shadow-soft: 0 1px 2px rgba(30, 25, 15, 0.08);\n --check-a: #d8d4c8;\n --check-b: #f4f2ec;\n color-scheme: light;\n}\n:global([data-theme='dark']) .root:not([data-theme=light]):not([data-theme=dark]) {\n --bg: #131217;\n --surface: #1C1B22;\n --surface-2: #26252E;\n --border: #34333D;\n --text: #ECEAF0;\n --text-dim: #8E8C99;\n --text-faint: #605E6B;\n --shadow-soft: 0 1px 2px rgba(0, 0, 0, 0.35);\n --check-a: #37353f;\n --check-b: #201f26;\n color-scheme: dark;\n}\n.root[data-theme=dark] {\n --bg: #131217;\n --surface: #1C1B22;\n --surface-2: #26252E;\n --border: #34333D;\n --text: #ECEAF0;\n --text-dim: #8E8C99;\n --text-faint: #605E6B;\n --shadow-soft: 0 1px 2px rgba(0, 0, 0, 0.35);\n --check-a: #37353f;\n --check-b: #201f26;\n color-scheme: dark;\n}\n.root[data-theme=light] {\n --bg: #ECEAE3;\n --surface: #FFFFFF;\n --surface-2: #E3E0D8;\n --border: #D2CDC0;\n --text: #1A1913;\n --text-dim: #726F64;\n --text-faint: #A8A398;\n --shadow-soft: 0 1px 2px rgba(30, 25, 15, 0.08);\n --check-a: #d8d4c8;\n --check-b: #f4f2ec;\n color-scheme: light;\n}\n.root {\n position: relative;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 20px;\n font-family: -apple-system, \"Segoe UI\", Inter, \"Helvetica Neue\", Arial, sans-serif;\n color: var(--text);\n}\n\n@media (prefers-reduced-motion: reduce) {\n .root, .root *, .root *::before, .root *::after {\n animation-duration: 0.01ms !important;\n transition-duration: 0.01ms !important;\n }\n}\n.recents {\n display: flex;\n align-items: center;\n gap: 7px;\n min-height: 30px;\n background: var(--surface-2);\n border-radius: 999px;\n padding: 5px 8px;\n box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.14), var(--shadow-soft);\n}\n\n.chipWrap {\n position: relative;\n flex: none;\n animation: chipIn 0.4s cubic-bezier(0.34, 1.56, 0.64, 1) both;\n}\n\n.chip {\n width: 26px;\n height: 26px;\n border-radius: 50%;\n border: none;\n padding: 0;\n cursor: pointer;\n display: block;\n box-shadow: inset 0 0 0 1px rgba(128, 128, 128, 0.22), var(--shadow-soft);\n transition: transform 0.15s ease, box-shadow 0.15s ease;\n}\n.chip:hover {\n transform: scale(1.14) translateY(-1px);\n box-shadow: inset 0 0 0 1px rgba(128, 128, 128, 0.3), 0 4px 10px -3px rgba(0, 0, 0, 0.3);\n}\n.chip:active {\n transform: scale(1.02);\n}\n\n.chipRemove {\n position: absolute;\n top: -3px;\n right: -3px;\n width: 14px;\n height: 14px;\n border-radius: 50%;\n border: none;\n padding: 0;\n display: grid;\n place-items: center;\n background: var(--surface);\n color: var(--text-dim);\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3), inset 0 0 0 1px rgba(128, 128, 128, 0.25);\n cursor: pointer;\n z-index: 2;\n opacity: 0;\n pointer-events: none;\n transform: scale(0.6);\n transition: opacity 0.12s ease, transform 0.12s ease, color 0.12s ease;\n}\n.chipRemove svg {\n width: 8px;\n height: 8px;\n}\n.chipRemove:hover {\n color: var(--text);\n}\n.chipWrap:hover .chipRemove {\n opacity: 1;\n pointer-events: auto;\n transform: scale(1);\n}\n\n@keyframes chipIn {\n 0% {\n transform: scale(0) rotate(-25deg);\n opacity: 0;\n }\n 100% {\n transform: scale(1) rotate(0);\n opacity: 1;\n }\n}\n.picker {\n position: relative;\n margin-top: 82px;\n height: 265px;\n width: 272px;\n}\n\n.glow {\n position: absolute;\n width: 340px;\n height: 340px;\n left: 50%;\n top: 88px;\n transform: translate(-50%, -50%);\n border-radius: 50%;\n opacity: 0.55;\n pointer-events: none;\n z-index: 0;\n}\n\n.modeToggle {\n position: absolute;\n top: 88px;\n left: 50%;\n transform: translate(-50%, calc(-50% - 156px));\n z-index: 3;\n display: grid;\n background: var(--surface-2);\n border-radius: 999px;\n padding: 3px;\n box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.14), var(--shadow-soft);\n}\n\n.modePill {\n position: absolute;\n top: 3px;\n bottom: 3px;\n left: 3px;\n border-radius: 999px;\n background: var(--surface);\n box-shadow: var(--shadow-soft);\n transition: transform 0.25s cubic-bezier(0.2, 0.8, 0.2, 1);\n}\n\n.modeButton {\n position: relative;\n z-index: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n height: 22px;\n background: none;\n border: none;\n padding: 0;\n font-size: 10.5px;\n font-weight: 700;\n line-height: 22px;\n letter-spacing: 0.02em;\n color: var(--text-dim);\n cursor: pointer;\n transition: color 0.2s ease;\n}\n.modeButton.active {\n color: var(--text);\n}\n.modeButton:hover:not(.active) {\n color: var(--text);\n}\n\n.stage {\n position: absolute;\n top: -48px;\n left: 50%;\n width: 272px;\n height: 272px;\n transform: translateX(-50%);\n touch-action: none;\n}\n\n.stageShadow {\n position: absolute;\n inset: 0;\n border-radius: 50%;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.22), 0 10px 18px rgba(0, 0, 0, 0.22);\n pointer-events: none;\n}\n\n.ring {\n position: absolute;\n inset: 0;\n border-radius: 50%;\n pointer-events: none;\n z-index: 2;\n -webkit-mask: radial-gradient(circle closest-side, transparent 0 92px, black 93px 100%);\n mask: radial-gradient(circle closest-side, transparent 0 92px, black 93px 100%);\n}\n\n.hueHandlePivot {\n position: absolute;\n top: 50%;\n left: 50%;\n width: 0;\n height: 0;\n z-index: 3;\n transition: transform 0.32s cubic-bezier(0.16, 1, 0.3, 1);\n}\n\n.root[data-dragging=true] .hueHandlePivot {\n transition: none;\n}\n\n.hueHandle {\n position: absolute;\n top: -114px;\n left: 0;\n width: 22px;\n height: 22px;\n border-radius: 50%;\n border: 3px solid #fff;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.4), 0 0 0 1px rgba(0, 0, 0, 0.15);\n transform: translate(-50%, -50%);\n cursor: grab;\n z-index: 3;\n}\n\n.alphaArcShadowWrap {\n position: absolute;\n top: 88px;\n left: 50%;\n width: 380px;\n height: 380px;\n transform: translate(calc(-50% + 1px), calc(-50% + 5px));\n z-index: 1;\n pointer-events: none;\n filter: blur(7px);\n}\n\n.alphaArcShadow {\n position: absolute;\n inset: 0;\n background: rgba(0, 0, 0, 0.22);\n clip-path: path(\"M 328.56,270 A 160 160 0 0 1 51.44,270 L 65.29,262 A 144 144 0 0 0 314.71,262 Z\");\n}\n\n.alphaArc {\n position: absolute;\n top: 88px;\n left: 50%;\n width: 380px;\n height: 380px;\n transform: translate(-50%, -50%);\n touch-action: none;\n cursor: grab;\n z-index: 2;\n background: var(--surface-2);\n clip-path: path(\"M 328.56,270 A 160 160 0 0 1 51.44,270 L 65.29,262 A 144 144 0 0 0 314.71,262 Z\");\n}\n\n.alphaArcFill {\n position: absolute;\n inset: 0;\n}\n\n.alphaArcCap {\n position: absolute;\n top: 88px;\n left: 50%;\n width: 16px;\n height: 16px;\n border-radius: 50%;\n z-index: 2;\n pointer-events: none;\n background: var(--surface-2);\n}\n\n.alphaArcCapStart {\n transform: translate(calc(-50% + 131.6px), calc(-50% + 76px));\n}\n\n.alphaArcCapEnd {\n transform: translate(calc(-50% - 131.6px), calc(-50% + 76px));\n}\n\n.alphaArcHandle {\n position: absolute;\n top: 88px;\n left: 50%;\n width: 18px;\n height: 18px;\n border-radius: 50%;\n border: 2px solid #fff;\n box-shadow: 0 1px 4px rgba(0, 0, 0, 0.5), 0 0 0 1px rgba(0, 0, 0, 0.2);\n z-index: 3;\n pointer-events: none;\n transition: transform 0.12s ease;\n}\n\n.root[data-dragging=true] .alphaArcHandle {\n transition: none;\n}\n\n.currentDisc {\n position: absolute;\n top: 50%;\n left: 50%;\n width: 156px;\n height: 156px;\n transform: translate(-50%, -50%);\n border-radius: 50%;\n overflow: hidden;\n cursor: pointer;\n z-index: 2;\n box-shadow: 0 10px 24px -8px rgba(20, 16, 10, 0.4), inset 0 0 0 1px rgba(0, 0, 0, 0.08);\n background-image: linear-gradient(45deg, var(--check-a) 25%, transparent 25%, transparent 75%, var(--check-a) 75%), linear-gradient(45deg, var(--check-a) 25%, transparent 25%, transparent 75%, var(--check-a) 75%);\n background-size: 12px 12px;\n background-position: 0 0, 6px 6px;\n background-color: var(--check-b);\n}\n\n.discFill {\n position: absolute;\n inset: 0;\n}\n\n.currentHex,\n.currentHexInput {\n position: absolute;\n inset: 0;\n z-index: 1;\n font-family: \"SF Mono\", \"IBM Plex Mono\", \"JetBrains Mono\", Consolas, \"Liberation Mono\", monospace;\n font-size: 17px;\n font-weight: 700;\n letter-spacing: 0.01em;\n font-variant-numeric: tabular-nums;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.15);\n}\n\n.currentHex {\n display: grid;\n place-items: center;\n cursor: text;\n transition: transform 0.15s cubic-bezier(0.34, 1.56, 0.64, 1);\n}\n.currentHex.copied {\n transform: scale(1.06);\n}\n\n.currentHexInput {\n z-index: 2;\n width: 100%;\n height: 100%;\n text-align: center;\n background: transparent;\n border: none;\n outline: none;\n padding: 0;\n}\n.currentHexInput::selection {\n background: rgba(255, 255, 255, 0.35);\n}\n\n.discBadge {\n position: absolute;\n top: 50%;\n left: 50%;\n width: 34px;\n height: 34px;\n border-radius: 50%;\n border: none;\n display: grid;\n place-items: center;\n cursor: pointer;\n z-index: 3;\n transition: transform 0.15s ease, filter 0.15s ease;\n}\n.discBadge:hover {\n filter: brightness(1.15);\n}\n.discBadge svg {\n width: 15px;\n height: 15px;\n}\n\n.discBadgeTop {\n transform: translate(-50%, calc(-50% - 46px));\n}\n.discBadgeTop:active {\n transform: translate(-50%, calc(-50% - 46px)) scale(0.92);\n}\n.discBadgeTop.pulse {\n animation: badgePulseTop 0.4s ease;\n}\n\n.discBadgeBottom {\n transform: translate(-50%, calc(-50% + 46px));\n}\n.discBadgeBottom:active {\n transform: translate(-50%, calc(-50% + 46px)) scale(0.92);\n}\n\n@keyframes badgePulseTop {\n 0% {\n transform: translate(-50%, calc(-50% - 46px)) scale(1);\n }\n 40% {\n transform: translate(-50%, calc(-50% - 46px)) scale(1.28);\n }\n 100% {\n transform: translate(-50%, calc(-50% - 46px)) scale(1);\n }\n}\n/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkNvbG9yV2hlZWwubW9kdWxlLnNjc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBbUNBO0VBMUJFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBb0JBO0VBQ0U7SUFsQkY7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTs7O0FBa0JBO0VBekNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBa0NBO0VBL0JBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBMEJBO0VBcENBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBNkJBO0VBcERBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBZ0JGO0VBOEJFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRjtFQUNFO0lBQ0U7SUFDQTs7O0FBS0o7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRjtFQUNFO0VBQ0E7RUFDQTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBRUE7RUFDRTtFQUNBOztBQUVGO0VBQ0U7OztBQU1KO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBRUE7RUFDRTtFQUNBOztBQUVGO0VBQ0U7O0FBRUY7RUFDRTtFQUNBO0VBQ0E7OztBQUlKO0VBQ0U7SUFBSztJQUFvQzs7RUFDekM7SUFBTztJQUErQjs7O0FBU3hDO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUlGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBR0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFFQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7QUFFQTtFQUNFOztBQUVGO0VBQ0U7OztBQUtKO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQU9GO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBRUE7RUFDQTs7O0FBS0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBSUE7RUFJQTs7O0FBRUY7RUFDRTs7O0FBRUY7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFjRjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBRUY7RUFDRTtFQUNBO0VBQ0E7RUFDQSxXQXRCUTs7O0FBeUJWO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQSxXQXBDUTs7O0FBdUNWO0VBQ0U7RUFDQTs7O0FBU0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUVGO0VBQ0U7OztBQUdGO0VBQ0U7OztBQUtGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBRUY7RUFDRTs7O0FBSUY7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0Esa0JBQ0U7RUFFRjtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTs7O0FBS0Y7QUFBQTtFQUVFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTs7QUFFQTtFQUNFOzs7QUFHSjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBRUE7RUFDRTs7O0FBUUo7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBRUE7RUFDRTs7QUFFRjtFQUNFO0VBQ0E7OztBQUdKO0VBQ0U7O0FBQ0E7RUFDRTs7QUFFRjtFQUNFOzs7QUFHSjtFQUNFOztBQUNBO0VBQ0U7OztBQUdKO0VBQ0U7SUFBSzs7RUFDTDtJQUFNOztFQUNOO0lBQU8iLCJzb3VyY2VzQ29udGVudCI6WyIvLyBUaGVtZSB0b2tlbnMgYXJlIHNjb3BlZCB0byAucm9vdCAoY29tcG9uZW50LWxvY2FsKSwgbm90IDpyb290IC0tIHRoaXNcbi8vIGNvbXBvbmVudCBtdXN0IGJlIHNhZmUgdG8gZHJvcCBpbnRvIGFuIGFwcCB3aXRoIGl0cyBvd24gZ2xvYmFsIHRoZW1lXG4vLyB3aXRob3V0IGNvbGxpZGluZy4gQWxsICpjb21wdXRlZCogY29sb3JzICh0aGUgY29sb3IgeW91J3JlIHBpY2tpbmcsIGJhZGdlXG4vLyB0aW50cywgZ3JhZGllbnRzKSBhcmUgcGFzc2VkIGluIGFzIGlubGluZSBzdHlsZXMgZnJvbSBDb2xvcldoZWVsLnRzeCwgbm90XG4vLyBDU1MgY3VzdG9tIHByb3BlcnRpZXMgaGVyZSAtLSBvbmx5IHN0cnVjdHVyYWwvdGhlbWUgdG9rZW5zIGxpdmUgaW4gU0NTUy5cblxuLy8gbGlnaHQvZGFyayBwYWxldHRlcyAtLSBpZGVudGljYWwgdmFsdWVzIHNoYXJlZCBieSBldmVyeSB0cmlnZ2VyIGJlbG93IChPU1xuLy8gcHJlZmVyZW5jZSwgaG9zdCBhcHAncyBhbWJpZW50IHRoZW1lLCBhbmQgdGhpcyBpbnN0YW5jZSdzIG93biBgdGhlbWVgIHByb3ApXG5AbWl4aW4gbGlnaHQtcGFsZXR0ZSB7XG4gIC0tYmc6ICNFQ0VBRTM7XG4gIC0tc3VyZmFjZTogI0ZGRkZGRjtcbiAgLS1zdXJmYWNlLTI6ICNFM0UwRDg7XG4gIC0tYm9yZGVyOiAjRDJDREMwO1xuICAtLXRleHQ6ICMxQTE5MTM7XG4gIC0tdGV4dC1kaW06ICM3MjZGNjQ7XG4gIC0tdGV4dC1mYWludDogI0E4QTM5ODtcbiAgLS1zaGFkb3ctc29mdDogMCAxcHggMnB4IHJnYmEoMzAsIDI1LCAxNSwgMC4wOCk7XG4gIC0tY2hlY2stYTogI2Q4ZDRjODtcbiAgLS1jaGVjay1iOiAjZjRmMmVjO1xuICBjb2xvci1zY2hlbWU6IGxpZ2h0O1xufVxuQG1peGluIGRhcmstcGFsZXR0ZSB7XG4gIC0tYmc6ICMxMzEyMTc7XG4gIC0tc3VyZmFjZTogIzFDMUIyMjtcbiAgLS1zdXJmYWNlLTI6ICMyNjI1MkU7XG4gIC0tYm9yZGVyOiAjMzQzMzNEO1xuICAtLXRleHQ6ICNFQ0VBRjA7XG4gIC0tdGV4dC1kaW06ICM4RThDOTk7XG4gIC0tdGV4dC1mYWludDogIzYwNUU2QjtcbiAgLS1zaGFkb3ctc29mdDogMCAxcHggMnB4IHJnYmEoMCwgMCwgMCwgMC4zNSk7XG4gIC0tY2hlY2stYTogIzM3MzUzZjtcbiAgLS1jaGVjay1iOiAjMjAxZjI2O1xuICBjb2xvci1zY2hlbWU6IGRhcms7XG59XG5cbi5yb290IHtcbiAgQGluY2x1ZGUgbGlnaHQtcGFsZXR0ZTtcblxuICAvLyB0aGVtZT1cInN5c3RlbVwiIChubyBkYXRhLXRoZW1lIG9mIGl0cyBvd24pOiBmYWxsIGJhY2sgdG8gdGhlIE9TIHByZWZlcmVuY2VcbiAgQG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyaykge1xuICAgICY6bm90KFtkYXRhLXRoZW1lPSdsaWdodCddKTpub3QoW2RhdGEtdGhlbWU9J2RhcmsnXSkge1xuICAgICAgQGluY2x1ZGUgZGFyay1wYWxldHRlO1xuICAgIH1cbiAgfVxuXG4gIC8vIHRoZW1lPVwic3lzdGVtXCI6IHRoZSBob3N0IGFwcCdzIGFtYmllbnQgdGhlbWUgKGRhdGEtdGhlbWUgc2V0IG9uIGFuXG4gIC8vIGFuY2VzdG9yLCBlLmcuIDxodG1sPiAtLSB0aGUgc2FtZSBjb252ZW50aW9uIENvbG9yUGlja2VyL1RpbWVsaW5lIHJlYWRcbiAgLy8gZnJvbSkgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIHRoZSBiYXJlIE9TIHByZWZlcmVuY2UgYWJvdmUgd2hlbiB0aGUgYXBwXG4gIC8vIGRlY2xhcmVzIG9uZSAtLSBpbmNsdWRpbmcgZXhwbGljaXRseSBvdmVycmlkaW5nIGl0IGJhY2sgdG8gbGlnaHQsIHNpbmNlXG4gIC8vIHRoZSBPUy1wcmVmZXJlbmNlIHJ1bGUgYWJvdmUgaGFzIG5vIHdheSB0byBrbm93IHRoZSBhcHAgZGlzYWdyZWVzXG4gIDpnbG9iYWwoW2RhdGEtdGhlbWU9J2xpZ2h0J10pICY6bm90KFtkYXRhLXRoZW1lPSdsaWdodCddKTpub3QoW2RhdGEtdGhlbWU9J2RhcmsnXSkge1xuICAgIEBpbmNsdWRlIGxpZ2h0LXBhbGV0dGU7XG4gIH1cbiAgOmdsb2JhbChbZGF0YS10aGVtZT0nZGFyayddKSAmOm5vdChbZGF0YS10aGVtZT0nbGlnaHQnXSk6bm90KFtkYXRhLXRoZW1lPSdkYXJrJ10pIHtcbiAgICBAaW5jbHVkZSBkYXJrLXBhbGV0dGU7XG4gIH1cblxuICAvLyB0aGVtZT1cImRhcmtcIiAvIHRoZW1lPVwibGlnaHRcIjogcGlubmVkIGV4cGxpY2l0bHkgb24gdGhpcyBpbnN0YW5jZSwgcmVnYXJkbGVzcyBvZiB0aGUgT1Mgb3IgdGhlIGFwcFxuICAmW2RhdGEtdGhlbWU9J2RhcmsnXSB7XG4gICAgQGluY2x1ZGUgZGFyay1wYWxldHRlO1xuICB9XG4gICZbZGF0YS10aGVtZT0nbGlnaHQnXSB7XG4gICAgQGluY2x1ZGUgbGlnaHQtcGFsZXR0ZTtcbiAgfVxuXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgZ2FwOiAyMHB4O1xuICBmb250LWZhbWlseTogLWFwcGxlLXN5c3RlbSwgJ1NlZ29lIFVJJywgSW50ZXIsICdIZWx2ZXRpY2EgTmV1ZScsIEFyaWFsLCBzYW5zLXNlcmlmO1xuICBjb2xvcjogdmFyKC0tdGV4dCk7XG59XG5cbkBtZWRpYSAocHJlZmVycy1yZWR1Y2VkLW1vdGlvbjogcmVkdWNlKSB7XG4gIC5yb290LCAucm9vdCAqLCAucm9vdCAqOjpiZWZvcmUsIC5yb290ICo6OmFmdGVyIHtcbiAgICBhbmltYXRpb24tZHVyYXRpb246IDAuMDFtcyAhaW1wb3J0YW50O1xuICAgIHRyYW5zaXRpb24tZHVyYXRpb246IDAuMDFtcyAhaW1wb3J0YW50O1xuICB9XG59XG5cbi8vID09PT09PT09PT09PSBSZWNlbnRzIChmYXZvcml0ZXMpID09PT09PT09PT09PVxuLnJlY2VudHMge1xuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBnYXA6IDdweDtcbiAgbWluLWhlaWdodDogMzBweDtcbiAgYmFja2dyb3VuZDogdmFyKC0tc3VyZmFjZS0yKTtcbiAgYm9yZGVyLXJhZGl1czogOTk5cHg7XG4gIHBhZGRpbmc6IDVweCA4cHg7XG4gIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLCB2YXIoLS1zaGFkb3ctc29mdCk7XG59XG5cbi5jaGlwV3JhcCB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgZmxleDogbm9uZTtcbiAgYW5pbWF0aW9uOiBjaGlwSW4gMC40cyBjdWJpYy1iZXppZXIoMC4zNCwgMS41NiwgMC42NCwgMSkgYm90aDtcbn1cblxuLmNoaXAge1xuICB3aWR0aDogMjZweDtcbiAgaGVpZ2h0OiAyNnB4O1xuICBib3JkZXItcmFkaXVzOiA1MCU7XG4gIGJvcmRlcjogbm9uZTtcbiAgcGFkZGluZzogMDtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBkaXNwbGF5OiBibG9jaztcbiAgYm94LXNoYWRvdzogaW5zZXQgMCAwIDAgMXB4IHJnYmEoMTI4LCAxMjgsIDEyOCwgMC4yMiksIHZhcigtLXNoYWRvdy1zb2Z0KTtcbiAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDAuMTVzIGVhc2UsIGJveC1zaGFkb3cgMC4xNXMgZWFzZTtcblxuICAmOmhvdmVyIHtcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDEuMTQpIHRyYW5zbGF0ZVkoLTFweCk7XG4gICAgYm94LXNoYWRvdzogaW5zZXQgMCAwIDAgMXB4IHJnYmEoMTI4LCAxMjgsIDEyOCwgMC4zKSwgMCA0cHggMTBweCAtM3B4IHJnYmEoMCwgMCwgMCwgMC4zKTtcbiAgfVxuICAmOmFjdGl2ZSB7XG4gICAgdHJhbnNmb3JtOiBzY2FsZSgxLjAyKTtcbiAgfVxufVxuXG4vLyBub3RpZmljYXRpb24tYmFkZ2Ugc3R5bGU6IHNpdHMgb2ZmLWNlbnRlciBvbiB0aGUgY2hpcCdzIHJpbSwgcmV2ZWFsZWQgb25seVxuLy8gb24gaG92ZXIgc28gaXQgbmV2ZXIgY29tcGV0ZXMgd2l0aCB0aGUgY2hpcCdzIG93biBjbGljay10by1zZWxlY3QgYXJlYVxuLmNoaXBSZW1vdmUge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogLTNweDtcbiAgcmlnaHQ6IC0zcHg7XG4gIHdpZHRoOiAxNHB4O1xuICBoZWlnaHQ6IDE0cHg7XG4gIGJvcmRlci1yYWRpdXM6IDUwJTtcbiAgYm9yZGVyOiBub25lO1xuICBwYWRkaW5nOiAwO1xuICBkaXNwbGF5OiBncmlkO1xuICBwbGFjZS1pdGVtczogY2VudGVyO1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1zdXJmYWNlKTtcbiAgY29sb3I6IHZhcigtLXRleHQtZGltKTtcbiAgYm94LXNoYWRvdzogMCAxcHggM3B4IHJnYmEoMCwgMCwgMCwgMC4zKSwgaW5zZXQgMCAwIDAgMXB4IHJnYmEoMTI4LCAxMjgsIDEyOCwgMC4yNSk7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgei1pbmRleDogMjtcbiAgb3BhY2l0eTogMDtcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gIHRyYW5zZm9ybTogc2NhbGUoMC42KTtcbiAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjEycyBlYXNlLCB0cmFuc2Zvcm0gMC4xMnMgZWFzZSwgY29sb3IgMC4xMnMgZWFzZTtcblxuICBzdmcge1xuICAgIHdpZHRoOiA4cHg7XG4gICAgaGVpZ2h0OiA4cHg7XG4gIH1cbiAgJjpob3ZlciB7XG4gICAgY29sb3I6IHZhcigtLXRleHQpO1xuICB9XG4gIC5jaGlwV3JhcDpob3ZlciAmIHtcbiAgICBvcGFjaXR5OiAxO1xuICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvO1xuICAgIHRyYW5zZm9ybTogc2NhbGUoMSk7XG4gIH1cbn1cblxuQGtleWZyYW1lcyBjaGlwSW4ge1xuICAwJSB7IHRyYW5zZm9ybTogc2NhbGUoMCkgcm90YXRlKC0yNWRlZyk7IG9wYWNpdHk6IDA7IH1cbiAgMTAwJSB7IHRyYW5zZm9ybTogc2NhbGUoMSkgcm90YXRlKDApOyBvcGFjaXR5OiAxOyB9XG59XG5cbi8vID09PT09PT09PT09PSBQaWNrZXI6IHBvc2l0aW9uaW5nIGNvbnRleHQgZm9yIHRoZSByaW5nJ3MgYmxlZWQgPT09PT09PT09PT09XG4vLyBFdmVyeSBkaXJlY3QgY2hpbGQgYmVsb3cgaXMgcG9zaXRpb246YWJzb2x1dGUgKHRoZXJlJ3Mgbm8gYmFja2luZyBjYXJkIHRvXG4vLyBob2xkIHRoZSBib3ggb3BlbiksIHNvIC5waWNrZXIgbmVlZHMgYW4gZXhwbGljaXQgc2l6ZSBvciBpdCBtZWFzdXJlcyBhc1xuLy8gMHgwIHRvIHRoZSBsYXlvdXQgZW5naW5lIC0tIG1hcmdpbi10b3AgcmVzZXJ2ZXMgcm9vbSBmb3Igd2hhdCByZW5kZXJzXG4vLyBhYm92ZSB0aGUgc2hhcmVkIGNlbnRlciBhbmNob3IgKG1vc3RseSB0aGUgbW9kZSB0b2dnbGUpLCBoZWlnaHQgcmVzZXJ2ZXNcbi8vIHdoYXQgZXh0ZW5kcyBiZWxvdyBpdCAodGhlIGFscGhhIGFyYykuXG4ucGlja2VyIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBtYXJnaW4tdG9wOiA4MnB4O1xuICBoZWlnaHQ6IDI2NXB4O1xuICB3aWR0aDogMjcycHg7XG59XG5cbi5nbG93IHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB3aWR0aDogMzQwcHg7XG4gIGhlaWdodDogMzQwcHg7XG4gIGxlZnQ6IDUwJTtcbiAgdG9wOiA4OHB4O1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcbiAgYm9yZGVyLXJhZGl1czogNTAlO1xuICBvcGFjaXR5OiAwLjU1O1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgei1pbmRleDogMDtcbn1cblxuLy8gPT09PT09PT09PT09IE1vZGUgdG9nZ2xlOiBzd2l0Y2hlcyB3aGF0IHRoZSByaW5nIGFkanVzdHMgKEgvUy9WKSA9PT09PT09PT09PT1cbi5tb2RlVG9nZ2xlIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDg4cHg7XG4gIGxlZnQ6IDUwJTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgY2FsYygtNTAlIC0gMTU2cHgpKTtcbiAgei1pbmRleDogMztcbiAgZGlzcGxheTogZ3JpZDtcbiAgLy8gZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zIGFuZCB3aWR0aCBhcmUgc2V0IGlubGluZSAobW9kZSBjb3VudCBpcyBkeW5hbWljOlxuICAvLyAzLXdheSBIL1MvViBvciA0LXdheSBIL1MvVi9BIGRlcGVuZGluZyBvbiBzaG93QWxwaGFDb250cm9sKVxuICBiYWNrZ3JvdW5kOiB2YXIoLS1zdXJmYWNlLTIpO1xuICBib3JkZXItcmFkaXVzOiA5OTlweDtcbiAgcGFkZGluZzogM3B4O1xuICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwgdmFyKC0tc2hhZG93LXNvZnQpO1xufVxuXG4ubW9kZVBpbGwge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogM3B4O1xuICBib3R0b206IDNweDtcbiAgbGVmdDogM3B4O1xuICAvLyB3aWR0aCBpcyBzZXQgaW5saW5lIChzZWUgLm1vZGVUb2dnbGUpXG4gIGJvcmRlci1yYWRpdXM6IDk5OXB4O1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1zdXJmYWNlKTtcbiAgYm94LXNoYWRvdzogdmFyKC0tc2hhZG93LXNvZnQpO1xuICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4yNXMgY3ViaWMtYmV6aWVyKDAuMiwgMC44LCAwLjIsIDEpO1xufVxuXG4ubW9kZUJ1dHRvbiB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgei1pbmRleDogMTtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIGhlaWdodDogMjJweDtcbiAgYmFja2dyb3VuZDogbm9uZTtcbiAgYm9yZGVyOiBub25lO1xuICBwYWRkaW5nOiAwO1xuICBmb250LXNpemU6IDEwLjVweDtcbiAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgbGluZS1oZWlnaHQ6IDIycHg7XG4gIGxldHRlci1zcGFjaW5nOiAwLjAyZW07XG4gIGNvbG9yOiB2YXIoLS10ZXh0LWRpbSk7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgdHJhbnNpdGlvbjogY29sb3IgMC4ycyBlYXNlO1xuXG4gICYuYWN0aXZlIHtcbiAgICBjb2xvcjogdmFyKC0tdGV4dCk7XG4gIH1cbiAgJjpob3Zlcjpub3QoLmFjdGl2ZSkge1xuICAgIGNvbG9yOiB2YXIoLS10ZXh0KTtcbiAgfVxufVxuXG4vLyA9PT09PT09PT09PT0gU3RhZ2U6IGEgdHJ1ZSByaW5nIChhbm51bHVzIHZpYSBtYXNrKSA9PT09PT09PT09PT1cbi5zdGFnZSB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAtNDhweDtcbiAgbGVmdDogNTAlO1xuICB3aWR0aDogMjcycHg7XG4gIGhlaWdodDogMjcycHg7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTtcbiAgdG91Y2gtYWN0aW9uOiBub25lO1xufVxuXG4vLyBzaGFkb3cgY2FzdGVyOiBhIHBsYWluLCB1bm1hc2tlZCBjaXJjbGUgYmVoaW5kIHRoZSByaW5nLiBib3gtc2hhZG93IGRyYXdzXG4vLyBvdXRzaWRlIGl0cyBib3JkZXItYm94IHJlZ2FyZGxlc3Mgb2YgdGhlIGhvbGUgaW4gdGhlIHNoYXBlIGRyYXduIG9uIHRvcCBvZlxuLy8gaXQsIHNvIHRoaXMgcmVsaWFibHkgY2FzdHMgYSBzaGFkb3cgYXJvdW5kIHRoZSByaW5nJ3Mgb3V0ZXIgZWRnZSAtLVxuLy8gZmlsdGVyOmRyb3Atc2hhZG93IG9uIHRoZSBtYXNrZWQgLnJpbmcgaXRzZWxmIGlzIHVucmVsaWFibGUgYWNyb3NzIGVuZ2luZXMuXG4uc3RhZ2VTaGFkb3cge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGluc2V0OiAwO1xuICBib3JkZXItcmFkaXVzOiA1MCU7XG4gIGJveC1zaGFkb3c6IDAgMnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMjIpLCAwIDEwcHggMThweCByZ2JhKDAsIDAsIDAsIDAuMjIpO1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cblxuLnJpbmcge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGluc2V0OiAwO1xuICBib3JkZXItcmFkaXVzOiA1MCU7XG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICB6LWluZGV4OiAyO1xuICAvLyBiYWNrZ3JvdW5kIGlzIHNldCBwZXItbW9kZSBpbmxpbmU6IGh1ZSBzcGVjdHJ1bSAvIGdyZXktdG8tY29sb3IgLyBibGFjay10by1jb2xvclxuICAtd2Via2l0LW1hc2s6IHJhZGlhbC1ncmFkaWVudChjaXJjbGUgY2xvc2VzdC1zaWRlLCB0cmFuc3BhcmVudCAwIDkycHgsIGJsYWNrIDkzcHggMTAwJSk7XG4gIG1hc2s6IHJhZGlhbC1ncmFkaWVudChjaXJjbGUgY2xvc2VzdC1zaWRlLCB0cmFuc3BhcmVudCAwIDkycHgsIGJsYWNrIDkzcHggMTAwJSk7XG59XG5cbi8vIHJvdGF0ZWQsIG5vdCByZXBvc2l0aW9uZWQgdmlhIHRvcC9sZWZ0IC0tIHNlZSB0aGUgY29tbWVudCBvblxuLy8gcmluZ0FuZ2xlRnJvbVRvcERlZyBpbiBDb2xvcldoZWVsLnRzeCBmb3Igd2h5XG4uaHVlSGFuZGxlUGl2b3Qge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogNTAlO1xuICBsZWZ0OiA1MCU7XG4gIHdpZHRoOiAwO1xuICBoZWlnaHQ6IDA7XG4gIC8vIGB0cmFuc2Zvcm1gIGNyZWF0ZXMgYSBuZXcgc3RhY2tpbmcgY29udGV4dCwgc28gdGhpcyBuZWVkcyBpdHMgb3duXG4gIC8vIHotaW5kZXggLS0gdGhlIGNoaWxkIC5odWVIYW5kbGUncyB6LWluZGV4IG9ubHkgcmFua3MgaXQgd2l0aGluIHRoaXNcbiAgLy8gY29udGV4dCwgbm90IGFnYWluc3QgdGhlIHJpbmcvZGlzYy9iYWRnZXMgc2l0dGluZyBvdXRzaWRlIGl0XG4gIHotaW5kZXg6IDM7XG4gIC8vIHN0cm9uZyBlYXNlLW91dCAtLSBmYXN0IHN0YXJ0LCBsb25nIGRlY2VsZXJhdGlvbiBpbnRvIHRoZSBmaW5hbCBhbmdsZSxcbiAgLy8gbGlrZSBicmFraW5nIGludG8gcG9zaXRpb24uIFJlYWRzIGFzIGEgcmVhbCBzd2VlcCBvbiBhIGJpZyBtb2RlLXN3aXRjaFxuICAvLyBqdW1wLCBzdGF5cyBzbmFwcHkgb24gc21hbGwgd2hlZWwtdGljayBudWRnZXMuXG4gIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjMycyBjdWJpYy1iZXppZXIoMC4xNiwgMSwgMC4zLCAxKTtcbn1cbi5yb290W2RhdGEtZHJhZ2dpbmc9J3RydWUnXSAuaHVlSGFuZGxlUGl2b3Qge1xuICB0cmFuc2l0aW9uOiBub25lO1xufVxuLmh1ZUhhbmRsZSB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAtMTE0cHg7IC8vIG1pZC1iYW5kIHJhZGl1cyAoMC40MTkxICogMjcycHggc3RhZ2UpLCBmaXhlZCBkaXN0YW5jZSBmcm9tIHRoZSBwaXZvdFxuICBsZWZ0OiAwO1xuICB3aWR0aDogMjJweDtcbiAgaGVpZ2h0OiAyMnB4O1xuICBib3JkZXItcmFkaXVzOiA1MCU7XG4gIGJvcmRlcjogM3B4IHNvbGlkICNmZmY7XG4gIGJveC1zaGFkb3c6IDAgMXB4IDNweCByZ2JhKDAsIDAsIDAsIDAuNCksIDAgMCAwIDFweCByZ2JhKDAsIDAsIDAsIDAuMTUpO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcbiAgY3Vyc29yOiBncmFiO1xuICB6LWluZGV4OiAzO1xufVxuXG4vLyA9PT09PT09PT09PT0gQWxwaGEgYXJjOiBhIGN1cnZlZCBhbHBoYSBzbGlkZXIgb3V0c2lkZSB0aGUgcmluZyA9PT09PT09PT09PT1cbi8vIGEgcHVyZSAxRCBjb250cm9sLCBwb3NpdGlvbiBhbG9uZyB0aGUgMTIwZGVnIGJhbmQgKGJvdHRvbS1jZW50ZXJlZCkgZmFkZXNcbi8vIGEgY2hlY2tlcmJvYXJkIChhbHBoYSAwKSBpbnRvIHRoZSBjdXJyZW50IHNvbGlkIGNvbG9yIChhbHBoYSAxKS4gY2xpcC1wYXRoXG4vLyBhbHNvIGdhdGVzIGhpdC10ZXN0aW5nLCBzbyBjbGlja3Mgb3V0c2lkZSB0aGUgdmlzaWJsZSBjcmVzY2VudCBmYWxsIHRocm91Z2guXG4kYXJjUGF0aDogcGF0aCgnTSAzMjguNTYsMjcwIEEgMTYwIDE2MCAwIDAgMSA1MS40NCwyNzAgTCA2NS4yOSwyNjIgQSAxNDQgMTQ0IDAgMCAwIDMxNC43MSwyNjIgWicpO1xuXG4vLyBzaGFkb3cgY2FzdGVyOiBjbGlwLXBhdGggKyBmaWx0ZXI6Ymx1ciBvbiB0aGUgU0FNRSBlbGVtZW50IGNsaXBzIGF3YXkgdGhlXG4vLyBibHVyJ3Mgb3duIHNvZnQgZWRnZSAobm8gcm9vbSBvdXRzaWRlIHRoZSBwYXRoIGZvciBpdCB0byBmYWRlIGludG8pLFxuLy8gbGVhdmluZyBhIGhhcmQtZWRnZWQgc211ZGdlLiBGaXg6IGJsdXIgYSB3cmFwcGVyIHRoYXQgSVNOJ1QgaXRzZWxmIGNsaXBwZWRcbi8vIC0tIGl0IGNvbXBvc2l0ZXMgaXRzIGNsaXBwZWQgY2hpbGQgZmlyc3QsIHRoZW4gYmx1cnMgdGhhdCB3aG9sZSByZXN1bHRcbi8vIGZyZWVseSwgc2luY2Ugbm90aGluZyBjbGlwcyB0aGUgd3JhcHBlciBhZnRlcndhcmQuXG4uYWxwaGFBcmNTaGFkb3dXcmFwIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDg4cHg7XG4gIGxlZnQ6IDUwJTtcbiAgd2lkdGg6IDM4MHB4O1xuICBoZWlnaHQ6IDM4MHB4O1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZShjYWxjKC01MCUgKyAxcHgpLCBjYWxjKC01MCUgKyA1cHgpKTtcbiAgei1pbmRleDogMTtcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gIGZpbHRlcjogYmx1cig3cHgpO1xufVxuLmFscGhhQXJjU2hhZG93IHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBpbnNldDogMDtcbiAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjIyKTtcbiAgY2xpcC1wYXRoOiAkYXJjUGF0aDtcbn1cblxuLmFscGhhQXJjIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDg4cHg7XG4gIGxlZnQ6IDUwJTtcbiAgd2lkdGg6IDM4MHB4O1xuICBoZWlnaHQ6IDM4MHB4O1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcbiAgdG91Y2gtYWN0aW9uOiBub25lO1xuICBjdXJzb3I6IGdyYWI7XG4gIHotaW5kZXg6IDI7XG4gIGJhY2tncm91bmQ6IHZhcigtLXN1cmZhY2UtMik7XG4gIGNsaXAtcGF0aDogJGFyY1BhdGg7XG59XG5cbi5hbHBoYUFyY0ZpbGwge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGluc2V0OiAwO1xuICAvLyBjb25pYy1ncmFkaWVudCBzZXQgaW5saW5lIChuZWVkcyB0aGUgbGl2ZSBhY2NlbnQgY29sb3IpXG59XG5cbi8vIGNsaXAtcGF0aCBjYW4ndCB0YWtlIGEgYm9yZGVyLXJhZGl1cywgc28gdGhlIGJhbmQncyB0d28gZmxhdC1jdXQgZW5kcyBhcmVcbi8vIFwicm91bmRlZFwiIGJ5IGNhcHBpbmcgdGhlbSB3aXRoIHBsYWluIGNpcmNsZXMgc2l6ZWQgdG8gdGhlIGJhbmQncyBvd25cbi8vIHRoaWNrbmVzcyAtLSBhIHBpbGwgY2FwLCBzYW1lIHRyaWNrIGFzIGEgcm91bmRlZC1lbmQgc3Ryb2tlLiBUaGVzZSBzaXRcbi8vIE9VVFNJREUgLmFscGhhQXJjIChpdHMgY2xpcC1wYXRoIHdvdWxkIHNsaWNlIHRoZW0gdG9vKSwgcG9zaXRpb25lZCBmcm9tXG4vLyB0aGUgc2hhcmVkIGNlbnRlciBwb2ludCBsaWtlIHRoZSBtb2RlIHRvZ2dsZSBpcy5cbi5hbHBoYUFyY0NhcCB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiA4OHB4O1xuICBsZWZ0OiA1MCU7XG4gIHdpZHRoOiAxNnB4O1xuICBoZWlnaHQ6IDE2cHg7XG4gIGJvcmRlci1yYWRpdXM6IDUwJTtcbiAgei1pbmRleDogMjtcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gIGJhY2tncm91bmQ6IHZhcigtLXN1cmZhY2UtMik7XG59XG4uYWxwaGFBcmNDYXBTdGFydCB7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKGNhbGMoLTUwJSArIDEzMS42cHgpLCBjYWxjKC01MCUgKyA3NnB4KSk7XG4gIC8vIGJhY2tncm91bmQgc2V0IGlubGluZSAoYWNjZW50LXNvbGlkLCB0aGUgXCJmdWxsXCIgZW5kKVxufVxuLmFscGhhQXJjQ2FwRW5kIHtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoY2FsYygtNTAlIC0gMTMxLjZweCksIGNhbGMoLTUwJSArIDc2cHgpKTtcbn1cblxuLy8gc2l0cyBPVVRTSURFIC5hbHBoYUFyYyB0b28sIHNhbWUgcmVhc29uIGFzIHRoZSBjYXBzIC0tIGNsaXAtcGF0aCB3b3VsZFxuLy8gc2xpY2UgaXQgaW50byBhIGNyZXNjZW50IHdoZW5ldmVyIGl0IG5lYXJzIHRoZSBiYW5kJ3MgZmxhdC1jdXQgZW5kc1xuLmFscGhhQXJjSGFuZGxlIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDg4cHg7XG4gIGxlZnQ6IDUwJTtcbiAgd2lkdGg6IDE4cHg7XG4gIGhlaWdodDogMThweDtcbiAgYm9yZGVyLXJhZGl1czogNTAlO1xuICBib3JkZXI6IDJweCBzb2xpZCAjZmZmO1xuICBib3gtc2hhZG93OiAwIDFweCA0cHggcmdiYSgwLCAwLCAwLCAwLjUpLCAwIDAgMCAxcHggcmdiYSgwLCAwLCAwLCAwLjIpO1xuICB6LWluZGV4OiAzO1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDAuMTJzIGVhc2U7XG59XG4ucm9vdFtkYXRhLWRyYWdnaW5nPSd0cnVlJ10gLmFscGhhQXJjSGFuZGxlIHtcbiAgdHJhbnNpdGlvbjogbm9uZTtcbn1cblxuLy8gPT09PT09PT09PT09IEN1cnJlbnQtY29sb3IgZGlzYyA9PT09PT09PT09PT1cbi5jdXJyZW50RGlzYyB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiA1MCU7XG4gIGxlZnQ6IDUwJTtcbiAgd2lkdGg6IDE1NnB4O1xuICBoZWlnaHQ6IDE1NnB4O1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcbiAgYm9yZGVyLXJhZGl1czogNTAlO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIHotaW5kZXg6IDI7XG4gIGJveC1zaGFkb3c6IDAgMTBweCAyNHB4IC04cHggcmdiYSgyMCwgMTYsIDEwLCAwLjQpLCBpbnNldCAwIDAgMCAxcHggcmdiYSgwLCAwLCAwLCAwLjA4KTtcbiAgYmFja2dyb3VuZC1pbWFnZTpcbiAgICBsaW5lYXItZ3JhZGllbnQoNDVkZWcsIHZhcigtLWNoZWNrLWEpIDI1JSwgdHJhbnNwYXJlbnQgMjUlLCB0cmFuc3BhcmVudCA3NSUsIHZhcigtLWNoZWNrLWEpIDc1JSksXG4gICAgbGluZWFyLWdyYWRpZW50KDQ1ZGVnLCB2YXIoLS1jaGVjay1hKSAyNSUsIHRyYW5zcGFyZW50IDI1JSwgdHJhbnNwYXJlbnQgNzUlLCB2YXIoLS1jaGVjay1hKSA3NSUpO1xuICBiYWNrZ3JvdW5kLXNpemU6IDEycHggMTJweDtcbiAgYmFja2dyb3VuZC1wb3NpdGlvbjogMCAwLCA2cHggNnB4O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jaGVjay1iKTtcbn1cblxuLmRpc2NGaWxsIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBpbnNldDogMDtcbiAgLy8gYmFja2dyb3VuZCAocmdiYSBvZiBjdXJyZW50IGNvbG9yLCBzbyB0aGUgY2hlY2tlcmJvYXJkIHJlYWRzIHRocm91Z2hcbiAgLy8gd2hlbiBhbHBoYSA8IDEpIHNldCBpbmxpbmVcbn1cblxuLmN1cnJlbnRIZXgsXG4uY3VycmVudEhleElucHV0IHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBpbnNldDogMDtcbiAgei1pbmRleDogMTtcbiAgZm9udC1mYW1pbHk6ICdTRiBNb25vJywgJ0lCTSBQbGV4IE1vbm8nLCAnSmV0QnJhaW5zIE1vbm8nLCBDb25zb2xhcywgJ0xpYmVyYXRpb24gTW9ubycsIG1vbm9zcGFjZTtcbiAgZm9udC1zaXplOiAxN3B4O1xuICBmb250LXdlaWdodDogNzAwO1xuICBsZXR0ZXItc3BhY2luZzogMC4wMWVtO1xuICBmb250LXZhcmlhbnQtbnVtZXJpYzogdGFidWxhci1udW1zO1xuICB0ZXh0LXNoYWRvdzogMCAxcHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNSk7XG4gIC8vIGNvbG9yIHNldCBpbmxpbmUgKGNvbXB1dGVkIGZvciBjb250cmFzdCBhZ2FpbnN0IHRoZSBjdXJyZW50IGNvbG9yKVxufVxuLmN1cnJlbnRIZXgge1xuICBkaXNwbGF5OiBncmlkO1xuICBwbGFjZS1pdGVtczogY2VudGVyO1xuICBjdXJzb3I6IHRleHQ7XG4gIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjE1cyBjdWJpYy1iZXppZXIoMC4zNCwgMS41NiwgMC42NCwgMSk7XG5cbiAgJi5jb3BpZWQge1xuICAgIHRyYW5zZm9ybTogc2NhbGUoMS4wNik7XG4gIH1cbn1cbi5jdXJyZW50SGV4SW5wdXQge1xuICB6LWluZGV4OiAyO1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICBib3JkZXI6IG5vbmU7XG4gIG91dGxpbmU6IG5vbmU7XG4gIHBhZGRpbmc6IDA7XG5cbiAgJjo6c2VsZWN0aW9uIHtcbiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMzUpO1xuICB9XG59XG5cbi8vIGJhZGdlcyByZXN0aW5nIGlubGFuZCBvbiB0aGUgZGlzYywgdG9wIChleWVkcm9wcGVyKSBhbmQgYm90dG9tIChzYXZlIHRvXG4vLyBmYXZvcml0ZXMpIC0tIGRpc2NyZWV0OiBuZWFyLWludmlzaWJsZSBmaWxsLCBhbmQgaW5zdGVhZCBvZiBhIGRyYXduLW9uXG4vLyBib3JkZXIsIGFuIGVuZ3JhdmVkIGdyb292ZSAoZGFyayBpbnNldCBsaXAgb24gdG9wLCBmYWludCBoaWdobGlnaHQgb24gdGhlXG4vLyBib3R0b20gZWRnZSkgc28gdGhleSByZWFkIGFzIGNhcnZlZCBpbnRvIHRoZSBkaXNjIHJhdGhlciB0aGFuIHN0dWNrIG9uIGl0XG4uZGlzY0JhZGdlIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDUwJTtcbiAgbGVmdDogNTAlO1xuICB3aWR0aDogMzRweDtcbiAgaGVpZ2h0OiAzNHB4O1xuICBib3JkZXItcmFkaXVzOiA1MCU7XG4gIGJvcmRlcjogbm9uZTtcbiAgZGlzcGxheTogZ3JpZDtcbiAgcGxhY2UtaXRlbXM6IGNlbnRlcjtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICB6LWluZGV4OiAzO1xuICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4xNXMgZWFzZSwgZmlsdGVyIDAuMTVzIGVhc2U7XG5cbiAgJjpob3ZlciB7XG4gICAgZmlsdGVyOiBicmlnaHRuZXNzKDEuMTUpO1xuICB9XG4gIHN2ZyB7XG4gICAgd2lkdGg6IDE1cHg7XG4gICAgaGVpZ2h0OiAxNXB4O1xuICB9XG59XG4uZGlzY0JhZGdlVG9wIHtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgY2FsYygtNTAlIC0gNDZweCkpO1xuICAmOmFjdGl2ZSB7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgY2FsYygtNTAlIC0gNDZweCkpIHNjYWxlKDAuOTIpO1xuICB9XG4gICYucHVsc2Uge1xuICAgIGFuaW1hdGlvbjogYmFkZ2VQdWxzZVRvcCAwLjRzIGVhc2U7XG4gIH1cbn1cbi5kaXNjQmFkZ2VCb3R0b20ge1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCBjYWxjKC01MCUgKyA0NnB4KSk7XG4gICY6YWN0aXZlIHtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCBjYWxjKC01MCUgKyA0NnB4KSkgc2NhbGUoMC45Mik7XG4gIH1cbn1cbkBrZXlmcmFtZXMgYmFkZ2VQdWxzZVRvcCB7XG4gIDAlIHsgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgY2FsYygtNTAlIC0gNDZweCkpIHNjYWxlKDEpOyB9XG4gIDQwJSB7IHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIGNhbGMoLTUwJSAtIDQ2cHgpKSBzY2FsZSgxLjI4KTsgfVxuICAxMDAlIHsgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgY2FsYygtNTAlIC0gNDZweCkpIHNjYWxlKDEpOyB9XG59XG4iXX0= */","import { useEffect, useRef } from \"react\";\n\nexport interface PointerPos {\n x: number;\n y: number;\n}\n\n/**\n * Wires a press-and-drag gesture onto `ref`: on pointerdown, calls `onMove`\n * immediately with the pointer position, then keeps calling it on every\n * pointermove (tracked via window listeners, so the drag continues even once\n * the pointer leaves the element) until pointerup, when `onEnd` fires once.\n *\n * `onDraggingChange` is optional and only used to let the caller suppress CSS\n * transitions while a drag is in progress (snappy 1:1 tracking instead of an\n * easing lag).\n */\nexport function usePointerDrag(\n ref: React.RefObject<Element | null>,\n onMove: (pos: PointerPos) => void,\n onEnd?: () => void,\n onDraggingChange?: (dragging: boolean) => void\n): void {\n // refs so the effect's event listeners always call the latest callbacks\n // without needing to re-attach on every render\n const onMoveRef = useRef(onMove);\n onMoveRef.current = onMove;\n const onEndRef = useRef(onEnd);\n onEndRef.current = onEnd;\n const onDraggingChangeRef = useRef(onDraggingChange);\n onDraggingChangeRef.current = onDraggingChange;\n\n useEffect(() => {\n const el = ref.current;\n if (!el) return;\n\n function pointerPos(e: PointerEvent): PointerPos {\n return { x: e.clientX, y: e.clientY };\n }\n\n function move(e: PointerEvent) {\n onMoveRef.current(pointerPos(e));\n }\n\n function up() {\n onDraggingChangeRef.current?.(false);\n window.removeEventListener(\"pointermove\", move);\n window.removeEventListener(\"pointerup\", up);\n onEndRef.current?.();\n }\n\n function down(e: Event) {\n const pe = e as PointerEvent;\n pe.preventDefault();\n pe.stopPropagation();\n onDraggingChangeRef.current?.(true);\n onMoveRef.current(pointerPos(pe));\n window.addEventListener(\"pointermove\", move);\n window.addEventListener(\"pointerup\", up);\n }\n\n el.addEventListener(\"pointerdown\", down);\n return () => {\n el.removeEventListener(\"pointerdown\", down);\n window.removeEventListener(\"pointermove\", move);\n window.removeEventListener(\"pointerup\", up);\n };\n }, [ref]);\n}\n","import { useRef } from \"react\";\n\n/**\n * Takes a target angle in degrees (any range, typically re-derived fresh\n * each render from a 0-360 value like hue) and returns a CONTINUOUS angle\n * that always takes the shortest path to it -- so a CSS `transition` on\n * `rotate(${angle}deg)` sweeps a few degrees the short way instead of\n * jumping ~360deg the long way whenever the raw value wraps past 0/360\n * (e.g. hue going from 2deg to 358deg is a 4deg step backward, not a\n * 356deg step forward, but naively re-deriving `358` fresh every render\n * gives the transition no way to know that).\n */\nexport function useUnwrappedAngle(targetDeg: number): number {\n const continuousRef = useRef(targetDeg);\n\n const targetMod = ((targetDeg % 360) + 360) % 360;\n const currentMod = ((continuousRef.current % 360) + 360) % 360;\n let delta = targetMod - currentMod;\n if (delta > 180) delta -= 360;\n else if (delta < -180) delta += 360;\n\n continuousRef.current += delta;\n return continuousRef.current;\n}\n","export function hexToHsl(hex: string): [number, number, number] {\n const r = parseInt(hex.slice(1, 3), 16) / 255;\n const g = parseInt(hex.slice(3, 5), 16) / 255;\n const b = parseInt(hex.slice(5, 7), 16) / 255;\n\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const l = (max + min) / 2;\n let h = 0;\n let s = 0;\n\n if (max !== min) {\n const d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n switch (max) {\n case r: h = ((g - b) / d + (g < b ? 6 : 0)) / 6; break;\n case g: h = ((b - r) / d + 2) / 6; break;\n case b: h = ((r - g) / d + 4) / 6; break;\n }\n }\n\n return [h * 360, s * 100, l * 100];\n}\n\nexport function hslToHex(h: number, s: number, l: number): string {\n const sl = s / 100;\n const ll = l / 100;\n const a = sl * Math.min(ll, 1 - ll);\n const f = (n: number) => {\n const k = (n + h / 30) % 12;\n const color = ll - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);\n return Math.round(255 * color).toString(16).padStart(2, \"0\");\n };\n return `#${f(0)}${f(8)}${f(4)}`;\n}\n\nexport function hslToRgb(h: number, s: number, l: number): { r: number; g: number; b: number } {\n const sl = s / 100;\n const ll = l / 100;\n const a = sl * Math.min(ll, 1 - ll);\n const f = (n: number) => {\n const k = (n + h / 30) % 12;\n return Math.round(255 * (ll - a * Math.max(Math.min(k - 3, 9 - k, 1), -1)));\n };\n return { r: f(0), g: f(8), b: f(4) };\n}\n\nexport function rgbToHsl(r: number, g: number, b: number): [number, number, number] {\n const rr = r / 255, gg = g / 255, bb = b / 255;\n const max = Math.max(rr, gg, bb);\n const min = Math.min(rr, gg, bb);\n const l = (max + min) / 2;\n let h = 0, s = 0;\n if (max !== min) {\n const d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n switch (max) {\n case rr: h = ((gg - bb) / d + (gg < bb ? 6 : 0)) / 6; break;\n case gg: h = ((bb - rr) / d + 2) / 6; break;\n case bb: h = ((rr - gg) / d + 4) / 6; break;\n }\n }\n return [h * 360, s * 100, l * 100];\n}\n\nfunction hslToRgba(h: number, s: number, l: number, alpha: number): string {\n const { r, g, b } = hslToRgb(h, s, l);\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n}\n\nexport interface AccentTokens {\n base: string;\n dot: string;\n track: string;\n ring: string;\n glow: string;\n light: string;\n}\n\nexport interface ColorValue {\n hex: string;\n hexa: string;\n hsl: string;\n hsla: string;\n rgb: string;\n rgba: string;\n h: number;\n s: number;\n l: number;\n a: number;\n}\n\nexport function buildColorValue(h: number, s: number, l: number, a: number): ColorValue {\n const { r, g, b } = hslToRgb(h, s, l);\n const hex = hslToHex(h, s, l);\n const alphaHex = Math.round(a * 255).toString(16).padStart(2, \"0\");\n const hR = Math.round(h), sR = Math.round(s), lR = Math.round(l);\n const aR = Math.round(a * 100) / 100;\n return {\n hex,\n hexa: `${hex}${alphaHex}`,\n hsl: `hsl(${hR}, ${sR}%, ${lR}%)`,\n hsla: `hsla(${hR}, ${sR}%, ${lR}%, ${aR})`,\n rgb: `rgb(${r}, ${g}, ${b})`,\n rgba: `rgba(${r}, ${g}, ${b}, ${aR})`,\n h, s, l, a,\n };\n}\n\nexport function deriveAccent(hex: string): AccentTokens {\n const [h, s, l] = hexToHsl(hex);\n return {\n base: hex,\n dot: hslToHex(h, s, Math.min(l + 12, 95)),\n track: hex,\n ring: hex,\n glow: hslToRgba(h, s, l, 0.3),\n light: hslToHex(h, Math.max(s - 20, 0), Math.min(l + 45, 96)),\n };\n}\n\nexport function accentToCssVars(\n tokens: AccentTokens,\n prefix: string\n): Record<string, string> {\n return {\n [`--${prefix}-accent`]: tokens.base,\n [`--${prefix}-accent-dot`]: tokens.dot,\n [`--${prefix}-accent-track`]: tokens.track,\n [`--${prefix}-accent-ring`]: tokens.ring,\n [`--${prefix}-accent-glow`]: tokens.glow,\n [`--${prefix}-accent-light`]: tokens.light,\n };\n}\n","// Pure color-space conversions and small numeric helpers. No DOM, no React --\n// safe to unit test in isolation.\n\nexport interface Hsv {\n h: number; // 0-360\n s: number; // 0-100\n v: number; // 0-100\n}\n\nexport interface Rgb {\n r: number; // 0-255\n g: number; // 0-255\n b: number; // 0-255\n}\n\nexport function hsvToRgb(h: number, s: number, v: number): Rgb {\n s /= 100;\n v /= 100;\n const c = v * s;\n const x = c * (1 - Math.abs(((h / 60) % 2) - 1));\n const m = v - c;\n let r: number, g: number, b: number;\n if (h < 60) { r = c; g = x; b = 0; }\n else if (h < 120) { r = x; g = c; b = 0; }\n else if (h < 180) { r = 0; g = c; b = x; }\n else if (h < 240) { r = 0; g = x; b = c; }\n else if (h < 300) { r = x; g = 0; b = c; }\n else { r = c; g = 0; b = x; }\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 r /= 255; g /= 255; b /= 255;\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const d = max - min;\n let h = 0;\n if (d !== 0) {\n if (max === r) h = ((g - b) / d) % 6;\n else if (max === g) h = (b - r) / d + 2;\n else h = (r - g) / d + 4;\n h *= 60;\n if (h < 0) h += 360;\n }\n const s = max === 0 ? 0 : d / max;\n return { h, s: s * 100, v: max * 100 };\n}\n\nfunction toHexByte(n: number): string {\n const h = Math.max(0, Math.min(255, Math.round(n))).toString(16);\n return h.length === 1 ? \"0\" + h : h;\n}\n\nexport function rgbToHex(c: Rgb): string {\n return (\"#\" + toHexByte(c.r) + toHexByte(c.g) + toHexByte(c.b)).toUpperCase();\n}\n\n/** hsv + alpha (0-1) -> \"#RRGGBB\" or \"#RRGGBBAA\" (alpha channel only appended when < 1) */\nexport function hsvaToHex(hsv: Hsv, a: number): string {\n const rgb = hsvToRgb(hsv.h, hsv.s, hsv.v);\n let hex = rgbToHex(rgb);\n if (a < 1) hex += toHexByte(Math.round(a * 255));\n return hex;\n}\n\n/** \"#RGB\" / \"#RRGGBB\" / \"#RRGGBBAA\" (with or without leading #) -> hsv + alpha, or null if unparseable */\nexport function hexToHsva(input: string): { hsv: Hsv; a: number } | null {\n let clean = input.trim().replace(/^#/, \"\");\n if (/^[0-9a-fA-F]{3}$/.test(clean)) {\n clean = clean.split(\"\").map((ch) => ch + ch).join(\"\");\n }\n if (!/^[0-9a-fA-F]{6}$/.test(clean) && !/^[0-9a-fA-F]{8}$/.test(clean)) return null;\n const r = parseInt(clean.slice(0, 2), 16);\n const g = parseInt(clean.slice(2, 4), 16);\n const b = parseInt(clean.slice(4, 6), 16);\n const a = clean.length === 8 ? parseInt(clean.slice(6, 8), 16) / 255 : 1;\n return { hsv: rgbToHsv(r, g, b), a };\n}\n\nexport function clamp(v: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, v));\n}\n\nexport function round2(n: number): number {\n return Math.round(n * 100) / 100;\n}\n\n/** shortest distance between two angles on a 0-360 circle */\nexport function angleDistance(a: number, b: number): number {\n const d = Math.abs(a - b) % 360;\n return d > 180 ? 360 - d : d;\n}\n\n/** relative luminance (0-1), used to pick light/dark text or icon color against a background */\nexport function relativeLuminance(c: Rgb): number {\n return (0.2126 * c.r + 0.7152 * c.g + 0.0722 * c.b) / 255;\n}\n","import { useEffect, useMemo, useRef, useState } from \"react\";\nimport type { CSSProperties } from \"react\";\nimport styles from \"./ColorWheel.module.scss\";\nimport { usePointerDrag } from \"./usePointerDrag\";\nimport { useUnwrappedAngle } from \"./useUnwrappedAngle\";\nimport { deriveAccent, accentToCssVars } from \"../../utils/color\";\nimport {\n angleDistance,\n clamp,\n hexToHsva,\n hsvToRgb,\n hsvaToHex,\n relativeLuminance,\n rgbToHex,\n round2,\n type Hsv,\n} from \"./colorMath\";\n\nexport type ColorWheelMode = \"h\" | \"s\" | \"v\" | \"a\";\nexport type ColorWheelAlphaMode = \"arc\" | \"ring\";\nexport type ColorWheelTheme = \"light\" | \"dark\" | \"system\";\n\nexport interface ColorWheelProps {\n /** current color, as \"#RRGGBB\" or \"#RRGGBBAA\" */\n value: string;\n /** called with the next hex value on every interaction (drag, wheel, paste, eyedropper, picking a favorite) */\n onChange: (hex: string) => void;\n /** favorite hex swatches, rendered above the ring. Omit to hide the row entirely. */\n favorites?: string[];\n /** called with the full next list when the user saves the current color (the \"+\" badge) -- this component holds no favorites state of its own */\n onFavoritesChange?: (favorites: string[]) => void;\n /** caps how many favorites the \"+\" badge will keep (oldest dropped first). Only enforced on the list this component hands back -- a longer list you pass in is rendered as-is. */\n maxFavorites?: number;\n /**\n * Master switch: is alpha adjustable in the UI at all? true (default):\n * yes, via whichever scheme `alphaMode` picks. false: no alpha UI\n * whatsoever -- no arc, no \"A\" in the ring toggle -- though a translucent\n * `value` passed in is still honored, just not editable.\n */\n showAlphaControl?: boolean;\n /**\n * Only matters when `showAlphaControl` is true. 'arc' (default): a 3-way\n * H/S/V ring, alpha adjusted via the curved arc outside it. 'ring': a\n * 4-way H/S/V/A ring handles alpha itself, and the (now redundant) arc is\n * hidden. Mutually exclusive schemes, not two controls active at once.\n */\n alphaMode?: ColorWheelAlphaMode;\n /** 'system' (default) follows prefers-color-scheme; 'light'/'dark' pins it */\n theme?: ColorWheelTheme;\n /**\n * Uniform scale factor, 1 (default) = the design size (272px ring). Applied\n * as a CSS transform, so all the drag/wheel hit-testing (already measured\n * live via getBoundingClientRect, not hardcoded pixels) keeps working\n * unchanged at any size. Note this does NOT shrink the component's actual\n * DOM footprint to match -- it already visually bleeds past its own box at\n * scale 1 (the ring/arc extend beyond it), so a container you size and\n * position yourself is still expected, same as today.\n */\n size?: number;\n /** custom accent color (hex) -- overrides the global theme's primary color for this instance */\n accent?: string;\n className?: string;\n}\n\nconst RING_SPECTRUM =\n \"conic-gradient(from 180deg, hsl(0 100% 50%) 0%, hsl(60 100% 50%) 16.667%, \" +\n \"hsl(120 100% 50%) 33.333%, hsl(180 100% 50%) 50%, hsl(240 100% 50%) 66.667%, \" +\n \"hsl(300 100% 50%) 83.333%, hsl(360 100% 50%) 100%)\";\n\n// hue ring geometry (272px design size)\nconst RING_INNER_FRAC = 0.3382; // hole radius -- clicks inside go to the disc\nconst RING_OUTER_FRAC = 0.5; // ring's outer edge -- ignore clicks past it\n// mid-band handle radius (0.4191 * 272px stage ≈ 114px) is hardcoded directly\n// in ColorWheel.module.scss (.hueHandle's `top`), since the handle is now\n// positioned via a rotated pivot rather than a computed top/left percentage\n\n// alpha arc geometry (380px design size). Angles use the SAME convention as\n// the hue ring: a \"logical\" angle straight out of atan2(dy,dx), with\n// physical angle-from-top = 90deg + logical angle.\nconst ARC_A0 = 30;\nconst ARC_A1 = 150;\nconst ARC_HANDLE_R_FRAC = 152 / 380;\n\nconst MODES_HSV: ColorWheelMode[] = [\"h\", \"s\", \"v\"];\nconst MODES_HSVA: ColorWheelMode[] = [\"h\", \"s\", \"v\", \"a\"];\n\nfunction ringGradient(mode: ColorWheelMode, hsv: Hsv): string {\n if (mode === \"s\") {\n const grey = rgbToHex(hsvToRgb(hsv.h, 0, hsv.v));\n const full = rgbToHex(hsvToRgb(hsv.h, 100, hsv.v));\n return `conic-gradient(from 180deg, ${grey} 0deg, ${full} 360deg)`;\n }\n if (mode === \"v\") {\n const bright = rgbToHex(hsvToRgb(hsv.h, hsv.s, 100));\n return `conic-gradient(from 180deg, #000000 0deg, ${bright} 360deg)`;\n }\n if (mode === \"a\") {\n // true CSS transparency (not a checkerboard) -- whatever sits behind the\n // ring (the ambient glow) shows through, same as the disc's own alpha fill\n const full = rgbToHex(hsvToRgb(hsv.h, hsv.s, hsv.v));\n return `conic-gradient(from 180deg, transparent 0deg, ${full} 360deg)`;\n }\n return RING_SPECTRUM;\n}\n\nconst EMPTY_FAVORITES: string[] = [];\n\nexport function ColorWheel({\n value,\n onChange,\n favorites = EMPTY_FAVORITES,\n onFavoritesChange,\n maxFavorites = 5,\n showAlphaControl = true,\n alphaMode = \"arc\",\n theme = \"system\",\n size = 1,\n accent,\n className,\n}: ColorWheelProps) {\n const ringIsFourWay = showAlphaControl && alphaMode === \"ring\";\n const arcVisible = showAlphaControl && alphaMode === \"arc\";\n const modes = ringIsFourWay ? MODES_HSVA : MODES_HSV;\n const parsed = useMemo(() => hexToHsva(value), [value]);\n const [hsv, setHsv] = useState<Hsv>(() => parsed?.hsv ?? { h: 0, s: 0, v: 100 });\n const [alpha, setAlpha] = useState<number>(() => parsed?.a ?? 1);\n const [mode, setMode] = useState<ColorWheelMode>(\"h\");\n const [dragging, setDragging] = useState(false);\n const [copied, setCopied] = useState(false);\n const [pulseFavorite, setPulseFavorite] = useState(false);\n const [editing, setEditing] = useState(false);\n const [editValue, setEditValue] = useState(\"\");\n const [eyedropperSupported, setEyedropperSupported] = useState(false);\n\n const accentVars = accent ? accentToCssVars(deriveAccent(accent), \"colorwheel\") : {};\n\n // keep internal hsv/alpha in sync when `value` changes from OUTSIDE this\n // component -- but not when the change was our own onChange echoing back\n // through a controlled parent, or every keystroke of a drag would fight\n // the render.\n const lastEmitted = useRef(value);\n useEffect(() => {\n if (value === lastEmitted.current) return;\n const next = hexToHsva(value);\n if (next) {\n setHsv(next.hsv);\n setAlpha(next.a);\n }\n lastEmitted.current = value;\n }, [value]);\n\n useEffect(() => {\n setEyedropperSupported(typeof window !== \"undefined\" && \"EyeDropper\" in window);\n }, []);\n\n // if the props change out from under \"A\" while it happens to be selected\n // (alpha turned off, or switched to the arc scheme), fall back to hue\n // rather than leaving the ring stuck on a mode that no longer exists\n useEffect(() => {\n if (!ringIsFourWay && mode === \"a\") setMode(\"h\");\n }, [ringIsFourWay, mode]);\n\n const stageRef = useRef<HTMLDivElement>(null);\n const alphaArcRef = useRef<HTMLDivElement>(null);\n const modeToggleRef = useRef<HTMLDivElement>(null);\n const hexInputRef = useRef<HTMLInputElement>(null);\n\n function commit(nextHsv: Hsv, nextAlpha: number) {\n setHsv(nextHsv);\n setAlpha(nextAlpha);\n const hex = hsvaToHex(nextHsv, nextAlpha);\n lastEmitted.current = hex;\n onChange(hex);\n }\n\n // ---------------- derived, per-render ----------------\n const rgb = hsvToRgb(hsv.h, hsv.s, hsv.v);\n const solidHex = rgbToHex(rgb);\n const hexString = hsvaToHex(hsv, alpha);\n const luminance = relativeLuminance(rgb);\n const isLight = luminance > 0.58;\n const discText = isLight ? \"#1A1913\" : \"#FFFFFF\";\n const badgeBg = isLight ? \"rgba(0,0,0,0.02)\" : \"rgba(255,255,255,0.03)\";\n const badgeGrooveDark = isLight ? \"rgba(0,0,0,0.2)\" : \"rgba(0,0,0,0.32)\";\n const badgeGrooveLight = isLight ? \"rgba(255,255,255,0.35)\" : \"rgba(255,255,255,0.12)\";\n const badgeIcon = isLight ? \"rgba(0,0,0,0.72)\" : \"rgba(255,255,255,0.88)\";\n const badgeShadow: CSSProperties = {\n background: badgeBg,\n color: badgeIcon,\n boxShadow: `inset 0 1px 1px ${badgeGrooveDark}, inset 0 -1px 1px ${badgeGrooveLight}`,\n };\n\n // The handle's transform animates a ROTATION (not a top/left position) so\n // that switching mode -- which can jump the angle to the opposite side of\n // the ring -- sweeps along the circumference instead of interpolating a\n // straight line (a chord) through the middle of the ring.\n const ringLogicalAngle =\n mode === \"h\" ? hsv.h : mode === \"a\" ? alpha * 360 : ((mode === \"s\" ? hsv.s : hsv.v) / 100) * 360;\n // hue wraps freely (it's cyclic -- 0deg and 360deg are the same color), but\n // re-deriving it fresh in 0-360 every render means crossing that seam would\n // otherwise animate ~356deg the \"long way\" instead of a few degrees the\n // short way. This smooths it to always take the short path.\n const ringAngleFromTopDeg = useUnwrappedAngle(180 + ringLogicalAngle);\n\n // pixel offsets from the shared anchor point (NOT a percentage of the\n // handle's own containing block -- .alphaArcHandle is a sibling of\n // .alphaArc, anchored the same way the mode toggle is, not sized to the\n // arc's 380px coordinate space)\n const arcLogicalAngle = ARC_A1 - alpha * (ARC_A1 - ARC_A0);\n const arcAngleFromTop = (90 + arcLogicalAngle) * (Math.PI / 180);\n const arcHandleR = ARC_HANDLE_R_FRAC * 380;\n const arcHandleDx = arcHandleR * Math.sin(arcAngleFromTop);\n const arcHandleDy = -arcHandleR * Math.cos(arcAngleFromTop);\n\n // ---------------- ring: drag + wheel ----------------\n function applyRingAngle(angle: number) {\n if (mode === \"h\") commit({ ...hsv, h: angle }, alpha);\n else if (mode === \"s\") commit({ ...hsv, s: (angle / 360) * 100 }, alpha);\n else if (mode === \"a\") commit(hsv, angle / 360);\n else commit({ ...hsv, v: (angle / 360) * 100 }, alpha);\n }\n\n // Hue wraps freely when dragged all the way around (0deg and 360deg are the\n // same color, so there's nothing to \"stop\" at). S/V/A are linear 0-100%\n // quantities with real endpoints, though -- dragging past the seam should\n // pin at 0%/100%, not wrap to the other end. Since a single pointer sample\n // only gives a raw 0-360deg reading (angle wraps are indistinguishable from\n // \"moved to the far side\"), these two refs track the PREVIOUS sample and an\n // unclamped running total for the current gesture, so each step is read as\n // a small delta (shortest-path) rather than an absolute position -- and\n // that running total is what gets clamped, not the raw angle.\n const dragPrevAngleRef = useRef<number | null>(null);\n const dragAccumRef = useRef(0);\n\n usePointerDrag(\n stageRef,\n (pos) => {\n const rect = stageRef.current!.getBoundingClientRect();\n const cx = rect.left + rect.width / 2;\n const cy = rect.top + rect.height / 2;\n const dx = pos.x - cx;\n const dy = pos.y - cy;\n const dist = Math.hypot(dx, dy);\n if (dist < rect.width * RING_INNER_FRAC || dist > rect.width * RING_OUTER_FRAC) return;\n // inverse of the render-time mapping (physical angle = 180deg + logical\n // angle): atan2 gives (physical - 90), so subtract another 90 to undo it\n let angle = Math.atan2(dy, dx) * (180 / Math.PI) - 90;\n angle = ((angle % 360) + 360) % 360;\n\n if (mode === \"h\") {\n applyRingAngle(angle);\n return;\n }\n\n if (dragPrevAngleRef.current === null) {\n dragAccumRef.current = angle;\n } else {\n let delta = angle - dragPrevAngleRef.current;\n if (delta > 180) delta -= 360;\n else if (delta < -180) delta += 360;\n dragAccumRef.current = clamp(dragAccumRef.current + delta, 0, 360);\n }\n dragPrevAngleRef.current = angle;\n applyRingAngle(dragAccumRef.current);\n },\n undefined,\n (dragging) => {\n if (!dragging) dragPrevAngleRef.current = null;\n setDragging(dragging);\n }\n );\n\n useEffect(() => {\n const el = stageRef.current;\n if (!el) return;\n function onWheel(e: WheelEvent) {\n const rect = el!.getBoundingClientRect();\n const cx = rect.left + rect.width / 2;\n const cy = rect.top + rect.height / 2;\n const dist = Math.hypot(e.clientX - cx, e.clientY - cy);\n if (dist < rect.width * RING_INNER_FRAC || dist > rect.width * RING_OUTER_FRAC) return;\n e.preventDefault();\n const dir = e.deltaY > 0 ? -1 : 1;\n if (mode === \"h\") commit({ ...hsv, h: (hsv.h + dir * 4 + 360) % 360 }, alpha);\n else if (mode === \"s\") commit({ ...hsv, s: clamp(hsv.s + dir * 3, 0, 100) }, alpha);\n else if (mode === \"a\") commit(hsv, clamp(round2(alpha + dir * 0.03), 0, 1));\n else commit({ ...hsv, v: clamp(hsv.v + dir * 3, 0, 100) }, alpha);\n }\n el.addEventListener(\"wheel\", onWheel, { passive: false });\n return () => el.removeEventListener(\"wheel\", onWheel);\n }, [mode, hsv, alpha]);\n\n // ---------------- alpha arc: drag + wheel ----------------\n usePointerDrag(\n alphaArcRef,\n (pos) => {\n const rect = alphaArcRef.current!.getBoundingClientRect();\n const cx = rect.left + rect.width / 2;\n const cy = rect.top + rect.height / 2;\n let angle = Math.atan2(pos.y - cy, pos.x - cx) * (180 / Math.PI);\n if (angle < 0) angle += 360;\n if (angle < ARC_A0 || angle > ARC_A1) {\n angle = angleDistance(angle, ARC_A0) < angleDistance(angle, ARC_A1) ? ARC_A0 : ARC_A1;\n }\n commit(hsv, round2((ARC_A1 - angle) / (ARC_A1 - ARC_A0)));\n },\n undefined,\n setDragging\n );\n\n useEffect(() => {\n const el = alphaArcRef.current;\n if (!el) return;\n function onWheel(e: WheelEvent) {\n e.preventDefault();\n const dir = e.deltaY > 0 ? -1 : 1;\n commit(hsv, clamp(round2(alpha + dir * 0.05), 0, 1));\n }\n el.addEventListener(\"wheel\", onWheel, { passive: false });\n return () => el.removeEventListener(\"wheel\", onWheel);\n }, [hsv, alpha]);\n\n // ---------------- mode toggle ----------------\n useEffect(() => {\n const el = modeToggleRef.current;\n if (!el) return;\n function onWheel(e: WheelEvent) {\n e.preventDefault();\n const idx = modes.indexOf(mode);\n const dir = e.deltaY > 0 ? -1 : 1;\n setMode(modes[clamp(idx + dir, 0, modes.length - 1)]);\n }\n el.addEventListener(\"wheel\", onWheel, { passive: false });\n return () => el.removeEventListener(\"wheel\", onWheel);\n }, [mode, modes]);\n\n // ---------------- disc: copy on click, edit on click of the hex text ----------------\n function handleDiscClick() {\n const done = () => {\n setCopied(true);\n setTimeout(() => setCopied(false), 900);\n };\n if (navigator.clipboard?.writeText) {\n navigator.clipboard.writeText(hexString).then(done, done);\n } else {\n done();\n }\n }\n\n function beginEdit(e: React.MouseEvent) {\n e.stopPropagation();\n setEditValue(hexString);\n setEditing(true);\n requestAnimationFrame(() => {\n hexInputRef.current?.focus();\n hexInputRef.current?.setSelectionRange(1, hexString.length);\n });\n }\n\n function commitEdit(cancelled: boolean) {\n if (!cancelled) {\n const next = hexToHsva(editValue);\n if (next) commit(next.hsv, next.a);\n }\n setEditing(false);\n }\n\n // ---------------- eyedropper ----------------\n function pickFromScreen() {\n // @ts-expect-error -- EyeDropper isn't in lib.dom.d.ts yet\n const dropper = new window.EyeDropper();\n dropper\n .open()\n .then((result: { sRGBHex: string }) => {\n const next = hexToHsva(result.sRGBHex);\n if (next) commit(next.hsv, next.a);\n })\n .catch(() => {});\n }\n\n // ---------------- favorites ----------------\n function saveFavorite() {\n const next = [hexString, ...favorites.filter((h) => h !== hexString)].slice(0, maxFavorites);\n onFavoritesChange?.(next);\n setPulseFavorite(false);\n requestAnimationFrame(() => setPulseFavorite(true));\n }\n\n function applyFavorite(hex: string) {\n const next = hexToHsva(hex);\n if (next) commit(next.hsv, next.a);\n }\n\n function removeFavorite(hex: string) {\n onFavoritesChange?.(favorites.filter((h) => h !== hex));\n }\n\n return (\n <div\n className={[styles.root, className].filter(Boolean).join(\" \")}\n data-theme={theme === \"system\" ? undefined : theme}\n data-dragging={dragging ? \"true\" : undefined}\n style={{\n ...accentVars,\n ...(size !== 1 ? { transform: `scale(${size})`, transformOrigin: \"top center\" } : undefined),\n } as React.CSSProperties}\n >\n {favorites.length > 0 && (\n <div className={styles.recents}>\n {favorites.map((hex, i) => (\n <div key={hex + i} className={styles.chipWrap} style={{ animationDelay: `${i * 0.02}s` }}>\n <button\n type=\"button\"\n className={styles.chip}\n style={{ background: hex.length > 7 ? hex.slice(0, 7) : hex }}\n title={hex}\n aria-label={`Apply color ${hex}`}\n onClick={() => applyFavorite(hex)}\n />\n <button\n type=\"button\"\n className={styles.chipRemove}\n aria-label={`Remove ${hex} from favorites`}\n onClick={(e) => {\n e.stopPropagation();\n removeFavorite(hex);\n }}\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={3} strokeLinecap=\"round\">\n <path d=\"M6 6l12 12M18 6L6 18\" />\n </svg>\n </button>\n </div>\n ))}\n </div>\n )}\n\n <div className={styles.picker}>\n <div\n className={styles.glow}\n style={{ background: `radial-gradient(closest-side, ${solidHex}, transparent 72%)` }}\n />\n\n <div\n className={styles.modeToggle}\n ref={modeToggleRef}\n style={{ width: modes.length * 28, gridTemplateColumns: `repeat(${modes.length}, 1fr)` }}\n >\n <div\n className={styles.modePill}\n style={{\n width: `calc(${100 / modes.length}% - 2px)`,\n transform: `translateX(calc(${modes.indexOf(mode)} * (100% + 1px)))`,\n }}\n />\n {modes.map((m) => (\n <button\n key={m}\n type=\"button\"\n className={[styles.modeButton, mode === m ? styles.active : \"\"].join(\" \")}\n onClick={() => setMode(m)}\n >\n {m.toUpperCase()}\n </button>\n ))}\n </div>\n\n <div className={styles.stage} ref={stageRef}>\n <div className={styles.stageShadow} />\n <div className={styles.ring} style={{ background: ringGradient(mode, hsv) }} />\n\n <div className={styles.currentDisc} onClick={handleDiscClick}>\n <div className={styles.discFill} style={{ background: `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, ${alpha})` }} />\n {!editing && (\n <span className={[styles.currentHex, copied ? styles.copied : \"\"].join(\" \")} style={{ color: discText }} onClick={beginEdit}>\n {copied ? \"Copied\" : hexString}\n </span>\n )}\n {editing && (\n <input\n ref={hexInputRef}\n className={styles.currentHexInput}\n style={{ color: discText }}\n type=\"text\"\n inputMode=\"text\"\n autoComplete=\"off\"\n spellCheck={false}\n maxLength={9}\n value={editValue}\n onClick={(e) => e.stopPropagation()}\n onChange={(e) => setEditValue(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") hexInputRef.current?.blur();\n else if (e.key === \"Escape\") {\n commitEdit(true);\n }\n }}\n onBlur={() => commitEdit(false)}\n />\n )}\n </div>\n\n {eyedropperSupported && (\n <button\n type=\"button\"\n className={[styles.discBadge, styles.discBadgeBottom].join(\" \")}\n style={badgeShadow}\n aria-label=\"Pick color from screen\"\n onClick={pickFromScreen}\n >\n <svg viewBox=\"0 0 32 32\" fill=\"currentColor\">\n <path d=\"M27.7,3.3c-1.5-1.5-3.9-1.5-5.4,0L17,8.6l-1.3-1.3c-0.4-0.4-1-0.4-1.4,0s-0.4,1,0,1.4l1.3,1.3L5,20.6c-0.6,0.6-1,1.4-1.1,2.3C3.3,23.4,3,24.2,3,25c0,1.7,1.3,3,3,3c0.8,0,1.6-0.3,2.2-0.9C9,27,9.8,26.6,10.4,26L21,15.4l1.3,1.3c0.2,0.2,0.5,0.3,0.7,0.3s0.5-0.1,0.7-0.3c0.4-0.4,0.4-1,0-1.4L22.4,14l5.3-5.3C29.2,7.2,29.2,4.8,27.7,3.3z M9,24.6c-0.4,0.4-0.8,0.6-1.3,0.5c-0.4,0-0.7,0.2-0.9,0.5C6.7,25.8,6.3,26,6,26c-0.6,0-1-0.4-1-1c0-0.3,0.2-0.7,0.5-0.8c0.3-0.2,0.5-0.5,0.5-0.9c0-0.5,0.2-1,0.5-1.3L17,11.4l2.6,2.6L9,24.6z\" />\n </svg>\n </button>\n )}\n <button\n type=\"button\"\n className={[styles.discBadge, styles.discBadgeTop, pulseFavorite ? styles.pulse : \"\"].join(\" \")}\n style={badgeShadow}\n aria-label=\"Save current color to favorites\"\n onClick={saveFavorite}\n onAnimationEnd={() => setPulseFavorite(false)}\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2.2} strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M12 5v14M5 12h14\" />\n </svg>\n </button>\n\n <div className={styles.hueHandlePivot} style={{ transform: `translate(-50%, -50%) rotate(${ringAngleFromTopDeg}deg)` }}>\n <div className={styles.hueHandle} style={{ background: solidHex }} />\n </div>\n </div>\n\n {/* Two mutually exclusive schemes: 3-way ring (H/S/V) + this arc\n handles alpha, OR 4-way ring (H/S/V/A) handles all four and the\n arc is redundant -- not \"hide only while mode is literally A\".\n Kept mounted (never conditionally unmounted) even when hidden --\n the drag/wheel listeners are attached to these DOM nodes directly,\n and unmounting+remounting would silently drop them since the\n effects that attach them don't depend on the element re-mounting.\n display:none/contents just toggles visibility + interactivity. */}\n <div style={{ display: arcVisible ? \"contents\" : \"none\" }}>\n <div className={styles.alphaArcShadowWrap}>\n <div className={styles.alphaArcShadow} />\n </div>\n <div className={styles.alphaArc} ref={alphaArcRef}>\n <div\n className={styles.alphaArcFill}\n style={{ background: `conic-gradient(from 90deg, ${solidHex} 30deg, transparent 150deg)` }}\n />\n </div>\n <div className={[styles.alphaArcCap, styles.alphaArcCapStart].join(\" \")} style={{ background: solidHex }} />\n <div className={[styles.alphaArcCap, styles.alphaArcCapEnd].join(\" \")} />\n <div\n className={styles.alphaArcHandle}\n style={{\n transform: `translate(calc(-50% + ${arcHandleDx}px), calc(-50% + ${arcHandleDy}px))`,\n background: solidHex,\n }}\n />\n </div>\n </div>\n </div>\n );\n}\n"]}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import
|
|
1
|
+
import React__default from 'react';
|
|
2
2
|
|
|
3
3
|
type InputSize = "sm" | "md" | "lg";
|
|
4
|
-
interface InputProps extends Omit<
|
|
4
|
+
interface InputProps extends Omit<React__default.InputHTMLAttributes<HTMLInputElement>, "size"> {
|
|
5
5
|
label?: string;
|
|
6
6
|
helperText?: string;
|
|
7
7
|
errorText?: string;
|
|
8
8
|
size?: InputSize;
|
|
9
9
|
fullWidth?: boolean;
|
|
10
|
-
startAdornment?:
|
|
11
|
-
endAdornment?:
|
|
10
|
+
startAdornment?: React__default.ReactNode;
|
|
11
|
+
endAdornment?: React__default.ReactNode;
|
|
12
12
|
}
|
|
13
|
-
declare const Input:
|
|
13
|
+
declare const Input: React__default.ForwardRefExoticComponent<InputProps & React__default.RefAttributes<HTMLInputElement>>;
|
|
14
14
|
|
|
15
15
|
export { Input, type InputProps, type InputSize };
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import
|
|
1
|
+
import React__default from 'react';
|
|
2
2
|
|
|
3
3
|
type InputSize = "sm" | "md" | "lg";
|
|
4
|
-
interface InputProps extends Omit<
|
|
4
|
+
interface InputProps extends Omit<React__default.InputHTMLAttributes<HTMLInputElement>, "size"> {
|
|
5
5
|
label?: string;
|
|
6
6
|
helperText?: string;
|
|
7
7
|
errorText?: string;
|
|
8
8
|
size?: InputSize;
|
|
9
9
|
fullWidth?: boolean;
|
|
10
|
-
startAdornment?:
|
|
11
|
-
endAdornment?:
|
|
10
|
+
startAdornment?: React__default.ReactNode;
|
|
11
|
+
endAdornment?: React__default.ReactNode;
|
|
12
12
|
}
|
|
13
|
-
declare const Input:
|
|
13
|
+
declare const Input: React__default.ForwardRefExoticComponent<InputProps & React__default.RefAttributes<HTMLInputElement>>;
|
|
14
14
|
|
|
15
15
|
export { Input, type InputProps, type InputSize };
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import
|
|
1
|
+
import React__default from 'react';
|
|
2
2
|
|
|
3
3
|
interface RainCanvasProps {
|
|
4
4
|
dropCount?: number;
|
|
5
5
|
background?: string;
|
|
6
|
-
children?:
|
|
6
|
+
children?: React__default.ReactNode;
|
|
7
7
|
className?: string;
|
|
8
|
-
style?:
|
|
8
|
+
style?: React__default.CSSProperties;
|
|
9
9
|
}
|
|
10
|
-
declare const RainCanvas:
|
|
10
|
+
declare const RainCanvas: React__default.FC<RainCanvasProps>;
|
|
11
11
|
|
|
12
12
|
export { RainCanvas, type RainCanvasProps };
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import
|
|
1
|
+
import React__default from 'react';
|
|
2
2
|
|
|
3
3
|
interface RainCanvasProps {
|
|
4
4
|
dropCount?: number;
|
|
5
5
|
background?: string;
|
|
6
|
-
children?:
|
|
6
|
+
children?: React__default.ReactNode;
|
|
7
7
|
className?: string;
|
|
8
|
-
style?:
|
|
8
|
+
style?: React__default.CSSProperties;
|
|
9
9
|
}
|
|
10
|
-
declare const RainCanvas:
|
|
10
|
+
declare const RainCanvas: React__default.FC<RainCanvasProps>;
|
|
11
11
|
|
|
12
12
|
export { RainCanvas, type RainCanvasProps };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import React__default from 'react';
|
|
2
2
|
import { Extensions, JSONContent, Mark, Node } from '@tiptap/core';
|
|
3
3
|
export { useCurrentEditor } from '@tiptap/react';
|
|
4
4
|
|
|
@@ -11,20 +11,20 @@ interface RichTextEditorProps {
|
|
|
11
11
|
accent?: string;
|
|
12
12
|
extensions?: Extensions;
|
|
13
13
|
/** Rendered inside the toolbar, after the built-in buttons. Use with useCurrentEditor(). */
|
|
14
|
-
slotBefore?:
|
|
14
|
+
slotBefore?: React__default.ReactNode;
|
|
15
15
|
/** Rendered below the editor area. Use with useCurrentEditor(). */
|
|
16
|
-
slotAfter?:
|
|
16
|
+
slotAfter?: React__default.ReactNode;
|
|
17
17
|
onChangeHTML?: (html: string) => void;
|
|
18
18
|
onChangeJSON?: (json: JSONContent) => void;
|
|
19
19
|
}
|
|
20
|
-
declare const RichTextEditor:
|
|
20
|
+
declare const RichTextEditor: React__default.FC<RichTextEditorProps>;
|
|
21
21
|
|
|
22
22
|
declare const Highlight: Mark<any, any>;
|
|
23
23
|
|
|
24
|
-
declare const HighlightButton:
|
|
24
|
+
declare const HighlightButton: React__default.FC;
|
|
25
25
|
|
|
26
26
|
declare const PageBreak: Node<any, any>;
|
|
27
27
|
|
|
28
|
-
declare const PageBreakButton:
|
|
28
|
+
declare const PageBreakButton: React__default.FC;
|
|
29
29
|
|
|
30
30
|
export { Highlight, HighlightButton, PageBreak, PageBreakButton, RichTextEditor, type RichTextEditorProps };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import React__default from 'react';
|
|
2
2
|
import { Extensions, JSONContent, Mark, Node } from '@tiptap/core';
|
|
3
3
|
export { useCurrentEditor } from '@tiptap/react';
|
|
4
4
|
|
|
@@ -11,20 +11,20 @@ interface RichTextEditorProps {
|
|
|
11
11
|
accent?: string;
|
|
12
12
|
extensions?: Extensions;
|
|
13
13
|
/** Rendered inside the toolbar, after the built-in buttons. Use with useCurrentEditor(). */
|
|
14
|
-
slotBefore?:
|
|
14
|
+
slotBefore?: React__default.ReactNode;
|
|
15
15
|
/** Rendered below the editor area. Use with useCurrentEditor(). */
|
|
16
|
-
slotAfter?:
|
|
16
|
+
slotAfter?: React__default.ReactNode;
|
|
17
17
|
onChangeHTML?: (html: string) => void;
|
|
18
18
|
onChangeJSON?: (json: JSONContent) => void;
|
|
19
19
|
}
|
|
20
|
-
declare const RichTextEditor:
|
|
20
|
+
declare const RichTextEditor: React__default.FC<RichTextEditorProps>;
|
|
21
21
|
|
|
22
22
|
declare const Highlight: Mark<any, any>;
|
|
23
23
|
|
|
24
|
-
declare const HighlightButton:
|
|
24
|
+
declare const HighlightButton: React__default.FC;
|
|
25
25
|
|
|
26
26
|
declare const PageBreak: Node<any, any>;
|
|
27
27
|
|
|
28
|
-
declare const PageBreakButton:
|
|
28
|
+
declare const PageBreakButton: React__default.FC;
|
|
29
29
|
|
|
30
30
|
export { Highlight, HighlightButton, PageBreak, PageBreakButton, RichTextEditor, type RichTextEditorProps };
|
|
@@ -107,6 +107,7 @@ var SliderControl = ({
|
|
|
107
107
|
step = 1,
|
|
108
108
|
onChange,
|
|
109
109
|
showTooltip = "drag",
|
|
110
|
+
showPercentage = false,
|
|
110
111
|
leftIcon,
|
|
111
112
|
rightIcon,
|
|
112
113
|
railBackground,
|
|
@@ -200,7 +201,8 @@ var SliderControl = ({
|
|
|
200
201
|
[disabled, step, min, max, value, setValue]
|
|
201
202
|
);
|
|
202
203
|
const tooltipVisible = showTooltip === "always" || showTooltip === "drag" && (isDragging || isFocused);
|
|
203
|
-
const
|
|
204
|
+
const decimals = step < 1 ? Math.ceil(-Math.log10(step)) : 0;
|
|
205
|
+
const displayValue = showPercentage ? `${Math.round((value - min) / (max - min) * 100)}%` : value.toFixed(decimals);
|
|
204
206
|
const tooltipOffset = `calc(${pct * 100}% + ${(0.5 - pct) * 20}px)`;
|
|
205
207
|
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
206
208
|
"div",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/SliderControl/SliderControl.module.scss","../../../src/utils/color.ts","../../../src/components/SliderControl/SliderControl.tsx"],"names":["wrapper","disabled","icon","trackArea","groove","rail","fill","thumb","thumbDragging","tooltip","tooltipVisible","useState","useRef","useCallback","useEffect","jsxs","jsx"],"mappings":"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","file":"index.cjs","sourcesContent":["@import url(\"https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&display=swap\");\n:root {\n --accent: #3b82f6;\n --accent-dot: rgb(82.52, 145, 247.08);\n --accent-track: #3b82f6;\n --accent-ring: #3b82f6;\n --accent-glow: rgba(59, 130, 246, 0.3);\n --accent-light: rgb(157.485, 188.725, 239.765);\n --color-primary-50: rgb(169.3455, 194.6925, 236.1045);\n --color-primary-100: rgb(149.4545, 184.4575, 241.6455);\n --color-primary-400: rgb(82.52, 145, 247.08);\n --color-primary-500: #3b82f6;\n --color-primary-600: rgb(29.8390243902, 111.4024390244, 244.6609756098);\n --color-primary-700: rgb(10.712195122, 95.2195121951, 233.287804878);\n --color-neutral-0: #ffffff;\n --color-neutral-100: #f3f4f6;\n --color-neutral-200: #e5e7eb;\n --color-neutral-400: #9ca3af;\n --color-neutral-600: #4b5563;\n --color-neutral-900: #111827;\n --color-success-500: #22c55e;\n --color-success-600: #16a34a;\n --color-danger-500: #ef4444;\n --color-danger-600: #dc2626;\n --color-warning-500: #f59e0b;\n --color-warning-600: #d97706;\n --font-family-base: \"Inter\", system-ui, -apple-system, sans-serif;\n --font-size-xs: 0.75rem;\n --font-size-sm: 0.875rem;\n --font-size-md: 1rem;\n --font-size-lg: 1.125rem;\n --spacing-1: 0.25rem;\n --spacing-2: 0.5rem;\n --spacing-3: 0.75rem;\n --spacing-4: 1rem;\n --radius-sm: 0.25rem;\n --radius-md: 0.375rem;\n --radius-lg: 0.5rem;\n --radius-full: 9999px;\n --shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.05);\n --shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);\n --transition-fast: 150ms ease;\n --color-surface: #ffffff;\n --color-surface-elevated: #ffffff;\n}\n\n[data-theme=dark] {\n --color-neutral-0: #0f172a;\n --color-neutral-100: #1e293b;\n --color-neutral-200: #334155;\n --color-neutral-400: #94a3b8;\n --color-neutral-600: #cbd5e1;\n --color-neutral-900: #f8fafc;\n --color-surface: #1e293b;\n --color-surface-elevated: #273549;\n --color-primary-50: #172554;\n --color-primary-100: #1e3a8a;\n --accent-light: #172554;\n --shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.4);\n --shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.5), 0 2px 4px -2px rgb(0 0 0 / 0.4);\n}\n\n.wrapper {\n display: flex;\n align-items: center;\n gap: 10px;\n font-family: var(--font-family-base);\n user-select: none;\n -webkit-user-select: none;\n}\n\n.disabled {\n opacity: 0.45;\n pointer-events: none;\n}\n\n.icon {\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--color-neutral-400);\n flex-shrink: 0;\n line-height: 0;\n}\n\n.trackArea {\n position: relative;\n flex: 1;\n height: 36px;\n display: flex;\n align-items: center;\n cursor: pointer;\n}\n\n.groove {\n position: relative;\n width: 100%;\n height: 22px;\n border-radius: var(--radius-full);\n background: var(--color-neutral-300);\n display: flex;\n align-items: center;\n box-shadow: inset 0 4px 8px rgba(0, 0, 0, 0.14), inset 0 2px 4px rgba(0, 0, 0, 0.06), inset 0 -2px 3px rgba(255, 255, 255, 0.1);\n}\n\n.rail {\n position: absolute;\n left: 8px;\n right: 8px;\n height: 6px;\n border-radius: var(--radius-full);\n background: var(--color-neutral-400);\n box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.3), inset 0 1px 1px rgba(0, 0, 0, 0.18);\n overflow: hidden;\n}\n\n.fill {\n position: absolute;\n top: 0;\n left: 0;\n height: 100%;\n background: var(--slider-accent-track, var(--accent-track));\n border-radius: var(--radius-full);\n transition: width 60ms linear;\n}\n\n.thumb {\n position: absolute;\n top: 50%;\n width: 18px;\n height: 18px;\n border-radius: 50%;\n transform: translate(-50%, -50%);\n background: #dde0e6;\n border: 1px solid rgba(0, 0, 0, 0.1);\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.22);\n cursor: grab;\n transition: box-shadow 120ms ease, transform 120ms ease;\n outline: none;\n z-index: 2;\n}\n\n.thumb:focus-visible {\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.22), 0 0 0 3px var(--slider-accent-ring, var(--accent-ring));\n}\n\n.thumbDragging {\n cursor: grabbing;\n transform: translate(-50%, -50%) scale(1.08);\n box-shadow: 0 1px 4px rgba(0, 0, 0, 0.28), 0 0 0 3px var(--slider-accent-ring, var(--accent-ring)), 0 0 0 6px var(--slider-accent-glow, var(--accent-glow));\n}\n\n.tooltip {\n position: absolute;\n bottom: calc(100% + 6px);\n transform: translateX(-50%);\n background: rgba(18, 18, 26, 0.85);\n backdrop-filter: blur(6px);\n -webkit-backdrop-filter: blur(6px);\n color: #fff;\n font-size: 11px;\n font-weight: 600;\n letter-spacing: 0.02em;\n padding: 3px 8px;\n border-radius: 6px;\n white-space: nowrap;\n pointer-events: none;\n opacity: 0;\n transition: opacity 120ms ease;\n z-index: 10;\n}\n.tooltip::after {\n content: \"\";\n position: absolute;\n top: 100%;\n left: 50%;\n transform: translateX(-50%);\n border: 4px solid transparent;\n border-top-color: rgba(18, 18, 26, 0.85);\n}\n\n.tooltipVisible {\n opacity: 1;\n}\n\n[data-theme=dark] .groove {\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.07), inset 0 3px 7px rgba(0, 0, 0, 0.32), inset 0 1px 3px rgba(0, 0, 0, 0.22), inset 0 -2px 3px rgba(255, 255, 255, 0.04);\n}\n[data-theme=dark] .thumb {\n background: #4a4f5c;\n border-color: rgba(255, 255, 255, 0.08);\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.45);\n}\n[data-theme=dark] .thumbDragging {\n box-shadow: 0 1px 4px rgba(0, 0, 0, 0.5), 0 0 0 3px var(--slider-accent-ring, var(--accent-ring)), 0 0 0 6px var(--slider-accent-glow, var(--accent-glow));\n}\n/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3N0eWxlcy90b2tlbnMuc2NzcyIsIlNsaWRlckNvbnRyb2wubW9kdWxlLnNjc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRVE7QUFLUjtFQUVFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUdBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUdBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUdBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUdBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFHQTtFQUNBO0VBQ0E7RUFDQTtFQUdBO0VBQ0E7RUFDQTtFQUNBO0VBR0E7RUFDQTtFQUdBO0VBR0E7RUFDQTs7O0FBUUY7RUFFRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFHQTtFQUNBO0VBR0E7RUFDQTtFQUlBO0VBR0E7RUFDQTs7O0FDeEZGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRjtFQUNFO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFJRjtFQUNFO0VBQ0E7RUFDQSxRQTdCYztFQThCZDtFQUNBO0VBQ0E7OztBQUlGO0VBQ0U7RUFDQTtFQUNBLFFBMUNjO0VBMkNkO0VBQ0E7RUFDQTtFQUNBO0VBRUEsWUFDRTs7O0FBTUo7RUFDRTtFQUNBO0VBQ0E7RUFDQSxRQTFEZTtFQTJEZjtFQUNBO0VBQ0EsWUFDRTtFQUVGOzs7QUFJRjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0EsWUE5RWE7RUErRWI7RUFDQTs7O0FBSUY7RUFDRTtFQUNBO0VBQ0EsT0FqRmM7RUFrRmQsUUFsRmM7RUFtRmQ7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRjtFQUNFLFlBQ0U7OztBQUlKO0VBQ0U7RUFDQTtFQUNBLFlBQ0U7OztBQU1KO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7QUFFQTtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFJSjtFQUNFOzs7QUFLQTtFQUNFLFlBQ0U7O0FBTUo7RUFDRTtFQUNBO0VBQ0E7O0FBR0Y7RUFDRSxZQUNFIiwic291cmNlc0NvbnRlbnQiOlsiQHVzZSBcInNhc3M6Y29sb3JcIjtcblxuQGltcG9ydCB1cmwoXCJodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2NzczI/ZmFtaWx5PUludGVyOndnaHRANDAwOzUwMDs2MDAmZGlzcGxheT1zd2FwXCIpO1xuXG4vLyBBY2NlbnQgZGkgZGVmYXVsdCDigJQgY2FtYmlhIHF1aSBwZXIgYWdnaW9ybmFyZSB0dXR0YSBsYSBsaWJyZXJpYVxuJGFjY2VudDogIzNiODJmNjtcblxuOnJvb3Qge1xuICAvLyBBY2NlbnQgc2NhbGUg4oCUIGRlcml2YXRhIGRhICRhY2NlbnQgYSBjb21waWxlIHRpbWVcbiAgLS1hY2NlbnQ6ICAgICAgICAjeyRhY2NlbnR9O1xuICAtLWFjY2VudC1kb3Q6ICAgICN7Y29sb3Iuc2NhbGUoJGFjY2VudCwgJGxpZ2h0bmVzczogMTIlKX07XG4gIC0tYWNjZW50LXRyYWNrOiAgI3skYWNjZW50fTtcbiAgLS1hY2NlbnQtcmluZzogICAjeyRhY2NlbnR9O1xuICAtLWFjY2VudC1nbG93OiAgICN7Y29sb3IuY2hhbmdlKCRhY2NlbnQsICRhbHBoYTogMC4zKX07XG4gIC0tYWNjZW50LWxpZ2h0OiAgI3tjb2xvci5zY2FsZSgkYWNjZW50LCAkbGlnaHRuZXNzOiA0NSUsICRzYXR1cmF0aW9uOiAtMjAlKX07XG5cbiAgLy8gUHJpbWFyeSBzY2FsZSAobWFudGVudXRhIHBlciByZXRyb2NvbXBhdGliaWxpdMOgIGNvbiBCdXR0b24sIEJhZGdlLCBJbnB1dClcbiAgLS1jb2xvci1wcmltYXJ5LTUwOiAgI3tjb2xvci5zY2FsZSgkYWNjZW50LCAkbGlnaHRuZXNzOiA0OSUsICRzYXR1cmF0aW9uOiAtMzAlKX07XG4gIC0tY29sb3ItcHJpbWFyeS0xMDA6ICN7Y29sb3Iuc2NhbGUoJGFjY2VudCwgJGxpZ2h0bmVzczogNDIlLCAkc2F0dXJhdGlvbjogLTE1JSl9O1xuICAtLWNvbG9yLXByaW1hcnktNDAwOiAje2NvbG9yLnNjYWxlKCRhY2NlbnQsICRsaWdodG5lc3M6IDEyJSl9O1xuICAtLWNvbG9yLXByaW1hcnktNTAwOiAjeyRhY2NlbnR9O1xuICAtLWNvbG9yLXByaW1hcnktNjAwOiAje2NvbG9yLnNjYWxlKCRhY2NlbnQsICRsaWdodG5lc3M6IC0xMCUpfTtcbiAgLS1jb2xvci1wcmltYXJ5LTcwMDogI3tjb2xvci5zY2FsZSgkYWNjZW50LCAkbGlnaHRuZXNzOiAtMjAlKX07XG5cbiAgLy8gTmV1dHJhbFxuICAtLWNvbG9yLW5ldXRyYWwtMDogICAjZmZmZmZmO1xuICAtLWNvbG9yLW5ldXRyYWwtMTAwOiAjZjNmNGY2O1xuICAtLWNvbG9yLW5ldXRyYWwtMjAwOiAjZTVlN2ViO1xuICAtLWNvbG9yLW5ldXRyYWwtNDAwOiAjOWNhM2FmO1xuICAtLWNvbG9yLW5ldXRyYWwtNjAwOiAjNGI1NTYzO1xuICAtLWNvbG9yLW5ldXRyYWwtOTAwOiAjMTExODI3O1xuXG4gIC8vIFNlbWFudGljXG4gIC0tY29sb3Itc3VjY2Vzcy01MDA6ICMyMmM1NWU7XG4gIC0tY29sb3Itc3VjY2Vzcy02MDA6ICMxNmEzNGE7XG4gIC0tY29sb3ItZGFuZ2VyLTUwMDogICNlZjQ0NDQ7XG4gIC0tY29sb3ItZGFuZ2VyLTYwMDogICNkYzI2MjY7XG4gIC0tY29sb3Itd2FybmluZy01MDA6ICNmNTllMGI7XG4gIC0tY29sb3Itd2FybmluZy02MDA6ICNkOTc3MDY7XG5cbiAgLy8gVHlwb2dyYXBoeVxuICAtLWZvbnQtZmFtaWx5LWJhc2U6IFwiSW50ZXJcIiwgc3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBzYW5zLXNlcmlmO1xuICAtLWZvbnQtc2l6ZS14czogMC43NXJlbTtcbiAgLS1mb250LXNpemUtc206IDAuODc1cmVtO1xuICAtLWZvbnQtc2l6ZS1tZDogMXJlbTtcbiAgLS1mb250LXNpemUtbGc6IDEuMTI1cmVtO1xuXG4gIC8vIFNwYWNpbmdcbiAgLS1zcGFjaW5nLTE6IDAuMjVyZW07XG4gIC0tc3BhY2luZy0yOiAwLjVyZW07XG4gIC0tc3BhY2luZy0zOiAwLjc1cmVtO1xuICAtLXNwYWNpbmctNDogMXJlbTtcblxuICAvLyBSYWRpdXNcbiAgLS1yYWRpdXMtc206ICAgMC4yNXJlbTtcbiAgLS1yYWRpdXMtbWQ6ICAgMC4zNzVyZW07XG4gIC0tcmFkaXVzLWxnOiAgIDAuNXJlbTtcbiAgLS1yYWRpdXMtZnVsbDogOTk5OXB4O1xuXG4gIC8vIFNoYWRvd3NcbiAgLS1zaGFkb3ctc206IDAgMXB4IDJweCAwIHJnYigwIDAgMCAvIDAuMDUpO1xuICAtLXNoYWRvdy1tZDogMCA0cHggNnB4IC0xcHggcmdiKDAgMCAwIC8gMC4xKSwgMCAycHggNHB4IC0ycHggcmdiKDAgMCAwIC8gMC4xKTtcblxuICAvLyBUcmFuc2l0aW9uc1xuICAtLXRyYW5zaXRpb24tZmFzdDogMTUwbXMgZWFzZTtcblxuICAvLyBTdXJmYWNlIChiYWNrZ3JvdW5kIGRpIGNhcmQvcGFuZWwpXG4gIC0tY29sb3Itc3VyZmFjZTogICAgICAgICAgI2ZmZmZmZjtcbiAgLS1jb2xvci1zdXJmYWNlLWVsZXZhdGVkOiAjZmZmZmZmO1xufVxuXG4vLyDilIDilIDilIAgRGFyayB0aGVtZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIEFwcGxpY2F0byB2aWEgZGF0YS10aGVtZT1cImRhcmtcIiBzdWxsJ2VsZW1lbnRvIHJvb3QgKGdlc3RpdG8gZGEgU3Rvcnlib29rIGRlY29yYXRvclxuLy8gZSBkYWxsJ2FwcCBjb25zdW1lcikuIEkgY29tcG9uZW50aSBub24gZGV2b25vIGZhcmUgbnVsbGEgZGkgc3BlY2lhbGU6IGJhc3RhIGNoZVxuLy8gdXNpbm8gaSB0b2tlbiB2YXIoKSBlIHJpY2V2ZXJhbm5vIGF1dG9tYXRpY2FtZW50ZSBpIHZhbG9yaSBkYXJrLlxuXG5bZGF0YS10aGVtZT1cImRhcmtcIl0ge1xuICAvLyBOZXV0cmFsIChzY2FsYSBpbnZlcnRpdGEpXG4gIC0tY29sb3ItbmV1dHJhbC0wOiAgICMwZjE3MmE7XG4gIC0tY29sb3ItbmV1dHJhbC0xMDA6ICMxZTI5M2I7XG4gIC0tY29sb3ItbmV1dHJhbC0yMDA6ICMzMzQxNTU7XG4gIC0tY29sb3ItbmV1dHJhbC00MDA6ICM5NGEzYjg7XG4gIC0tY29sb3ItbmV1dHJhbC02MDA6ICNjYmQ1ZTE7XG4gIC0tY29sb3ItbmV1dHJhbC05MDA6ICNmOGZhZmM7XG5cbiAgLy8gU3VyZmFjZVxuICAtLWNvbG9yLXN1cmZhY2U6ICAgICAgICAgICMxZTI5M2I7XG4gIC0tY29sb3Itc3VyZmFjZS1lbGV2YXRlZDogIzI3MzU0OTtcblxuICAvLyBQcmltYXJ5IHNjYWxlIGRhcmsgKHBlciBpbCBkZWZhdWx0IGFjY2VudCBibHUg4oCUIGxlIHNmdW1hdHVyZSBjaGlhcmUgZGl2ZW50YW5vIHNjdXJlKVxuICAtLWNvbG9yLXByaW1hcnktNTA6ICAjMTcyNTU0O1xuICAtLWNvbG9yLXByaW1hcnktMTAwOiAjMWUzYThhO1xuICAvLyA0MDAgLyA1MDAgLyA2MDAgLyA3MDAgcmltYW5nb25vIGludmFyaWF0aSAoYWJiYXN0YW56YSBzYXR1cmkgc3UgYmcgc2N1cm8pXG5cbiAgLy8gQWNjZW50IGxpZ2h0OiB2YXJpYW50ZSBzY3VyYVxuICAtLWFjY2VudC1saWdodDogIzE3MjU1NDtcblxuICAvLyBTaGFkb3dzIChwacO5IGZvcnRpIHN1IGJnIHNjdXJvKVxuICAtLXNoYWRvdy1zbTogMCAxcHggMnB4IDAgcmdiKDAgMCAwIC8gMC40KTtcbiAgLS1zaGFkb3ctbWQ6IDAgNHB4IDZweCAtMXB4IHJnYigwIDAgMCAvIDAuNSksIDAgMnB4IDRweCAtMnB4IHJnYigwIDAgMCAvIDAuNCk7XG59XG4iLCJAdXNlIFwiLi4vLi4vc3R5bGVzL3Rva2Vuc1wiIGFzICo7XG5cbiRhY2NlbnQtdHJhY2s6IHZhcigtLXNsaWRlci1hY2NlbnQtdHJhY2ssIHZhcigtLWFjY2VudC10cmFjaykpO1xuJGFjY2VudC1yaW5nOiAgdmFyKC0tc2xpZGVyLWFjY2VudC1yaW5nLCAgdmFyKC0tYWNjZW50LXJpbmcpKTtcbiRhY2NlbnQtZ2xvdzogIHZhcigtLXNsaWRlci1hY2NlbnQtZ2xvdywgIHZhcigtLWFjY2VudC1nbG93KSk7XG5cbiRncm9vdmUtaGVpZ2h0OiAyMnB4O1xuJHJhaWwtaGVpZ2h0OiAgICA2cHg7XG4kdGh1bWItc2l6ZTogICAgMThweDtcbiRoaXQtem9uZTogICAgICAzNnB4O1xuXG4ud3JhcHBlciB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGdhcDogMTBweDtcbiAgZm9udC1mYW1pbHk6IHZhcigtLWZvbnQtZmFtaWx5LWJhc2UpO1xuICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTtcbn1cblxuLmRpc2FibGVkIHtcbiAgb3BhY2l0eTogMC40NTtcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG59XG5cbi5pY29uIHtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIGNvbG9yOiB2YXIoLS1jb2xvci1uZXV0cmFsLTQwMCk7XG4gIGZsZXgtc2hyaW5rOiAwO1xuICBsaW5lLWhlaWdodDogMDtcbn1cblxuLy8g4pSA4pSAIEhpdCB6b25lIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLnRyYWNrQXJlYSB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgZmxleDogMTtcbiAgaGVpZ2h0OiAkaGl0LXpvbmU7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGN1cnNvcjogcG9pbnRlcjtcbn1cblxuLy8g4pSA4pSAIEdyb292ZSDigJQgdGhlIGNhcnZlZCBjaGFubmVsLCA+PSB0aHVtYiBzaXplIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLmdyb292ZSB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogJGdyb292ZS1oZWlnaHQ7XG4gIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1mdWxsKTtcbiAgYmFja2dyb3VuZDogdmFyKC0tY29sb3ItbmV1dHJhbC0zMDApO1xuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAvLyBwdXJlbHkgaW5zZXQ6IG5vIG91dGVyIHNoYWRvd1xuICBib3gtc2hhZG93OlxuICAgIGluc2V0IDAgNHB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMTQpLFxuICAgIGluc2V0IDAgMnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMDYpLFxuICAgIGluc2V0IDAgLTJweCAzcHggcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEwKTtcbn1cblxuLy8g4pSA4pSAIFJhaWwg4oCUIHRoaW4gbGluZSBpbnNpZGUgdGhlIGdyb292ZSB3aGVyZSBmaWxsIHJ1bnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4ucmFpbCB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgbGVmdDogOHB4O1xuICByaWdodDogOHB4O1xuICBoZWlnaHQ6ICRyYWlsLWhlaWdodDtcbiAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLWZ1bGwpO1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1jb2xvci1uZXV0cmFsLTQwMCk7XG4gIGJveC1zaGFkb3c6XG4gICAgaW5zZXQgMCAxcHggM3B4IHJnYmEoMCwgMCwgMCwgMC4zMCksXG4gICAgaW5zZXQgMCAxcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xOCk7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG5cbi8vIOKUgOKUgCBGaWxsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLmZpbGwge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogMDtcbiAgbGVmdDogMDtcbiAgaGVpZ2h0OiAxMDAlO1xuICBiYWNrZ3JvdW5kOiAkYWNjZW50LXRyYWNrO1xuICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtZnVsbCk7XG4gIHRyYW5zaXRpb246IHdpZHRoIDYwbXMgbGluZWFyO1xufVxuXG4vLyDilIDilIAgVGh1bWIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4udGh1bWIge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogNTAlO1xuICB3aWR0aDogJHRodW1iLXNpemU7XG4gIGhlaWdodDogJHRodW1iLXNpemU7XG4gIGJvcmRlci1yYWRpdXM6IDUwJTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XG4gIGJhY2tncm91bmQ6ICNkZGUwZTY7XG4gIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMCwgMCwgMCwgMC4xMCk7XG4gIGJveC1zaGFkb3c6IDAgMXB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMjIpO1xuICBjdXJzb3I6IGdyYWI7XG4gIHRyYW5zaXRpb246IGJveC1zaGFkb3cgMTIwbXMgZWFzZSwgdHJhbnNmb3JtIDEyMG1zIGVhc2U7XG4gIG91dGxpbmU6IG5vbmU7XG4gIHotaW5kZXg6IDI7XG59XG5cbi50aHVtYjpmb2N1cy12aXNpYmxlIHtcbiAgYm94LXNoYWRvdzpcbiAgICAwIDFweCAzcHggcmdiYSgwLCAwLCAwLCAwLjIyKSxcbiAgICAwIDAgMCAzcHggJGFjY2VudC1yaW5nO1xufVxuXG4udGh1bWJEcmFnZ2luZyB7XG4gIGN1cnNvcjogZ3JhYmJpbmc7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpIHNjYWxlKDEuMDgpO1xuICBib3gtc2hhZG93OlxuICAgIDAgMXB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMjgpLFxuICAgIDAgMCAwIDNweCAkYWNjZW50LXJpbmcsXG4gICAgMCAwIDAgNnB4ICRhY2NlbnQtZ2xvdztcbn1cblxuLy8g4pSA4pSAIFRvb2x0aXAg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4udG9vbHRpcCB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgYm90dG9tOiBjYWxjKDEwMCUgKyA2cHgpO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7XG4gIGJhY2tncm91bmQ6IHJnYmEoMTgsIDE4LCAyNiwgMC44NSk7XG4gIGJhY2tkcm9wLWZpbHRlcjogYmx1cig2cHgpO1xuICAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjogYmx1cig2cHgpO1xuICBjb2xvcjogI2ZmZjtcbiAgZm9udC1zaXplOiAxMXB4O1xuICBmb250LXdlaWdodDogNjAwO1xuICBsZXR0ZXItc3BhY2luZzogMC4wMmVtO1xuICBwYWRkaW5nOiAzcHggOHB4O1xuICBib3JkZXItcmFkaXVzOiA2cHg7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICBvcGFjaXR5OiAwO1xuICB0cmFuc2l0aW9uOiBvcGFjaXR5IDEyMG1zIGVhc2U7XG4gIHotaW5kZXg6IDEwO1xuXG4gICY6OmFmdGVyIHtcbiAgICBjb250ZW50OiBcIlwiO1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB0b3A6IDEwMCU7XG4gICAgbGVmdDogNTAlO1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTtcbiAgICBib3JkZXI6IDRweCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgICBib3JkZXItdG9wLWNvbG9yOiByZ2JhKDE4LCAxOCwgMjYsIDAuODUpO1xuICB9XG59XG5cbi50b29sdGlwVmlzaWJsZSB7XG4gIG9wYWNpdHk6IDE7XG59XG5cbi8vIOKUgOKUgCBEYXJrIG1vZGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5bZGF0YS10aGVtZT1cImRhcmtcIl0ge1xuICAuZ3Jvb3ZlIHtcbiAgICBib3gtc2hhZG93OlxuICAgICAgaW5zZXQgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDcpLFxuICAgICAgaW5zZXQgMCAzcHggN3B4IHJnYmEoMCwgMCwgMCwgMC4zMiksXG4gICAgICBpbnNldCAwIDFweCAzcHggcmdiYSgwLCAwLCAwLCAwLjIyKSxcbiAgICAgIGluc2V0IDAgLTJweCAzcHggcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0KTtcbiAgfVxuXG4gIC50aHVtYiB7XG4gICAgYmFja2dyb3VuZDogIzRhNGY1YztcbiAgICBib3JkZXItY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCk7XG4gICAgYm94LXNoYWRvdzogMCAxcHggM3B4IHJnYmEoMCwgMCwgMCwgMC40NSk7XG4gIH1cblxuICAudGh1bWJEcmFnZ2luZyB7XG4gICAgYm94LXNoYWRvdzpcbiAgICAgIDAgMXB4IDRweCByZ2JhKDAsIDAsIDAsIDAuNSksXG4gICAgICAwIDAgMCAzcHggJGFjY2VudC1yaW5nLFxuICAgICAgMCAwIDAgNnB4ICRhY2NlbnQtZ2xvdztcbiAgfVxufVxuIl19 */","export function hexToHsl(hex: string): [number, number, number] {\n const r = parseInt(hex.slice(1, 3), 16) / 255;\n const g = parseInt(hex.slice(3, 5), 16) / 255;\n const b = parseInt(hex.slice(5, 7), 16) / 255;\n\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const l = (max + min) / 2;\n let h = 0;\n let s = 0;\n\n if (max !== min) {\n const d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n switch (max) {\n case r: h = ((g - b) / d + (g < b ? 6 : 0)) / 6; break;\n case g: h = ((b - r) / d + 2) / 6; break;\n case b: h = ((r - g) / d + 4) / 6; break;\n }\n }\n\n return [h * 360, s * 100, l * 100];\n}\n\nexport function hslToHex(h: number, s: number, l: number): string {\n const sl = s / 100;\n const ll = l / 100;\n const a = sl * Math.min(ll, 1 - ll);\n const f = (n: number) => {\n const k = (n + h / 30) % 12;\n const color = ll - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);\n return Math.round(255 * color).toString(16).padStart(2, \"0\");\n };\n return `#${f(0)}${f(8)}${f(4)}`;\n}\n\nexport function hslToRgb(h: number, s: number, l: number): { r: number; g: number; b: number } {\n const sl = s / 100;\n const ll = l / 100;\n const a = sl * Math.min(ll, 1 - ll);\n const f = (n: number) => {\n const k = (n + h / 30) % 12;\n return Math.round(255 * (ll - a * Math.max(Math.min(k - 3, 9 - k, 1), -1)));\n };\n return { r: f(0), g: f(8), b: f(4) };\n}\n\nexport function rgbToHsl(r: number, g: number, b: number): [number, number, number] {\n const rr = r / 255, gg = g / 255, bb = b / 255;\n const max = Math.max(rr, gg, bb);\n const min = Math.min(rr, gg, bb);\n const l = (max + min) / 2;\n let h = 0, s = 0;\n if (max !== min) {\n const d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n switch (max) {\n case rr: h = ((gg - bb) / d + (gg < bb ? 6 : 0)) / 6; break;\n case gg: h = ((bb - rr) / d + 2) / 6; break;\n case bb: h = ((rr - gg) / d + 4) / 6; break;\n }\n }\n return [h * 360, s * 100, l * 100];\n}\n\nfunction hslToRgba(h: number, s: number, l: number, alpha: number): string {\n const { r, g, b } = hslToRgb(h, s, l);\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n}\n\nexport interface AccentTokens {\n base: string;\n dot: string;\n track: string;\n ring: string;\n glow: string;\n light: string;\n}\n\nexport interface ColorValue {\n hex: string;\n hexa: string;\n hsl: string;\n hsla: string;\n rgb: string;\n rgba: string;\n h: number;\n s: number;\n l: number;\n a: number;\n}\n\nexport function buildColorValue(h: number, s: number, l: number, a: number): ColorValue {\n const { r, g, b } = hslToRgb(h, s, l);\n const hex = hslToHex(h, s, l);\n const alphaHex = Math.round(a * 255).toString(16).padStart(2, \"0\");\n const hR = Math.round(h), sR = Math.round(s), lR = Math.round(l);\n const aR = Math.round(a * 100) / 100;\n return {\n hex,\n hexa: `${hex}${alphaHex}`,\n hsl: `hsl(${hR}, ${sR}%, ${lR}%)`,\n hsla: `hsla(${hR}, ${sR}%, ${lR}%, ${aR})`,\n rgb: `rgb(${r}, ${g}, ${b})`,\n rgba: `rgba(${r}, ${g}, ${b}, ${aR})`,\n h, s, l, a,\n };\n}\n\nexport function deriveAccent(hex: string): AccentTokens {\n const [h, s, l] = hexToHsl(hex);\n return {\n base: hex,\n dot: hslToHex(h, s, Math.min(l + 12, 95)),\n track: hex,\n ring: hex,\n glow: hslToRgba(h, s, l, 0.3),\n light: hslToHex(h, Math.max(s - 20, 0), Math.min(l + 45, 96)),\n };\n}\n\nexport function accentToCssVars(\n tokens: AccentTokens,\n prefix: string\n): Record<string, string> {\n return {\n [`--${prefix}-accent`]: tokens.base,\n [`--${prefix}-accent-dot`]: tokens.dot,\n [`--${prefix}-accent-track`]: tokens.track,\n [`--${prefix}-accent-ring`]: tokens.ring,\n [`--${prefix}-accent-glow`]: tokens.glow,\n [`--${prefix}-accent-light`]: tokens.light,\n };\n}\n","import React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport styles from \"./SliderControl.module.scss\";\nimport { deriveAccent, accentToCssVars } from \"../../utils/color\";\n\nexport const VolumeDownIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M2 6h2l3-3v10L4 10H2a1 1 0 0 1-1-1V7a1 1 0 0 1 1-1Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M10 5.5a3 3 0 0 1 0 5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n);\n\nexport const VolumeUpIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M2 6h2l3-3v10L4 10H2a1 1 0 0 1-1-1V7a1 1 0 0 1 1-1Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M10 5.5a3 3 0 0 1 0 5M12 3.5a6 6 0 0 1 0 9\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n);\n\nexport interface SliderControlProps {\n value?: number;\n defaultValue?: number;\n min?: number;\n max?: number;\n step?: number;\n onChange?: (value: number) => void;\n showTooltip?: \"always\" | \"drag\" | \"never\";\n leftIcon?: React.ReactNode;\n rightIcon?: React.ReactNode;\n /** CSS background value applied to the rail — replaces the fill with a full-width gradient */\n railBackground?: string;\n accent?: string;\n className?: string;\n disabled?: boolean;\n}\n\nfunction clamp(v: number, min: number, max: number) {\n return Math.min(Math.max(v, min), max);\n}\n\nfunction snapToStep(v: number, min: number, step: number) {\n return Math.round((v - min) / step) * step + min;\n}\n\nexport const SliderControl: React.FC<SliderControlProps> = ({\n value: controlledValue,\n defaultValue = 50,\n min = 0,\n max = 100,\n step = 1,\n onChange,\n showTooltip = \"drag\",\n leftIcon,\n rightIcon,\n railBackground,\n accent,\n className,\n disabled = false,\n}) => {\n const isControlled = controlledValue !== undefined;\n const [internalValue, setInternalValue] = useState(defaultValue);\n const [isDragging, setIsDragging] = useState(false);\n const [isFocused, setIsFocused] = useState(false);\n const trackRef = useRef<HTMLDivElement>(null);\n const thumbRef = useRef<HTMLDivElement>(null);\n\n const value = isControlled ? controlledValue! : internalValue;\n const pct = (clamp(value, min, max) - min) / (max - min);\n\n const accentVars = accent\n ? accentToCssVars(deriveAccent(accent), \"slider\")\n : {};\n\n const setValue = useCallback(\n (next: number) => {\n const snapped = clamp(snapToStep(next, min, step), min, max);\n if (!isControlled) setInternalValue(snapped);\n onChange?.(snapped);\n },\n [isControlled, min, max, step, onChange]\n );\n\n const valueFromPointer = useCallback(\n (e: PointerEvent) => {\n const rect = trackRef.current!.getBoundingClientRect();\n const ratio = clamp((e.clientX - rect.left) / rect.width, 0, 1);\n return min + ratio * (max - min);\n },\n [min, max]\n );\n\n const handlePointerDown = useCallback(\n (e: React.PointerEvent<HTMLDivElement>) => {\n if (disabled) return;\n e.currentTarget.setPointerCapture(e.pointerId);\n setIsDragging(true);\n thumbRef.current?.focus();\n setValue(valueFromPointer(e.nativeEvent));\n },\n [disabled, setValue, valueFromPointer]\n );\n\n const handlePointerMove = useCallback(\n (e: React.PointerEvent<HTMLDivElement>) => {\n if (!isDragging || disabled) return;\n setValue(valueFromPointer(e.nativeEvent));\n },\n [isDragging, disabled, setValue, valueFromPointer]\n );\n\n const handlePointerUp = useCallback(() => {\n setIsDragging(false);\n thumbRef.current?.blur();\n }, []);\n\n useEffect(() => {\n const el = trackRef.current;\n if (!el) return;\n const onWheel = (e: WheelEvent) => {\n if (disabled) return;\n e.preventDefault();\n setValue(value + (e.deltaY < 0 ? step : -step));\n };\n el.addEventListener(\"wheel\", onWheel, { passive: false });\n return () => el.removeEventListener(\"wheel\", onWheel);\n }, [disabled, value, step, setValue]);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (disabled) return;\n const map: Record<string, number> = {\n ArrowRight: step,\n ArrowUp: step,\n ArrowLeft: -step,\n ArrowDown: -step,\n PageUp: step * 10,\n PageDown: -step * 10,\n };\n if (e.key === \"Home\") { setValue(min); e.preventDefault(); return; }\n if (e.key === \"End\") { setValue(max); e.preventDefault(); return; }\n if (map[e.key] !== undefined) {\n setValue(value + map[e.key]);\n e.preventDefault();\n }\n },\n [disabled, step, min, max, value, setValue]\n );\n\n const tooltipVisible =\n showTooltip === \"always\" ||\n (showTooltip === \"drag\" && (isDragging || isFocused));\n\n const displayValue = `${Math.round(value)}%`;\n\n // Clamp tooltip so it doesn't overflow the track edges\n const tooltipOffset = `calc(${pct * 100}% + ${(0.5 - pct) * 20}px)`;\n\n return (\n <div\n className={[styles.wrapper, disabled ? styles.disabled : \"\", className ?? \"\"].filter(Boolean).join(\" \")}\n style={accentVars as React.CSSProperties}\n >\n {leftIcon !== null && leftIcon !== undefined && (\n <span className={styles.icon}>{leftIcon}</span>\n )}\n\n <div\n ref={trackRef}\n className={styles.trackArea}\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerUp}\n onPointerCancel={handlePointerUp}\n >\n <div className={styles.groove}>\n <div\n className={styles.rail}\n style={railBackground ? { background: railBackground } : undefined}\n >\n {!railBackground && (\n <div className={styles.fill} style={{ width: `${pct * 100}%` }} />\n )}\n </div>\n </div>\n\n <div\n ref={thumbRef}\n role=\"slider\"\n tabIndex={disabled ? -1 : 0}\n aria-valuenow={Math.round(value)}\n aria-valuemin={min}\n aria-valuemax={max}\n aria-disabled={disabled}\n className={[styles.thumb, isDragging ? styles.thumbDragging : \"\"].filter(Boolean).join(\" \")}\n style={{ left: `calc(${pct * 100}% + ${(0.5 - pct) * 24}px)` }}\n onKeyDown={handleKeyDown}\n onFocus={() => setIsFocused(true)}\n onBlur={() => setIsFocused(false)}\n />\n\n <div\n className={[styles.tooltip, tooltipVisible ? styles.tooltipVisible : \"\"].filter(Boolean).join(\" \")}\n style={{ left: tooltipOffset }}\n aria-hidden=\"true\"\n >\n {displayValue}\n </div>\n </div>\n\n {rightIcon !== null && rightIcon !== undefined && (\n <span className={styles.icon}>{rightIcon}</span>\n )}\n </div>\n );\n};\n\nSliderControl.displayName = \"SliderControl\";\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/components/SliderControl/SliderControl.module.scss","../../../src/utils/color.ts","../../../src/components/SliderControl/SliderControl.tsx"],"names":["wrapper","disabled","icon","trackArea","groove","rail","fill","thumb","thumbDragging","tooltip","tooltipVisible","useState","useRef","useCallback","useEffect","jsxs","jsx"],"mappings":"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","file":"index.cjs","sourcesContent":["@import url(\"https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&display=swap\");\n:root {\n --accent: #3b82f6;\n --accent-dot: rgb(82.52, 145, 247.08);\n --accent-track: #3b82f6;\n --accent-ring: #3b82f6;\n --accent-glow: rgba(59, 130, 246, 0.3);\n --accent-light: rgb(157.485, 188.725, 239.765);\n --color-primary-50: rgb(169.3455, 194.6925, 236.1045);\n --color-primary-100: rgb(149.4545, 184.4575, 241.6455);\n --color-primary-400: rgb(82.52, 145, 247.08);\n --color-primary-500: #3b82f6;\n --color-primary-600: rgb(29.8390243902, 111.4024390244, 244.6609756098);\n --color-primary-700: rgb(10.712195122, 95.2195121951, 233.287804878);\n --color-neutral-0: #ffffff;\n --color-neutral-100: #f3f4f6;\n --color-neutral-200: #e5e7eb;\n --color-neutral-400: #9ca3af;\n --color-neutral-600: #4b5563;\n --color-neutral-900: #111827;\n --color-success-500: #22c55e;\n --color-success-600: #16a34a;\n --color-danger-500: #ef4444;\n --color-danger-600: #dc2626;\n --color-warning-500: #f59e0b;\n --color-warning-600: #d97706;\n --font-family-base: \"Inter\", system-ui, -apple-system, sans-serif;\n --font-size-xs: 0.75rem;\n --font-size-sm: 0.875rem;\n --font-size-md: 1rem;\n --font-size-lg: 1.125rem;\n --spacing-1: 0.25rem;\n --spacing-2: 0.5rem;\n --spacing-3: 0.75rem;\n --spacing-4: 1rem;\n --radius-sm: 0.25rem;\n --radius-md: 0.375rem;\n --radius-lg: 0.5rem;\n --radius-full: 9999px;\n --shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.05);\n --shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);\n --transition-fast: 150ms ease;\n --color-surface: #ffffff;\n --color-surface-elevated: #ffffff;\n}\n\n[data-theme=dark] {\n --color-neutral-0: #0f172a;\n --color-neutral-100: #1e293b;\n --color-neutral-200: #334155;\n --color-neutral-400: #94a3b8;\n --color-neutral-600: #cbd5e1;\n --color-neutral-900: #f8fafc;\n --color-surface: #1e293b;\n --color-surface-elevated: #273549;\n --color-primary-50: #172554;\n --color-primary-100: #1e3a8a;\n --accent-light: #172554;\n --shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.4);\n --shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.5), 0 2px 4px -2px rgb(0 0 0 / 0.4);\n}\n\n.wrapper {\n display: flex;\n align-items: center;\n gap: 10px;\n font-family: var(--font-family-base);\n user-select: none;\n -webkit-user-select: none;\n}\n\n.disabled {\n opacity: 0.45;\n pointer-events: none;\n}\n\n.icon {\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--color-neutral-400);\n flex-shrink: 0;\n line-height: 0;\n}\n\n.trackArea {\n position: relative;\n flex: 1;\n height: 36px;\n display: flex;\n align-items: center;\n cursor: pointer;\n}\n\n.groove {\n position: relative;\n width: 100%;\n height: 22px;\n border-radius: var(--radius-full);\n background: var(--color-neutral-300);\n display: flex;\n align-items: center;\n box-shadow: inset 0 4px 8px rgba(0, 0, 0, 0.14), inset 0 2px 4px rgba(0, 0, 0, 0.06), inset 0 -2px 3px rgba(255, 255, 255, 0.1);\n}\n\n.rail {\n position: absolute;\n left: 8px;\n right: 8px;\n height: 6px;\n border-radius: var(--radius-full);\n background: var(--color-neutral-400);\n box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.3), inset 0 1px 1px rgba(0, 0, 0, 0.18);\n overflow: hidden;\n}\n\n.fill {\n position: absolute;\n top: 0;\n left: 0;\n height: 100%;\n background: var(--slider-accent-track, var(--accent-track));\n border-radius: var(--radius-full);\n transition: width 60ms linear;\n}\n\n.thumb {\n position: absolute;\n top: 50%;\n width: 18px;\n height: 18px;\n border-radius: 50%;\n transform: translate(-50%, -50%);\n background: #dde0e6;\n border: 1px solid rgba(0, 0, 0, 0.1);\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.22);\n cursor: grab;\n transition: box-shadow 120ms ease, transform 120ms ease;\n outline: none;\n z-index: 2;\n}\n\n.thumb:focus-visible {\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.22), 0 0 0 3px var(--slider-accent-ring, var(--accent-ring));\n}\n\n.thumbDragging {\n cursor: grabbing;\n transform: translate(-50%, -50%) scale(1.08);\n box-shadow: 0 1px 4px rgba(0, 0, 0, 0.28), 0 0 0 3px var(--slider-accent-ring, var(--accent-ring)), 0 0 0 6px var(--slider-accent-glow, var(--accent-glow));\n}\n\n.tooltip {\n position: absolute;\n bottom: calc(100% + 6px);\n transform: translateX(-50%);\n background: rgba(18, 18, 26, 0.85);\n backdrop-filter: blur(6px);\n -webkit-backdrop-filter: blur(6px);\n color: #fff;\n font-size: 11px;\n font-weight: 600;\n letter-spacing: 0.02em;\n padding: 3px 8px;\n border-radius: 6px;\n white-space: nowrap;\n pointer-events: none;\n opacity: 0;\n transition: opacity 120ms ease;\n z-index: 10;\n}\n.tooltip::after {\n content: \"\";\n position: absolute;\n top: 100%;\n left: 50%;\n transform: translateX(-50%);\n border: 4px solid transparent;\n border-top-color: rgba(18, 18, 26, 0.85);\n}\n\n.tooltipVisible {\n opacity: 1;\n}\n\n[data-theme=dark] .groove {\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.07), inset 0 3px 7px rgba(0, 0, 0, 0.32), inset 0 1px 3px rgba(0, 0, 0, 0.22), inset 0 -2px 3px rgba(255, 255, 255, 0.04);\n}\n[data-theme=dark] .thumb {\n background: #4a4f5c;\n border-color: rgba(255, 255, 255, 0.08);\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.45);\n}\n[data-theme=dark] .thumbDragging {\n box-shadow: 0 1px 4px rgba(0, 0, 0, 0.5), 0 0 0 3px var(--slider-accent-ring, var(--accent-ring)), 0 0 0 6px var(--slider-accent-glow, var(--accent-glow));\n}\n/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3N0eWxlcy90b2tlbnMuc2NzcyIsIlNsaWRlckNvbnRyb2wubW9kdWxlLnNjc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRVE7QUFLUjtFQUVFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUdBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUdBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUdBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUdBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFHQTtFQUNBO0VBQ0E7RUFDQTtFQUdBO0VBQ0E7RUFDQTtFQUNBO0VBR0E7RUFDQTtFQUdBO0VBR0E7RUFDQTs7O0FBUUY7RUFFRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFHQTtFQUNBO0VBR0E7RUFDQTtFQUlBO0VBR0E7RUFDQTs7O0FDeEZGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRjtFQUNFO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFJRjtFQUNFO0VBQ0E7RUFDQSxRQTdCYztFQThCZDtFQUNBO0VBQ0E7OztBQUlGO0VBQ0U7RUFDQTtFQUNBLFFBMUNjO0VBMkNkO0VBQ0E7RUFDQTtFQUNBO0VBRUEsWUFDRTs7O0FBTUo7RUFDRTtFQUNBO0VBQ0E7RUFDQSxRQTFEZTtFQTJEZjtFQUNBO0VBQ0EsWUFDRTtFQUVGOzs7QUFJRjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0EsWUE5RWE7RUErRWI7RUFDQTs7O0FBSUY7RUFDRTtFQUNBO0VBQ0EsT0FqRmM7RUFrRmQsUUFsRmM7RUFtRmQ7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRjtFQUNFLFlBQ0U7OztBQUlKO0VBQ0U7RUFDQTtFQUNBLFlBQ0U7OztBQU1KO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7QUFFQTtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFJSjtFQUNFOzs7QUFLQTtFQUNFLFlBQ0U7O0FBTUo7RUFDRTtFQUNBO0VBQ0E7O0FBR0Y7RUFDRSxZQUNFIiwic291cmNlc0NvbnRlbnQiOlsiQHVzZSBcInNhc3M6Y29sb3JcIjtcblxuQGltcG9ydCB1cmwoXCJodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2NzczI/ZmFtaWx5PUludGVyOndnaHRANDAwOzUwMDs2MDAmZGlzcGxheT1zd2FwXCIpO1xuXG4vLyBBY2NlbnQgZGkgZGVmYXVsdCDigJQgY2FtYmlhIHF1aSBwZXIgYWdnaW9ybmFyZSB0dXR0YSBsYSBsaWJyZXJpYVxuJGFjY2VudDogIzNiODJmNjtcblxuOnJvb3Qge1xuICAvLyBBY2NlbnQgc2NhbGUg4oCUIGRlcml2YXRhIGRhICRhY2NlbnQgYSBjb21waWxlIHRpbWVcbiAgLS1hY2NlbnQ6ICAgICAgICAjeyRhY2NlbnR9O1xuICAtLWFjY2VudC1kb3Q6ICAgICN7Y29sb3Iuc2NhbGUoJGFjY2VudCwgJGxpZ2h0bmVzczogMTIlKX07XG4gIC0tYWNjZW50LXRyYWNrOiAgI3skYWNjZW50fTtcbiAgLS1hY2NlbnQtcmluZzogICAjeyRhY2NlbnR9O1xuICAtLWFjY2VudC1nbG93OiAgICN7Y29sb3IuY2hhbmdlKCRhY2NlbnQsICRhbHBoYTogMC4zKX07XG4gIC0tYWNjZW50LWxpZ2h0OiAgI3tjb2xvci5zY2FsZSgkYWNjZW50LCAkbGlnaHRuZXNzOiA0NSUsICRzYXR1cmF0aW9uOiAtMjAlKX07XG5cbiAgLy8gUHJpbWFyeSBzY2FsZSAobWFudGVudXRhIHBlciByZXRyb2NvbXBhdGliaWxpdMOgIGNvbiBCdXR0b24sIEJhZGdlLCBJbnB1dClcbiAgLS1jb2xvci1wcmltYXJ5LTUwOiAgI3tjb2xvci5zY2FsZSgkYWNjZW50LCAkbGlnaHRuZXNzOiA0OSUsICRzYXR1cmF0aW9uOiAtMzAlKX07XG4gIC0tY29sb3ItcHJpbWFyeS0xMDA6ICN7Y29sb3Iuc2NhbGUoJGFjY2VudCwgJGxpZ2h0bmVzczogNDIlLCAkc2F0dXJhdGlvbjogLTE1JSl9O1xuICAtLWNvbG9yLXByaW1hcnktNDAwOiAje2NvbG9yLnNjYWxlKCRhY2NlbnQsICRsaWdodG5lc3M6IDEyJSl9O1xuICAtLWNvbG9yLXByaW1hcnktNTAwOiAjeyRhY2NlbnR9O1xuICAtLWNvbG9yLXByaW1hcnktNjAwOiAje2NvbG9yLnNjYWxlKCRhY2NlbnQsICRsaWdodG5lc3M6IC0xMCUpfTtcbiAgLS1jb2xvci1wcmltYXJ5LTcwMDogI3tjb2xvci5zY2FsZSgkYWNjZW50LCAkbGlnaHRuZXNzOiAtMjAlKX07XG5cbiAgLy8gTmV1dHJhbFxuICAtLWNvbG9yLW5ldXRyYWwtMDogICAjZmZmZmZmO1xuICAtLWNvbG9yLW5ldXRyYWwtMTAwOiAjZjNmNGY2O1xuICAtLWNvbG9yLW5ldXRyYWwtMjAwOiAjZTVlN2ViO1xuICAtLWNvbG9yLW5ldXRyYWwtNDAwOiAjOWNhM2FmO1xuICAtLWNvbG9yLW5ldXRyYWwtNjAwOiAjNGI1NTYzO1xuICAtLWNvbG9yLW5ldXRyYWwtOTAwOiAjMTExODI3O1xuXG4gIC8vIFNlbWFudGljXG4gIC0tY29sb3Itc3VjY2Vzcy01MDA6ICMyMmM1NWU7XG4gIC0tY29sb3Itc3VjY2Vzcy02MDA6ICMxNmEzNGE7XG4gIC0tY29sb3ItZGFuZ2VyLTUwMDogICNlZjQ0NDQ7XG4gIC0tY29sb3ItZGFuZ2VyLTYwMDogICNkYzI2MjY7XG4gIC0tY29sb3Itd2FybmluZy01MDA6ICNmNTllMGI7XG4gIC0tY29sb3Itd2FybmluZy02MDA6ICNkOTc3MDY7XG5cbiAgLy8gVHlwb2dyYXBoeVxuICAtLWZvbnQtZmFtaWx5LWJhc2U6IFwiSW50ZXJcIiwgc3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBzYW5zLXNlcmlmO1xuICAtLWZvbnQtc2l6ZS14czogMC43NXJlbTtcbiAgLS1mb250LXNpemUtc206IDAuODc1cmVtO1xuICAtLWZvbnQtc2l6ZS1tZDogMXJlbTtcbiAgLS1mb250LXNpemUtbGc6IDEuMTI1cmVtO1xuXG4gIC8vIFNwYWNpbmdcbiAgLS1zcGFjaW5nLTE6IDAuMjVyZW07XG4gIC0tc3BhY2luZy0yOiAwLjVyZW07XG4gIC0tc3BhY2luZy0zOiAwLjc1cmVtO1xuICAtLXNwYWNpbmctNDogMXJlbTtcblxuICAvLyBSYWRpdXNcbiAgLS1yYWRpdXMtc206ICAgMC4yNXJlbTtcbiAgLS1yYWRpdXMtbWQ6ICAgMC4zNzVyZW07XG4gIC0tcmFkaXVzLWxnOiAgIDAuNXJlbTtcbiAgLS1yYWRpdXMtZnVsbDogOTk5OXB4O1xuXG4gIC8vIFNoYWRvd3NcbiAgLS1zaGFkb3ctc206IDAgMXB4IDJweCAwIHJnYigwIDAgMCAvIDAuMDUpO1xuICAtLXNoYWRvdy1tZDogMCA0cHggNnB4IC0xcHggcmdiKDAgMCAwIC8gMC4xKSwgMCAycHggNHB4IC0ycHggcmdiKDAgMCAwIC8gMC4xKTtcblxuICAvLyBUcmFuc2l0aW9uc1xuICAtLXRyYW5zaXRpb24tZmFzdDogMTUwbXMgZWFzZTtcblxuICAvLyBTdXJmYWNlIChiYWNrZ3JvdW5kIGRpIGNhcmQvcGFuZWwpXG4gIC0tY29sb3Itc3VyZmFjZTogICAgICAgICAgI2ZmZmZmZjtcbiAgLS1jb2xvci1zdXJmYWNlLWVsZXZhdGVkOiAjZmZmZmZmO1xufVxuXG4vLyDilIDilIDilIAgRGFyayB0aGVtZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIEFwcGxpY2F0byB2aWEgZGF0YS10aGVtZT1cImRhcmtcIiBzdWxsJ2VsZW1lbnRvIHJvb3QgKGdlc3RpdG8gZGEgU3Rvcnlib29rIGRlY29yYXRvclxuLy8gZSBkYWxsJ2FwcCBjb25zdW1lcikuIEkgY29tcG9uZW50aSBub24gZGV2b25vIGZhcmUgbnVsbGEgZGkgc3BlY2lhbGU6IGJhc3RhIGNoZVxuLy8gdXNpbm8gaSB0b2tlbiB2YXIoKSBlIHJpY2V2ZXJhbm5vIGF1dG9tYXRpY2FtZW50ZSBpIHZhbG9yaSBkYXJrLlxuXG5bZGF0YS10aGVtZT1cImRhcmtcIl0ge1xuICAvLyBOZXV0cmFsIChzY2FsYSBpbnZlcnRpdGEpXG4gIC0tY29sb3ItbmV1dHJhbC0wOiAgICMwZjE3MmE7XG4gIC0tY29sb3ItbmV1dHJhbC0xMDA6ICMxZTI5M2I7XG4gIC0tY29sb3ItbmV1dHJhbC0yMDA6ICMzMzQxNTU7XG4gIC0tY29sb3ItbmV1dHJhbC00MDA6ICM5NGEzYjg7XG4gIC0tY29sb3ItbmV1dHJhbC02MDA6ICNjYmQ1ZTE7XG4gIC0tY29sb3ItbmV1dHJhbC05MDA6ICNmOGZhZmM7XG5cbiAgLy8gU3VyZmFjZVxuICAtLWNvbG9yLXN1cmZhY2U6ICAgICAgICAgICMxZTI5M2I7XG4gIC0tY29sb3Itc3VyZmFjZS1lbGV2YXRlZDogIzI3MzU0OTtcblxuICAvLyBQcmltYXJ5IHNjYWxlIGRhcmsgKHBlciBpbCBkZWZhdWx0IGFjY2VudCBibHUg4oCUIGxlIHNmdW1hdHVyZSBjaGlhcmUgZGl2ZW50YW5vIHNjdXJlKVxuICAtLWNvbG9yLXByaW1hcnktNTA6ICAjMTcyNTU0O1xuICAtLWNvbG9yLXByaW1hcnktMTAwOiAjMWUzYThhO1xuICAvLyA0MDAgLyA1MDAgLyA2MDAgLyA3MDAgcmltYW5nb25vIGludmFyaWF0aSAoYWJiYXN0YW56YSBzYXR1cmkgc3UgYmcgc2N1cm8pXG5cbiAgLy8gQWNjZW50IGxpZ2h0OiB2YXJpYW50ZSBzY3VyYVxuICAtLWFjY2VudC1saWdodDogIzE3MjU1NDtcblxuICAvLyBTaGFkb3dzIChwacO5IGZvcnRpIHN1IGJnIHNjdXJvKVxuICAtLXNoYWRvdy1zbTogMCAxcHggMnB4IDAgcmdiKDAgMCAwIC8gMC40KTtcbiAgLS1zaGFkb3ctbWQ6IDAgNHB4IDZweCAtMXB4IHJnYigwIDAgMCAvIDAuNSksIDAgMnB4IDRweCAtMnB4IHJnYigwIDAgMCAvIDAuNCk7XG59XG4iLCJAdXNlIFwiLi4vLi4vc3R5bGVzL3Rva2Vuc1wiIGFzICo7XG5cbiRhY2NlbnQtdHJhY2s6IHZhcigtLXNsaWRlci1hY2NlbnQtdHJhY2ssIHZhcigtLWFjY2VudC10cmFjaykpO1xuJGFjY2VudC1yaW5nOiAgdmFyKC0tc2xpZGVyLWFjY2VudC1yaW5nLCAgdmFyKC0tYWNjZW50LXJpbmcpKTtcbiRhY2NlbnQtZ2xvdzogIHZhcigtLXNsaWRlci1hY2NlbnQtZ2xvdywgIHZhcigtLWFjY2VudC1nbG93KSk7XG5cbiRncm9vdmUtaGVpZ2h0OiAyMnB4O1xuJHJhaWwtaGVpZ2h0OiAgICA2cHg7XG4kdGh1bWItc2l6ZTogICAgMThweDtcbiRoaXQtem9uZTogICAgICAzNnB4O1xuXG4ud3JhcHBlciB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGdhcDogMTBweDtcbiAgZm9udC1mYW1pbHk6IHZhcigtLWZvbnQtZmFtaWx5LWJhc2UpO1xuICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTtcbn1cblxuLmRpc2FibGVkIHtcbiAgb3BhY2l0eTogMC40NTtcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG59XG5cbi5pY29uIHtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIGNvbG9yOiB2YXIoLS1jb2xvci1uZXV0cmFsLTQwMCk7XG4gIGZsZXgtc2hyaW5rOiAwO1xuICBsaW5lLWhlaWdodDogMDtcbn1cblxuLy8g4pSA4pSAIEhpdCB6b25lIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLnRyYWNrQXJlYSB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgZmxleDogMTtcbiAgaGVpZ2h0OiAkaGl0LXpvbmU7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGN1cnNvcjogcG9pbnRlcjtcbn1cblxuLy8g4pSA4pSAIEdyb292ZSDigJQgdGhlIGNhcnZlZCBjaGFubmVsLCA+PSB0aHVtYiBzaXplIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLmdyb292ZSB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogJGdyb292ZS1oZWlnaHQ7XG4gIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1mdWxsKTtcbiAgYmFja2dyb3VuZDogdmFyKC0tY29sb3ItbmV1dHJhbC0zMDApO1xuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAvLyBwdXJlbHkgaW5zZXQ6IG5vIG91dGVyIHNoYWRvd1xuICBib3gtc2hhZG93OlxuICAgIGluc2V0IDAgNHB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMTQpLFxuICAgIGluc2V0IDAgMnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMDYpLFxuICAgIGluc2V0IDAgLTJweCAzcHggcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEwKTtcbn1cblxuLy8g4pSA4pSAIFJhaWwg4oCUIHRoaW4gbGluZSBpbnNpZGUgdGhlIGdyb292ZSB3aGVyZSBmaWxsIHJ1bnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4ucmFpbCB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgbGVmdDogOHB4O1xuICByaWdodDogOHB4O1xuICBoZWlnaHQ6ICRyYWlsLWhlaWdodDtcbiAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLWZ1bGwpO1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1jb2xvci1uZXV0cmFsLTQwMCk7XG4gIGJveC1zaGFkb3c6XG4gICAgaW5zZXQgMCAxcHggM3B4IHJnYmEoMCwgMCwgMCwgMC4zMCksXG4gICAgaW5zZXQgMCAxcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xOCk7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG5cbi8vIOKUgOKUgCBGaWxsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLmZpbGwge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogMDtcbiAgbGVmdDogMDtcbiAgaGVpZ2h0OiAxMDAlO1xuICBiYWNrZ3JvdW5kOiAkYWNjZW50LXRyYWNrO1xuICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtZnVsbCk7XG4gIHRyYW5zaXRpb246IHdpZHRoIDYwbXMgbGluZWFyO1xufVxuXG4vLyDilIDilIAgVGh1bWIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4udGh1bWIge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogNTAlO1xuICB3aWR0aDogJHRodW1iLXNpemU7XG4gIGhlaWdodDogJHRodW1iLXNpemU7XG4gIGJvcmRlci1yYWRpdXM6IDUwJTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XG4gIGJhY2tncm91bmQ6ICNkZGUwZTY7XG4gIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMCwgMCwgMCwgMC4xMCk7XG4gIGJveC1zaGFkb3c6IDAgMXB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMjIpO1xuICBjdXJzb3I6IGdyYWI7XG4gIHRyYW5zaXRpb246IGJveC1zaGFkb3cgMTIwbXMgZWFzZSwgdHJhbnNmb3JtIDEyMG1zIGVhc2U7XG4gIG91dGxpbmU6IG5vbmU7XG4gIHotaW5kZXg6IDI7XG59XG5cbi50aHVtYjpmb2N1cy12aXNpYmxlIHtcbiAgYm94LXNoYWRvdzpcbiAgICAwIDFweCAzcHggcmdiYSgwLCAwLCAwLCAwLjIyKSxcbiAgICAwIDAgMCAzcHggJGFjY2VudC1yaW5nO1xufVxuXG4udGh1bWJEcmFnZ2luZyB7XG4gIGN1cnNvcjogZ3JhYmJpbmc7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpIHNjYWxlKDEuMDgpO1xuICBib3gtc2hhZG93OlxuICAgIDAgMXB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMjgpLFxuICAgIDAgMCAwIDNweCAkYWNjZW50LXJpbmcsXG4gICAgMCAwIDAgNnB4ICRhY2NlbnQtZ2xvdztcbn1cblxuLy8g4pSA4pSAIFRvb2x0aXAg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4udG9vbHRpcCB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgYm90dG9tOiBjYWxjKDEwMCUgKyA2cHgpO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7XG4gIGJhY2tncm91bmQ6IHJnYmEoMTgsIDE4LCAyNiwgMC44NSk7XG4gIGJhY2tkcm9wLWZpbHRlcjogYmx1cig2cHgpO1xuICAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjogYmx1cig2cHgpO1xuICBjb2xvcjogI2ZmZjtcbiAgZm9udC1zaXplOiAxMXB4O1xuICBmb250LXdlaWdodDogNjAwO1xuICBsZXR0ZXItc3BhY2luZzogMC4wMmVtO1xuICBwYWRkaW5nOiAzcHggOHB4O1xuICBib3JkZXItcmFkaXVzOiA2cHg7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICBvcGFjaXR5OiAwO1xuICB0cmFuc2l0aW9uOiBvcGFjaXR5IDEyMG1zIGVhc2U7XG4gIHotaW5kZXg6IDEwO1xuXG4gICY6OmFmdGVyIHtcbiAgICBjb250ZW50OiBcIlwiO1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB0b3A6IDEwMCU7XG4gICAgbGVmdDogNTAlO1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTtcbiAgICBib3JkZXI6IDRweCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgICBib3JkZXItdG9wLWNvbG9yOiByZ2JhKDE4LCAxOCwgMjYsIDAuODUpO1xuICB9XG59XG5cbi50b29sdGlwVmlzaWJsZSB7XG4gIG9wYWNpdHk6IDE7XG59XG5cbi8vIOKUgOKUgCBEYXJrIG1vZGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5bZGF0YS10aGVtZT1cImRhcmtcIl0ge1xuICAuZ3Jvb3ZlIHtcbiAgICBib3gtc2hhZG93OlxuICAgICAgaW5zZXQgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDcpLFxuICAgICAgaW5zZXQgMCAzcHggN3B4IHJnYmEoMCwgMCwgMCwgMC4zMiksXG4gICAgICBpbnNldCAwIDFweCAzcHggcmdiYSgwLCAwLCAwLCAwLjIyKSxcbiAgICAgIGluc2V0IDAgLTJweCAzcHggcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0KTtcbiAgfVxuXG4gIC50aHVtYiB7XG4gICAgYmFja2dyb3VuZDogIzRhNGY1YztcbiAgICBib3JkZXItY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCk7XG4gICAgYm94LXNoYWRvdzogMCAxcHggM3B4IHJnYmEoMCwgMCwgMCwgMC40NSk7XG4gIH1cblxuICAudGh1bWJEcmFnZ2luZyB7XG4gICAgYm94LXNoYWRvdzpcbiAgICAgIDAgMXB4IDRweCByZ2JhKDAsIDAsIDAsIDAuNSksXG4gICAgICAwIDAgMCAzcHggJGFjY2VudC1yaW5nLFxuICAgICAgMCAwIDAgNnB4ICRhY2NlbnQtZ2xvdztcbiAgfVxufVxuIl19 */","export function hexToHsl(hex: string): [number, number, number] {\n const r = parseInt(hex.slice(1, 3), 16) / 255;\n const g = parseInt(hex.slice(3, 5), 16) / 255;\n const b = parseInt(hex.slice(5, 7), 16) / 255;\n\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const l = (max + min) / 2;\n let h = 0;\n let s = 0;\n\n if (max !== min) {\n const d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n switch (max) {\n case r: h = ((g - b) / d + (g < b ? 6 : 0)) / 6; break;\n case g: h = ((b - r) / d + 2) / 6; break;\n case b: h = ((r - g) / d + 4) / 6; break;\n }\n }\n\n return [h * 360, s * 100, l * 100];\n}\n\nexport function hslToHex(h: number, s: number, l: number): string {\n const sl = s / 100;\n const ll = l / 100;\n const a = sl * Math.min(ll, 1 - ll);\n const f = (n: number) => {\n const k = (n + h / 30) % 12;\n const color = ll - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);\n return Math.round(255 * color).toString(16).padStart(2, \"0\");\n };\n return `#${f(0)}${f(8)}${f(4)}`;\n}\n\nexport function hslToRgb(h: number, s: number, l: number): { r: number; g: number; b: number } {\n const sl = s / 100;\n const ll = l / 100;\n const a = sl * Math.min(ll, 1 - ll);\n const f = (n: number) => {\n const k = (n + h / 30) % 12;\n return Math.round(255 * (ll - a * Math.max(Math.min(k - 3, 9 - k, 1), -1)));\n };\n return { r: f(0), g: f(8), b: f(4) };\n}\n\nexport function rgbToHsl(r: number, g: number, b: number): [number, number, number] {\n const rr = r / 255, gg = g / 255, bb = b / 255;\n const max = Math.max(rr, gg, bb);\n const min = Math.min(rr, gg, bb);\n const l = (max + min) / 2;\n let h = 0, s = 0;\n if (max !== min) {\n const d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n switch (max) {\n case rr: h = ((gg - bb) / d + (gg < bb ? 6 : 0)) / 6; break;\n case gg: h = ((bb - rr) / d + 2) / 6; break;\n case bb: h = ((rr - gg) / d + 4) / 6; break;\n }\n }\n return [h * 360, s * 100, l * 100];\n}\n\nfunction hslToRgba(h: number, s: number, l: number, alpha: number): string {\n const { r, g, b } = hslToRgb(h, s, l);\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n}\n\nexport interface AccentTokens {\n base: string;\n dot: string;\n track: string;\n ring: string;\n glow: string;\n light: string;\n}\n\nexport interface ColorValue {\n hex: string;\n hexa: string;\n hsl: string;\n hsla: string;\n rgb: string;\n rgba: string;\n h: number;\n s: number;\n l: number;\n a: number;\n}\n\nexport function buildColorValue(h: number, s: number, l: number, a: number): ColorValue {\n const { r, g, b } = hslToRgb(h, s, l);\n const hex = hslToHex(h, s, l);\n const alphaHex = Math.round(a * 255).toString(16).padStart(2, \"0\");\n const hR = Math.round(h), sR = Math.round(s), lR = Math.round(l);\n const aR = Math.round(a * 100) / 100;\n return {\n hex,\n hexa: `${hex}${alphaHex}`,\n hsl: `hsl(${hR}, ${sR}%, ${lR}%)`,\n hsla: `hsla(${hR}, ${sR}%, ${lR}%, ${aR})`,\n rgb: `rgb(${r}, ${g}, ${b})`,\n rgba: `rgba(${r}, ${g}, ${b}, ${aR})`,\n h, s, l, a,\n };\n}\n\nexport function deriveAccent(hex: string): AccentTokens {\n const [h, s, l] = hexToHsl(hex);\n return {\n base: hex,\n dot: hslToHex(h, s, Math.min(l + 12, 95)),\n track: hex,\n ring: hex,\n glow: hslToRgba(h, s, l, 0.3),\n light: hslToHex(h, Math.max(s - 20, 0), Math.min(l + 45, 96)),\n };\n}\n\nexport function accentToCssVars(\n tokens: AccentTokens,\n prefix: string\n): Record<string, string> {\n return {\n [`--${prefix}-accent`]: tokens.base,\n [`--${prefix}-accent-dot`]: tokens.dot,\n [`--${prefix}-accent-track`]: tokens.track,\n [`--${prefix}-accent-ring`]: tokens.ring,\n [`--${prefix}-accent-glow`]: tokens.glow,\n [`--${prefix}-accent-light`]: tokens.light,\n };\n}\n","import React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport styles from \"./SliderControl.module.scss\";\nimport { deriveAccent, accentToCssVars } from \"../../utils/color\";\n\nexport const VolumeDownIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M2 6h2l3-3v10L4 10H2a1 1 0 0 1-1-1V7a1 1 0 0 1 1-1Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M10 5.5a3 3 0 0 1 0 5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n);\n\nexport const VolumeUpIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M2 6h2l3-3v10L4 10H2a1 1 0 0 1-1-1V7a1 1 0 0 1 1-1Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M10 5.5a3 3 0 0 1 0 5M12 3.5a6 6 0 0 1 0 9\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n);\n\nexport interface SliderControlProps {\n value?: number;\n defaultValue?: number;\n min?: number;\n max?: number;\n step?: number;\n onChange?: (value: number) => void;\n showTooltip?: \"always\" | \"drag\" | \"never\";\n showPercentage?: boolean;\n leftIcon?: React.ReactNode;\n rightIcon?: React.ReactNode;\n /** CSS background value applied to the rail — replaces the fill with a full-width gradient */\n railBackground?: string;\n accent?: string;\n className?: string;\n disabled?: boolean;\n}\n\nfunction clamp(v: number, min: number, max: number) {\n return Math.min(Math.max(v, min), max);\n}\n\nfunction snapToStep(v: number, min: number, step: number) {\n return Math.round((v - min) / step) * step + min;\n}\n\nexport const SliderControl: React.FC<SliderControlProps> = ({\n value: controlledValue,\n defaultValue = 50,\n min = 0,\n max = 100,\n step = 1,\n onChange,\n showTooltip = \"drag\",\n showPercentage = false,\n leftIcon,\n rightIcon,\n railBackground,\n accent,\n className,\n disabled = false,\n}) => {\n const isControlled = controlledValue !== undefined;\n const [internalValue, setInternalValue] = useState(defaultValue);\n const [isDragging, setIsDragging] = useState(false);\n const [isFocused, setIsFocused] = useState(false);\n const trackRef = useRef<HTMLDivElement>(null);\n const thumbRef = useRef<HTMLDivElement>(null);\n\n const value = isControlled ? controlledValue! : internalValue;\n const pct = (clamp(value, min, max) - min) / (max - min);\n\n const accentVars = accent\n ? accentToCssVars(deriveAccent(accent), \"slider\")\n : {};\n\n const setValue = useCallback(\n (next: number) => {\n const snapped = clamp(snapToStep(next, min, step), min, max);\n if (!isControlled) setInternalValue(snapped);\n onChange?.(snapped);\n },\n [isControlled, min, max, step, onChange]\n );\n\n const valueFromPointer = useCallback(\n (e: PointerEvent) => {\n const rect = trackRef.current!.getBoundingClientRect();\n const ratio = clamp((e.clientX - rect.left) / rect.width, 0, 1);\n return min + ratio * (max - min);\n },\n [min, max]\n );\n\n const handlePointerDown = useCallback(\n (e: React.PointerEvent<HTMLDivElement>) => {\n if (disabled) return;\n e.currentTarget.setPointerCapture(e.pointerId);\n setIsDragging(true);\n thumbRef.current?.focus();\n setValue(valueFromPointer(e.nativeEvent));\n },\n [disabled, setValue, valueFromPointer]\n );\n\n const handlePointerMove = useCallback(\n (e: React.PointerEvent<HTMLDivElement>) => {\n if (!isDragging || disabled) return;\n setValue(valueFromPointer(e.nativeEvent));\n },\n [isDragging, disabled, setValue, valueFromPointer]\n );\n\n const handlePointerUp = useCallback(() => {\n setIsDragging(false);\n thumbRef.current?.blur();\n }, []);\n\n useEffect(() => {\n const el = trackRef.current;\n if (!el) return;\n const onWheel = (e: WheelEvent) => {\n if (disabled) return;\n e.preventDefault();\n setValue(value + (e.deltaY < 0 ? step : -step));\n };\n el.addEventListener(\"wheel\", onWheel, { passive: false });\n return () => el.removeEventListener(\"wheel\", onWheel);\n }, [disabled, value, step, setValue]);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (disabled) return;\n const map: Record<string, number> = {\n ArrowRight: step,\n ArrowUp: step,\n ArrowLeft: -step,\n ArrowDown: -step,\n PageUp: step * 10,\n PageDown: -step * 10,\n };\n if (e.key === \"Home\") { setValue(min); e.preventDefault(); return; }\n if (e.key === \"End\") { setValue(max); e.preventDefault(); return; }\n if (map[e.key] !== undefined) {\n setValue(value + map[e.key]);\n e.preventDefault();\n }\n },\n [disabled, step, min, max, value, setValue]\n );\n\n const tooltipVisible =\n showTooltip === \"always\" ||\n (showTooltip === \"drag\" && (isDragging || isFocused));\n\n const decimals = step < 1 ? Math.ceil(-Math.log10(step)) : 0;\n const displayValue = showPercentage\n ? `${Math.round(((value - min) / (max - min)) * 100)}%`\n : value.toFixed(decimals);\n\n // Clamp tooltip so it doesn't overflow the track edges\n const tooltipOffset = `calc(${pct * 100}% + ${(0.5 - pct) * 20}px)`;\n\n return (\n <div\n className={[styles.wrapper, disabled ? styles.disabled : \"\", className ?? \"\"].filter(Boolean).join(\" \")}\n style={accentVars as React.CSSProperties}\n >\n {leftIcon !== null && leftIcon !== undefined && (\n <span className={styles.icon}>{leftIcon}</span>\n )}\n\n <div\n ref={trackRef}\n className={styles.trackArea}\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerUp}\n onPointerCancel={handlePointerUp}\n >\n <div className={styles.groove}>\n <div\n className={styles.rail}\n style={railBackground ? { background: railBackground } : undefined}\n >\n {!railBackground && (\n <div className={styles.fill} style={{ width: `${pct * 100}%` }} />\n )}\n </div>\n </div>\n\n <div\n ref={thumbRef}\n role=\"slider\"\n tabIndex={disabled ? -1 : 0}\n aria-valuenow={Math.round(value)}\n aria-valuemin={min}\n aria-valuemax={max}\n aria-disabled={disabled}\n className={[styles.thumb, isDragging ? styles.thumbDragging : \"\"].filter(Boolean).join(\" \")}\n style={{ left: `calc(${pct * 100}% + ${(0.5 - pct) * 24}px)` }}\n onKeyDown={handleKeyDown}\n onFocus={() => setIsFocused(true)}\n onBlur={() => setIsFocused(false)}\n />\n\n <div\n className={[styles.tooltip, tooltipVisible ? styles.tooltipVisible : \"\"].filter(Boolean).join(\" \")}\n style={{ left: tooltipOffset }}\n aria-hidden=\"true\"\n >\n {displayValue}\n </div>\n </div>\n\n {rightIcon !== null && rightIcon !== undefined && (\n <span className={styles.icon}>{rightIcon}</span>\n )}\n </div>\n );\n};\n\nSliderControl.displayName = \"SliderControl\";\n"]}
|